原创

基于SpringBoot的大学生竞赛管理系统

温馨提示:
本文最后更新于 2026年06月04日,已超过 6 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

1. 资源

放到文章最后面

2. 项目简介

大学生竞赛管理系统旨在为高校提供一个在线管理各类学科竞赛的平台,实现竞赛信息的发布、学生报名、教师审核评分等核心流程的数字化管理。

系统主要面向三类用户角色:

  • 管理员:负责系统的全局配置,管理学生、教师等基础信息,并对班级类型等字典数据进行维护。
  • 教师:可以发布和管理竞赛信息,审核学生的报名申请,并对学生提交的作品进行在线评分。
  • 学生:可以浏览和查询竞赛信息,进行在线报名(包括团队或个人),提交参赛作品,查看报名审核状态和作品评分结果。

3. 技术栈

该项目采用了前后端分离的架构模式,主要技术组件如下:

  • 后端

    • 基础框架: Spring Boot 2.2.2
    • 持久层: MyBatis-Plus 2.3,用于简化数据库操作。
    • 数据库: MySQL 5.7.32
    • 权限控制: Apache Shiro 1.3.2,结合自定义的Token拦截器进行身份验证和授权。
    • 工具库: Hutool、Fastjson、Commons-lang3等,用于简化开发。
  • 前端(后台管理)

    • 核心框架: Vue.js
    • UI组件库: Element UI
    • HTTP客户端: Axios
    • 图表库: ECharts
    • 构建工具: Webpack (通过Vue CLI)
  • 其他:

    • 项目管理: Maven
    • 文件存储: 本地文件系统(/upload目录)

4. 详细介绍

4.1 核心功能模块

  1. 竞赛信息管理:

    • 教师: 可以新增、查看、修改、删除自己发布的竞赛信息,并管理评论。
    • 学生: 可以查看竞赛信息列表和详情,并进行报名操作。
    • 管理员: 可以查看所有竞赛信息。
  2. 竞赛报名管理:

    • 学生: 对感兴趣的竞赛进行报名,填写参赛人员、上传作品、提交宣言。报名后可查看审核状态并进行支付操作。
    • 教师: 查看报名列表,对学生的报名申请进行“审核”(通过/拒绝)并填写回复,审核通过后可以进行“评分”。
    • 管理员: 查看所有报名记录,拥有删除权限。
  3. 作品打分管理:

    • 教师: 对已审核通过的报名作品进行评分(zuopinpingfen字段)和评价(pingjianeirong字段)。
    • 学生: 可以查看自己的作品被评分的最终结果。
  4. 基础数据管理:

    • 学生管理: 管理员对学生的学号、姓名、班级、学院等信息进行增删改查。
    • 教师管理: 管理员对教师的工号、姓名、职称、学院等信息进行增删改查。
    • 班级类型管理: 管理员维护班级的字典数据,供学生信息录入时选择。
  5. 系统管理:

    • 用户登录/登出: 支持管理员、教师、学生三种身份分别通过/users/login/jiaoshi/login/xuesheng/login接口进行登录。
    • Token认证: 登录成功后后端生成Token,前端在后续请求的Header中携带,由AuthorizationInterceptor拦截器进行统一鉴权。
    • 系统配置: 通过config表管理首页轮播图等配置参数。

4.2 数据库设计

数据库名为springbootrd362,核心数据表如下:

  • users: 系统管理员表。
  • xuesheng: 学生信息表,xuehao为唯一登录账号。
  • jiaoshi: 教师信息表,gonghao为唯一登录账号。
  • jingsaixinxi: 竞赛信息表,存储竞赛的详细内容、时间、地点、模式(如付费)等,并关联发布教师。
  • jingsaibaoming: 竞赛报名表,关联学生、教师和竞赛,记录报名信息、参赛作品、审核状态(sfsh)及支付状态(ispay)。
  • zuopindafen: 作品打分表,关联学生和竞赛,记录教师给出的评分和评价。
  • banjileixing: 班级类型字典表。
  • token: 存储用户的登录Token信息,用于会话管理。
  • config: 系统配置参数表。

4.3 项目结构

  • 后端 (src/main/java/com/):

    • annotation/: 自定义注解,如@IgnoreAuth用于跳过Token验证。
    • config/: 配置类,如MyBatis-Plus和拦截器配置。
    • controller/: 控制层,处理前端请求。每个主要实体都有对应的Controller。
    • dao/: 数据访问层,定义Mapper接口。
    • entity/: 实体类,与数据库表对应,包含VOViewModel等不同视图的对象。
    • interceptor/: 拦截器,如AuthorizationInterceptor实现Token校验。
    • service/: 业务逻辑层,定义接口及实现。
    • utils/: 工具类,如分页、文件、MD5、RESTful响应封装等。
    • resources/mapper/: MyBatis的XML映射文件。
    • resources/application.yml: 后端核心配置文件,包含数据库连接、端口(8080)、上下文路径(/springbootrd362)等。
  • 前端 (src/main/resources/admin/admin/src/):

    • api/: 定义后端API接口的地址。
    • components/: Vue可复用组件。
    • router/: Vue Router配置文件,定义了前端路由与视图组件的映射。
    • utils/: 前端工具类,如HTTP请求封装(http.js)、菜单权限(menu.js)、存储(storage.js)等。
    • views/: 页面级Vue组件,按模块划分,如modules/jingsaixinximodules/xuesheng等。
    • main.js: 前端应用入口文件。

5. 部分代码

5.1 后端:竞赛信息控制器 (JingsaixinxiController.java)

此代码片段展示了后端如何处理竞赛信息的分页列表请求,并包含了根据登录教师身份进行数据过滤的逻辑。

// 文件路径: ./springbootrd362/src/main/java/com/controller/JingsaixinxiController.java
@RestController
@RequestMapping("/jingsaixinxi")
public class JingsaixinxiController {
    @Autowired
    private JingsaixinxiService jingsaixinxiService;

    /**
     * 后端列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params, JingsaixinxiEntity jingsaixinxi, HttpServletRequest request){
        // 获取当前登录用户的表名(角色),从session中获取
        String tableName = request.getSession().getAttribute("tableName").toString();
        // 如果当前登录用户是教师,则只查询该教师自己发布的竞赛信息
        if(tableName.equals("jiaoshi")) {
            jingsaixinxi.setGonghao((String)request.getSession().getAttribute("username"));
        }
        EntityWrapper<JingsaixinxiEntity> ew = new EntityWrapper<JingsaixinxiEntity>();
        // 执行分页查询,并应用排序、筛选条件
        PageUtils page = jingsaixinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, jingsaixinxi), params), params));
        return R.ok().put("data", page);
    }
    // ... 其他方法,如save, update, delete等
}

5.2 后端:Token拦截器 (AuthorizationInterceptor.java)

此代码片段是权限控制的核心,它在每个请求处理前验证Header中的Token是否有效。

// 文件路径: ./springbootrd362/src/main/java/com/interceptor/AuthorizationInterceptor.java
@Component
public class AuthorizationInterceptor implements HandlerInterceptor {
    public static final String LOGIN_TOKEN_KEY = "Token";
    @Autowired
    private TokenService tokenService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // ... 跨域处理代码 ...

        // 检查方法上是否有@IgnoreAuth注解,有则直接放行
        IgnoreAuth annotation;
        if (handler instanceof HandlerMethod) {
            annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
            if(annotation!=null) {
                return true;
            }
        }

        // 从请求头中获取Token
        String token = request.getHeader(LOGIN_TOKEN_KEY);
        TokenEntity tokenEntity = null;
        if(StringUtils.isNotBlank(token)) {
            tokenEntity = tokenService.getTokenEntity(token);
        }

        // 如果Token有效,将用户信息存入session,放行
        if(tokenEntity != null) {
            request.getSession().setAttribute("userId", tokenEntity.getUserid());
            request.getSession().setAttribute("role", tokenEntity.getRole());
            request.getSession().setAttribute("tableName", tokenEntity.getTablename());
            request.getSession().setAttribute("username", tokenEntity.getUsername());
            return true;
        }

        // Token无效或未提供,返回401未授权错误
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json; charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.print(JSONObject.toJSONString(R.error(401, "请先登录")));
        return false;
    }
}

5.3 前端:HTTP请求封装 (http.js)

此代码片段展示了前端如何配置Axios,在每次请求的Header中自动添加Token。

// 文件路径: ./springbootrd362/src/main/resources/admin/admin/src/utils/http.js
import axios from 'axios'
import router from '@/router/router-static'
import storage from '@/utils/storage'

const http = axios.create({
    timeout: 1000 * 86400,
    withCredentials: true,
    baseURL: '/springbootrd362',
    headers: {
        'Content-Type': 'application/json; charset=utf-8'
    }
})

// 请求拦截器:在发送请求前,从本地存储获取Token并添加到请求头中
http.interceptors.request.use(config => {
    config.headers['Token'] = storage.get('Token')
    return config
}, error => {
    return Promise.reject(error)
})

// 响应拦截器:处理全局错误,如Token失效(401)则跳转到登录页
http.interceptors.response.use(response => {
    if (response.data && response.data.code === 401) {
        router.push({ name: 'login' })
    }
    return response
}, error => {
    return Promise.reject(error)
})

export default http

6. 部分截图

img1
img2
img3
img4
img5
img6
img7
img8
img9
img10
img11
img12
img13
img14

7. 项目总结

大学生竞赛管理系统是一个功能完备、结构清晰的大学生竞赛管理系统。通过分析提供的代码,可以得出以下结论:

  1. 业务逻辑闭环:系统完整地覆盖了从“教师发布竞赛” -> “学生查看/报名” -> “教师审核/评分” -> “学生查看结果”的全流程,满足了高校竞赛管理的基本需求。
  2. 技术架构成熟:项目采用了业界流行的Spring Boot + MyBatis-Plus + Vue/Element UI技术栈,前后端分离。代码分层明确(Controller/Service/Dao),职责清晰,便于维护和扩展。
  3. 权限控制严谨:基于Shiro和自定义Token拦截器实现了基于角色的访问控制(RBAC)。系统区分了管理员、教师、学生三种角色,并在前端(通过menu.js)和后端(通过@IgnoreAuth注解和Session判断)均实施了严格的权限校验,确保数据安全。
  4. 功能细节完善:除了核心的增删改查,系统还实现了文件上传FileController)、数据联动CommonController/option接口)、审核流程sh方法)、支付状态模拟ispay字段)和数据统计(如分组统计、求和)等实用功能。
  5. 开发规范良好:项目包含了详细的数据库SQL脚本、Maven依赖管理(pom.xml)、统一的RESTful响应封装(R.java)以及工具类,显示了良好的开发规范。

综上所述,该项目不仅可作为毕业设计或课程设计的完整案例,其核心架构和设计思想也可作为构建其他类似业务管理系统(如活动报名、项目评审等)的可靠基础。

代码:https://fifteen.xiaobias.com/source/106

正文到此结束