commit 014aca8619faf86020177519a9c340ad102993cf Author: admin <572701190@qq.com> Date: Sat May 2 01:37:20 2026 +0800 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. 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. 视频上传后使用浏览器 `