我的第一个项目

我的第一个项目:ScoreCheck 成绩查询

ScoreCheck 是我独立完成的第一个全栈项目,覆盖了从需求分析、开发到容器部署的完整流程。这篇文章记录项目的设计思路和技术选型,作为个人学习存档,也希望为处于相同阶段的开发者提供参考。

项目背景

  1. 我在实习中才系统的、全面的接触到 SpringBoot 这套后端开发框架,因此想要动手做一个完整的项目来实践
  2. 在成绩管理场景中,学生查询成绩通常依赖教师人工转发,教师侧则需手动维护 Excel,效率低且容易出错。这个问题是我从我父母的使用场景中发现的,因此我构建了 ScoreCheck,学生通过姓名和身份证号自助查询成绩,教师通过 Excel 批量导入数据并按班级隔离管理,学生端无需注册就可使用。

技术实现

后端基于 SpringBoot 3.2(Java 17) 搭建,持久层采用 MyBatis-Plus。项目里最核心的一块是多租户数据隔离:这里我参考了 RuoYi 框架,教师只能看到自己班级的数据。我用 Mybatis-Plus 提供的多租户拦截器统一处理,由框架在每次查询时自动拼接班级条件,而不是在每条查询里手动加过滤,手动方式在接口变多后容易漏写,也难以统一维护。

成绩与学生的批量导入通过 EasyExcel 完成。它不会把整个 Excel 一次性读进内存,而是逐行处理,这对几 MB 的班级花名册很关键,我按每 50 条一批写入数据库,既控制了单次事务的数据量,也避免大文件占满内存。

认证使用 Sa-Token 管理会话,用户密码经 BCrypt 加密存储。BCrypt 是带盐的单向哈希。同一个密码每次计算出来的密文都不同,因此数据库里只有哈希值、没有明文,即使数据泄露也无法反推原密码。

前端采用 Vue 3 与 TypeScript,配合 Element Plus 与 Vite 构建,登录环节继承 TianAi 滑块验证码,用来挡掉脚本批量登录。部署层面通过 Docker Compose 编排后端服务,并由 Nginx 做反向代理,将请求转发到后端对应端口。

遇到的问题

开发过程中,数据隔离是我花心思最多的部分。最初我考虑过在每条查询里手动加上班级条件,但很快发现这种方式在接口变多后会难以保证全覆盖,一旦漏写就会越权。最终我参考了实习中学习到的 RuoYi 框架,我选择用框架层的租户拦截器统一兜底,把所有按班级过滤的逻辑收口到一处。

总结

需要说明,ScoreCheck 目前仍是个人练习项目,并未真正进入到生产环境使用。一方面,学校当前不允许将考试成绩直接告知学生,需求场景本身受限;另一方面,服务涉及到姓名、身份证号等个人敏感信息,正式上线需完成等保合规、传输加密等要求,以我当前的能力和条件尚不具备。因此我将它定位为一次个人开发的练手项目,重点放在了技术选型和缺陷调试、修复以及工程化部署的闭环上。

项目地址

以下附 ScoreCheck demo 界面以及仓库地址 欢迎大家批评指正!
Demo:ScoreCheck Demo
Github:代码仓库