134 lines
6.1 KiB
Markdown
134 lines
6.1 KiB
Markdown
---
|
||
name: session-20260612-1
|
||
description: 2026-06-12 会话 — 域名迁移mokee.com→zgitm.com、对外开放API、邮件服务、Token一次消费、文件管理、移动端适配
|
||
metadata:
|
||
type: session
|
||
date: 2026-06-12
|
||
sessionNumber: 1
|
||
startTime: 2026-06-12T00:00:00+08:00
|
||
---
|
||
|
||
# 2026-06-12 会话
|
||
|
||
## 会话摘要
|
||
域名从 mokee.com 迁移到 zgitm.com,新增对外开放API(Token获取+邮件发送+一次消费),新增邮件服务(阿里企业邮箱),新增Token日志和文件管理页面,全员移动端适配,修复多个关键Bug。
|
||
|
||
## 关键操作
|
||
|
||
### 一、域名迁移 mokee.com → zgitm.com
|
||
- `.env.production` 所有 URL 改为 `zgitm.com`
|
||
- `auth.ts` Cookie domain `.zgitm.com`(环境变量 `VITE_COOKIE_DOMAIN`)
|
||
- `request.ts` Cookie domain 环境变量化
|
||
- `IntegrationDoc.vue` 备用 URL 更新
|
||
- **Bug**: Cookie domain 拼写错误 `.zgtim.com` → 修正为 `.zgitm.com`
|
||
- **Bug**: 登录不跳转 → Cookie domain 不匹配导致跨子域丢失
|
||
- Nginx 需要配置 `zgitm.com` 域名
|
||
|
||
### 二、对外开放 API
|
||
- **获取Token**: `POST /zgapi/v1/open/token` 只需传 `systemCode`
|
||
- **发送邮件**: `POST /zgapi/v1/open/email/send` 带 Bearer Token
|
||
- **一次消费**: 每个 Token 只能用一次,Redis `open:token:{id}:consumed` 标记
|
||
- **30分钟有效期**
|
||
- 网关路由 `/zgapi/v1/open/` → admin
|
||
- TokenAuthFilter 放行 `/zgapi/v1/open/token`,其他 open 路径验证 open token
|
||
|
||
### 三、邮件服务
|
||
- SMTP: `smtp.qiye.aliyun.com:465` SSL, `admin@zgitm.com` / `mokee2016.`
|
||
- `EmailService.java` — 支持纯文本/HTML/附件,自动加 `[QA]`/`[PROD]` 前缀
|
||
- `EmailService.setFrom()` 设发件人(阿里企业邮箱要求发件人=认证账号)
|
||
- `EmailController.java` — 后台发送+记录+分页查询+Token日志
|
||
- `sys_email_log` 表 — 发送记录
|
||
- `@ConditionalOnBean` 问题 → 改为 `@Autowired(required = false)` + null检查
|
||
- **Bug**: 网关模块无 mail 配置导致 `@Value("${spring.mail.username}")` 启动失败 → 加默认值 `:}`
|
||
|
||
### 四、编码兼容
|
||
- **Bug**: 外部系统发 GBK 编码 JSON → Jackson 按 UTF-8 解析失败 `Invalid UTF-8 start byte 0xb2`
|
||
- 网关方案被拒绝 → 在 `OpenApiController` 手动读字节流,检测 GBK→UTF-8 转换
|
||
- API 文档要求 `Content-Type: application/json; charset=UTF-8`
|
||
|
||
### 五、文件管理
|
||
- 文件二进制存入数据库 `file_data LONGBLOB`
|
||
- `sys_file` 表结构调整(QA+PROD)
|
||
- `FileController.{id}/view` 端点输出图片流
|
||
- `FileList.vue` — 文件列表+上传+预览
|
||
- **Bug**: 图片显示 `ERR_BLOCKED_BY_ORB` → view 端点加 CORS 头
|
||
- **Bug**: 上传报 `MissingServletRequestPartException` → 网关 `spring.servlet.multipart.enabled=false`
|
||
- **Bug**: 图片 `<img>` 不带 Authorization 头 → TokenAuthFilter 支持 Cookie 读取 token
|
||
|
||
### 六、系统Bug全面检查
|
||
- A-1: `SysSystem` 缺 `gatewayUrl` 字段 → 已添加
|
||
- D-1/D-2: LoginView/UserForm 错误静默吞没 → 加错误提示
|
||
- E-1: Cookie domain 硬编码 → 改为环境变量 `VITE_COOKIE_DOMAIN`
|
||
- F-1/F-2: assignRoles/assignMenus 不同步 Redis → 清除会话强制重登
|
||
- F-4: username 不同步 Redis → 已加同步
|
||
|
||
### 七、移动端适配(全部22个Vue页面)
|
||
- AdminLayout: 汉堡菜单 + 侧边栏滑出 + 遮罩
|
||
- 全局: 表格横向滚动、弹窗95vw、按钮缩小
|
||
- 所有列表页: 工具栏垂直排列、select/input 100%宽
|
||
- 所有表单页: max-width→100%、label缩到70px、按钮全宽
|
||
- 操作列: 去掉 `fixed="right"`,手机端只显示图标
|
||
|
||
### 八、Token日志
|
||
- `sys_open_token_log` 表(QA+PROD)
|
||
- `OpenTokenLogList.vue` — Token日志页面
|
||
- 菜单 "Token日志" 在日志审计下
|
||
- **Bug**: Token日志跳转登录 → 接口路径从 `/zgapi/v1/open/` 移到 `/zgapi/v1/admin/email/token-log/page`
|
||
|
||
### 九、API文档
|
||
- `docs/open-api-doc.md` — 独立API文档,使用生产地址 `gw.server.zgitm.com`
|
||
- Java(Hutool)调用示例
|
||
- UTF-8 编码要求醒目提示
|
||
|
||
### 十、数据库变更(QA+PROD均已执行)
|
||
- `sys_file` 表重建(file_data LONGBLOB + 新结构)
|
||
- `sys_file` 添加 `file_url` 兼容列
|
||
- `sys_open_token_log` 表创建
|
||
- `sys_email_log` 表创建
|
||
- 文件管理菜单+权限 `system:file:*`
|
||
- 邮件管理菜单+权限 `system:email:*`
|
||
- Token日志菜单+权限 `system:token:list`
|
||
|
||
## 修改文件清单
|
||
**后端**:
|
||
- `SysSystem.java` — 添加 gatewayUrl
|
||
- `SysFile.java` — 重构(file_data)
|
||
- `SysEmailLog.java` — 新建
|
||
- `SysOpenTokenLog.java` — 新建
|
||
- `EmailService.java` — 新建(setFrom修复)
|
||
- `JwtUtil.java` — generateOpenToken()
|
||
- `FileService.java` / `FileServiceImpl.java` — DB存储重写
|
||
- `FileController.java` — view端点+CORS
|
||
- `EmailController.java` — 发送+记录+Token日志
|
||
- `OpenApiController.java` — Token获取+邮件发送+编码兼容+自主解析tokenId
|
||
- `UserServiceImpl.java` — Redis同步+会话失效
|
||
- `RoleServiceImpl.java` — 角色变更会话失效
|
||
- `AuthServiceImpl.java` — 反向索引
|
||
- `TokenAuthFilter.java` — Cookie token + Open API认证
|
||
- `GatewayController.java` — open路由+multipart修复
|
||
- 8个 application-*.yml — 日志级别+邮件配置+multipart禁用
|
||
|
||
**前端**:
|
||
- `.env.production` / `.env.development` — VITE_COOKIE_DOMAIN
|
||
- `auth.ts` — Cookie domain环境变量化
|
||
- `request.ts` — Cookie domain环境变量化
|
||
- `LoginView.vue` — 错误提示+移动端
|
||
- `AdminLayout.vue` — fetchUserInfo+汉堡菜单+移动端+文件/邮件/Token菜单
|
||
- `PersonalView.vue` — 头像上传修复+移动端
|
||
- `FileList.vue` — 新建(上传+预览+移动端)
|
||
- `EmailList.vue` — 新建(发送+记录+移动端)
|
||
- `OpenTokenLogList.vue` — 新建(移动端)
|
||
- `IconPicker.vue` — 已上传图标标签页
|
||
- 15个页面 — 移动端@media适配
|
||
- 7个表格 — 去掉fixed="right"
|
||
- `router/index.ts` — 路由+标题favicon
|
||
- `global.css` — 全局移动端CSS
|
||
|
||
**文档**:
|
||
- `docs/open-api-doc.md` — 对外开放API文档
|
||
|
||
## 已知问题
|
||
- E-1: Cookie domain localhost开发不可用(开发环境VITE_COOKIE_DOMAIN为空)
|
||
- PROD Nginx 需要配 `zgitm.com` 域名
|
||
- Docker部署需要重新构建镜像
|