--- 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` 封装与 `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>({ 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` 的 `showError: false` 模式,收藏/轮询失败不打断主流程。 - 支付轮询必须按 `order_no` 精确匹配,不能只看列表是否非空,避免误判他人订单或历史订单。 - 订单取消禁用仅控制前端入口,后端 `70007` 仍作为兜底,双保险。 - 不修改金额/时间换算、枚举值、请求字段名等已确认一致的部分,避免扩大改动面。