Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 39s
refactor(service): 修改banner和guild删除逻辑为软删除 fix(service): 修复删除操作使用软删除而非物理删除 build: 添加SQLite测试仓库实现 docs: 新增奖励管理字段拆分和批量抽奖UI改造文档 ci: 更新CI忽略文件 style: 清理无用资源文件
6.9 KiB
6.9 KiB
总览
- 覆盖 5 个问题:商品列表批量操作、活动创建奖品价格与总价、仪表盘图表重叠修复、活动创建性能、弹窗点击关闭问题。
- 技术栈:管理端前端 Vue3 + Element Plus(路径
web/admin),后端 Go(路径internal/*)。 - 目标:补齐商品批量接口、完善前端交互与缓存、修正布局与加载时序、增强性能与统一弹窗行为。
关键位置
- 商品前端:
web/admin/src/views/product/list/index.vue,API:web/admin/src/api/product.ts - 商品后端:
internal/api/admin/product_create.go、Service:internal/service/product/product.go - 活动向导:
web/admin/src/views/activity/wizard/index.vue - 奖励管理:
web/admin/src/views/activity/rewards/index.vue - 仪表盘容器:
web/admin/src/views/dashboard/console/index.vue - 抽奖量图表:
web/admin/src/views/dashboard/console/modules/sales-overview.vue+components/core/charts/art-line-chart - 中奖率分析:
web/admin/src/views/dashboard/console/modules/activity-prize-analysis.vue - 弹窗示例:
web/admin/src/views/player-manage/modules/*Dialog.vue、components/core/layouts/*
1. 商品列表功能优化
- 后端批量接口
- 新增
PUT /api/admin/products/batch:请求体{ ids: number[], stock?: number, status?: 1|2 },返回{ updated_count, failed: [ {id, reason} ] }。 - Controller:在
internal/api/admin/product_create.go或新文件product_batch.go增加路由与校验(限制ids1–1000,stock >= 0)。 - Service:
internal/service/product/product.go增加BatchUpdate(ctx, ids, stock?, status?),事务更新;支持“仅库存”“仅状态”“二者皆有”。 - DAO:使用批量更新(
UPDATE products SET stock=?, status=? WHERE id IN (...)),对无权限/不存在的id记录失败原因。 - 文档:更新 swagger(
docs/swagger.yaml)。
- 新增
- 前端批量操作
- 列表顶部添加“全选本页”复选框:基于
ElTable的选择事件维护selectedIds: number[],checkAll同步当页数据。 - 批量工具栏:按钮“批量改库存”“批量上架”“批量下架”。每次操作弹出确认框(库存输入/操作确认)。
- API:在
web/admin/src/api/product.ts新增batchUpdateProducts(payload)调用上游接口;失败项以通知/表格高亮反馈。 - 交互:操作成功后刷新当页并清空选中;支持 loading 与禁用态;无选中时禁用按钮。
- 列表顶部添加“全选本页”复选框:基于
2. 活动创建流程优化(奖品价格与总价)
- 单价展示
- 远程商品搜索返回
price字段(已有),选择时在ElSelect的option右侧显示“¥单价”。 - 在奖励编辑卡片/表格中追加“单价”列(从缓存读取)。
- 远程商品搜索返回
- 总价计算
- 公式:
总价 = Σ(price(product_id) * quantity);监听product_id/quantity变更实时更新。 - 缓存:在
wizard/index.vue与rewards/index.vue维护priceCache: Map<product_id, price>,首次选择命中即用,未命中时调用fetchProducts补齐并写入。 - 同步:商品价格变更时(重新打开或重新拉取),更新缓存并触发总价重算;保留两位小数。
- 展示:步骤3顶部显示“选中奖品总成本:¥xxx.xx”。
- 公式:
3. 仪表盘数据展示修复(重叠问题)
- 布局与间距
- 在
console/index.vue的ElRow增加统一gutter(如20),保证模块间距。 - 调整
ElCol断点:避免同一行ActivityPrizeAnalysis与其他模块在窄屏并排压缩;在md/sm断点落到24独占一行。
- 在
- 组件容器
- 为
sales-overview.vue与activity-prize-analysis.vue外层卡片设置position: relative; z-index: 0;图表内部设z-index: 1,避免 canvas/svg 溢出覆盖。 - 统一卡片最小高度,防止加载时高度为 0 导致重叠。
- 为
- 加载时序
- 图表组件在
dataReady后再渲染;v-if="dataReady"避免空容器渲染。 - 保留/增加骨架或加载态,防止内容突变挤压。
- 图表组件在
4. 活动创建性能优化(步骤1)
- 加载指示
wizard/index.vue步骤1添加v-loading与骨架;按钮禁用在加载中。
- 请求超时
- 前端 axios 层设置接口超时
30s,在web/admin/src/api/_http.ts(或全局实例)设置,并对超时给出 Toast 提示与重试入口。
- 前端 axios 层设置接口超时
- 慢请求日志
- Axios 响应拦截记录
duration > 2000ms的接口,打印到控制台并上报(如有日志上报端点)。
- Axios 响应拦截记录
- 初始化优化
- 并行拉取必要数据(活动分类、默认配置、组织信息),减少串行等待;命中表格缓存的接口优先读缓存(已有
tableCache)。
- 并行拉取必要数据(活动分类、默认配置、组织信息),减少串行等待;命中表格缓存的接口优先读缓存(已有
- 错误恢复
- 失败时保留已填写表单,显示错误提示与“重试/刷新数据”按钮;网络恢复后自动重载。
5. 弹窗点击关闭没有反应(统一与修复)
- 审核现状
- 业务型对话框普遍设置
:close-on-click-modal="false"(避免误关);全局搜索/锁屏等未禁用遮罩关闭且部分隐藏关闭按钮。
- 业务型对话框普遍设置
- 统一策略
- 业务表单:保留
close-on-click-modal=false,确保“关闭按钮/取消按钮/ESC”都能关闭;统一通过@update:model-value与@closed重置。 - 全局弹窗:明确设置
:close-on-click-modal="false"并显示关闭按钮或提供显式关闭入口(避免遮罩点击不生效引起困惑)。
- 业务表单:保留
- 修复点
- 核查所有
ElDialog/ElDrawer:确保存在@update:model-value或v-model双向绑定;为关闭图标绑定emit('update:visible', false);在有before-close时正确调用done()。 - 统一 ESC 关闭(可选):在布局层面监听 ESC 并广播关闭事件。
- 核查所有
验收标准
- 商品批量:
- 在商品列表勾选 N 个,批量改库存/上下架成功,返回计数与失败明细;刷新后状态一致。
- 奖品选择:
- 选择奖品即显示单价,总价随数量/选择实时更新;切换商品价格后总价同步。
- 仪表盘:
- “活动抽奖量”与“活动中奖率分析”在所有断点无重叠,布局稳定;数据加载时不挤压。
- 性能与超时:
- 步骤1加载显示进度,超时 30s 有提示与重试;>2s 请求有日志可见。
- 弹窗关闭:
- 所有弹窗可通过关闭按钮/取消按钮/ESC 关闭;遮罩行为与设计一致,不出现“点击关闭没有反应”。
交付变更清单
- 后端:新增批量接口(Controller+Service+DAO+Swagger)。
- 前端:
- 商品列表批量选择与工具栏;新增批量 API 调用与确认反馈。
- 向导步骤3与奖励管理页显示单价与总价;缓存价格。
- 仪表盘栅格与 z-index 调整;图表渲染时序保护。
- Axios 超时与慢请求日志;向导加载骨架与错误恢复。
- 弹窗双向绑定与关闭逻辑统一。
如确认本方案,我将按上述清单依次实现并提交改动,过程中为关键函数添加函数级注释与必要单元/交互测试。