Files

247 lines
15 KiB
Markdown
Raw Permalink Normal View History

2026-05-18 03:22:40 +08:00
# 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 初始化、前端构建。