Maison >interface Web >js tutoriel >Exemple de réservation et de remboursement de billets de train simulés Javascript_Connaissances de base

Exemple de réservation et de remboursement de billets de train simulés Javascript_Connaissances de base

WBOY
WBOYoriginal
2016-05-16 16:51:221455parcourir

J'ai déjà vu quelqu'un analyser la logique backend de 12306. . La réservation et l'annulation de billets de train sont différentes des achats ordinaires.
Un problème est que les billets de train peuvent être vendus dans différentes gares. Par exemple, un billet de train de Pékin à Shanghai peut comporter de nombreux arrêts en cours de route, comme Pékin-Jinan, Jinan-Nanjing... et ainsi de suite. Comment concevoir un modèle de données pour accéder à ces tickets est un problème. Au lieu d'une simple quantité -1.

J'ai vu une bonne idée parmi eux : utiliser une chaîne binaire pour représenter un billet de train. Par exemple, il y a 10 gares au total de Pékin à Shanghai, alors l'état initial d'un billet longue distance est : '1111111111'. ;
Vendre Si vous achetez un billet pour un trajet complet, le billet devient '0000000000'
Si vous vendez un billet pour un demi-trajet, comme Pékin-Jinan trois stations (premier arrêt - troisième arrêt), le billet deviendra '0011111111';
Si vous vendez un autre billet demi-distance, comme Xuzhou-Nanjing (arrêt 6-9), le billet précédent deviendra : '0011100011';

La logique de l'annulation d'un billet est très simple. Si je souhaite rembourser un billet (Xuzhou-Nanjing), je trouverai le premier billet du pool de billets qui ne peut pas être acheté
(Xuzhou-Nanjing) et je le changerai. OK (l'inverse de l'achat d'un billet). Par exemple, si vous trouvez le billet ci-dessus '0011100011',
après le remboursement, le billet devient (0011111111) ;

La logique de base est la même que ci-dessus. 12306 doit assurer simultanément plusieurs entrées et la cohérence des données. Il a besoin d'une logique très efficace pour gérer la vérification des billets

On dit que l'activité d'achat et de remboursement des billets connaît un pic. de 200 000 requêtes par seconde. Enregistrez la structure des données du ticket en mémoire. plutôt qu'une base de données.
Les structures de données petites et efficaces deviennent importantes.

Copier le code Le code est le suivant :
if(jQuery){}else{
/ /document.write
>
fonction Serveur(){

var self = this;

self.ticketsPool = [];

self._init= function(number){

if(typeof(number) != 'number')
throw ('type error');
for(i=0;i self.ticketsPool.push(new Ticket());
}
};

//Déterminez si un billet peut être acheté via des opérations AND ou OR.

//Par exemple : la commande o est Pékin-Jinan (001111111), et un certain billet est (0000000011) (Pékin-Nanjing a été vendu), puis renvoie faux
//Par exemple : la commande o est Pékin -Jinan ( 001111111), un certain billet est (1111100011) (vendu Xuzhou-Nanjing), puis renvoie true
self.canBuy = function(o,t){
var _o = ''
for( j =0; j _o = o[j]=='0'?1:0;
}
var r1 = (parseInt(t.tic,2 ) | parseInt(o,2)) & parseInt(_o,2);
var r2 = parseInt(_o,2);
return r1 == r2;
};

//Vendre un billet

self.pop1Ticket = function(o){
for(i=0;i < self.ticketsPool.length;i ){
if(self. canBuy( o,self.ticketsPool[i])){
self.buy(self.ticketsPool[i],o);
return i;
}
};
return - 1;
};

//Mise en œuvre de la vente de billets, en changeant la chaîne binaire, telle que '111111111'->'001111111';

self.buy = function(t,o){
t.tic = (parseInt (t.tic,2) & parseInt(o,2)).toString(2);
//alert(t.tic);

};

//Requête des billets restants

self.remainTics = function(o){
var count=0;
for(i=0;i < self.ticketsPool.length;i ){
count = self.canBuy(o,self.ticketsPool[i])?1:0;
};
return count;
}

//Remboursement, ou opération

self.refund = function(o){
for(i=0;i < self.ticketsPool.length;i ){
if(!self. canBuy(o,self.ticketsPool[i])){
var _o = ''
for(j=0; j _o = o[j]== '0'?1:0;
}
self.ticketsPool[i].tic = (parseInt(self.ticketsPool[i].tic,2) | parseInt(_o,2)).toString(2 );
retourner i;
}
};

return -1;

}
>

//Modèle de données : ticket

function Ticket(){
var self = this;
//Le ticket initial est un ticket complet
self.tic = '1111111111';
>

//Modèle de données : Commande

fonction Commande(de, à){
var self = this;
var s = '';
for(i=0;i<10; i ){
s = (i>=from && i }
return s;
}

//12306 Backend

Server = new Server();
//État initial, le pool de tickets contient 400 tickets complets
Server._init(400);

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn