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 相关文章推荐
使用jQuery validate 验证注册表单实例演示
Mar 25 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
Jul 23 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
Mar 19 Javascript
详解javascript遍历方式
Nov 11 Javascript
详解Javascript继承的实现
Mar 25 Javascript
浅谈JavaScript的计时器对象
Dec 26 Javascript
前端页面文件拖拽上传模块js代码示例
May 19 Javascript
JS加密插件CryptoJS实现的DES加密示例
Aug 16 Javascript
node中的cookie的具体使用
Sep 13 Javascript
细说Vue组件的服务器端渲染的过程
May 30 Javascript
Vue事件修饰符native、self示例详解
Jul 09 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
Jul 26 Javascript
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
php 信息采集程序代码
2009/03/17 PHP
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
PHP获取文件扩展名的4种方法
2015/11/24 PHP
php数据访问之增删改查操作
2016/05/09 PHP
Mootools 1.2教程 类(一)
2009/09/15 Javascript
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
JS获取页面input控件中所有text控件并追加样式属性
2013/02/25 Javascript
浅析tr的隐藏和显示问题
2014/03/05 Javascript
Javascript中使用parseInt函数需要注意的问题
2015/04/02 Javascript
jquery validate demo 基础
2015/10/29 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
JS简单获取当前年月日星期的方法示例
2017/02/07 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
2017/07/15 Javascript
vue-cli webpack 引入jquery的方法
2018/01/10 jQuery
Vue项目中使用jquery的简单方法
2019/05/16 jQuery
js实现转动骰子模型
2019/10/24 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
2020/01/12 Javascript
PyQt QListWidget修改列表项item的行高方法
2019/06/20 Python
关于ResNeXt网络的pytorch实现
2020/01/14 Python
Python 读取WAV音频文件 画频谱的实例
2020/03/14 Python
如何理解python中数字列表
2020/05/29 Python
基于matplotlib中ion()和ioff()的使用详解
2020/06/16 Python
梅西百货澳大利亚:Macy’s Australia
2017/07/26 全球购物
祖国在我心中演讲稿
2014/01/15 职场文书
同事吵架检讨书
2014/02/05 职场文书
中学教师教育感言
2014/02/21 职场文书
大学生个人自荐信样本
2014/03/02 职场文书
绩效管理实施方案
2014/03/19 职场文书
廉洁教育学习材料
2014/05/19 职场文书
教室标语大全
2014/06/21 职场文书
写得不错的求职信范文
2014/07/11 职场文书
暑期培训班策划方案
2014/08/26 职场文书
群众路线个人对照检查材料
2014/09/23 职场文书
JS ES6异步解决方案
2021/04/29 Javascript
swagger如何返回map字段注释
2021/07/03 Java/Android
海弦WR-800F
2022/04/05 无线电