elias4044/schoolsoftplus

GitHub: elias4044/schoolsoftplus

为瑞典 SchoolSoft 教育平台提供现代化替代界面的开源 Web 应用,集成 AI 助手、实时消息和端到端加密聊天等功能。

Stars: 1 | Forks: 0

SchoolSoft+ Logo

SchoolSoft+

一个快速、现代、基于 AI 的 SchoolSoft 账户控制面板。
由学生构建。为学生服务。

Live Developer Docs MIT License Next.js TypeScript Tailwind Version


## 什么是 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)。 您可以自由使用、修改和分发本代码。欢迎提及或链接回本项目,但这并非强制要求。

Elias 构建

在线网站 · 开发者文档 · 统计数据 · 开源项目

标签:AI 驱动, DNS解析, EdTech, PWA, React, SchoolSoft, Syscalls, Tailwind CSS, TypeScript, UI/UX 设计, Web 开发, 人工智能, 作业管理, 午餐菜单, 学习仪表盘, 学习助手, 学校管理系统, 学生工具, 安全插件, 开源项目, 拖拽组件, 教育科技, 数字校园, 新闻通知, 校园平台, 现代化界面, 用户体验, 用户模式Hook绕过, 第三方客户端, 网络信息收集, 自动化攻击, 课程表