初始化
This commit is contained in:
137
memory/session-20260613-4.md
Normal file
137
memory/session-20260613-4.md
Normal file
@@ -0,0 +1,137 @@
|
||||
---
|
||||
name: session-20260613-4
|
||||
description: 2026-06-13 第4次会话 — Widget实施 + 大量Bug修复 + 接入文档完善
|
||||
metadata:
|
||||
type: session
|
||||
date: 2026-06-13
|
||||
sessionNumber: 4
|
||||
startTime: 2026-06-13
|
||||
endTime: 2026-06-13
|
||||
---
|
||||
|
||||
# 2026-06-13 第4次会话 — 完整记录
|
||||
|
||||
## 会话摘要
|
||||
实施了用户头像下拉 Widget,修复了 10+ 个 Bug(菜单权限、数据过滤、API转发、错误提示、SQL修复等),完善了接入文档。
|
||||
|
||||
## 一、UserChip Widget 实施
|
||||
|
||||
### 新建文件(6个)
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| `src/widgets/user-chip/cookie.ts` | Cookie Token 读写 |
|
||||
| `src/widgets/user-chip/api.ts` | API 调用层(fetch/原生) |
|
||||
| `src/widgets/user-chip/UserChip.vue` | 核心组件(BEM 命名空间) |
|
||||
| `src/widgets/user-chip/main.ts` | 自动扫描 #mokee-user-chip 挂载 |
|
||||
| `vite.widget.config.ts` | 独立 IIFE 构建(→ dist-widget/) |
|
||||
| `public/demo-widget.html` | 接入演示 |
|
||||
|
||||
### 修改文件
|
||||
| 文件 | 改动 |
|
||||
|------|------|
|
||||
| `package.json` | +build:widget + build:prod 合并 |
|
||||
| `IntegrationDoc.vue` | §3.6 Widget 一键接入 + widgetConfigTable |
|
||||
|
||||
### 关键设计
|
||||
- loginUrl/selectUrl 从脚本自身 URL 推断(不用 window.location.origin)
|
||||
- 登录页: https://web.gw.zgitm.com/login
|
||||
- 切换系统: https://web.gw.zgitm.com/select
|
||||
- API 网关: https://gw.server.zgitm.com
|
||||
|
||||
## 二、重要 Bug 修复
|
||||
|
||||
### 2.1 AdminLayout 菜单动态化(硬编码→API 加载)
|
||||
- **原因**: 硬编码 HTML,所有用户看到全部菜单
|
||||
- **修复**: 改为 `fetchMenuRouter('gateway')` 动态加载,按角色过滤
|
||||
- **问题**: API 返回字段和前端预期不一致 → MenuRouterVO 缺少字段
|
||||
- **修复**: buildMenuTree 补填 id/menuName/menuType/icon/permission/sortOrder/status
|
||||
|
||||
### 2.2 ApiPermissionFilter 过于严格
|
||||
- **问题**: 业务系统选系统后调 /zgapi/v1/auth/menu/router 被 403
|
||||
- **修复**: `/zgapi/v1/auth/*` 和 `/zgapi/v1/admin/*` 全部放行,不查 sys_api 白名单
|
||||
|
||||
### 2.3 网关不转发非 /zgapi/ 路径
|
||||
- **问题**: 业务系统请求 /api/rules 带 X-System-Code,网关返回 200 空响应
|
||||
- **修复**: 非 /zgapi/ 路径有 X-System-Code 头 → 转发到业务后端
|
||||
|
||||
### 2.4 RestTemplate 吞业务后端错误
|
||||
- **问题**: RestTemplate 默认对 4xx/5xx 抛异常,网关 catch 后返回 502 吞掉真实错误
|
||||
- **修复**: 设置自定义 ResponseErrorHandler,hasError() 永远返回 false
|
||||
|
||||
### 2.5 assignRoles 角色覆盖
|
||||
- **问题**: tokenInfo.setRoles(当前系统角色) 覆盖掉其他系统角色 → super_admin 丢失 → 403
|
||||
- **修复**: 改为从 DB 重新查询用户全部角色再写入 Redis
|
||||
|
||||
### 2.6 选择系统页不应该隐藏 gateway
|
||||
- **初始修复(错误)**: AuthServiceImpl 过滤 gateway,导致用户无法进入管理后台
|
||||
- **正确的修复**: 还原 AuthServiceImpl,选择系统页显示 gateway 卡片(入口),数据层面由 UserContextInterceptor 过滤 gateway 数据
|
||||
|
||||
### 2.7 非 super_admin 看到 gateway 数据
|
||||
- **问题**: adminnginxserver 绑定 gateway+nginxServer,数据权限范围包含 gateway
|
||||
- **修复**: UserContextInterceptor 加 isGatewaySystem() 过滤,排除 gateway 系统 ID
|
||||
|
||||
### 2.8 MenuServiceImpl 无权限校验
|
||||
- **问题**: getMenuTree/add/update/delete 都不检查 UserContextHolder
|
||||
- **修复**: 新增 checkSystemScope(),所有方法校验 systemId 是否在绑定范围内
|
||||
|
||||
### 2.9 两个首页菜单
|
||||
- **问题**: 过滤逻辑只查顶级节点,子节点中的首页漏网
|
||||
- **修复**: 递归 removeDashboard() 函数,过滤所有层级
|
||||
|
||||
### 2.10 ElMessage 弹窗位置错误
|
||||
- **问题**: CSS 导入路径不对,el-message.css 未加载 → 消息显示在底部
|
||||
- **修复**: main.ts 显式 import 'element-plus/theme-chalk/el-message.css',global.css 去冲突 !important
|
||||
|
||||
### 2.11 登录错误双重弹窗
|
||||
- **修复**: LoginView.vue catch 块去掉重复的 ElMessage.error
|
||||
|
||||
### 2.12 SystemServiceImpl 排除 gateway
|
||||
- **修复**: 非 super_admin 时 wrapper.ne(SysSystem::getSystemCode, "gateway")
|
||||
|
||||
### 2.13 接入文档 SQL 修复
|
||||
- 所有 INSERT 加 id 列 + REPLACE(UUID(),'-','')
|
||||
- 用户创建 SQL 加步骤 4(绑定自己系统)+ 步骤 5(分配自己系统 admin 角色)
|
||||
- 菜单初始化 SQL 改用 MySQL 变量显式持有 UUID
|
||||
|
||||
### 2.14 RestTemplate 吞业务后端错误
|
||||
- **问题**: RestTemplate 默认对 4xx/5xx 抛异常,网关 catch 返回 502 吞掉真实错误
|
||||
- **修复**: RestTemplateConfig 设置自定义 ResponseErrorHandler,hasError() 永远返回 false
|
||||
|
||||
### 2.15 FileServiceImpl 无数据权限
|
||||
- **问题**: 文件对象储存页能看到 gateway 系统的文件
|
||||
- **修复**: FileServiceImpl.page() 加 UserContextHolder 检查
|
||||
|
||||
### 2.16 用户列表排除 super_admin 账号
|
||||
- **问题**: 非 super_admin 用户能看到 admin 等超管账号
|
||||
- **修复**: UserServiceImpl.page() 加 NOT IN (拥有 super_admin 角色的用户ID)
|
||||
|
||||
## 三、接入文档完善
|
||||
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| `IntegrationDoc.vue` §5 | 重写 API 章节:7 个接口 + 速查表 + 完整请求/响应 JSON |
|
||||
| `docs/integration-guide.md` | 新建独立的完整 Markdown 接入文档 |
|
||||
|
||||
## 四、所有修改文件清单
|
||||
|
||||
**后端修改**:
|
||||
- gateway-auth: AuthServiceImpl.java (systemList过滤 + buildMenuTree补字段)
|
||||
- gateway-admin: UserContextInterceptor.java (排除gateway), MenuServiceImpl.java (权限校验), SystemServiceImpl.java (排除gateway), UserServiceImpl.java (assignRoles修复 + resetPassword新增)
|
||||
- gateway-gateway: ApiPermissionFilter.java (放行auth/admin), GatewayController.java (转发非zgapi路径), RestTemplateConfig.java (不吞错误)
|
||||
|
||||
**前端修改**:
|
||||
- AdminLayout.vue (动态菜单 + 递归过滤首页)
|
||||
- LoginView.vue (去掉重复ElMessage)
|
||||
- UserForm.vue (super_admin重置密码)
|
||||
- IntegrationDoc.vue (§3.6 Widget + §5 API完善 + SQL修复)
|
||||
- main.ts (ElMessage CSS显式引入)
|
||||
- global.css (ElMessage样式修复)
|
||||
- package.json (build:widget脚本)
|
||||
|
||||
**新建文件**:
|
||||
- 6个Widget文件 + 1个文档
|
||||
|
||||
## 待处理
|
||||
- [ ] 部署到 web.gw.zgitm.com(Nginx /widgets/ location)
|
||||
- [ ] 给 gateway-app-admin/gateway-app-user 角色分配菜单
|
||||
- [ ] 生产环境验证
|
||||
Reference in New Issue
Block a user