背景

学校学生会要管查寝、纪律检查这些事,需要一个系统录入违纪记录、查询、公示、导出。

之前有一版 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

项目地址:github.com/xiaoxinmm/Student-Union-Violation