SF-6655/TutorOS

GitHub: SF-6655/TutorOS

专为辅导业务设计的贴牌 LMS 模板,通过单文件配置实现多租户快速部署,内置四类角色门户和完整的课程生命周期管理。

Stars: 1 | Forks: 0

# TutorOS **专为辅导业务打造的贴牌 LMS 模板。** 克隆一次。按客户端配置。数小时内即可部署。 ![Admin Dashboard](https://static.pigsec.cn/wp-content/uploads/repos/cas/0a/0ad6db5f58abdd2fa923cef9cd694c78fbe6ec249df7b2ea7a60d3ab1c3b847e.png) ## 什么是 TutorOS? TutorOS 是一个生产就绪的学习管理系统 (LMS),专为辅导业务打造,可作为可配置模板使用。平台的各个方面——品牌、学科、校区、定价和 feature flags——均由单个配置文件控制,这使得在无需触碰应用代码的情况下,极速启动一个新的客户端实例变得轻而易举。 该项目独立开发,基于在一个真实的澳大利亚教育平台上 6 个月的实操经验。 ## 门户 | 角色 | 权限 | |---|---| | **Admin** | 全平台控制——用户、课程、报告、设置 | | **Tutor** | 课程管理、作业评分、资源上传 | | **Parent** | 学生进度、上课记录、后续课表 | | **Student** | 作业、上课出勤、资源库 | ## 截图 ### 登录 ![登录](https://static.pigsec.cn/wp-content/uploads/repos/cas/b4/b4ada874604bb9d967a8afd0ccc49d85462f464606e5094f9bec292fe2cd9279.png) ### Admin Dashboard ![Admin Dashboard](https://static.pigsec.cn/wp-content/uploads/repos/cas/0a/0ad6db5f58abdd2fa923cef9cd694c78fbe6ec249df7b2ea7a60d3ab1c3b847e.png) ### Tutor Portal ![Tutor Portal](https://static.pigsec.cn/wp-content/uploads/repos/cas/62/625f9815dfdd8fe67029180b1604d8017f0163f62dd9ae5278805e456379c114.png) ### Parent Portal ![Parent Portal](https://static.pigsec.cn/wp-content/uploads/repos/cas/77/7790b209f3d8e8f50a9142feb398739cb76f74ea0d5b03eeeb4c3f042f464255.png) ### Student Portal ![Student Portal](https://static.pigsec.cn/wp-content/uploads/repos/cas/37/37b0ebf38ebeed56092f656ca2ee0f9e7cdd2f19de1c3c7c90bd67ba1bb41f19.png) ## 核心功能 - 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, 学习管理系统, 安全插件, 教育平台, 测试用例, 白标, 自动化攻击