elias4044/schoolsoftplus
GitHub: elias4044/schoolsoftplus
为瑞典 SchoolSoft 教育平台提供现代化替代界面的开源 Web 应用,集成 AI 助手、实时消息和端到端加密聊天等功能。
Stars: 1 | Forks: 0
## 什么是 SchoolSoft+?
SchoolSoft+ 是一个独立的开源 Web 应用,为您现有的 **SchoolSoft** 账户提供了一个显著改善的界面。同样的数据,全新的现代体验。
**为什么开发它?** 因为 SchoolSoft 的界面缓慢、杂乱,还停留在 2010 年。SchoolSoft+ 实现了它本该有的样子。
## 功能特性
### 核心功能
| 功能 | 描述 |
|---|---|
| **Dashboard (控制面板)** | 可自定义的拖拽式小部件网格——日程表、作业、午餐、新闻、笔记、倒计时和天气,一切尽在掌控 |
| **Schedule (日程表)** | 简洁的每周时间表,带有科目颜色和周导航 |
| **Lunch menu (午餐菜单)** | 自动获取并呈现的每周午餐菜单 |
| **News (新闻)** | 带有完整文章视图的学校新闻源 |
| **Subjects (科目)** | 包含教师信息和相关作业的科目列表 |
| **Countdown (倒计时)** | 可自定义至任意日期的倒计时器——作为控制面板小部件显示 |
| **Notes (笔记)** | 带有公开分享链接的个人富文本笔记 |
| **Class & Staff (班级与教职员工)** | 浏览您的班级列表和教职员工目录,支持搜索、分部过滤和 CSV 导出 |
### 社交与消息
| 功能 | 描述 |
|---|---|
| **Messaging (消息)** | 实时加密与未加密的群聊及私信聊天 |
| **End-to-end encryption (端到端加密)** | 使用 AES-256-GCM 加密的群聊,每次会话需输入密码解锁 |
| **Friends system (好友系统)** | 好友请求、好友列表,以及仅限好友的私信 |
| **Group invites (群组邀请)** | 管理员邀请用户加入群组;用户可接受或拒绝 |
| **Online status (在线状态)** | 每个用户的在线状态:在线(小于 3 分钟)、在 SchoolSoft+(3–15 分钟)、离线(大于 15 分钟) |
| **GIF support (GIF 支持)** | 在所有聊天中(包括加密聊天)使用由 Giphy 提供支持的 GIF 选择器 |
| **People search (用户搜索)** | 搜索任意 SchoolSoft+ 用户,查看其个人资料,添加好友 |
### AI 与生产力
| 功能 | 描述 |
|---|---|
| **AI Assistant (AI 助手)** | 对话式 AI (Google Gemini),可完全访问您的日程表、作业等 |
| **Shared AI conversations (共享 AI 对话)** | 通过公开链接分享 AI 聊天记录 |
### 平台
| 功能 | 描述 |
|---|---|
| **Live stats (实时统计)** | 公开的统计页面,显示所有用户的实时汇总使用情况 |
| **Keyboard shortcuts (键盘快捷键)** | `Alt+1–7`, `Alt+N/M/U/P/,/A/Q` 可在应用内任意位置进行即时导航 |
| **Dark-first design (深色优先设计)** | 在 `oklch` 色彩空间中设计,实现像素级完美的深色模式 |
| **PWA / installable (PWA / 可安装)** | Web 应用清单,支持在移动设备上“添加到主屏幕” |
| **Private by default (默认隐私保护)** | 凭证直接转发至 SchoolSoft 后立即丢弃——绝不存储 |
## 技术栈
| 层级 | 技术 |
|---|---|
| 框架 | [Next.js 16](https://nextjs.org) (App Router, React 19) |
| 语言 | TypeScript 5 |
| 样式 | Tailwind CSS v4 · oklch 色彩空间 |
| UI 组件 | shadcn/ui · Radix UI 原语 |
| 动画 | Framer Motion · GSAP |
| 数据库 | Firebase Firestore (笔记、消息、好友、在线状态、统计数据) |
| 认证 | 从 SchoolSoft 代理的 httpOnly 会话 Cookie + Firebase 自定义令牌 |
| AI | 通过 `@google/genai` 接入 Google Gemini |
| HTML 解析 | Cheerio + iconv-lite (ISO-8859-1 → UTF-8) |
| 拖拽 | @dnd-kit |
| 部署 | Vercel |
## 快速开始
### 前置条件
- Node.js 20+
- 一个 SchoolSoft 账户(学生或教师)
- 启用了 Firestore 的 Firebase 项目
- Google Gemini API 密钥(可选——仅在需要 AI 功能时才需要)
### 本地开发
```
# 1. Clone
git clone https://github.com/elias4044/schoolsoftplus.git
cd schoolsoftplus
# 2. Install
npm install
# 3. Configure
cp .env.example .env.local
# Edit .env.local — 请参阅下方的 Environment Variables
# 4. Run
npm run dev
# → http://localhost:3000
```
### 环境变量
将 `.env.example` 复制到 `.env.local` 并填写以下内容:
```
# Firebase Admin SDK (server-side)
FIREBASE_PROJECT_ID=your-project-id
FIREBASE_CLIENT_EMAIL=your-service-account@project.iam.gserviceaccount.com
FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"
# Google Gemini AI (可选 — 若无此项,AI Assistant 将无法工作)
GEMINI_API_KEY=your-gemini-key
# App base URL
NEXT_PUBLIC_APP_URL=http://localhost:3000
```
## 项目结构
```
schoolsoftplus/
├── app/
│ ├── (auth)/ # Login page (unauthenticated)
│ ├── (dashboard)/ # Main app pages (authenticated)
│ │ ├── dashboard/ # Customisable widget grid
│ │ ├── schedule/ # Weekly timetable
│ │ ├── lunch/ # Lunch menu
│ │ ├── news/ # School news
│ │ ├── subjects/ # Subject list
│ │ ├── countdown/ # Countdown timers
│ │ ├── notes/ # Rich-text notes
│ │ ├── messages/ # Real-time messaging
│ │ ├── people/ # SchoolSoft+ user search
│ │ ├── class/ # Class & staff directory
│ │ ├── profile/ # User profile
│ │ └── settings/ # App settings
│ ├── api/
│ │ ├── login/ logout/ # Auth proxy
│ │ ├── schedule/ # Timetable proxy
│ │ ├── lunch/ # Lunch menu proxy
│ │ ├── news/ # News proxy
│ │ ├── subjects/ # Subjects proxy
│ │ ├── people/ # class + staff HTML scrapers
│ │ ├── conversations/ # Messaging — conversation CRUD
│ │ ├── messages/ # Messaging — message CRUD
│ │ ├── friends/ # Friends system
│ │ ├── presence/ # Online status heartbeat
│ │ ├── group-invites/ # Group invite flow
│ │ ├── ai/ # Gemini proxy + rate limiting
│ │ ├── notes/ # Notes CRUD
│ │ ├── stats/ # Public aggregate stats
│ │ ├── users/ # User search
│ │ └── lib/ # Shared server helpers
│ │ ├── firebaseAdmin.ts
│ │ ├── schoolsoft.ts # Axios client + session helpers
│ │ ├── auth.ts # Session validation
│ │ ├── profileDb.ts
│ │ ├── messagingDb.ts
│ │ ├── friendsDb.ts
│ │ ├── presenceDb.ts
│ │ ├── groupInvitesDb.ts
│ │ └── statsHelper.ts
│ ├── stats/ # Public stats page
│ ├── changelog/ # Changelog page
│ ├── open-source/ # Open source info
│ ├── terms/ # Terms & Privacy
│ └── login-help/ # Login troubleshooting
├── components/
│ ├── sidebar.tsx # Main nav + keyboard shortcuts
│ ├── LandingPage.tsx # Public landing page
│ ├── ai-chat-panel.tsx # AI assistant slide-out panel
│ ├── NoteEditor.tsx # Rich-text note editor
│ ├── UserProfileModal.tsx # Profile modal with friend actions
│ ├── widgets/ # Dashboard widget components
│ └── ui/ # shadcn/ui base components
└── lib/
├── auth-context.tsx # Auth state (login/logout)
├── useSession.ts # Session hook
├── useMessages.ts # Real-time messaging hook
├── useFriends.ts # Real-time friends hook
├── usePresence.ts # Online status hooks
├── useNotifications.ts # Push notification helper
├── crypto.ts # AES-256-GCM E2EE helpers
├── firebase.ts # Firebase client SDK
└── widgets/ # Widget registry + layout hook
```
## Firestore 集合
| 集合 | 用途 |
|---|---|
| `profiles_v1` | 用户显示名称、个人简介、头像 |
| `conversations_v1` | 群聊和私信会话元数据 |
| `messages_v1` | 单条消息(明文 + 端到端加密密文) |
| `friendships_v1` | 好友请求和已接受的好友关系 |
| `presence_v1` | 每个用户的在线状态心跳 |
| `group_invites_v1` | 待处理的群组加入邀请 |
| `notes_v2` | 带有可选公开分享令牌的用户笔记 |
| `countdowns_v1` | 用户倒计时器 |
| `stats` | 匿名汇总使用统计数据 |
## 贡献
开源因贡献而伟大——任何 PR 都备受感激。
1. **Fork** 本仓库
2. **创建** 一个功能分支:`git checkout -b feature/amazing-feature`
3. **提交** 您的更改:`git commit -m 'feat: add amazing feature'`
4. **推送**:`git push origin feature/amazing-feature`
5. **发起一个 Pull Request**
请阅读 [CONTRIBUTING.md](CONTRIBUTING.md) 以了解开发工作流程和编码约定的详细信息。
### 参与方式
- [报告 Bug](https://github.com/elias4044/schoolsoftplus/issues/new?template=bug_report.md)
- [请求新功能](https://github.com/elias4044/schoolsoftplus/issues/new?template=feature_request.md)
- 完善文档
- 浏览 [Developer Portal](https://developer.ssp.elias4044.com) 获取 API 文档和集成指南 ([elias4044/ssp-developer](https://github.com/elias4044/ssp-developer))
- 给本仓库加星标 ⭐
## 隐私与安全
- 密码**绝不存储**——通过 HTTPS 直接转发至 SchoolSoft 后立即丢弃
- Session 令牌存储为 **httpOnly cookie**(JavaScript 无法访问)
- 端到端加密群聊密钥**绝不发送到服务器**——在客户端派生并仅存储在 `sessionStorage` 中
- Firebase 中仅存储笔记、消息、好友数据和匿名的汇总统计数据
- 没有广告、没有跟踪、没有第三方分析
查看[条款与隐私](https://ssp.elias4044.com/terms)了解完整详情。
## 许可证
MIT © [Elias](https://github.com/elias4044) — 详情请参阅 [LICENSE](LICENSE)。
您可以自由使用、修改和分发本代码。欢迎提及或链接回本项目,但这并非强制要求。
标签:AI 驱动, DNS解析, EdTech, PWA, React, SchoolSoft, Syscalls, Tailwind CSS, TypeScript, UI/UX 设计, Web 开发, 人工智能, 作业管理, 午餐菜单, 学习仪表盘, 学习助手, 学校管理系统, 学生工具, 安全插件, 开源项目, 拖拽组件, 教育科技, 数字校园, 新闻通知, 校园平台, 现代化界面, 用户体验, 用户模式Hook绕过, 第三方客户端, 网络信息收集, 自动化攻击, 课程表