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 相关文章推荐
收藏一些不常用,但是有用的代码
Mar 12 Javascript
Dom加载让图片加载完再执行的脚本代码
May 15 Javascript
让页面上两个div中的滚动条(滑块)同步运动示例
Aug 07 Javascript
js 弹出新页面避免被浏览器、ad拦截的一种新方法
Apr 30 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
Sep 03 Javascript
dreamweaver 8实现Jquery自动提示
Dec 04 Javascript
详解JavaScript基于面向对象之继承
Dec 13 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
Nov 25 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
Mar 02 Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
Sep 25 Javascript
详解Angular模板引用变量及其作用域
Nov 23 Javascript
JS中箭头函数与this的写法和理解
Jan 14 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将数据库导出成excel的方法
2010/05/07 PHP
PHP实现Huffman编码/解码的示例代码
2018/04/20 PHP
Jquery中LigerUi的弹出编辑框(实现方法)
2013/07/09 Javascript
仿新浪微博登陆邮箱提示效果的js代码
2013/08/02 Javascript
IE中getElementsByName()对有些元素无效的解决方案
2014/09/28 Javascript
js实现window.open不被拦截的解决方法汇总
2014/10/30 Javascript
AngularJS表单编辑提交功能实例
2015/02/13 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
2016/05/17 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
2017/02/20 Javascript
详解mpvue开发小程序小总结
2018/07/25 Javascript
JavaScript生成随机验证码代码实例
2019/09/28 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
2020/02/16 Javascript
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
sqlalchemy对象转dict的示例
2014/04/22 Python
python利用tkinter实现屏保
2019/07/30 Python
python编写猜数字小游戏
2019/10/06 Python
python爬虫容易学吗
2020/06/02 Python
详解python logging日志传输
2020/07/01 Python
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
香港百佳网上超级市场:PARKNSHOP.com
2020/06/10 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
学生档案自我鉴定
2013/10/07 职场文书
房产委托公证书样本
2014/04/04 职场文书
企业活动策划方案
2014/06/02 职场文书
白酒营销策划方案
2014/08/17 职场文书
我的中国梦演讲稿600字
2014/08/19 职场文书
2014年生产管理工作总结
2014/12/23 职场文书
音乐教师个人总结
2015/02/06 职场文书
世界卫生日宣传活动总结
2015/02/09 职场文书
2015年材料员工作总结
2015/04/30 职场文书
结婚喜宴迎宾词
2015/08/10 职场文书
校园之声广播稿
2015/08/18 职场文书
Python快速优雅的批量修改Word文档样式
2021/05/20 Python
Jupyter Notebook内使用argparse报错的解决方案
2021/06/03 Python
SQL中的连接查询详解
2022/06/21 SQL Server