Files
Jog/doc/jog-system-bug-list.md
T
2026-05-18 03:22:40 +08:00

247 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Jog System 自动化测试 Bug 清单
| 项目 | 内容 |
| :--- | :--- |
| 生成日期 | 2026-05-18 |
| 测试依据 | `doc/jog-system-automated-test-plan.md` |
| 测试范围 | 后端 Maven 编译/测试、前端 Vite 构建、前后端 API 契约静态检查、数据库迁移/实体映射静态检查、安全配置静态检查 |
---
## 1. 测试执行摘要
| 测试项 | 命令/方式 | 结果 |
| :--- | :--- | :--- |
| 后端编译与测试 | `mvn -B test` | 通过编译,但所有模块均显示 `No tests to run`,未执行任何自有测试 |
| 前端构建(旧 Node | `npm run build` | 失败,Node `v16.20.2` 下 Vite 启动时报 `crypto$2.getRandomValues is not a function` |
| 前端构建(已切换 Node | `npm run build` | 通过,当前 Node `v24.15.0`、npm `11.12.1`,构建产物已输出到 `jog-admin/src/main/resources/static` |
| API 契约检查 | 对比 `jog-frontend/src/api/*.js` 与后端 Controller | 发现多处路径和 HTTP 方法不一致 |
| 数据库映射检查 | 对比实体 `@TableName` 与 Flyway 建表脚本 | 发现表名、字段名大面积不一致 |
| 安全配置检查 | 对比 JWT 角色生成、SecurityConfig、Controller 路径 | 发现管理员角色无法匹配、用户接口未被鉴权规则保护 |
---
## 1.1 本轮修复记录
| Bug | 当前状态 | 修复摘要 |
| :--- | :--- | :--- |
| BUG-003 | 已修复,待数据库集成验证 | 实体 `@TableName` 已对齐 `sys_*` / `blog_*` 表名 |
| BUG-004 | 已修复,待数据库集成验证 | 对差异字段补充 `@TableField`,覆盖用户类型、会话 token/过期时间、登录结果、评论回复目标等 |
| BUG-005 | 已修复 | JWT access token 角色改为 `ADMIN` / `USER`,过滤器兼容旧数字角色 |
| BUG-006 | 已修复 | 用户侧 Controller 已统一到 `/api/app/**`,并由 SecurityConfig 保护 |
| BUG-007 | 已修复 | 认证接口已对齐前端 `/api/public/user/login``/api/public/admin/login``/api/public/user/register``/api/public/refresh-token` |
| BUG-008 | 已修复 | 文章、评论、用户接口已对齐前端 `/api/app/**` 路径 |
| BUG-009 | 已修复 | 回收站、恢复、评论审核、用户重置密码、用户状态更新的 HTTP 方法已对齐前端 |
| BUG-010 | 部分修复 | 已补标签列表/创建、验证码占位接口、关注/取关接口;验证码当前仅返回占位数据,不做真实校验 |
| BUG-011 | 已修复 | 前端路由已根据 `requiresAdmin` 校验本地用户角色 |
| BUG-012 | 已修复 | `V2__init_data.sql` 已移除 `USE blog_db` |
| BUG-013 | 已修复 | 文章详情标签改为返回结构化 `Tag` 对象,匹配前端 `id/name` 使用方式 |
---
## 2. Bug 清单
### BUG-001 前端构建在旧 Node 版本下无法启动
| 字段 | 内容 |
| :--- | :--- |
| 严重级别 | P3 |
| 状态 | 已验证解决:Node 已切换至 `v24.15.0` 后构建通过 |
| 位置 | `jog-frontend/package.json`、本机 Node 环境 |
| 复现 | 在 `jog-frontend` 执行 `npm run build` |
| 实际结果 | `TypeError: crypto$2.getRandomValues is not a function` |
| 期望结果 | 前端可完成生产构建 |
| 证据 | 旧 Node 版本为 `v16.20.2`,切换到 `v24.15.0``npm run build` 成功 |
| 建议 | 在 README/部署文档和 `package.json engines` 中声明 Node >= 20;本地和 CI 统一 Node 版本 |
### BUG-002 使用新版 Node 后前端构建失败
| 字段 | 内容 |
| :--- | :--- |
| 严重级别 | P3 |
| 状态 | 无法复现/已恢复:用户切换 Node 后 `npm run build` 通过 |
| 位置 | `jog-frontend/vite.config.js:29` |
| 复现 | 使用 Node `v24.14.0` 执行 `node node_modules/vite/bin/vite.js build` |
| 实际结果 | `[vite:build-html] The "fileName" or "name" properties of emitted chunks and assets must be strings that are neither absolute nor relative paths, received "E:/person/Jog/jog-frontend/index.html"` |
| 期望结果 | 构建产物成功输出到后端静态资源目录 |
| 最新验证 | 当前 Node `v24.15.0`、npm `11.12.1` 下执行 `npm run build` 成功 |
| 建议 | 保留 CI 构建验证;若再次出现该错误,再检查 Node/npm/Vite 解析路径差异 |
### BUG-002A 前端构建存在低优先级告警
| 字段 | 内容 |
| :--- | :--- |
| 严重级别 | P3 |
| 状态 | 待优化 |
| 位置 | `jog-frontend` 构建配置与本机 npm 配置 |
| 实际结果 | 构建成功,但 npm 输出多条 Unknown user config 警告;Vite 输出主 chunk 超过 500 kB 的警告 |
| 期望结果 | CI 构建日志干净,首屏资源大小可控 |
| 影响 | 暂不阻断发布,但会降低构建日志可读性,主包偏大可能影响首屏性能 |
| 建议 | 清理过期 npm 配置;为 Element Plus、Tiptap 等依赖配置合理分包或接受当前 warning 并设置 chunk 预算 |
### BUG-003 实体表名与 Flyway 建表脚本不一致,运行时会查不到表
| 字段 | 内容 |
| :--- | :--- |
| 严重级别 | P0 |
| 状态 | 待修复 |
| 位置 | `jog-module-system/src/main/java/.../entity/*.java``jog-module-blog/src/main/java/.../entity/*.java``jog-module-comment/src/main/java/.../entity/*.java``jog-admin/src/main/resources/db/migration/V1__init_schema.sql` |
| 复现 | 启用 Flyway 初始化后调用任意 Mapper 查询 |
| 实际结果 | 实体使用 `@TableName("user")``article``comment``category` 等;SQL 创建的是 `sys_user``blog_article``blog_comment``blog_category` 等 |
| 期望结果 | 实体表名与数据库真实表名一致 |
| 影响 | 登录、注册、文章、评论、分类等数据库操作都会失败 |
| 建议 | 统一命名策略:要么实体改为 `sys_*`/`blog_*`,要么迁移脚本改为无前缀表;推荐按迁移脚本保留前缀并修正实体 |
### BUG-004 实体字段与数据库字段不一致,多个核心写入会失败或数据错列
| 字段 | 内容 |
| :--- | :--- |
| 严重级别 | P0 |
| 状态 | 待修复 |
| 位置 | `User.java``UserSession.java``LoginLog.java``Comment.java``V1__init_schema.sql` |
| 实际结果 | 例如 `User.type` 对应代码字段,但 SQL 是 `user_type``UserSession.refreshToken/expiresAt` 对应 SQL 的 `token/expire_time``LoginLog.email/status/userAgent` 对应 SQL 的 `username/result` 且 SQL 无 `user_agent``Comment.replyToId` 对应 SQL 的 `reply_to_user_id` |
| 期望结果 | 字段名可通过 MyBatis-Plus 正确映射 |
| 影响 | 登录记录、会话保存、用户角色、评论回复等核心链路会失败 |
| 建议 | 为差异字段添加 `@TableField("实际字段名")`,或统一 SQL 字段命名;同时增加 Mapper 集成测试覆盖插入/查询 |
### BUG-005 JWT 角色值与 Spring Security 角色规则不匹配,管理员接口会 403
| 字段 | 内容 |
| :--- | :--- |
| 严重级别 | P0 |
| 状态 | 待修复 |
| 位置 | `jog-framework/src/main/java/fun/nojava/framework/security/JwtTokenProvider.java:18``JwtAuthenticationFilter.java:39``SecurityConfig.java:51` |
| 实际结果 | Token 中 `role` 写入的是数字字符串 `0`/`1`,过滤器生成 `ROLE_0`/`ROLE_1`;但安全配置要求 `/api/admin/**` 具备 `ROLE_ADMIN` |
| 期望结果 | 管理员 Token 应匹配 `ROLE_ADMIN`,普通用户 Token 应匹配 `ROLE_USER` |
| 影响 | 管理后台 API 无法正常访问;普通用户权限判断也不稳定 |
| 建议 | Token 中存储 `ADMIN`/`USER`,或在过滤器中将 `UserType` code 转换为角色名 |
### BUG-006 用户文章/评论接口未被 Spring Security 鉴权规则保护
| 字段 | 内容 |
| :--- | :--- |
| 严重级别 | P0 |
| 状态 | 待修复 |
| 位置 | `SecurityConfig.java:52``ArticleController.java:16``CommentController.java:19``UserController.java:15` |
| 实际结果 | 安全配置只保护 `/api/app/**`,但后端用户业务接口实际是 `/api/article``/api/comment``/api/user`;这些路径最终落入 `anyRequest().permitAll()` |
| 期望结果 | 创建/更新/删除文章、发表评论、删除评论、获取当前用户等接口必须要求登录 |
| 影响 | 未登录用户可能访问写接口,`@AuthenticationPrincipal Long userId` 为空后还可能导致脏数据或空指针 |
| 建议 | 统一后端用户接口前缀为 `/api/app/**`,或在 `SecurityConfig` 中显式保护 `/api/article/**``/api/comment/**``/api/user/**` |
### BUG-007 前后端认证接口路径完全不一致
| 字段 | 内容 |
| :--- | :--- |
| 严重级别 | P0 |
| 状态 | 待修复 |
| 位置 | `jog-frontend/src/api/auth.js:4``auth.js:8``auth.js:12``auth.js:20``jog-module-system/src/main/java/.../AuthController.java:18` |
| 实际结果 | 前端调用 `/api/public/admin/login``/api/public/user/login``/api/public/user/register``/api/public/refresh-token`;后端提供 `/api/auth/admin/login``/api/auth/login``/api/auth/register``/api/auth/refresh` |
| 期望结果 | 前端 API 封装与后端 Controller 路径一致 |
| 影响 | 登录、注册、Token 刷新全部 404,系统无法完成认证 |
| 建议 | 建立 OpenAPI 契约检查;统一使用 `/api/auth/**` 或调整后端兼容前端路径 |
### BUG-008 前后端文章/评论/用户接口路径不一致
| 字段 | 内容 |
| :--- | :--- |
| 严重级别 | P0 |
| 状态 | 待修复 |
| 位置 | `jog-frontend/src/api/article.js:12``article.js:24``comment.js:4``auth.js:24`、后端 `ArticleController.java:16``CommentController.java:19``UserController.java:15` |
| 实际结果 | 前端使用 `/api/app/article``/api/app/article/mine``/api/app/comment``/api/app/user/me`;后端实际是 `/api/article``/api/article/my``/api/comment``/api/user/info` |
| 期望结果 | 前后端路径一致 |
| 影响 | 登录后的发文、我的文章、评论、当前用户信息等核心页面无法工作 |
| 建议 | 统一用户端路径前缀和资源命名,建议后端对齐 `/api/app/**` 或前端全部改为后端当前路径 |
### BUG-009 多个前端请求 HTTP 方法与后端不一致
| 字段 | 内容 |
| :--- | :--- |
| 严重级别 | P1 |
| 状态 | 待修复 |
| 位置 | `jog-frontend/src/api/article.js:28``article.js:32``comment.js:24``admin.js:8``admin.js:12`;后端对应 Controller |
| 实际结果 | 前端对回收站/恢复/审核/重置密码/状态更新使用 `PUT`;后端分别使用 `POST` |
| 期望结果 | 同一接口请求方法一致 |
| 影响 | 即使路径修正,仍会返回 405 或无法命中接口 |
| 建议 | 按 REST 风格统一:状态变更可用 `PUT/PATCH`,动作型接口可用 `POST`,但前后端必须一致 |
### BUG-010 前端调用了后端未实现的接口
| 字段 | 内容 |
| :--- | :--- |
| 严重级别 | P1 |
| 状态 | 待修复 |
| 位置 | `jog-frontend/src/api/auth.js:16``auth.js:36``auth.js:40``article.js:44``article.js:60` |
| 实际结果 | 前端调用验证码 `/api/public/captcha`、关注/取关、公开标签列表、管理员创建标签;后端未发现对应 Controller 映射 |
| 期望结果 | 前端只调用已实现接口,或后端补齐对应接口 |
| 影响 | 登录页验证码、关注功能、文章编辑标签选择、后台标签管理会失败 |
| 建议 | 根据需求决定补实现还是移除前端入口;未实现需求应在自动化测试中标记为 pending |
### BUG-011 前端管理员路由只校验 Token,不校验管理员角色
| 字段 | 内容 |
| :--- | :--- |
| 严重级别 | P1 |
| 状态 | 待修复 |
| 位置 | `jog-frontend/src/router/index.js` |
| 实际结果 | 路由定义有 `requiresAdmin`,但 `beforeEach` 只检查 `requiresAuth` 和 token,不检查用户类型 |
| 期望结果 | 普通用户访问 `/admin/**` 应在前端被拒绝或重定向 |
| 影响 | 普通用户可进入后台页面,虽然后端也应拦截,但会造成越权界面暴露和误导 |
| 建议 | 从 `user_info` 或 Store 中读取用户类型,补充 `requiresAdmin` 判断;后端仍保留最终权限校验 |
### BUG-012 V2 初始化脚本写死 `USE blog_db`,与当前配置不一致
| 字段 | 内容 |
| :--- | :--- |
| 严重级别 | P1 |
| 状态 | 待修复 |
| 位置 | `jog-admin/src/main/resources/db/migration/V2__init_data.sql:4``application.yml` |
| 实际结果 | 初始化脚本写死 `USE blog_db;`,当前应用数据源库名不是同一个命名 |
| 期望结果 | Flyway 迁移脚本不应写死切库,应该使用当前连接的 schema |
| 影响 | 首次初始化可能写入错误数据库或直接失败 |
| 建议 | 删除 `USE blog_db;`,由 JDBC URL 指定 schemaCI 中增加 Flyway clean/migrate 测试 |
### BUG-013 文章详情返回的标签结构与前端期望不一致
| 字段 | 内容 |
| :--- | :--- |
| 严重级别 | P2 |
| 状态 | 待修复 |
| 位置 | `ArticleServiceImpl.java:283``ArticleVO.java``jog-frontend/src/views/ArticleDetail.vue:13``ArticleEditor.vue:100` |
| 实际结果 | 后端 `ArticleVO.tags``List<String>`;前端按 `tag.id``tag.name` 使用 |
| 期望结果 | 标签返回结构与前端一致 |
| 影响 | 文章详情标签显示异常,编辑文章时标签无法正确回填 |
| 建议 | 后端返回 `List<TagVO>`,或前端改为字符串数组渲染;编辑器需要 ID 时推荐返回结构化对象 |
### BUG-014 限流 Key 未包含 IP 或用户维度,所有用户共享同一限流桶
| 字段 | 内容 |
| :--- | :--- |
| 严重级别 | P2 |
| 状态 | 待修复 |
| 位置 | `jog-framework/src/main/java/fun/nojava/framework/aspect/RateLimitAspect.java:41` |
| 实际结果 | Redis Key 仅为 `rate_limit:` + 注解 key,例如所有用户共享 `rate_limit:login` |
| 期望结果 | 登录、注册等限流至少按 IP 或账号维度隔离 |
| 影响 | 一个用户频繁请求会误伤所有用户;也无法实现需求中的“同一 IP”限流 |
| 建议 | 将 IP、用户 ID、请求路径或账号加入限流 Key;补充并发/限流集成测试 |
### BUG-015 当前项目没有自有自动化测试,质量门禁失效
| 字段 | 内容 |
| :--- | :--- |
| 严重级别 | P2 |
| 状态 | 待补齐 |
| 位置 | 全项目 |
| 实际结果 | `mvn -B test` 成功但所有模块均显示 `No tests to run`;前端没有 `test:unit``test:e2e` 等脚本 |
| 期望结果 | 后端至少有 Service 单元测试、Controller 集成测试;前端至少有组件测试和 E2E 冒烟 |
| 影响 | 构建通过不代表功能可用,无法防止上述契约/安全/数据库缺陷回归 |
| 建议 | 按测试计划第一阶段补齐 JUnit/Mockito/Testcontainers/Vitest/Playwright,并纳入 CI |
---
## 3. 优先修复建议
1. 先修复 P0:数据库实体映射、JWT 角色映射、安全保护路径、前后端认证/业务 API 路径。
2. 再修复 P1:HTTP 方法不一致、缺失接口、管理员前端路由、Flyway `USE blog_db`
3. 最后补齐 P2:标签结构、限流维度、自动化测试设施。
4. 修复后第一批自动化测试应优先覆盖:登录/注册、管理员登录和访问后台、创建文章、我的文章列表、发表评论、Flyway 初始化、前端构建。