bindbox-game/.trae/documents/完善工作台:订单漏斗、中奖分析、用户概述与抽奖动态.md
邹方成 87ad4177b1
Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 39s
feat(工作台): 实现管理端工作台接口并优化数据展示
feat(抽奖动态): 修复抽奖动态未渲染问题并优化文案展示
fix(用户概览): 修复用户概览无数据显示问题
feat(新用户列表): 在新用户列表显示称号明细
refactor(待办事项): 移除代办模块并全宽展示实时动态
feat(批量操作): 限制为单用户操作并在批量时提醒
fix(称号分配): 防重复分配称号的改造计划
perf(接口性能): 优化新用户和抽奖动态接口性能
feat(订单漏斗): 优化订单转化漏斗指标计算
docs(测试计划): 完善盲盒运营API核查与闭环测试计划
2025-11-16 14:00:29 +08:00

72 lines
5.9 KiB
Markdown
Raw 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.

## 目标
- 补齐工作台 4 个模块的真实数据接口与前端对接:订单转化漏斗、活动中奖分析、用户概述、抽奖动态文案完善。
## 后端接口设计(统一前缀 `/api/admin/dashboard`
### 1) 订单转化漏斗 `GET /order_funnel`
- 入参:`rangeType=today|7d|30d|custom``start/end`custom 时必填)
- 出参:`FunnelData[]`(与 `web/admin/src/api/operations.ts` 定义一致)
- 统计口径:
- 访问用户:优先取 `log_request``path LIKE '/api/app/%'` 的唯一访问(去重 `tid` 或 IP/UA范围时间内`internal/repository/mysql/model/log_request.gen.go:13-27`
- 下单用户:`orders.created_at` 范围内下单的唯一用户数(`orders.status` 任意)(`internal/repository/mysql/model/orders.gen.go:13-33`
- 支付用户:`orders.status=2`(已支付)范围内唯一用户数
- 完成订单:订单完成的判定(二选一并取并集):`orders.status=2 AND is_consumed=1` 或存在 `shipping_records.status IN (2,3)`(已发货/已签收)(`internal/repository/mysql/model/shipping_records.gen.go:13-31`
- 返回各阶段 `count`,并计算 `rate`(相对上一阶段)与 `lostCount`
### 2) 活动中奖分析 `GET /activity_prize_analysis`
- 入参:`activity_id`(必填),可选 `rangeType`
- 出参:`ActivityPrizeAnalysis``activity` + `prizes[]` + `summary`,与前端类型一致)
- 统计口径:
- 奖品模板:`activity_reward_settings``issue_id` 归属同活动的期)(`internal/repository/mysql/model/activity_reward_settings.gen.go:13-27`
- 中奖统计:`activity_draw_logs``reward_id` 分组统计 `winCount``is_winner=1``drawCount` 为期内抽奖总次数(`internal/repository/mysql/model/activity_draw_logs.gen.go:13-24`
- 概率(设置):`weight/Σweight*100`(模板无显式概率字段,采用权重归一化)
- 概率(实际):`winCount/drawCount*100`
- 成本:若模板 `product_id` 非空,关联 `products.price` 作为单件成本(`internal/repository/mysql/model/products.gen.go:13-25`);否则成本为 0 或采用等级默认表(可配置)
- 活动信息:`activities` + `activity_issues` 组合(名称、时间范围、参与人数=distinct `user_id`,总抽奖次数)
### 3) 用户概述 `GET /user_overview`
- 入参:`rangeType`
- 出参:包含:
- `chart`: 最近 N 个时间桶(默认 9 个月)用户注册量序列(来源 `users.created_at`
- `metrics`: `totalUsers`(系统总量)、`totalVisits``log_request``/api/app/%` 请求计数)、`dailyVisits`(当天 `/api/app/%`)、`weeklyGrowth`(近 7 天 vs 上 7 天访问增幅)
- 说明:若实际“访问”定义需更严格,可后续改为埋点表;当前采用请求日志近似。
### 4) 抽奖动态增强 `GET /draw_stream`(已有)
- 增加字段:`activityName``issueNumber``prizeName`(中奖时)
- 数据来源:`activity_issues``activities``activity_reward_settings.name`
- 现有实现位置:`internal/api/admin/dashboard_admin.go:270-317`(将补充字段)
### 5) 通用
- 时间范围工具沿用:`parseRange/previousWindow/daysBetween``internal/api/admin/dashboard_admin.go:365-417`),对 `custom` 做 30 天上限;趋势分桶工具已实现(`normalizeGranularity/buildBuckets`)。
- 路由注册:在 `adminAuthApiRouter` 添加新端点(参考 `internal/router/router.go:63` 附近已有 dashboard 路由)。
## 前端改动
- 文件:`web/admin/src/api/operations.ts`
- `fetchOrderFunnel(range)``GET admin/dashboard/order_funnel`
- `fetchActivityList()``GET admin/dashboard/activities`(返回 `id,name,type,start,end,status,totalDraws,totalParticipants`;也可直接用现有 `GET /api/admin/activities` 的列表按需映射)
- `fetchActivityPrizeAnalysis(activityId)``GET admin/dashboard/activity_prize_analysis`
- `fetchUserOverview(range)`(新增) → `GET admin/dashboard/user_overview`
- 组件对接:
- `order-funnel.vue` 已调用 `fetchOrderFunnel``web/admin/src/views/dashboard/console/modules/order-funnel.vue:148-153`),直接切换数据源即可。
- `activity-prize-analysis.vue` 使用 `fetchActivityList/fetchActivityPrizeAnalysis``web/admin/src/views/dashboard/console/modules/activity-prize-analysis.vue:219-225``344-357``367-375`),切换到真实 API。
- `active-user.vue` 当前为静态数据(`web/admin/src/views/dashboard/console/modules/active-user.vue:31-46`),改为使用 `fetchUserOverview` 渲染条形图与 4 个指标。
- `dynamic-stats.vue` 增强显示中奖文案:“用户在【活动-期】中奖【奖品名】”(使用新增字段),保留参与与中奖标签(`web/admin/src/views/dashboard/console/modules/dynamic-stats.vue`)。
## 返回示例
- `GET /api/admin/dashboard/order_funnel``[{"stage":"访问用户","count":12580,"rate":100,"lostCount":0}, ...]`
- `GET /api/admin/dashboard/activity_prize_analysis`:结构与前端定义一致,概率为权重归一化。
- `GET /api/admin/dashboard/user_overview``{"chart":[{"date":"2025-03","value":1200},...],"metrics":{"totalUsers":12345,"totalVisits":45678,"dailyVisits":1234,"weeklyGrowth":"+8%"}}`
- `GET /api/admin/dashboard/draw_stream`:增加 `activityName/issueNumber/prizeName` 字段。
## 验收
- 工作台四模块均显示真实数据各接口性能在默认范围≤30 天)内响应合理。
- 环比与趋势计算准确;异常/空数据有合理降级。
## 后续可选优化
-`log_request.created_at``orders.created_at``shipping_records.status``activity_draw_logs.created_at` 增加索引。
- 活动奖品“成本”可从商品资料或运营配置独立维护,避免 0 值。
确认后我将:
1. 补充 3 个新端点与 `draw_stream` 字段;注册路由;
2. 替换 `operations.ts` 的 Mock 为真实请求;
3. 调整前端 3 个模块的渲染逻辑;
4. 进行构建与联调,提供验证指令与预览链接。