hku-class/AGENTS.md
2026-05-01 21:52:27 +08:00

214 lines
9.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# HKU ICB ClassHub Agent Guide
本文件用于约束后续 agent 与开发者在本项目中的工作方式。目标是让每次改动都符合项目定位、权限模型、技术栈和现有设计语言,避免临时拼接式开发。
## 1. 项目定义
本项目是 HKU ICB Graduate Class Resource Platform面向班级、教师、学生和班委的班级资源与协作系统。核心价值是围绕“班级”组织信息提供可信、清晰、轻量的日常管理能力。
主要模块包括:
- 登录、激活、账号审核与个人资料
- 班级与成员管理
- 通讯录、时间线、公告、课程日程、资源、作业、投票、班费
- 通知、上传与外部存储
开发时必须优先保护以下产品原则:
- 班级数据隔离优先,任何列表、详情、写入都要明确 class scope。
- 权限优先于界面便利,不允许只靠前端隐藏按钮来保证安全。
- 管理功能要清晰可审计,避免隐式批量修改。
- 面向真实班级使用场景,界面应安静、稳定、易扫描,不做营销页式表达。
## 2. 技术栈与目录
仓库结构:
- `backend/`FastAPI 后端SQLAlchemy async ORMAlembic 迁移SQLite 默认部署数据源。
- `frontend/`Next.js App Router 前端React 19TypeScriptTailwind CSS 4shadcn/base-ui 风格组件lucide-react 图标。
- `nginx/`:反向代理配置。
- `docker-compose.yml`:本地或服务器编排,前端端口映射为 `3008:3000`,后端为 `8000`
关键命令:
- 前端开发:`cd frontend && npm run dev`
- 前端构建:`cd frontend && npm run build`
- 前端检查:`cd frontend && npm run lint`
- 后端运行:`cd backend && uvicorn app.main:app --reload`
- 后端迁移:`cd backend && alembic upgrade head`
- 整体容器:`docker compose up --build`
注意:`frontend/AGENTS.md` 已明确提示 Next.js 版本存在重要变化。修改 Next.js 相关 API、路由、缓存、服务端/客户端组件边界前,应以本仓库安装版本与本地文档为准,不要凭旧版本记忆实现。
## 3. 架构约束
### 后端分层
后端代码按以下边界组织:
- `app/api/`HTTP 路由层,只处理请求参数、依赖注入、状态码与响应。
- `app/services/`:业务逻辑层,承载跨模型操作、校验、查询组合和副作用。
- `app/schemas/`Pydantic 输入输出模型。
- `app/db/models.py`SQLAlchemy 数据模型。
- `app/core/`:鉴权、依赖、权限与通用基础能力。
- `app/config.py`:环境配置,统一使用 `CH_` 前缀。
开发规则:
- 新业务优先放入 service不要把复杂逻辑堆在 route handler。
- 数据库访问使用 async SQLAlchemy不引入同步 session。
- 查询关系时优先使用 `selectinload` 等显式加载策略,避免隐式懒加载导致异步上下文问题。
- 新增或修改表结构必须提供 Alembic migration不允许只改 model。
- 错误信息面向用户时要清晰面向系统时要保留日志不要把密钥、token、内部堆栈暴露给前端。
### 前端分层
前端代码按以下边界组织:
- `src/app/`页面与布局App Router 路由入口。
- `src/components/`:跨页面业务组件。
- `src/components/ui/`:基础 UI 组件,尽量保持通用和低业务耦合。
- `src/hooks/`:认证、通知、当前班级、侧边栏等状态逻辑。
- `src/lib/`API 客户端、类型、权限、常量、工具函数。
开发规则:
- 复用 `src/lib/api.ts` 中的 `fetchAPI`、`postAPI`、`putAPI`、`deleteAPI`、`uploadAPI`,不要在页面中散落裸 `fetch`
- 复用 `src/lib/permissions.ts` 判断前端可见性,但后端仍必须做真实权限校验。
- 能用已有 UI 组件就不要新写一套样式系统。
- 表单提交、加载、空状态、错误状态、成功反馈都要完整处理。
- 客户端组件只在需要浏览器状态、事件、localStorage、交互状态时使用。
## 4. 权限与数据边界
系统存在两层权限:
- 全局角色:`super_admin`、`teacher`、`student`
- 班级内角色与权限:由 `ClassMembership``membership_role`、`committee_role`、`class_permissions` 控制
后端权限入口主要在 `app/core/deps.py`
- `get_current_user`
- `require_role`
- `resolve_class_id_for_user`
- `ensure_class_access`
- `ensure_class_permission`
权限开发必须遵守:
- 任何班级资源 API 都必须解析并校验 `class_id`
- student 只能访问自己所属班级的数据。
- teacher 与 super_admin 的跨班级访问能力必须通过后端依赖或 service 显式表达。
- 新增班级模块时,要同步更新后端 `CLASS_PERMISSIONS`、`TEACHER_DEFAULT_PERMISSIONS`,前端权限类型、常量、导航与模块启用逻辑。
- 前端隐藏按钮只是体验优化,不是安全边界。
## 5. 设计规范
本项目不是营销网站,而是班级运营工具。界面应更像可靠的工作台:信息密度适中、层级清楚、操作明确。
视觉方向:
- 采用现有 Tailwind 4 token 与 `globals.css` 中的主题变量。
- 保持温暖、克制、学术感的视觉语气,不要突然引入高饱和大渐变或强装饰背景。
- 图标优先使用 `lucide-react`
- 卡片、弹窗、表格、表单、按钮优先复用 `src/components/ui/`
- 中文界面文案要简洁、具体,避免“智能化”“一站式”等空泛营销词。
布局规则:
- 后台页面优先服务浏览、筛选、创建、编辑、审核等真实任务。
- 列表页必须考虑空状态、加载态、错误态和分页或数据量增长。
- 管理页的危险操作必须有确认弹窗。
- 移动端至少保证主要阅读、筛选和提交流程可用。
- 不在工具型页面中加入大 hero、宣传区、装饰性卡片堆叠。
交互规则:
- 成功、失败、权限不足、登录过期要给出明确反馈。
- 上传、提交、删除、批量操作要有 pending 状态,避免重复提交。
- 需要选择班级的页面,应与 `use-active-class` 等现有机制保持一致。
## 6. API 与数据契约
后端响应模型应由 `app/schemas/` 定义,前端类型应在 `src/lib/types.ts` 中保持同步。
约定:
- API 路径统一放在 `/api/...` 下。
- 新增字段时同时检查 model、schema、service、API、前端 type、表单、列表展示。
- 日期时间字段使用明确语义,例如 `created_at`、`updated_at`、`start_time`、`end_time`。
- JSON 字符串字段已有历史用法时,可沿用模型中的 helper 方法;新增复杂结构时优先评估是否需要独立表。
- 不把数据库内部字段、密码 hash、验证码 hash、密钥配置返回给前端。
## 7. 数据库与迁移
数据库相关改动必须遵守:
- 修改 `app/db/models.py` 后必须新增 Alembic migration。
- migration 文件命名要包含日期或清晰语义。
- migration 要能从旧库升级,不假设空库。
- 对生产已有数据的字段变更要考虑 backfill、默认值和 nullable 策略。
- 不直接删除历史字段或表,除非确认没有线上依赖,并在 migration 中清楚表达。
SQLite 是当前部署默认数据库,避免使用 SQLite 不支持或行为差异明显的 SQL 特性,除非同时处理兼容方案。
## 8. 安全规范
- 密钥、SMTP、COS、JWT 等配置只通过 `.env` 和环境变量提供,不提交真实值。
- JWT secret 生产环境必须覆盖默认值。
- 上传能力必须限制文件类型、大小与访问路径,避免任意文件执行或路径穿越。
- 邮箱验证码、密码、token 等敏感值只存 hash 或安全派生值。
- 日志中不得打印密码、验证码、完整 token、COS secret。
- CORS 配置应随部署域名收敛,不为方便调试长期开放任意来源。
## 9. 开发工作流
开始修改前:
- 先读相关 route、service、schema、model、前端 page/component/type。
- 确认是否已有相同模式,优先复用。
-`rg` 搜索模块名、权限名、API 路径和类型定义,避免漏改。
实现时:
- 小步提交代码,保持每次改动有明确目的。
- 不做与需求无关的大重构。
- 不删除用户已有改动。
- 不引入新依赖,除非能明显降低复杂度,并更新安装与构建说明。
- Python 代码遵循当前项目风格和类型标注TypeScript 避免 `any`,优先定义明确类型。
交付前至少检查:
- 前端:`npm run lint`,重要 UI 改动再跑 `npm run build`
- 后端:能启动应用;涉及数据库时跑迁移;核心 service 改动要用脚本或测试验证主路径。
- API 契约:前后端字段、错误处理、权限处理一致。
- 浏览器体验:关键页面没有明显布局破损、重复提交、空白状态。
## 10. 新功能 Checklist
新增一个业务模块时,按顺序检查:
- 数据模型是否需要新增表或字段。
- Alembic migration 是否完整。
- Pydantic schema 是否覆盖创建、更新、读取。
- service 是否包含权限、班级边界、业务校验。
- API router 是否挂载到 `app/main.py`
- 前端 type 是否同步。
- API client 调用是否使用 `src/lib/api.ts`
- 页面是否接入侧边栏、权限可见性、模块启用状态。
- 是否有加载、空、错、成功状态。
- 是否需要通知、上传、分页或搜索。
- 是否更新常量、权限集合和文案。
## 11. Agent 行为准则
后续 agent 在本仓库工作时,应遵守:
- 用中文与项目维护者沟通,技术名词可保留英文。
- 先理解项目边界,再动手改代码。
- 发现需求与权限、安全、数据隔离冲突时,主动指出并给出更安全的实现。
- 能直接完成的任务直接实现,不只给建议。
- 修改前说明将改哪些区域;修改后说明改了什么、如何验证、还剩什么风险。
- 遇到 Next.js、React、FastAPI、SQLAlchemy 等版本敏感问题时,以本仓库依赖版本和官方文档为准。
- 保持代码和文档简洁,避免过度抽象。