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


Posted in Javascript onApril 24, 2014

之前看到有人分析12306后台的逻辑。。火车票的预定和退订不同于普通的购物。
一个难题就是火车票可以分站来卖。比如,一张北京到上海的火车票,沿途可以有很多站,可以北京-济南,济南-南京...等等。如何设计数据模型来存取这些票是一个问题。而不是简单的数量+-1.

其中看到一条思路挺好:用二进制字符串来表示一张火车票,比如,北京到上海共10站,那么一张全程票初始状态表示为:'1111111111';
卖出一张全程票,则该票变为'0000000000';
卖出一张半程票,比如北京-济南三站(第一站-第三站),则票变为'0011111111';
再卖出一张半程票,比如徐州-南京(第6站-第9站),则上一张票变为:'0011100011';

退订票的逻辑就很简单了,我要退一张(徐州-南京)的票,则从票池中找到第一张不能买
(徐州-南京)的票,更改它就OK(买票的逆向).比如,找到了上面的一张票'0011100011',
退票后,此票变为(0011111111);

基本逻辑如上,12306要保证多入口,而同时数据的一致性,需要很高效的逻辑来处理查票,
买票,退票的业务,据说高峰每秒会有20万请求。将票的数据结构保存在内存中。而非数据库。
小而高效的数据结变得很重要。

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);
Javascript 相关文章推荐
JavaScript DOM学习第八章 表单错误提示
Feb 19 Javascript
jQuery的写法不同导致的兼容性问题的解决方法
Jul 29 Javascript
jquery获取及设置outerhtml的方法
Mar 09 Javascript
JavaScript中this详解
Sep 01 Javascript
Node.js Addons翻译(C/C++扩展)
Jun 12 Javascript
jquery插件autocomplete用法示例
Jul 01 Javascript
在html中引入外部js文件,并调用带参函数的方法
Oct 31 Javascript
详解A标签中href=&quot;&quot;的几种用法
Aug 20 Javascript
vue-router 路由基础的详解
Oct 17 Javascript
说说如何使用Vuex进行状态管理(小结)
Apr 14 Javascript
微信小程序通过websocket实时语音识别的实现代码
Aug 19 Javascript
vue打开新窗口并实现传参的图文实例
Mar 04 Vue.js
jquery 自定义容器下雨效果可将下雨图标改为其他
Apr 23 #Javascript
jquery map方法使用示例
Apr 23 #Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
Apr 23 #Javascript
js Dialog 去掉右上角的X关闭功能
Apr 23 #Javascript
Jquery实现Div上下移动示例
Apr 23 #Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
Apr 23 #Javascript
JQuery下拉框应用示例介绍
Apr 23 #Javascript
You might like
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
PHP 观察者模式的实现代码
2013/05/10 PHP
PHP JS Ip地址及域名格式检测代码
2013/09/27 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
2014/01/26 PHP
php表单提交与$_POST实例分析
2015/01/26 PHP
PHP实现自动识别Restful API的返回内容类型
2015/02/07 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
php静态成员方法和静态的成员属性的使用方法
2017/10/26 PHP
浏览器解析js生成的html出现样式问题的解决方法
2012/04/16 Javascript
用jquery实现点击栏目背景色改变
2012/12/10 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
AngularJS中的模块详解
2015/01/29 Javascript
详解JavaScript中shift()方法的使用
2015/06/09 Javascript
jQuery与Ajax以及序列化
2016/02/01 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
Vue的MVVM实现方法
2017/08/16 Javascript
JavaScript 异步调用
2017/10/25 Javascript
js前端导出Excel的方法
2017/11/01 Javascript
原生js实现照片墙效果
2020/10/13 Javascript
Python中删除文件的程序代码
2011/03/13 Python
学习python类方法与对象方法
2016/03/15 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
Python中函数参数匹配模型详解
2019/06/09 Python
python实现两张图片拼接为一张图片并保存
2019/07/16 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
Python实现RabbitMQ6种消息模型的示例代码
2020/03/30 Python
拓展培训心得体会
2014/01/04 职场文书
《月迹》教学反思
2014/02/19 职场文书
应聘编辑自荐信范文
2014/03/12 职场文书
我有一个梦想演讲稿
2014/05/05 职场文书
企业党员一句话承诺
2014/05/30 职场文书
2016年“六一儿童节”校园广播稿
2015/12/17 职场文书
当你找不到方向的时候,不妨读读刘备的一生
2019/08/05 职场文书
《家》读后感:万惜拯救,冷暖自知
2019/09/25 职场文书
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python