**发现并已修复的文档滞后**(后期代码先于文档,审计时补齐): | 滞后点 | 修复 | |---|---| | `24.附录` users 表缺 `wechat_openid` 列(二期微信登录加的) | ✅ 已补 | | `24.附录` 缺 `refuel_records` 表(三期记账) | ✅ 已补 | | `24.附录` 错误码缺 `1012/1013`(三期) | ✅ 已补 | | `34.附录` 小程序页面目录缺 `calc/refuels`(三期) | ✅ 已补 | **核对一致项**: - API 路由 **A1-A23 + `/api/auth/wechat`** 全部注册,与 22/33/43 文档逐项对应 - `schema.sql` 11 表 = 24 附录(10 + refuel)+ 45 附录 - 小程序 8 页文件齐全(js/wxml/wxss/json × 8),`refuels.wxml` 数据绑定与 js 匹配 - H5 8 页面全部可访问 ## 2️⃣ 后期变更对前期的影响 ✅ 无破坏 综合回归 **20 项全 PASS**: - **一期**:账号密码登录 / Cookie 会话 / dashboard / provinces(31省) / history ✅ - **二期**:Bearer token 认证(与 Cookie **双通道共存**,互不冲突)✅ - **三期**:refuel 首条保存 / 区间油耗 8.25 / 统计 / 预填 ✅ - **前端**:9 个资源(8 页 + 静态 JS)全部 200 ✅ 关键:二期的 `users` 加列是**幂等增量迁移**(ALTER),未动一期任何表结构;一期 API 与前端全部正常。 ## 3️⃣ 整体可行性 ✅ 在可控范围 | 维度 | 状态 | |---|---| | 构建/静态检查 | `go build / vet` 全绿 | | 单元测试 | 6 包 17 单测全过(auth/crawler/cron/db/push/service) | | 规模 | 11 表 · 23+ 接口 · 8 H5 页面 · 8 小程序页面 · 17 份文档 · ~90 代码文件 | | 三阶段功能 | 监控预测提醒 → 微信小程序 → 加油记账/真实油耗,全部落地 | **非阻塞小项**(可后续优化,不影响运行): 1. `refuels.wxml` 第 11 行 `wx:for` 与 `wx:if` 同节点——功能正常,写法可规范 2. api 包 handler 层无独立单测——由端到端回归覆盖(service 层已有单测) --- **结论:项目整体健康、文档与代码对齐、三阶段功能完整可用。** 4 处文档滞后已修复,无功能性问题。可以进入部署/上线阶段。
6.1 KiB
6.1 KiB
⛽ 三期 · 记账功能 — 前端详细设计
上游:
docs/40.记账概要设计.md(v1.1)、docs/43.记账API详细设计.md覆盖 H5 与微信小程序双端:独立油耗计算器 / 记一笔 / 记录列表 / 油耗统计(折线图)
一、H5 前端
1.1 页面路由
| 页面 | 路由 | 访问 | 说明 |
|---|---|---|---|
| 独立油耗计算器 | /fuel-calc |
🔓 无需登录 | 算真实油耗;登录+有车可"保存到车辆" |
| 记录列表 | /refuels?vehicle=1 |
🔒 | 列表(倒序)+ 油耗字段 + 编辑/删除/补录 |
| 记一笔 | /refuels/new?vehicle=1 |
🔒 | 表单:回填 + 录入 + 完成 |
| 油耗统计 | /refuels/stats?vehicle=1 |
🔒 | ECharts 折线图 + 汇总 |
| 入口 | 爱车页每辆车卡片 | 🔒 | "加油记录"按钮 + "最近一次油耗"卡片 |
1.2 记一笔页(登录 + 有车,完整流程)
进入页面
├─ GET /api/refuels/prefill?vehicle_id=X ⟶ [A22]
├─ 回填(可改):
│ ├─ 当前油价 ← current_price(该车省份该油号最新价)
│ ├─ 上次码表里程 ← last_odometer(最近一条)
│ └─ 加油日期 ← 默认当前日期,可改(补录场景)
│ (展示该车平均油耗 avg_l_per_100km 作参考)
├─ 输入(必填):支付金额 / 当前码表里程
├─ 可选:优惠金额(默认0)/ 加油日期 / 本次是否加满(复选框,**仅标签**)/ 备注
└─ 点击"完成"
├─ POST /api/refuels ⟶ [A19]
├─ possible_missing=true → 弹"耗油量异常,是否有漏记?" → 是:跳列表补录 / 否:保留
└─ anomaly=odometer → 记录标黄"里程异常"
1.3 独立油耗计算器(核心新功能,无需登录/车辆)
访问矩阵:
未登录 → 全手输,仅本地计算,不保存(显示"登录后可保存到车辆")
登录+有车 → 回填该车信息(A22),计算后可选"保存到车辆"(A19)
登录+无车 → 提示"请先添加车辆",引导爱车页
登录+有车+首条 → 提示"首次加油,无上次基准"
流程:
进入 /fuel-calc
├─ 已登录 + 有车 → 页面顶部【当前车辆】选择器(A4 车辆列表,可切换)
│ ├─ 切换车辆 → GET A22 prefill → 回填:当前油价 / 上次里程 / 上次日期(可改)
│ └─ 该车无记录 → 展示"暂无历史"(无上次基准)
├─ 未登录 → 顶部登录入口"登录后可实时追踪真实油耗"
│ └─ 空表单(油价 / 上次里程 / 上次日期 用户手输,可空)
├─ 输入:本次里程 / 支付金额 / 优惠金额(0) / 是否加满(标签) / 加油日期(默认当前)
└─ 点"计算油耗" → 前端本地公式 → 展示结果卡片:
L/100km = (amount-discount)/price / (odo_now - odo_last) × 100
元/km = (amount-discount) / (odo_now - odo_last)
├─ 有上次基准且 distance>0 → 展示油耗;distance<=0 → 提示"里程异常"
├─ 无上次基准 → 仅展示本次加油量/金额(提示需两次记录才能算油耗)
├─ 已登录+有车 → 按钮"保存到车辆" → POST A19 → 保存 + 异常检测
└─ 未登录 → 结果卡片下方展示"登录后可实时追踪真实油耗"(点击登录)
1.4 记录列表
- 每条显示:日期 / 里程 / 油量 / 单价 / 实付 / 区间油耗(L/100km、元/km)
- 加满标签:
full_tank=true显示"加满"徽标 - 异常记录:
anomaly=odometer标黄"里程异常" - 操作:编辑(弹层)→ PUT;删除 → confirm → DELETE;补录 → 弹表单(漏记那次的日期/里程/金额/油价)→ 按日期排序落位 → 级联重算
1.5 统计页 + 爱车首页"最近油耗"卡片
- 统计页:汇总卡(总次数/累计金额/累计油量/平均 L/100km/平均元/km)+ ECharts 折线图
- 爱车首页卡片:每辆车显示"最近一次油耗 L/100km"→ 点击跳该车统计页
二、ECharts 折线图设计(H5)
| 图 | 数据源 | 说明 |
|---|---|---|
| 油耗趋势 | trends.l_per_100km |
主图,markLine 显示平均油耗 |
| 成本趋势 | trends.yuan_per_km |
可切换查看 |
| 油价趋势 | trends.price |
每升价格变化 |
| 累计费用 | trends.cumulative_amount |
面积图(阶梯累计) |
- 日期横轴;图例可切换指标;异常点(anomaly=odometer)空心标记,hover 提示
- 数据源:
GET /api/refuels/stats?vehicle_id=X⟶ [A23]
三、小程序前端
3.1 页面
| 页面 | 功能 |
|---|---|
pages/refuels/refuels |
某辆车加油记录(三 tab:记录 / 记一笔 / 统计) |
pages/calc/calc |
独立油耗计算器(首页导航入口,无需登录) |
入口:
- 爱车页(P04)每辆车 → "加油记录" → navigateTo
pages/refuels/refuels?vehicle_id=X - 首页导航 → "算油耗" → navigateTo
pages/calc/calc
3.2 记一笔(与 H5 一致)
- 回填
current_price/last_odometer/ 加油日期(默认当前) - 输入支付金额 / 优惠金额 / 当前里程 + 加满复选框(标签)
- 完成 → POST →
possible_missing用wx.showModal确认 → 是:跳补录 / 否:保留 anomaly=odometer标黄提示
3.3 独立计算器(calc 页)
- 未登录:纯本地计算(输入油价/上次里程/本次里程/金额/优惠)→ 展示 L/100km、元/km
- 已登录:车辆选择 → 回填(A22)→ 计算 → "保存到车辆"按钮(A19)
- 折线图:复用
utils/chart.jsdrawChart(油耗 + 累计费用两个 series)
四、表单字段校验(双端一致)
| 字段 | 规则 |
|---|---|
| vehicle_id | 保存时必填,须属于当前用户(计算器本地算可缺省) |
| odometer | 必填,数值 (0, 1000000] km |
| amount | 必填,数值 > 0 元 |
| price_per_liter | 必填,数值 > 0 元/升 |
| discount | 可选,[0, amount) 元 |
| full_tank | 可选,默认 true(仅标签,不参与计算) |
| refuel_at | 可选,默认当前时间(补录可改) |