项目介绍
学生竞赛管理平台是一个基于Spring Boot + Vue.js的全栈Web应用,旨在为高校提供一个完整的竞赛管理解决方案。该平台可以帮助学校管理各类学科竞赛信息,方便学生报名参赛,并为教师提供竞赛指导和成绩管理功能。
技术栈
后端
- Spring Boot 2.7
- Spring Security
- MyBatis-Plus
- MySQL 8.0
- Redis
- JWT认证
前端
- Vue 3
- Element Plus
- Axios
- Vuex
- Vue Router
核心功能
1. 竞赛管理
- 竞赛信息发布
- 竞赛分类管理
- 竞赛时间线管理
- 参赛名额控制
2. 学生功能
- 竞赛信息浏览
- 在线报名
- 组队功能
- 成绩查询
- 获奖证书下载
3. 教师功能
- 竞赛指导
- 成绩录入
- 学生管理
- 数据统计
4. 系统管理
- 用户权限管理
- 系统配置
- 日志管理
- 数据备份
数据库设计
主要数据表
-- 竞赛信息表
CREATE TABLE competition (id BIGINT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100) NOT NULL,description TEXT,start_time DATETIME,end_time DATETIME,status TINYINT,created_time DATETIME
);-- 参赛记录表
CREATE TABLE participation (id BIGINT PRIMARY KEY AUTO_INCREMENT,student_id BIGINT,competition_id BIGINT,team_id BIGINT,status TINYINT,score DECIMAL(5,2),created_time DATETIME
);
核心代码示例
后端接口示例
@RestController
@RequestMapping("/api/competition")
public class CompetitionController {@Autowiredprivate CompetitionService competitionService;@GetMapping("/list")public Result getCompetitionList(CompetitionQuery query) {Page<Competition> page = competitionService.queryByPage(query);return Result.success(page);}@PostMapping("/register")public Result register(@RequestBody RegistrationDTO dto) {competitionService.registerCompetition(dto);return Result.success();}
}
前端代码示例
<template><div class="competition-list"><el-table :data="competitions" stripe><el-table-column prop="name" label="竞赛名称" /><el-table-column prop="startTime" label="开始时间" /><el-table-column prop="status" label="状态"><template #default="scope"><el-tag :type="getStatusType(scope.row.status)">{{ getStatusText(scope.row.status) }}</el-tag></template></el-table-column><el-table-column label="操作"><template #default="scope"><el-button @click="handleRegister(scope.row)">报名</el-button></template></el-table-column></el-table></div>
</template>
项目亮点
-
分布式Session管理
- 使用Redis存储session信息
- 支持水平扩展
- 提高系统可用性
-
实时通知功能
- 基于WebSocket实现
- 竞赛状态实时推送
- 重要通知即时提醒
-
高性能查询优化
- 合理使用缓存
- SQL优化
- 索引设计
-
完善的权限控制
- 基于RBAC模型
- 细粒度权限管理
- 动态权限配置
项目部署
环境要求
- JDK 1.8+
- Maven 3.6+
- Node.js 14+
- MySQL 8.0
- Redis 6.0
部署步骤
- 后端打包:
mvn clean package
- 前端打包:
npm run build
- 配置Nginx反向代理
- 使用Docker容器化部署
项目总结
通过本项目的开发,不仅实现了一个功能完善的竞赛管理平台,还在以下方面得到了提升:
- 全栈开发能力
- 分布式系统设计经验
- 性能优化实践
- 项目管理能力
后续优化方向
- 引入微服务架构
- 添加大数据分析功能
- 优化移动端适配
- 增加AI辅助功能
学生竞赛管理平台功能详解
一、竞赛管理模块
1. 竞赛信息发布
功能描述
- 支持富文本编辑器发布竞赛详情
- 可上传竞赛相关附件
- 支持定时发布
- 竞赛信息版本控制
核心代码
@Service
public class CompetitionServiceImpl implements CompetitionService {@Autowiredprivate CompetitionMapper competitionMapper;@Override@Transactionalpublic void publishCompetition(CompetitionDTO dto) {// 1. 基础信息保存Competition competition = new Competition();BeanUtils.copyProperties(dto, competition);// 2. 处理富文本内容String content = processRichText(dto.getContent());competition.setContent(content);// 3. 处理附件List<String> attachments = uploadAttachments(dto.getAttachments());competition.setAttachments(JSON.toJSONString(attachments));// 4. 设置发布状态if (dto.getPublishTime().after(new Date())) {competition.setStatus(CompetitionStatus.SCHEDULED.getCode());} else {competition.setStatus(CompetitionStatus.PUBLISHED.getCode());}competitionMapper.insert(competition);}
}
2. 竞赛分类管理
功能描述
- 多级分类体系
- 分类标签管理
- 分类统计分析
- 动态分类配置
数据结构
-- 竞赛分类表
CREATE TABLE competition_category (id BIGINT PRIMARY KEY AUTO_INCREMENT,parent_id BIGINT COMMENT '父分类ID',name VARCHAR(50) NOT NULL COMMENT '分类名称',code VARCHAR(50) COMMENT '分类编码',level INT COMMENT '层级',sort INT COMMENT '排序号',status TINYINT COMMENT '状态',created_time DATETIME,updated_time DATETIME,INDEX idx_parent_id (parent_id)
);-- 竞赛分类关联表
CREATE TABLE competition_category_rel (id BIGINT PRIMARY KEY AUTO_INCREMENT,competition_id BIGINT,category_id BIGINT,created_time DATETIME,INDEX idx_competition_id (competition_id),INDEX idx_category_id (category_id)
);
3. 竞赛时间线管理
功能描述
- 竞赛阶段配置
- 自动状态流转
- 提醒通知
- 进度追踪
核心代码
@Component
public class CompetitionTimelineManager {@Autowiredprivate CompetitionService competitionService;@Scheduled(cron = "0 0/5 * * * ?")public void checkCompetitionStatus() {List<Competition> competitions = competitionService.getActiveCompetitions();for (Competition competition : competitions) {CompetitionTimeline timeline = competition.getTimeline();Date now = new Date();// 检查并更新竞赛阶段if (now.after(timeline.getRegistrationEndTime())) {competition.setPhase(CompetitionPhase.COMPETITION);// 发送比赛开始通知notifyCompetitionStart(competition);}if (now.after(timeline.getCompetitionEndTime())) {competition.setPhase(CompetitionPhase.EVALUATION);// 发送比赛结束通知notifyCompetitionEnd(competition);}competitionService.updateCompetition(competition);}}
}
4. 参赛名额控制
功能描述
- 总名额限制
- 分组名额限制
- 实时名额统计
- 候补名单管理
核心实现
@Service
public class RegistrationService {@Autowiredprivate RedisTemplate redisTemplate;private static final String QUOTA_KEY = "competition:quota:";@Transactionalpublic boolean register(RegistrationDTO dto) {String quotaKey = QUOTA_KEY + dto.getCompetitionId();// 使用Redis进行原子性的名额检查和扣减Long remainQuota = redisTemplate.opsForValue().decrement(quotaKey);if (remainQuota < 0) {// 恢复名额redisTemplate.opsForValue().increment(quotaKey);// 加入候补名单addToWaitingList(dto);return false;}// 创建报名记录createRegistration(dto);return true;}
}
二、学生功能模块
1. 竞赛信息浏览
功能描述
- 分类筛选
- 高级搜索
- 个性化推荐
- 收藏关注
前端实现
<template><div class="competition-browser"><!-- 搜索过滤区 --><el-form :model="searchForm" inline><el-form-item label="竞赛类型"><el-cascaderv-model="searchForm.categoryIds":options="categoryOptions":props="{ checkStrictly: true }"/></el-form-item><el-form-item label="状态"><el-select v-model="searchForm.status"><el-optionv-for="item in statusOptions":key="item.value":label="item.label":value="item.value"/></el-select></el-form-item></el-form><!-- 竞赛列表 --><el-row :gutter="20"><el-col :span="6" v-for="item in competitions" :key="item.id"><competition-card:competition="item"@click="handleCompetitionClick"@collect="handleCollect"/></el-col></el-row></div>
</template>
2. 在线报名
功能描述
- 表单验证
- 材料上传
- 支付功能
- 报名进度查询
核心代码
@RestController
@RequestMapping("/api/registration")
public class RegistrationController {@Autowiredprivate RegistrationService registrationService;@PostMapping("/submit")public Result submit(@Valid @RequestBody RegistrationForm form) {// 1. 检查报名资格checkEligibility(form);// 2. 处理报名材料List<String> materials = uploadMaterials(form.getMaterials());// 3. 创建支付订单PaymentOrder order = createPaymentOrder(form);// 4. 提交报名信息RegistrationDTO dto = buildRegistrationDTO(form, materials, order);registrationService.register(dto);return Result.success(order);}@GetMapping("/progress/{registrationId}")public Result getProgress(@PathVariable Long registrationId) {RegistrationProgress progress = registrationService.getProgress(registrationId);return Result.success(progress);}
}
3. 组队功能
功能描述
- 创建/加入团队
- 队长管理
- 团队信息维护
- 队内交流
数据结构
-- 团队表
CREATE TABLE team (id BIGINT PRIMARY KEY AUTO_INCREMENT,competition_id BIGINT,name VARCHAR(100),leader_id BIGINT,max_members INT,current_members INT,status TINYINT,created_time DATETIME,INDEX idx_competition_id (competition_id)
);-- 团队成员表
CREATE TABLE team_member (id BIGINT PRIMARY KEY AUTO_INCREMENT,team_id BIGINT,user_id BIGINT,role TINYINT COMMENT '1:队长 2:成员',join_time DATETIME,status TINYINT,INDEX idx_team_id (team_id),INDEX idx_user_id (user_id)
);
4. 成绩查询
功能描述
- 实时成绩查询
- 成绩分析
- 排名查看
- 历史成绩统计
核心实现
@Service
public class ScoreService {@Autowiredprivate ScoreMapper scoreMapper;public ScoreVO queryScore(Long userId, Long competitionId) {// 1. 获取基础成绩信息Score score = scoreMapper.selectByUserAndCompetition(userId, competitionId);// 2. 计算排名int rank = calculateRank(score);// 3. 获取成绩分析ScoreAnalysis analysis = analyzeScore(score);// 4. 构建返回对象return ScoreVO.builder().score(score).rank(rank).analysis(analysis).build();}private ScoreAnalysis analyzeScore(Score score) {// 成绩分析逻辑return ScoreAnalysis.builder().averageScore(calculateAverageScore()).distribution(calculateDistribution()).trend(calculateTrend()).build();}
}
5. 获奖证书下载
功能描述
- 证书模板管理
- 证书生成
- 防伪验证
- 批量下载
核心代码
@Service
public class CertificateService {@Autowiredprivate CertificateTemplate certificateTemplate;public String generateCertificate(CertificateDTO dto) {// 1. 加载证书模板Template template = certificateTemplate.getTemplate(dto.getTemplateId());// 2. 生成证书编号String certificateNo = generateCertificateNo(dto);// 3. 填充证书内容Map<String, Object> params = new HashMap<>();params.put("userName", dto.getUserName());params.put("competitionName", dto.getCompetitionName());params.put("award", dto.getAward());params.put("date", new Date());params.put("certificateNo", certificateNo);// 4. 生成证书PDFString pdfPath = template.generate(params);// 5. 保存证书记录saveCertificateRecord(dto, certificateNo, pdfPath);return pdfPath;}// 证书防伪验证public boolean verifyCertificate(String certificateNo) {// 验证证书真实性return certificateMapper.verify(certificateNo) != null;}
}
学生竞赛管理平台功能详解(二)
三、教师功能模块
1. 竞赛指导
功能描述
- 指导团队管理
- 在线辅导
- 资料共享
- 进度跟踪
数据结构
-- 指导关系表
CREATE TABLE teacher_guidance (id BIGINT PRIMARY KEY AUTO_INCREMENT,teacher_id BIGINT,team_id BIGINT,competition_id BIGINT,status TINYINT,created_time DATETIME,INDEX idx_teacher_id (teacher_id),INDEX idx_team_id (team_id)
);-- 辅导记录表
CREATE TABLE guidance_record (id BIGINT PRIMARY KEY AUTO_INCREMENT,guidance_id BIGINT,type TINYINT COMMENT '1:在线辅导 2:资料分享 3:进度检查',content TEXT,attachments TEXT,created_time DATETIME,INDEX idx_guidance_id (guidance_id)
);
核心实现
@Service
public class GuidanceService {@Autowiredprivate WebSocketServer webSocketServer;// 创建在线辅导会话public String createGuidanceSession(GuidanceSessionDTO dto) {// 生成会话IDString sessionId = generateSessionId();// 创建会话记录GuidanceSession session = GuidanceSession.builder().sessionId(sessionId).teacherId(dto.getTeacherId()).teamId(dto.getTeamId()).startTime(new Date()).status(SessionStatus.ACTIVE).build();// 保存会话信息sessionMapper.insert(session);// 通知相关学生notifyTeamMembers(dto.getTeamId(), sessionId);return sessionId;}// 分享资料@Transactionalpublic void shareMaterials(MaterialShareDTO dto) {// 上传资料List<String> fileUrls = fileService.uploadFiles(dto.getFiles());// 创建分享记录GuidanceRecord record = GuidanceRecord.builder().guidanceId(dto.getGuidanceId()).type(GuidanceType.MATERIAL_SHARE).content(dto.getDescription()).attachments(JSON.toJSONString(fileUrls)).build();recordMapper.insert(record);// 发送通知sendNotification(dto.getTeamId(), "新的学习资料已分享");}
}
2. 成绩录入
功能描述
- 批量成绩导入
- 成绩审核
- 成绩修正
- 评分标准管理
核心代码
@Service
public class ScoreManagementService {@Autowiredprivate ScoreMapper scoreMapper;// 批量导入成绩@Transactionalpublic ImportResult importScores(MultipartFile file) {ImportResult result = new ImportResult();try {// 解析Excel文件List<ScoreImportDTO> scores = parseExcel(file);// 数据验证List<ScoreImportDTO> validScores = validateScores(scores);// 批量保存for (ScoreImportDTO score : validScores) {try {saveScore(score);result.addSuccess();} catch (Exception e) {result.addError(score, e.getMessage());}}} catch (Exception e) {result.setStatus(ImportStatus.FAILED);result.setMessage(e.getMessage());}return result;}// 成绩审核@Transactionalpublic void reviewScore(ScoreReviewDTO dto) {Score score = scoreMapper.selectById(dto.getScoreId());// 权限检查checkReviewPermission(dto.getReviewerId(), score);// 更新成绩状态if (dto.isApproved()) {score.setStatus(ScoreStatus.APPROVED);score.setApprovedBy(dto.getReviewerId());score.setApprovedTime(new Date());} else {score.setStatus(ScoreStatus.REJECTED);score.setRejectReason(dto.getReason());}scoreMapper.updateById(score);// 发送通知notifyScoreResult(score);}
}
3. 学生管理
功能描述
- 学生信息维护
- 分组管理
- 考勤记录
- 表现评价
数据结构
-- 学生分组表
CREATE TABLE student_group (id BIGINT PRIMARY KEY AUTO_INCREMENT,teacher_id BIGINT,name VARCHAR(50),description TEXT,created_time DATETIME,INDEX idx_teacher_id (teacher_id)
);-- 考勤记录表
CREATE TABLE attendance_record (id BIGINT PRIMARY KEY AUTO_INCREMENT,student_id BIGINT,group_id BIGINT,type TINYINT COMMENT '1:正常 2:迟到 3:早退 4:缺勤',record_time DATETIME,remark VARCHAR(200),INDEX idx_student_id (student_id),INDEX idx_group_id (group_id)
);
核心实现
@Service
public class StudentManagementService {// 学生分组管理public void manageGroup(GroupManagementDTO dto) {switch (dto.getOperation()) {case CREATE:createGroup(dto);break;case UPDATE:updateGroup(dto);break;case DELETE:deleteGroup(dto.getGroupId());break;case ADD_STUDENTS:addStudentsToGroup(dto.getGroupId(), dto.getStudentIds());break;case REMOVE_STUDENTS:removeStudentsFromGroup(dto.getGroupId(), dto.getStudentIds());break;}}// 记录考勤public void recordAttendance(AttendanceDTO dto) {// 验证考勤时间validateAttendanceTime(dto);// 创建考勤记录AttendanceRecord record = AttendanceRecord.builder().studentId(dto.getStudentId()).groupId(dto.getGroupId()).type(dto.getType()).recordTime(dto.getRecordTime()).remark(dto.getRemark()).build();attendanceMapper.insert(record);// 更新统计数据updateAttendanceStatistics(dto.getStudentId());}
}
4. 数据统计
功能描述
- 竞赛数据分析
- 成绩统计报表
- 参与度分析
- 数据可视化
核心代码
@Service
public class StatisticsService {@Autowiredprivate CompetitionMapper competitionMapper;// 生成竞赛统计报表public CompetitionStatistics generateStatistics(StatisticsQuery query) {return CompetitionStatistics.builder().totalParticipants(countParticipants(query)).averageScore(calculateAverageScore(query)).participationRate(calculateParticipationRate(query)).awardDistribution(getAwardDistribution(query)).scoreDistribution(getScoreDistribution(query)).departmentAnalysis(analyzeDepartmentPerformance(query)).trendAnalysis(analyzeTrend(query)).build();}// 导出Excel报表public String exportReport(ReportQuery query) {// 获取统计数据CompetitionStatistics statistics = generateStatistics(query);// 创建Excel工作簿Workbook workbook = new XSSFWorkbook();// 添加统计表格addStatisticsSheet(workbook, statistics);// 添加图表addCharts(workbook, statistics);// 保存文件String filePath = saveExcelFile(workbook);return filePath;}
}
四、系统管理模块
1. 用户权限管理
功能描述
- 用户角色管理
- 权限分配
- 访问控制
- 操作审计
数据结构
-- 角色表
CREATE TABLE role (id BIGINT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),code VARCHAR(50),description TEXT,status TINYINT,created_time DATETIME
);-- 权限表
CREATE TABLE permission (id BIGINT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),code VARCHAR(50),type TINYINT,parent_id BIGINT,path VARCHAR(200),created_time DATETIME
);-- 角色权限关联表
CREATE TABLE role_permission (id BIGINT PRIMARY KEY AUTO_INCREMENT,role_id BIGINT,permission_id BIGINT,created_time DATETIME,INDEX idx_role_id (role_id),INDEX idx_permission_id (permission_id)
);
核心实现
@Service
public class AuthorizationService {@Autowiredprivate RedisTemplate redisTemplate;// 权限检查public boolean hasPermission(Long userId, String permissionCode) {// 从缓存获取用户权限Set<String> permissions = getUserPermissions(userId);// 检查权限return permissions.contains(permissionCode);}// 分配角色@Transactionalpublic void assignRoles(RoleAssignmentDTO dto) {// 删除原有角色userRoleMapper.deleteByUserId(dto.getUserId());// 分配新角色for (Long roleId : dto.getRoleIds()) {UserRole userRole = new UserRole();userRole.setUserId(dto.getUserId());userRole.setRoleId(roleId);userRoleMapper.insert(userRole);}// 清除缓存clearUserPermissionCache(dto.getUserId());}
}
2. 系统配置
功能描述
- 参数配置
- 字典管理
- 菜单配置
- 系统公告
核心代码
@Service
public class SystemConfigService {@Autowiredprivate RedisTemplate redisTemplate;private static final String CONFIG_CACHE_KEY = "system:config:";// 更新系统配置@Transactionalpublic void updateConfig(ConfigUpdateDTO dto) {// 保存配置SystemConfig config = SystemConfig.builder().code(dto.getCode()).value(dto.getValue()).description(dto.getDescription()).updateTime(new Date()).build();configMapper.updateById(config);// 更新缓存redisTemplate.opsForValue().set(CONFIG_CACHE_KEY + config.getCode(), config.getValue());// 发布配置更新事件publishConfigUpdateEvent(config);}// 获取配置值public String getConfigValue(String code) {// 先从缓存获取String value = (String) redisTemplate.opsForValue().get(CONFIG_CACHE_KEY + code);if (value == null) {// 从数据库获取SystemConfig config = configMapper.selectByCode(code);if (config != null) {value = config.getValue();// 放入缓存redisTemplate.opsForValue().set(CONFIG_CACHE_KEY + code, value);}}return value;}
}
3. 日志管理
功能描述
- 操作日志
- 登录日志
- 异常日志
- 日志分析
核心实现
@Aspect
@Component
public class LogAspect {@Autowiredprivate LogService logService;// 记录操作日志@Around("@annotation(operationLog)")public Object logOperation(ProceedingJoinPoint joinPoint, OperationLog operationLog) throws Throwable {// 开始时间long startTime = System.currentTimeMillis();// 获取用户信息UserDetails user = SecurityUtils.getCurrentUser();// 记录请求信息OperationLogDTO logDTO = OperationLogDTO.builder().userId(user.getId()).module(operationLog.module()).operation(operationLog.operation()).method(joinPoint.getSignature().getName()).params(JSON.toJSONString(joinPoint.getArgs())).startTime(new Date(startTime)).build();try {// 执行目标方法Object result = joinPoint.proceed();// 记录响应结果logDTO.setSuccess(true);logDTO.setResponse(JSON.toJSONString(result));return result;} catch (Exception e) {// 记录异常信息logDTO.setSuccess(false);logDTO.setErrorMsg(e.getMessage());throw e;} finally {// 计算执行时间logDTO.setDuration(System.currentTimeMillis() - startTime);// 异步保存日志logService.asyncSaveLog(logDTO);}}
}
4. 数据备份
功能描述
- 自动备份
- 手动备份
- 备份恢复
- 备份策略管理
核心代码
@Service
public class BackupService {@Autowiredprivate DataSourceProperties dataSourceProperties;// 执行备份public String backup(BackupDTO dto) {// 生成备份文件名String fileName = generateBackupFileName();// 构建备份命令String command = String.format("mysqldump -h%s -P%s -u%s -p%s %s > %s",dataSourceProperties.getHost(),dataSourceProperties.getPort(),dataSourceProperties.getUsername(),dataSourceProperties.getPassword(),dataSourceProperties.getDatabase(),fileName);try {// 执行备份命令Process process = Runtime.getRuntime().exec(command);int exitCode = process.waitFor();if (exitCode == 0) {// 备份成功,上传到存储服务String url = uploadBackupFile(fileName);// 记录备份信息saveBackupRecord(dto, url);return url;} else {throw new BackupException("数据库备份失败");}} catch (Exception e) {throw new BackupException("执行备份出错", e);}}// 恢复数据@Transactionalpublic void restore(String backupUrl) {// 下载备份文件String fileName = downloadBackupFile(backupUrl);// 构建恢复命令String command = String.format("mysql -h%s -P%s -u%s -p%s %s < %s",dataSourceProperties.getHost(),dataSourceProperties.getPort(),dataSourceProperties.getUsername(),dataSourceProperties.getPassword(),dataSourceProperties.getDatabase(),fileName);try {// 执行恢复命令Process process = Runtime.getRuntime().exec(command);int exitCode = process.waitFor();if (exitCode != 0) {throw new RestoreException("数据恢复失败");}// 记录恢复操作saveRestoreRecord(backupUrl);} catch (Exception e) {throw new RestoreException("执行恢复出错", e);}}
}
总结
教师功能和系统管理模块是保证竞赛管理平台正常运转的重要组成部分。这些功能模块的设计和实现重点考虑了:
- 安全性:完善的权限控制和数据保护机制
- 可用性:直观的操作界面和完整的功能支持
- 可维护性:模块化设计和规范的代码结构
- 可扩展性:预留功能扩展接口和配置项
- 可靠性:完整的日志记录和数据备份机制
通过这些功能的实现,为教师和管理员提供了完整的竞赛管理工具,确保整个竞赛管理平台能够稳定、高效地运行。