返回作品

学生赛事管理系统

创建于 2025 年 3 月 26 日

标签
  • 若依 RuoYi
  • Spring Boot
  • easy-query
  • MyBatis-Plus
  • MySQL
  • Redis
  • Druid
  • Vue 2
  • Element UI
  • ECharts
  • uni-app
  • Swagger

项目介绍

学生赛事管理系统是基于若依 RuoYi 3.8.9 后台框架二次开发的校运会赛事管理平台,业务代码集中在 com.ruoyi.match 包,前端在若依标准 ruoyi-ui(Vue 2 + Element UI)上新增 views/match 业务页面,并配套一套基于 RuoYi-App(uni-app) 改造的移动端,让运动员在手机上完成赛事报名、检录签到、成绩提交与查看。系统覆盖一场校运会从”建赛”到”颁奖”的完整链路:先由管理员创建赛事信息(阶段、项目类型、性别分组、人数与晋级规则等)并发布;学生作为运动员报名,经审核通过后进入分组;检录裁判按赛事完成签到,打分裁判录入成绩,最终按成绩颁发奖项并沉淀为历史记录。

数据库脚本 ry-saishi.sql 一次性导入若依基础表与十张 s_ 业务表,并预置管理员、学生(xuesheng)、运动员(yundongyuan)、裁判(caipan)四类角色的种子账号与示例赛事、运动员、成绩数据,开箱即可走通”创建赛事 → 报名审核 → 分组 → 分配裁判 → 签到 → 录成绩 → 颁奖”的完整业务流程。

项目架构

后端为若依标准多模块 Maven 工程(ruoyi-admin / ruoyi-common / ruoyi-framework / ruoyi-system),Spring Boot 2.5.15 + Java 8。本项目最有特色的地方在于持久层:业务代码没有使用若依常规的 Mapper XML,而是引入 easy-query 2.5.17sql-api-proxy / sql-springboot-starter)的代理模式,在 Controller 内通过注入 EasyEntityQuery 直接以类型安全的 lambda 表达式构建动态查询。以 SEventInfoController 为例,buildQuery() 方法把十几个筛选条件(赛事名称模糊、状态/阶段/项目/性别分组等值匹配、是否发布/分组标记)逐个追加到 where 中并 orderBy(eventId().desc()),增删改分别对应 insertable / updatable / deletable 的链式调用,删除时显式 disableLogicDelete() 走物理删除——整个模块零 Mapper XML、零手写 SQL。多表关联同样在 Controller 层完成:SAthleteController.lists_event_group_athletes_event_groups_event_info 三表连续 leftJoin,用 Select.of(eventName()) 把运动员参与的所有赛事名称拼成 eventStr 字符串展示。项目同时保留 mybatis-plus-join 依赖与若依自带的 MyBatis-Plus 基础能力,Redis 缓存、Druid 连接池、Swagger 接口文档、POI 导出(ExcelUtil)等若依基础设施均原样可用。

数据模型围绕赛事(s_event_info)展开,通过外键辐射报名、分组、签到、裁判、成绩、奖项六类记录:s_event_registration 记录报名与审核状态(0 待审核 / 1 已通过 / 2 已驳回,remark 存驳回原因);s_event_groups_event_group_athlete 承载分组及分组-运动员关联;s_event_check_in 记录运动员每次赛事的签到时间与状态;s_event_referee_assignment 按赛事分配裁判并区分类型(0 检录 / 1 打分);s_event_score 保存成绩(scorerank_numis_qualified 晋级标记、is_record_breaking 破纪录标记);s_event_awards_event_history_record 分别沉淀奖项与历史成绩。赛事信息本身还包含 group_size(每组人数)、mixed_group_size(混合组人数)、college_registration_limit(学院报名上限)、advancement_count(晋级/获奖人数)等竞赛编排参数,以及 is_release(是否发布)、is_grouped(是否分组)、is_grouped_release(是否发布分组)三个流程控制标记;statusevent_stage_typeevent_item_typegroup_sex_type 等枚举值统一由 sys_dict_data 字典驱动(match_event_info_statusmatch_event_info_typematch_event_info_itemmatch_event_info_group 等),保证管理端下拉选项与移动端展示一致。

核心功能

  • 赛事信息管理views/match/info/index.vue + SEventInfoController):以 el-tabs 分”基本信息/规则/时间/发布”等页签维护赛事,支持按名称、状态、性别分组、是否发布筛选;行内操作除标准修改/删除外,还提供”分配裁判”业务入口——按 roleKey: 'caipan' 查询裁判用户列表,多选后把 refereeIds 以逗号拼接提交给 SEventRefereeAssignmentController,一次生成多条裁判分配记录(referee_type 区分检录/打分)。赛事发布、分组、发布分组三个标记配合报名时间窗与检录时间,构成完整的赛事编排节奏。
  • 运动员管理views/match/athlete/index.vue + SAthleteController):新增运动员时除写入 s_athlete(姓名、性别、学号、学院、专业)外,还会联动创建系统账号——先 checkUserNameUnique 校验学号不重复,再以学号为 userName、姓名为 nickName、默认密码 123456 写入 sys_user,并调用 userRoleMapper.batchUserRole 绑定学生/运动员角色,让运动员直接获得登录若依与移动端的资格;列表通过三表 leftJoin 自动带出该运动员参与过的所有赛事名称。
  • 报名审核与赛事分组views/match/registration/index.vueviews/match/group/index.vueviews/match/groupAthlete/index.vue):管理端维护报名记录,按”待审核/已通过/已拒绝”流转审核状态并填写驳回原因(remark),支持按审核状态筛选;赛事分组按 group_name + group_order 维护,分组与运动员通过关联表(s_event_group_athlete)绑定,与赛事信息中的分组人数、混合组人数约束呼应,分组完成后通过 is_grouped_release 标记控制公示。
  • 检录签到与移动端自助views/match/in/index.vue + RuoYi-App pages/work/qiandao):管理端签到页支持按赛事、签到时间、签到状态筛选,行内提供”单个签到”,顶部提供”批量签到”(handleBatchCheckIn)一次处理选中记录;移动端 qiandao.vue 以 picker 选择赛事,展示赛事时间、地点与状态后调用 POST /match/in 完成自助签到。
  • 成绩、奖项与历史记录views/match/score/index.vueaward/index.vuerecord/index.vue):成绩录入包含成绩值(score)、排名(rank_num)、是否晋级/获奖、是否破纪录(红/绿 el-tag 区分展示)与备注;RuoYi-App 的 jifen.vue(比赛计分)用 switch 开关控制合格与破纪录标记提交成绩,chengji.vue 拉取 GET /match/score/list 展示成绩列表;奖项按赛事-运动员维度颁发(award_type + 备注),历史记录沉淀学生姓名、学院、专业与记录值/记录时间,各模块均保留若依标准的 Excel 导出能力。

功能截图

暂无运行截图。

快速上手

项目为若依标准多模块工程(后端 20250325-学生赛事-api,管理端 20250325-学生赛事-web,移动端 RuoYi-App)。数据库直接导入根目录 ry-saishi.sql(内含若依基础表、业务表与种子数据),修改 ruoyi-admin/src/main/resources/application-druid.yml(或 application-local.yml)中的 MySQL 连接与 Redis 地址,启动 RuoYiApplication 即完成后端部署。管理端进入 20250325-学生赛事-web 执行 npm installnpm run dev,使用 admin/admin123 登录后即可看到”赛事中心/赛事管理/成绩管理/人员管理”四个业务菜单。移动端用 HBuilderX 导入 RuoYi-App 运行,使用种子数据中的学生/运动员账号(如 yundongyuan1)登录,即可体验报名、签到、计分与成绩查询;业务页面与接口权限已在 sys_menu 中按 match:info:*match:score:* 等权限标识预置完成。

总结

这个项目是”若依快速搭建业务系统”的一个完整范本,最值得学习的有三点。其一,easy-query 代理模式的落地方式:业务代码完全不写 Mapper XML,EasyEntityQuery 的 lambda where、三表 leftJoinSelect.of 投影让动态查询、联表 VO 的组装全部收敛在 Controller 层,代码量比传统 MyBatis XML 方案明显更紧凑,可作为若依工程引入新 ORM 的参考样例;其二,账号联动与角色体系:运动员档案与 sys_user 账号同步创建、绑定专属角色,管理端、移动端共享同一套登录认证与权限标识(match:in:addmatch:assignment:add 等),业务身份与系统身份解耦又打通;其三,管理端 + 移动端双端复用接口:RuoYi-App 直接调用 /match/info/match/registration/match/in/match/score 等同一批 REST 接口完成报名、签到、计分闭环,后端无需为移动端单独开一套 API。整体分层清晰、注释规范,字段设计覆盖了校运会编排的真实约束(性别分组、混合组人数、学院限额、晋级名额),非常适合作为若依二次开发课程设计与体育赛事管理系统的参考项目。