返回作品

课程课时统计系统

创建于 2025 年 2 月 9 日

标签
  • 若依 RuoYi
  • Spring Boot
  • MyBatis-Plus
  • mybatis-plus-join
  • Hutool
  • MySQL
  • Vue 2
  • Element UI

项目介绍

课程课时统计系统是基于若依 RuoYi 3.8.9 后台管理框架二次开发的培训教学管理系统,业务代码集中在 com.ruoyi.app 包下,前端沿用若依标准 ruoyi-ui(Vue 2 + Element UI)并新增 views/app 业务页面。系统的核心场景是培训机构按”班级—课程—课时—学生”四级维度记录并统计课时学时:班级(app_class)挂接班主任与班级学生名单,课程(app_course)以模块名称(M1/M2/M3/M5/M7/M8/辅导)组织,每个模块下通过课时子表(app_course_xls)维护一节节具体课程及其学时时长,考勤数据(app_course_xls_sign)则按”课时 × 学生”记录每人每节课实际获得的学时。

项目最大的特色是考勤矩阵表views/app/sign/index.vue 从班级列表进入”录入考勤”,选择模块后,后端根据班级学生与选课学生实时生成一张”行是课时、列是学生”的动态表格,班主任在表格中直接填写每个学生的学时、课时日期、教员与总学时,一次提交即完成整堂课考勤与课时统计。种子数据预置了 2025TA1、2025T 两个班级、三名学生(对接 sys_user 106/107/108)、两名教师与七个教学模块,开箱即可体验完整的课时录入与统计流程。

项目架构

后端为若依标准的 Controller-Service-Mapper 三层结构(ruoyi-admin 模块),Spring Boot 2.5.15 + Java 8,持久层使用 MyBatis-Plus 3.5.4ServiceImpl 基类 + LambdaQueryWrapper),并引入 mybatis-plus-joincom.github.yulichang)与 Hutool 工具库。AppStudentServiceImplAppTeacherServiceImpl 通过 MPJLambdaWrapperleftJoin(SysUser.class, SysUser::getUserId, AppStudent::getUserId) 一次联查带出系统用户的登录名、昵称与性别,避免手写 XML 映射;AppCourseXlsSignService.getStudentByCourseId 更是把”班级学生集合”与”课程选课学生集合”用 Hutool 的 CollUtil.intersection 求交集,只把既在该班又选修该课的学生列入考勤表头,再联查 sys_user 拼装学生昵称。SignController 则直接聚合 AppClassStudentMapperAppStudentCourseMapperAppCourseXlsMapperAppCourseXlsSignMapper 四类 Mapper,完成矩阵数据的组装与落库。

数据库(20250209.sql)在若依基础库之外新增八张 app_ 业务表:app_class(班级,含班主任)、app_class_student(班级学生)、app_course(模块课程)、app_course_xls(课程课时,含 start_time 日期、total_hours 总学时、teacher 教员)、app_course_xls_sign(上课打卡,xls_id + student_id + hours)、app_student / app_teacher(档案,user_id 对接 sys_user)、app_student_course(学生选课)。系统菜单挂载”学生管理 / 教师管理 / 班级信息 / 考勤管理 / 课程信息”五个页面,其中班级、课程等页面由若依代码生成器的主子表模板(gen_tableapp_class 关联子表 app_class_student)生成,AppCourseServiceImpl 在新增/修改课程时对课时子表执行”先删后插”(updateAppCoursedelete 旧课时再 Db.saveBatch 批量插入新课时),保证主从数据一致。

核心功能

  • 班级与学生管理views/app/class/index.vueviews/app/student/index.vue):班级维护班主任(从教师列表选择)与班级名称,弹窗内通过子表动态添加/删除班级学生(学生下拉来自 listForSelectStudent);学生档案记录身份证号并挂接 sys_user,新增学生时同步创建系统账号,列表联表展示登录名称、用户昵称、用户性别与身份证。
  • 模块课程与课时明细views/app/course/index.vue):课程以模块名称组织,支持按模块筛选与 Excel 导出;编辑课程时在内嵌子表中增删课时行(序号自动编号),保存时 AppCourseServiceImpl 事务性地更新主表并”先删后插”课时明细(app_course_xls),保证课时与课程始终同步。
  • 考勤矩阵动态生成SignController.getList):按 classId + courseId 查询,表头固定为 日期/模块/课程/课时Id/课时/教员/统计 加每名学生一列(userId-{id}),行数据为该课程下全部课时,每个单元格回填该学生该课时的既有学时,前端 v-for 按表头动态渲染列,userId 列自动汇总出每行”统计”值。
  • 整表一次保存SignController.save):前端将表头与所有行回传,后端先按索引定位日期、课时Id、教员、统计列并回写 app_course_xls(日期、总学时、教员),再遍历每个 userId- 列逐单元格按 xls_id + student_id 查重——存在则 updateById,不存在则 insert 新打卡记录,实现整张考勤表一次提交、幂等落库。
  • 学生/教师档案管理views/app/teacher/index.vue 等):维护教师与系统账号的映射,提供 listForSelect 下拉接口供班级班主任、考勤场景复用,同时保留若依标准的增删改查与导出能力。

功能截图

暂无运行截图。

快速上手

项目为若依标准多模块 Maven 工程(ruoyi-admin / ruoyi-common / ruoyi-framework / ruoyi-system / ruoyi-ui)。后端:导入工程后修改 ruoyi-admin/src/main/resources/application-druid.yml 的 MySQL 连接,导入根目录 20250209.sql(内含若依基础库、八张业务表、菜单与种子数据,无需再执行官方初始化脚本),启动 RuoYiApplication 即运行后端服务。前端:进入 ruoyi-ui 执行 npm installnpm run dev,默认代理到后端 8080 端口;使用若依默认账号 admin/admin123 登录后,菜单中即出现学生管理、教师管理、班级信息、考勤管理、课程信息五个页面——先在课程信息中维护模块与课时,再在班级信息中建班并添加学生,最后在考勤管理中选择班级与模块即可打开课时统计矩阵录入学时。

总结

项目展示了若依框架承载培训教学管理业务的一种务实解法:以”课程—课时”主子表和”班级—学生”关系表为基础数据,把最复杂的考勤录入收敛成一张动态矩阵表格——表头由后端按班级与课程的选课交集实时生成,前端按表头动态渲染输入列,保存时再逐单元格查重 upsert,数据模型只有三张核心表却完整覆盖了课时统计闭环。最具学习价值的实现有三处:一是 CollUtil.intersection 求班级学生与选课学生交集确定考勤名单,逻辑简洁且语义清晰;二是 SignController.save 通过表头索引定位列、按 xls_id + student_id 唯一键做插入/更新的幂等保存,避免了整表覆盖;三是课程更新时对课时子表”先删后插”的联动维护,配合 @Transactional 保证主从一致。整体代码基于若依代码生成器主子表模板产出、风格统一,适合作为若依二次开发、主子表业务与动态表格录入场景的参考范本。