- Svelte 59.2%
- Rust 28.9%
- TypeScript 6.6%
- CSS 2.6%
- Shell 1.9%
- Other 0.7%
| demo | ||
| docs | ||
| src | ||
| tests | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| docker-compose.yml | ||
| Dockerfile | ||
| README.md | ||
星桥-校园协同平台
连接人与事务,照亮成长路径。
项目演示
演示说明: 在线演示链接展示的是本项目目前开发完成的最新成品,并会随项目迭代持续更新;本仓库则是为参赛提交提取、重构的核心版本。
- 在线演示: https://activities.rechtan.com
- 本地演示: http://127.0.0.1:8080
在线成品演示账号
| 账号类型 | 账号 | 密码 | 演示重点 |
|---|---|---|---|
| 功能演示账号 | 20230002 |
student123 |
创建活动、反馈考勤 |
| 学生初始账号(白号) | 20230001 |
student123 |
体验学生初始状态与基础流程 |
本地核心版演示账号
在本地运行本仓库时,登录页可直接选择以下三种虚构身份:
| 身份 | 账号 | 密码 | 演示重点 |
|---|---|---|---|
| 学员 | S2026001 |
student123 |
以本人身份报名、签到,查看本人课程与考勤 |
| 活动负责人 | O2026001 |
organizer123 |
发布活动、代报名签到、发起并记录考勤 |
| 管理员 | A2026001 |
admin123 |
用户、课程和全部核心模块管理 |
上述账号和密码仅用于项目演示,请勿录入真实学员信息或用于其他系统。
项目简介
本项目从完整学工平台中抽取并重构出一个可独立运行的核心演示版本。它保留用户、活动、课程和考勤四个核心模块,以 SQLite 代替 PostgreSQL,并把构建后的前端产物嵌入 Rust 可执行文件。运行时只产生一个数据库文件,不需要数据库服务、邮件服务或第三方云资源(Node.js 仅在构建前端时需要)。
仓库内置的数据均为虚构的参赛演示数据,不包含原平台的学员信息或生产配置。
保留的核心能力
- 身份认证:账号密码登录、HttpOnly 会话、退出和三角色权限控制。
- 用户管理:维护学号、姓名、角色、班级、初始密码与启停状态。
- 活动管理:发布活动、查看报名进度、学生报名与活动签到。
- 课程管理:维护课程、教师、教室、时间与课程学生名单。
- 考勤管理:按课程场次加载名单,记录已到、迟到、缺勤和请假状态。
- 运行总览:汇总核心数量、到勤率、近期活动和最小业务闭环。
这些模块在代码中拥有独立路由文件和数据表,只共享 SQLite 连接与基础用户关系,便于后续按需拆分或扩展。
有意移除的功能
参赛版没有迁入邮箱验证、找回密码、AWS SES、JWT、复杂权限组、消息中心、工单、附件、二维码、Excel 导入、学分手册、印章、预约、奖项、审计调试、后台任务、Pingora 网关和生产部署脚本。它们不是四条演示主流程的必要条件,也会显著增加配置成本和代码暴露范围。
参赛版实现了足以支撑现场演示的轻量认证与 RBAC,但有意不加入邮箱找回、SSO、二次验证、登录设备管理和生产级审计。请勿把演示账号或默认密码用于生产环境。
权限矩阵
| 能力 | 学员 | 活动负责人 | 管理员 |
|---|---|---|---|
| 查看个人总览、活动、课程、考勤 | ✓ | ✓ | ✓ |
| 为本人活动报名与签到 | ✓ | — | — |
| 查看用户目录 | — | ✓ | ✓ |
| 发布活动、代报名与代签到 | — | ✓ | ✓ |
| 发起、查看及记录课程考勤 | 仅本人只读 | ✓ | ✓ |
| 新增/停用用户、维护课程名单 | — | — | ✓ |
密码使用 Argon2 哈希保存;会话存入 SQLite,并通过 HttpOnly、SameSite=Lax Cookie 传递,默认 12 小时过期。停用账号后,已有会话会立即失效。
技术结构
浏览器
-> Svelte 5 + Vite + Tailwind CSS 4 单页应用(构建产物嵌入二进制)
-> Axum REST API
-> SQLx
-> SQLite 单文件数据库
前端沿用 StreamHub 项目的技术栈与设计语言:Svelte 5(runes)、Vite、Tailwind CSS 4、bits-ui / shadcn-svelte 组件、lucide 图标、svelte-spa-router 哈希路由,支持浅色 / 深色主题。Vite 构建输出固定文件名(app.js / app.css),由 Rust 通过 include_str! 嵌入。
仓库结构
README.md 项目说明、安装、运行、演示与提交入口
docs/ 架构设计、提取方案和功能边界
src/
backend/ Rust / Axum 后端、认证和四个业务模块
frontend/ Svelte 5 前端及 Vite 构建配置
migrations/ SQLite 表结构与虚构演示数据
tests/ 单元测试说明与 HTTP 权限冒烟脚本
demo/ 五分钟演示脚本及截图、录屏素材目录
根目录只保留构建和部署所需的 Cargo.toml、Dockerfile、docker-compose.yml 等工程文件,评委可以从上述五个入口快速定位材料。
快速运行
需要 Rust 1.85+ 与 Node.js 20+(首次或前端有改动时先构建前端)。
cd src/frontend && npm ci && npm run build && cd ../..
cargo run
前端开发模式(Vite 热更新,API 代理到 8080 端口的后端):
cd src/frontend && npm run dev
打开 http://127.0.0.1:8080。首次启动会自动创建 data/competition.db、执行迁移并写入演示数据。
可用环境变量:
DATABASE_PATH=data/competition.db PORT=8080 cargo run
Docker 部署
docker compose up --build
打开 http://127.0.0.1:8080。SQLite 文件保存于命名卷 campus-core-data,容器重建不会丢失演示操作结果。
验证
cd src/frontend && npm run check && npm run build && cd ../..
cargo fmt --check
cargo test
cargo build --release --locked
./tests/smoke-test.sh
健康检查:
curl http://127.0.0.1:8080/api/health
API 概览
| 模块 | 方法与路径 | 用途 |
|---|---|---|
| 认证 | POST /api/auth/login |
登录并建立会话 |
| 认证 | GET /api/auth/me |
获取当前登录身份 |
| 认证 | POST /api/auth/logout |
注销当前会话 |
| 总览 | GET /api/dashboard |
核心指标与近期记录 |
| 用户 | GET/POST /api/users |
查询或新增用户 |
| 用户 | PATCH /api/users/:id/status |
启用或停用用户 |
| 活动 | GET/POST /api/activities |
查询或发布活动 |
| 活动 | POST /api/activities/:id/register |
学生报名 |
| 活动 | POST /api/activities/:id/check-in |
活动签到 |
| 课程 | GET/POST /api/courses |
查询或新增课程 |
| 课程 | POST /api/courses/:id/enroll |
加入课程名单 |
| 考勤 | GET /api/attendance/sessions |
查询考勤场次 |
| 考勤 | POST /api/attendance/sessions |
发起考勤场次 |
| 考勤 | GET /api/attendance/sessions/:id/roster |
查询场次名单 |
| 考勤 | PUT /api/attendance/sessions/:id/records/:userId |
保存考勤结果 |
更完整的提取边界与数据库改造说明见 docs/EXTRACTION_REPORT.md。