跳到正文
拼车出行规划

更新记录

每个版本改了什么

自己部署的话,升级前先看这里有没有不兼容的变化。完整的发布说明在 GitHub Releases。

3.5.0(2026-10-08)

  • 试玩模式:新增 /try,没有邀请码、也没有高德 Key 的人可以用一个虚构的行程(宏村示例酒店)点一遍。能改谁开车、空座、最多绕路、同行人数、车次和分钟数,能删成员和候选站,能开关返程,「恢复示例」回到初始;不能搜索和改地点、加成员和车站、保存、发布方案页。
  • 试玩的计算在浏览器里完成,不调用高德 Web 服务:行车时间按直线距离估算(直线公里数 × 1.3 ÷ 75 km/h,再加 10 分钟进出城),路线画成直线;报告顶部写明「试玩」,「说明」不说数据来自高德。正式行程的报告不变。地图底图仍用高德瓦片,和示例页一样。
  • 首页新建表单下、使用指南、隐私页、README 加了试玩的入口和说明。/try 计入页面访问。
  • 不算不兼容:wrangler.jsonc 的 run_worker_first 加了 /try,只是为了给 /try 计数。自部署的人不加也能用,/try 就是静态的 try.html,只是不计数。

3.4.1(2026-10-08)

  • 隐私页:如实说明 Cloudflare 的网页统计(Web Analytics)会自动往页面里加统计脚本,本站的 CSP 不放行它,浏览器会直接拦下,不下载、不运行、不发数据;原来「网页里没有统计脚本」的说法改为「本站不用统计脚本」。
  • 构建时检查每个页面的 script-src:只能放行本站、cdnjs 和内嵌脚本的哈希,多出别的来源构建就报错;方案页的 CSP(在 web/worker.js 里)由测试固定。

3.4.0(2026-10-08)

  • 公开计算规则:新增规则说明页 /guide/method,写明用到的数据、硬性条件、排序方式、默认值和目前没考虑的地方,带版本号(现在是第 1 版);方案页页脚和报告都标明用哪一版算的。首页常见问题加了一条,选站页的「程序怎么比」缩成摘要并链到这一页。
  • 每个方案(去程和返程)下面显示「排序依据」:搭车人数,以及总分钟由车主多绕、乘客到上车点、打车组三项相加;备选方案再列出和推荐方案的差别。排序和成本口径没有变,只是把分项显示出来。
  • 防止说明和代码对不上:默认值集中到 carpool.DEFAULTS,说明页的默认值表由测试和它逐项核对;新增规则快照测试,固定几个场景的方案顺序和各项数字,改了规则会失败。
  • 地图角标加上审图号 GS(2025)5996号(编辑页、方案页、示例页)。
  • 隐私:首页新建表单下写明行程数据存放在中国大陆以外的 Cloudflare 服务器上;隐私页同步写明;编辑页成员的出发地下面提示「填小区、地标或附近路口就够了」,方案页不显示精确出发地。
  • 措辞:站点上的「公益性质」改为「非商业的个人项目」。
  • 仓库:新增 SECURITY.md(GitHub 私密报告)和 .github/FUNDING.yml;README 加「支持作者」一节,站点上没有赞助入口。

3.3.0(2026-10-08)

  • 编辑页:修复在日期、成员名、车站名等输入框里改完内容、紧接着点别的输入框或按钮时,那一下点击和输入被吞掉的问题。原因是失焦时整张表单被重建;现在只原地更新 12306 链接、「默认 N」等占位文字、步骤条和校验提示,加删成员或车站、开车、返程开关、导入、恢复历史、远端合并才整体重绘。
  • 编辑页:取名、编辑口令、额度、打不开、已删除这几个整页遮罩,打开时焦点进入遮罩、背景设为 inert、Tab 键只在遮罩里循环,关闭后焦点还给原来的元素;额度遮罩支持 Esc。页内弹窗的 Tab 也限制在弹窗里。
  • 自部署:构建时可用环境变量 SITE_ORIGIN 指定站点地址,SITE_INDEXABLE=1 允许收录。换了域名又没设 SITE_INDEXABLE 时,所有页面加 noindex,robots.txt 全禁,不生成 sitemap.xml 和 llms*.txt。官方构建不变。见 README 的「自己部署」。
  • 安全(费用与数据安全交叉审计,两位审计员分别做静态审计和本地动态攻击,结果由主代理逐条核对):
    • 修复(P0,已于 2026-10-08 先行上线):行程实例的内部接口能从外面访问,可以不经邀请码自建行程并绕过公共额度护栏、读出自带的高德 Key 和邀请码、用 GET 删行程。现在只有白名单路径能转发,内部接口要带 Worker 的内部标记;不是自带 Key 的行程一律经过公共额度护栏。
    • 管理登录限次改为原子操作(并发试错不会多放行),口令对了退还那次尝试;全站登录被锁时,可用环境变量 FORCE_PUBLIC_PAUSED、FORCE_CREATION_PAUSED 直接暂停,不需要登录。
    • 「改用自己的 Key」先鉴权再对外验 Key;自带 Key 新建先过新建限速再验 Key;Key 或邀请码不对时退还全站新建名额。
    • 保存的大小按实际内容计算(分块上传也拦得住),配置只能是对象。
    • 同一个行程的请求逐个处理,避免并发时用旧数据覆盖新数据(比如重置编辑链接的新密钥被并发的改名盖掉)。
    • 公共额度被拒的部分退回行程当天的计数。
    • 来源 IP 的哈希加盐并按天轮换;方案页访问口令至少 4 位,按来源和按页分别限次;编辑口令按最近一小时滑动计数,提示还要等几分钟。
    • 高德配额标记自动过期;删除和到期的行程从管理页名单里去掉;删除行程只接受 POST,方案页在行程实例里就删。
    • 批量接口:每一项单独校验,查询里自带 key(任何大小写)直接拒绝,去掉 callback、output、sig。
    • 单个高德查询改用 POST,地点文字不再出现在网址和访问日志里。
    • 地图提示框里的成员名字当纯文本显示(编辑页和方案页)。
    • 每个行程的保存(每分钟 60 次)、发布(每小时 30 次)、实时连接(30 个、单条消息 2 KB)有上限;出行日期再远,保留期最多到最后编辑后 2 年。
    • 关掉 *.workers.dev 子域名和预览地址。
    • 不兼容:方案页访问口令最短 4 位(已设的短口令仍然有效);批量接口查询里带 key 参数会被拒绝。
  • 隐私页按审计核对表更新:访问日志、IP 哈希、配额标记、删除后站点侧剩下的记录。

3.2.0(2026-10-08)

  • 服务端汇总统计:按北京时间按天统计页面访问、爬虫、来源域名和 ?from= 参数、新建行程(邀请码、自带 Key、管理页)、当天有计算的行程数、发布方案页次数、方案页打开次数;只记次数,不记 IP 和完整地址,不用 Cookie,保留 35 天;/api/admin/stats 返回近 30 天。
  • 编辑页的计算环境(Pyodide)、地图(Leaflet)和 Markdown 渲染(marked)改为随站点自己托管(/vendor/),构建时下载固定版本并校验 sha256,不再依赖 jsDelivr 和 cdnjs;编辑页的内容安全策略相应收紧。
  • 不兼容:构建(npm run build、npm run deploy)第一次需要联网下载约 13 MB 的依赖,缓存在 .cache/;下载失败或校验不对会让构建报错。
  • 不兼容:wrangler.jsonc 的 assets 增加了 not_found_handling: "404-page" 和更多的 run_worker_first 路径;自部署的人要同步这两处,否则页面访问不会计数,不存在的地址也没有站内 404 页。
  • 方案页不存在、已停止分享或已删除时,返回说明原因的 404 页面,并给出首页入口;访问口令页也改用统一样式。
  • 编辑链接对应的行程已经删除或到期时,接口返回 TRIP_GONE(状态码 404),和密钥不对(UNAUTHORIZED,401)区分开。
  • /api/env 返回版本号。
  • 新增本更新记录和 GitHub Releases 升级说明。
  • 设计系统:统一颜色、深色模式(跟随系统)和组件;编辑页、方案页、示例页、管理页都套用;新增 /design 样式指南。
  • 编辑页:手机上底部分页签「填写 / 地图 / 方案」,算完自动切到「方案」;车次表格每个车站一行竖排;所有原生 alert / confirm / prompt 换成页内弹窗和轻提示,删除行程要输入行程名称确认;每个方案一张卡片,关键数字(搭车人数、车主多绕、打车人数)放前面;方案过期提示带「重新计算」;还没有方案时有空状态说明。
  • 编辑页加载失败不再整页报错:计算环境没加载出来时说明原因并可以重试,地图或 Markdown 渲染没加载出来时仍能填写。
  • 行程已经删除或到期时,编辑页显示专门的页面状态,并把它从这台设备的「最近的行程」里去掉。
  • 逻辑加固:成员重名会在保存和计算前拦住,并定位到输入框(计算内核 carpool.py 也加了校验);车次、时间、日期、空座、同行人数、绕路分钟数的格式和范围校验,计算按钮给出可点击的错误列表;编辑页的日期统一按北京时间显示。
  • 方案页模板内嵌同一套设计变量,支持深色,打印时强制浅色;页面图标内嵌,不再引用站点上的图片。
  • 管理页新增流量统计面板(近 30 天页面访问、使用漏斗、来源和爬虫排行,突出 AI 爬虫)。
  • 隐私页补上服务端汇总统计的口径,第三方一节更新。
  • 本地版(ui.py)也提供设计系统的样式和图标文件。

3.1.0(2026-10-07)

  • 编辑口令(可选):新设备打开编辑链接要先输口令,其他在线的人会被请出。
  • 管理页:随机会话令牌(24 小时过期、可一键退出所有会话)、登录限次、应急开关(暂停公共额度、暂停新建、停用所有邀请码、停用单个行程的公共额度)、操作记录、用公共额度新建行程。
  • 不兼容:站长口令只用于登录管理页,不能再当邀请码用。
  • 站长 Key 的用量按高德的两类(路线测距、搜索)分别记,今天、本月分开,可用 OWNER_MONTHLY_LBS_BUDGET、OWNER_MONTHLY_SEARCH_BUDGET 设月预算;新增公开的额度状态接口 /api/status。
  • 安全:Worker 响应统一加安全头、改动状态的请求校验 Origin、500 错误不泄露内部信息;构建时给每个页面生成内容安全策略(内嵌脚本按哈希放行);cdnjs 的脚本和样式加 SRI。
  • 首页首屏效果图、示例方案页 /demo、图标和 favicon、隐私页修订、搜索引擎和 AI 问答用的基础 SEO(robots.txt、sitemap.xml、llms.txt)。

3.0.0(2026-10-07)

  • 开源:许可证为 AGPL-3.0-or-later,附 LICENSING.md;新增「费用与隐私」页 /privacy。
  • 用站长 Key 新建行程改为邀请码;新增管理页 /admin,可生成、查看和停用邀请码;邀请链接 /?invite=…。
  • 方案页默认模糊车主出发地,可设访问口令、停止分享、换新链接;编辑链接可重置。
  • 不兼容:新发布的方案页使用单独的 id(/p/<方案页 id>),不再等于行程 id;v3 之前发布过的行程,方案页链接保持不变。
  • 数据保留期:出行日期后 60 天,或连续 180 天没人编辑,自动删除;到期前 7 天在编辑页提示。
  • 计算内核插件化:新增返程规划(送人到车站或顺路的家)和同行人数(一组人一起上车或一起打车)。
  • 安全修复:报告渲染转义 HTML(原来成员名字里的 HTML 会被原样输出)、只放行 http(s) 链接;WebSocket 校验来源;方案页放进 CSP 沙箱。
  • 新增 Durable Object 类 Usage(全站计数),迁移由 wrangler 按 wrangler.jsonc 自动执行。

2.0.0(2026-10-07)

  • 多行程:每个行程一个 Durable Object,编辑权限即编辑链接 /t/<id>#k=<密钥>;新建行程用站长 Key(凭口令)或自带高德 Key。
  • 多人编辑:在线名单、正在编辑的格子标记、保存冲突提示;历史版本(最近 100 个)可查看和恢复。
  • 通用的输入流程:目的地、成员、候选车站、车次的分步填写,进度提示;推荐车站;12306 查询链接;配置导入导出;方案页加分享摘要。
  • 额度用完时可改用自己的 Key,计算有进度条;地图标签防遮挡。

1.0.0(2026-10-07)

  • 婚礼拼车规划:用高德选站、算接人方案,本地版(ui.py)和在线版。
  • 在线版:多人实时同步、绕路对比、配额用完后停止调用、提速;部署到 carpool.eigentime.org(Cloudflare Worker,绑定 KV 和自定义域名)。