From 014aca8619faf86020177519a9c340ad102993cf Mon Sep 17 00:00:00 2001 From: admin <572701190@qq.com> Date: Sat, 2 May 2026 01:37:20 +0800 Subject: [PATCH] Initialize backendized SurClaw report system - Add React/Vite frontend for login, dashboard, reports, templates, users, settings, AI, speech, and media workflows. - Add NestJS/Prisma/PostgreSQL backend with auth, dashboard stats, reports, templates, users, departments, settings, files, AI, speech, audit logs, and HTML sanitization. - Add Prisma schema, migrations, seed data, persistent app sessions, Docker/Nginx deployment files, and upload volume configuration. - Add Vitest, Playwright, backend integration tests, and project documentation for requirements, design, permissions, API contracts, testing, deployment, security, and progress. - Configure production local fallback switch and remove unused Gemini direct dependency/env wiring. --- .dockerignore | 11 + .env.example | 9 + .gitignore | 11 + AGENTS.md | 369 + Dockerfile | 14 + Dockerfile.server | 21 + README.md | 257 + docker-compose.yaml | 48 + docs/README.md | 34 + docs/api-contract.md | 660 ++ docs/backendization-plan.md | 461 + docs/data-storage.md | 67 + docs/deployment.md | 92 + docs/design.md | 105 + docs/features.md | 79 + docs/modules/auth-and-users.md | 74 + docs/modules/report-editor.md | 98 + docs/modules/report-management.md | 53 + docs/modules/system-settings.md | 60 + docs/modules/template-management.md | 88 + docs/permissions.md | 280 + docs/progress.md | 74 + docs/requirements.md | 75 + docs/security.md | 24 + docs/testing.md | 110 + e2e/helpers.ts | 77 + e2e/login.spec.ts | 40 + e2e/personal-template.spec.ts | 32 + e2e/report-permissions.spec.ts | 82 + e2e/report-revision.spec.ts | 41 + index.html | 13 + nginx.conf | 34 + package-lock.json | 7929 +++++++++++++++++ package.json | 71 + playwright.config.ts | 23 + prisma.config.ts | 13 + public/favicon.ico | Bin 0 -> 101215 bytes public/logo_square.png | Bin 0 -> 101215 bytes .../20260501145311_init/migration.sql | 299 + .../migration.sql | 2 + .../migration.sql | 130 + .../migration.sql | 12 + server/prisma/migrations/migration_lock.toml | 3 + server/prisma/schema.prisma | 280 + server/prisma/seed.ts | 153 + server/src/ai/ai.controller.ts | 25 + server/src/ai/ai.module.ts | 13 + server/src/ai/ai.schemas.test.ts | 28 + server/src/ai/ai.schemas.ts | 12 + server/src/ai/ai.service.ts | 126 + server/src/app.module.ts | 37 + server/src/audit/audit.module.ts | 11 + server/src/audit/audit.service.ts | 46 + server/src/auth/auth.controller.ts | 91 + server/src/auth/auth.module.ts | 10 + server/src/auth/auth.schemas.ts | 8 + server/src/auth/auth.service.ts | 86 + server/src/auth/auth.types.ts | 18 + server/src/auth/session-user.ts | 15 + server/src/common/api-exception.filter.ts | 54 + server/src/common/html-sanitizer.ts | 68 + server/src/dashboard/dashboard.controller.ts | 19 + server/src/dashboard/dashboard.module.ts | 11 + server/src/dashboard/dashboard.service.ts | 110 + server/src/database.integration.test.ts | 254 + server/src/files/files.controller.ts | 56 + server/src/files/files.module.ts | 12 + server/src/files/files.schemas.test.ts | 19 + server/src/files/files.schemas.ts | 19 + server/src/files/files.service.ts | 351 + server/src/health/health.controller.ts | 15 + server/src/health/health.module.ts | 7 + server/src/http.integration.test.ts | 169 + server/src/library/library.controller.ts | 25 + server/src/library/library.module.ts | 13 + server/src/library/library.schemas.test.ts | 36 + server/src/library/library.schemas.ts | 26 + server/src/library/library.service.ts | 98 + server/src/main.ts | 49 + server/src/permissions/permissions.module.ts | 4 + .../permissions/permissions.policy.test.ts | 114 + server/src/permissions/permissions.policy.ts | 85 + server/src/prisma/prisma.module.ts | 9 + server/src/prisma/prisma.service.ts | 36 + server/src/reports/report.mapper.test.ts | 158 + server/src/reports/report.mapper.ts | 199 + server/src/reports/reports.controller.ts | 44 + server/src/reports/reports.module.ts | 11 + server/src/reports/reports.schemas.ts | 30 + server/src/reports/reports.service.ts | 371 + server/src/session/prisma-session.store.ts | 72 + server/src/settings/settings.controller.ts | 31 + server/src/settings/settings.module.ts | 13 + server/src/settings/settings.schemas.test.ts | 32 + server/src/settings/settings.schemas.ts | 28 + server/src/settings/settings.service.ts | 212 + server/src/speech/speech.gateway.ts | 57 + server/src/speech/speech.module.ts | 10 + server/src/speech/speech.service.ts | 94 + server/src/speech/xf-frame.test.ts | 31 + server/src/speech/xf-frame.ts | 38 + server/src/templates/template.mapper.test.ts | 58 + server/src/templates/template.mapper.ts | 36 + server/src/templates/templates.controller.ts | 44 + server/src/templates/templates.module.ts | 11 + server/src/templates/templates.schemas.ts | 24 + server/src/templates/templates.service.ts | 224 + server/src/types/express-session.d.ts | 7 + server/src/users/users.controller.ts | 83 + server/src/users/users.mapper.test.ts | 89 + server/src/users/users.mapper.ts | 80 + server/src/users/users.module.ts | 12 + server/src/users/users.schemas.ts | 37 + server/src/users/users.service.ts | 548 ++ server/tsconfig.json | 20 + src/App.tsx | 45 + src/api/ai.ts | 24 + src/api/client.test.ts | 38 + src/api/client.ts | 80 + src/api/dashboard.test.ts | 29 + src/api/dashboard.ts | 21 + src/api/files.test.ts | 37 + src/api/files.ts | 64 + src/api/library.test.ts | 33 + src/api/library.ts | 28 + src/api/reports.ts | 42 + src/api/settings.ts | 31 + src/api/speech.test.ts | 22 + src/api/speech.ts | 14 + src/api/templates.ts | 50 + src/api/users.ts | 80 + src/auth/AuthContext.tsx | 108 + src/auth/backendUser.test.ts | 56 + src/auth/backendUser.ts | 64 + src/components/Sidebar.test.tsx | 37 + src/components/Sidebar.tsx | 88 + src/config/runtime.ts | 2 + src/index.css | 225 + src/main.tsx | 10 + src/pages/Dashboard.tsx | 287 + src/pages/Login.test.tsx | 70 + src/pages/Login.tsx | 203 + src/pages/ReportEditor.tsx | 3118 +++++++ src/pages/ReportManage.test.tsx | 64 + src/pages/ReportManage.tsx | 511 ++ src/pages/ReportView.tsx | 145 + src/pages/SystemSettings.tsx | 673 ++ src/pages/TemplateManage.tsx | 1820 ++++ src/pages/UserManage.tsx | 859 ++ src/test/setup.ts | 59 + src/types.ts | 181 + src/utils/defaultContent.test.ts | 48 + src/utils/defaultContent.ts | 143 + src/utils/permissions.test.ts | 54 + src/utils/permissions.ts | 53 + src/utils/print.test.ts | 44 + src/utils/print.ts | 67 + src/utils/storage.test.ts | 47 + src/utils/storage.ts | 74 + src/vite-env.d.ts | 1 + tsconfig.json | 33 + vite.config.ts | 37 + 162 files changed, 27116 insertions(+) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 AGENTS.md create mode 100644 Dockerfile create mode 100644 Dockerfile.server create mode 100644 README.md create mode 100644 docker-compose.yaml create mode 100644 docs/README.md create mode 100644 docs/api-contract.md create mode 100644 docs/backendization-plan.md create mode 100644 docs/data-storage.md create mode 100644 docs/deployment.md create mode 100644 docs/design.md create mode 100644 docs/features.md create mode 100644 docs/modules/auth-and-users.md create mode 100644 docs/modules/report-editor.md create mode 100644 docs/modules/report-management.md create mode 100644 docs/modules/system-settings.md create mode 100644 docs/modules/template-management.md create mode 100644 docs/permissions.md create mode 100644 docs/progress.md create mode 100644 docs/requirements.md create mode 100644 docs/security.md create mode 100644 docs/testing.md create mode 100644 e2e/helpers.ts create mode 100644 e2e/login.spec.ts create mode 100644 e2e/personal-template.spec.ts create mode 100644 e2e/report-permissions.spec.ts create mode 100644 e2e/report-revision.spec.ts create mode 100644 index.html create mode 100644 nginx.conf create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 playwright.config.ts create mode 100644 prisma.config.ts create mode 100644 public/favicon.ico create mode 100644 public/logo_square.png create mode 100644 server/prisma/migrations/20260501145311_init/migration.sql create mode 100644 server/prisma/migrations/20260501153200_add_report_metadata/migration.sql create mode 100644 server/prisma/migrations/20260502011500_add_report_media/migration.sql create mode 100644 server/prisma/migrations/20260502020000_add_app_session/migration.sql create mode 100644 server/prisma/migrations/migration_lock.toml create mode 100644 server/prisma/schema.prisma create mode 100644 server/prisma/seed.ts create mode 100644 server/src/ai/ai.controller.ts create mode 100644 server/src/ai/ai.module.ts create mode 100644 server/src/ai/ai.schemas.test.ts create mode 100644 server/src/ai/ai.schemas.ts create mode 100644 server/src/ai/ai.service.ts create mode 100644 server/src/app.module.ts create mode 100644 server/src/audit/audit.module.ts create mode 100644 server/src/audit/audit.service.ts create mode 100644 server/src/auth/auth.controller.ts create mode 100644 server/src/auth/auth.module.ts create mode 100644 server/src/auth/auth.schemas.ts create mode 100644 server/src/auth/auth.service.ts create mode 100644 server/src/auth/auth.types.ts create mode 100644 server/src/auth/session-user.ts create mode 100644 server/src/common/api-exception.filter.ts create mode 100644 server/src/common/html-sanitizer.ts create mode 100644 server/src/dashboard/dashboard.controller.ts create mode 100644 server/src/dashboard/dashboard.module.ts create mode 100644 server/src/dashboard/dashboard.service.ts create mode 100644 server/src/database.integration.test.ts create mode 100644 server/src/files/files.controller.ts create mode 100644 server/src/files/files.module.ts create mode 100644 server/src/files/files.schemas.test.ts create mode 100644 server/src/files/files.schemas.ts create mode 100644 server/src/files/files.service.ts create mode 100644 server/src/health/health.controller.ts create mode 100644 server/src/health/health.module.ts create mode 100644 server/src/http.integration.test.ts create mode 100644 server/src/library/library.controller.ts create mode 100644 server/src/library/library.module.ts create mode 100644 server/src/library/library.schemas.test.ts create mode 100644 server/src/library/library.schemas.ts create mode 100644 server/src/library/library.service.ts create mode 100644 server/src/main.ts create mode 100644 server/src/permissions/permissions.module.ts create mode 100644 server/src/permissions/permissions.policy.test.ts create mode 100644 server/src/permissions/permissions.policy.ts create mode 100644 server/src/prisma/prisma.module.ts create mode 100644 server/src/prisma/prisma.service.ts create mode 100644 server/src/reports/report.mapper.test.ts create mode 100644 server/src/reports/report.mapper.ts create mode 100644 server/src/reports/reports.controller.ts create mode 100644 server/src/reports/reports.module.ts create mode 100644 server/src/reports/reports.schemas.ts create mode 100644 server/src/reports/reports.service.ts create mode 100644 server/src/session/prisma-session.store.ts create mode 100644 server/src/settings/settings.controller.ts create mode 100644 server/src/settings/settings.module.ts create mode 100644 server/src/settings/settings.schemas.test.ts create mode 100644 server/src/settings/settings.schemas.ts create mode 100644 server/src/settings/settings.service.ts create mode 100644 server/src/speech/speech.gateway.ts create mode 100644 server/src/speech/speech.module.ts create mode 100644 server/src/speech/speech.service.ts create mode 100644 server/src/speech/xf-frame.test.ts create mode 100644 server/src/speech/xf-frame.ts create mode 100644 server/src/templates/template.mapper.test.ts create mode 100644 server/src/templates/template.mapper.ts create mode 100644 server/src/templates/templates.controller.ts create mode 100644 server/src/templates/templates.module.ts create mode 100644 server/src/templates/templates.schemas.ts create mode 100644 server/src/templates/templates.service.ts create mode 100644 server/src/types/express-session.d.ts create mode 100644 server/src/users/users.controller.ts create mode 100644 server/src/users/users.mapper.test.ts create mode 100644 server/src/users/users.mapper.ts create mode 100644 server/src/users/users.module.ts create mode 100644 server/src/users/users.schemas.ts create mode 100644 server/src/users/users.service.ts create mode 100644 server/tsconfig.json create mode 100644 src/App.tsx create mode 100644 src/api/ai.ts create mode 100644 src/api/client.test.ts create mode 100644 src/api/client.ts create mode 100644 src/api/dashboard.test.ts create mode 100644 src/api/dashboard.ts create mode 100644 src/api/files.test.ts create mode 100644 src/api/files.ts create mode 100644 src/api/library.test.ts create mode 100644 src/api/library.ts create mode 100644 src/api/reports.ts create mode 100644 src/api/settings.ts create mode 100644 src/api/speech.test.ts create mode 100644 src/api/speech.ts create mode 100644 src/api/templates.ts create mode 100644 src/api/users.ts create mode 100644 src/auth/AuthContext.tsx create mode 100644 src/auth/backendUser.test.ts create mode 100644 src/auth/backendUser.ts create mode 100644 src/components/Sidebar.test.tsx create mode 100644 src/components/Sidebar.tsx create mode 100644 src/config/runtime.ts create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/pages/Dashboard.tsx create mode 100644 src/pages/Login.test.tsx create mode 100644 src/pages/Login.tsx create mode 100644 src/pages/ReportEditor.tsx create mode 100644 src/pages/ReportManage.test.tsx create mode 100644 src/pages/ReportManage.tsx create mode 100644 src/pages/ReportView.tsx create mode 100644 src/pages/SystemSettings.tsx create mode 100644 src/pages/TemplateManage.tsx create mode 100644 src/pages/UserManage.tsx create mode 100644 src/test/setup.ts create mode 100644 src/types.ts create mode 100644 src/utils/defaultContent.test.ts create mode 100644 src/utils/defaultContent.ts create mode 100644 src/utils/permissions.test.ts create mode 100644 src/utils/permissions.ts create mode 100644 src/utils/print.test.ts create mode 100644 src/utils/print.ts create mode 100644 src/utils/storage.test.ts create mode 100644 src/utils/storage.ts create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..116b6ba --- /dev/null +++ b/.dockerignore @@ -0,0 +1,11 @@ +node_modules +dist +server/dist +coverage +test-results +playwright-report +.git +.env +.env.* +!.env.example +*.log diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..ec90097 --- /dev/null +++ b/.env.example @@ -0,0 +1,9 @@ +# Backend API development defaults. +API_PORT=3000 +CORS_ORIGIN="http://localhost:3001" +DATABASE_URL="postgresql://surclaw:surclaw_dev_password@localhost:5433/surclaw?schema=public" +SESSION_SECRET="change-me-in-production" +SESSION_COOKIE_SECURE="false" +FILE_STORAGE_DIR="./uploads" +VITE_API_PROXY_TARGET="http://localhost:3000" +VITE_ENABLE_LOCAL_FALLBACK="true" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..038eff0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +node_modules/ +build/ +dist/ +server/dist/ +coverage/ +test-results/ +playwright-report/ +.DS_Store +*.log +.env* +!.env.example diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..e80852e --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,369 @@ +# AI 编码助手项目说明 + +本文件面向 AI 编码助手。阅读者应假设对该项目一无所知。以下信息基于当前仓库实际文件、脚本和源码;不要把早期设计目标当作已实现事实。任何代码和功能修改都要落实到文档和测试上。如果生成 git commit 信息,要逐个列点把所有修改都列上,重要的、大的修改放前面,不重要的、小的修改列在后面。 + +## 项目一句话 + +这是一个“手术图文病历报告系统”。当前登录认证已接入 NestJS Session API、PostgreSQL 用户表和数据库 Session Store;工作台统计、报告、报告媒体、模板、字段库、模板图片资源、视频/关键帧文件、用户、部门权限、系统设置、签名文件、AI 对话和讯飞语音听写已优先接入后端 API/代理。开发模式仍保留本地兼容回退,不能把前端权限和本地缓存当作生产安全边界。 + +## 当前技术栈 + +- React 19 +- TypeScript 5.8 +- Vite 6 +- Tailwind CSS 4 +- React Router DOM 7 +- Lucide React +- Vitest + jsdom + Testing Library +- Playwright +- NestJS + Prisma + PostgreSQL 后端骨架 +- Docker + Nginx + +## 运行脚本 + +```bash +npm install +npm run dev # Vite dev server, 0.0.0.0:3001 +npm run server:dev # NestJS API dev server, 0.0.0.0:3000 +npm run server:build # tsc -p server/tsconfig.json +npm run lint # tsc --noEmit +npm run test # vitest run +npm run test:e2e # playwright test +npm run build # vite build +npm run prisma:generate +npm run prisma:migrate +npm run prisma:seed +``` + +修改代码后至少运行: + +```bash +npm run lint +npm run test +``` + +如果改动构建、依赖、路由、样式或部署相关内容,也运行: + +```bash +npm run build +``` + +如果改动后端源码、Prisma schema、认证、权限或 API 契约,也运行: + +```bash +npm run server:build +npm run prisma:generate +``` + +后端化、权限或关键用户流程变更时也运行: + +```bash +npm run test:e2e +``` + +## 默认账号 + +| 用户ID | 密码 | 角色 | +| --- | --- | --- | +| `admin` | `123456` | 超级管理员 | +| `manager` | `123456` | 管理员 | +| `0001` | `123456` | 医生 | + +默认数据由 `src/pages/Login.tsx` 首次进入时初始化。 + +## 主要业务脉络 + +1. 用户进入 `/` 登录页。 +2. 登录页初始化默认用户、模板、字段、图片资源和系统设置。 +3. 登录页通过 `AuthContext` 调用后端 `/api/auth/login`,后端写入 HttpOnly Session Cookie。 +4. 登录成功后前端把后端安全用户 DTO 映射成兼容 `User`,写入 `localStorage.currentUser`,跳转到 `/dashboard`。 +5. `AuthProvider` 启动时通过 `/api/auth/me` 恢复会话;侧边栏优先读取 Auth Context,回退 `currentUser.role` 展示不同菜单。 +6. 报告编辑器使用模板 HTML 生成报告正文,通过 `data-bind` 字段把侧边表单和正文智能字段同步。 +7. 视频上传后使用浏览器 `