6.1 KiB
6.1 KiB
name, description, metadata
| name | description | metadata | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| session-20260613-4 | 2026-06-13 第4次会话 — Widget实施 + 大量Bug修复 + 接入文档完善 |
|
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 角色分配菜单
- 生产环境验证