这是一个基于 Next.js + Prisma + PostgreSql 的宿舍床位资产包管理演示系统,覆盖“后台生成二维码 → 学生扫码入住 → 管理员维护资产 → 数据导出与审计”的闭环。
SQLite(已废弃),可修改 Prisma 来重新改用 SQLite ,若要使用请自行修改学校部分等等。
- 学生端扫码登记:二维码携带唯一
assettoken,系统自动识别楼栋、寝室和床位资产包。 - 后台鉴权:管理员登录后才能进入后台页面和后台 API,默认本地超级管理员为
admin / admin123。 - 多级管理员权限:
SUPER_ADMIN:维护管理员账号、姓名、手机号、权限和启停状态;ASSET_ADMIN:生成资产包、调整维修状态、办理退宿;AUDITOR:查看后台数据并执行数据导出。
- 管理员实名信息:每个管理员必须维护姓名和手机号,操作日志记录实际后台账号。
- 资产与入住管理:支持服务端分页、状态筛选和关键词查询,避免 40000 名学生规模下前端全量扫描。
- 数据库导出:后台支持完整
.sql备份导出,以及Student、Checkin、AssetBundle、AssetItem、OperationLog、AdminUser单表.csv导出。SQL 备份包含管理员密码哈希,请按敏感文件保管。 - 操作审计:学生绑定、退宿、资产状态调整、管理员维护和导出操作都会写入操作日志。
- 现代化 UI:后台使用半透明玻璃卡片、背景渐变、高斯模糊、阴影和轻量动效。
Next.jsPages RouterReactTypeScriptTailwind CSSPrismaSQLite
apps/web/
├─ components/ # 页面组件与通用 UI
├─ pages/ # 页面与 API 路由
├─ prisma/ # Prisma schema、种子数据、SQLite 数据库
├─ styles/ # 全局样式
└─ lib/ # 鉴权、Prisma Client 等公共工具
docs/ # 产品/架构规划文档
注意:
docs/目录中的部分文档更偏向未来规划方案,与当前实现不一定完全一致。请以README.md和代码为准。
在仓库根目录执行依赖安装:
pnpm install进入 Web 应用目录:
cd apps/web以下内容已废弃,改用Neon DB。
生成 Prisma Client:
pnpm db:generate创建或同步本地 SQLite 数据库:
pnpm db:push写入演示种子数据和默认超级管理员:
pnpm db:seed启动开发服务器:
pnpm dev- 学生统一扫码入口:
http://localhost:3000/student - 带资产 token 的扫码演示地址:
http://localhost:3000/student?asset=JA10101 - 后台登录:
http://localhost:3000/admin/login - 后台工作台:
http://localhost:3000/admin - 资产包管理:
http://localhost:3000/admin/assets - 入住绑定管理:
http://localhost:3000/admin/checkins - 操作日志:
http://localhost:3000/admin/logs - 数据导出:
http://localhost:3000/admin/export - 管理员与权限:
http://localhost:3000/admin/users
本地默认账号来自种子数据和环境变量兜底:
- 默认账号:
admin - 默认密码:
admin123 - 默认权限:
SUPER_ADMIN - 默认姓名:
系统管理员 - 默认手机号:
13800000000
生产环境建议通过环境变量覆盖首个默认管理员:
ADMIN_USERNAME=your-admin
ADMIN_PASSWORD=change-me
ADMIN_NAME=管理员姓名
ADMIN_PHONE=手机号
AUTH_SECRET=至少32位随机字符串登录成功后系统会签发 HttpOnly Cookie。后台页面和后台 API 都会校验会话,资产维护、退宿、管理员维护和数据导出会继续校验权限级别。
pnpm db:seed 会创建以下演示床位资产包和二维码 token:
JA10101→JA-101-01JA10102→JA-101-02JA10201→JA-102-01JB20304→JB-203-04
其中:
JA10101、JA10102、JA10201默认可绑定;JB20304默认是“维修中”状态,用于演示不可绑定场景。
GET /api/assets?qrToken=xxx:按二维码 token 获取单个资产包详情;POST /api/checkin:提交学生入住绑定。
GET /api/dashboard:服务端聚合工作台统计、近期入住和近期日志;GET /api/assets&page=1&pageSize=20&status=ALL&q=关键词:分页查询资产包;POST /api/assets:批量生成床位资产包(需要SUPER_ADMIN或ASSET_ADMIN);PATCH /api/assets:调整资产包维修 / 可用状态(需要SUPER_ADMIN或ASSET_ADMIN);GET /api/checkin&page=1&pageSize=20&status=ALL&q=关键词:分页查询入住绑定记录;PATCH /api/checkin:办理退宿(需要SUPER_ADMIN或ASSET_ADMIN);GET /api/logs&page=1&pageSize=20&q=关键词:分页查询操作日志;GET /api/export?format=sql:导出完整 SQL;GET /api/export?format=csv&table=Student:导出指定表 CSV;GET /api/admins、POST /api/admins、PATCH /api/admins:维护管理员账号(需要SUPER_ADMIN)。
为适配约 40000 名学生及其入住记录:
- 后台列表改为服务端分页,不再一次性把全量资产、学生或日志拉到浏览器;
- Prisma schema 为资产状态、床位位置、学生姓名/手机号、入住状态/时间、日志时间/类型等字段补充索引;
- 工作台统计改为
/api/dashboard服务端聚合计数; - 前端搜索输入带 250ms 防抖,减少连续请求。
- 本地数据库文件位于:
apps/web/prisma/dev.db - 该文件属于本地运行产物,不建议提交到版本库
- Schema 更新后请执行:
pnpm --filter web db:push
pnpm --filter web db:generate
pnpm --filter web db:push
pnpm --filter web typecheck
pnpm --filter web lint