--- name: session-20260617-1 description: 2026-06-17 第1次会话 — 前端日期时间格式统一 + 全局权限控制修复 + DB权限条目补全 metadata: type: session date: 2026-06-17 sessionNumber: 1 startTime: 2026-06-17 --- # 2026-06-17 第1次会话 ## 会话摘要 1. 前端日期时间格式统一为 `yyyy-MM-dd HH:mm:ss` 2. 全局排查并修复了前端 v-permission 权限控制缺失问题(9个页面少了几十个权限指令) 3. 补充了数据库初始化脚本中缺失的权限条目(menu/delete, api/add/edit/delete, dict/add/edit/delete) 4. 重写了日期工具函数,用手动解析替代 `new Date()` 避免跨浏览器兼容问题 ## 关键操作 ### 一、创建/重写日期格式化工具 - **做了什么**: 创建 `src/utils/date.ts`,导出 `formatDateTime()` 和 `formatDate()` - **原因**: 统一格式 + 解决 `new Date("yyyy-MM-dd HH:mm:ss")` 在 Firefox/Safari 中返回 Invalid Date 的浏览器兼容问题 - **结果**: 使用手动正则解析替代 `new Date()` 解析字符串,兼容 ISO 8601、时间戳、后端标准格式 - **涉及文件**: `src/utils/date.ts`(新建) ### 二、替换所有日期格式化调用 - **做了什么**: 将7个Vue文件中所有 `toLocaleString('zh-CN')` 替换为 `formatDateTime()`,并为之前裸字符串显示日期的页面添加格式化 - **涉及文件**: PersonalView, FileList, UserList, OperationLogList, LoginLogList, EmailList, OpenTokenLogList ### 三、全局修复 v-permission 权限控制 - **问题根因**: 之前 90% 的操作按钮没有 `v-permission` 指令,导致即使用户没有勾选编辑/删除权限按钮,按钮仍然显示并可操作 - **做了什么**: 为所有列表页的操作按钮添加了完整的 `v-permission` 指令 **前端修改(9个文件):** | 文件 | 新增按钮 | 编辑按钮 | 删除按钮 | 其他 | |------|:--:|:--:|:--:|------| | SystemList.vue | ✅已有 | ✅新增 | ✅新增 | | | UserList.vue | ✅新增 | ✅新增 | ✅新增 | | | RoleList.vue | ✅新增 | ✅新增 | ✅新增 | 分配菜单 ✅新增 | | MenuList.vue | ✅新增 | ✅新增 | ✅新增 | 新增子级 ✅新增 | | DictList.vue | ✅新增 | ✅新增 | ✅新增 | 新增类型 ✅新增 | | ApiList.vue | ✅新增 | ✅新增 | ✅新增 | | | FileList.vue | N/A | N/A | ✅新增 | 上传 ✅新增 | | EmailList.vue | ✅已有 | N/A | ✅新增 | | | SystemConfig.vue | N/A | N/A | N/A | 保存 ✅新增 | ### 四、补充数据库权限条目 - **做了什么**: 在 DB 初始化脚本中新增以下权限按钮(之前 DB 中没有这些记录,即使前端加了 v-permission,super_admin 也会因权限列表不含该字符串而看不到按钮) - **新增权限**: `system:menu:delete`, `system:api:add/edit/delete`, `system:dict:add/edit/delete` - **涉及文件**: `sql/qa_data.sql`, `sql/init_qa.py`, `sql/prod_add_permissions.sql`, `sql/prod_fix_data.sql` ### 权限字符串对照表 | 模块 | 列表权限 | 新增 | 编辑 | 删除 | 其他 | |------|---------|------|------|------|------| | 系统管理 | system:system:list | system:system:add | system:system:edit | system:system:delete | | | 用户管理 | system:user:list | system:user:add | system:user:edit | system:user:delete | | | 角色管理 | system:role:list | system:role:add | system:role:edit | system:role:delete | system:role:assignMenu | | 菜单管理 | system:menu:list | system:menu:add | system:menu:edit | system:menu:delete | | | 接口管理 | system:api:list | system:api:add | system:api:edit | system:api:delete | | | 数据字典 | system:dict:list | system:dict:add | system:dict:edit | system:dict:delete | | | 文件管理 | system:file:list | system:file:upload | | system:file:delete | | | 邮件管理 | system:email:list | system:email:send | | system:email:delete | | | 系统配置 | | system:config:save | | | | ### 五、网关转发注入用户信息头 - **问题根因**: 非 `/zgapi/` 路径的请求(如 `/dashboard/stats`),TokenAuthFilter 直接放行不解析 token → HeaderInjectFilter 拿不到 tokenInfo → 转发到业务系统后端时请求头中没有 X-User-Id/Name 等用户信息 - **做了什么**: 1. `TokenAuthFilter.java`: 非 `/zgapi/` 路径也尝试解析 token(Cookie / Authorization 头),有则设置 tokenInfo,无/过期则放行不阻塞。`/zgapi/` 路径行为不变 2. `HeaderInjectFilter.java`: 系统信息头(X-System-Id/Code/Name)原始请求已有则保留原始值,避免用 tokenInfo.currentSystemCode 覆盖业务系统前端设的 `x-system-code` - **涉及文件**: `TokenAuthFilter.java`, `HeaderInjectFilter.java` ## 待处理 - [ ] 部署后验证:用非 super_admin 角色登录,确认未授权的按钮不显示 - [ ] 在生产数据库执行 `prod_add_permissions.sql`(INSERT IGNORE 安全幂等) - [ ] 验证日期时间显示格式在各个浏览器中一致 - [ ] 部署网关后验证:非 `/zgapi/` 业务系统请求能正确转发并携带用户信息头