Files
zt-closet-manage-frontend/.codebuddy/plans/前后端逻辑对齐_ced8a4e5.md
2026-09-11 01:46:36 +08:00

110 lines
6.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: 前后端逻辑对齐
overview: 以后端最新代码为准,修复前端与后端不一致的地方,重点解决用户额度调整语义错配、额度凭证(grants)功能缺失、商品与订单字段缺失等问题。
todos:
- id: align-user-types-api
content: 对齐用户额度/凭证类型并新增 revokeGrant 回收 API
status: completed
- id: update-user-view
content: 更新用户页额度发放表单与详情凭证列表回收
status: completed
dependencies:
- align-user-types-api
- id: align-goods-types-view
content: 补齐商品 valid_days 等字段并更新商品表单与展示
status: completed
- id: align-order-types-view
content: 补齐订单虚拟支付字段、枚举并更新订单详情展示
status: completed
---
## 用户需求
后端管理代码有更新,需全量核对后端(/root/zt-closet-manage-backend)与前端(/root/zt-closet-manage-frontend)的逻辑一致性。以后端最新代码为基准,前端做适配,确保接口字段、请求语义、枚举映射完全对齐。
## 核对结论与变更点
经全量对比,登录鉴权、仪表盘、内容审核、通知、退款、响应结构与错误码均已一致,无需改动。存在以下 5 处不一致需要修复:
1. **用户额度调整语义错配(功能不可用)**:后端已改为「发放额度凭证」语义,请求体为 `quota_type + amount + expire_days`;前端仍使用旧的 `quota_type + new_total + reason`,导致提交必失败。
2. **用户额度凭证(grants)功能缺失**:后端用户详情已返回 `grants` 列表,并提供 `DELETE /users/:uuid/grants/:id` 回收接口;前端类型、API、页面展示与回收操作均缺失。
3. **商品字段缺失**:后端商品新增 `valid_days`(有效期天数,可编辑)及只读的 `product_id`、`product_status`(虚拟支付道具);前端类型、表单与列表展示均未覆盖。
4. **订单字段缺失**:后端订单新增 `xpay_product_id`、`xpay_platform`、`xpay_env`(虚拟支付信息);前端类型与详情展示均未覆盖。
5. **支付渠道枚举缺失**:后端支付渠道为「1=微信支付、2=微信虚拟支付」;前端 `PAY_CHANNEL` 仅定义 value=1,虚拟支付订单会显示为 `-`。
## 技术栈
- 前端:Vue 3 + TypeScript + Element Plus + Pinia + axios(沿用现有架构,不引入新依赖)
- 后端:Go + Gin(只读参考,不修改)
## 实现方案
以后端 `internal/dto/*.go` 的 JSON tag 与路由为唯一基准,逐项对齐前端 `src/types`、`src/api`、`src/utils/constants` 与对应 `src/views` 页面。
### 关键决策
- **额度调整语义重构**:将前端 `UserQuotaAdjustRequest` 改为 `{ quota_type, amount, expire_days }`,移除 `new_total`、`reason`。页面表单同步改为「发放数量 + 有效期天数」,提交 `amount`(1~100000000)与 `expire_days`(1~3650)。这是当前最严重的不一致,修复后功能才可用。
- **补齐凭证管理闭环**:`UserDetailResponse` 增加 `grants: UserGrantItem[]`;`api/user.ts` 新增 `revokeGrant` 调用 `DELETE /users/:uuid/grants/:id`;详情抽屉展示凭证列表(类型/来源/数量/已用/到期/关联 ID)并增加「回收」操作,回收成功后重新拉取详情刷新。
- **只读字段与可编辑字段分离**:商品 `product_id`、`product_status` 为只读,仅展示、不参与创建/更新提交;`valid_days` 可编辑,加入表单回显与提交。商品更新接口为「传什么改什么」的指针语义,前端编辑时仅提交可编辑字段。
- **枚举与展示对齐**:`constants.ts` 新增 `GRANT_SOURCE`(1=会员包、2=加量包、3=广告激励),`PAY_CHANNEL` 补充 value=2(微信虚拟支付)。
- **单位约定不变**:价格仍为「分」,前端继续用 `yuanToCents`/`formatMoney` 换算,避免引入新的金额逻辑。
### 实现注意事项
- 所有字段命名严格遵循后端 JSON tag(snake_case),禁止自创字段名。
- 复用现有 `httpGet/httpPost/httpPut/httpDelete` 与 `enumLabel/enumTag/enumOptions/formatDate/formatText` 工具,不新增请求层逻辑。
- 回收凭证后需重新调用 `getUserDetail` 刷新详情,避免展示陈旧数据。
- 保持现有页面结构与组件风格,仅做字段级调整,不做无关重构。
## 目录结构
```
zt-closet-manage-frontend/
├── src/
│ ├── types/
│ │ ├── user.ts # [MODIFY] UserQuotaAdjustRequest 改为 amount+expire_days;新增 UserGrantItem;UserDetailResponse 增加 grants
│ │ ├── goods.ts # [MODIFY] GoodsItem 增加 valid_days/product_id/product_status;GoodsCreateRequest、GoodsUpdateRequest 增加 valid_days
│ │ └── order.ts # [MODIFY] OrderItem 增加 xpay_product_id/xpay_platform/xpay_env
│ ├── api/
│ │ └── user.ts # [MODIFY] 新增 revokeGrant(uuid, grantId) 调用 DELETE /users/:uuid/grants/:id
│ ├── utils/
│ │ └── constants.ts # [MODIFY] 新增 GRANT_SOURCE 枚举;PAY_CHANNEL 补充 value=2
│ └── views/
│ ├── user/
│ │ └── UserListView.vue # [MODIFY] 额度表单改为发放数量+有效期天数;详情抽屉展示 grants 并增加回收操作
│ ├── goods/
│ │ └── GoodsListView.vue # [MODIFY] 表单增加 valid_days;列表/详情展示 product_id、product_status
│ └── order/
│ └── OrderListView.vue # [MODIFY] 订单详情抽屉展示虚拟支付字段
```
## 关键代码结构
用户域核心类型(需与后端 dto/user.go 严格对齐):
```ts
// 额度发放请求(后端 UserQuotaAdjustRequest)
export interface UserQuotaAdjustRequest {
quota_type: number // 1=上传 2=AI 3=社区分享 4=衣柜分享
amount: number // 发放数量,min=1
expire_days: number // 有效期天数,min=1
}
// 用户额度凭证(后端 UserGrantItem)
export interface UserGrantItem {
id: number
quota_type: number
amount: number
used: number
source: number // 1=会员包 2=加量包 3=广告激励
expire_time: number // 秒,0=跟随 VIP
ref_id: string
created_at: number
}
// 用户详情(后端 UserDetailResponse)
export interface UserDetailResponse extends UserListItem {
quotas: QuotaItem[]
grants: UserGrantItem[]
}
```