标题购票系统设计之余票处理

一、前言

铁路12306,对于所有人来说是非常熟悉。早些年,经常是一到发票时间,系统就自然崩溃了,让无数人痛骂不止,最终无奈向黄牛低头。最后,阿里程序猿忍不住了,伸出了可爱的小手,无偿帮铁路12306重新优化设计系统,才有了现在的铁路12306。
作为一名程序猿,当然想试一下水,看看其中的难度有多大。很有自知之明,避开了几亿用户这一送命题,就简单做个demo,实现一下基本的买票购票功能。

二、根据现有系统推测功能

一般来说,购票流程应该是这样:
1. 选择两个站点,输入两个开始时间和结束时间,查询对应的车次信息。
2. 选择一个车次,查看对应的一等座、二等座等座位的余票信息。
3. 选择一个有余票的座位类型,随机分配座位,选择一个或多个座位。然后选择对应的用户信息,完成购票订单操作。
4. 在规定时间内,在支付订单界面,选择一个订单,选择付款或者退票,完成最后的流程。
5. 遇到特殊情况,在已支付订单界面,选择一个订单,选择退票或者改签操作。
窥一斑而知全豹,这一个购票流程已经给了我们大致的系统面貌了,那么得出大概的功能设计图:

三、分析系统

让我们在脑海中模拟一下实际的开发过程,先开发后台管理系统。用户、菜单、权限等模块暂时先跳过,毕竟这不是本次思维风暴的重点。站点、列车、车次、座位,嗯,这几个功能模块看上去都是一些简单维护操作,问题不大可以实现。
那就开始模拟用户操作:
第一步根据站点和时间范围选择合适的车次信息,没问题,接着走。
第二步,查看车次的余票情况,咦,查不出来。看来我得加一张用户的购票记录表,记录一下购票情况,才能座位数-已购票数=余票。嗯?我只有开始站点和结束站点的信息,车次会经过N个站点,又不是只有2个站点。要是这样:A站点->B站点 ->C站点 -> D站点->E站点,有人中途买了C->D的座位Z1,那现在要购票从A->D的座位,那应该显示没有余票了。不对,好像有点东西,完了,把自己绕进去了…
Two thousand years later…
唔,一个站点有票,一个站点没有票,那不就是0和1吗? ABCDE不就代表00000,如果有人买了C->D,那不就是00110,如果又有人买了D->E,那不就是00111。根据二进制的进位原理,C->D,占据了倒数第一位和倒数第三位的位置,对应的最小值应该是00001=1=21-1,最大值应该是00111=7=23-1,再结合实际推敲一下,值域应该是[23-1,21-1),下次买票肯定必须不能在这个区间买了,只能是选择两端(+oo,23-1)U[21,-oo)。
那在车次表里,在加一个经过站点属性,再加一个座位购票记录表,记录每个座位的购票记录,里面有三个关键属性,A属性用来记录二进制座位情况00000,B属性用来记录当前二进制的最小值(下次买票结束站点转换的二进制值必须小于等于它),C属性用来记录当前二进制的最大值(下次买票的开始站点转换的二进制值必须大于它)。
先查出对应的车次,在根据经过站点,确定两个站点对应的二进制值V1,判断V1是否大于C属性值,V1是否小于等于B属性就可以了。这里使用sql条件查询出对应的座位出来,同一座位的记录数相加等于该座位的余票数。
第三步,选择座位购买,下订单。这一步对应的就是,根据座位id去刷新座位购票记录表的ABC,把A属性对应的0变为1。如果退票,那就是把对应座位的1改为0。
第四步,在半小时内付款,这里累了,没什么好说的了。

购票系统设计之余票处理相关推荐

  1. php购票排位_用PHP+MySQL实现12306购票和退票以及余票查询逻辑

    普通商品的库存之间没有关联性,库存量都是确定的. 火车票跟普通商品不同,同一车次不同路段的车票的库存可能会相互影响. 所以数据库中不应存储某个车次某个路段的余票数量,而应存储该车次该路段已售的车票数量 ...

  2. php mysql购票_用PHP+MySQL实现12306购票和退票以及余票查询逻辑

    车票表: (车次, 区间, 已售) (1024, [1,2], 0) (1024, [1,2,3], 0) (1024, [1,2,3,4], 0) (1024, [2,3], 0) (1024, [ ...

  3. python爬火车票_python爬取12306火车余票程序(一)

    首先说一下大体的流程,简单的流程图如下: 1.获取URL 打开12306余票查询的 网页链接,浏览器(我用的chrome)按F12来分析请求.输入要查询的起始地点和时间后点击查询,可以看到右侧抓到的链 ...

  4. 12306 余票检测软件

    根据日期,始发站,终点站,车次等信息检测 12306 是否有余票 一.实现方式 给 12306 购票网页注入脚本,脚本模拟请求,解析参数,获取最终的余票信息 余票信息通过接口信息通知服务端 二.脚本解 ...

  5. 返乡之路不容易之12306余票查询并给出备选方案v2

    在第一版的返乡之路不容易之12306余票查询并给出备选方案中,给出了余票查询和备选方案推荐,但当时有两个问题: 没有备选排名:虽然给出了备选,但哪个备选好没有给出排序 没有座位信息(商务/一等/二等/ ...

  6. 12306之余票查询流程解析

    前言 本套教程共分3章: 12306之登录流程解析 12306之余票查询解析 12306之下单流程解析 本套内容主要用于分析12306购票流程,意在编写一套自动购票小程序.12306接口 api 经常 ...

  7. Java获取12306余票信息(一)

    写在前面 写给自己,也分享给大家. Java获取12306余票信息(一) Java获取12306余票信息(二) Java获取12306余票信息(三) 步骤: 首先找找12306的API 1.打开谷歌浏 ...

  8. 火车票余票问题的算法解析

    作者: Phill King 原创文章,转载请注明出处. 我们每次购买火车票,在查询的时候都可以及时的看到余票数.这个余票数是怎么计算出来的?有没有好的算法可以很快的计算出余票数目.本文对这个问题做了 ...

  9. 火车余票查询API 一

    简介 年关将近,看到此图未免一声长叹,惆怅不已.API中国将深挖可怕的12306网站,公布尽可能多的接口,希望某当世才俊能开发出一款能造福我朝的购票助手软件,定受无量加持-- 扯远了,扯回来. 使用1 ...

最新文章

  1. XP 终端服务组件 恢复补丁包 terminal service patch
  2. Puppet基于Master/Agent模式实现LNMP平台部署
  3. SaaS风暴:中国软件企业如何应对挑战?
  4. 使用Cross-Page Postback(跨页面提交)在页面间传递数据
  5. 基于java TCP实现网络通信聊天室《建议收藏附完整源码》
  6. HTML5超级玛丽简易版(有源码)
  7. intellij idea强制更新索引
  8. 《Java编程思想》读书笔记(14)
  9. maven 排除某个类_java-如何从Maven依赖项中排除某些程序包(在JAR中)?
  10. 一文总结数据科学家常用的Python库(上)
  11. linux 安装软件仓库,linux 软件仓库
  12. ZoomIt下载,ZoomIt下载地址分享
  13. 计算机中计算排名用什么公式,最全面的Excel函数排名公式汇总
  14. LaTeX 下载及命令行
  15. tensorflow实现深度可分离卷积
  16. iPhone长截图快捷指令(科技兽修改版)
  17. 【网络流24题23】火星探险问题
  18. We Are A Team
  19. n阶乘计算器 超大数 理论可计算8位数以内的阶乘数
  20. 如何在xampp下运行php文件

热门文章

  1. Java JUC系列
  2. mysql导出数据的几种方法
  3. APU、CPU、GPU、SoC傻傻分不清楚?
  4. 卷积云神经网络_PointConv:在点云上高效实现卷积操作
  5. 5G和WiFi等其他网络现状及挑战
  6. 改变iOS 启动页面 lauchscreen
  7. 大数据模式让假货无处遁形
  8. Java找出数组中第K大的数
  9. powerpivot_使用PowerPivot钻取数据
  10. 单元测试框架NUnit 之 assertions 断言