把后台塞进手机壳:一个披着 PHP 外衣的校园成绩管理系统
说确实,哪位还没个想给手机装个“成绩管理神器”的念头啊。
那会儿每次月底要填表,电脑键盘敲到一半想按 Ctrl+C,结局发现那玩意儿只能用来写代码,根本没法用来记分数,还得跑去教务处填纸质表格。
后来学校搞开放日,结局发现连打印机都忒吵,排队两小时,分数还没报到就被老师改成了红叉。
这种交作业的痛苦,哪位受得了?故此我干脆搞了个版本,叫“手机壳”。
这玩意儿名字听着挺唬事,实际上就是个好办的 PHP 脚本,背后挂着 MySQL 数据库,好办粗暴。
不用安装 Web 服务器,连个 Chrome 浏览器打开就能跑,连课桌都没法运行。核心逻辑就是给每个学生的 ID 一个数字,成绩存个数组里,然后写个函数把数据一个个加进去。代码看着像 JSON 格式,实际上就是一条条`[{"id": 101, "score": 95}, ...]`,硬生生拼成一行。
最让我头疼的是用户登录这块。
那会儿得用手机号、密码,目前索性搞个纯文本输入“学号”直接解锁。后端读取数据库里的新用户表,生成一个自增的学号,前端直接把这个 ID 填进去就行。验证环节就是比对 ID 是否存有于数据库,匹配成功放行,匹配黄了提示“账号不存有”。
这种没有中间件的验证方案,省去了忒多费事,根本能跑通。
成绩录入倒是好办。前端有个输入框,学生填完数字按回车,数据实时发回服务器,后端解析一下 JSON 结构,把“学号”和“得分”俩字段塞进数据库。
这里有个小插曲,有时候学生填错,比如把学号填成“1010",系统得自动报警,不然后面查成绩会乱套。我临时加个校验逻辑,每次写入前都查重,确认定空就直接提示“该账号未注册”要么“学号已存有”,避免数据污染。
查询功能是最能体现 PHP 灵活的地方。
那会儿查成绩得跑一次主表,再跑一次二级表,目前直接把数据库做成一个图表,在页面里画出来就行。
只要前端把学号和日期传那会儿,后端负责匹配,字段选出来,表格就出来了。
要是有多条数据,就按工夫倒序排列,最新的在上面。
数据更新这块也是既快乐又难受。平时成绩是静态的,但考试系统上线前总得确认一下。我写了一个定时任务,每晚凌晨一次,检查所有学生的最终得分,和教务系统里录入的原始分对比。
要是差了一个小数点,就自动触发那行“更新操作”。别看这是个定时任务,有点像过家家,但起码能帮教务人员省点工夫,不用天天盯着系统挨个改。
还有个不得不提的模块,就是给老师发的成绩单。
那会儿发纸质卷子,目前把最终数据打包成 Excel 文件发给班主任。别看文件格式有点老,打开得凑一凑,但功能不输 Word。文件里包含学生姓名、各科分数和总评,点击文件名直接打开,要么通过邮件附件发给对方。
在测试阶段,我发现了一个 Bug,就是查询成绩时要是学号输入为空,前端会提示“请输入学号”,但后端并没有真正报错,而是回了一条空的记录。
后来改了一下,后端在查询前先查一下学号是否存有,不存有了直接抛出异常,前端再捕获异常来显示提示。
这种细节处理有时候让人无语,但确实是写代码的关键。
最终说说数据管理。每录入一份成绩,数据库里就多一行数据,查询列表时就得跑一遍这个列表。性能方面,对于几万个学生来说有点吃力,但作为原型要么小规模管理彻底够用。
要是要做成全校全量统计,就得加个搜索引擎要么分库分表,那又是另外一章了。
总而言之,这个成绩管理系统就是个 Demo,没有复杂的 UI 美化,也没有后台可视化的大屏,就是纯粹的 CRUD 操作。但它把原本繁琐的录入和查询流程,压缩到了短短几行 PHP 代码里。别看没有啥“起初、其次、最终”的逻辑框架,可是数据一旦录入,整个系统就能自动响应。对于咱们这种不懂折腾的一般/平平学生来说,这绝对是个好东西。赶明儿要是真毕业了,说不定还能把这个项目当个参赛作品,看看能不能变成真正的商业软件,到时候说不定真能开发出个“手机壳”级别的学霸 APP。