--- 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 角色分配菜单 - [ ] 生产环境验证