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

89 lines
5.9 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.

# 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)` 时把当前行记录赋给 `currentAuditUser``openBatchAudit` 时清空(批量审核不展示单条信息)。
- 审核弹窗顶部增加信息区(仅单条审核时展示):
- **店名**`currentAuditUser.storeName || '-'`
- **姓名**`currentAuditUser.realName || currentAuditUser.nickname || '-'`(真实姓名优先,无则取昵称)
- **所在地区**`province + city + region` 拼接,空则显示 `-`
### 验证
- `vue-tsc --noEmit` 类型检查:本次改动文件无新增错误(列出的报错均为项目既有错误:`$router``getPageTitle``loginUser`/`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、`resetSearch``roles` 变量、`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.vue`datasource 固定 `auditStatus: 1`;清理未绑定的死代码 `searchWhere.auditStatus`(定义 + resetSearch
- `src/views/system/user/pending/index.vue`datasource 由 `auditStatus: 0` 改为 `auditPending: true`;审核按钮 `v-if` 由仅 `auditStatus===0` 扩展为 `===0 || ===2`(被驳回用户也可重新审核)。
### 验证
- 前端 `vue-tsc --noEmit`user/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