- 新增 isVideo() 函数判断视频文件类型 - 编辑弹窗预览区域分支渲染,视频显示 <video> 组件 - 视频预览添加 PlayCircleOutlined 播放图标覆盖层 - 保持图片预览使用原有 <a-image> 组件 - 引入并使用 PlayCircleOutlined 图标组件
89 lines
5.9 KiB
Markdown
89 lines
5.9 KiB
Markdown
# 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
|