放假在家,本想彻底摆烂,逃离开学后的成绩统计、家长追问的循环,没想到被同事的一句求助,意外开启了我的5天开发小挑战。作为一名常年和成绩表、Excel打交道的老师,太懂统计成绩、回复家长查询的痛苦了,索性自己动手,从一个简易版本,慢慢迭代成多校能用、权限清晰、省时省力的成绩查询工具,全程都是自己的真实想法和踩坑经历,没有多余的客套,纯碎碎念~

Day1:同事随口一问,戳中所有老师的痛点

事情很简单,放假前和同事吐槽,每次考完试,最头疼的不是批改试卷,而是统计成绩、排排名,还要一个个回复家长“老师,我家孩子考了多少分?排第几?”,有时候一天要回复几十条,忙得晕头转向,找了几个现成的工具,要么收费,要么广告多,要么不符合我们学校的使用习惯。

放假当天,同事突然发消息问我:“你平时喜欢琢磨这些,能不能帮我做个简单的成绩查询工具?不用复杂,只要我们老师能导入成绩,学生输入自己的班级和姓名,就能查到自己的分数就行,省得我们一遍遍回复家长了。”

这话一下子戳中了我,毕竟我自己也深受其扰,想着“反正放假没事,试试也无妨”,就一口答应了。当天下午,我就着手梳理需求——其实就是我们老师最朴素的诉求:简单、好用、省时间,不用复杂功能,能满足我们单所学校的日常使用就够了。

作为非专业开发的老师,我没纠结什么复杂的技术选型,就用自己平时琢磨的基础框架,快速搭了一个最简版本。数据库也只设计了最核心的表,只适配我们自己学校,毕竟当时就想着帮同事和自己解决燃眉之急,没考虑太多扩展性,甚至没做权限区分,我和同事导入成绩,学生打开页面查分数,用简单的页面区分开,能用上就行。

折腾了一下午加一晚上,第一个单学校版本就成型了:我们老师可以通过 Excel 录入成绩,学生打开页面,输入班级和姓名,就能查到自己的各科分数,界面简单到不能再简单,甚至有点粗糙,但胜在实用、不繁琐。同事试用后,直呼“太方便了”,我也没多想,随手把代码存起来,就去享受我的放假时光了。

Day2:越想越不甘心,不想做“一次性工具”

躺了一天,刷手机刷得无聊,脑子里总想着那个简易的成绩工具。越想越觉得“太简陋了”,只能我们一所学校用,其他同事要是有需求,根本没法复用;而且只能手动录入成绩,我们老师平时统计成绩,都是用Excel批量统计,手动录入还是太费时间,治标不治本。

身为老师,太懂同行的痛苦了,索性决定:重构它!不做那种用一次就扔的一次性工具,把它做成一个可复用、功能完善的版本,既能满足我们自己的需求,也能分享给其他同事、其他学校的老师,也算给放假的自己找点有意义的事,同时也能省得我们以后再被成绩统计折磨。

Day2一整天,我都在琢磨重构的事,主要是确定技术选型和核心需求。技术上,放弃了之前的基础框架,查了不少资料,最终选了 fastify 和 prisma —— fastify 轻量、高效,处理请求快,不用等太久;prisma是ORM工具,操作数据库更简单,不用写复杂的SQL,对我这种非专业开发的老师来说,上手更快,能节省不少时间。

核心需求也重新梳理了一遍,除了保留最初的“导入成绩、姓名+班级查询”,还加了三个我们老师最需要的功能:一是支持多所学校使用,毕竟不止我们一所学校有这种需求,其他学校的老师也能用上;二是设计权限系统,不同角色能做不同的事,比如管理员管整体,我们老师只能管自己班级的成绩,学生只能查自己的,避免混乱;三是支持Excel批量导入成绩,自动计算总分、班级排名、学校排名,这才是最能解放我们双手的功能,不用再手动算总分、排排名,省出更多时间备课、休息。

Day3:深耕架构,把“老师的需求”融入每一处设计

重构的关键,就是数据库表设计和权限系统搭建,这也是Day3的核心工作,几乎花了我一整天的时间,每一处设计都在琢磨“我们老师用起来方便不方便”“会不会有什么漏洞”。

数据库方面,我放弃了之前单一的表结构,重新设计了5张核心表,相互关联,完全贴合我们学校的教学场景,具体如下(用老师能看懂的话,不搞专业术语):

  • 学校表:存各个学校的基础信息,比如学校名称、创建时间,这样不同学校的成绩能分开,不会混在一起,实现多校隔离,避免查错成绩;

  • 班级表:和学校表关联,存每个学校的班级信息,比如一年级一班、二年级二班,确保每个班级都能对应到正确的学校,不会出现“跨学校查班级”的混乱;

  • 学生表:和班级表关联,存学生的基本信息,比如姓名、班级、账号密码,这样导入成绩时,能快速匹配到对应的学生,也能避免学生查错别人的成绩;

  • 考试名称表:存每次考试的信息,比如“期中测试”“期末统考”“单元检测”,这样我们老师能区分不同考试的成绩,不用混在一起统计;

  • 成绩分数表:这是最核心的表,关联学生、考试信息,存学生的各科分数、总分,我们老师导入成绩后,系统能自动把分数存到对应的学生、对应的考试下面,一目了然。

这5张表相互关联,逻辑很简单,就是我们老师平时统计成绩的思路,既能支持多所学校使用,也能清晰区分班级、学生和考试,为后续的排名计算、权限控制打下基础,最关键的是,我们老师用起来,能快速上手,不用琢磨复杂的逻辑。

权限系统方面,我结合我们学校的实际情况,设计了4个角色,按权限从高到低排序,完全贴合校园场景,避免越权操作,也能保护学生隐私:

  • 超级管理员:负责整体管理,比如添加学校、创建管理员账号,一般是负责技术的老师或者负责人,能查看所有学校的成绩数据,方便统筹管理;

  • 学校管理员:只负责自己学校的事,比如创建班级、添加我们老师的账号,查看本校所有班级的成绩,不用管其他学校的事,分工明确;

  • 教师(也就是我们自己):这是最常用的角色,只能管理自己负责的班级,比如导入本班学生的成绩、查看本班学生的成绩和排名,不能查看其他班级的,避免出现成绩泄露、互相攀比的情况;

  • 学生:只能查询自己的成绩、总分和排名(班级排名、学校排名),看不到其他同学的成绩,既满足了学生了解自己成绩的需求,也保护了学生的隐私,省得我们老师还要协调同学之间的矛盾(该权限暂时还在考虑是否需要给学生创建账号,因为学生查成绩通过自己的姓名查好像也足够了)。

当天晚上,我还搭建了账号系统,实现了注册、登录功能,不同角色登录后,看到的功能界面不一样,比如我们老师登录,就能看到“导入成绩”“查看班级排名”的按钮,学生登录,就只有“查询成绩”的入口,权限控制逻辑初步落地,试了一下,很符合我的使用习惯 哈哈哈哈。

Day4:攻克核心难点,解决我们老师最头疼的问题

Day4的重点,就是开发两个最核心的功能——Excel批量导入成绩和自动排名,这也是我们老师最需要的功能,更是整个开发过程中最耗时、最容易踩坑的部分,毕竟我不是专业开发,很多问题都是边查资料、边试错解决的。

首先是Excel导入功能。作为老师,我们平时统计成绩,都是用Excel,每个人的Excel格式可能不一样,有的老师习惯把姓名放第一列,有的放第二列,有的可能漏填班级,要是系统不能统一解析,导入起来会更麻烦,反而增加我们的工作量。

所以我想了个办法:制定一个统一的Excel模板,明确要求我们老师按照模板填写,模板里固定了学生姓名、班级、各科分数、考试名称等字段,我们老师只要把自己统计好的成绩,复制粘贴到模板里,就能上传导入。同时,我还加了异常处理——要是文件格式不对、缺少必填字段,或者学生姓名、班级在系统里找不到,系统会直接提示错误,告诉我们哪里有问题,方便我们修改后重新上传,不用一遍遍试错。

然后是自动排名功能,这也是最能解放我们双手的功能。以前每次考完试,我们要手动计算每个学生的总分,再手动排班级排名、学校排名,几十、上百个学生,算下来要花大半天时间,还容易算错、排错。我就是想让系统自动完成这件事,省出时间多休息。

这部分主要处理两个逻辑:总分计算和排名计算。总分计算很简单,系统自动读取学生的各科分数,求和后存入成绩表,不用我们手动相加;排名计算就相对复杂一点,要区分班级排名和学校排名,还要考虑同分的情况——比如两个学生总分一样,排名应该相同,后续排名不跳跃,这才符合我们学校的排名习惯。

我查了不少资料,通过prisma查询对应考试、对应班级/学校的所有学生成绩,按总分降序排序,然后遍历排序后的列表,依次分配排名,专门加了同分判断,解决了“同分排名跳跃”的问题。这里踩了一个小坑,最初没有考虑同分的情况,导致排名出现错误,试了好几次,修改了逻辑,才终于解决,那一刻真的很有成就感。

当天晚上,我还完善了查询功能:我们老师登录后,能查看本班所有学生的成绩排名,还能按学生姓名、分数区间筛选,比如筛选出80分以上的学生,方便我们针对性辅导;管理员则能查看对应范围的所有成绩数据,方便统筹管理。

Day5:测试优化,把“麻烦”都留给自己,把“方便”留给老师和学生

经过前4天的开发,工具的核心功能已经全部实现,但还存在很多细节问题和bug,Day5的主要工作,就是模拟我们老师、学生的使用场景,逐一测试、修bug、优化用户体验,毕竟我做这个工具,就是为了方便大家,不能让大家用的时候再遇到麻烦。

我模拟了不同角色的使用场景:超级管理员创建学校、添加管理员;学校管理员创建班级、添加我们老师的账号;我们老师上传Excel导入成绩、查看班级排名;学生查询自己的成绩……过程中发现了不少问题,都是我们平时使用中可能遇到的:比如Excel导入时,部分特殊字符(比如学生姓名里的生僻字)会导致解析失败;排名计算时,偶尔会出现数据错乱;用手机登录时,界面适配不好,操作不方便。

我花了一整天的时间,逐一修复这些bug:优化Excel解析逻辑,解决生僻字、特殊字符的问题;完善排名计算的逻辑,避免数据错乱;调整界面布局,适配电脑、手机等不同设备,毕竟我们老师和学生,有时候会用手机查看成绩;同时还加了一些细节优化——比如成绩导入后的成功提示,告诉我们导入了多少条、有没有失败的;查询记录缓存,下次查询不用重新输入信息;密码重置功能,避免学生、老师忘记密码找不到入口,这些细节,都是我作为老师,平时使用工具时希望有的功能。

到晚上的时候,所有测试都通过了,工具也达到了我预期的效果:支持多所学校使用,权限分明,我们老师能批量导入成绩,系统自动计算总分和排名,学生能快速查询自己的成绩,彻底解放了我们老师的双手,不用再被成绩统计、家长追问困扰。

5天总结:痴迷编程,每一步打磨,都藏着满满的成就感

作为一名普通老师,我没有专业的开发基础,但我一直特别痴迷编程,平时没事就喜欢琢磨各类小工具、研究相关技术。这次花5天时间,从同事的一句求助,到做出一个功能完善的成绩查询工具,全程没有丝毫勉强,反而越做越投入,边查资料、边试错、边优化,没有什么高大上的操作,全是自己的真实想法和踩坑经历,每解决一个小问题,都能让我开心好久。

这5天里,我没有追求“完美”,也没有追求“技术高深”,纯粹是出于对编程的热爱,享受一步步打磨作品的过程——从最初的简易单校版本,到后来用 fastify 和 prisma 重构,从5张数据库表的设计,到4个角色的权限控制,从Excel导入的异常处理,到排名逻辑的优化,每一步打磨,每一个bug的解决,都让我充满动力。

最开心的不是这个工具能帮到自己、帮到同事,而是我凭借自己的热爱和坚持,完成了一件看似不容易的事,那种成就感,是任何事情都替代不了的。从一开始的“试试无妨”,到后来的“越做越痴迷”,看着一个简陋的雏形,慢慢变成功能完善、逻辑清晰的工具,那种从无到有的创造感,就是我痴迷编程的原因。而且,这个工具后续还能慢慢优化,比如增加成绩导出功能、增加数据统计图表,既能继续锻炼我的编程能力,也能让我在打磨中获得更多成就感。

很多人问我,身为老师,平时备课、上课已经够忙了,为什么还要花时间琢磨编程?其实答案很简单,就是热爱和痴迷。编程对我来说,不是负担,而是放松的方式,是实现自我价值的途径。放假的日子,能全身心投入到自己痴迷的事情里,一点点打磨作品,看着它慢慢成型,这种专注和收获,远比单纯躺平更有意义。

一些项目图片: