SF-6655/TutorOS
GitHub: SF-6655/TutorOS
专为辅导业务设计的贴牌 LMS 模板,通过单文件配置实现多租户快速部署,内置四类角色门户和完整的课程生命周期管理。
Stars: 1 | Forks: 0
# TutorOS
**专为辅导业务打造的贴牌 LMS 模板。**
克隆一次。按客户端配置。数小时内即可部署。

## 什么是 TutorOS?
TutorOS 是一个生产就绪的学习管理系统 (LMS),专为辅导业务打造,可作为可配置模板使用。平台的各个方面——品牌、学科、校区、定价和 feature flags——均由单个配置文件控制,这使得在无需触碰应用代码的情况下,极速启动一个新的客户端实例变得轻而易举。
该项目独立开发,基于在一个真实的澳大利亚教育平台上 6 个月的实操经验。
## 门户
| 角色 | 权限 |
|---|---|
| **Admin** | 全平台控制——用户、课程、报告、设置 |
| **Tutor** | 课程管理、作业评分、资源上传 |
| **Parent** | 学生进度、上课记录、后续课表 |
| **Student** | 作业、上课出勤、资源库 |
## 截图
### 登录

### Admin Dashboard

### Tutor Portal

### Parent Portal

### Student Portal

## 核心功能
- 4 个基于角色的门户,按用户类型实现隔离的数据访问
- 完整的课程生命周期——排课、出勤、报告、查看
- 作业系统——布置、提交、评分、反馈
- 资源库——练习册、视频、历年真题、链接
- 用户邀请系统——临时密码流程,入驻期间无需电子邮箱
- 受邀用户首次登录时的修改密码流程
- 通过 Supabase 在数据库层面强制执行行级别安全 (RLS)
- 贴牌配置——品牌、学科、校区和 feature flags 集中在一个文件中
## 技术栈
| 层级 | 工具 |
|---|---|
| 框架 | Next.js 16 (App Router) + TypeScript |
| 样式 | Tailwind CSS + shadcn/ui |
| 数据库 | 通过 Supabase 实现的 PostgreSQL |
| ORM | Prisma 7 |
| 认证 | Supabase Auth |
| 托管 | Vercel |
## 贴牌配置
所有客户端自定义配置都集中在一个文件中:`src/config/tenant.config.ts`
```
export const tenantConfig = {
brand: {
name: "TutorOS", // Client name
primaryColor: "#6366f1", // Client brand colour
},
features: {
billing: true,
homework: true,
zoom: true,
atar: false,
messaging: false,
ai: false,
},
subjects: ["Mathematics", "English", "Science"],
yearBands: ["Years 3-6", "Years 7-10", "Years 11-12"],
campuses: [
{ id: "main", name: "Main Campus", city: "Perth", timezone: "Australia/Perth" },
{ id: "online", name: "Online", city: null, timezone: "Australia/Perth" },
],
timezone: "Australia/Perth",
currency: "AUD",
};
```
对于完整的贴牌部署,无需更改任何其他文件。
## 架构决策
**数据库层面的行级别安全**
数据隔离在 Supabase RLS policies 中强制执行,而不仅仅是在应用 middleware 中。即使绕过了路由检查,用户也无法读取或写入其角色权限之外的数据。
**兼容 Windows 的扁平化文件夹结构**
Next.js 中带有括号的 route groups 文件夹名称在 Windows 上使用 Turbopack 时会出错。因此,本项目改用扁平化的 `/admin`、`/tutor`、`/parent`、`/student` 路径。
**使用 JWT 元数据进行角色检查**
角色解析直接使用 JWT 中的 `user.user_metadata?.role`——在 layouts 或 middleware 中绝不进行数据库查询。这使得角色检查非常快速,并避免了不必要的数据库往返。
**单文件租户配置**
所有特定于客户端的值都集中在一个文件中。这使得新客户的入驻成为一项配置任务,而不是开发任务。
## 快速开始
### 1. 克隆仓库
```
git clone https://github.com/SF-6655/tutoross.git
cd tutoross
```
### 2. 安装依赖项
```
npm install
```
### 3. 设置环境变量
```
cp .env.example .env.local
```
填入你的 Supabase 项目 URL、anon key、service role key 和数据库连接字符串。
### 4. 运行数据库迁移
```
npx prisma migrate deploy
```
### 5. 应用 RLS policies
在你的 Supabase dashboard 中,进入 SQL Editor 并运行 `supabase/rls-policies.sql` 的内容。
### 6. 填充数据库
```
npx tsx prisma/seed.ts
```
### 7. 启动开发服务器
```
npm run dev
```
## 路线图
- [ ] Stripe 账单——与学生账户绑定的发票
- [ ] Zoom 集成——为每节课自动生成会议链接
- [ ] 通过 Resend 和 Twilio 发送电子邮件和短信通知
- [ ] 通过 Supabase Storage 进行文件上传
- [ ] 进度分析看板
- [ ] 家长与导师的消息系统
- [ ] 通过 Claude API 实现的 AI 辅导助手
## 作者
**Muhammad Saad Fayyaz**
[作品集](https://msf-portfolio-ochre.vercel.app) • [GitHub](https://github.com/SF-6655) • [LinkedIn](https://www.linkedin.com/in/muhammad-saad-fayyaz-38a184226/)
标签:SaaS, Supabase, TypeScript, 学习管理系统, 安全插件, 教育平台, 测试用例, 白标, 自动化攻击