101 lines
5.9 KiB
Markdown
101 lines
5.9 KiB
Markdown
---
|
||
name: 前端与后端一致性修复
|
||
overview: 根据上一轮全量检查报告,修复前端代码使其与已更新的后端完全一致(广告激励功能暂不实现、通知筛选后端已配合无需改前端),覆盖虚拟支付轮询、收藏状态初始化、类型字段补齐、错误码补充等。
|
||
todos:
|
||
- id: fix-types-errors
|
||
content: 补齐 models.ts 类型字段与 config.ts 70007 错误码
|
||
status: completed
|
||
- id: fix-collect-status
|
||
content: outfit-detail.ts 调用收藏状态接口初始化 isCollected
|
||
status: completed
|
||
dependencies:
|
||
- fix-types-errors
|
||
- id: fix-pay-polling
|
||
content: mall.ts 支付成功后按 order_no 轮询订单确认到账
|
||
status: completed
|
||
dependencies:
|
||
- fix-types-errors
|
||
- id: fix-order-channel
|
||
content: order.ts 与 order.wxml 区分支付渠道并禁用虚拟订单取消
|
||
status: completed
|
||
dependencies:
|
||
- fix-types-errors
|
||
- id: fix-ai-quota-tip
|
||
content: ai-recommend.ts 生成前弹窗提示消耗 AI 额度
|
||
status: completed
|
||
- id: fix-login-guide
|
||
content: login.ts 新用户登录后引导完善生日
|
||
status: completed
|
||
---
|
||
|
||
## 用户需求
|
||
|
||
用户已修复后端两点:通知列表 `msg_type` 筛选、新增 `GET /collect/:targetUUID` 收藏状态查询接口。现要求前端按修复后的后端对齐,其中「广告激励额度发放」功能暂不实现,其余按上一轮一致性检查报告的结论修复前端。
|
||
|
||
## 核心修复项
|
||
|
||
1. 补齐前端类型定义与错误码:`OrderItem` 补 `pay_channel`、`GoodsItem` 补 `ai_recommend_quota`/`valid_days`、`vip_type` 注释补体验会员、错误码表补 `70007`。
|
||
2. 收藏状态正确初始化:穿搭详情页调用新增的收藏状态查询接口,不再写死为「未收藏」。
|
||
3. 虚拟支付成功后轮询订单确认到账:支付组件 `success` 不再直接刷新权益,而是轮询订单直到 `order_status=2`。
|
||
4. 订单页区分支付渠道:虚拟支付订单禁用「取消订单」入口。
|
||
5. AI 推荐生成前提示将消耗 1 次 AI 额度。
|
||
6. 新用户登录后引导完善生日。
|
||
|
||
## 边界
|
||
|
||
- 只改前端代码,不改后端。
|
||
- 广告激励(`/ad-reward/grant`)不实现。
|
||
- 通知列表前端无需改动(后端已配合支持 `msg_type`)。
|
||
- 保持现有小程序原生 + TypeScript 风格,金额单位分、时间单位秒的换算不变。
|
||
|
||
## 技术栈
|
||
|
||
- 前端:微信小程序原生 + TypeScript
|
||
- 复用现有 `miniprogram/utils/request.ts` 的 `request<T>` 封装与 `utils/config.ts` 的枚举/错误码表
|
||
|
||
## 实现方案
|
||
|
||
### 1. 类型与错误码补齐(models.ts + config.ts)
|
||
|
||
- `types/models.ts`
|
||
- `OrderItem` 增补 `pay_channel: number`(注释:1=微信支付 2=虚拟支付)。
|
||
- `GoodsItem` 增补 `ai_recommend_quota: number`(赠送 AI 推荐额度)、`valid_days: number`(加量包有效期天数)。
|
||
- `UserInfo.vip_type` 注释由「1 非会员 2 月度会员 3 年度会员」补齐为「1 非会员 2 月度会员 3 年度会员 4 体验会员」。
|
||
- `utils/config.ts` 的 `ERROR_MESSAGES` 增补 `70007: '虚拟支付订单不支持取消'`。
|
||
|
||
### 2. 收藏状态初始化(outfit-detail.ts)
|
||
|
||
- 在 `fetchDetail()` 中与点赞状态一起并行请求,新增调用 `request<{ is_collected: boolean; collect_count: number }>({ url: '/collect/' + this.data.uuid, showError: false })`。
|
||
- 用响应 `is_collected` 初始化 `this.data.isCollected`;`collect_count` 可存入 `data` 备用,失败静默保持 `false`,不影响原有点赞与详情加载。
|
||
|
||
### 3. 支付后轮询订单确认(mall.ts)
|
||
|
||
- 将 `doPayment(res)` 的 `success` 回调改为调用新增的 `pollOrder(res.order_no)`。
|
||
- `pollOrder(orderNo)` 实现:每 1.5s 调用 `request<PagedResult<OrderItem>>({ url: '/order', data: { page: 1, page_size: 50 } })`,利用后端 `Order("id DESC")` 新订单在第一页的特性,在 `list` 中按 `order_no` 匹配:
|
||
- `order_status === 2`:停止轮询,`showToast('支付成功')` 并 `fetchQuota()` + `fetchUser()`。
|
||
- `order_status` 为 3/4/5:停止轮询,提示对应结果。
|
||
- `order_status === 1`:继续轮询。
|
||
- 超过约 10 次:停止,`showToast('到账可能有延迟')` 并 `fetchQuota()` + `fetchUser()`。
|
||
- 保留现有「先关闭订单弹窗再支付」交互;`fail` 回调保持静默处理不变。
|
||
|
||
### 4. 订单支付渠道区分(order.ts + order.wxml)
|
||
|
||
- `order.ts` 的 `fetchList` map 逻辑增补:
|
||
- `_canCancel: it.order_status === 1 && it.pay_channel !== 2`
|
||
- `_payChannelText: it.pay_channel === 2 ? '虚拟支付' : '微信支付'`
|
||
- `order.wxml` 中「取消订单」按钮由直接展示改为 `wx:if="{{item._canCancel}}"` 控制,虚拟支付订单不再展示取消入口;订单信息区可选展示 `_payChannelText`。
|
||
|
||
### 5. AI 推荐额度提示(ai-recommend.ts)
|
||
|
||
- 在 `startGenerate(sceneType, scene)` 执行生成前增加 `wx.showModal` 确认,文案「本次将消耗 1 次 AI 推荐额度」,`confirm` 后才执行原有生成逻辑,`cancel` 则恢复场景选择态;`onSkipScene` 与 `onStartGenerate` 均复用该确认,避免重复弹窗。
|
||
|
||
### 6. 新用户生日引导(login.ts)
|
||
|
||
- 登录成功并保存 token/user_info 后,先按现有逻辑 `switchTab` 到衣橱页,再判断 `data.user_info.is_new_user || !data.user_info.birth_day`:满足条件时弹 `wx.showModal` 引导「完善生日可解锁今日运势」,确认后 `switchTab` 到 `pages/profile/profile`,取消则留在衣橱页。
|
||
|
||
## 实现要点(防回归)
|
||
|
||
- 所有新接口调用沿用 `request<T>` 的 `showError: false` 模式,收藏/轮询失败不打断主流程。
|
||
- 支付轮询必须按 `order_no` 精确匹配,不能只看列表是否非空,避免误判他人订单或历史订单。
|
||
- 订单取消禁用仅控制前端入口,后端 `70007` 仍作为兜底,双保险。
|
||
- 不修改金额/时间换算、枚举值、请求字段名等已确认一致的部分,避免扩大改动面。 |