--- name: session-20260615-2 description: 2026-06-15 第2次会话 — sys_user唯一索引删除,修复逻辑删除与uk_username冲突 metadata: type: session date: 2026-06-15 sessionNumber: 2 startTime: 2026-06-15 --- # 2026-06-15 第2次会话 ## 会话摘要 修复了 `sys_user` 表逻辑删除(`is_deleted`)与唯一索引 `uk_username`/`uk_email` 冲突的问题。删除了数据库唯一索引,改为应用层代码校验。 ## 问题描述 - **现象**:创建用户时报 `Duplicate entry 'nginxadmin' for key 'sys_user.uk_username'` - **根因**:MyBatis-Plus `@TableLogic` 自动在查询时过滤 `is_deleted=1`,但数据库唯一索引不区分逻辑删除标记。已删用户仍占着 username → 新用户无法创建同名 → 插入时索引冲突 ## 关键操作 ### 删除唯一索引,改应用层校验 - **做了什么**:从 `sys_user` 表删除 `uk_username` 和 `uk_email` 两个唯一索引,用户名/邮箱唯一性交给 `UserServiceImpl.add()` 中的 `selectCount` 校验 - **原因**:唯一索引不区分 `is_deleted`,逻辑删除的记录仍阻塞同名用户创建 - **结果**:已删除的用户不再占坑,可创建同名新用户;活跃用户的唯一性由应用层保证 ## 涉及文件 | 文件 | 改动 | |------|------| | `sql/qa_ddl.sql` | 删除 uk_username、uk_email 索引定义 | | `init_database.py` | 同上 | | `init_qa_database.py` | 同上 | | QA 数据库 `mokeegatewayqa` | DROP INDEX uk_username, uk_email | | PROD 数据库 `mokeegateway` | DROP INDEX uk_username, uk_email | ## 代码层无需改动 `UserServiceImpl.add()` 已有校验:`selectCount` + MyBatis-Plus `@TableLogic` 自动过滤已删除记录,重复用户名会提示"用户名已存在"。 ## 待处理 - [ ] 验证:创建一个用户 → 删除 → 再创建同名用户,确认不再报错 ### 2. 首页仪表盘数据权限 - **做了什么**:DashboardController.stats() 增加数据权限过滤。非 super_admin 用户首页统计卡片和登录趋势图只看自己绑定系统的数据(排除网关平台) - **原因**:之前首页显示全部系统/全部用户的全局统计数据,业务管理员不应看到平台全局数据 - **结果**: - 系统总数 → 用户绑定系统数(拦截器已排除网关) - 用户总数 → JOIN sys_user_system 统计绑定系统下的用户 - 今日登录/在线/30天趋势 → system_id IN (用户绑定系统) 过滤 - super_admin 行为不变 - 复用 UserContextInterceptor 已有的 systemIds(已排除网关),不重复查库 - **涉及文件**: `DashboardController.java` ## 待处理 - [ ] 验证:创建一个用户 → 删除 → 再创建同名用户,确认不再报错 - [ ] 部署后验证首页数据权限:用非 super_admin 账号登录,确认统计数据只显示绑定系统范围内