Add audit log UI and backend API seeded E2E

- Add Auth Context route role guards so doctors cannot directly enter template management, user management, or audit logs.

- Add Audit Logs page, sidebar entry, frontend audit API client, and API client test.

- Add backend audit log query endpoint with super/admin visibility rules and query filtering.

- Extend PostgreSQL integration tests to cover audit log query permissions.

- Move Playwright E2E away from localStorage seed data to real backend API login and seed helpers.

- Add E2E coverage for route guards and audit log visibility.

- Run Playwright backend on port 3100 and proxy Vite API requests there to avoid local port conflicts.

- Make server:dev use the compiled NestJS server path, avoiding tsx parameter-property injection issues.

- Update README, AGENTS, feature, testing, security, deployment, progress, API, backendization, and auth/user module docs.
This commit is contained in:
2026-05-02 02:04:56 +08:00
parent a16f522a4b
commit 750cf4129d
31 changed files with 719 additions and 261 deletions

View File

@@ -10,7 +10,7 @@ npm run server:build
npm run build
```
当前单元/组件测试框架为 Vitest运行环境为 jsdom。React 页面测试使用 Testing Library。端到端测试使用 Playwright当前仍以 localStorage 种子数据锁定迁移期前端基线行为;登录相关测试会 mock Auth API。后端使用 Vitest 覆盖权限策略、schema、DTO 映射、Nest HTTP 层集成测试和真实 PostgreSQL 服务集成测试NestJS API 构建用 `npm run server:build` 验证。
当前单元/组件测试框架为 Vitest运行环境为 jsdom。React 页面测试使用 Testing Library。端到端测试使用 Playwright当前会启动/复用 Vite 前端和 NestJS 后端,并通过真实 Auth/Reports/Templates/Users/Audit API 准备数据。后端使用 Vitest 覆盖权限策略、schema、DTO 映射、Nest HTTP 层集成测试和真实 PostgreSQL 服务集成测试NestJS API 构建用 `npm run server:build` 验证。
## 测试范围
@@ -19,11 +19,12 @@ npm run build
| 数据初始化 | 登录页首次加载会创建默认用户、模板、字段和系统设置。 |
| 前端 API client | 统一解包 `{ data }` 响应、携带 Cookie credentials、识别后端错误 envelope。 |
| 前端 Dashboard API | 工作台统计封装会请求 `/api/dashboard/stats` 并校验响应结构。 |
| 前端审计 API | 审计日志列表封装会请求 `/api/audit-logs` 并校验响应结构。 |
| 前端语音代理地址 | 根据当前页面来源或 `VITE_API_BASE_URL` 生成 `/api/speech/iat` WebSocket 地址。 |
| 前端字段库和文件 API | 字段库读取/更新、通用文件列表/上传封装。 |
| Auth 兼容映射 | 后端 `doctor` 角色会映射为当前前端使用的 `user`,并保留本地签名和模板授权。 |
| 权限展示 | 侧边栏会按角色显示或隐藏模板管理、用户管理等入口。 |
| 报告权限 | 医生只看到本人报告,管理员看到本部门报告,超级管理员看到全部本地报告。 |
| 权限展示 | 侧边栏和路由守卫会按角色显示或阻止模板管理、用户管理、审计日志等入口。 |
| 报告权限 | 医生只看到本人报告,管理员看到本部门报告,超级管理员看到全部后端报告。 |
| 后端报告映射 | Report API 使用 `metadata` 兼容前端扩展字段,使用 `ReportMedia` 组装视频/关键帧兼容字段。 |
| 模板权限 | 医生可使用本部门授权模板和个人模板,不能使用他人个人模板。 |
| 后端模板映射 | Template API 返回前端可消费的 `Template` 结构,并生成权限策略资源。 |
@@ -41,6 +42,7 @@ npm run build
| E2E 权限过滤 | Playwright 验证超级管理员、管理员、医生在报告管理页的可见范围。 |
| E2E 报告修订 | Playwright 验证已完成报告再次完成保存后 `revision` 递增并保留历史。 |
| E2E 个人模板 | Playwright 验证医生可保存个人模板且模板仅归属本人。 |
| E2E 路由守卫和审计日志 | Playwright 验证医生不能直进管理页,超级管理员可查看审计日志。 |
| 后端权限策略 | Vitest 验证报告、模板、用户和管理员创建权限策略。 |
## Mock 边界
@@ -48,7 +50,7 @@ npm run build
测试中 mock 了以下浏览器或外部边界:
- `fetch('/logo_square.png')`:用于登录初始化图片资源。
- `/api/auth/me``/api/auth/login`:组件测试和登录 E2E 中使用 mock避免单元/E2E 依赖真实数据库。
- `/api/auth/me``/api/auth/login`:组件测试中使用 mock避免单元测试依赖真实数据库Playwright E2E 使用真实后端 API
- `window.alert` / `window.confirm`:避免测试阻塞。
- `document.execCommand`:当前富文本编辑依赖浏览器命令。
- `URL.createObjectURL` / `URL.revokeObjectURL`:用于文件、视频和导出。
@@ -64,6 +66,7 @@ AI 第三方接口、讯飞语音上游 WebSocket、麦克风权限和真实视
| 后端登录禁用账号错误 | 已覆盖 | `Login.test.tsx` |
| API client 响应/错误处理 | 已覆盖 | `api/client.test.ts` |
| Dashboard API 封装 | 已覆盖 | `api/dashboard.test.ts` |
| 审计日志 API 封装 | 已覆盖 | `api/audit.test.ts` |
| 语音 WebSocket 代理地址 | 已覆盖 | `api/speech.test.ts` |
| 字段库 API 封装 | 已覆盖 | `api/library.test.ts` |
| 通用文件 API 封装 | 已覆盖 | `api/files.test.ts` |
@@ -81,6 +84,7 @@ AI 第三方接口、讯飞语音上游 WebSocket、麦克风权限和真实视
| 报告权限 E2E | 已覆盖 | `e2e/report-permissions.spec.ts` |
| 报告修订版本 E2E | 已覆盖 | `e2e/report-revision.spec.ts` |
| 医生个人模板 E2E | 已覆盖 | `e2e/personal-template.spec.ts` |
| 路由守卫和审计日志 E2E | 已覆盖 | `e2e/audit-and-route-guards.spec.ts` |
| 后端报告/模板/用户权限策略 | 已覆盖 | `server/src/permissions/permissions.policy.test.ts` |
| 后端报告兼容映射 | 已覆盖 | `server/src/reports/report.mapper.test.ts` |
| 后端模板兼容映射 | 已覆盖 | `server/src/templates/template.mapper.test.ts` |
@@ -91,7 +95,7 @@ AI 第三方接口、讯飞语音上游 WebSocket、麦克风权限和真实视
| 后端字段库 schema | 已覆盖 | `server/src/library/library.schemas.test.ts` |
| 后端文件 schema | 已覆盖 | `server/src/files/files.schemas.test.ts` |
| 后端 HTTP 集成 | 已覆盖 | `server/src/http.integration.test.ts` |
| 后端真实数据库集成 | 已覆盖 | `server/src/database.integration.test.ts`,含 Dashboard 角色范围、报告媒体关系表同步、报告 HTML 清洗审计写入。 |
| 后端真实数据库集成 | 已覆盖 | `server/src/database.integration.test.ts`,含 Dashboard 角色范围、报告媒体关系表同步、报告 HTML 清洗审计写入和审计查询权限。 |
| 后端健康检查和认证 API | 已覆盖 | HTTP 集成测试覆盖健康检查、登录 session 和未登录保护;真实数据库集成覆盖 Argon2 登录、禁用账号和数据库 Session Store。 |
| 模板编辑器深度交互 | 待 E2E | 依赖 contentEditable 和 execCommand。 |
| 报告编辑器完整流程 | 部分覆盖 | 已覆盖保存修订版本和个人模板;模板切换、字段同步仍待补。 |
@@ -107,4 +111,4 @@ AI 第三方接口、讯飞语音上游 WebSocket、麦克风权限和真实视
npx playwright install chromium
```
当前 E2E 测试不会依赖真实后端数据库:登录 E2E mock 认证 API其余业务 E2E 通过 `e2e/helpers.ts` 写入 localStorage 种子数据。后端化后应保留这些用户流程测试,并逐步把数据准备方式从 localStorage seed 改为 API seed 或测试数据库 seed
当前 E2E 测试依赖真实后端数据库。Playwright 会在 `3100` 端口启动后端 API执行 Prisma migrate/seed然后在 `3001` 启动 Vite并把 `/api` 代理到 `3100``e2e/helpers.ts` 通过真实 API 登录、创建用户/部门/报告和查询模板,不再写入 localStorage 种子数据