--- name: session-20260611-1 description: 2026-06-11 会话 — 头像上传修复、用户信息显示修复、文件存DB、系统Bug全面检查 metadata: type: session date: 2026-06-11 sessionNumber: 1 startTime: 2026-06-11T01:00:00+08:00 --- # 2026-06-11 会话 ## 会话摘要 修复了上次会话遗留的2个已知问题(头像上传、用户信息不显示),将文件存储从磁盘改为数据库,并对整个系统进行了全面Bug检查,修复了8个高/中优先级问题。 ## 关键操作 ### 一、sys_file 表重构(文件存数据库) - **做了什么**: - 重新设计 sys_file 表,添加 `file_data LONGBLOB` 字段存储二进制 - 统一 Entity 和 DDL:新增 `system_id`, `mime_type`, `upload_user_id`, `md5` 字段 - 删除旧磁盘存储字段 `file_path`(→file_data), `upload_by`(→upload_user_id) - **原因**: 用户要求图片文件存入数据库而非磁盘 - **结果**: QA 数据库已更新,PROD 迁移脚本已准备(`sql/prod_migrate_sys_file.sql`) ### 二、FileServiceImpl 重写 - **做了什么**: upload()改为读取文件字节存入DB;page()/list()排除file_data字段;新增getMetaById();新增文件输出流 - **原因**: 配合数据库存储方案 - **结果**: 编译通过 ### 三、FileController 更新 - **做了什么**: upload返回时清除fileData;新增 `GET /{id}/view` 端点直接输出文件流(支持浏览器 `` 标签加载) - **原因**: 文件存DB后需要HTTP接口访问 ### 四、PersonalView 头像上传修复 - **做了什么**: - 修正 `res.data?.url` → 通过 `res.data?.id` 构建访问URL - 上传时添加 `fd.append('fileType', 'avatar')` - 头像地址格式: `{VITE_GATEWAY_URL}/zgapi/v1/admin/file/{id}/view` - 更新后调用 `authStore.fetchUserInfo()` 刷新store - **原因**: Entity字段名不匹配+文件访问方式变更 ### 五、AdminLayout 用户信息修复 - **做了什么**: onMounted中调用 `authStore.fetchUserInfo()` - **原因**: 跨域名跳转(login.user.mokee.com→web.gw.mokee.com)后Pinia状态丢失,需要重新加载 - **结果**: 顶栏头像和用户名正确显示 ### 六、Redis TokenInfo 同步机制 - **做了什么**: - 登录时建立反向索引 `auth:user_session:{userId}` → tokenId - 登出时清除反向索引 - UserServiceImpl.update()后同步更新Redis中的TokenInfo(username/realName/email/phone/avatar/post) - UserServiceImpl.assignRoles()后清除用户Redis会话强制重新登录 - RoleServiceImpl.assignMenus()后清除所有受影响用户的Redis会话 - **原因**: 用户信息/角色/权限变更后前端fetchUserInfo读到过期数据 ### 七、SysSystem 实体补充 - **做了什么**: 添加 `gatewayUrl` 字段映射 `gateway_url` 列 - **原因**: DDL中有此列但Entity缺少映射,INSERT可能失败 ### 八、前端错误处理修复 - **做了什么**: LoginView和UserForm的catch块添加具体错误提示 - **原因**: 登录失败/保存失败时用户看不到任何反馈 ### 九、系统全面检查发现(已记录,部分待处理) - A-2: SysMenu.menuType注释错误(0-based vs 1-based) — LOW - D-3~D-6: 多处catch块无用户反馈 — MEDIUM(拦截器已提供基线处理) - E-1: Cookie domain硬编码.mokee.com导致localhost开发不可用 — HIGH(已知限制) - E-2: auth.ts和request.ts重复实现Token Cookie操作 — MEDIUM - F-3: bindSystems/unbindSystems不同步Redis — MEDIUM - F-5: RoleServiceImpl.update不同步Redis — LOW ## 修改文件清单 **后端 (7个文件)**: - `mokee-gateway-common/.../entity/SysFile.java` — 重构字段 - `mokee-gateway-common/.../entity/SysSystem.java` — 添加gatewayUrl - `mokee-gateway-admin/.../service/FileService.java` — 新增getMetaById - `mokee-gateway-admin/.../service/impl/FileServiceImpl.java` — 完全重写(DB存储) - `mokee-gateway-admin/.../controller/FileController.java` — 新增view端点 - `mokee-gateway-admin/.../service/impl/UserServiceImpl.java` — Redis同步+会话失效 - `mokee-gateway-admin/.../service/impl/RoleServiceImpl.java` — 角色变更会话失效 - `mokee-gateway-auth/.../service/impl/AuthServiceImpl.java` — 反向索引 **前端 (3个文件)**: - `mokee-gateway-web/src/views/admin/PersonalView.vue` — 头像上传修复 - `mokee-gateway-web/src/views/admin/AdminLayout.vue` — fetchUserInfo onMount - `mokee-gateway-web/src/views/login/LoginView.vue` — 错误提示 - `mokee-gateway-web/src/views/admin/user/UserForm.vue` — 错误提示 **SQL (4个文件)**: - `sql/qa_ddl.sql` — sys_file新结构 - `sql/prod_align_qa.sql` — sys_file新结构 - `sql/prod_migrate_sys_file.sql` — PROD迁移(新建) - `init_qa_database.py` — sys_file新结构 ## 待处理 - [x] **PROD 数据库 sys_file 表迁移** — 已完成,QA和PROD结构一致 - [ ] 部署前端到PROD(Nginx 10.10.1.160) - [ ] 部署后端到PROD(10.10.1.170) - [ ] 验证头像上传端到端流程 - [ ] E-1 Cookie域localhost问题(开发环境限制,暂不处理) - [ ] F-3 bindSystems/unbindSystems Redis同步(低优先级)