5.4 KiB
name, description, metadata
| name | description | metadata | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| session-20260613-3 | 2026-06-13 第3次会话 — 头像401、菜单check-strictly、移动端全面优化、token/info接口、唯一键校验、数据权限、文档更新 |
|
2026-06-13 第3次会话 — 完整记录
一、头像 401 修复
根因:文件服务 Token 一次一密,PersonalView.vue 上传和下载共用一个 Token,带 Token 的 URL 存入数据库 → 永久 401。
修复:
auth.ts:fetchUserInfo() 和 login() 先刷新 Token 再设 userInfoPersonalView.vue:上传用 Token1(消费),下载用 Token2(新获取),DB 只存基础 URL
二、分配菜单 check-strictly
RoleList.vue:el-tree 加 check-strictly,节点独立勾选,父子不联动。
- 可以只勾"系统列表"不给新增/编辑/删除
三、移动端全面优化
3.1 操作列 → 桌面按钮行 / 手机卡片按钮
不再使用 CSS dropdown hack,改用 useIsMobile() composable + v-if
composable: src/composables/useIsMobile.ts — 响应式检测屏幕 ≤768px
已改造:RoleList, UserList, SystemList, MenuList, DictList, ApiList, FileList, EmailList, LoginLogList, OperationLogList, OpenTokenLogList
3.2 表单按钮全局统一
global.css:移动端 .form-footer { flex-direction: column } 取消/保存按钮等宽上下排列
3.3 分页滚动
main.ts:监听分页点击 → window.scrollTo({ top: 0, behavior: 'smooth' })
3.4 卡片样式
global.css:.mobile-cards / .mobile-card / .card-field / .card-actions
四、新增 GET /token/info 接口
OpenApiController.java:GET /zgapi/v1/open/token/info?token=xxx- 不消费 Token,从 JWT 解析 systemId/systemCode/systemName
TokenAuthFilter.java:放行/zgapi/v1/open/token/infoopen-api-doc.md:新增 §4
五、所有新增接口唯一键校验
| 接口 | 唯一约束 | 修复 |
|---|---|---|
| 新增系统 | uk_system_code + uk_gateway_url | ✅ gatewayUrl 自动生成唯一值 |
| 新增用户 | uk_username + uk_email | ✅ 空邮箱→null,重复提示中文 |
| 新增角色 | uk_system_role_code | ✅ 系统+编码重复提示 |
| 新增字典 | uk_type_value | ✅ 类型+值重复提示 |
| 新增接口 | uk_system_path_method | ✅ 系统+路径+方法重复提示 |
六、全局数据权限
架构:UserContextInterceptor → UserContextHolder(ThreadLocal) → Service 层过滤
规则:roleCode=super_admin 看全部;其他角色只看绑定系统(sys_user_system)的数据
新增文件:
config/UserContextHolder.java— ThreadLocalconfig/UserContextInterceptor.java— 拦截器,读 X-User-Roles 头config/WebMvcConfig.java— 注册拦截器
修改的 Service:
- RoleServiceImpl.page() — in(systemIds)
- SystemApiServiceImpl.page() — in(systemIds)
- LogServiceImpl.loginLogPage() — in(systemIds)
- UserServiceImpl.page() — 通过 sys_user_system 关联过滤
- SystemServiceImpl.page() — in(systemIds)
- SystemServiceImpl.add() — gatewayUrl 唯一值
不做过滤:
- 操作日志、Token日志(用户指定不要)
- 字典、邮件(无 system_id)
七、FileList 系统筛选
- 搜索栏新增"所属系统"下拉(systemCode / systemName)
- 表格新增"所属系统"列
- systemId 传给后端过滤
八、接入文档更新
IntegrationDoc.vue(页面内文档)
- §9.3 下载文件:Token 支持 Header 和 Query 参数两种方式
- §10 新增对外开放 API 章节(Token 获取 + 邮件发送)
- §3 前端接入:localStorage → Cookie 读取 Token,说明跨域 Cookie 机制
- §3.5 登录回调:完整说明 Cookie Token 流程
open-api-doc.md(独立文档)
- 下载文件 curl 示例增加 Query 参数方式
- 所有文档章节重新编号
修改文件总清单
后端新增:
config/UserContextHolder.javaconfig/UserContextInterceptor.javaconfig/WebMvcConfig.java
后端修改:
OpenApiController.java— +GET /token/infoTokenAuthFilter.java— 放行 /token/infoUserServiceImpl.java— 重复校验 + 数据权限 + 空邮箱→nullSystemServiceImpl.java— systemCode/gatewayUrl 唯一性 + 数据权限RoleServiceImpl.java— 角色编码唯一性 + 数据权限DictServiceImpl.java— 字典值唯一性SystemApiServiceImpl.java— 接口唯一性 + 数据权限LogServiceImpl.java— 登录日志数据权限(操作日志不过滤)FileController.java— systemId 过滤已支持
前端新增:
composables/useIsMobile.ts
前端修改:
auth.ts— 头像 Token 刷新PersonalView.vue— 头像双 Tokenglobal.css— 移动端卡片 + 表单按钮main.ts— 分页滚动RoleList.vue— check-strictly + 手机卡片UserList.vue— 手机卡片SystemList.vue— 手机卡片MenuList.vue— 手机卡片DictList.vue— 手机卡片ApiList.vue— 手机卡片FileList.vue— 系统下拉过滤EmailList.vue— 手机卡片 + confirmDelLoginLogList.vue— 手机卡片OperationLogList.vue— 手机卡片OpenTokenLogList.vue— 手机卡片
文档修改:
docs/open-api-doc.md— +token/info,下载 Query 参数IntegrationDoc.vue— Cookie Token + 邮件发送 + 下载方式