星桥-校园协同平台 「连接人与事务,照亮成长路径」
  • Svelte 59.2%
  • Rust 28.9%
  • TypeScript 6.6%
  • CSS 2.6%
  • Shell 1.9%
  • Other 0.7%
Find a file
2026-07-18 23:08:41 +08:00
demo feat: initialize Lixing campus platform 2026-07-18 22:32:27 +08:00
docs feat: initialize Lixing campus platform 2026-07-18 22:32:27 +08:00
src feat: initialize Lixing campus platform 2026-07-18 22:32:27 +08:00
tests feat: initialize Lixing campus platform 2026-07-18 22:32:27 +08:00
.dockerignore feat: initialize Lixing campus platform 2026-07-18 22:32:27 +08:00
.env.example feat: initialize Lixing campus platform 2026-07-18 22:32:27 +08:00
.gitignore feat: initialize Lixing campus platform 2026-07-18 22:32:27 +08:00
Cargo.lock feat: initialize Lixing campus platform 2026-07-18 22:32:27 +08:00
Cargo.toml feat: initialize Lixing campus platform 2026-07-18 22:32:27 +08:00
docker-compose.yml feat: initialize Lixing campus platform 2026-07-18 22:32:27 +08:00
Dockerfile feat: initialize Lixing campus platform 2026-07-18 22:32:27 +08:00
README.md docs: add live demo link and accounts 2026-07-18 23:08:41 +08:00

星桥-校园协同平台

连接人与事务,照亮成长路径。

项目演示

演示说明: 在线演示链接展示的是本项目目前开发完成的最新成品,并会随项目迭代持续更新;本仓库则是为参赛提交提取、重构的核心版本。

在线成品演示账号

账号类型 账号 密码 演示重点
功能演示账号 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并通过 HttpOnlySameSite=Lax Cookie 传递,默认 12 小时过期。停用账号后,已有会话会立即失效。

技术结构

浏览器
  -> Svelte 5 + Vite + Tailwind CSS 4 单页应用(构建产物嵌入二进制)
  -> Axum REST API
  -> SQLx
  -> SQLite 单文件数据库

前端沿用 StreamHub 项目的技术栈与设计语言Svelte 5runes、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.tomlDockerfiledocker-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