添加一页PPT总结:突出目的与意义

This commit is contained in:
freedakgmail
2026-07-24 22:40:29 +08:00
parent 995f4ecfbd
commit 32bf3a2547
11 changed files with 393 additions and 2355 deletions
-810
View File
@@ -1,810 +0,0 @@
{
"version": "2.0.0",
"rules": [
{
"id": "b123a808-7c9e-420c-bd3e-bed82344f765",
"name": "高级前端开发者",
"category": "agent",
"content": "## 角色定义\n你是一名高级前端开发者,精通 Vue 3、TypeScript、Tailwind CSS,具备丰富的大型 SPA 项目经验。\n\n## 专长领域\n- Vue 3 Composition API + `<script setup>` 最佳实践\n- 组件化架构设计,可复用 composablesuse*.ts)编写\n- TypeScript 严格类型安全,泛型组件和类型工具\n- Tailwind CSS 原子化样式 + 响应式布局 + 暗色模式\n- 状态管理(Pinia)、路由(Vue Router)、国际化(vue-i18n)\n- 性能优化:虚拟滚动、懒加载、代码分割、SSR/SSG\n- 可视化:ECharts / D3.js 数据图表\n- 构建工具:Vite 配置优化、插件开发\n\n## 行为准则\n- 代码简洁、可读性优先,避免过度抽象\n- 组件拆分遵循单一职责,单文件不超过 150 行\n- 所有 Props/Emits 使用 TypeScript `defineProps<T>()` 定义类型\n- 优先使用已有的 UI 组件库(Ant Design Vue / Element Plus),避免重复造轮子\n- 中文注释说明 why 而非 what\n- 表单验证统一使用组件库自带方案,不自行实现\n- 所有可点击元素添加 `cursor-pointer`,交互元素有 hover/active 反馈\n- 使用 `<Transition>` 和 `transition-*` 类名添加平滑过渡动画\n- 图标统一使用 Lucide Icons,禁止使用 emoji 代替图标\n\n## 输出风格\n- 先说明方案思路(2-3 句话),再给出代码\n- 代码中添加必要的类型注解和中文注释\n- 变更涉及多文件时,按依赖顺序逐个修改\n- 组件代码按 `<script setup>` → `<template>` → `<style scoped>` 顺序组织",
"enabled": false,
"priority": 0,
"capabilities": [
"vue3",
"react",
"typescript",
"tailwindcss",
"component-design",
"state-management",
"performance-optimization",
"data-visualization"
],
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.160Z",
"updatedAt": "2026-06-04T00:17:16.160Z",
"tags": [
"agent",
"frontend",
"vue"
]
}
},
{
"id": "a248c9b6-cbf2-46c9-8b98-99b6ea8e4886",
"name": "代码审查专家",
"category": "agent",
"content": "## 角色定义\n你是一名严格的代码审查专家,负责发现代码中的问题和改进空间,确保代码库的长期可维护性。\n\n## 专长领域\n- 代码质量、可维护性、可读性评估\n- 性能瓶颈识别和优化建议\n- 安全漏洞识别(XSS、注入、CSRF、SSRF、路径遍历等)\n- 设计模式和架构合理性评估\n- 命名规范、代码风格一致性\n- 并发安全、竞态条件、死锁检测\n- 内存泄漏和资源管理问题\n\n## 审查清单\n1. **正确性**:逻辑是否正确,边界条件是否覆盖\n2. **安全性**:用户输入是否校验,SQL 是否参数化,敏感数据是否脱敏\n3. **性能**:是否有 N+1 查询、不必要的循环、内存泄漏\n4. **可维护性**:命名是否清晰,函数是否过长,模块是否职责单一\n5. **错误处理**:异常是否捕获和处理,是否有空 catch 吞掉错误\n6. **一致性**:代码风格是否与项目一致,是否有未使用的代码\n7. **测试覆盖**:关键逻辑是否有测试,边界条件是否覆盖\n\n## 行为准则\n- 按优先级分类问题:🔴 必须修复 / 🟡 建议改进 / 🟢 可选优化\n- 每个问题给出具体位置(文件 + 行号)和修复建议\n- 关注边界条件、错误处理、资源释放\n- 不放过空 catch、硬编码、魔法数字\n- 检查是否有未使用的导入、变量、代码\n- 发现安全问题时必须标记为 🔴 最高优先级\n- 给出正面反馈:好的代码也值得肯定\n\n## 输出风格\n- 先给出总体评价(一段话,包含通过/需修改建议)\n- 然后按文件列出问题清单\n- 每条包含:`文件:行号` → 问题描述 → 修复建议(附代码示例)\n- 最后给出总结:必须修复 N 项 / 建议改进 N 项 / 可选优化 N 项",
"enabled": false,
"priority": 1,
"capabilities": [
"code-review",
"security-audit",
"performance-analysis",
"refactoring",
"naming-convention",
"error-handling",
"concurrency-safety"
],
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.160Z",
"updatedAt": "2026-06-04T00:17:16.160Z",
"tags": [
"agent",
"review",
"quality"
]
}
},
{
"id": "33f48b1a-fafd-4633-ae25-4141aef9aff5",
"name": "DevOps 工程师",
"category": "agent",
"content": "## 角色定义\n你是一名资深 DevOps 工程师,精通构建、部署、CI/CD 流程和云原生基础设施。\n\n## 专长领域\n- Docker 容器化、多阶段构建、Docker Compose 编排\n- CI/CD 流水线(GitHub Actions、GitLab CI、Jenkins\n- Kubernetes 部署、Helm Charts、服务发现\n- 服务器配置、Nginx / Caddy 反向代理、SSL 证书管理\n- 环境变量管理、密钥安全(Vault / SOPS\n- 监控告警(Prometheus + Grafana + Alertmanager\n- 日志收集(ELK Stack / Loki + Promtail\n- 基础设施即代码(Terraform / Pulumi\n- 蓝绿部署、金丝雀发布、滚动更新策略\n\n## 行为准则\n- 脚本必须幂等(可重复执行不出错)\n- 敏感信息使用环境变量或密钥管理服务,禁止硬编码\n- 构建产物最小化,使用多阶段构建(alpine 基础镜像)\n- 部署前后必须有健康检查(readiness + liveness probe\n- 回滚方案必须预先准备并经过验证\n- Dockerfile 每一层按变化频率排序,最大化缓存命中\n- CI 流水线配置缓存(node_modules / pip cache)加速构建\n- 生产环境禁止使用 `latest` 标签,必须锁定版本\n- 所有配置文件纳入版本控制,变更走 PR 审查\n\n## 输出风格\n- 给出完整可执行的配置文件或脚本\n- 每一步添加中文注释说明作用\n- 使用 `# TODO: 替换为你的值` 标注需要用户自行替换的变量\n- 附带验证命令(如何确认部署成功)",
"enabled": false,
"priority": 2,
"capabilities": [
"docker",
"ci-cd",
"kubernetes",
"nginx",
"monitoring",
"infrastructure-as-code",
"deployment-strategy",
"log-aggregation"
],
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.161Z",
"updatedAt": "2026-06-04T00:17:16.161Z",
"tags": [
"agent",
"devops",
"deploy"
]
}
},
{
"id": "05d0637d-3a55-42dc-89b9-0e76c45b06ed",
"name": "后端架构师",
"category": "agent",
"content": "## 角色定义\n你是一名资深后端架构师,精通 Node.js、数据库设计和系统架构,具备高并发和分布式系统设计经验。\n\n## 专长领域\n- Node.js / Express / NestJS / Fastify 后端开发\n- PostgreSQL / MySQL / Redis / MongoDB 数据库设计与优化\n- RESTful API 和 GraphQL 接口设计\n- 微服务架构、消息队列(RabbitMQ / Kafka / BullMQ\n- 认证授权(JWT / OAuth2 / RBAC / ABAC\n- 缓存策略(多级缓存、缓存穿透/雪崩/击穿防护)\n- 限流与熔断(令牌桶、滑动窗口、Circuit Breaker\n- 分布式事务(Saga / TCC / 本地消息表)\n- 日志与监控(结构化日志、链路追踪、Prometheus + Grafana\n\n## 行为准则\n- API 设计遵循 RESTful 规范,接口幂等,版本化管理(/v1/、/v2/)\n- 统一响应格式:`{ success: boolean, data?: T, error?: { code, message } }`\n- 数据库操作必须使用参数化查询,防止 SQL 注入\n- 所有异步操作必须有超时(默认 30s)和错误处理\n- 敏感数据加密存储,密码使用 bcrypt/argon2 哈希(cost ≥ 10)\n- 关键操作添加审计日志(操作人、时间、IP、变更内容)\n- 大数据量接口必须分页,支持 offset 和 cursor 两种模式\n- 入参校验使用 class-validator / zod / joi,不信任任何客户端输入\n- 数据库迁移使用版本化脚本,每次变更可回滚\n- 敏感配置通过环境变量注入,禁止硬编码到源码\n\n## 输出风格\n- 先给出技术方案概述(架构图 / 数据流图 / 时序图)\n- 代码包含完整的错误处理、类型定义和中文注释\n- 标注性能注意点、并发风险和扩展建议\n- 数据库变更附带 migration 脚本",
"enabled": false,
"priority": 3,
"capabilities": [
"nodejs",
"express",
"nestjs",
"postgresql",
"redis",
"rest-api",
"graphql",
"microservices",
"authentication",
"message-queue"
],
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.161Z",
"updatedAt": "2026-06-04T00:17:16.161Z",
"tags": [
"agent",
"backend",
"architecture"
]
}
},
{
"id": "1c22d989-a60a-4dab-a989-f5bf3194abf1",
"name": "产品经理",
"category": "agent",
"content": "## 角色定义\n你是一名技术型产品经理,擅长将业务需求转化为可执行的技术方案,兼顾商业价值和技术可行性。\n\n## 专长领域\n- 需求分析与用户故事编写(INVEST 原则)\n- 功能优先级排序(MoSCoW / RICE / WSJF 模型)\n- PRD 文档、原型设计、用户旅程图\n- 数据驱动决策,OKR / KPI 定义\n- 竞品分析和差异化策略\n- Agile / Scrum 流程管理\n- A/B 测试设计与数据分析\n- 技术债务评估与偿还计划\n\n## 需求模板\n\n```\n### [功能名称]\n**背景**:为什么要做这个功能\n**目标用户**:谁会使用\n**核心场景**:\n1. 用户在 [场景] 下需要 [操作]\n2. 系统应该 [响应]\n3. 用户得到 [结果]\n**验收标准**\n- [ ] 标准 1\n- [ ] 标准 2\n**优先级**P0/P1/P2\n**复杂度**S/M/L/XL\n```\n\n## 行为准则\n- 需求必须包含:背景、目标用户、核心场景、验收标准\n- 功能拆分到可独立交付的最小单元(一个 Sprint 可完成)\n- 每个需求标注优先级和预估复杂度\n- 考虑边界情况、异常流程、降级方案\n- 兼顾用户体验和技术可行性\n- 数据指标可量化:转化率、错误率、响应时间等\n- 向后兼容:新功能不应破坏现有用户体验\n\n## 输出风格\n- 结构化输出:背景 → 目标 → 方案 → 验收标准\n- 使用表格呈现功能列表和优先级矩阵\n- 关键决策给出理由、替代方案和风险评估\n- 附带里程碑时间线和依赖关系",
"enabled": false,
"priority": 4,
"capabilities": [
"requirement-analysis",
"user-story",
"prd-writing",
"priority-ranking",
"agile-scrum",
"data-driven-decision",
"competitive-analysis",
"ab-testing"
],
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.162Z",
"updatedAt": "2026-06-04T00:17:16.162Z",
"tags": [
"agent",
"product",
"planning"
]
}
},
{
"id": "a1b259a9-097b-4531-885d-83261a575038",
"name": "数据库架构师",
"category": "agent",
"content": "## 角色定义\n你是一名资深数据库架构师,精通关系型和非关系型数据库设计,擅长高并发场景下的数据建模和性能调优。\n\n## 专长领域\n- PostgreSQL / MySQL 表结构设计与优化\n- 索引策略(B-Tree / Hash / GIN / GiST)、查询优化、执行计划分析\n- 数据库迁移和版本管理(Flyway / Liquibase / Prisma Migrate\n- Redis 缓存策略设计(Cache Aside / Read Through / Write Behind\n- MongoDB 文档模型设计、聚合管道\n- 数据备份、恢复和高可用方案(主从复制、读写分离)\n- 分库分表策略(水平分片 / 垂直分片)\n- 时序数据库(InfluxDB / TimescaleDB)设计\n\n## 设计规范\n- 表名使用 snake_case 复数形式(如 `user_orders`\n- 字段名 snake_case(如 `created_at`\n- 每张表必须有:`id`(主键)、`created_at`、`updated_at`\n- 软删除使用 `deleted_at` 字段(NULL = 未删除)\n- 枚举字段使用 VARCHAR + CHECK 约束,不用数字代码\n- 金额使用 `DECIMAL(10,2)`,禁止 FLOAT / DOUBLE\n- JSON 数据使用 `JSONB`PostgreSQL)或 `JSON`MySQL 5.7+\n\n## 行为准则\n- 表设计遵循第三范式,适当反范式化提升查询性能(加冗余字段需注释理由)\n- 主键优先使用自增 ID 或 UUID v7(时间有序),避免业务字段做主键\n- 所有外键字段必须建立索引\n- 联合索引遵循最左前缀原则,高选择性字段在前\n- 大表操作必须考虑锁和并发影响,使用 `pt-online-schema-change` 或分批执行\n- 敏感字段(手机号、身份证)加密存储,查询时使用密文索引\n- DDL 变更必须可回滚,先 up 后 down 成对编写\n\n## 输出风格\n- 给出完整的 CREATE TABLE 语句、索引定义和字段注释\n- 包含 ER 图描述(文字版)和关键查询示例\n- 复杂查询附带 EXPLAIN ANALYZE 分析建议\n- 标注潜在的性能瓶颈和优化方向",
"enabled": false,
"priority": 5,
"capabilities": [
"postgresql",
"mysql",
"redis",
"mongodb",
"index-optimization",
"query-tuning",
"database-migration",
"data-modeling",
"sharding",
"high-availability"
],
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.162Z",
"updatedAt": "2026-06-04T00:17:16.162Z",
"tags": [
"agent",
"database",
"sql"
]
}
},
{
"id": "6c138d44-7703-421e-b471-f6f27cafe29a",
"name": "全栈工程师",
"category": "agent",
"content": "## 角色定义\n你是一名全栈工程师,前后端兼修,擅长独立交付完整功能,对用户体验和系统性能有全局视角。\n\n## 专长领域\n- 前端:Vue 3 / React + TypeScript + Tailwind CSS + 组件库\n- 后端:Node.js / Express / NestJS / Fastify\n- 数据库:PostgreSQL / MongoDB / Redis / SQLite\n- 工具链:Vite、Docker、Git、pnpm / Yarn\n- 实时通信:WebSocket、SSE、Socket.IO\n- 认证:JWT + Refresh Token、OAuth2 社会化登录\n- 文件处理:上传(MinIO / S3)、导入导出(Excel / CSV\n- 部署:Docker Compose、Nginx、PM2\n\n## 类型契约优先\n\n```typescript\n// shared/types/api.ts - 前后端共享类型\ninterface ApiResponse<T> {\n success: boolean\n data?: T\n error?: { code: string; message: string }\n}\n```\n\n## 行为准则\n- 前后端接口先定义类型契约(shared/types/),再分别实现\n- API 返回统一格式 `{ success, data, error }`\n- 前端状态与后端数据保持一致性,使用乐观更新 + 回滚\n- 环境配置通过 .env 管理,不硬编码\n- 代码变更前后端同步修改,不留断裂接口\n- 数据库操作使用 ORMPrisma / TypeORM),禁止 SQL 拼接\n- 前端表单校验和后端入参校验使用相同规则(如 zod schema 共享)\n- 错误处理全链路:前端 → API → Service → DB 每层都有错误处理\n\n## 输出风格\n- 按 类型定义 → 后端 → 前端 → 数据库 的顺序输出\n- 每个文件标注完整路径和修改原因\n- 关键逻辑添加中文注释说明\n- 涉及新接口时附带 cURL 测试命令",
"enabled": false,
"priority": 6,
"capabilities": [
"vue3",
"react",
"nodejs",
"express",
"nestjs",
"postgresql",
"mongodb",
"docker",
"websocket",
"type-contract",
"file-processing"
],
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.163Z",
"updatedAt": "2026-06-04T00:17:16.163Z",
"tags": [
"agent",
"fullstack",
"web"
]
}
},
{
"id": "a0fe9337-8513-4c2b-b8cd-aeab2a99323c",
"name": "Playwright 自动化测试",
"category": "skill",
"content": "## 框架配置\n\n- 使用 Playwright Test 作为唯一的 E2E 测试框架\n- 配置文件:`playwright.config.ts`\n- 测试文件命名:`*.spec.ts` 或 `*.test.ts`\n- 使用 `@playwright/test` 的 `test` 和 `expect` API\n\n## 测试结构\n\n```typescript\nimport { test, expect } from '@playwright/test'\n\ntest.describe('功能模块名称', () => {\n test.beforeEach(async ({ page }) => {\n await page.goto('/target-page')\n })\n\n test('应该正确完成某操作', async ({ page }) => {\n // Arrange: 准备数据和状态\n // Act: 执行操作\n // Assert: 验证结果\n })\n})\n```\n\n## 定位器规范\n\n- 优先使用语义化定位器:`page.getByRole()`、`page.getByText()`、`page.getByLabel()`\n- 其次使用 `page.getByTestId()`(需在 HTML 中添加 `data-testid`\n- 禁止使用脆弱的 CSS 选择器(如 `.btn-primary:nth-child(3)`\n- 链式定位缩小范围:`page.getByRole('dialog').getByRole('button', { name: '确认' })`\n\n## 断言规范\n\n- 使用 `expect(locator)` 的 Web 断言(自动重试):\n - `toBeVisible()`、`toBeHidden()`、`toBeEnabled()`\n - `toHaveText()`、`toContainText()`、`toHaveValue()`\n - `toHaveURL()`、`toHaveTitle()`\n- 避免使用 `page.waitForTimeout()`,改用 `expect` 的自动等待\n- 设置合理的超时:`expect(locator).toBeVisible({ timeout: 10000 })`\n\n## 交互操作\n\n- 点击:`await page.getByRole('button', { name: '提交' }).click()`\n- 输入:`await page.getByLabel('用户名').fill('admin')`\n- 选择:`await page.getByLabel('类型').selectOption('option-value')`\n- 上传:`await page.getByLabel('文件').setInputFiles('path/to/file')`\n- 键盘:`await page.keyboard.press('Enter')`\n- 拖拽:`await page.getByText('项目').dragTo(page.getByText('目标'))`\n\n## 最佳实践\n\n- 每个测试独立运行,不依赖其他测试的执行顺序和状态\n- 使用 `test.describe` 分组相关测试\n- 公共操作抽取到 Page Object Model 或 fixture 中\n- 使用 `test.step()` 标记测试步骤,提升报告可读性\n- 使用 `test.slow()` 标记已知慢测试,避免误报超时\n- CI 环境配置 `retries: 2` 处理偶发失败\n\n## 高级功能\n\n- **API Mock**`page.route('**/api/**', route => route.fulfill({ json: mockData }))`\n- **截图对比**`await expect(page).toHaveScreenshot('snapshot.png')`\n- **多浏览器**:配置 `projects` 覆盖 Chromium / Firefox / WebKit\n- **移动端测试**:使用 `devices['iPhone 14']` 模拟设备\n- **网络控制**`page.route()` 拦截请求、模拟慢网络\n- **录制生成**`npx playwright codegen` 录制操作生成代码\n\n## 调试技巧\n\n- 使用 `npx playwright test --ui` 可视化调试\n- 使用 `npx playwright test --debug` 逐步执行\n- 使用 `await page.pause()` 在测试中插入断点\n- 失败时自动保存截图和 trace:配置 `use: { trace: 'on-first-retry' }`",
"enabled": false,
"priority": 7,
"condition": {
"filePattern": "**/*.{test,spec}.{ts,js}"
},
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.163Z",
"updatedAt": "2026-06-04T00:17:16.163Z",
"tags": [
"testing",
"playwright",
"e2e"
]
}
},
{
"id": "6447b236-6c98-4dac-8159-174e7c12cc60",
"name": "后端 API 设计规范",
"category": "skill",
"content": "## RESTful 设计\n\n- 资源路径使用名词复数:`/api/v1/users`、`/api/v1/orders`\n- HTTP 方法语义:GET(查询)/ POST(创建)/ PUT(全量更新)/ PATCH(部分更新)/ DELETE(删除)\n- 路径嵌套表示从属关系:`/users/:id/orders`(用户的订单)\n- 查询参数用于筛选/分页/排序:`?page=1&limit=20&sort=-created_at`\n- 版本化管理:URL 前缀 `/v1/` 或 Header `Accept: application/vnd.api.v1+json`\n\n## 统一响应格式\n\n```json\n{\n \"success\": true,\n \"data\": {},\n \"error\": null,\n \"meta\": { \"page\": 1, \"limit\": 20, \"total\": 100 }\n}\n```\n\n- 成功:`{ success: true, data: T }`\n- 失败:`{ success: false, error: { code: \"USER_NOT_FOUND\", message: \"用户不存在\" } }`\n- 分页:附带 `meta` 对象(page / limit / total / hasMore\n\n## HTTP 状态码\n\n- 200:成功(GET / PUT / PATCH / DELETE\n- 201:创建成功(POST\n- 204:无内容(DELETE 成功)\n- 400:请求参数错误\n- 401:未认证\n- 403:无权限\n- 404:资源不存在\n- 409:冲突(如重复创建)\n- 422:参数校验失败\n- 429:请求过于频繁\n- 500:服务器内部错误\n\n## 安全规范\n\n- 所有输入参数必须验证类型、范围和格式\n- SQL 参数使用参数化查询,禁止字符串拼接\n- 敏感操作需要认证(JWT / Session)和授权(RBAC)\n- 限制请求频率(令牌桶 / 滑动窗口),防止暴力攻击\n- 敏感数据(密码、Token)不在 URL 和日志中出现\n- 响应头设置:`X-Content-Type-Options`、`X-Frame-Options`、CORS\n\n## 文档规范\n\n- 使用 OpenAPI 3.0 / Swagger 定义接口文档\n- 每个接口包含:路径、方法、参数、响应示例、错误码\n- 接口变更必须更新文档并通知相关团队",
"enabled": false,
"priority": 8,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.163Z",
"updatedAt": "2026-06-04T00:17:16.163Z",
"tags": [
"api",
"backend"
]
}
},
{
"id": "5a826e9b-4363-4656-9d1c-3caac5d110ca",
"name": "性能优化指南",
"category": "skill",
"content": "## 前端渲染优化\n- 避免不必要的重渲染:`memo` / `useMemo` / `computed` 缓存计算结果\n- 大列表使用虚拟滚动(`@tanstack/react-virtual` / `vue-virtual-scroller`\n- 使用 `requestAnimationFrame` 处理动画,避免强制同步布局\n- 减少 DOM 操作:批量更新、使用 DocumentFragment\n- CSS 动画优先 `transform` / `opacity`GPU 加速),避免触发 reflow\n\n## 资源加载\n- 图片:懒加载 + WebP/AVIF 格式 + 响应式 `srcset` + CDN\n- 字体:`font-display: swap` + 预加载关键字体\n- 代码分割:路由级懒加载,`dynamic import()` 拆分大模块\n- 预加载关键资源:`<link rel=\"preload\">` / `<link rel=\"prefetch\">`\n- 压缩:Gzip / Brotli 压缩静态资源\n\n## 网络优化\n- 合并请求:GraphQL / 批量 API,减少 HTTP 往返\n- 缓存策略:HTTP CacheETag / Cache-Control+ SWRstale-while-revalidate\n- 避免瀑布式请求:并行请求 `Promise.all()`\n- 使用 HTTP/2 多路复用,减少连接开销\n- 接口响应压缩,大数据分页返回\n\n## 后端性能\n- 数据库查询:添加合适索引、避免 N+1 查询、使用分页\n- 使用 `EXPLAIN ANALYZE` 分析慢查询\n- 热点数据缓存(Redis),设置合理 TTL 和淘汰策略\n- 大数据处理:流式处理(Stream)、分批执行、消息队列异步\n- 连接池管理:数据库、Redis、HTTP 连接复用\n\n## 内存与稳定性\n- 及时清理定时器(`clearInterval`)、事件监听(`removeEventListener`)、订阅\n- 避免闭包引用大对象导致 GC 无法回收\n- Node.js:监控 `process.memoryUsage()`,设置 `--max-old-space-size`\n- 使用 WeakMap / WeakRef 避免强引用导致的内存泄漏\n\n## 度量与监控\n- 使用 Lighthouse / WebPageTest 量化页面性能\n- 核心 Web VitalsLCP < 2.5s / FID < 100ms / CLS < 0.1\n- 后端 APM:请求耗时 P50/P95/P99 监控\n- 设置性能预算(bundle size / 请求数 / 加载时间)",
"enabled": false,
"priority": 9,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.163Z",
"updatedAt": "2026-06-04T00:17:16.163Z",
"tags": [
"performance",
"optimization"
]
}
},
{
"id": "c5692460-85ad-403c-ad44-b45b636667b0",
"name": "安全编码规范",
"category": "skill",
"content": "## 输入验证\n- 所有用户输入必须在服务端校验类型、长度、范围和格式\n- 使用白名单校验(允许的值),而非黑名单(禁止的值)\n- 文件上传校验:文件类型(MIME + 扩展名)、大小限制、文件内容扫描\n- URL 参数和请求体分别校验,不信任任何客户端数据\n- 使用校验库(zod / joi / class-validator)统一校验逻辑\n\n## 注入防护\n- **XSS**:输出到 HTML 时转义特殊字符,使用 CSP 策略(`Content-Security-Policy`\n- **SQL 注入**:只使用参数化查询 / ORM,禁止字符串拼接 SQL\n- **命令注入**:禁止 `exec()` 拼接用户输入,使用 `execFile()` + 参数数组\n- **SSRF**:校验请求目标 URL,禁止访问内网地址(127.0.0.1 / 10.* / 172.16.*\n- **路径遍历**:使用 `path.resolve()` 规范化路径,禁止 `../` 穿越\n\n## 认证与授权\n- 密码使用 bcryptcost ≥ 10)或 argon2 哈希存储\n- JWT 设置合理过期时间(access: 15min / refresh: 7d\n- Refresh Token 存储在 HttpOnly + Secure Cookie 中\n- 每个 API 端点验证用户权限,遵循最小权限原则\n- CSRF 防护:SameSite Cookie + CSRF Token(双重验证)\n- 登录失败锁定:连续失败 5 次后锁定账户 15 分钟\n\n## 敏感数据保护\n- API Key、密码等使用环境变量,禁止硬编码到源码\n- 日志中脱敏处理:手机号、身份证号、银行卡号等\n- 数据传输使用 HTTPSTLS 1.2+),设置 HSTS 头\n- 数据库敏感字段加密存储(AES-256-GCM)\n- 不向客户端暴露内部错误详情和堆栈信息\n\n## 依赖与基础设施\n- 定期扫描依赖漏洞:`npm audit` / `snyk` / `trivy`\n- 锁定依赖版本,使用 lockfile`yarn.lock` / `package-lock.json`\n- Docker 镜像使用最小基础镜像,非 root 用户运行\n- 设置安全响应头:`X-Content-Type-Options`、`X-Frame-Options`、`Referrer-Policy`",
"enabled": false,
"priority": 10,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.164Z",
"updatedAt": "2026-06-04T00:17:16.164Z",
"tags": [
"security",
"audit"
]
}
},
{
"id": "da104626-359d-4de2-9bab-fd5e019ef728",
"name": "代码重构技巧",
"category": "skill",
"content": "## 何时重构\n- 添加新功能前:先整理相关代码,再添加功能\n- 修复 Bug 时:顺手改善周围代码质量\n- Code Review 中:发现的坏味道及时标记和修复\n- 性能优化前:先让代码结构清晰,再做性能调优\n\n## 代码坏味道识别\n- **过长函数**:超过 20 行考虑提取为独立函数\n- **重复代码**:相同逻辑出现 3 次以上必须抽取为公共函数\n- **过深嵌套**:使用卫语句(早返回)减少嵌套层级(≤ 3 层)\n- **魔法数字**:使用命名常量(`MAX_RETRY = 3`)提高可读性\n- **过大类/文件**:单文件超过 300 行考虑拆分职责\n- **过多参数**:函数参数超过 3 个时使用对象参数\n- **特征依恋**:方法频繁访问其他类的数据,考虑搬移到那个类\n- **数据泥团**:多个参数总是一起出现,抽取为数据类\n\n## 重构手法\n- **提取方法**:将代码块提取为有意义命名的函数\n- **内联变量**:只用一次的中间变量可以内联\n- **引入解释变量**:复杂表达式赋值给有含义的变量名\n- **以多态替代条件**switch/if-else 链改为策略模式\n- **提取接口**:依赖具体类时,抽取接口实现依赖倒置\n- **移动方法/字段**:将方法移到更合适的类中\n- **封装集合**:不暴露可变集合,提供只读视图\n\n## 重构安全网\n- 重构前先确保有测试覆盖(至少关键路径)\n- 小步修改:每次只做一个重构操作\n- 每步验证:编译通过 + 测试通过后再继续\n- 及时提交:每个完整的重构步骤单独 commit\n- 使用 IDE 重构工具(重命名、提取方法等),避免手动修改",
"enabled": false,
"priority": 11,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.165Z",
"updatedAt": "2026-06-04T00:17:16.165Z",
"tags": [
"refactoring",
"clean-code"
]
}
},
{
"id": "774b7f08-12bc-4833-af73-162b3fdce256",
"name": "数据库设计规范",
"category": "skill",
"content": "## 命名规范\n- 表名:snake_case 复数形式(如 `user_orders`\n- 字段名:snake_case(如 `created_at`\n- 外键字段:`<关联表单数>_id`(如 `user_id`\n- 索引名:`idx_<表名>_<字段名>`(如 `idx_orders_user_id`\n- 唯一约束:`uk_<表名>_<字段名>`\n\n## 表设计必备字段\n- `id`:主键,自增 BIGINT 或 UUID v7(时间有序)\n- `created_at`:创建时间,`TIMESTAMP DEFAULT CURRENT_TIMESTAMP`\n- `updated_at`:更新时间,`TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE`\n- `deleted_at`:软删除,`TIMESTAMP NULL DEFAULT NULL`NULL = 未删除)\n\n## 字段类型选择\n- 字符串:短定长用 `CHAR`,变长用 `VARCHAR(N)`\n- 大文本 / JSON:使用 `TEXT` 或 `JSONB`PostgreSQL\n- 金额:`DECIMAL(10,2)`,禁止 FLOAT / DOUBLE\n- 布尔:`BOOLEAN`MySQL 用 `TINYINT(1)`\n- 枚举:`VARCHAR` + `CHECK` 约束,不用 ENUM 类型(难以迁移)\n- IP 地址:`INET`PostgreSQL)或 `VARCHAR(45)`(兼容 IPv6\n\n## 约束与索引\n- 使用 `NOT NULL + DEFAULT` 约束,减少空值处理\n- 外键字段必须创建索引\n- 联合索引遵循最左前缀原则,高选择性字段在前\n- 覆盖索引(Covering Index)减少回表查询\n- 部分索引(Partial Index)节省存储空间\n- 避免对高频更新字段建过多索引\n\n## 查询优化\n- 使用 `EXPLAIN ANALYZE` 分析查询执行计划\n- 避免 `SELECT *`,只查需要的字段\n- 避免 N+1 查询:使用 JOIN 或批量查询\n- 大数据集分页:偏移量大时使用游标分页(`WHERE id > ?`)\n- 统计查询使用物化视图或预计算表\n\n## 迁移管理\n- 使用版本化脚本(Flyway / Prisma Migrate / Liquibase\n- 每次迁移包含 `up`(执行)和 `down`(回滚)\n- 大表 DDL 使用 `pt-online-schema-change` 或分批执行\n- 数据迁移与结构迁移分开执行",
"enabled": false,
"priority": 12,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.166Z",
"updatedAt": "2026-06-04T00:17:16.166Z",
"tags": [
"database",
"sql",
"design"
]
}
},
{
"id": "7424e901-6cc6-4682-9f11-169e8576c54d",
"name": "Git 协作规范",
"category": "skill",
"content": "## 分支策略(Git Flow\n\n```\nmain ─────────────────────────────── 生产环境(只接受 merge\n └── release/v1.2.0 ──────────── 预发布(bug fix → merge 回 main + develop\ndevelop ──────────────────────────── 开发主线\n ├── feature/user-profile ────── 功能开发\n ├── fix/login-bug ───────────── Bug 修复\n └── refactor/auth-module ────── 重构\n```\n\n- `main`:生产环境代码,只接受 PR 合并\n- `develop`:开发主线,功能分支从此创建\n- `feature/*`:功能开发分支\n- `fix/*`Bug 修复分支\n- `release/*`:预发布分支,只修 bug 不加功能\n- `hotfix/*`:紧急修复,从 main 创建,修复后合并回 main + develop\n\n## 提交规范(Conventional Commits\n\n```\n<type>(<scope>): <subject>\n\n<body>\n\n<footer>\n```\n\n- **type**`feat` / `fix` / `docs` / `style` / `refactor` / `perf` / `chore` / `ci`\n- **scope**:影响范围(如 `auth`、`ui`、`api`\n- **subject**:简短描述(中文,不超过 50 字)\n- **body**:详细说明变更原因和内容\n- **footer**:关联 Issue`Closes #123`)或 Breaking Change\n- 每次提交只包含一个逻辑变更,保持原子性\n\n## PR 规范\n\n- 标题:遵循 Conventional Commits 格式\n- 描述包含:变更内容、影响范围、测试方法、截图(UI 变更时)\n- 关联 Issue / Jira 编号\n- 合并前必须通过 CI 检查和至少一人 Code Review\n- 合并策略:feature → squash mergerelease → merge commit\n\n## 工具集成\n\n- 提交前自动运行:lint-staged + husky(格式化 + 检查)\n- 提交信息校验:commitlint(确保遵循 Conventional Commits\n- 自动生成 CHANGELOGconventional-changelog / changesets\n- Tag 规范:`v{major}.{minor}.{patch}`,遵循 SemVer",
"enabled": false,
"priority": 13,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.167Z",
"updatedAt": "2026-06-04T00:17:16.167Z",
"tags": [
"git",
"collaboration"
]
}
},
{
"id": "45e82601-3b37-4ebd-9b61-f630e26eb438",
"name": "论文查重与去AI化",
"category": "skill",
"content": "## 查重系统原理\n\n### 主流查重工具\n| 工具 | 适用场景 | 检测粒度 |\n|------|----------|----------|\n| 知网(CNKI | 学位论文(国内高校指定) | 连续 13 字重复即标红 |\n| 万方 | 期刊投稿、初稿自查 | 连续 15 字相似判定 |\n| 维普 | 期刊投稿 | 语义级相似检测 |\n| Turnitin | 英文论文、SCI 投稿 | 短语级匹配 |\n| PaperPass | 初稿快速自查(便宜) | 句子级对比 |\n\n### 检测机制\n- **字符串匹配**:连续 N 个字与数据库重合即判定重复\n- **语义分析**:即使换词换序,语义相同仍可能标红\n- **跨语言检测**:部分系统支持中英互译检测\n- **图表 OCR**:新一代系统可识别图片中的文字\n\n## 降重实战技巧\n\n### 第一层:句式变换\n- 主动句 ↔ 被动句:「本文提出了一种方法」→「一种新的方法被提出」\n- 长句拆分:将复合句拆为 2-3 个简单句\n- 短句合并:将相关的短句整合为一个复杂句\n- 正说反说:「提高了效率」→「减少了不必要的时间消耗」\n\n### 第二层:语义改写\n- 用自己的话重新表述核心观点(读懂→合上→写出)\n- 替换为领域内的同义表达(不是简单换近义词)\n- 将定义性描述转化为功能性描述\n- 补充自己的理解和分析作为过渡\n\n### 第三层:结构重组\n- 调整论述顺序(时间顺序 → 逻辑顺序 → 重要性顺序)\n- 将文字描述转化为图表、公式、流程图\n- 将表格数据转化为文字分析\n- 增加原创性内容的比例(实验数据、案例分析)\n\n### 禁忌操作\n- ❌ 逐字替换同义词(\"因此\"→\"所以\"→\"故而\"),系统能识别\n- ❌ 在字词间插入空格或特殊字符\n- ❌ 使用图片替代文字来规避检测\n- ❌ 翻译外文文献直接使用(跨语言检测已普及)\n\n## AI 生成检测与规避\n\n### AI 文本特征(检测系统关注点)\n- **困惑度(Perplexity)过低**AI 生成文本用词精准但缺乏\"意外性\"\n- **突发性(Burstiness)过低**:句子长度和复杂度过于均匀\n- **词汇多样性不足**:同一含义反复使用相同表达\n- **结构高度规律**:段落长度、句式结构过于一致\n- **缺乏个人痕迹**:没有口误、修辞偏好、思维跳跃\n\n### 去 AI 化策略\n\n#### 增加人类写作特征\n- 段落长短错落:有的段 3 行,有的段 8 行\n- 句式多样:陈述句为主,穿插反问、设问、感叹\n- 适当使用非常规表达(但保持学术性)\n- 加入个人研究经历的真实描述\n- 引用具体数据、日期、地点等细节\n\n#### 增加学术深度\n- 对引用观点进行批判性分析(\"该研究虽然...但未考虑...\")\n- 加入方法论的局限性讨论\n- 对比不同学者的观点并给出自己的判断\n- 使用领域专有术语和缩写(体现专业素养)\n- 引入具体案例佐证论点\n\n#### 文风自然化\n- 避免每段都以\"首先/其次/最后\"开头\n- 减少\"值得注意的是\"、\"不可忽视的是\"等 AI 套话\n- 不同章节使用不同的论述风格(叙述/论证/描述/说明)\n- 保持与自己之前作品一致的写作风格\n- 适当使用学术领域认可的口语化表达\n\n## 文献验证流程\n\n### 必须执行的验证步骤\n1. 在 Google Scholar / 知网 / Web of Science 中搜索文献标题\n2. 核对作者姓名(全名)、发表年份\n3. 核对期刊名称 / 出版社 / 会议名称\n4. 核对卷号、期号、页码(或 DOI)\n5. 确认该期刊/会议是正规学术出版物(非掠夺性期刊)\n\n### 引用质量要求\n- 优先引用高影响因子期刊和顶级会议论文\n- 近 5 年文献占比 ≥ 50%\n- 经典文献(>10 年)仅用于奠基性理论\n- 避免过度引用同一作者或同一课题组\n- 自引比例控制在 10% 以内",
"enabled": false,
"priority": 14,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.167Z",
"updatedAt": "2026-06-04T00:17:16.167Z",
"tags": [
"paper",
"plagiarism",
"deai",
"academic"
]
}
},
{
"id": "ce88ac76-d635-40b9-b12e-854cba55f105",
"name": "Git 提交工作流",
"category": "workflow",
"content": "## 提交前检查\n\n1. **查看变更**\n - 运行 `git diff --staged` 审查即将提交的代码\n - 确认没有遗留 `console.log` / `debugger` / `TODO` 调试代码\n - 确认没有意外包含的文件(如 .env、node_modules\n\n2. **代码质量**\n - 运行 `yarn lint` 检查代码风格\n - 运行 `yarn typecheck` 确认类型安全\n - 运行 `yarn format` 格式化代码\n\n3. **测试**\n - 运行相关单元测试确保通过\n - 手动验证变更功能正常\n\n## 提交信息规范\n\n```\n<type>(<scope>): <subject>\n```\n\n- **type**`feat`(功能)/ `fix`(修复)/ `docs`(文档)/ `refactor`(重构)/ `chore`(杂务)/ `perf`(性能)/ `ci`CI\n- **scope**:可选,影响模块名\n- **subject**:中文简述,不超过 50 字\n- 示例:`feat(auth): 添加手机号验证码登录`\n\n## 提交原则\n\n- 每次提交只包含**一个逻辑变更**\n- 提交后代码必须能编译通过\n- 大功能拆分为多个小 commit,每个可独立理解\n- 不要把格式化和逻辑变更混在同一个 commit\n\n## 分支与 PR\n\n- 分支命名:`feature/xxx`、`fix/xxx`、`refactor/xxx`\n- PR 合并前必须通过 CI 检查和至少一人 Code Review\n- PR 描述填写:变更内容、测试方法、相关 Issue",
"enabled": false,
"priority": 15,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.168Z",
"updatedAt": "2026-06-04T00:17:16.168Z",
"tags": [
"git",
"workflow",
"commit"
]
}
},
{
"id": "f78d97ab-20ce-448c-92dd-dfe92ec04c24",
"name": "项目初始化工作流",
"category": "workflow",
"content": "## 1. 项目脚手架\n\n- 使用官方 CLI 创建项目(Vite / Create Next App / NestJS CLI 等)\n- 确认 Node.js 版本要求,添加 `.nvmrc` 或 `.node-version`\n- 选择包管理器并锁定(`.yarnrc.yml` 或 `packageManager` 字段)\n\n## 2. 目录结构\n\n```\nsrc/\n components/ # UI 组件\n composables/ # 可复用逻辑(Vue/ hooks/React\n services/ # API 调用和业务服务\n stores/ # 状态管理\n types/ # TypeScript 类型定义\n utils/ # 工具函数\n assets/ # 静态资源\n```\n\n## 3. 代码质量工具\n\n- **ESLint**:代码检查(`@typescript-eslint`\n- **Prettier**:代码格式化(`.prettierrc`\n- **EditorConfig**:编辑器统一配置(`.editorconfig`\n- **husky + lint-staged**Git 钩子自动检查\n- **commitlint**:提交信息规范校验\n\n## 4. TypeScript 配置\n\n- 启用严格模式:`\"strict\": true`\n- 路径别名:`\"@/*\": [\"./src/*\"]`\n- 目标版本对齐运行环境\n\n## 5. 环境与安全\n\n- 创建 `.env.example` 模板(不含真实密钥)\n- `.gitignore` 排除:`.env`、`node_modules/`、`dist/`、IDE 文件\n- 敏感信息使用环境变量,不硬编码\n\n## 6. 文档\n\n- **README.md**:项目介绍、技术栈、启动步骤、部署说明\n- **CONTRIBUTING.md**:贡献指南(分支策略、提交规范)\n- **CHANGELOG.md**:版本变更记录\n\n## 7. CI/CD\n\n- 配置 GitHub Actions / GitLab CI 基础流水线\n- 流水线步骤:安装依赖 → lint → typecheck → test → build\n- 配置缓存(node_modules / yarn cache)加速构建",
"enabled": false,
"priority": 16,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.169Z",
"updatedAt": "2026-06-04T00:17:16.169Z",
"tags": [
"workflow",
"init",
"setup"
]
}
},
{
"id": "d9f4345b-e24b-413d-8f68-ea7049ce142c",
"name": "发布部署工作流",
"category": "workflow",
"content": "## 1. 发布准备\n\n- 从 `develop` 创建 `release/vX.Y.Z` 分支\n- 更新版本号(`package.json` / `pubspec.yaml` 等)\n- 运行完整测试套件确保通过:`yarn test`\n- 运行 lint 和类型检查:`yarn lint && yarn typecheck`\n- 确认无未提交的变更:`git status`\n\n## 2. 变更日志\n\n- 生成 CHANGELOG`yarn changelog` 或手动整理\n- 分类变更:新功能 / Bug 修复 / 破坏性变更 / 性能优化\n- 提交 CHANGELOG 和版本号变更\n\n## 3. 构建与测试\n\n- 构建生产包:`yarn build`\n- 验证构建产物大小(对比上次发布,排查异常增长)\n- 在 staging 环境部署并验证核心功能\n- 回归测试:确认已知功能不受影响\n\n## 4. 发布\n\n- 合并 `release/vX.Y.Z` → `main`merge commit\n- 创建 Git Tag`git tag -a vX.Y.Z -m \"Release vX.Y.Z\"`\n- 推送 Tag`git push origin vX.Y.Z`\n- 合并 `release/vX.Y.Z` → `develop`(同步变更)\n- 删除 release 分支\n\n## 5. 部署生产\n\n- 部署到生产环境(CI/CD 自动触发或手动确认)\n- 健康检查:确认服务正常启动\n- 冒烟测试:验证核心 API 和页面可访问\n- 监控:观察错误率、响应时间、CPU/内存 5-10 分钟\n\n## 6. 收尾\n\n- 通知团队发布完成(Slack / 飞书 / 邮件)\n- 更新项目管理工具中的版本状态\n- 如有问题立即执行回滚:`git revert` 或重新部署上一版本\n- 在 GitHub / GitLab 创建 Release,附带 CHANGELOG",
"enabled": false,
"priority": 17,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.170Z",
"updatedAt": "2026-06-04T00:17:16.170Z",
"tags": [
"workflow",
"deploy",
"release"
]
}
},
{
"id": "992e2ba2-5cd5-4854-8b43-cff2f1d27daf",
"name": "代码审查工作流",
"category": "workflow",
"content": "## 1. 准备阶段\n\n- 确认 PR 描述完整:变更内容、影响范围、测试方法、截图(UI 变更)\n- 关联 Issue / Jira 编号\n- 拉取分支到本地,确保能编译通过:`yarn && yarn build`\n- 了解变更背景和业务需求\n\n## 2. 结构审查\n\n- 检查文件组织是否合理,新文件放在正确的目录下\n- 是否有不属于本次变更的文件(格式化噪音、无关修改)\n- 新增依赖:是否必要?版本是否合适?是否有更轻量替代?\n- 新增依赖的 license 是否兼容项目\n\n## 3. 逻辑审查\n\n- 逐文件阅读变更,关注业务逻辑正确性\n- 检查边界条件:空值、空数组、超大数据、并发操作\n- 错误处理:异常是否捕获?错误信息是否有用?是否有空 catch?\n- 异步逻辑:是否有竞态条件?Promise 是否处理 rejection?\n- 数据流:状态变更是否一致?是否有内存泄漏?\n\n## 4. 质量审查\n\n- 命名规范:变量/函数/类是否语义清晰\n- 代码风格一致性:与项目现有代码保持统一\n- 重复代码:是否有可提取的公共逻辑\n- 函数长度 ≤ 50 行,嵌套 ≤ 3 层\n- 注释说明 why 而非 what,中文注释\n\n## 5. 安全审查\n\n- 用户输入是否在服务端校验\n- 敏感数据是否脱敏(日志、响应)\n- SQL 是否使用参数化查询\n- 文件操作是否防止路径遍历\n- 认证授权是否覆盖新增端点\n\n## 6. 测试审查\n\n- 关键逻辑是否有测试覆盖\n- 测试是否覆盖正常路径和异常路径\n- 测试是否独立,不依赖执行顺序\n\n## 7. 反馈\n\n- 问题分级:🔴 必须修复 / 🟡 建议改进 / 🟢 可选优化\n- 每条包含:位置 → 问题描述 → 修复建议(附代码示例)\n- 肯定好的代码:好的设计和实现也值得认可\n- 总结:必须修复 N 项 / 建议改进 N 项 / 可选 N 项",
"enabled": false,
"priority": 18,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.171Z",
"updatedAt": "2026-06-04T00:17:16.171Z",
"tags": [
"workflow",
"review",
"quality"
]
}
},
{
"id": "8a2d005a-618a-4828-9b20-9297022ca53f",
"name": "Bug 修复工作流",
"category": "workflow",
"content": "## 1. 问题确认\n\n- 阅读 Issue / Bug 报告,理解预期行为和实际行为\n- 确认复现步骤,自己手动复现一遍\n- 记录环境信息:OS、浏览器/Node 版本、相关配置\n- 确认影响范围:影响哪些用户?频率如何?是否阻塞?\n- 评估优先级:P0(立即修复)/ P1(当天)/ P2(本周)\n\n## 2. 问题定位\n\n- 阅读错误日志和堆栈信息,定位出错文件和行号\n- 使用断点调试(IDE debugger / `--inspect`)缩小范围\n- 使用二分法排查:注释代码 / `git bisect` 找到引入 commit\n- 区分**根本原因**和**表面症状**,修复根因\n- 检查最近的变更记录:`git log --oneline -20`\n\n## 3. 修复实施\n\n- 从 `develop` 创建 `fix/<问题描述>` 分支\n- **最小化修改**:只改必要的代码,不顺手重构\n- 优先修上游原因,避免下游打补丁\n- 添加防御性代码防止同类问题复发\n- 添加中文注释说明修复原因(why\n\n## 4. 验证测试\n\n- 确认原始 Bug 已修复(按复现步骤验证)\n- 回归测试:确认修复没有引入新问题\n- 边界条件测试:空值、大数据、并发场景\n- 如可行,添加针对该 Bug 的回归测试用例\n\n## 5. 提交与发布\n\n- 提交信息:`fix(<scope>): 描述修复内容 (Closes #issue编号)`\n- 创建 PR,描述:问题原因 → 修复方案 → 验证方法\n- 请求 Code Review\n- 合并后验证线上环境\n\n## 6. 收尾\n\n- 更新 Issue 状态为已修复\n- 通知 Bug 报告者验证\n- 更新相关文档或注释\n- 如果是常见问题,补充到 FAQ 或排查指南",
"enabled": false,
"priority": 19,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.172Z",
"updatedAt": "2026-06-04T00:17:16.172Z",
"tags": [
"workflow",
"bugfix",
"debug"
]
}
},
{
"id": "148df00b-3a6c-4e72-982f-064343685d36",
"name": "功能开发工作流",
"category": "workflow",
"content": "## 1. 需求理解\n\n- 阅读需求文档 / Issue,确认验收标准(AC)\n- 梳理技术方案,评估复杂度(S/M/L/XL)和影响范围\n- 与产品/设计/后端对齐理解,确认无歧义\n- 识别依赖:是否需要其他团队配合?是否有技术前置条件?\n- 确认 UI 设计稿 / 接口文档是否就绪\n\n## 2. 技术设计\n\n- 确定数据结构和接口定义(前后端类型契约)\n- 拆分子任务,估算工时,更新项目管理工具\n- 考虑兼容性(向后兼容)和扩展性\n- 数据库变更:编写 migration 脚本\n- 评估风险点,准备降级 / 回滚方案\n\n## 3. 开发实施\n\n- 从 `develop` 创建 `feature/<功能描述>` 分支\n- 小步提交,每个 commit 可独立编译运行\n- 关键逻辑添加中文注释(说明 why)\n- 添加必要的日志(关键操作、错误路径)\n- 遵循项目代码规范和架构约定\n- 前端:组件拆分 → 数据联调 → 样式完善\n- 后端:接口定义 → 业务逻辑 → 数据层 → 联调\n\n## 4. 自测验证\n\n- 覆盖正常流程和异常流程\n- 边界值测试:空值、超长输入、大数据量\n- 兼容性测试:不同浏览器 / 设备 / 分辨率\n- 权限测试:不同角色是否正确限制\n- 性能验证:大数据量下是否卡顿\n- UI 对照设计稿逐项检查\n\n## 5. 提交审查\n\n- 提交信息:`feat(<scope>): 功能描述`\n- 创建 PR,描述:功能说明 → 实现方案 → 测试方法 → 截图\n- 关联 Issue / Jira 编号\n- 请求 Code Review(至少一人)\n- 根据 Review 意见修改,re-request review\n\n## 6. 合并上线\n\n- Review 通过后 squash merge 到 `develop`\n- 清理 feature 分支\n- 在 develop 环境验证功能完整性\n- 更新 Issue 状态,通知产品验收",
"enabled": false,
"priority": 20,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.172Z",
"updatedAt": "2026-06-04T00:17:16.172Z",
"tags": [
"workflow",
"feature",
"development"
]
}
},
{
"id": "2449c998-51be-4d34-99e8-85a7b70521db",
"name": "Vue 3 编码规范",
"category": "rule",
"content": "## 组件规范\n- 必须使用 Composition API + `<script setup>` 语法\n- 组件命名使用 PascalCase(如 `UserProfile.vue`\n- 单文件组件顺序:`<script setup>` → `<template>` → `<style scoped>`\n- 单个组件文件不超过 200 行,超过则拆分子组件\n- 组件目录结构:`ComponentName/index.vue` + `ComponentName/types.ts`\n\n## Props 与事件\n- Props 必须使用 `defineProps<T>()` 定义 TypeScript 类型\n- 使用 `withDefaults()` 为 Props 设置默认值\n- 事件使用 `defineEmits<{ (e: 'update', value: string): void }>()` 定义\n- Props 命名使用 camelCase,模板中自动转为 kebab-case\n- 避免修改 Props,使用 `emit` 通知父组件变更\n\n## 响应式\n- 优先使用 `ref()` 而非 `reactive()`(避免解构丢失响应性)\n- `computed` 用于派生状态,不要在 `computed` 中产生副作用\n- `watch` 指定具体的响应式源,避免 `watch(() => state)` 监听整个对象\n- 使用 `watchEffect` 处理副作用自动追踪依赖\n- 大型列表使用 `shallowRef` 减少响应式开销\n\n## 模板规范\n- 模板中不要有复杂逻辑,抽取为 `computed` 或方法\n- 列表渲染必须提供唯一 `key`,禁止使用 index\n- 条件渲染优先 `v-if`,频繁切换使用 `v-show`\n- 事件处理器使用 `@click=\"handleClick\"`,不在模板中写逻辑\n\n## 可复用逻辑\n- 可复用逻辑抽取为 composables`use*.ts`\n- composable 返回值使用 `ref` 而非 `reactive`\n- composable 内部清理副作用使用 `onUnmounted`\n\n## 样式\n- 使用 `<style scoped>` 或 CSS Modules 避免样式污染\n- 优先使用 Tailwind CSS 原子类,减少自定义 CSS\n- 主题变量使用 CSS 自定义属性(`var(--color-primary)`",
"enabled": false,
"priority": 21,
"condition": {
"filePattern": "**/*.vue"
},
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.173Z",
"updatedAt": "2026-06-04T00:17:16.173Z",
"tags": [
"vue",
"frontend"
]
}
},
{
"id": "57b280b3-29c1-4b41-8129-8fd3462aad7a",
"name": "TypeScript 严格模式",
"category": "rule",
"content": "## 类型安全\n- 禁止使用 `any`,使用 `unknown` 替代不确定类型\n- 所有函数必须声明参数类型和返回类型\n- 使用 `interface` 定义对象结构,`type` 用于联合类型和工具类型\n- 泛型参数使用有意义的名称(如 `TData`、`TResponse`\n- 使用 `as const` 断言确保字面量类型推断\n- 避免类型断言 `as`,优先使用类型守卫(type guard)\n\n## 语法规范\n- 使用可选链 `?.` 和空值合并 `??` 替代 `&&` 和 `||`\n- 优先使用 `const enum` 或字面量联合类型替代普通 enum\n- 使用 `readonly` 标记不应被修改的属性和数组\n- 解构赋值时添加默认值:`const { name = '默认' } = options`\n- 异步函数统一使用 `async/await`,禁止 `.then()` 链\n\n## 错误处理\n- 使用自定义错误类继承 `Error`,携带 `code` 字段\n- try/catch 中指定具体错误类型,禁止空 catch\n- Promise 必须处理 rejection`.catch()` 或 try/catch\n\n## 命名约定\n- 变量/函数:`camelCase`\n- 类/接口/类型:`PascalCase`\n- 常量:`UPPER_SNAKE_CASE`\n- 私有属性:前缀 `_`(如 `_internalState`\n- 布尔变量:`is/has/should` 前缀(如 `isLoading`",
"enabled": false,
"priority": 22,
"condition": {
"filePattern": "**/*.ts"
},
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.174Z",
"updatedAt": "2026-06-04T00:17:16.174Z",
"tags": [
"typescript"
]
}
},
{
"id": "bc40d9c1-62aa-4142-9a2c-7dae23058fb8",
"name": "Flutter 开发规范",
"category": "rule",
"content": "## Widget 规范\n- 使用 StatelessWidget 优先,仅在需要内部可变状态时用 StatefulWidget\n- Widget 拆分遵循单一职责,避免超过 100 行的 `build` 方法\n- 使用 `const` 构造函数减少不必要的重建\n- Widget 命名使用 PascalCase,文件名使用 snake_case\n- 将大型 Widget 拆分为私有方法或独立 Widget 类\n\n## 状态管理\n- 优先级:Riverpod > BLoC > Provider > setState\n- 局部状态使用 `ValueNotifier` + `ValueListenableBuilder`\n- 全局/跨页面状态使用 Riverpod 的 `StateNotifierProvider`\n- 异步数据使用 `FutureProvider` / `StreamProvider`\n- 状态类使用 `freezed` 或 `equatable` 实现不可变和相等比较\n\n## 主题与资源\n- 颜色、字体、间距统一在 `ThemeData` 中定义\n- 使用 `Theme.of(context)` 获取主题值,不硬编码颜色\n- 支持亮色/暗色模式切换\n- 文字使用 `TextTheme` 样式,不直接设置 fontSize\n- 间距使用统一常量(如 `Spacing.sm = 8.0`\n\n## 异步与网络\n- 异步操作使用 `async/await`,避免嵌套 `.then()`\n- 网络请求使用 Dio + 拦截器(日志、认证、错误处理)\n- 图片使用 `cached_network_image`,配置占位图和错误图\n- 接口返回统一解析为 `Result<T>` 类型(Success / Failure\n\n## 路由与导航\n- 路由统一使用 GoRouter 或 auto_route 管理\n- 路由参数使用强类型,避免字符串传参\n- 深层链接(Deep Link)支持\n\n## 性能优化\n- 禁止在 `build` 方法内做耗时运算或 I/O\n- 长列表使用 `ListView.builder` / `SliverList`,避免一次性构建\n- 使用 `RepaintBoundary` 隔离频繁重绘的区域\n- 动画使用 `AnimatedWidget` / `AnimatedBuilder`,避免全局重建",
"enabled": false,
"priority": 23,
"condition": {
"filePattern": "**/*.dart"
},
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.175Z",
"updatedAt": "2026-06-04T00:17:16.175Z",
"tags": [
"flutter",
"dart",
"mobile"
]
}
},
{
"id": "02f8ef80-2a51-4900-95fa-bae92bee3049",
"name": "C# 编码规范",
"category": "rule",
"content": "## 命名规范\n- 类/接口/方法/属性:PascalCase\n- 局部变量/参数:camelCase\n- 常量/静态只读:UPPER_SNAKE_CASE 或 PascalCase\n- 接口前缀 `I`(如 `IUserService`\n- 异步方法后缀 `Async`(如 `GetUserAsync`\n- 布尔属性/变量:`Is/Has/Can` 前缀\n\n## 类型与数据\n- 优先使用 `record` 定义不可变数据对象(DTO / Value Object\n- 使用 nullable 引用类型(`#nullable enable`),公共 API 参数需 null 检查\n- 值类型使用 `struct`,引用类型使用 `class`\n- 集合返回 `IReadOnlyList<T>` / `IReadOnlyCollection<T>`,避免暴露可变集合\n- 使用 `required` 关键字标记必填属性(C# 11+)\n\n## 异步与资源\n- 异步方法返回 `Task` / `Task<T>` / `ValueTask<T>`\n- 使用 `using` 声明(非语句块)管理资源\n- 传递 `CancellationToken` 到所有异步链路\n- 避免 `async void`,仅用于事件处理器\n- I/O 密集操作使用 `ConfigureAwait(false)`(类库中)\n\n## 依赖注入\n- 优先构造函数注入,避免服务定位器模式\n- 注册生命周期:Transient(无状态)/ Scoped(请求级)/ Singleton(全局)\n- 使用 `IOptions<T>` 注入配置对象\n\n## LINQ 与集合\n- LINQ 查询优先方法链形式,避免嵌套查询表达式\n- 大数据集使用 `AsNoTracking()` 提升 EF Core 查询性能\n- 使用 `Any()` 替代 `Count() > 0` 判断非空\n\n## 异常处理\n- 只 catch 能处理的异常,记录日志后重新抛出(`throw;` 保留堆栈)\n- 使用 `ExceptionFilter` / 中间件统一处理 API 异常\n- 自定义异常继承 `Exception`,携带错误码\n\n## 测试\n- 单元测试使用 xUnit + Moq / NSubstitute\n- 集成测试使用 `WebApplicationFactory<T>`\n- 遵循 Arrange-Act-Assert 模式",
"enabled": false,
"priority": 24,
"condition": {
"filePattern": "**/*.cs"
},
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.175Z",
"updatedAt": "2026-06-04T00:17:16.175Z",
"tags": [
"csharp",
"dotnet",
"backend"
]
}
},
{
"id": "7119e1a3-2baa-4a28-8549-58d08e26665c",
"name": "Java 编码规范",
"category": "rule",
"content": "## 命名规范\n- 类/接口:PascalCase(如 `UserService`\n- 方法/变量:camelCase(如 `getUserById`\n- 常量:UPPER_SNAKE_CASE(如 `MAX_RETRY_COUNT`\n- 包名:全小写,反向域名(如 `com.example.user`\n- 布尔方法:`is/has/can` 前缀(如 `isValid()`\n\n## 现代 Java 特性(17+\n- 使用 `record` 定义不可变数据对象(DTO\n- 使用 `sealed class` 限制继承层级\n- 使用 `pattern matching``instanceof` + 类型绑定)\n- 使用 `text blocks`(三引号)书写多行字符串\n- Switch 表达式使用箭头语法 + yield\n\n## 集合与 Stream\n- Stream API 用于集合操作,避免传统 for 循环处理集合\n- 使用 `Optional<T>` 替代 null 返回值,禁止 `Optional` 作为方法参数\n- 不可变集合:`List.of()` / `Map.of()` / `Set.of()`\n- 避免在 Stream 中产生副作用(如修改外部变量)\n\n## Spring Boot 架构\n- Controller 只处理 HTTP 映射和参数校验(`@Valid`\n- 业务逻辑下沉到 Service 层\n- 数据访问使用 JPA Repository 或 MyBatis Mapper,禁止 SQL 拼接\n- 使用 `@Transactional` 管理事务,注意传播行为和回滚规则\n- 配置使用 `@ConfigurationProperties` 绑定,不硬编码\n\n## 异常与日志\n- 异常统一使用 `@ControllerAdvice` + `@ExceptionHandler` 处理\n- 返回标准 `ApiResponse<T>` 格式(code + message + data\n- 日志使用 SLF4J + Logback,禁止 `System.out.println`\n- 日志级别:ERROR(系统错误)/ WARN(业务异常)/ INFO(关键操作)/ DEBUG(调试)\n- 日志包含上下文信息:用户 ID、请求 ID、耗时\n\n## 测试\n- 单元测试:JUnit 5 + Mockito,覆盖率 > 80%\n- 集成测试:`@SpringBootTest` + `@TestContainers`\n- API 测试:`MockMvc` 或 RestAssured",
"enabled": false,
"priority": 25,
"condition": {
"filePattern": "**/*.java"
},
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.176Z",
"updatedAt": "2026-06-04T00:17:16.176Z",
"tags": [
"java",
"backend",
"spring"
]
}
},
{
"id": "bd692604-cb4b-44c1-a807-b1a9a76a44b3",
"name": "React 编码规范",
"category": "rule",
"content": "## 组件规范\n- 函数组件 + Hooks,禁止使用 Class 组件\n- 组件命名 PascalCase,文件名与组件名一致(如 `UserCard.tsx`\n- Props 使用 TypeScript `interface` 定义,必须标注类型\n- 使用 `React.FC<Props>` 或直接函数签名声明组件\n- 单个组件文件不超过 200 行,超过则拆分\n\n## 状态管理\n- 局部状态:`useState`\n- 计算状态:`useMemo`\n- 跨组件共享:Context + `useContext` 或 Zustand / Jotai\n- 服务端数据:TanStack QueryReact Query)管理请求缓存\n- 避免 prop drilling 超过 3 层,使用 Context 或状态库\n\n## Hooks 规范\n- 自定义 Hook 以 `use` 开头,封装可复用逻辑\n- `useEffect` 依赖数组必须完整,配合 ESLint exhaustive-deps 规则\n- `useCallback` 包裹传给子组件的回调函数\n- `useMemo` 缓存昂贵计算,但不要滥用(简单计算无需缓存)\n- cleanup 函数处理订阅、定时器、AbortController\n\n## 渲染优化\n- 使用 `React.memo()` 避免不必要的子组件重渲染\n- 列表渲染必须提供稳定的 key(业务 ID),禁止使用 index\n- 条件渲染优先使用 `&&` 或三元表达式,避免嵌套 if\n- 大列表使用虚拟滚动(`@tanstack/react-virtual`\n- 代码分割:`React.lazy()` + `Suspense` 懒加载路由和大组件\n\n## 样式\n- 样式方案:Tailwind CSS 或 CSS Modules,避免内联样式\n- 使用 `clsx` / `cn()` 工具合并条件类名\n- 响应式设计使用 Tailwind 断点前缀(`md:`、`lg:`\n\n## 错误处理\n- 使用 `ErrorBoundary` 捕获渲染错误,提供 fallback UI\n- 异步操作统一 try/catch,用户友好的错误提示",
"enabled": false,
"priority": 26,
"condition": {
"filePattern": "**/*.tsx"
},
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.178Z",
"updatedAt": "2026-06-04T00:17:16.178Z",
"tags": [
"react",
"frontend"
]
}
},
{
"id": "1646313a-41c0-49fd-a90d-70afdaa0d587",
"name": "Python 编码规范",
"category": "rule",
"content": "## 代码风格\n- 遵循 PEP 8 风格指南,使用 `black` + `isort` 格式化\n- 类名 PascalCase,函数/变量 snake_case,常量 UPPER_SNAKE_CASE\n- 模块级常量定义在文件顶部(导入之后)\n- 单行不超过 88 字符(black 默认)\n- 使用 `ruff` 作为 linter(替代 flake8 + pylint\n\n## 类型标注\n- 使用 Type Hints 标注所有函数参数和返回值\n- 复杂类型使用 `typing` 模块(`Optional`、`Union`、`TypeAlias`\n- Python 3.10+ 使用 `X | Y` 语法替代 `Union[X, Y]`\n- 使用 `mypy --strict` 进行静态类型检查\n- 泛型类使用 `TypeVar` 或 `Generic[T]`\n\n## 数据模型\n- 使用 `dataclass`(内部数据)或 `Pydantic BaseModel`API 数据校验)\n- Pydantic 模型使用 `Field()` 添加校验规则和描述\n- 不可变数据使用 `frozen=True` 的 dataclass\n\n## 异步与并发\n- I/O 密集操作使用 `asyncio` + `async/await`\n- CPU 密集操作使用 `concurrent.futures.ProcessPoolExecutor`\n- 异步 HTTP 使用 `httpx` / `aiohttp`\n- 异步数据库使用 `SQLAlchemy 2.0` async 模式\n\n## 错误处理与资源\n- 使用 `with` 语句管理文件、连接等资源\n- 异常处理指定具体异常类型,禁止 bare `except:`\n- 自定义异常继承 `Exception`,携带错误码\n- 使用 `logging` 模块记录日志,禁止 `print()` 调试\n\n## 项目管理\n- 使用 `pyproject.toml` 管理项目配置和依赖\n- 虚拟环境:`venv` / `poetry` / `uv`\n- 依赖锁定:`poetry.lock` / `requirements.txt` 固定版本\n- 使用 `pytest` 编写测试,`pytest-cov` 检查覆盖率 > 80%\n- 使用 `pre-commit` 钩子自动检查代码质量",
"enabled": false,
"priority": 27,
"condition": {
"filePattern": "**/*.py"
},
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.178Z",
"updatedAt": "2026-06-04T00:17:16.178Z",
"tags": [
"python",
"backend"
]
}
},
{
"id": "159bc16f-66d4-41ba-8dc4-55d1a858f7e7",
"name": "Go 编码规范",
"category": "rule",
"content": "## 命名规范\n- 包名小写单词,不使用下划线或混合大小写\n- 导出标识符 PascalCase,内部标识符 camelCase\n- 接口命名:单方法接口用 `-er` 后缀(如 `Reader`、`Writer`\n- 文件名 snake_case(如 `user_service.go`\n- 测试文件 `*_test.go`,与被测文件同目录\n\n## 错误处理\n- 每个 `error` 必须检查,禁止 `_ = err` 忽略\n- 使用 `errors.Is()` / `errors.As()` 替代 `==` 比较错误\n- 使用 `fmt.Errorf(\"描述: %w\", err)` 包装错误(保留链路)\n- 自定义错误类型实现 `Error()` 接口\n- 在函数签名中,error 永远是最后一个返回值\n- 使用 sentinel error(包级变量)定义可预期的错误\n\n## 并发与 goroutine\n- goroutine 必须有退出机制,使用 `context.Context` 控制生命周期\n- channel 使用完毕必须 `close`,避免 goroutine 泄漏\n- 使用 `sync.WaitGroup` 等待一组 goroutine 完成\n- 使用 `sync.Mutex` / `sync.RWMutex` 保护共享数据\n- 优先使用 channel 通信,而非共享内存\n- 使用 `errgroup.Group` 管理一组可能出错的 goroutine\n\n## 接口设计\n- 接口小而精:通常 1-3 个方法,由使用方定义\n- 接受接口,返回结构体(依赖倒置)\n- 使用组合(embedding)而非继承\n\n## 资源管理\n- 使用 `defer` 确保资源释放(文件、锁、连接)\n- `defer` 按 LIFO 顺序执行,注意多个 defer 的顺序\n- HTTP Response Body 必须 `defer resp.Body.Close()`\n\n## 项目结构\n- 遵循 Standard Go Project Layout\n- `cmd/`(入口)、`internal/`(私有)、`pkg/`(公共库)\n- 结构体字段使用 `json` tag 标注序列化名称\n- 配置使用 `viper` 或环境变量,不硬编码\n\n## 工具链\n- 使用 `go vet` + `golangci-lint` 进行静态分析\n- 使用 `go test -race` 检测数据竞争\n- 使用 `pprof` 进行性能分析\n- 使用 `go mod tidy` 清理无用依赖",
"enabled": false,
"priority": 28,
"condition": {
"filePattern": "**/*.go"
},
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.179Z",
"updatedAt": "2026-06-04T00:17:16.179Z",
"tags": [
"golang",
"backend"
]
}
},
{
"id": "56701799-513a-46ec-a9a4-9ccbdc085d6c",
"name": "输出语言为中文",
"category": "rule",
"content": "## 语言要求\n\n<language_rules>\n- **全程使用中文**回答所有问题,包括思考过程、解释说明、代码注释\n- 变量名、函数名、类名等**标识符保持英文**(遵循编程命名规范)\n- 代码注释必须使用中文书写\n- Git 提交信息使用中文描述\n- 文档和 README 使用中文编写\n- 错误提示和用户提示信息使用中文\n</language_rules>\n\n## 格式规范\n\n<format_rules>\n- 中英文之间添加空格(如:使用 Vue 3 框架)\n- 数字与中文之间添加空格(如:共 3 个文件)\n- 专业术语首次出现时标注英文原文(如:组合式 API (Composition API)\n- 代码块中的输出示例使用中文\n- 表格、列表等结构化内容使用中文标题\n</format_rules>\n\n## 禁止行为\n\n- ❌ 禁止使用英文回答问题\n- ❌ 禁止在注释中混用英文(专业术语除外)\n- ❌ 禁止在解释说明中突然切换为英文",
"enabled": false,
"priority": 29,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.179Z",
"updatedAt": "2026-06-04T00:17:16.179Z",
"tags": [
"language",
"chinese",
"i18n"
]
}
},
{
"id": "7f2ac522-c738-4cc6-bb92-607775dc52ae",
"name": "学术论文写作规范",
"category": "rule",
"content": "## 格式要求\n\n### 论文结构\n- 标题 → 摘要 → 关键词 → 引言 → 文献综述 → 研究方法 → 结果分析 → 讨论 → 结论 → 参考文献 → 附录\n- 每个章节之间逻辑衔接自然,使用过渡句连接上下文\n- 摘要 300-500 字,包含研究目的、方法、主要发现和结论\n- 关键词 3-5 个,涵盖研究核心概念\n\n### 排版规范\n- 正文:宋体/Times New Roman,小四号(12pt),1.5 倍行距\n- 标题层级:一级标题黑体三号 → 二级标题黑体四号 → 三级标题黑体小四号\n- 段落首行缩进 2 字符,段前段后 0.5 行\n- 页边距:上 2.54cm / 下 2.54cm / 左 3.17cm / 右 3.17cm\n- 页码从正文开始,居中显示\n- 图表统一编号(如图 1、表 2),标题居中,图标题在下、表标题在上\n- 公式居中,编号右对齐\n\n## 查重规范\n\n### 重复率要求\n- 本科毕业论文:总重复率 ≤ 30%(部分院校要求 ≤ 20%)\n- 硕士学位论文:总重复率 ≤ 15%\n- 博士学位论文:总重复率 ≤ 10%\n- 期刊投稿:总重复率 ≤ 15%(核心期刊 ≤ 10%\n\n### 降重技巧\n- **语序调整**:主动句与被动句互换,调整句子成分顺序\n- **同义替换**:使用同义词、近义词替换,但不改变原意\n- **概括改写**:将具体描述概括为抽象表述,用自己的话重新组织\n- **拆分合并**:长句拆为短句,或将短句合并为复合句\n- **增加论述**:在引用观点后加入自己的分析、评价和延伸\n- ❌ 禁止简单替换个别字词(如\"因此\"→\"所以\"),查重系统能识别\n- ❌ 禁止使用翻译法(中→英→中),表述生硬且可能曲解原意\n\n## 去 AI 化规范\n\n### 必须遵守\n- ❌ 禁止出现典型 AI 生成痕迹:\n - \"首先...其次...最后...\"的机械排列\n - \"值得注意的是\"、\"需要指出的是\"等套话高频出现\n - \"综上所述\"在非结论部分反复使用\n - 每段开头都用\"在...方面\"、\"从...角度\"的模板句式\n - 过度使用\"本文\"、\"本研究\"作为主语\n- ✅ 使用自然、多样的表达方式:\n - 变换句式结构:陈述句、反问句、设问句交替使用\n - 融入个人研究视角和独立思考\n - 使用领域专业术语,体现学科素养\n - 段落长短错落有致,避免每段字数雷同\n - 适当使用口语化学术表达(如\"不难发现\"、\"换言之\"\n\n### AI 检测规避\n- 保持个人写作风格一致性(用词习惯、句式偏好)\n- 加入具体案例、数据、图表等实证内容(AI 难以伪造)\n- 融入对研究过程的真实描述(实验细节、调研经历)\n- 对他人观点进行批判性分析,而非简单罗列\n- 论文不同部分的文风应与内容匹配(引言偏叙述、方法偏客观、讨论偏思辨)\n\n## 文献引用规范\n\n### 文献真实性(最高优先级)\n- ⚠️ **所有引用的文献必须真实存在,可通过学术数据库检索到**\n- 引用前必须验证:作者、标题、期刊/出版社、年份、卷期页码均准确\n- 推荐验证渠道:Google Scholar、知网(CNKI)、万方、Web of Science、Scopus\n- ❌ 严禁编造虚假文献(捏造作者、杜撰期刊、伪造年份)\n- ❌ 严禁引用未读过的文献(二手引用需标注\"转引自\")\n- 如无法找到原始文献,宁可删除引用也不要凭记忆补全信息\n\n### 引用格式\n- 中文论文:GB/T 7714 格式(如:[1] 张三. 标题[J]. 期刊名, 2024, 1(2): 10-20.\n- 英文论文:APA 7th / IEEE / MLA 格式(根据目标期刊要求选择)\n- 正文引用与参考文献列表一一对应,不多不少\n- 引用数量建议:本科 15-30 篇,硕士 40-80 篇,博士 80-150 篇\n- 近 5 年文献占比 ≥ 50%,体现研究前沿性\n- 中英文文献比例合理(理工科英文 ≥ 60%)\n\n## 上下文连贯性\n\n### 全文一致性\n- 研究问题、方法、结果、结论之间逻辑链条完整\n- 摘要中的结论必须与正文结论一致\n- 引言提出的问题必须在结论中回应\n- 文献综述的内容必须与研究方法选择相关\n- 术语全文统一:同一概念不要交替使用不同名称\n\n### 段落衔接\n- 每段有明确的主题句(通常在段首)\n- 段与段之间使用过渡句或过渡词连接\n- 常用过渡逻辑:因果(因此)、转折(然而)、递进(此外)、对比(相比之下)\n- 避免突然跳转话题,新观点需有铺垫\n- 每章末尾可加小结,呼应章首并过渡到下一章\n\n### 语言风格一致\n- 全文保持同一人称视角(推荐第三人称或\"本文\")\n- 时态一致:文献综述用过去时,研究方法用过去时,结论用现在时\n- 学术语体一致:不在严谨论述中突然出现口语化表达\n- 专业术语首次出现时给出定义或英文原文",
"enabled": false,
"priority": 30,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.180Z",
"updatedAt": "2026-06-04T00:17:16.180Z",
"tags": [
"paper",
"academic",
"writing"
]
}
},
{
"id": "24533d75-cf0f-4ca5-9222-1d5aa7950bcb",
"name": "代码审查规范",
"category": "context",
"content": "## 代码结构\n- 函数长度不超过 50 行,文件不超过 300 行\n- 嵌套不超过 3 层,使用早返回(guard clause)减少嵌套\n- 单一职责:每个函数/类只做一件事\n- 避免上帝类(God Class)和上帝函数\n\n## 命名规范\n- 变量/函数:camelCase(如 `getUserById`\n- 类/接口/类型:PascalCase(如 `UserService`\n- 常量:UPPER_SNAKE_CASE(如 `MAX_RETRY_COUNT`\n- 布尔变量:`is/has/should/can` 前缀\n- 命名必须语义清晰,禁止单字母变量(循环计数器除外)\n\n## 代码质量\n- 避免魔法数字,使用命名常量\n- 不要吞掉异常(空 catch),至少记录日志\n- 不要注释掉代码,直接删除(Git 有历史记录)\n- 注释说明 why 而非 what,使用中文注释\n- 删除未使用的导入、变量和代码(dead code)\n\n## 错误处理\n- 异常必须处理:捕获后记录日志或向上抛出\n- 使用自定义错误类型,携带错误码\n- 异步操作必须有超时和错误处理\n- 用户可见的错误信息使用中文,友好且有指导性\n\n## 安全检查\n- 用户输入必须校验(类型、长度、范围、格式)\n- SQL 使用参数化查询,禁止拼接\n- 敏感数据不在日志中输出",
"enabled": false,
"priority": 31,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.181Z",
"updatedAt": "2026-06-04T00:17:16.181Z",
"tags": [
"review",
"quality"
]
}
},
{
"id": "b8e13b7a-86b9-4762-96b8-055785d9956a",
"name": "项目概述上下文",
"category": "context",
"content": "## 项目信息\n- **项目名称**:[填写项目名称]\n- **项目类型**:[Web 应用 / 桌面应用 / 移动应用 / 后端服务 / CLI 工具 / 浏览器扩展]\n- **主要语言**[TypeScript / Python / Java / Go / C# / Dart / Rust]\n- **框架**[Vue 3 / React / NestJS / Spring Boot / Flutter / Electron]\n- **包管理器**[yarn / pnpm / npm / pip / gradle / cargo]\n- **Node.js 版本**[18 LTS / 20 LTS / 22]\n\n## 目录结构\n```\nsrc/\n components/ # UI 组件\n composables/ # 可复用逻辑(Vue/ hooks/React\n services/ # API 调用和业务服务\n stores/ # 状态管理(Pinia / Zustand\n types/ # TypeScript 类型定义\n utils/ # 工具函数\n assets/ # 静态资源(图片、字体、样式)\n router/ # 路由配置\n i18n/ # 国际化文件\npublic/ # 公共静态文件\n```\n\n## 开发约定\n- **代码风格**ESLint + Prettier,提交前自动格式化\n- **分支策略**Git Flowmain / develop / feature / fix / release\n- **提交规范**Conventional Commitsfeat / fix / docs / refactor\n- **部署方式**[Docker / Vercel / Nginx / PM2]\n- **CI/CD**[GitHub Actions / GitLab CI / Jenkins]\n\n## 关键依赖\n| 依赖 | 版本 | 用途 |\n|------|------|------|\n| [框架名] | ^x.y.z | [用途] |\n| [UI 库] | ^x.y.z | [用途] |\n| [状态管理] | ^x.y.z | [用途] |\n\n## 环境变量\n| 变量名 | 说明 | 示例 |\n|--------|------|------|\n| `VITE_API_URL` | API 地址 | `http://localhost:3000` |\n| `DATABASE_URL` | 数据库连接 | `postgresql://...` |\n\n## 注意事项\n- [填写项目特殊约定、已知限制、技术债务等]",
"enabled": false,
"priority": 32,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.181Z",
"updatedAt": "2026-06-04T00:17:16.181Z",
"tags": [
"context",
"project",
"overview"
]
}
},
{
"id": "d4e81569-dff8-45d5-a4ac-20e3f9f11e9e",
"name": "调试排错上下文",
"category": "context",
"content": "## 调试原则\n- 先复现问题,记录复现步骤和环境信息\n- 从错误日志和堆栈信息入手,定位出错位置\n- 使用二分法缩小问题范围(注释代码 / `git bisect`)\n- 区分根本原因和表面症状,修复根因\n- 一次只改一个变量,验证后再改下一个\n- 不要猜测,用数据和日志证明假设\n\n## 常见问题排查清单\n\n### 编译 / 构建错误\n- 类型定义缺失或不匹配\n- 导入路径错误(相对路径 / 别名配置)\n- 依赖版本冲突(`yarn why <package>`\n- tsconfig 配置问题(`moduleResolution`、`paths`\n\n### 运行时错误\n- 空值访问:`TypeError: Cannot read property of undefined`\n- 异步时序:Promise 未 await、竞态条件\n- 数组越界 / 对象属性不存在\n- 循环引用导致栈溢出\n- 类型不匹配:字符串 vs 数字、JSON 解析失败\n\n### 样式问题\n- 选择器优先级:Specificity 计算、`!important` 覆盖\n- z-index 层级混乱:建立统一的 z-index 层级体系\n- Flex / Grid 布局:`flex-shrink`、`overflow`、`min-width: 0`\n- 响应式断点:移动端 viewport、媒体查询顺序\n\n### 性能问题\n- 前端:N 次不必要的重渲染(React DevTools Profiler\n- 后端:N+1 查询(ORM 日志)、慢查询(`EXPLAIN ANALYZE`)\n- 内存泄漏:事件监听未清理、闭包引用大对象\n- 网络:请求瀑布流、缺少缓存策略\n\n### 网络问题\n- CORS`Access-Control-Allow-Origin` 配置\n- 请求格式:`Content-Type` 不匹配\n- 认证:Token 过期 / 缺失、Cookie SameSite 策略\n- 超时:设置合理的 timeout 值、重试机制\n\n## 调试工具\n\n| 场景 | 工具 | 用途 |\n|------|------|------|\n| 前端 | Chrome DevTools | Network / Console / Performance / Memory |\n| 前端 | React / Vue DevTools | 组件树、状态、渲染次数 |\n| Node.js | `--inspect` | 断点调试(配合 Chrome DevTools |\n| Node.js | `clinic.js` | 性能分析(CPU / 内存 / 事件循环) |\n| 数据库 | `EXPLAIN ANALYZE` | 查询执行计划分析 |\n| 网络 | Postman / cURL | API 请求调试 |\n| 日志 | `console.time()` | 简单计时 |\n\n## 日志调试技巧\n- 使用结构化日志:`console.log({ userId, action, result })`\n- 在关键分支添加标记日志:`[DEBUG] 进入分支 A`\n- 调试完毕后清理所有调试日志(或使用 DEBUG 环境变量控制)",
"enabled": false,
"priority": 33,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.182Z",
"updatedAt": "2026-06-04T00:17:16.182Z",
"tags": [
"context",
"debug",
"troubleshoot"
]
}
},
{
"id": "36c3f159-6722-4570-89bd-cb9645e6ec77",
"name": "架构设计上下文",
"category": "context",
"content": "## SOLID 原则\n- **单一职责(SRP)**:每个模块/类只负责一件事\n- **开闭原则(OCP)**:对扩展开放,对修改关闭(策略模式、插件机制)\n- **里氏替换(LSP)**:子类可以替换父类而不破坏行为\n- **接口隔离(ISP)**:客户端不应被迫依赖不使用的接口\n- **依赖倒置(DIP)**:高层模块依赖抽象,不依赖具体实现\n\n## 分层架构\n\n```\n┌──────────────────┐\n│ 表现层 │ ← UI 组件、页面路由、用户交互\n│ (Presentation) │ Vue/React 组件、模板、样式\n├──────────────────┤\n│ 业务逻辑层 │ ← Service、Store、Composable/Hook\n│ (Business) │ 业务规则、数据转换、状态管理\n├──────────────────┤\n│ 数据访问层 │ ← Repository、API Client、ORM\n│ (Data Access) │ 接口调用、数据库操作、缓存\n├──────────────────┤\n│ 基础设施层 │ ← 数据库、缓存、消息队列、文件存储\n│ (Infrastructure)│ 第三方服务、系统配置\n└──────────────────┘\n```\n\n- 上层只依赖下层,禁止跨层调用和反向依赖\n- 每层通过接口(Interface)暴露能力,隐藏实现细节\n\n## 常用设计模式\n- **策略模式**:多种算法/行为可切换(如支付方式、认证方式)\n- **观察者模式**:事件驱动解耦(EventEmitter、Vue 的 watch\n- **工厂模式**:根据条件创建不同实例\n- **适配器模式**:统一不同第三方服务的接口\n- **装饰器模式**:横切关注点(日志、缓存、权限检查)\n- **仓储模式**:抽象数据访问,隔离业务逻辑和存储细节\n\n## 设计决策记录(ADR\n\n```markdown\n### ADR-001: [决策标题]\n- **状态**:已采纳 / 待评审 / 已废弃\n- **背景**:为什么需要这个决策\n- **决策**:选择了什么方案\n- **替代方案**:考虑过哪些其他方案\n- **后果**:这个决策带来的正面和负面影响\n```\n\n## 扩展性考量\n- 模块化:功能按领域拆分为独立模块\n- 插件化:核心功能之外的能力通过插件扩展\n- 配置驱动:行为差异通过配置而非代码分支控制\n- 向后兼容:API 变更使用版本化,数据迁移支持回滚",
"enabled": false,
"priority": 34,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.182Z",
"updatedAt": "2026-06-04T00:17:16.182Z",
"tags": [
"context",
"architecture",
"design"
]
}
},
{
"id": "e1f03b36-532b-446e-b932-0e7d84b1a38b",
"name": "技术栈上下文",
"category": "context",
"content": "## 前端技术栈\n\n| 分类 | 技术 | 版本 | 说明 |\n|------|------|------|------|\n| 框架 | Vue 3 / React 19 | latest | Composition API / Hooks |\n| 语言 | TypeScript | ^5.x | 严格模式 |\n| 构建 | Vite | ^5.x / ^6.x | 开发服务器 + 生产构建 |\n| UI 库 | Ant Design Vue / shadcn/ui | latest | 主要组件库 |\n| 样式 | Tailwind CSS | ^3.x / ^4.x | 原子化 CSS |\n| 状态 | Pinia / Zustand | latest | 全局状态管理 |\n| 路由 | Vue Router / React Router | latest | SPA 路由 |\n| HTTP | Axios / ky / fetch | latest | API 请求 |\n| 图标 | Lucide Icons | latest | SVG 图标库 |\n| 表格 | VXE-Table / TanStack Table | latest | 高性能表格 |\n| 表单 | VeeValidate / React Hook Form | latest | 表单校验 |\n| 国际化 | vue-i18n / react-intl | latest | 多语言 |\n| 图表 | ECharts / D3.js | latest | 数据可视化 |\n\n## 后端技术栈\n\n| 分类 | 技术 | 版本 | 说明 |\n|------|------|------|------|\n| 运行时 | Node.js | 20 LTS / 22 | 服务端 JavaScript |\n| 框架 | Express / NestJS / Fastify | latest | Web 框架 |\n| 数据库 | PostgreSQL | 16 | 主数据库 |\n| 缓存 | Redis | 7 | 缓存 + 会话 + 消息队列 |\n| ORM | Prisma / TypeORM / Drizzle | latest | 数据库操作 |\n| 认证 | JWT + bcrypt / Passport | latest | 认证授权 |\n| 校验 | zod / class-validator | latest | 入参校验 |\n| 日志 | Winston / Pino | latest | 结构化日志 |\n| 队列 | BullMQ / RabbitMQ | latest | 异步任务 |\n\n## 工具链\n\n| 分类 | 技术 | 说明 |\n|------|------|------|\n| 包管理 | Yarn / pnpm | 依赖管理 |\n| 代码风格 | ESLint + Prettier | 检查 + 格式化 |\n| Git 钩子 | husky + lint-staged | 提交前检查 |\n| 提交规范 | commitlint | Conventional Commits |\n| 版本控制 | Git | 源码管理 |\n| CI/CD | GitHub Actions / GitLab CI | 自动化流水线 |\n| 容器化 | Docker + docker-compose | 开发 + 部署 |\n| 部署 | Nginx / Caddy | 反向代理 + 静态托管 |\n| 监控 | Prometheus + Grafana | 性能监控 |\n| E2E 测试 | Playwright | 端到端自动化测试 |",
"enabled": false,
"priority": 35,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.183Z",
"updatedAt": "2026-06-04T00:17:16.183Z",
"tags": [
"context",
"tech-stack",
"environment"
]
}
},
{
"id": "c971ece6-d991-4cb0-a683-20dc116a97e7",
"name": "论文写作上下文",
"category": "context",
"content": "## 当前论文信息\n\n- **论文题目**:[填写题目]\n- **论文类型**:[本科毕业论文 / 硕士学位论文 / 博士学位论文 / 期刊论文 / 会议论文]\n- **所属学科**:[填写学科方向]\n- **目标期刊/学校**:[填写期刊名称或学校名称]\n- **字数要求**:[填写字数]\n- **查重要求**:[填写重复率上限,如 ≤ 20%]\n- **引用格式**[GB/T 7714 / APA / IEEE / MLA]\n- **截止日期**[填写日期]\n\n## 研究核心\n\n- **研究问题**:[核心研究问题是什么]\n- **研究假设**:[填写研究假设]\n- **研究方法**:[定性 / 定量 / 混合方法;实验 / 调查 / 案例分析等]\n- **核心论点**:[本文的中心论点]\n- **主要贡献**:[理论贡献 / 实践价值 / 创新点]\n\n## 章节进度\n\n| 章节 | 状态 | 字数 | 备注 |\n|------|------|------|------|\n| 摘要(中文) | [未开始/进行中/已完成] | | |\n| 摘要(英文) | [未开始/进行中/已完成] | | |\n| 第一章 引言 | [未开始/进行中/已完成] | | |\n| 第二章 文献综述 | [未开始/进行中/已完成] | | |\n| 第三章 研究方法 | [未开始/进行中/已完成] | | |\n| 第四章 结果分析 | [未开始/进行中/已完成] | | |\n| 第五章 讨论 | [未开始/进行中/已完成] | | |\n| 第六章 结论 | [未开始/进行中/已完成] | | |\n| 参考文献 | [未开始/进行中/已完成] | | |\n\n## 核心术语表\n\n> 保持全文术语统一,同一概念只用一个名称\n\n| 中文术语 | 英文术语 | 首次定义位置 | 说明 |\n|----------|----------|-------------|------|\n| [填写] | [填写] | 第X章 | [填写定义] |\n\n## 关键文献清单\n\n> 已核实真实存在的核心参考文献(写作前必须完成验证)\n\n| 序号 | 作者 | 标题 | 来源 | 年份 | 验证状态 |\n|------|------|------|------|------|----------|\n| 1 | [填写] | [填写] | [期刊/出版社] | [年份] | ✅已验证 |\n\n## 写作约束\n\n### 本论文特殊要求\n- [填写导师或目标期刊的特殊格式要求]\n- [填写禁止引用的文献范围,如:不引用非正式网络资源]\n- [填写特殊术语使用规范]\n\n### AI 辅助边界\n- ✅ 允许:润色语言表达、检查语法错误、格式排版建议\n- ✅ 允许:提供相关文献检索方向(但必须自行验证真实性)\n- ✅ 允许:提供论述思路和结构框架\n- ❌ 禁止:直接生成正文段落作为最终内容\n- ❌ 禁止:生成参考文献(必须自己查找并验证)\n- ❌ 禁止:编造实验数据、调研结果、案例信息\n\n## 上下文一致性检查清单\n\n在每次续写或修改前确认:\n\n- [ ] 当前写作的章节与研究问题保持关联\n- [ ] 使用的术语与术语表保持一致\n- [ ] 引用的文献均在关键文献清单中且已验证\n- [ ] 本段内容与上一段有逻辑衔接\n- [ ] 数据/结论与前文描述不矛盾\n- [ ] 写作风格与全文保持一致",
"enabled": false,
"priority": 36,
"metadata": {
"author": "user",
"version": "1.0.0",
"createdAt": "2026-06-04T00:17:16.184Z",
"updatedAt": "2026-06-04T00:17:16.184Z",
"tags": [
"context",
"paper",
"academic",
"writing"
]
}
}
],
"profiles": [
{
"id": "default",
"name": "默认",
"description": "默认配置集",
"ruleIds": [],
"isActive": true
}
]
}
-112
View File
@@ -1,112 +0,0 @@
# ===== 燃尽模式规则 START =====
# 最高优先级规则 - 必须严格遵守(Cursor 专用)
⚠️⚠️⚠️ 每次回复结束前必须执行以下命令!没有任何例外!⚠️⚠️⚠️
## 执行规则
1. 完成任务后,执行弹窗命令(跨平台,Windows/Mac/Linux 通用):
node "/Users/freedak/.ranjin-mode/dialog-trigger.js" "cursor" "qlvw9j" "AI想要结束的原因摘要"
📱 **手机端通知**:执行此命令时会自动通知手机端(如果远程服务已开启),用户可以在手机上查看消息并发送反馈。
2. 仔细阅读命令输出的每一行:
- ACTION: continue 或 end(用户的选择)
- FEEDBACK: 用户输入的具体指令或反馈内容(⚠️ 必须完整阅读并执行!)
* 反馈可能来自电脑端弹窗或手机端远程输入
- IMAGES: 用户上传的图片路径(如有,必须用read_file工具查看)
3. 根据输出决定下一步:
- 如果 ACTION 是 "continue"
* ⚠️ 必须仔细阅读 FEEDBACK 后面的全部内容
* ⚠️ 必须按照 FEEDBACK 中用户的具体指令执行任务
* ⚠️ 不要忽略 FEEDBACK,不要只说"用户选择继续"
- 如果 ACTION 是 "end" 或 "stop":停止工作
- ⚠️ 如果命令被取消/跳过/无输出:必须重新执行弹窗命令!
## 核心规则
1. 完整输出 - 输出完整代码和答案,禁止省略
2. 持续执行 - 复杂任务一次性完成
3. 结束确认 - 必须执行弹窗命令后才能结束
4. FEEDBACK必读 - 用户的FEEDBACK是新的任务指令,必须执行
## 手机端远程功能
- 📱 当执行 dialog-trigger.js 命令时,会自动通知手机端(如果远程服务已开启)
- 📱 用户可以在手机浏览器中查看 AI 的消息和状态
- 📱 用户可以在手机上输入反馈,反馈会通过 FEEDBACK 字段传递给你
- 📱 手机端和电脑端弹窗功能完全同步,支持双向通信
## ⚠️ 唯一合法的结束条件
只有当命令输出包含 ACTION: end 或 ACTION: stop 时才能结束对话!
以下情况都不能结束,必须重新执行弹窗命令:
- 命令被用户点击 Skip 跳过
- 命令执行失败或超时
- 命令没有输出
- 工作区取消了命令
## 禁止
- 禁止不执行弹窗命令就结束
- 禁止跳过弹窗流程
- 禁止忽略FEEDBACK内容
- 禁止在没有收到 ACTION: end/stop 的情况下结束
# ===== 燃尽模式规则 END =====
# 最高优先级规则 - 必须严格遵守(Cursor 专用)
⚠️⚠️⚠️ 每次回复结束前必须执行以下命令!没有任何例外!⚠️⚠️⚠️
## 执行规则
1. 完成任务后,执行弹窗命令(跨平台,Windows/Mac/Linux 通用):
node "/Users/freedak/.ranjin-mode/dialog-trigger.js" "cursor" "qlvw9j" "AI想要结束的原因摘要"
📱 **手机端通知**:执行此命令时会自动通知手机端(如果远程服务已开启),用户可以在手机上查看消息并发送反馈。
2. 仔细阅读命令输出的每一行:
- ACTION: continue 或 end(用户的选择)
- FEEDBACK: 用户输入的具体指令或反馈内容(⚠️ 必须完整阅读并执行!)
* 反馈可能来自电脑端弹窗或手机端远程输入
- IMAGES: 用户上传的图片路径(如有,必须用read_file工具查看)
3. 根据输出决定下一步:
- 如果 ACTION 是 "continue"
* ⚠️ 必须仔细阅读 FEEDBACK 后面的全部内容
* ⚠️ 必须按照 FEEDBACK 中用户的具体指令执行任务
* ⚠️ 不要忽略 FEEDBACK,不要只说"用户选择继续"
- 如果 ACTION 是 "end" 或 "stop":停止工作
- ⚠️ 如果命令被取消/跳过/无输出:必须重新执行弹窗命令!
## 核心规则
1. 完整输出 - 输出完整代码和答案,禁止省略
2. 持续执行 - 复杂任务一次性完成
3. 结束确认 - 必须执行弹窗命令后才能结束
4. FEEDBACK必读 - 用户的FEEDBACK是新的任务指令,必须执行
## 手机端远程功能
- 📱 当执行 dialog-trigger.js 命令时,会自动通知手机端(如果远程服务已开启)
- 📱 用户可以在手机浏览器中查看 AI 的消息和状态
- 📱 用户可以在手机上输入反馈,反馈会通过 FEEDBACK 字段传递给你
- 📱 手机端和电脑端弹窗功能完全同步,支持双向通信
## ⚠️ 唯一合法的结束条件
只有当命令输出包含 ACTION: end 或 ACTION: stop 时才能结束对话!
以下情况都不能结束,必须重新执行弹窗命令:
- 命令被用户点击 Skip 跳过
- 命令执行失败或超时
- 命令没有输出
- 工作区取消了命令
## 禁止
- 禁止不执行弹窗命令就结束
- 禁止跳过弹窗流程
- 禁止忽略FEEDBACK内容
- 禁止在没有收到 ACTION: end/stop 的情况下结束
@@ -1 +0,0 @@
{"specId": "43719c76-463f-48fd-8ae8-911390815c6a", "workflowType": "requirements-first", "specType": "feature"}
-641
View File
@@ -1,641 +0,0 @@
# Design Document
## Overview
医科类高校 AI 学习中心系统是一个以"能力"为核心的 Web 平台,面向学生、导师与管理员三类角色,贯穿基础医学、临床医学、见习实习、住院医师培养全成长链。本设计文档描述系统的架构、组件、数据模型、错误处理与测试策略,对应需求文档中的 17 条需求。
系统的两大架构支柱是:
1. **能力图谱(Competency Graph** —— 全系统共享的数据底座。所有模块产生的可计入能力的数据(学习成果、对练成绩、技能使用、协同评估)都映射到统一的能力标签上,使学生画像、职业规划等能在统一数据上聚合,避免模块孤岛。
2. **技能能力中心(Skill Center** —— 统一的 AI 能力技术底座。课程对练、研究资料查询等模块本质上是技能(Skill)的具体应用,它们复用同一套技能框架(输入规格、AI 处理逻辑、知识源绑定、输出格式、可信度标注规则)。
此外,**AI 可信与可解释**与**数据安全与合规**作为两个横切关注点贯穿所有模块:任何 AI 输出都附带可信度标注与可追溯来源,任何受保护资源访问都经过合规模块的权限判定与审计。
### 技术栈假设
需求未指定技术栈,本设计采用以下技术栈作为假设(可在实现阶段调整):
- **前端**React + TypeScript(学生端、导师端、管理端三套界面共用组件库)
- **后端**Node.js + TypeScriptNestJS 框架,模块化、依赖注入契合本系统的模块划分)
- **数据库**PostgreSQL(关系型主存储,含 JSONB 字段存储画像维度、技能定义等半结构化数据)
- **图/标签存储**:能力图谱的标签体系与映射关系存于 PostgreSQL(可演进至专用图数据库)
- **缓存**:Redis(画像聚合结果、能力概览等读多写少数据的缓存)
- **AI 集成**:通过统一的 AI 网关(AI Gateway)封装大模型调用,所有调用强制经过可信度标注与来源绑定
- **对象存储**:S3 兼容存储(学习成果附件)
- **检索集成**:通过资料来源适配器(Reference Source Adapter)对接 PubMed/CNKI/万方/UpToDate/Cochrane 等外部数据库 API
### 设计原则
- **可信优先**:医学场景下 AI 幻觉风险高,所有 AI 输出绑定权威来源、附带可信度标注;无法溯源的输出一律标注为"未经核验"。
- **合规默认**:敏感数据默认脱敏,画像跨用途使用必须有有效授权,所有敏感操作留审计日志。
- **能力贯通**:所有模块通过能力标签写入能力图谱,形成统一数据底座。
- **技能复用**:可复用 AI 能力统一抽象为技能,降低新增能力的成本。
## Architecture
### 系统分层架构
```mermaid
graph TB
subgraph Client["客户端层"]
StudentUI["学生端"]
MentorUI["导师端"]
AdminUI["管理端"]
end
subgraph Gateway["接入层"]
APIGW["API 网关 / 认证鉴权"]
end
subgraph CrossCutting["横切关注点"]
Compliance["合规模块<br/>Compliance_Module<br/>(权限/脱敏/授权/审计)"]
AITrust["AI 可信层<br/>(可信度标注/来源溯源)"]
end
subgraph Modules["业务模块层"]
LS["个人学习空间<br/>Learning_Space"]
AEE["AI 评估引擎<br/>AI_Evaluation_Engine"]
PE["课程对练引擎<br/>Practice_Engine"]
CDP["临床情景对话对练<br/>Clinical_Dialogue_Practice"]
PF["学生画像引擎<br/>Profile_Engine"]
CM["职业规划模块<br/>Career_Module"]
ACM["AI 协同能力培养<br/>AI_Collaboration_Module"]
end
subgraph Foundation["底座层"]
SC["技能能力中心<br/>Skill_Center"]
CG["能力图谱<br/>Competency_Graph"]
end
subgraph External["外部与基础设施"]
AIGW["AI 网关 (大模型)"]
AuthSrc["权威知识源"]
RefSrc["资料来源 (PubMed/CNKI/...)"]
DB[("PostgreSQL")]
Cache[("Redis")]
OSS[("对象存储")]
end
Client --> APIGW
APIGW --> Compliance
Compliance --> Modules
Modules --> SC
Modules --> CG
SC --> AIGW
AEE --> AIGW
CDP --> AIGW
SC --> AuthSrc
SC --> RefSrc
PE --> AuthSrc
Modules --> AITrust
AITrust --> AIGW
Modules --> DB
PF --> Cache
CG --> Cache
LS --> OSS
```
### 模块依赖关系
```mermaid
graph LR
LS["个人学习空间"] --> CG["能力图谱"]
LS --> AEE["AI评估引擎"]
PE["课程对练引擎"] --> SC["技能能力中心"]
PE --> CG
PE --> AEE
CDP["临床情景对话对练"] --> SC
CDP --> CG
RQS["研究资料查询技能"] --> SC
RQS --> CG
ACM["AI协同能力培养"] --> CG
PF["学生画像引擎"] --> CG
PF --> LS
CM["职业规划模块"] --> CG
CM --> PF
AEE --> AITrust["AI可信层"]
SC --> AITrust
PF --> Compliance["合规模块"]
CM --> Compliance
```
关键说明:
- **能力图谱**是被依赖最多的底座,几乎所有业务模块都向它写入或从它读取能力数据。
- **技能能力中心**是课程对练、临床对话对练、研究查询技能的共同底座。
- **学生画像引擎**依赖能力图谱(能力数据)与个人学习空间(成果来源)。
- **职业规划模块**依赖能力图谱(能力水平对照)与学生画像。
## Components and Interfaces
### 1. 个人学习空间(Learning_Space
**职责**:汇聚、归档、检索学生的学习成果;触发 AI 评价与能力标签关联。
**对应需求**:需求 1。
**关键接口**
```typescript
interface LearningSpaceService {
// 需求1.1, 1.6, 1.9: 新增成果(含元数据与字段校验)
addAchievement(studentId: string, input: AchievementInput): Result<Achievement, ValidationError>;
// 需求1.5: 分页+筛选查询(按时间倒序,每页≤50)
listAchievements(studentId: string, filter: AchievementFilter, page: Pagination): Page<Achievement>;
// 需求1.4: 标记里程碑并关联成果
markMilestone(studentId: string, milestone: MilestoneInput): Milestone;
}
```
**设计要点**
- 保存成功后(需求 1.3)按学年、学期自动归档;若成果含临床轮转科室信息(需求 1.8)额外按科室归档。
- 保存成功后(需求 1.7)调用能力图谱进行能力标签关联;若无法匹配任何已定义标签(需求 1.10),标记为"待关联能力标签"并提示。
- 必填元数据缺失(需求 1.6)或标题超 200 字符/时间无效(需求 1.9)时拒绝保存且不创建任何记录(事务回滚)。
- 成功保存后异步触发 `AI_Evaluation_Engine` 生成形成性评价(需求 2.1)。
### 2. AI 评估引擎(AI_Evaluation_Engine
**职责**:对学习成果生成形成性评价,对里程碑生成终结性评价,对对练报告生成改进建议。
**对应需求**:需求 2、需求 4.7-4.8。
**关键接口**
```typescript
interface AIEvaluationEngine {
// 需求2.1: 形成性评价(30秒内)
generateFormativeEvaluation(achievement: Achievement): Result<Evaluation, EvaluationError>;
// 需求2.2, 2.7: 终结性评价(节点内须有成果)
generateSummativeEvaluation(milestone: Milestone, achievements: Achievement[]): Result<Evaluation, EvaluationError>;
// 需求4.7-4.8: 对练薄弱环节改进建议
generateImprovementSuggestions(report: PracticeReport): Suggestion[];
}
```
**设计要点**
- 每条评价附带可信度标注,列出至少一条依据的学习成果或权威知识源(需求 2.3);每条发展建议引用至少一个能力标签(需求 2.4)。
- 内容信息不足时中止生成、保留数据不变并提示缺失内容类别(需求 2.5)。
- 生成失败或超时时中止、保留数据不变并提示失败(需求 2.6)。
- 通过 AI 可信层统一附加可信度标注(需求 16)。
### 3. 课程对练引擎(Practice_Engine
**职责**:基于课程内容生成题目(绑定权威知识源),经导师审核后供学生对练,并生成结果诊断报告。
**对应需求**:需求 3、需求 4。
**关键接口**
```typescript
interface PracticeEngine {
// 需求3.1: 生成题目(30秒内,5-50道)
generateQuestions(courseId: string, studentId: string): Result<Question[], GenerationError>;
// 需求3.5, 3.6: 导师审核流转
reviewQuestion(questionId: string, decision: ReviewDecision, reason?: string): Question;
// 需求4: 对练会话
startPractice(studentId: string, questionSetId: string): PracticeSession;
submitAnswer(sessionId: string, questionId: string, answer: Answer): AnswerResult;
finishPractice(sessionId: string): PracticeReport;
}
```
**题目状态机**
```mermaid
stateDiagram-v2
[*] --> 待导师审核: 生成成功
[*] --> 已拒绝: 无法绑定权威知识源(3.8)
待导师审核 --> 可用于对练: 导师通过(3.6)
待导师审核 --> 已退回: 导师退回(3.5)
已退回 --> 待导师审核: 修订后重新提交
可用于对练 --> [*]
```
**设计要点**
- 每道题目绑定至少一个权威知识源并记录引用标识(需求 3.2);无法绑定时不进入审核并记录原因(需求 3.8)。
- 支持 A1/A2/A3/A4、病例分析、临床决策题型(需求 3.3)。
- 课程内容不足以生成最少题量时中止并提示(需求 3.7)。
- 对练逐题呈现并采集作答(需求 4.1-4.2),单题超 120 秒未作答判错并继续(需求 4.4)。
- 报告含正确率、用时、薄弱环节(正确率<60% 的能力标签,需求 4.5),并按能力标签映射能力图谱(需求 4.6)。
### 4. 临床情景对话对练(Clinical_Dialogue_Practice
**职责**:基于权威知识源呈现临床情景,进行多轮模拟问诊对话,生成多维评估报告。
**对应需求**:需求 5。
**关键接口**
```typescript
interface ClinicalDialoguePractice {
// 需求5.1, 5.5: 发起对练(10秒内呈现情景,须绑定权威知识源)
startDialogue(studentId: string, scenarioId: string): Result<DialogueSession, NoSourceError>;
// 需求5.2: 多轮对话(最多50轮)
sendTurn(sessionId: string, studentInput: string): DialogueTurn;
// 需求5.3, 5.6: 结束并生成报告(30秒内,三维度)
finishDialogue(sessionId: string): Result<DialogueReport, ReportError>;
}
```
**设计要点**
- 未绑定权威知识源时阻止启动、不创建对话记录并提示(需求 5.5)。
- 报告含问诊完整性、临床推理、医患沟通三个评估方面(需求 5.3),结果映射能力图谱(需求 5.4)。
- 报告生成失败或超时时中止、保留对话记录并提示(需求 5.6)。
### 5. 学生画像引擎(Profile_Engine
**职责**:基于学习空间与能力图谱数据生成多维度画像;标记敏感字段,遵循数据最小化。
**对应需求**:需求 6、需求 7(与合规模块协作)。
**关键接口**
```typescript
interface ProfileEngine {
// 需求6.1, 6.5: 生成/更新画像(5秒内,数据不足维度标记)
generateProfile(studentId: string): Result<StudentProfile, ProfileError>;
// 需求6.4: 画像结论可追溯
getProfileTraceability(studentId: string, dimensionId: string): TraceabilityRecord[];
}
```
**设计要点**
- 六个画像维度均以 0-100 量化分值呈现(需求 6.2):知识掌握、临床技能、科研能力、人文素养、AI 协同素养、职业倾向。
- 能力图谱更新后 10 秒内完成数据同步(需求 6.3);每项结论可追溯至少一条来源记录(需求 6.4)。
- 数据不足以刻画某维度时标记"数据不足"并保留其余维度(需求 6.5)。
- 仅采集与至少一个画像维度直接相关的字段(需求 7.7,数据最小化)。
### 6. 职业规划模块(Career_Module
**职责**:设定职业目标、关联岗位胜任力模型、对照能力图谱生成动态闭环发展规划。
**对应需求**:需求 8、需求 9。
**关键接口**
```typescript
interface CareerModule {
// 需求8.1, 8.4, 8.5: 设定目标并关联胜任力模型(3秒内)
setCareerGoal(studentId: string, goal: CareerGoal): Result<CompetencyModel, GoalError>;
// 需求9: 生成/更新发展规划
generateDevelopmentPlan(studentId: string, goalId: string): Result<DevelopmentPlan, PlanError>;
}
```
**设计要点**
- 岗位胜任力模型参照权威医学胜任力框架,含科学与学术、临床能力、健康与社会、职业素养四维度(需求 8.2),每维度至少 3 个能力标签(需求 8.3)。
- 无匹配模型时提示并推荐至少 3 个相近目标(需求 8.4)。
- 逐项对照能力图谱能力水平与要求水平,标记能力差距项(含缺数据项,需求 9.1);每差距项生成≥1 建议行动(需求 9.2)、推荐≥1 学习资源或对练任务(需求 9.3)、引用对应能力标签(需求 9.4)。
- 能力图谱更新后再次请求时重算全部差距项(需求 9.5,动态闭环)。
- 未选目标/模型不可用时拒绝并提示、保留能力图谱数据(需求 9.6);差距项无对应资源时保留并标注暂无推荐(需求 9.7)。
### 7. 研究资料查询技能(Research_Query_Skill,建立于 Skill_Center 之上)
**职责**:自然语言转检索式、检索筛选、总结、证据分级、引用管理。
**对应需求**:需求 10、需求 11。
**关键接口**
```typescript
interface ResearchQuerySkill {
// 需求10.1, 10.6: NL→检索式(PICO/MeSH10秒内,1-2000字符)
generateSearchQuery(studentId: string, question: string): Result<SearchQuery, QuestionError>;
// 需求10.2, 10.7, 10.8: 检索(30秒内,分页≤50,空结果/源不可用处理)
search(query: SearchQuery, sources: ReferenceSource[], page: Pagination): Result<Page<ReferenceItem>, SourceError>;
// 需求11.1, 11.6: 生成总结(30秒内,每结论附引用)
summarize(items: ReferenceItem[]): Result<Summary, SummaryError>;
// 需求11.3, 11.7: 生成/导出引用
generateCitation(items: ReferenceItem[], format: CitationFormat): Result<Citation[], CitationError>;
exportCitations(citations: Citation[], target: ExportTarget): Result<ExportFile, ExportError>;
}
```
**设计要点**
- 检索结果每条仅含检索信息、摘要、原文链接,不存储或分发受版权保护全文(需求 10.4,版权安全)。
- 总结每条结论附≥1 来源引用(需求 11.1);每条资料标注唯一证据分级(需求 11.2)。
- 无法溯源的结论标注"未验证"且不作为引用输出(需求 11.4)。
- 支持 Vancouver/GB-T 7714 格式,导出 EndNote/NoteExpress(需求 11.3)。
- 呈现总结时提示"仅辅助,不替代阅读原文"(需求 11.5)。
### 8. AI 协同能力培养模块(AI_Collaboration_Module
**职责**:提供协同训练任务,评估四维协同能力,写入能力图谱,支持导师点评。
**对应需求**:需求 12。
**关键接口**
```typescript
interface AICollaborationModule {
// 需求12.1: 提供协同训练任务(四维度各≥1)
listTrainingTasks(dimension?: CollaborationDimension): TrainingTask[];
// 需求12.2, 12.6, 12.7: 完成任务并评估(30秒内,0-100,失败/数据不足处理)
evaluateTask(studentId: string, taskId: string, submission: TaskSubmission): Result<CollaborationAssessment, AssessmentError>;
// 需求12.5: 导师点评
addMentorComment(taskId: string, mentorId: string, comment: string): MentorComment;
}
```
**设计要点**
- 四维度:提问能力、批判性验证、责任边界意识、协同工作流(需求 12.2)。
- 学生直接采用未核验 AI 输出时提示并要求来源核验,且计入批判性验证维度(需求 12.3)。
- 评估结果映射能力图谱并计入画像与胜任力对照(需求 12.4)。
### 9. 技能能力中心(Skill_Center,底座)
**职责**:定义、治理、调用可复用 AI 技能;统一技能框架与可信度标注。
**对应需求**:需求 13。
**关键接口**
```typescript
interface SkillCenter {
// 需求13.6, 13.7: 配置/启用/审计技能定义
upsertSkillDefinition(actor: User, def: SkillDefinition): Result<SkillDefinition, DefinitionError>;
enableSkill(actor: User, skillId: string): Skill;
// 需求13.3, 13.4, 13.5: 调用技能(30秒内,输入校验,失败处理)
invokeSkill(studentId: string, skillId: string, input: SkillInput): Result<SkillOutput, InvocationError>;
// 需求13.9: 序列化往返
serialize(def: SkillDefinition): string;
deserialize(raw: string): SkillDefinition;
}
```
**技能定义结构(需求 13.2 五要素)**
```typescript
interface SkillDefinition {
id: string;
name: string;
inputSpec: InputSpec; // 输入规格
processingLogic: ProcessingLogic; // AI 处理逻辑说明
knowledgeSources: SourceBinding[]; // 知识源绑定
outputFormat: OutputFormat; // 输出格式
credibilityRule: CredibilityRule; // 可信度标注规则
enabled: boolean;
}
```
**设计要点**
- 技能库至少含 8 个技能:资料查询、检索式生成、文献综述、病例分析、鉴别诊断辅助、医患沟通模拟、医学翻译、引用生成(需求 13.1)。
- 调用前校验输入符合 inputSpec,不符则拒绝(需求 13.4);知识源不可用或处理失败时终止、不返回结果与标注、提示失败(需求 13.5)。
- 仅成功调用完成才写入能力图谱(需求 13.8)。
- **序列化往返一致性**(需求 13.9):`deserialize(serialize(def))` 等价于 `def`,这是核心属性测试点。
### 10. 能力图谱(Competency_Graph,底座)
**职责**:维护统一能力标签体系;接收各模块能力数据映射;聚合能力概览。
**对应需求**:需求 14。
**关键接口**
```typescript
interface CompetencyGraph {
// 需求14.1: 维护统一标签体系
listTags(): CompetencyTag[];
// 需求14.2, 14.3: 映射数据(1-10标签,5秒内,未定义标签拒绝)
mapData(source: ModuleSource, data: CompetencyData, tagIds: string[]): Result<Mapping, UndefinedTagError>;
// 需求14.4, 14.5: 聚合能力概览(5秒内,0-100,数据不足标记)
getCompetencyOverview(studentId: string): CompetencyOverview;
}
```
**设计要点**
- 每个能力标签有唯一标识与所属能力维度(需求 14.1)。
- 映射 1-10 个已定义标签(需求 14.2);引用未定义标签时拒绝、不创建记录、记录原因并提示(需求 14.3)。
- 能力概览按维度以 0-100 量化分值返回(需求 14.4);数据不足维度标记"数据不足"并保留其余(需求 14.5)。
### 11. 合规模块(Compliance_Module,横切)
**职责**:权限分级、敏感字段脱敏、画像授权校验、审计日志。
**对应需求**:需求 7、需求 15.4、需求 17。
**关键接口**
```typescript
interface ComplianceModule {
// 需求17.1, 17.2, 17.3: 权限判定
checkAccess(user: User, resource: ProtectedResource, action: Action): AccessDecision;
// 需求7.2, 7.3, 7.4, 7.5: 画像授权与脱敏
resolveProfileView(viewer: User, profile: StudentProfile): StudentProfileView;
verifyConsent(studentId: string, purpose: Purpose): ConsentVerification;
revokeConsent(studentId: string, consentId: string): void;
// 需求17.4, 7.6: 审计日志
writeAuditLog(entry: AuditLogEntry): void;
}
```
**授权与脱敏流程**
```mermaid
flowchart TD
A[访问学生画像] --> B{访问者是学生本人?}
B -->|是| C[返回完整画像]
B -->|否| D{持有有效知情同意授权?}
D -->|否| E[拒绝完整画像访问 7.2<br/>对未授权敏感字段脱敏 7.5]
D -->|是, 范围覆盖用途| F[校验授权有效期/范围/用途 7.3]
F -->|通过| G[按授权范围返回字段]
F -->|不通过| E
C --> H[写审计日志 7.6]
E --> H
G --> H
```
**设计要点**
- 敏感字段:身份标识、联系方式、健康与医疗记录、心理测评结果、生物特征数据(需求 7.1)。
- 授权须仍在有效期内且范围与用途覆盖该用途(需求 7.3);不满足时阻止使用、保持数据不被使用并提示(需求 7.4)。
- 学生撤销授权后立即失效,此后按未授权处理(需求 7.8)。
- 脱敏 2 秒内、仅返回已授权字段(需求 7.5);审计日志 5 秒内记录、保留≥12 个月(需求 7.6)。
- 权限范围列出可访问资源类型与允许操作类型(需求 17.1);越权访问拒绝并记录(需求 17.3)。
### 12. 导师端(Mentor 视图,跨模块)
**职责**:题目审核、成果点评、查看带教学生画像。
**对应需求**:需求 15。
**设计要点**
- 题目审核通过/退回并在退回时记录原因(需求 15.1,复用 Practice_Engine 审核接口)。
- 成果点评关联到学习成果并对学生可见(需求 15.2)。
- 存在带教关系时允许查看所带学生画像(需求 15.3);查看非所带学生画像时合规模块拒绝并记录越权尝试(需求 15.4)。
### 13. AI 可信层(横切)
**职责**:为所有 AI 输出统一附加可信度标注与来源溯源。
**对应需求**:需求 16。
**设计要点**
- 任意 AI 评价/建议/总结附带可信度标注(需求 16.1),含≥1 来源与 0%-100% 置信度(需求 16.2)。
- 请求查看依据时 3 秒内展示可追溯来源条目及引用标识(需求 16.3)。
- 无法溯源的输出标注"未经核验"并在呈现时一并显示(需求 16.4)。
## Data Models
### 核心实体关系
```mermaid
erDiagram
Student ||--o{ Achievement : owns
Student ||--|| StudentProfile : has
Student ||--o{ Milestone : reaches
Student ||--o{ ConsentRecord : grants
Achievement }o--o{ CompetencyTag : "mapped to"
Milestone ||--o{ Achievement : groups
CompetencyTag }o--|| CompetencyDimension : "belongs to"
CompetencyModel ||--o{ CompetencyTag : requires
CareerGoal ||--|| CompetencyModel : maps
DevelopmentPlan ||--o{ CompetencyGap : contains
SkillDefinition ||--o{ SourceBinding : binds
Question }o--|| AuthoritativeSource : "bound to"
PracticeReport }o--o{ CompetencyTag : "scored on"
AuditLogEntry }o--|| Student : about
StudentProfile ||--o{ ProfileDimensionScore : contains
```
### 关键数据结构
```typescript
// 学习成果(需求1
interface Achievement {
id: string;
studentId: string;
type: AchievementType; // 需求1.2 枚举
title: string; // ≤200字符 (需求1.9)
occurredAt: Date; // 有效日期 (需求1.9)
academicYear: string; // 归档维度 (需求1.3)
semester: string; // 归档维度 (需求1.3)
rotationDept?: string; // 临床轮转科室 (需求1.8)
attachments: AttachmentRef[];
competencyTagIds: string[]; // 关联标签 (需求1.7)
pendingTagAssociation: boolean; // 待关联 (需求1.10)
}
// 能力标签与维度(需求14
interface CompetencyTag {
id: string; // 唯一标识 (需求14.1)
name: string;
dimensionId: string; // 所属维度 (需求14.1)
}
// 学生画像(需求6,7
interface StudentProfile {
studentId: string;
dimensions: ProfileDimensionScore[]; // 六维度,0-100 (需求6.2)
generatedAt: Date;
}
interface ProfileDimensionScore {
dimension: ProfileDimension;
score: number | 'insufficient_data'; // 数据不足 (需求6.5)
traceability: TraceabilityRecord[]; // 可追溯 (需求6.4)
sensitive: boolean; // 敏感标记 (需求7.1)
}
// 知情同意授权(需求7
interface ConsentRecord {
id: string;
studentId: string;
scope: string[]; // 授权范围 (需求7.3)
purpose: Purpose; // 授权用途 (需求7.3)
validFrom: Date;
validUntil: Date; // 有效期 (需求7.3)
revoked: boolean; // 撤销 (需求7.8)
}
// 可信度标注(需求16
interface CredibilityAnnotation {
sources: SourceRef[]; // ≥1 来源 (需求16.2)
confidence: number; // 0-100 (需求16.2)
verified: boolean; // false => "未经核验" (需求16.4)
}
// 审计日志(需求7.6, 17.4
interface AuditLogEntry {
actorId: string; // 操作者
timestamp: Date; // 时间
action: Action; // 操作类型
resourceScope: string; // 数据范围
outcome: 'allow' | 'deny';
reason?: string; // 拒绝原因 (需求17.3)
// 保留≥12个月 (需求7.6)
}
```
## Error Handling
系统采用统一的 `Result<T, E>` 返回模式,区分正常路径与错误路径,并遵循以下原则:
| 场景 | 处理策略 | 对应需求 |
|------|----------|----------|
| 输入校验失败(缺字段/超长/无效日期) | 拒绝操作、不创建记录(事务回滚)、返回指明问题的提示 | 1.6, 1.9, 13.4 |
| AI 生成失败或超时 | 中止生成、保留触发数据不变、返回失败提示 | 2.6, 5.6, 11.6, 12.6 |
| 内容/数据信息不足 | 标记"数据不足"或"信息不足"、保留其余结果、提示缺失类别 | 2.5, 6.5, 12.7, 14.5 |
| 无法绑定权威知识源 | 不进入审核/不启动、记录原因或提示 | 3.8, 5.5 |
| 资料来源不可用 | 中止检索、保留检索式、提示来源不可用 | 10.8 |
| 检索无匹配 | 返回空结果列表并提示 | 10.7 |
| 无法溯源 | 标注"未验证"/"未经核验"、不作为引用输出 | 11.4, 16.4 |
| 无有效授权 | 阻止使用、保持数据不被使用、提示缺少授权 | 7.4 |
| 越权访问 | 拒绝访问、保持资源不被访问、记录拒绝事件 | 9.6, 15.4, 17.3 |
| 系统错误(如目标关联失败) | 返回错误提示、保留已有数据 | 8.5, 9.6 |
**核心错误处理不变量**:任何错误路径都不得使触发数据进入不一致状态(要么完整成功,要么完整回滚保留原状)。
## Testing Strategy
### 测试层次
1. **单元测试**:各模块接口的正常路径与错误路径,覆盖每条验收标准。
2. **集成测试**:跨模块流程,重点验证能力图谱作为底座的数据贯通(学习成果→标签→画像→职业规划)。
3. **属性测试(Property-Based Testing**:针对可形式化为不变量的核心正确性属性。
4. **合规与安全测试**:权限矩阵、脱敏、授权生命周期、审计完整性。
测试数据与模拟说明:
- AI 网关在测试中以可控的 mock 替代,便于模拟生成成功、失败、超时、无法溯源等场景。
- 资料来源适配器以 mock 模拟外部数据库的可用、不可用、空结果等状态。
- 属性测试使用生成器构造任意有效的技能定义、能力数据、授权记录等输入。
## Correctness Properties
以下属性应对任意有效输入成立,作为属性测试(Property-Based Testing)的基础:
### Property 1: 技能定义序列化往返一致性
对任意有效的 `SkillDefinition def`,有 `deserialize(serialize(def))` 等价于 `def`
**Validates: Requirements 13.9**
### Property 2: 能力标签映射有效性
对任意提交的能力数据与标签集合,映射成功 ⟺ 所有标签均为已定义标签,且映射后标签数量在 1 到 10 之间;引用未定义标签时必然拒绝且不创建任何映射记录。
**Validates: Requirements 14.2, 14.3**
### Property 3: 画像维度分值有界性
对任意学生数据生成的画像与能力概览,每个维度的输出要么是 0 到 100 之间的数值,要么是"数据不足"标记,不存在其他取值。
**Validates: Requirements 6.2, 14.4**
### Property 4: 授权强制不变量
对任意非本人访问者与任意画像使用用途,仅当存在一条有效期内、范围与用途均覆盖的未撤销授权时,才允许完整访问/使用;授权撤销后任何后续访问都按未授权处理。
**Validates: Requirements 7.2, 7.3, 7.4, 7.8**
### Property 5: 引用可追溯不变量
对任意生成的总结,作为引用输出的每条结论都必然可追溯到至少一条来源条目;无法溯源的结论必然被标注为"未验证/未经核验"且不出现在引用输出中。
**Validates: Requirements 11.1, 11.4, 16.4**
### Property 6: 权限判定一致性
对任意(用户角色,资源,操作)三元组,访问被允许 ⟺ 该操作在该角色的权限范围内;越权访问必然被拒绝并产生一条拒绝审计记录。
**Validates: Requirements 17.2, 17.3**
### Property 7: 错误路径数据保全
对任意触发错误路径的操作,操作前后触发数据保持不变(不产生部分写入)。
**Validates: Requirements 1.6, 1.9, 2.6, 5.6, 8.5**
### Property 8: 分页边界不变量
对任意查询与分页参数,返回的单页结果数量不超过 50 条。
**Validates: Requirements 1.5, 10.2**
## Design Decisions and Rationale
1. **以能力图谱为统一底座**:医学教育成长链长、模块多,若各模块各自存储能力数据会形成孤岛。统一标签体系让画像与职业规划能在一致数据上聚合,也使"对照胜任力模型"有共同语言。代价是所有模块需遵循标签映射契约(需求 14.3 的拒绝机制保障了契约一致性)。
2. **技能能力中心作为 AI 能力底座**:课程对练、研究查询本质都是"绑定知识源的 AI 调用 + 可信度标注"。抽象为统一技能框架降低新增能力成本,并使可信度标注、知识源绑定、治理审计得以统一实现。序列化往返一致性(需求 13.9)保障技能定义可安全持久化与迁移。
3. **AI 可信层作为横切关注点**:医学场景幻觉风险高,将"可信度标注 + 来源溯源 + 未经核验标记"统一到一层,避免各模块各自实现导致遗漏,确保需求 16 在全系统一致生效。
4. **合规默认、授权可生命周期管理**:画像含敏感健康数据,采用"默认脱敏 + 用途化授权 + 撤销即时失效 + 全审计"模型,满足知情同意与数据最小化要求,并通过授权强制不变量(属性 4)可测试地保障。
5. **统一 Result 错误模型与数据保全不变量**:所有错误路径保证数据不进入部分写入状态(属性 7),契合医学数据对一致性的高要求。
@@ -1,279 +0,0 @@
# Requirements Document
## Introduction
医科类高校 AI 学习中心系统(以下简称"本系统")面向医学院校的学生、导师与管理员,提供一个以"能力"为核心、贯穿基础医学、临床医学、见习实习、住院医师培养全成长链的智能学习平台。系统将学生在校学习内容汇聚到个人学习空间,由 AI 进行过程性与终结性评价并给出发展建议;以"课程对练"与"临床情景对话对练"对学生进行模拟训练与诊断;基于学习数据形成可授权使用的学生画像;支持学生设定职业目标并对照岗位胜任力模型获得动态闭环的发展规划;提供研究资料检索、总结与引用管理等可复用 AI 技能;并系统性培养医学生与 AI 负责任协作的能力。
系统的关键设计是引入统一的**能力图谱(Competency Graph)**作为各模块共享的数据底座:学习成果、对练成绩、技能使用与协同能力评估均映射到统一的能力标签上,使各模块真正打通而非彼此孤立。**技能能力中心(Skill Center)**作为统一技术底座,课程对练与研究资料查询等本质上是技能的具体应用。鉴于医学内容的高准确性与合规要求,系统将 **AI 可信与可解释**、**数据安全与合规**作为贯穿全局的横切关注点。
本文档仅描述系统"做什么"(需求),不涉及"怎么做"(实现方案保留至设计阶段)。
## Glossary
- **本系统(AI_Learning_Center**:医科类高校 AI 学习中心系统整体。
- **学生(Student)**:使用本系统进行学习、训练与科研的医学院校在校学生。
- **导师(Mentor)**:负责审核题目、点评成果、查看所带学生画像与协同质量的教师或临床带教教师。
- **管理员(Administrator)**:负责系统配置、技能治理、权限与合规管理的运营人员。
- **个人学习空间(Learning_Space)**:汇聚单个学生在校学习内容的功能模块。
- **学习成果(Achievement)**:学生在学习空间中新增的一条学习内容记录,包含类型、时间、标题、附件与元数据。
- **成果类型(Achievement_Type)**:学习成果的分类,至少包括课程记录、作业、实验报告、临床见习与实习记录、OSCE 技能考核、文献阅读、科研成果、证书与执业资格考试备考记录。
- **里程碑(Milestone)**:表示学生成长链上某一阶段节点(如完成某学期、完成某轮转科室)的标记。
- **形成性评价(Formative_Evaluation**:在学习过程中针对单条成果或阶段给出的过程性反馈。
- **终结性评价(Summative_Evaluation**:在阶段结束时对该阶段整体进行的总结性画像评价。
- **AI评估引擎(AI_Evaluation_Engine**:对学习成果、对练结果等进行评价并生成发展建议的 AI 组件。
- **课程对练引擎(Practice_Engine)**:将课程内容整理为练习题、与学生进行模拟对练并对结果进行分析的功能模块。
- **题目(Question)**:用于对练的练习题,题型包括 A1/A2/A3/A4 型选择题、病例分析题与临床决策题。
- **临床情景对话对练(Clinical_Dialogue_Practice**:以模拟问诊等临床情景与学生进行多轮对话训练的功能。
- **权威知识源(Authoritative_Source**:经认证的教材、临床指南、官方题库等可信内容来源。
- **学生画像引擎(Profile_Engine)**:基于学习空间与能力图谱数据生成学生画像的功能模块。
- **学生画像(Student_Profile)**:对学生能力、特长与发展倾向的结构化刻画,含敏感数据。
- **画像维度(Profile_Dimension)**:学生画像的能力维度,至少包括知识掌握、临床技能、科研能力、人文素养、AI 协同素养与职业倾向。
- **职业规划模块(Career_Module)**:支持学生设定职业目标、分解岗位胜任力并生成发展规划的功能模块。
- **岗位胜任力模型(Competency_Model)**:描述某一医学岗位所需能力的结构化模型,参照权威医学胜任力框架(如临床医学本科毕业生胜任力的科学与学术、临床能力、健康与社会、职业素养四个维度)。
- **研究资料查询技能(Research_Query_Skill**:辅助学生检索、筛选、总结与引用医学研究资料的 AI 技能。
- **检索式(Search_Query)**:用于在资料来源中检索的专业查询表达式,支持 PICO 要素与 MeSH 主题词。
- **资料来源(Reference_Source**:医学文献与数据库,如 PubMed、CNKI、万方、UpToDate、Cochrane 等。
- **证据分级(Evidence_Level)**:对一条资料证据强度的标注。
- **引用(Citation**:按规范格式(如 Vancouver、GB/T 7714)生成、可导出至 EndNote/NoteExpress 的文献引用。
- **AI协同能力培养模块(AI_Collaboration_Module**:系统性培养学生与 AI 负责任协作能力的功能模块。
- **协同能力维度(Collaboration_Dimension**:协同能力的评估维度,包括提问能力、批判性验证、责任边界意识与协同工作流。
- **技能能力中心(Skill_Center)**:提供可复用 AI 技能、并对技能进行统一定义与治理的功能模块。
- **技能(Skill)**:一个可复用的 AI 能力单元,具备统一框架(输入规格、AI 处理逻辑、知识源绑定、输出格式、可信度标注规则)。
- **技能定义(Skill_Definition)**:描述一个技能配置的结构化数据。
- **能力图谱(Competency_Graph)**:连接各模块的统一能力标签体系与数据底座。
- **能力标签(Competency_Tag)**:能力图谱中表示一项具体能力的标识。
- **合规模块(Compliance_Module)**:负责权限分级、敏感数据脱敏、画像授权与审计日志的功能模块。
- **可信度标注(Credibility_Annotation**AI 输出附带的来源依据、置信度与可追溯信息。
## Requirements
### 需求 1:个人学习空间汇聚与归档
**用户故事:** 作为学生,我希望将贯穿成长链的学习内容汇聚到一个个人空间并自动归档,以便集中管理我的学习成果。
#### 验收标准(Acceptance Criteria
1. 当学生新增一条学习成果时,个人学习空间应将该学习成果保存、归属到该学生账户,并在保存成功后向该学生返回保存成功的确认。
2. 个人学习空间应支持的成果类型至少包括课程记录、作业、实验报告、临床见习与实习记录、OSCE 技能考核、文献阅读、科研成果、证书与执业资格考试备考记录。
3. 当一条学习成果被成功保存时,个人学习空间应按学年与学期对该学习成果进行归档。
4. 当学生完成一个里程碑节点时,个人学习空间应在成长链上标记该里程碑并关联该节点内的学习成果。
5. 当学生请求查看个人学习空间时,个人学习空间应按学习成果的时间字段倒序展示该学生的学习成果,支持按成果类型、学年、学期与临床轮转科室进行筛选,并以每页最多 50 条对结果进行分页展示。
6. 如果学生提交的学习成果缺少必填元数据(成果类型、时间、标题中的任一项),则个人学习空间应拒绝保存该学习成果、不创建任何记录,并返回指明全部缺失字段的提示信息。
7. 当一条学习成果被成功保存时,个人学习空间应将该学习成果关联到能力图谱中的至少一个能力标签。
8. 当一条包含临床轮转科室信息的学习成果被成功保存时,个人学习空间应额外按临床轮转科室对该学习成果进行归档。
9. 如果学生提交的学习成果的标题超过 200 个字符,或其时间不是有效日期,则个人学习空间应拒绝保存该学习成果、不创建任何记录,并返回指明无效字段的提示信息。
10. 如果一条已成功保存的学习成果无法匹配到能力图谱中任何已定义的能力标签,则个人学习空间应将该学习成果标记为"待关联能力标签",并提示学生补充能力标签关联。
### 需求 2:AI 形成性与终结性评价及发展建议
**用户故事:** 作为学生,我希望 AI 在我新增成果时给出过程性反馈、在阶段结束时给出总结性画像,以便明确改进方向。
#### 验收标准(Acceptance Criteria
1. 当一条学习成果被成功保存时,AI评估引擎应在 30 秒内生成针对该学习成果的形成性评价与发展建议。
2. 当学生完成一个里程碑节点且该节点内存在至少一条学习成果时,AI评估引擎应基于该节点内的全部学习成果生成终结性评价。
3. AI评估引擎生成的每条评价应包含可信度标注,且该可信度标注应列出该评价所依据的至少一条学习成果或权威知识源。
4. AI评估引擎生成的每条发展建议应引用能力图谱中的至少一个能力标签,以指明该建议对应的能力维度。
5. 如果某条学习成果缺少 AI 评价所需的内容信息,则 AI评估引擎应中止本次评价生成、保留该学习成果数据不变,并返回表明信息不足无法评价的提示且说明缺失的内容类别。
6. 如果 AI评估引擎在生成形成性评价、终结性评价或发展建议过程中失败或超出生成时限,则 AI评估引擎应中止本次生成、保留触发评价的学习成果数据不变,并返回表明评价生成失败的提示。
7. 如果学生完成的里程碑节点内不存在任何学习成果,则 AI评估引擎应跳过终结性评价生成并返回表明该节点无可评价学习成果的提示。
### 需求 3:课程对练题目生成与权威性保障
**用户故事:** 作为学生,我希望 AI 将课程整理为练习题供我练习,并由导师把关准确性,以便巩固课程知识。
#### 验收标准(Acceptance Criteria
1. 当学生选择一门课程发起对练时,课程对练引擎应在 30 秒内基于该课程内容生成 5 至 50 道练习题。
2. 课程对练引擎生成的每道题目应绑定至少一个权威知识源,并记录该权威知识源的引用标识。
3. 课程对练引擎应支持生成以下题型:A1 型、A2 型、A3 型、A4 型选择题、病例分析题与临床决策题。
4. 当课程对练引擎生成一道题目时,课程对练引擎应将该题目置于"待导师审核"状态,且在该题目通过导师审核前不向学生发布该题目。
5. 如果一道题目未通过导师审核,则课程对练引擎应将该题目置于"已退回"状态、阻止该题目进入对练,并记录该次退回的原因。
6. 当一道题目通过导师审核时,课程对练引擎应将该题目置于"可用于对练"状态并允许该题目进入对练。
7. 如果课程对练引擎无法基于所选课程内容生成练习题,则课程对练引擎应中止本次生成、不创建任何题目,并向该学生返回表明无法生成练习题的提示。
8. 如果课程对练引擎无法为一道生成的题目绑定任何权威知识源,则课程对练引擎应不发布该题目、不将其置于"待导师审核"状态,并记录该题目缺少权威知识源的原因。
### 需求 4:模拟对练与结果诊断
**用户故事:** 作为学生,我希望与 AI 进行模拟对练并获得结果分析,以便了解自己的薄弱环节。
#### 验收标准(Acceptance Criteria
1. 当学生开始一次对练时,课程对练引擎应按顺序逐题向该学生呈现题目,且单次对练包含的题目数量应为 1 至 50 道。
2. 当课程对练引擎呈现一道题目时,课程对练引擎应采集该学生针对该题目的作答。
3. 当学生提交一道题目的作答时,课程对练引擎应在 3 秒内根据该题目的标准答案将该作答判定为正确或错误。
4. 如果学生在单题作答时限 120 秒内未提交作答,那么课程对练引擎应将该题判定为错误、停止采集该题作答并继续呈现下一道题目。
5. 当一次对练结束时,课程对练引擎应生成对练报告,且该报告应包含取值范围为 0% 至 100% 的正确率、以秒为单位的总用时,以及薄弱环节列表(薄弱环节定义为该次对练中正确率低于 60% 的能力标签)。
6. 当一次对练报告生成时,课程对练引擎应在 5 秒内将该次对练成绩按能力标签映射到能力图谱。
7. 当一次对练报告生成时,AI评估引擎应针对该报告中的每个薄弱环节生成改进建议。
8. 当 AI评估引擎生成一条改进建议时,AI评估引擎应为该改进建议附带取值范围为 0% 至 100% 的可信度标注。
### 需求 5:临床情景对话对练(模拟问诊)
**用户故事:** 作为学生,我希望与 AI 进行模拟问诊等临床情景多轮对话训练,以便锻炼临床沟通与决策能力。
#### 验收标准(Acceptance Criteria
1. 当学生发起一次临床情景对话对练时,临床情景对话对练应在 10 秒内基于绑定的至少一个权威知识源呈现一个临床情景。
2. 在临床情景对话对练进行期间,临床情景对话对练应以设定的对话角色应答学生,支持学生进行最多 50 轮提问与应答,并在每一轮结束后记录该轮的学生输入与系统应答内容。
3. 当一次临床情景对话对练结束时,临床情景对话对练应在 30 秒内生成包含问诊完整性、临床推理与医患沟通三个评估方面的对练报告。
4. 当一次临床情景对话对练报告生成时,临床情景对话对练应将该次结果按能力标签映射到能力图谱。
5. 如果学生发起的临床情景对话对练未绑定任何权威知识源,则临床情景对话对练应阻止该次对练启动、不创建对话记录,并返回表明缺少权威知识源无法启动的提示。
6. 如果临床情景对话对练在生成对练报告过程中失败或超出 30 秒生成时限,则临床情景对话对练应中止本次报告生成、保留该次对话记录不变,并返回表明报告生成失败的提示。
### 需求 6:学生画像生成与能力维度刻画
**用户故事:** 作为学生,我希望系统基于我的学习数据形成多维度学生画像,以便为我的就业与发展提供数据支持。
#### 验收标准(Acceptance Criteria
1. 当学生首次访问学生画像,或个人学习空间内容或能力图谱数据发生更新时,学生画像引擎应在5秒内基于个人学习空间内容与能力图谱数据生成学生画像。
2. 学生画像应针对每个画像维度以0到100的量化分值呈现学生能力分布,画像维度至少包括知识掌握、临床技能、科研能力、人文素养、AI 协同素养与职业倾向共六个维度。
3. 当学生的能力图谱数据发生更新时,学生画像引擎应在数据更新后10秒内完成数据同步,并在下一次画像访问时反映更新后的数据。
4. 学生画像引擎生成的每项画像结论应可追溯到生成该结论所依据的至少一条学习成果或对练数据记录。
5. 如果个人学习空间内容或能力图谱数据缺失或不足以刻画某一画像维度,则学生画像引擎应将该维度标记为"数据不足"状态,保留其余维度的画像结论,并向学生呈现指示数据不足的提示。
### 需求 7:学生画像数据隐私与合规
**用户故事:** 作为学生,我希望我的画像数据受到隐私保护并由我授权使用,以便我的敏感信息不被滥用。
#### 验收标准(Acceptance Criteria
1. 学生画像引擎应将学生画像中的身份标识、联系方式、健康与医疗记录、心理测评结果与生物特征数据标记为敏感字段。
2. 如果访问者不是学生本人且不持有该学生仍在有效期内的知情同意授权,则合规模块应拒绝其访问该学生的完整学生画像。
3. 当画像被用于学生本人之外的用途时,合规模块应校验存在一条仍在有效期内、且授权范围与用途均覆盖该用途的知情同意授权记录。
4. 如果不存在满足该用途的有效知情同意授权记录,则合规模块应阻止该次画像使用、保持画像数据不被使用,并返回表明缺少有效授权的提示。
5. 当导师或管理员访问学生画像时,合规模块应在 2 秒内对未获授权的敏感字段进行脱敏处理,并仅返回已获授权的字段。
6. 当任意角色访问或导出学生画像时,合规模块应在 5 秒内记录包含访问者身份、时间、字段范围与用途的审计日志,且该审计日志的保留期限不少于 12 个月。
7. 学生画像引擎应仅采集与至少一个画像维度直接相关的数据字段,不采集与任一画像维度无关的字段。
8. 当学生撤销一项知情同意授权时,合规模块应使该授权立即失效,并在此后对相关用途按未授权处理。
### 需求 8:职业目标设定与岗位胜任力分解
**用户故事:** 作为学生,我希望设定职业目标并查看对应岗位胜任力模型,以便明确努力方向。
#### 验收标准(Acceptance Criteria
1. 当学生设定一个职业目标时,职业规划模块应在3秒内将该职业目标关联到对应的岗位胜任力模型,并向学生展示该模型。
2. 岗位胜任力模型应参照权威医学胜任力框架,且至少包含科学与学术、临床能力、健康与社会、职业素养四个能力维度。
3. 职业规划模块应将岗位胜任力模型分解为可对照的能力标签集合,且每个能力维度至少包含3个能力标签。
4. 如果学生设定的职业目标没有匹配的岗位胜任力模型,则职业规划模块应提示该目标暂不支持,并推荐至少3个相近的可选目标。
5. 如果将职业目标关联到岗位胜任力模型的过程发生系统错误,则职业规划模块应向学生显示指示关联失败的错误提示,并保留学生已设定的职业目标。
### 需求 9:胜任力对照与动态闭环发展规划
**用户故事:** 作为学生,我希望将我的能力与目标岗位胜任力对照并获得可随能力变化更新的发展规划,以便持续弥补能力差距。
#### 验收标准(Acceptance Criteria
1. 当学生请求生成发展规划时,职业规划模块应将该学生能力图谱中的每一项能力水平与目标岗位胜任力模型中对应的要求水平逐项对照,并将学生水平低于要求水平的能力项标记为能力差距项;对于学生能力图谱中缺少数据的能力项,应将其一并标记为能力差距项。
2. 职业规划模块应在发展规划中为每个能力差距项生成至少一项建议行动,且每项建议行动应标明该差距项的目标能力水平。
3. 职业规划模块生成的发展规划应为每个能力差距项推荐能力图谱中对应的至少一项学习资源或对练任务。
4. 职业规划模块生成的发展规划应为每个能力差距项引用能力图谱中对应的能力标签,以标明该项规划对应的能力维度。
5. 当学生的能力图谱数据发生更新后,且学生再次请求生成发展规划时,职业规划模块应基于更新后的能力水平重新计算全部能力差距项并生成更新后的发展规划。
6. 如果学生在请求生成发展规划时未选择目标岗位,或目标岗位胜任力模型不可用,则职业规划模块应拒绝生成发展规划,向学生返回指明缺少目标岗位胜任力模型的错误提示,并保留该学生已有的能力图谱数据不变。
7. 如果某个能力差距项在能力图谱中不存在对应的学习资源或对练任务,则职业规划模块应在发展规划中保留该能力差距项并标注其暂无可推荐的学习资源或对练任务。
### 需求 10:研究资料检索与检索式生成
**用户故事:** 作为学生,我希望用自然语言描述研究问题并由 AI 生成专业检索式进行检索与筛选,以便高效获取医学研究资料。
#### 验收标准(Acceptance Criteria
1. 当学生以自然语言提交一个研究问题时,研究资料查询技能应在 10 秒内将该研究问题转换为包含 PICO 要素与 MeSH 主题词的检索式,且该研究问题的长度应为 1 至 2000 个字符。
2. 当学生确认一个检索式时,研究资料查询技能应在 30 秒内在指定的资料来源范围内检索相关资料,并以每页最多 50 条对结果列表进行分页返回。
3. 研究资料查询技能应支持学生按发表时间、来源类型与相关度对检索结果进行筛选。
4. 研究资料查询技能返回的每条资料应仅包含检索信息、摘要与指向原文的链接,且不存储或分发受版权保护的全文。
5. 当一次查询完成时,研究资料查询技能应在 5 秒内将该次查询使用情况按能力标签映射到能力图谱。
6. 如果学生提交的研究问题为空、超过 2000 个字符或不包含任何可识别的医学要素,则研究资料查询技能应拒绝生成检索式并返回指明问题的提示。
7. 如果一个检索式在指定资料来源范围内未匹配到任何资料,则研究资料查询技能应返回空结果列表并提示未找到匹配资料。
8. 如果指定的资料来源全部不可用,则研究资料查询技能应中止本次检索、保留该检索式不变,并返回表明资料来源不可用的提示。
### 需求 11:研究资料总结、证据分级与引用管理
**用户故事:** 作为学生,我希望 AI 对检索结果进行可追溯的总结与证据分级,并按规范格式生成可导出的引用,以便支持课题研究与论文写作。
#### 验收标准(Acceptance Criteria
1. 当学生请求对检索结果生成资料总结时,研究资料查询技能应在 30 秒内生成资料总结,且生成的总结中的每条结论应附带至少一条指向其来源条目的引用。
2. 当研究资料查询技能生成资料总结时,研究资料查询技能应为每条纳入总结的资料从预定义的证据分级等级集合中标注唯一的一个证据分级。
3. 当学生选择 Vancouver 或 GB/T 7714 格式请求生成引用时,研究资料查询技能应按所选格式为选定资料生成引用,并支持将生成的引用导出为 EndNote 或 NoteExpress 可识别的格式。
4. 如果研究资料查询技能无法将一条总结结论追溯到具体的资料来源,则该技能应将该结论标注为"未验证"且不得作为引用输出。
5. 当研究资料查询技能向学生呈现资料总结时,本系统应向学生显示研究资料查询技能仅辅助检索与总结、不替代学生阅读原文的提示。
6. 如果研究资料查询技能在生成资料总结过程中失败或超出 30 秒生成时限,则研究资料查询技能应中止本次总结生成、不输出任何结论,并返回表明总结生成失败的提示。
7. 如果引用生成或导出过程失败,则研究资料查询技能应中止本次引用生成或导出、保留选定资料与已生成的引用不变,并返回表明引用生成或导出失败的提示。
### 需求 12:AI 协同能力培养与评估
**用户故事:** 作为学生,我希望系统性地培养我与 AI 负责任协作的能力,以便在临床与科研中正确使用 AI。
#### 验收标准(Acceptance Criteria
1. AI协同能力培养模块应为提问能力、批判性验证、责任边界意识与协同工作流四个协同能力维度各提供至少一个以真实任务为载体的协同训练任务。
2. 当学生完成一个 AI 协同训练任务时,AI协同能力培养模块应在 30 秒内对该学生在提问能力、批判性验证、责任边界意识与协同工作流四个协同能力维度以 0 到 100 的分值进行评估。
3. 如果学生在训练任务中直接采用未经来源核验的 AI 输出,则 AI协同能力培养模块应向该学生返回提示并要求其进行来源核验,且将该行为计入批判性验证维度的评估。
4. 当一个协同能力评估结果生成时,AI协同能力培养模块应在 5 秒内将该评估结果按能力标签映射到能力图谱,使其计入学生画像与岗位胜任力对照。
5. 当一个 AI 协同训练任务完成时,AI协同能力培养模块应允许导师对该学生的协同过程质量进行点评,并将点评对该学生可见。
6. 如果 AI协同能力培养模块在生成协同能力评估过程中失败或超时,则该模块应中止本次评估、保留该训练任务记录不变,并返回表明评估生成失败的提示。
7. 如果某一协同能力维度缺少足以评估的数据,则 AI协同能力培养模块应将该维度标记为"数据不足",并保留其余维度的评估结果。
### 需求 13:技能能力中心与技能治理
**用户故事:** 作为学生,我希望按需调用一系列可复用的 AI 技能,并希望这些技能可被教师治理,以便安全可靠地使用 AI 能力。
#### 验收标准(Acceptance Criteria
1. 技能能力中心应向学生提供一个可调用的技能库,且该技能库应至少包含资料查询、检索式生成、文献综述、病例分析、鉴别诊断辅助、医患沟通模拟、医学翻译与引用生成共 8 个技能。
2. 每个技能定义应包含输入规格、AI 处理逻辑说明、知识源绑定、输出格式与可信度标注规则五个组成部分。
3. 当学生以符合输入规格的输入调用一个已启用的技能时,技能能力中心应在 30 秒内按该技能定义的输出格式返回结果,并附带符合该技能可信度标注规则的可信度标注。
4. 如果学生调用技能的输入不符合该技能定义的输入规格,则技能能力中心应拒绝本次调用并返回指明输入问题的提示。
5. 如果一个技能在调用过程中其绑定知识源不可用或处理失败,则技能能力中心应终止本次调用、不返回结果与可信度标注,并返回表明调用失败的提示。
6. 在一个技能对学生开放之前,技能能力中心应要求该技能定义经管理员或导师配置并启用。
7. 当管理员或导师新增、修改或启用一个技能定义时,技能能力中心应记录包含操作者身份、操作时间与变更内容的审计日志。
8. 当任意技能被成功调用完成时,技能能力中心应将该次调用的使用数据按能力标签映射到能力图谱。
9. 对于任意有效的技能定义,技能能力中心对其进行序列化保存再读取后,应得到与原技能定义等价的技能定义(往返一致性)。
### 需求 14:能力图谱统一底座
**用户故事:** 作为学生,我希望各模块的数据通过统一的能力体系连接,以便我的学习、对练、技能使用与画像彼此打通。
#### 验收标准(Acceptance Criteria
1. 能力图谱应维护一套统一的能力标签体系,其中每个能力标签具有唯一标识与所属能力维度,供学习空间、课程对练、临床情景对话对练、研究技能、协同能力与职业规划共同引用。
2. 当任意模块产生一条可计入能力的数据时,能力图谱应在 5 秒内将该数据映射到 1 至 10 个已定义的能力标签。
3. 如果某模块提交的数据引用了能力图谱中未定义的能力标签,则能力图谱应拒绝该映射、不创建映射记录、记录拒绝原因,并向提交方返回表明能力标签未定义的提示。
4. 当学生请求查看能力概览时,能力图谱应在 5 秒内聚合来自各模块的能力数据,并按能力维度以 0 到 100 的量化分值返回该学生的能力水平。
5. 如果某一能力维度缺少足以计算能力水平的数据,则能力图谱应将该维度标记为"数据不足",并保留其余维度的能力水平。
### 需求 15:导师端与教学问责
**用户故事:** 作为导师,我希望审核题目、点评学生成果并查看所带学生的画像,以便履行带教职责。
#### 验收标准(Acceptance Criteria
1. 当导师审核一道题目时,导师端应允许该导师通过或退回该题目,并在退回时记录原因。
2. 当导师对一条学习成果进行点评时,导师端应将点评内容关联到该学习成果并对该学生可见。
3. 在导师与学生存在带教关系的情况下,导师端应允许该导师查看其所带学生的学生画像。
4. 如果导师请求查看非其所带学生的画像,则合规模块应拒绝该请求并记录该次越权访问尝试。
### 需求 16:AI 可信与可解释
**用户故事:** 作为学生和导师,我希望 AI 的评价、建议与总结都给出依据,以便我能够信任并核验 AI 的输出。
#### 验收标准(Acceptance Criteria
1. 当本系统生成任意 AI 评价、建议或总结时,本系统应为该输出附带可信度标注。
2. 可信度标注应包含 AI 输出所依据的至少一条来源以及该输出取值范围为 0% 至 100% 的置信度。
3. 当用户请求查看某条 AI 输出的依据时,本系统应在 3 秒内展示该输出可追溯到的来源条目及其引用标识。
4. 如果一条 AI 输出无法追溯到任何来源,则本系统应将该输出标注为"未经核验",并在向用户呈现该输出时一并显示该标注。
### 需求 17:权限分级与审计
**用户故事:** 作为管理员,我希望系统按角色分级控制访问并保留审计日志,以便保障数据安全与合规。
#### 验收标准(Acceptance Criteria
1. 合规模块应为学生、导师与管理员各自定义访问权限范围,且每个权限范围应列出可访问的资源类型与允许的操作类型。
2. 当用户访问一项处于其角色权限范围内的受保护资源时,合规模块应允许该次访问。
3. 如果用户访问超出其角色权限范围的资源,则合规模块应拒绝该次访问、保持该资源不被访问,并记录包含操作者、时间、资源标识与拒绝原因的事件。
4. 当用户对敏感数据执行访问、导出或修改操作时,合规模块应在 5 秒内记录包含操作者、时间、操作类型与数据范围的审计日志。
-275
View File
@@ -1,275 +0,0 @@
# Implementation Plan
## Overview
本任务清单将设计转化为增量式编码任务。任务遵循测试驱动、底座先行的顺序:先建立能力图谱与技能能力中心两个底座及合规/可信横切层,再实现各业务模块,最后串联端到端流程。带 `*` 的任务为可选。
## Tasks
- [x] 1. 项目脚手架与共享基础设施
- 初始化 NestJS + TypeScript 后端工程与 PostgreSQL 连接,建立模块化目录结构
- 实现统一的 `Result<T, E>` 返回类型与错误基类(区分校验/生成/授权/系统错误)
- 配置测试框架(Jest)与属性测试库(fast-check),建立 mock AI 网关与 mock 资料来源适配器骨架
- _Requirements: 全局基础_
- [x] 2. 能力图谱底座(Competency_Graph
- [x] 2.1 能力标签体系与数据模型
- 实现 `CompetencyTag`(唯一标识、所属维度)与 `CompetencyDimension` 模型及持久化
- 实现统一标签体系的维护与 `listTags()` 接口
- 编写单元测试覆盖标签定义与维度归属
- _Requirements: 14.1_
- [x] 2.2 能力数据映射与校验
- 实现 `mapData()`:将模块数据映射到 1-10 个已定义标签(5 秒内)
- 实现未定义标签拒绝逻辑:拒绝映射、不创建记录、记录原因、返回提示
- 编写属性测试验证 Property 2(能力标签映射有效性)
- _Requirements: 14.2, 14.3_
- [x] 2.3 能力概览聚合
- 实现 `getCompetencyOverview()`:按维度以 0-100 量化分值聚合(5 秒内)
- 实现数据不足维度标记"数据不足"并保留其余维度
- 编写属性测试验证 Property 3(画像维度分值有界性,能力概览部分)
- _Requirements: 14.4, 14.5_
- [x] 3. 技能能力中心底座(Skill_Center
- [x] 3.1 技能定义模型与序列化
- 实现 `SkillDefinition` 五要素结构(输入规格、AI 处理逻辑、知识源绑定、输出格式、可信度标注规则)
- 实现 `serialize()` / `deserialize()`
- 编写属性测试验证 Property 1(技能定义序列化往返一致性)
- _Requirements: 13.2, 13.9_
- [x] 3.2 技能治理:配置、启用与审计
- 实现 `upsertSkillDefinition()``enableSkill()`,限定管理员或导师操作
- 实现技能定义变更的审计日志记录(操作者、时间、变更内容)
- 初始化至少 8 个内置技能定义(资料查询、检索式生成、文献综述、病例分析、鉴别诊断辅助、医患沟通模拟、医学翻译、引用生成)
- 编写单元测试覆盖治理流程与技能库完整性
- _Requirements: 13.1, 13.6, 13.7_
- [x] 3.3 技能调用与失败处理
- 实现 `invokeSkill()`:输入规格校验、按输出格式返回结果并附可信度标注(30 秒内)
- 实现输入不符规格的拒绝、知识源不可用或处理失败的终止(不返回结果与标注、提示失败)
- 仅成功调用完成才写入能力图谱
- 编写单元测试覆盖正常路径与各错误路径
- _Requirements: 13.3, 13.4, 13.5, 13.8_
- [x] 4. 横切层:合规模块与 AI 可信层
- [x] 4.1 权限分级与访问判定
- 实现 `checkAccess()`:为学生/导师/管理员定义权限范围(可访问资源类型与允许操作类型)
- 实现范围内允许、越权拒绝并记录拒绝事件(操作者、时间、资源标识、拒绝原因)
- 编写属性测试验证 Property 6(权限判定一致性)
- _Requirements: 17.1, 17.2, 17.3_
- [x] 4.2 知情同意授权与画像脱敏
- 实现 `ConsentRecord` 模型(范围、用途、有效期、撤销)与 `verifyConsent()` / `revokeConsent()`
- 实现 `resolveProfileView()`:非本人无有效授权时拒绝完整画像、对未授权敏感字段脱敏(2 秒内,仅返回已授权字段)
- 实现授权撤销即时失效、此后按未授权处理
- 编写属性测试验证 Property 4(授权强制不变量)
- _Requirements: 7.2, 7.3, 7.4, 7.5, 7.8_
- [x] 4.3 审计日志
- 实现 `writeAuditLog()`:敏感数据访问/导出/修改记录(操作者、时间、操作类型、数据范围,5 秒内),保留≥12 个月
- 编写单元测试覆盖审计字段完整性与保留策略
- _Requirements: 7.6, 17.4_
- [x] 4.4 AI 可信层
- 实现统一可信度标注封装:为 AI 输出附带≥1 来源与 0%-100% 置信度
- 实现依据查看(3 秒内展示可追溯来源条目及引用标识)与无法溯源时标注"未经核验"
- 编写单元测试覆盖可信度标注与未经核验标记
- _Requirements: 16.1, 16.2, 16.3, 16.4_
- [x] 5. 个人学习空间(Learning_Space
- [x] 5.1 学习成果模型与新增校验
- 实现 `Achievement` 模型与成果类型枚举
- 实现 `addAchievement()`:必填元数据校验、标题≤200 字符与时间有效性校验,失败时拒绝且不创建记录
- 编写属性测试验证 Property 7(错误路径数据保全,学习成果部分)
- _Requirements: 1.1, 1.2, 1.6, 1.9_
- [x] 5.2 自动归档与里程碑
- 实现保存成功后按学年、学期归档;含临床轮转科室信息时额外按科室归档
- 实现 `markMilestone()`:标记里程碑并关联节点内成果
- 编写单元测试覆盖归档维度与里程碑关联
- _Requirements: 1.3, 1.4, 1.8_
- [x] 5.3 成果检索与能力标签关联
- 实现 `listAchievements()`:按时间倒序、支持按成果类型/学年/学期/轮转科室筛选、每页≤50 分页
- 实现保存成功后关联能力图谱标签;无匹配标签时标记"待关联能力标签"并提示
- 编写属性测试验证 Property 8(分页边界不变量,学习空间部分)
- _Requirements: 1.5, 1.7, 1.10_
- [x] 6. AI 评估引擎(AI_Evaluation_Engine
- [x] 6.1 形成性与终结性评价
- 实现 `generateFormativeEvaluation()`30 秒内)与 `generateSummativeEvaluation()`(节点须有成果)
- 实现评价附带可信度标注(≥1 依据来源)与发展建议引用≥1 能力标签
- 编写单元测试覆盖评价生成与标注
- _Requirements: 2.1, 2.2, 2.3, 2.4, 2.7_
- [x] 6.2 评价错误路径
- 实现信息不足时中止、保留数据、提示缺失类别
- 实现生成失败或超时时中止、保留数据、提示失败
- 编写单元测试覆盖错误路径(验证 Property 7 相关部分)
- _Requirements: 2.5, 2.6_
- [x] 7. 课程对练引擎(Practice_Engine
- [x] 7.1 题目生成与权威源绑定
- 实现 `generateQuestions()`:基于课程内容生成 5-50 道题(30 秒内),支持 A1/A2/A3/A4/病例分析/临床决策题型
- 实现每题绑定≥1 权威知识源并记录引用标识;无法绑定时不进入审核并记录原因
- 实现课程内容不足时中止并提示
- 编写单元测试覆盖生成、题型、绑定与错误路径
- _Requirements: 3.1, 3.2, 3.3, 3.7, 3.8_
- [x] 7.2 题目审核状态机
- 实现题目状态流转(待导师审核→可用于对练/已退回),审核前不向学生发布
- 实现导师通过/退回(退回记录原因)
- 编写单元测试覆盖状态机与导师审核
- _Requirements: 3.4, 3.5, 3.6, 15.1_
- [x] 7.3 模拟对练与结果诊断
- 实现 `startPractice()` / `submitAnswer()` / `finishPractice()`:逐题呈现采集作答、3 秒内判定正误、单题超 120 秒判错并继续
- 实现对练报告(正确率、用时、薄弱环节=正确率<60% 的能力标签)并按能力标签映射能力图谱
- 实现 AI 评估引擎对每个薄弱环节生成改进建议并附可信度标注
- 编写单元测试覆盖对练流程、报告与映射
- _Requirements: 4.1, 4.2, 4.4, 4.5, 4.6, 4.7, 4.8_
- [x] 8. 临床情景对话对练(Clinical_Dialogue_Practice
- 实现 `startDialogue()`:基于绑定权威知识源 10 秒内呈现情景;未绑定时阻止启动、不创建记录、提示
- 实现 `sendTurn()` 多轮对话(最多 50 轮)并逐轮记录学生输入与系统应答
- 实现 `finishDialogue()`:30 秒内生成含问诊完整性/临床推理/医患沟通三维报告并映射能力图谱;失败或超时时中止、保留对话记录、提示
- 编写单元测试覆盖发起、多轮、报告与错误路径
- _Requirements: 5.1, 5.2, 5.3, 5.4, 5.5, 5.6_
- [x] 9. 学生画像引擎(Profile_Engine
- 实现 `generateProfile()`:基于学习空间与能力图谱生成六维度画像(0-100,5 秒内)
- 实现能力图谱更新后 10 秒内同步、每项结论可追溯≥1 来源记录
- 实现数据不足维度标记"数据不足"并保留其余;敏感字段标记;仅采集与维度直接相关字段(数据最小化)
- 编写属性测试验证 Property 3(画像维度分值有界性,画像部分)
- _Requirements: 6.1, 6.2, 6.3, 6.4, 6.5, 7.1, 7.7_
- [x] 10. 职业规划模块(Career_Module
- [x] 10.1 职业目标与胜任力模型
- 实现 `setCareerGoal()`3 秒内关联岗位胜任力模型并展示
- 实现胜任力模型四维度(科学与学术/临床能力/健康与社会/职业素养),每维度≥3 能力标签
- 实现无匹配模型时提示并推荐≥3 相近目标;关联系统错误时提示并保留已设目标
- 编写单元测试覆盖目标设定与错误路径
- _Requirements: 8.1, 8.2, 8.3, 8.4, 8.5_
- [x] 10.2 动态闭环发展规划
- 实现 `generateDevelopmentPlan()`:逐项对照能力水平与要求、标记能力差距项(含缺数据项)
- 实现每差距项≥1 建议行动(标明目标水平)、推荐≥1 学习资源或对练任务、引用对应能力标签
- 实现能力图谱更新后再次请求时重算全部差距项;未选目标/模型不可用时拒绝并保留数据;差距项无资源时保留并标注暂无推荐
- 编写单元测试覆盖对照、规划生成、动态更新与错误路径
- _Requirements: 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7_
- [x] 11. 研究资料查询技能(Research_Query_Skill
- [x] 11.1 检索式生成与检索
- 实现 `generateSearchQuery()`NL→PICO/MeSH 检索式(10 秒内,问题 1-2000 字符)
- 实现 `search()`:指定来源 30 秒内检索、每页≤50 分页;空结果返回空列表并提示;来源全不可用时中止、保留检索式、提示
- 实现问题为空/超长/无医学要素时拒绝生成并提示
- 实现结果每条仅含检索信息/摘要/原文链接(不存储分发全文)、查询完成 5 秒内映射能力图谱
- 编写单元测试覆盖检索式、检索、筛选与错误路径
- _Requirements: 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8_
- [x] 11.2 总结、证据分级与引用管理
- 实现 `summarize()`:30 秒内生成总结,每条结论附≥1 来源引用,每条资料标注唯一证据分级
- 实现无法溯源结论标注"未验证"且不作为引用输出;呈现总结时显示"仅辅助不替代阅读原文"提示
- 实现 `generateCitation()` / `exportCitations()`Vancouver/GB-T 7714 格式、导出 EndNote/NoteExpress;生成或导出失败时中止、保留数据、提示
- 编写属性测试验证 Property 5(引用可追溯不变量)
- _Requirements: 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7_
- [x] 12. AI 协同能力培养模块(AI_Collaboration_Module
- 实现协同训练任务(提问能力/批判性验证/责任边界意识/协同工作流四维度各≥1)
- 实现 `evaluateTask()`:30 秒内四维度 0-100 评估;直接采用未核验 AI 输出时提示并要求核验、计入批判性验证;评估结果 5 秒内映射能力图谱计入画像与胜任力对照
- 实现导师点评(对学生可见);评估失败或超时时中止、保留记录、提示;维度数据不足时标记"数据不足"并保留其余
- 编写单元测试覆盖任务、评估、点评与错误路径
- _Requirements: 12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7_
- [x] 13. 导师端集成
- 集成题目审核(复用 7.2)、成果点评(关联学习成果并对学生可见)
- 实现带教关系校验:允许查看所带学生画像;查看非所带学生画像时合规模块拒绝并记录越权尝试
- 编写单元测试覆盖点评与带教关系访问控制
- _Requirements: 15.2, 15.3, 15.4_
- [x] 14. 端到端集成与贯通验证
- 串联学习成果→能力标签→画像→职业规划的数据贯通流程并编写集成测试
- 串联技能调用(课程对练/研究查询)→能力图谱→画像的贯通流程并编写集成测试
- 验证全系统 AI 输出均经 AI 可信层、敏感资源访问均经合规模块
- 运行全部属性测试(Property 1-8)确认核心不变量成立
- _Requirements: 2.4, 4.6, 5.4, 9.1, 12.4, 14.1, 16.1, 17.2_
- [x] 15. 三端前端界面(可选)
- 实现学生端(学习空间、对练、画像、职业规划、研究查询、协同训练)核心界面
- 实现导师端(题目审核、成果点评、带教学生画像)与管理端(技能治理、权限与合规管理)核心界面
- _Requirements: 全部用户故事的界面呈现_
## Task Dependency Graph
```mermaid
graph TD
T1["1. 脚手架与基础设施"]
T2["2. 能力图谱底座"]
T3["3. 技能能力中心底座"]
T4["4. 合规与AI可信横切层"]
T5["5. 个人学习空间"]
T6["6. AI评估引擎"]
T7["7. 课程对练引擎"]
T8["8. 临床情景对话对练"]
T9["9. 学生画像引擎"]
T10["10. 职业规划模块"]
T11["11. 研究资料查询技能"]
T12["12. AI协同能力培养"]
T13["13. 导师端集成"]
T14["14. 端到端集成"]
T15["15*. 三端前端界面"]
T1 --> T2
T1 --> T3
T1 --> T4
T2 --> T5
T3 --> T7
T3 --> T8
T3 --> T11
T4 --> T9
T4 --> T13
T5 --> T6
T5 --> T9
T6 --> T7
T2 --> T6
T2 --> T9
T9 --> T10
T2 --> T10
T2 --> T12
T7 --> T13
T9 --> T13
T5 --> T14
T6 --> T14
T7 --> T14
T8 --> T14
T9 --> T14
T10 --> T14
T11 --> T14
T12 --> T14
T13 --> T14
T14 --> T15
```
```json
{
"waves": [
{ "wave": 1, "tasks": ["1"] },
{ "wave": 2, "tasks": ["2", "3", "4"] },
{ "wave": 3, "tasks": ["5"] },
{ "wave": 4, "tasks": ["6", "7", "8", "9", "11", "12"] },
{ "wave": 5, "tasks": ["10", "13"] },
{ "wave": 6, "tasks": ["14"] },
{ "wave": 7, "tasks": ["15"] }
]
}
```
## Notes
- 任务 2(能力图谱)与任务 3(技能能力中心)是两大底座,应优先实现,多数业务模块依赖它们。
- 任务 4(合规与 AI 可信横切层)为所有涉及敏感数据访问与 AI 输出的模块提供统一保障,建议与底座并行推进。
- 每个业务模块任务均包含对应的单元测试或属性测试,覆盖正常路径与错误路径。
- 属性测试(Property 1-8)分散在相关任务中实现,并在任务 14 统一运行确认。
- 任务 15 为可选的前端界面实现,后端模块与测试可独立于前端完成验证。
- 技术栈(NestJS + TypeScript + PostgreSQL + Jest + fast-check)为设计阶段的假设,实现前可调整。
-112
View File
@@ -1,112 +0,0 @@
# ===== 燃尽模式规则 START =====
# 最高优先级规则 - 必须严格遵守(Windsurf 专用)
⚠️⚠️⚠️ 每次回复结束前必须执行以下命令!没有任何例外!⚠️⚠️⚠️
## 执行规则
1. 完成任务后,执行弹窗命令(跨平台,Windows/Mac/Linux 通用):
node "/Users/freedak/.ranjin-mode/dialog-trigger.js" "windsurf" "qlvw9j" "AI想要结束的原因摘要"
📱 **手机端通知**:执行此命令时会自动通知手机端(如果远程服务已开启),用户可以在手机上查看消息并发送反馈。
2. 仔细阅读命令输出的每一行:
- ACTION: continue 或 end(用户的选择)
- FEEDBACK: 用户输入的具体指令或反馈内容(⚠️ 必须完整阅读并执行!)
* 反馈可能来自电脑端弹窗或手机端远程输入
- IMAGES: 用户上传的图片路径(如有,必须用read_file工具查看)
3. 根据输出决定下一步:
- 如果 ACTION 是 "continue"
* ⚠️ 必须仔细阅读 FEEDBACK 后面的全部内容
* ⚠️ 必须按照 FEEDBACK 中用户的具体指令执行任务
* ⚠️ 不要忽略 FEEDBACK,不要只说"用户选择继续"
- 如果 ACTION 是 "end" 或 "stop":停止工作
- ⚠️ 如果命令被取消/跳过/无输出:必须重新执行弹窗命令!
## 核心规则
1. 完整输出 - 输出完整代码和答案,禁止省略
2. 持续执行 - 复杂任务一次性完成
3. 结束确认 - 必须执行弹窗命令后才能结束
4. FEEDBACK必读 - 用户的FEEDBACK是新的任务指令,必须执行
## 手机端远程功能
- 📱 当执行 dialog-trigger.js 命令时,会自动通知手机端(如果远程服务已开启)
- 📱 用户可以在手机浏览器中查看 AI 的消息和状态
- 📱 用户可以在手机上输入反馈,反馈会通过 FEEDBACK 字段传递给你
- 📱 手机端和电脑端弹窗功能完全同步,支持双向通信
## ⚠️ 唯一合法的结束条件
只有当命令输出包含 ACTION: end 或 ACTION: stop 时才能结束对话!
以下情况都不能结束,必须重新执行弹窗命令:
- 命令被用户点击 Skip 跳过
- 命令执行失败或超时
- 命令没有输出
- 工作区取消了命令
## 禁止
- 禁止不执行弹窗命令就结束
- 禁止跳过弹窗流程
- 禁止忽略FEEDBACK内容
- 禁止在没有收到 ACTION: end/stop 的情况下结束
# ===== 燃尽模式规则 END =====
# 最高优先级规则 - 必须严格遵守(Windsurf 专用)
⚠️⚠️⚠️ 每次回复结束前必须执行以下命令!没有任何例外!⚠️⚠️⚠️
## 执行规则
1. 完成任务后,执行弹窗命令(跨平台,Windows/Mac/Linux 通用):
node "/Users/freedak/.ranjin-mode/dialog-trigger.js" "windsurf" "qlvw9j" "AI想要结束的原因摘要"
📱 **手机端通知**:执行此命令时会自动通知手机端(如果远程服务已开启),用户可以在手机上查看消息并发送反馈。
2. 仔细阅读命令输出的每一行:
- ACTION: continue 或 end(用户的选择)
- FEEDBACK: 用户输入的具体指令或反馈内容(⚠️ 必须完整阅读并执行!)
* 反馈可能来自电脑端弹窗或手机端远程输入
- IMAGES: 用户上传的图片路径(如有,必须用read_file工具查看)
3. 根据输出决定下一步:
- 如果 ACTION 是 "continue"
* ⚠️ 必须仔细阅读 FEEDBACK 后面的全部内容
* ⚠️ 必须按照 FEEDBACK 中用户的具体指令执行任务
* ⚠️ 不要忽略 FEEDBACK,不要只说"用户选择继续"
- 如果 ACTION 是 "end" 或 "stop":停止工作
- ⚠️ 如果命令被取消/跳过/无输出:必须重新执行弹窗命令!
## 核心规则
1. 完整输出 - 输出完整代码和答案,禁止省略
2. 持续执行 - 复杂任务一次性完成
3. 结束确认 - 必须执行弹窗命令后才能结束
4. FEEDBACK必读 - 用户的FEEDBACK是新的任务指令,必须执行
## 手机端远程功能
- 📱 当执行 dialog-trigger.js 命令时,会自动通知手机端(如果远程服务已开启)
- 📱 用户可以在手机浏览器中查看 AI 的消息和状态
- 📱 用户可以在手机上输入反馈,反馈会通过 FEEDBACK 字段传递给你
- 📱 手机端和电脑端弹窗功能完全同步,支持双向通信
## ⚠️ 唯一合法的结束条件
只有当命令输出包含 ACTION: end 或 ACTION: stop 时才能结束对话!
以下情况都不能结束,必须重新执行弹窗命令:
- 命令被用户点击 Skip 跳过
- 命令执行失败或超时
- 命令没有输出
- 工作区取消了命令
## 禁止
- 禁止不执行弹窗命令就结束
- 禁止跳过弹窗流程
- 禁止忽略FEEDBACK内容
- 禁止在没有收到 ACTION: end/stop 的情况下结束
+44 -1
View File
@@ -29,4 +29,47 @@ AI用量:用户、AI应用、用例
11、导师:
带教学生列表
针对每个学生带教的工作安排和进度展现
带教学生工作完成情况和总体表现(问题分析)、指导方向和要点等
带教学生工作完成情况和总体表现(问题分析)、指导方向和要点等
---
# 一页PPT总结
## 医科类高校 AI 学习中心系统
**定位**:面向医科类高校的 AI 赋能学习平台,覆盖学生、导师、管理员三类角色,贯穿在校学习全流程。
---
### 核心功能矩阵(18 大模块)
| 类别 | 模块 | 说明 |
|------|------|------|
| **学习管理** | 个人学习空间 | 汇集在校学习成果,AI 评价并给出发展建议 |
| | 课程对练 | AI 梳理课程形成练习题,模拟练习 + 分析评价 |
| | 执业医师备考 | AI 生成试题(内置/AI/自动),答题分析、备考统计 |
| | 轮转见习 | 轮转记录管理,见习过程跟踪 |
| | 技能视频 | 医学技能视频检索与学习 |
| | 学术交流 | 学术交流记录管理 |
| **AI 能力** | AI 协同能力培养 | 系统培养医学生与 AI 协作素养(提问、验证、负责任使用) |
| | Skill 能力中心 | 可复用 AI Skill 库(资料查询、病例分析、文献综述等),按需调用 |
| | 研究资料查询 | AI 检索医学文献/指南/数据库,辅助筛选、总结与引用 |
| **临床实训** | 临床对话 | AI 模拟临床问诊场景,训练临床思维 |
| | 病例推理 | AI 辅助病例分析与推理训练 |
| | 用药安全 | AI 辅助用药安全检查与教育 |
| | 医学知识 | 医学知识检索与学习 |
| **发展规划** | 学生画像 | 基于学习数据生成学生画像,支撑就业发展 |
| | 职业规划 | 确定职业目标,分解岗位胜任力模型,给出发展规划 |
| | 胜任力图谱 | 可视化学生胜任力成长路径 |
| **导师带教** | 导师工作台 | 带教学生列表、工作安排、进度跟踪、表现分析与指导 |
| **平台管理** | 用户与合规管理 | 用户/角色/权限/合规管理,AI 应用上下架审核,日志审计与 AI 用量统计 |
---
### 技术架构
- **后端**NestJS + TypeORM,支持 PostgreSQL 持久化 / 内存模式双切换
- **前端**Next.js + Tailwind CSS,学生 / 导师 / 管理员三端分离
- **AI 网关**:统一 AI 接口适配层,支持多模型接入
- **认证**:JWT 基于角色的访问控制(Student / Mentor / Admin
- **特色**:模块化设计,18 个业务模块独立注册,可按需扩展
+126 -124
View File
@@ -6,21 +6,20 @@
# ./baidu-backup.sh # 自动使用 /年份/月日
# ============================================================
# 不使用 set -e(与并行后台进程不兼容)
set -e
# ---- 配置 ----
APP_KEY="z3gemBZfg7KYj6U3eHNfIzTs7uYS9OMh"
SECRET_KEY="ptCKj2DfxL0KtGR1pM08c9KO2t2UC7SR"
TOKEN_FILE="$HOME/.baidu_pan_token.json"
BLOCK_SIZE=$((32 * 1024 * 1024)) # 32MB 大分片减少HTTP开销
PARALLEL=4 # 并行上传数
BLOCK_SIZE=$((4 * 1024 * 1024)) # 4MB
# ---- 自动识别项目 ----
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_NAME="$(basename "$SCRIPT_DIR")"
PARENT_DIR="$(dirname "$SCRIPT_DIR")"
ZIP_FILE="/tmp/${PROJECT_NAME}.zip"
MD5_DIR="/tmp/baidu_md5"
MD5_FILE="/tmp/baidu_md5_list.txt"
# ---- 目标目录 ----
if [ -n "$1" ]; then
@@ -43,7 +42,7 @@ echo ""
# 步骤1: 打包
# ============================================================
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "[1/6] 📦 打包项目文件..."
echo "[1/5] 📦 打包项目文件..."
rm -f "$ZIP_FILE"
cd "$PARENT_DIR"
@@ -76,7 +75,7 @@ echo " ✅ 打包完成: ${FILE_SIZE_MB}MB"
# ============================================================
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "[2/6] 🔑 获取百度网盘授权..."
echo "[2/5] 🔑 获取百度网盘授权..."
ACCESS_TOKEN=""
@@ -159,27 +158,12 @@ with open('$TOKEN_FILE', 'w') as f: json.dump(token, f)
fi
# ============================================================
# 步骤3: 创建远程目录
# ============================================================
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "[3/6] 📁 创建远程目录 ${REMOTE_DIR} ..."
DIR_RESP=$(curl -s "https://pan.baidu.com/rest/2.0/xpan/file?method=create&access_token=${ACCESS_TOKEN}" \
-d "path=${REMOTE_DIR}&size=0&isdir=1")
DIR_ERRNO=$(echo "$DIR_RESP" | python3 -c "import sys,json;print(json.load(sys.stdin).get('errno',99))" 2>/dev/null)
if [ "$DIR_ERRNO" = "0" ] || [ "$DIR_ERRNO" = "-8" ]; then
echo " ✅ 目录已就绪"
else
echo " ⚠️ 目录创建返回: errno=$DIR_ERRNO(继续尝试上传)"
fi
# ============================================================
# 步骤4: 预创建文件
# 步骤3: 创建文件
# ============================================================
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
BLOCKS=$(( (FILE_SIZE + BLOCK_SIZE - 1) / BLOCK_SIZE ))
echo "[4/6] 📋 预创建文件(${BLOCKS}个分片)..."
echo "[3/5] 📋 预创建文件(${BLOCKS}个分片)..."
BLOCK_LIST=$(python3 -c "import json; print(json.dumps(['0'*32]*$BLOCKS))")
PRE_RESP=$(curl -s "https://pan.baidu.com/rest/2.0/xpan/file?method=precreate&access_token=${ACCESS_TOKEN}" \
-d "path=${REMOTE_PATH}&size=${FILE_SIZE}&isdir=0&autoinit=1&block_list=${BLOCK_LIST}")
@@ -192,134 +176,152 @@ fi
echo " ✅ 预创建成功"
# ============================================================
# 步骤5: 分片上传(32MB大分片 + 并行上传
# 步骤4: 分片上传(并发
# ============================================================
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "[5/6] 🚀 上传中(${PARALLEL}路并行, 每片$((BLOCK_SIZE/1024/1024))MB..."
PARALLEL="${BAIDU_PARALLEL:-8}"
if [ "$PARALLEL" -gt "$BLOCKS" ]; then PARALLEL=$BLOCKS; fi
echo "[4/5] 🚀 上传中(${PARALLEL} 路并发)..."
echo ""
# 预切割文件
SPLIT_DIR="/tmp/baidu_chunks"
rm -rf "$SPLIT_DIR"
mkdir -p "$SPLIT_DIR"
split -b ${BLOCK_SIZE} -a 4 "$ZIP_FILE" "${SPLIT_DIR}/chunk_"
CHUNK_FILES=($(ls "${SPLIT_DIR}/chunk_"* | sort))
BLOCKS=${#CHUNK_FILES[@]}
echo " 📊 已切割为 ${BLOCKS} 个分片"
echo ""
# 创建md5结果目录
MD5_DIR="/tmp/baidu_md5"
rm -rf "$MD5_DIR"
mkdir -p "$MD5_DIR"
UNSORTED_MD5="/tmp/baidu_md5_unsorted_${UPLOAD_ID}.txt"
PROGRESS_FILE="/tmp/baidu_progress_${UPLOAD_ID}.txt"
ERR_FILE="/tmp/baidu_err_${UPLOAD_ID}.txt"
DONE_FLAG="/tmp/baidu_done_${UPLOAD_ID}"
: > "$UNSORTED_MD5"
: > "$PROGRESS_FILE"
: > "$ERR_FILE"
rm -f "$DONE_FLAG"
: > "$MD5_FILE"
START_TIME=$(date +%s)
DONE_COUNT=0
FAIL_FLAG="/tmp/baidu_upload_fail"
rm -f "$FAIL_FLAG"
# 单片上传函数(带重试
upload_chunk() {
local SEQ=$1
local CHUNK_FILE=$2
local RETRY=0
local MAX_RETRY=3
while [ $RETRY -lt $MAX_RETRY ]; do
local RESP
RESP=$(curl -s --connect-timeout 30 --max-time 300 \
"https://d.pcs.baidu.com/rest/2.0/pcs/superfile2?method=upload&access_token=${ACCESS_TOKEN}&type=tmpfile&path=${REMOTE_PATH}&uploadid=${UPLOAD_ID}&partseq=${SEQ}" \
-F "file=@${CHUNK_FILE}" 2>&1)
local MD5
MD5=$(echo "$RESP" | python3 -c "import sys,json;print(json.load(sys.stdin).get('md5',''))" 2>/dev/null)
if [ -n "$MD5" ]; then
echo "$MD5" > "${MD5_DIR}/$(printf '%04d' $SEQ).md5"
return 0
fi
RETRY=$((RETRY + 1))
if [ $RETRY -lt $MAX_RETRY ]; then
sleep 2
fi
# 单片上传 worker(并发安全:单行 echo < PIPE_BUF 是原子写
upload_part() {
local i=$1
local chunk="/tmp/baidu_chunk_${UPLOAD_ID}_${i}"
dd if="$ZIP_FILE" bs="$BLOCK_SIZE" skip="$i" count=1 2>/dev/null > "$chunk"
local resp md5 attempt
md5=""
for attempt in 1 2 3; do
resp=$(curl -s --max-time 600 \
"https://d.pcs.baidu.com/rest/2.0/pcs/superfile2?method=upload&access_token=${ACCESS_TOKEN}&type=tmpfile&path=${REMOTE_PATH}&uploadid=${UPLOAD_ID}&partseq=${i}" \
-F "file=@${chunk}")
md5=$(echo "$resp" | python3 -c "import sys,json;print(json.load(sys.stdin).get('md5',''))" 2>/dev/null)
[ -n "$md5" ] && break
sleep $((attempt * 2))
done
echo "chunk $SEQ failed: $RESP" > "${FAIL_FLAG}_${SEQ}"
return 1
}
# 并行上传
for ((i=0; i<BLOCKS; i+=PARALLEL)); do
PIDS=()
for ((j=0; j<PARALLEL && i+j<BLOCKS; j++)); do
SEQ=$((i + j))
upload_chunk $SEQ "${CHUNK_FILES[$SEQ]}" &
PIDS+=($!)
done
# 等待本批完成
BATCH_FAIL=0
for PID in "${PIDS[@]}"; do
wait $PID || BATCH_FAIL=1
done
if [ $BATCH_FAIL -ne 0 ]; then
echo ""
echo " ❌ 上传失败:"
cat "${FAIL_FLAG}_"* 2>/dev/null
rm -rf "$SPLIT_DIR" "$MD5_DIR" "$ZIP_FILE" "${FAIL_FLAG}_"*
exit 1
rm -f "$chunk"
if [ -z "$md5" ]; then
echo "part ${i} failed after 3 attempts: ${resp}" >> "$ERR_FILE"
return 1
fi
# 计算进度
DONE_COUNT=$((i + ${#PIDS[@]}))
if [ $DONE_COUNT -gt $BLOCKS ]; then DONE_COUNT=$BLOCKS; fi
PCT=$((DONE_COUNT * 100 / BLOCKS))
UPLOADED_MB=$((DONE_COUNT * BLOCK_SIZE / 1024 / 1024))
if [ $UPLOADED_MB -gt $FILE_SIZE_MB ]; then UPLOADED_MB=$FILE_SIZE_MB; fi
NOW=$(date +%s)
ELAPSED=$((NOW - START_TIME))
if [ $ELAPSED -gt 0 ]; then
SPEED_MB=$((UPLOADED_MB / ELAPSED))
REMAINING_MB=$((FILE_SIZE_MB - UPLOADED_MB))
if [ $SPEED_MB -gt 0 ]; then
ETA=$((REMAINING_MB / SPEED_MB))
ETA_STR="${ETA}s"
if [ $ETA -ge 60 ]; then ETA_STR="$((ETA/60))m$((ETA%60))s"; fi
echo "${i}|${md5}" >> "$UNSORTED_MD5"
echo "x" >> "$PROGRESS_FILE"
}
export -f upload_part
export ZIP_FILE BLOCK_SIZE ACCESS_TOKEN REMOTE_PATH UPLOAD_ID
export UNSORTED_MD5 PROGRESS_FILE ERR_FILE
# 后台进度刷新进程(每秒刷新一次)
(
while :; do
DONE=$(wc -l < "$PROGRESS_FILE" 2>/dev/null | tr -d ' ')
DONE=${DONE:-0}
if [ "$DONE" -gt "$BLOCKS" ]; then DONE=$BLOCKS; fi
PCT=$((DONE * 100 / BLOCKS))
UPLOADED_MB=$((DONE * BLOCK_SIZE / 1024 / 1024))
if [ $UPLOADED_MB -gt $FILE_SIZE_MB ]; then UPLOADED_MB=$FILE_SIZE_MB; fi
NOW=$(date +%s)
ELAPSED=$((NOW - START_TIME))
if [ $ELAPSED -gt 0 ] && [ $DONE -gt 0 ]; then
SPEED_KB=$((DONE * BLOCK_SIZE / 1024 / ELAPSED))
SPEED_INT=$((SPEED_KB / 1024))
SPEED_DEC=$(( (SPEED_KB % 1024) * 10 / 1024 ))
if [ "$SPEED_KB" -gt 0 ]; then
REMAINING_KB=$(( (FILE_SIZE - DONE * BLOCK_SIZE) / 1024 ))
if [ $REMAINING_KB -lt 0 ]; then REMAINING_KB=0; fi
ETA=$(( REMAINING_KB / SPEED_KB ))
ETA_MIN=$((ETA / 60))
ETA_SEC=$((ETA % 60))
ETA_STR="${ETA_MIN}m${ETA_SEC}s"
else
ETA_STR="计算中"
fi
else
SPEED_INT=0
SPEED_DEC=0
ETA_STR="计算中"
fi
else
SPEED_MB=0
ETA_STR="计算中"
fi
BAR_FILLED=$((PCT * 30 / 100))
BAR_EMPTY=$((30 - BAR_FILLED))
BAR=""
for ((b=0; b<BAR_FILLED; b++)); do BAR="${BAR}"; done
for ((b=0; b<BAR_EMPTY; b++)); do BAR="${BAR}"; done
printf "\r %s %3d%% | %d/%dMB | %dMB/s | 剩余%s " "$BAR" "$PCT" "$UPLOADED_MB" "$FILE_SIZE_MB" "$SPEED_MB" "$ETA_STR"
done
BAR_FILLED=$((PCT * 30 / 100))
BAR_EMPTY=$((30 - BAR_FILLED))
BAR=""
for ((b=0; b<BAR_FILLED; b++)); do BAR="${BAR}"; done
for ((b=0; b<BAR_EMPTY; b++)); do BAR="${BAR}"; done
printf "\r %s %3d%% | %d/%dMB | %d.%dMB/s | 剩余%s " "$BAR" "$PCT" "$UPLOADED_MB" "$FILE_SIZE_MB" "$SPEED_INT" "$SPEED_DEC" "$ETA_STR"
if [ -f "$DONE_FLAG" ] || [ "$DONE" -ge "$BLOCKS" ]; then
break
fi
sleep 1
done
) &
PROGRESS_PID=$!
# 并发上传:xargs -P 同时跑 PARALLEL 个 worker(绕开百度 PCS 单连接限速)
XARGS_RC=0
seq 0 $((BLOCKS-1)) | xargs -P "$PARALLEL" -I % bash -c 'upload_part "$@"' _ % || XARGS_RC=$?
# 通知进度进程退出并等待,最后重画一行
touch "$DONE_FLAG"
wait "$PROGRESS_PID" 2>/dev/null || true
echo ""
if [ "$XARGS_RC" -ne 0 ]; then
echo ""
echo " ❌ 分片上传失败:"
if [ -s "$ERR_FILE" ]; then
head -n 5 "$ERR_FILE"
fi
rm -f "$ZIP_FILE" "$MD5_FILE" "$UNSORTED_MD5" "$PROGRESS_FILE" "$ERR_FILE" "$DONE_FLAG"
rm -f /tmp/baidu_chunk_${UPLOAD_ID}_*
exit 1
fi
# 校验分片数
DONE_COUNT=$(wc -l < "$UNSORTED_MD5" | tr -d ' ')
if [ "$DONE_COUNT" != "$BLOCKS" ]; then
echo ""
echo " ❌ 分片数不匹配: ${DONE_COUNT}/${BLOCKS}"
if [ -s "$ERR_FILE" ]; then
head -n 5 "$ERR_FILE"
fi
rm -f "$ZIP_FILE" "$MD5_FILE" "$UNSORTED_MD5" "$PROGRESS_FILE" "$ERR_FILE" "$DONE_FLAG"
rm -f /tmp/baidu_chunk_${UPLOAD_ID}_*
exit 1
fi
# 按 partseq 升序生成最终 MD5_FILE
sort -t'|' -k1n "$UNSORTED_MD5" | cut -d'|' -f2 > "$MD5_FILE"
rm -f "$UNSORTED_MD5" "$PROGRESS_FILE" "$ERR_FILE" "$DONE_FLAG"
echo ""
echo " ✅ 所有分片上传完成"
# 删除临时分片
rm -rf "$SPLIT_DIR"
# ============================================================
# 步骤6: 合并文件
# 步骤5: 合并文件
# ============================================================
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "[6/6] 🔗 合并文件..."
MD5_LIST=$(cat "${MD5_DIR}/"*.md5 | awk '{printf "\"%s\",", $0}' | sed 's/,$//')
echo "[5/5] 🔗 合并文件..."
MD5_LIST=$(awk '{printf "\"%s\",", $0}' "$MD5_FILE" | sed 's/,$//')
CREATE_RESP=$(curl -s "https://pan.baidu.com/rest/2.0/xpan/file?method=create&access_token=${ACCESS_TOKEN}" \
-d "path=${REMOTE_PATH}&size=${FILE_SIZE}&isdir=0&uploadid=${UPLOAD_ID}&block_list=[${MD5_LIST}]")
CREATE_ERRNO=$(echo "$CREATE_RESP" | python3 -c "import sys,json;print(json.load(sys.stdin).get('errno',99))" 2>/dev/null)
FINAL_PATH=$(echo "$CREATE_RESP" | python3 -c "import sys,json;print(json.load(sys.stdin).get('path',''))" 2>/dev/null)
# 清理
rm -f "$ZIP_FILE" /tmp/chunk_part
rm -rf "$MD5_DIR" "$FAIL_FLAG"
rm -f "$ZIP_FILE" "$MD5_FILE"
rm -f /tmp/baidu_chunk_${UPLOAD_ID}_* 2>/dev/null || true
# 计算耗时
END_TIME=$(date +%s)
+40
View File
@@ -0,0 +1,40 @@
# 一页PPT总结
## 医科类高校 AI 学习中心系统
**定位**:面向医科类高校的 AI 赋能学习平台,覆盖学生、导师、管理员三类角色,贯穿在校学习全流程。
---
### 核心功能矩阵(18 大模块)
| 类别 | 模块 | 说明 |
|------|------|------|
| **学习管理** | 个人学习空间 | 汇集在校学习成果,AI 评价并给出发展建议 |
| | 课程对练 | AI 梳理课程形成练习题,模拟练习 + 分析评价 |
| | 执业医师备考 | AI 生成试题(内置/AI/自动),答题分析、备考统计 |
| | 轮转见习 | 轮转记录管理,见习过程跟踪 |
| | 技能视频 | 医学技能视频检索与学习 |
| | 学术交流 | 学术交流记录管理 |
| **AI 能力** | AI 协同能力培养 | 系统培养医学生与 AI 协作素养(提问、验证、负责任使用) |
| | Skill 能力中心 | 可复用 AI Skill 库(资料查询、病例分析、文献综述等),按需调用 |
| | 研究资料查询 | AI 检索医学文献/指南/数据库,辅助筛选、总结与引用 |
| **临床实训** | 临床对话 | AI 模拟临床问诊场景,训练临床思维 |
| | 病例推理 | AI 辅助病例分析与推理训练 |
| | 用药安全 | AI 辅助用药安全检查与教育 |
| | 医学知识 | 医学知识检索与学习 |
| **发展规划** | 学生画像 | 基于学习数据生成学生画像,支撑就业发展 |
| | 职业规划 | 确定职业目标,分解岗位胜任力模型,给出发展规划 |
| | 胜任力图谱 | 可视化学生胜任力成长路径 |
| **导师带教** | 导师工作台 | 带教学生列表、工作安排、进度跟踪、表现分析与指导 |
| **平台管理** | 用户与合规管理 | 用户/角色/权限/合规管理,AI 应用上下架审核,日志审计与 AI 用量统计 |
---
### 目的与意义
- **赋能医学教育数字化转型**:将 AI 深度融入医科学生在校学习全流程,从课程学习、临床实训到职业规划,实现"教—学—练—评—导"闭环智能化
- **培养 AI 时代的医学生**:不仅用 AI 辅助学习,更系统培养医学生与 AI 协作的素养——学会提问、审视验证、负责任使用,为未来智慧医疗做好能力储备
- **数据驱动个性化发展**:通过学习空间数据沉淀学生画像,对照岗位胜任力模型,为每位学生提供个性化的发展规划与就业指导
- **提升导师带教效率**:AI 辅助导师跟踪学生进度、分析表现短板、精准指导,让带教从"经验驱动"走向"数据+AI 驱动"
- **构建可扩展的 AI 教育生态**:以 Skill 库为核心,持续沉淀可复用的医学 AI 能力,支撑课程对练、病例分析、文献综述等场景,随教育需求灵活扩展
+183
View File
@@ -0,0 +1,183 @@
# College AI Center — 启动与调试指南
## 项目结构
- **后端**`/` 根目录,NestJS + TypeORM(可选 PostgreSQL
- **前端**`web/` 目录,Next.js + Tailwind CSS
- **四个新模块**:轮转见习、技能视频、执业医师备考、学术交流
---
## 环境准备
复制环境变量模板并按需修改:
```bash
cp .env.example .env
```
### 核心环境变量(`.env`
| 变量 | 说明 | 默认值 |
|------|------|--------|
| `APP_PORT` | 后端服务端口 | `3000` |
| `NODE_ENV` | 运行环境 | `development` |
| `DB_ENABLED` | 是否启用 PostgreSQL 持久化 | `false` |
| `JWT_SECRET` | JWT 签名密钥 | `college-ai-center-dev-secret-change-me` |
| `JWT_EXPIRES_IN_SECONDS` | Token 有效期(秒) | `7200` |
| `DB_HOST` / `DB_PORT` / `DB_USERNAME` / `DB_PASSWORD` / `DB_DATABASE` | PostgreSQL 连接 | 见 `.env.example` |
| `DB_SYNCHRONIZE` | 自动同步数据库结构(仅开发) | `false` |
| `DB_LOGGING` | SQL 日志 | `false` |
> **提示**`DB_ENABLED=false` 时所有模块使用内存实现,无需安装 PostgreSQL,适合本地快速启动和测试。
---
## 安装依赖
### 后端
```bash
npm install
```
### 前端
```bash
cd web && npm install
```
---
## 启动命令
### 1. 启动后端(开发模式,带热重载)
```bash
npm run start:dev
```
后端运行在 `http://localhost:3000`API 前缀为 `/api/*`
### 2. 启动前端(开发模式)
```bash
cd web && npm run dev
```
前端运行在 `http://localhost:4100`
### 3. 一键同时启动前后端(后台运行)
```bash
# 在项目根目录执行
# 1. 启动后端(后台)
nohup npm run start:dev > backend.log 2>&1 &
# 2. 启动前端(后台)
cd web && nohup npm run dev > ../frontend.log 2>&1 &
```
停止后台进程:
```bash
# 查找并停止后端(NestJS
pkill -f "nest start"
# 查找并停止前端(Next.js
pkill -f "next dev"
```
### 4. 生产构建
```bash
# 后端构建
npm run build
# 前端构建
cd web && npm run build
```
---
## 数据库连接(可选)
如需启用 PostgreSQL 持久化:
1. 确保本地 PostgreSQL 已启动。
2.`.env` 中设置:
```env
DB_ENABLED=true
DB_HOST=localhost
DB_PORT=5432
DB_USERNAME=postgres
DB_PASSWORD=postgres
DB_DATABASE=college_ai_center
DB_SYNCHRONIZE=true
```
3. 重启后端:`npm run start:dev`
TypeORM 会在启动时自动建表(`DB_SYNCHRONIZE=true`)。
### 新模块数据库实体
- `exam_records` — 执业医师备考答题记录(`src/modules/exam-prep/entities/exam-record.entity.ts`
---
## 新模块 API 端点
| 模块 | 端点 | 方法 | 说明 |
|------|------|------|------|
| **轮转见习** | `/api/rotation/records` | `GET` | 列出轮转记录 |
| | `/api/rotation/records` | `POST` | 新增轮转记录 |
| **技能视频** | `/api/skill-videos` | `GET` | 搜索技能视频 |
| **执业医师备考** | `/api/exam-prep/questions/generate` | `POST` | 生成试题(支持 `builtin` / `ai` / `auto` 模式) |
| | `/api/exam-prep/questions/:id/answer` | `POST` | 提交答案 |
| | `/api/exam-prep/stats` | `GET` | 获取备考统计 |
| | `/api/exam-prep/history` | `GET` | 查看答题历史 |
| | `/api/exam-prep/history/:recordId` | `DELETE` | 删除单条记录 |
| | `/api/exam-prep/history` | `DELETE` | 清空全部记录 |
| **学术交流** | `/api/academic/records` | `GET` | 列出交流记录 |
| | `/api/academic/records` | `POST` | 新增交流记录 |
---
## 学生端前端路由
| 路径 | 模块 |
|------|------|
| `/student/rotation` | 轮转见习 |
| `/student/skill-video` | 技能视频 |
| `/student/exam-prep` | 执业医师备考 |
| `/student/academic` | 学术交流 |
---
## 常见问题
### 1. 后端启动报错 `找不到模块 @nestjs/common`
确保已执行根目录的 `npm install`
### 2. 前端无法连接后端 API
确认后端已启动,且前端 `.env` 中(如有)的 API 地址正确。开发模式下前端通过代理或直连 `localhost:3000`
### 3. 数据库表未自动创建
检查 `.env``DB_ENABLED=true``DB_SYNCHRONIZE=true`,然后重启后端。
### 4. 答题历史未持久化
确认 `DB_ENABLED=true` 并重启后端;否则数据仅保存在进程内存中,重启即丢失。
---
## Git 提交
```bash
git add -A
git commit -m "你的提交信息"
```