背景
学校学生会要管查寝、纪律检查这些事,需要一个系统录入违纪记录、查询、公示、导出。
之前有一版 PHP 写的,用了一段时间发现问题一堆:SQL 注入随便打、密码明文存储、数据库按日期建表(对,每天一张表)……修补不如重写。
功能
实际使用场景决定的功能:
- 违纪录入:学生会成员登录后填写宿舍号、姓名、班级、时间段、原因等,支持拍胸卡照片上传
- 今日公示:当天记录滚动展示,20 秒自动刷新,接个大屏投影就是公示栏
- 审查管理:管理员看全部记录,按日期和关键词筛选,能删除和查看照片
- 数据导出:选日期范围导出 CSV,学生会开会时要用
- 用户管理:增删账号、重置密码
技术选型
- Go + Gin:编译出来一个二进制,不用装 PHP 环境,不用配 nginx
- MySQL 8.0:数据就一张表,正常的关系型设计
- 前端原生 HTML/CSS/JS:这种内部系统没必要上框架,够用就行
为什么不用 Spring Boot 或 Node?因为最后部署的机器是一台老电脑,Go 编译出来占用小、启动快,Docker 一跑就完事。
部署
Docker 一行搞定:
docker-compose up -d
MySQL 数据持久化在 volume 里,首次启动自动建表、创建管理员账号。
也可以手动编译,设几个环境变量就能跑。
踩过的坑
- JWT 的 secret 一开始写死在代码里了,后来改成环境变量
- 照片上传一开始没限制大小,有人传了个 20MB 的图直接把内存吃满
- 公示页面本来用轮询,后来发现 20 秒刷新一次其实轮询就够了,没必要上 WebSocket