初始化

This commit is contained in:
zg
2026-07-15 16:13:27 +08:00
parent 6d6f559793
commit c4023c1623
276 changed files with 42622 additions and 0 deletions

View File

@@ -0,0 +1,142 @@
---
name: session-20260613-3
description: 2026-06-13 第3次会话 — 头像401、菜单check-strictly、移动端全面优化、token/info接口、唯一键校验、数据权限、文档更新
metadata:
type: session
date: 2026-06-13
sessionNumber: 3
startTime: 2026-06-13T00:00:00+08:00
---
# 2026-06-13 第3次会话 — 完整记录
## 一、头像 401 修复
**根因**:文件服务 Token 一次一密PersonalView.vue 上传和下载共用一个 Token带 Token 的 URL 存入数据库 → 永久 401。
**修复**
- `auth.ts`fetchUserInfo() 和 login() 先刷新 Token 再设 userInfo
- `PersonalView.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/info`
- `open-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` — ThreadLocal
- `config/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.java`
- `config/UserContextInterceptor.java`
- `config/WebMvcConfig.java`
**后端修改**
- `OpenApiController.java` — +GET /token/info
- `TokenAuthFilter.java` — 放行 /token/info
- `UserServiceImpl.java` — 重复校验 + 数据权限 + 空邮箱→null
- `SystemServiceImpl.java` — systemCode/gatewayUrl 唯一性 + 数据权限
- `RoleServiceImpl.java` — 角色编码唯一性 + 数据权限
- `DictServiceImpl.java` — 字典值唯一性
- `SystemApiServiceImpl.java` — 接口唯一性 + 数据权限
- `LogServiceImpl.java` — 登录日志数据权限(操作日志不过滤)
- `FileController.java` — systemId 过滤已支持
**前端新增**
- `composables/useIsMobile.ts`
**前端修改**
- `auth.ts` — 头像 Token 刷新
- `PersonalView.vue` — 头像双 Token
- `global.css` — 移动端卡片 + 表单按钮
- `main.ts` — 分页滚动
- `RoleList.vue` — check-strictly + 手机卡片
- `UserList.vue` — 手机卡片
- `SystemList.vue` — 手机卡片
- `MenuList.vue` — 手机卡片
- `DictList.vue` — 手机卡片
- `ApiList.vue` — 手机卡片
- `FileList.vue` — 系统下拉过滤
- `EmailList.vue` — 手机卡片 + confirmDel
- `LoginLogList.vue` — 手机卡片
- `OperationLogList.vue` — 手机卡片
- `OpenTokenLogList.vue` — 手机卡片
**文档修改**
- `docs/open-api-doc.md` — +token/info下载 Query 参数
- `IntegrationDoc.vue` — Cookie Token + 邮件发送 + 下载方式