Skip to content

1311523821/train-planner

Repository files navigation

🚂 车票路径规划器 (Train Ticket Route Planner)

基于12306实时数据的多策略购票方案规划工具

✨ 核心功能

🔥 接入12306真实数据

  • 实时余票查询 — 直连12306 API,查询真实车次和余票信息
  • 列车时刻表 — 查看任意车次(如G2、D31)的完整停靠站时刻表
  • 3365个车站 — 覆盖全国所有火车站
  • 车次搜索 — 输入G2、D31等车次号直接查询时刻表

🧠 6种购票策略

策略 说明 自动化
🚄 直达(有票) 直接查询目标区间余票 ✅ 自动查询
直达(可候补) 无票车次可提交候补 ✅ 自动识别
🎯 买长乘短 买到更远站点,在目标站提前下车 ✅ 自动查询更远站点余票
🔄 中转换乘 经大型枢纽站换乘,分段展示可自由搭配 ✅ 自动查询 + 智能兼容性筛选
✂️ 同车换乘 同一趟车在中间站拆分购票,无需下车换乘 ✅ 自动查询分段方案
📝 买短乘长 先买短途票上车再补票 ✅ 自动查询可行方案

📊 排序与筛选

每个策略卡片均支持独立的排序和筛选:

排序方式:

  • 🕐 出发时间(升序/降序)
  • 🕕 到达时间(升序/降序)
  • ⏱️ 耗时(升序/降序)
  • 💰 预估价格(升序/降序)
  • 🔄 换乘时间(仅换乘/分段策略)

筛选条件:

  • 出发时间范围(如 08:00 ~ 12:00)
  • 到达时间范围(如 14:00 ~ 18:00)
  • 支持跨午夜筛选(如 22:00 ~ 06:00)
  • 筛选框可选填,不填则不限制

💰 真实票价显示

直接从12306 API的 yp_info(票面信息)字段解析真实票价,而非估算:

  • ✅ 有真实票价时显示 ¥553起(无 ≈ 前缀)
  • ⚠️ 无真实票价时回退到估算,显示 ≈¥553起
  • 鼠标悬停可查看所有可用席别的具体价格
  • 覆盖所有席别:商务座、一等座、二等座、软卧、硬卧、硬座、无座

🔄 换乘交互体验

中转换乘 & 同车换乘 均采用左右双列布局:

  • 左侧显示第一段车次,右侧显示第二段车次
  • 点击左侧车次,自动筛选可衔接的右侧车次
  • 选中组合后底部显示方案汇总:总耗时、总花费、换乘间隔
  • 中转换乘支持跨日期换乘(自动查询次日车次)

📈 实时进度提示

查询过程中进度条平滑更新,实时显示当前查询状态:

  • 直达查询:正在查询12306直达车次...
  • 买长乘短:正在查询买长乘短 3/10(G1234)...
  • 中转换乘:正在查询中转站 济南西(5/20,已找到3个方案)...
  • 同车换乘:正在查询同车分段 2/10(D5678)...
  • 买短乘长:正在查询买短乘长 1/8(G9012)...

📋 其他特性

  • 🔍 车站搜索(支持中文、拼音、电报码模糊搜索)
  • 📊 余票统计(商务座/一等座/二等座/软卧/硬卧/硬座/无座)
  • 📋 独立时刻表查询(输入G2等车次号查询)
  • 🎯 买长乘短自动查询(弹窗展示可行方案)
  • 📂 策略卡片折叠/展开(点击标题栏切换)
  • ⬆️ 回到顶部按钮(页面滚动后右下角出现)
  • 📱 响应式设计,手机可用
  • 🎨 暖色主题,视觉舒适

🚀 快速开始

方式一:在线访问(推荐 ⭐)

无需安装任何东西,打开浏览器就能用!

👉 点击访问在线版

自定义域名 www.bhllll.xyz 已绑定 Vercel,国内可直接访问。

首次打开可能需要等待 10-30 秒(免费服务器冷启动),之后秒开。

方式二:下载可执行文件

无需安装 Node.js,下载即用!

  1. 前往 Releases 页面
  2. 下载对应系统的文件:
    • Windows 用户 → 下载 train-planner-win-x64.exe,双击运行
    • Mac 用户 (Intel) → 下载 train-planner-macos-x64
    • Mac 用户 (M系列) → 下载 train-planner-macos-arm64
    • Linux 用户 → 下载 train-planner-linux-x64
  3. 双击运行(Mac/Linux 需先 chmod +x./ 运行)
  4. 浏览器会自动打开,开始使用!

方式三:一键启动脚本

如果已安装 Node.js:

# 克隆项目
git clone https://github.com/1311523821/train-planner.git
cd train-planner

# Windows 用户:双击 启动.bat
# Mac/Linux 用户:双击 启动.command

脚本会自动安装依赖、启动服务并打开浏览器。

方式四:命令行启动

git clone https://github.com/1311523821/train-planner.git
cd train-planner
npm install
npm start
# 访问 http://localhost:3000

🌐 部署到自己的服务器

Vercel(推荐,免费)

  1. Fork 本仓库到你的 GitHub
  2. 访问 vercel.com,用 GitHub 登录
  3. 点击 New Project → 导入你 fork 的仓库
  4. 点击 Deploy,等待部署完成
  5. 获得一个 xxx.vercel.app 的访问地址

或使用 Vercel CLI:

npm i -g vercel
vercel --prod

绑定自定义域名(国内用户推荐)

.vercel.app 域名在国内可能无法访问,建议绑定自定义域名:

  1. 在阿里云/腾讯云等购买域名
  2. 添加 DNS CNAME 记录:wwwcname.vercel-dns.com
  3. 在 Vercel 项目 Settings → Domains 中添加域名
  4. 选择 Connect to an environment → Production(不要选 307 重定向)
  5. Vercel 会自动签发 SSL 证书

Render(免费)

  1. Fork 本仓库
  2. 访问 render.com,用 GitHub 登录
  3. NewWeb Service → 选择你的仓库
  4. 设置:
    • Build Command: npm install
    • Start Command: node server.js
  5. 点击 Create Web Service

自有服务器

git clone https://github.com/1311523821/train-planner.git
cd train-planner
npm install
PORT=80 node server.js

📐 技术栈

  • 前端: 纯 HTML + CSS + JavaScript(零框架依赖)
  • 后端: Node.js + Express(12306 API代理)
  • 数据源: 12306 官方API
    • 车站数据: /otn/resources/js/framework/station_name.js
    • 余票查询: /otn/leftTicket/queryG
    • 列车时刻: /otn/czxx/queryByTrainNo
    • 换乘查询: 多段余票查询 + 时间匹配算法

📁 项目结构

train-planner/
├── server.js              # Express后端(12306 API代理 + 换乘算法)
├── public/
│   └── index.html         # 前端单页应用
├── vercel.json            # Vercel 部署配置
├── render.json            # Render 部署配置
├── 启动.bat               # Windows 一键启动
├── 启动.command           # Mac/Linux 一键启动
├── package.json
├── README.md
└── .gitignore

📝 数据说明

  • 余票数据来自12306官网API,实时更新
  • 票价数据:从12306返回的 yp_info(票面信息)字段解析,为实际票价
  • 本工具仅提供查询和策略建议,不进行实际购票
  • "买长乘短"、"买短乘长"等策略需要在12306官网/APP完成购票

📄 License

MIT

📌 版本历史

v1.3.4 (2026-05-01)

  • 全策略进度显示:买长乘短、同车换乘、买短乘长三个策略新增逐车次进度提示
    • 查询过程中实时显示「正在查询买长乘短 3/10(G1234)...」
    • 进度条平滑更新,不再长时间卡在同一个百分比
  • 中转换乘流式进度优化:已在 v1.3.3 中实现,本版本补齐其余策略

v1.3.3 (2026-04-30)

  • 多策略方案修复:修复买长乘短和中转换乘不显示的 bug
    • 买长乘短:原来只检查终点站,现在遍历目的地之后所有站点(从近到远)
    • 中转换乘:原来与同车换乘重复调用 /api/transfer 导致 12306 限流,现在独立请求
  • 同车换乘重构:改为真正的同车分段逻辑(同一趟车在中间站拆分购票),与中转换乘明确区分
  • 策略卡片最小化:多策略方案中每个策略支持点击标题栏折叠/展开
  • 错误保护:每个策略查询步骤独立 try-catch,单个失败不影响其他策略渲染
  • 命名统一:「分段购票」更名为「同车换乘」

v1.3.2 (2026-04-30)

  • 同车换乘升级:改为左右两列布局,左侧选第一段、右侧选第二段,与中转换乘体验一致
  • 方案汇总:左右各选一个车次后,底部显示总耗时、总花费、换乘间隔等完整信息
  • 回到顶部按钮:页面滚动后右下角出现浮动按钮,一键回到顶部
  • 价格提示修复:鼠标悬停价格时,提示框不再超出屏幕边界

v1.3.1 (2026-04-30)

  • 修复同车换乘查询报错
  • 中转换乘改为左右两列交互布局:左侧第一段、右侧第二段,点击自动筛选可衔接车次
  • 恢复换乘排序筛选

v1.3.0 (2026-04-30)

  • 中转换乘重构:覆盖全天所有有票车次,不再遗漏凌晨和深夜时段
  • 分段展示:第一段和第二段分开显示,界面更清晰
  • 点击交互:点击第一段自动筛选可衔接的第二段

v1.2.1 (2026-04-30)

  • 修复安全漏洞:车站搜索等输入框的 XSS 风险
  • 修复多个崩溃场景:异常数据、空值等情况下的页面报错

v1.2.0 (2026-04-30)

  • 修复换乘时间计算错误:超过24小时的长途列车换乘时间显示异常
  • 换乘车次扩容:覆盖更多凌晨和深夜时段的可行方案

v1.1.0 (2026-04-30)

  • 真实票价:从12306数据直接获取实际票价,不再靠估算
  • 价格区分:有真实票价显示 ¥,估算显示 ≈¥

v1.0.0

  • 初始版本
  • 6种购票策略:直达、候补、买长乘短、中转换乘、同车换乘、买短乘长
  • 12306实时余票查询
  • 列车时刻表查询
  • 排序与筛选功能
  • 响应式设计

About

🚂 车票路径规划器 - 多策略购票方案

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages