源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

javascript模拟订火车票和退票示例

  • 时间:2021-11-14 04:56 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:javascript模拟订火车票和退票示例
之前看到有人分析12306后台的逻辑。。火车票的预定和退订不同于普通的购物。 一个难题就是火车票可以分站来卖。比如,一张北京到上海的火车票,沿途可以有很多站,可以北京-济南,济南-南京...等等。如何设计数据模型来存取这些票是一个问题。而不是简单的数量+-1. 其中看到一条思路挺好:用二进制字符串来表示一张火车票,比如,北京到上海共10站,那么一张全程票初始状态表示为:'1111111111'; 卖出一张全程票,则该票变为'0000000000'; 卖出一张半程票,比如北京-济南三站(第一站-第三站),则票变为'0011111111'; 再卖出一张半程票,比如徐州-南京(第6站-第9站),则上一张票变为:'0011100011'; 退订票的逻辑就很简单了,我要退一张(徐州-南京)的票,则从票池中找到第一张不能买 (徐州-南京)的票,更改它就OK(买票的逆向).比如,找到了上面的一张票'0011100011', 退票后,此票变为(0011111111); 基本逻辑如上,12306要保证多入口,而同时数据的一致性,需要很高效的逻辑来处理查票, 买票,退票的业务,据说高峰每秒会有20万请求。将票的数据结构保存在内存中。而非数据库。 小而高效的数据结变得很重要。
[u]复制代码[/u] 代码如下:
if(jQuery){}else{  //document.write } function Server(){  var self = this;  self.ticketsPool = [];  self._init= function(number){   if(typeof(number) != 'number')    throw ('type error');   for(i=0;i<number;i++){    self.ticketsPool.push(new Ticket());   }  };  //判断一张票是否可以买,通过与或运算来实现。  //比如:订单o为北京-济南(001111111),某张票为(0000000011)(已卖出北京-南京),那么返回false  //比如:订单o为北京-济南(001111111),某张票为(1111100011)(已卖出徐州-南京),那么返回true  self.canBuy = function(o,t){   var _o = ''   for(j=0; j<o.length; 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;  };  //卖出一张票  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;  };  //卖出票的实现,改变二进制字符串,比如'111111111'->'001111111';  self.buy = function(t,o){   t.tic = (parseInt(t.tic,2) & parseInt(o,2)).toString(2);   //alert(t.tic);  };  //查询余票  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;  }  //退票,或 运算  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.length; j++){       _o += o[j]=='0'?1:0;      }      self.ticketsPool[i].tic = (parseInt(self.ticketsPool[i].tic,2) | parseInt(_o,2)).toString(2);      return i;    }    };   return -1;  } } //数据模型:票 function Ticket(){  var self = this;  //票的初始为全程票  self.tic = '1111111111'; } //数据模型:订单 function Order(from, to){  var self = this;  var s = '';  for(i=0;i<10;i++){   s += (i>=from && i<to)?0:1;  }  return s; } //12306后台 Server = new Server(); //初始状态,票池有400张全程票 Server._init(400);
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部