9.9 KiB
9.9 KiB
HKU ICB ClassHub Agent Guide
本文件用于约束后续 agent 与开发者在本项目中的工作方式。目标是让每次改动都符合项目定位、权限模型、技术栈和现有设计语言,避免临时拼接式开发。
1. 项目定义
本项目是 HKU ICB Graduate Class Resource Platform,面向班级、教师、学生和班委的班级资源与协作系统。核心价值是围绕“班级”组织信息,提供可信、清晰、轻量的日常管理能力。
主要模块包括:
- 登录、激活、账号审核与个人资料
- 班级与成员管理
- 通讯录、时间线、公告、课程日程、资源、作业、投票、班费
- 通知、上传与外部存储
开发时必须优先保护以下产品原则:
- 班级数据隔离优先,任何列表、详情、写入都要明确 class scope。
- 权限优先于界面便利,不允许只靠前端隐藏按钮来保证安全。
- 管理功能要清晰可审计,避免隐式批量修改。
- 面向真实班级使用场景,界面应安静、稳定、易扫描,不做营销页式表达。
2. 技术栈与目录
仓库结构:
backend/:FastAPI 后端,SQLAlchemy async ORM,Alembic 迁移,SQLite 默认部署数据源。frontend/:Next.js App Router 前端,React 19,TypeScript,Tailwind CSS 4,shadcn/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_userrequire_roleresolve_class_id_for_userensure_class_accessensure_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 等版本敏感问题时,以本仓库依赖版本和官方文档为准。
- 保持代码和文档简洁,避免过度抽象。