初始化1

This commit is contained in:
zg
2026-07-16 13:03:11 +08:00
parent 0bdfcbc1c8
commit e6b0f287cc
100 changed files with 12184 additions and 0 deletions

View File

@@ -0,0 +1,96 @@
---
session_id: 20260613-1
date: 2026-06-13
summary: Mokee Gateway统一登录接入 - 全栈改造 + 多个Bug修复
status: 进行中 - Widget未显示其他功能正常
---
# Mokee Gateway 统一登录接入改造
系统编码: `nginxServer`,网关: `https://gw.server.zgitm.com`,登录: `https://login.user.zgitm.com`
## 最终改动的文件(汇总)
### 前端 (9 files)
| 文件 | 操作 | 说明 |
|------|------|------|
| `.env.development` | 改 | VITE_GATEWAY_URL / VITE_LOGIN_URL / VITE_SYSTEM_CODE |
| `.env.production` | 改 | 同上 |
| `index.html` | 改 | 引入 Widget CSSJS 改在 main.js 动态加载) |
| `src/main.js` | 重写 | bootstrap() 鉴权→拉菜单→挂载→加载 Widget |
| `src/utils/request.js` | 新增 | 网关 axios 实例,带 Token/X-System-Code兼容双 code 格式,错误消息提取 |
| `src/api/nginxApi.js` | 改 | 换新 request路径加 /api 前缀 |
| `src/router/index.js` | 重写 | 路由守卫,扁平路由注册,导出 menuTree |
| `src/layout/MainLayout.vue` | 改 | 侧边栏从 menuTree 渲染支持目录层级ICON_MAP 字符串→组件映射Widget 占位 |
| `index.html` | 改 | Widget CSS已移除静态 JS改动态加载 |
### 后端 (5 files)
| 文件 | 操作 | 说明 |
|------|------|------|
| `config/CorsConfig.java` | 新增 | allowedOriginPatterns("https://*.zgitm.com","http://localhost:*") + allowCredentials |
| `context/UserContext.java` | 新增 | ThreadLocal 工具类(修复 JDK 17 兼容:不用 getOrDefault |
| `filter/UserContextFilter.java` | 新增 | Servlet Filter 提取网关注入的 X-User-Id 等请求头 |
| `entity/ForwardingRule.java` | 改 | status 字段加 @TableLogic(value="1", delval="0") |
| `entity/DnsZoneConfig.java` | 改 | status 字段加 @TableLogic(value="1", delval="0") |
| `config/RestTemplateConfig.java` | **未改** | 保持原样Spring Boot 直连 Python API |
### 控制器 (3 files)
| 文件 | 操作 | 说明 |
|------|------|------|
| `ForwardingRuleController.java` | 改 | 删除 @CrossOrigin(origins="*")CORS 统一由 CorsConfig 管 |
| `CertificateController.java` | 改 | 同上 |
| `DnsController.java` | 改 | 同上 |
### 配置 (1 file)
| 文件 | 操作 | 说明 |
|------|------|------|
| `application.yml` | 改 | **删除全局 logic-delete-field: status**这是证书重复键Bug的根因 |
### Python API (1 file)
| 文件 | 操作 | 说明 |
|------|------|------|
| `nginx-python-api/app.py` | 改 | 添加 before_request 中间件提取用户请求头到 Flask g**未部署到服务器** |
### SQL (1 file)
| 文件 | 操作 | 说明 |
|------|------|------|
| `sql/gateway_init.sql` | 新增 | UUID 变量方式菜单Nginx代理管理→三个业务页面角色admin/user管理员admin_nginxServer |
## 踩过的坑
### 1. `@CrossOrigin(origins="*")` + `CorsConfig.allowCredentials(true)` 冲突
- 三个 Controller 原来有 `@CrossOrigin(origins="*")`,与全局 CorsConfig 的 `allowCredentials(true)` 合并后产生非法组合
- **修复**:删除三个 Controller 的 `@CrossOrigin`CORS 统一由 CorsConfig 管理
### 2. 网关菜单返回字段和前端预期不一致
- 网关实际返回:`{path, name, component, meta:{title,icon}, children}``component="Layout"` 表示目录
- 前端最初判断 `menuType`/`menu_name` 等字段,全部对不上
- **修复**`addDynamicRoutes()` 改为判断 `component==='Layout'`,路由扁平注册到 `/`,侧边栏从 `menuTree` 渲染
### 3. Widget `process is not defined`
- Widget JS 内部引用了 `process.env`,浏览器环境无此全局变量
- **修复**`main.js` 中加载 Widget 前加 `window.process = { env: {} }`
### 4. 路由嵌套导致菜单不显示
- 最初 `addDynamicRoutes` 把页面路由嵌套在 `/nginx/nginx-forwarding`redirect `/nginx-forwarding` 找不到
- **修复**:页面路由全部扁平注册到 `/`,侧边栏层级单独从 menuTree 渲染
### 5. 证书列表查询触发 INSERT 重复键 — 全局 logic-delete-field 误伤
- **根因**`application.yml` 全局 `logic-delete-field: status`MyBatis-Plus 给所有实体加 `AND status = 1`
- `Certificate.status` 是 String "active"`WHERE status = 1` 永远不成立 → selectOne 返回 null → 走 INSERT → 重复键
- `ForwardingRule.status``DnsZoneConfig.status` 是 Integer 0/1不受影响
- **修复**:删除全局 logic-delete-field在 ForwardingRule 和 DnsZoneConfig 的 status 字段加 `@TableLogic(value="1", delval="0")`
### 6. 前端错误消息丢失
-`request.js` 错误拦截器直接透传 axios error前端拿到 "Request failed with status code 500"
- 旧代码从 `error.response.data.message` 提取后端实际消息
- **修复**:错误拦截器追加 `new Error(error.response?.data?.message || error.message || '网络错误')`
### 7. Widget 动态加载时机
- Widget 脚本在 `index.html` 同步加载时 Vue 未渲染,找不到 `#mokee-user-chip`
- 移到 `main.js``app.mount()` 之后动态加载
- **当前状态Widget 仍未显示,待排查**
## 待解决
- [ ] Widget 用户头像组件不显示(右上角)
- [ ] Python API `app.py` 中间件需部署到 10.1.1.160