Files
guilixu-admin/.workbuddy/memory/2026-07-12.md
赵忠林 59678f7ddd fix(shopGoods): 修复编辑弹窗视频裂图问题
- 新增 isVideo() 函数判断视频文件类型
- 编辑弹窗预览区域分支渲染,视频显示 <video> 组件
- 视频预览添加 PlayCircleOutlined 播放图标覆盖层
- 保持图片预览使用原有 <a-image> 组件
- 引入并使用 PlayCircleOutlined 图标组件
2026-07-12 22:34:58 +08:00

5.9 KiB
Raw Permalink Blame History

2026-07-12 工作日志

用户审核弹窗与列表增加店名/姓名/地区信息

针对用户管理 system/user 的审核功能做信息补全:

1. 新增字段

  • src/api/system/user/model/index.ts:在 User 接口增加 storeName?: string(店名)。

2. 用户列表增加「店名」列

  • src/views/system/user/index.vue
    • 列配置在「昵称」后新增 storeName 列(title: '店名'align: 'center'ellipsis: true)。
    • bodyCell 渲染分支:空值显示 -,保留 title 提示完整店名。

3. 审核弹窗展示用户关键信息

  • 新增响应式变量 currentAuditUser
  • openAudit(row) 时把当前行记录赋给 currentAuditUseropenBatchAudit 时清空(批量审核不展示单条信息)。
  • 审核弹窗顶部增加信息区(仅单条审核时展示):
    • 店名currentAuditUser.storeName || '-'
    • 姓名currentAuditUser.realName || currentAuditUser.nickname || '-'(真实姓名优先,无则取昵称)
    • 所在地区province + city + region 拼接,空则显示 -

验证

  • vue-tsc --noEmit 类型检查:本次改动文件无新增错误(列出的报错均为项目既有错误:$routergetPageTitleloginUser/updateIsAdmin 未使用、导出数组隐式 any 等,与本次无关)。
  • 落地核对:模型 storeName 1 处、页面列配置 1 处、bodyCell 渲染 1 处、currentAuditUser 变量 7 处、弹窗信息区字段各 1 处。

待审核用户专用页 /system/user/pending 精简

src/views/system/user/pending/index.vue 已存在(基于 user 列表的副本)。按用户要求改造:

1. 只显示待审核用户

  • datasource 改为固定 auditStatus: 0,不再读取筛选条件。

2. 删除高级筛选区(角色/注册来源/类型/审核状态 4个下拉 + 搜索/重置按钮)

  • 模板删除整个 <a-form> 高级筛选区。
  • 脚本删除 searchWhere reactive、resetSearchroles 变量、filters() 调用。
  • 删除已无用的 listRoles import。
  • 顶部关键词搜索框(a-input-search)保留。

注意点(待用户确认)

  • 列表的「角色」列、「注册来源」列、「审核状态」列均保留(用户要求删除的是筛选"功能",非列表展示列)。其中「审核状态」列在待审核页全会显示"待审核",若用户也想删列表列需再告知。
  • 工具栏「新建/修改/重置密码/批量审核/批量删除/导入/导出」按钮保留未动。

验证

  • vue-tsc --noEmit:本页面无新增类型错误(残留报错均为项目既有问题)。
  • 落地核对:高级筛选残留 0、searchWhere/resetSearch/roles/filters/listRoles 残留 0、datasource 固定 auditStatus:0 = 1。

用户列表「头像/手机号/真实姓名」合并为「用户信息」列

src/views/system/user/index.vue

  1. 列定义:删除原来的 avatar(头像)、mobile(手机号码)、realName(真实姓名)三列,新增一列 userInfo(用户信息),宽度 220px。
  2. 渲染模板:新 bodyCell 分支 key='userInfo',使用 flex 布局:
    • 左侧36px 头像a-avatar
    • 右侧上下排列:真实姓名(加粗)+ 手机号码(灰色小字)
    • 保留 superAdmin 权限判断逻辑phone vs mobile
  3. 样式:更新 .user-box 样式,增加 gap、user-name 加粗、user-mobile 灰色小字。

按审核状态拆分 user / pending 列表(前后端)

需求:/system/user/pending 只显示待审核(0)与被驳回(2)/system/user 只显示已通过(1)。后端在 /Users/gxwebsoft/JAVA/com.gxwebsoft.core

后端改动

  • src/main/java/com/gxwebsoft/common/system/param/UserParam.java
    • auditStatus 字段补 @QueryField(type = QueryType.EQ) 注解(原缺失,不参与查询)。
    • 新增 private Boolean auditPending(带 @TableField(exist=false))语义字段:是否查询"待处理审核"待审核0/被驳回2
  • src/main/java/com/gxwebsoft/common/system/mapper/xml/UserMapper.xml:主查询 <where>status 条件后追加:
    • <if test="param.auditStatus != null"> AND a.audit_status = #{param.auditStatus} </if>单值user 页用)
    • <if test="param.auditPending != null and param.auditPending"> AND a.audit_status IN (0, 2) </if>多值pending 页用)
  • 未采用数组参数方案(auditStatusList: [0,2]):因 UserController.page 是 GET 且 Spring 绑定 UserParam 对象axios 默认把数组序列化为 key[]=v 形式Spring MVC 默认不识别,存在序列化风险。改用语义布尔字段彻底规避。

前端改动

  • src/views/system/user/index.vuedatasource 固定 auditStatus: 1;清理未绑定的死代码 searchWhere.auditStatus(定义 + resetSearch
  • src/views/system/user/pending/index.vuedatasource 由 auditStatus: 0 改为 auditPending: true;审核按钮 v-if 由仅 auditStatus===0 扩展为 ===0 || ===2(被驳回用户也可重新审核)。

验证

  • 前端 vue-tsc --noEmituser/pending 两页无新增实质类型错误(残留均为项目既有噪音:$router、getPageTitle、TS6133 未使用、TS7053 导出数组索引)。
  • 后端落地核对UserParam auditPending 字段=1、XML 两条件各=1片段上下文正确。SELECT 用 a.* 会返回 audit_status(驼峰映射 auditStatus列表标签正常。

修复 shopGoods 编辑弹窗视频裂图问题

src/views/shop/shopGoods/components/shopGoodsEdit.vue 商品图片(400x400) 预览区域:

  • 问题form.image 存视频 URL 时 <a-image> 组件无法渲染,显示裂图
  • 修复:新增 isVideo() 函数(通过扩展名 .mp4/.webm/.mov 等判断),模板分两个分支:
    • 视频 → <video preload="metadata"> + PlayCircleOutlined 播放图标覆盖层100×100 深色背景圆角)
    • 图片 → 原有 <a-image> 不变
  • 新增 PlayCircleOutlined 图标 import