DSTE咨询洞察:读懂华为BLM底层逻辑:别再只把它当战略模板套用
2026/7/29 7:59:22
基于你提供的页面和优化后的表结构,我从角色适配布局、交互逻辑、后端算法、数据流转四个维度,完善成绩管理功能,确保学生、老师、管理员都有流畅的体验。
| 优化点 | 说明 | 价值 |
|---|---|---|
| 成绩可视化 | 顶部新增「得分对比雷达图」(对比个人得分与班级平均分)、「成绩分布柱状图」(显示该考试的分数段人数) | 让学生直观了解自己的水平和位置 |
| 题型得分详情 | 成绩详情区用进度条展示每种题型的正确率(如“选择题 正确率80%”),点击题型可展开该题型的所有试题得分情况 | 精准定位薄弱题型,提升复习针对性 |
| 错题解析联动 | 错题解析区直接展示错题列表(题干、自己的答案、正确答案、解析),无需跳转;支持「加入错题集」按钮,一键添加到个人错题集 | 减少页面跳转,提升复盘效率 |
| 排名趋势 | 新增「历史排名趋势图」(展示该学生最近3次考试的班级排名变化) | 直观看到进步/退步情况,激励学习 |
┌───────────────────────────────────────────────────────────────────────────────────┐ │ 顶部:返回按钮 + 考试基本信息(名称/时间/状态) + 得分雷达图(个人vs班级平均分) │ ├───────────────────────────────────────────────────────────────────────────────────┤ │ 核心信息区:得分(0/0,红色大字体) | 班级排名(0/0) | 年级排名(0/0) | 通过率(80%) │ ├───────────────────────────────────────────────────────────────────────────────────┤ │ 成绩详情区: │ │ ┌──────────┬──────────┬──────────┬──────────┬──────────┐ │ │ 题型 │ 题目数量 │ 错题数量 │ 总分 │ 得分 │ 正确率 │ │ ├──────────┼──────────┼──────────┼──────────┼──────────┤ │ │ 选择题 │ 10 │ 2 │ 20 │ 16 │ 80% 🟢 │ │ │ 简答题 │ 5 │ 3 │ 50 │ 30 │ 60% 🟡 │ │ └──────────┴──────────┴──────────┴──────────┴──────────┘ ├───────────────────────────────────────────────────────────────────────────────────┤ │ 错题解析区: │ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │ 题号 │ 题干 │ 你的答案 │ 正确答案 │ 解析 │ │ ├────────┼─────────────────────────────┼───────────┼───────────┼─────────────────────────┤ │ │ 3 │ Spring Boot的核心注解是什么? │ @Controller│ @SpringBootApplication │ 启动类注解,用于自动配置 │ │ └────────┴─────────────────────────────┴───────────┴───────────┴─────────────────────────┘ │ 底部:[加入错题集] 按钮 │ └───────────────────────────────────────────────────────────────────────────────────┘因为老师/管理员不参加考试,所以不能显示学生的个人成绩页,而是展示该考试下所有考生的成绩列表,支持批量操作和统计分析。
┌───────────────────────────────────────────────────────────────────────────────────┐ │ 顶部:返回按钮 + 考试基本信息 + 统计区(平均分/最高分/最低分/通过率 + 成绩分布饼图) │ ├───────────────────────────────────────────────────────────────────────────────────┤ │ 筛选区:班级下拉 + 年级下拉 + 得分区间筛选 + 关键词搜索(考生姓名/ID) │ ├───────────────────────────────────────────────────────────────────────────────────┤ │ 考生成绩列表: │ │ ┌──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬────────┐ │ │ 考生ID │ 姓名 │ 班级 │ 得分 │ 正确率 │ 班级排名 │ 操作 │ │ ├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼────────┤ │ │ 1001 │ 张三 │ 高一2班 │ 75/100 │ 75% │ 5/30 │ 查看详情/导出答卷 │ │ │ 1002 │ 李四 │ 高一2班 │ 62/100 │ 62% │ 18/30 │ 查看详情/导出答卷 │ │ └──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴────────┘ ├───────────────────────────────────────────────────────────────────────────────────┤ │ 底部:批量操作按钮(导出成绩Excel/批量发送成绩通知) + 分页控件 │ └───────────────────────────────────────────────────────────────────────────────────┘mock_exam_record表,前端每1分钟自动刷新一次成绩,确保实时性。wrong_question_item表,前端自动跳转到错题管理页。exam_id和当前登录用户的user_id;user表的role字段,判断是学生/老师/管理员;mock_exam_record/marking_score/classroom)-- 获取个人基本成绩SELECTmer.actual_score,mer.total_score,RANK()OVER(PARTITIONBYc.idORDERBYmer.actual_scoreDESC)ASclass_rank,RANK()OVER(PARTITIONBYg.idORDERBYmer.actual_scoreDESC)ASgrade_rankFROMmock_exam_record merLEFTJOINuseruONmer.user_id=u.idLEFTJOINclassroom cONu.class_id=c.idLEFTJOINgrade gONc.grade_id=g.idWHEREmer.exam_id=#{examId} AND mer.user_id = #{userId};-- 获取题型得分统计SELECTq.type,COUNT(q.id)ASquestion_count,SUM(CASEWHENms.is_correct=1THEN1ELSE0END)AScorrect_count,SUM(q.score)AStotal_score,SUM(ms.actual_score)ASactual_score,ROUND(SUM(CASEWHENms.is_correct=1THEN1ELSE0END)/COUNT(q.id)*100,2)ASaccuracyFROMmarking_score msLEFTJOINquestion qONms.question_id=q.idWHEREms.exam_id=#{examId} AND ms.user_id = #{userId}GROUPBYq.type;-- 获取错题列表SELECTq.idASquestion_id,q.stem,ms.student_answer,ms.standard_answer,q.analysisFROMmarking_score msLEFTJOINquestion qONms.question_id=q.idWHEREms.exam_id=#{examId} AND ms.user_id = #{userId} AND ms.is_correct = 0;mock_exam_record/user/classroom)SELECTu.idASuser_id,u.name,c.class_name,mer.actual_score,mer.total_score,ROUND(mer.actual_score/mer.total_score*100,2)ASaccuracy,RANK()OVER(PARTITIONBYc.idORDERBYmer.actual_scoreDESC)ASclass_rankFROMmock_exam_record merLEFTJOINuseruONmer.user_id=u.idLEFTJOINclassroom cONu.class_id=c.idWHEREmer.exam_id=#{examId}ORDERBYmer.actual_scoreDESC;-- 考试统计数据SELECTAVG(mer.actual_score)ASavg_score,MAX(mer.actual_score)ASmax_score,MIN(mer.actual_score)ASmin_score,ROUND(COUNT(DISTINCTCASEWHENmer.actual_score>=60THENmer.user_idEND)/COUNT(DISTINCTmer.user_id)*100,2)ASpass_rateFROMmock_exam_record merWHEREmer.exam_id=#{examId};