6.3 KiB
6.3 KiB
name, overview, todos
| name | overview | todos | |||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 前后端逻辑对齐 | 以后端最新代码为准,修复前端与后端不一致的地方,重点解决用户额度调整语义错配、额度凭证(grants)功能缺失、商品与订单字段缺失等问题。 |
|
用户需求
后端管理代码有更新,需全量核对后端(/root/zt-closet-manage-backend)与前端(/root/zt-closet-manage-frontend)的逻辑一致性。以后端最新代码为基准,前端做适配,确保接口字段、请求语义、枚举映射完全对齐。
核对结论与变更点
经全量对比,登录鉴权、仪表盘、内容审核、通知、退款、响应结构与错误码均已一致,无需改动。存在以下 5 处不一致需要修复:
- 用户额度调整语义错配(功能不可用):后端已改为「发放额度凭证」语义,请求体为
quota_type + amount + expire_days;前端仍使用旧的quota_type + new_total + reason,导致提交必失败。 - 用户额度凭证(grants)功能缺失:后端用户详情已返回
grants列表,并提供DELETE /users/:uuid/grants/:id回收接口;前端类型、API、页面展示与回收操作均缺失。 - 商品字段缺失:后端商品新增
valid_days(有效期天数,可编辑)及只读的product_id、product_status(虚拟支付道具);前端类型、表单与列表展示均未覆盖。 - 订单字段缺失:后端订单新增
xpay_product_id、xpay_platform、xpay_env(虚拟支付信息);前端类型与详情展示均未覆盖。 - 支付渠道枚举缺失:后端支付渠道为「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(1100000000)与3650)。这是当前最严重的不一致,修复后功能才可用。expire_days(1 - 补齐凭证管理闭环:
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 严格对齐):
// 额度发放请求(后端 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[]
}