## 1. 项目概述 校园科技竞赛网站是基于SpringBoot框架开发的B/S架构系统,主要服务于高校师生参与各类科技竞赛活动。作为一个全栈项目,它涵盖了前端展示、后台管理、数据库设计、系统部署等完整开发流程,采用当前主流的Java技术栈实现。 我最近刚完成一个类似项目的交付,发现这类系统通常需要解决三个核心问题:多角色权限管理(学生/教师/评委)、竞赛流程数字化(报名-提交-评审-公示)、以及高并发场景下的稳定性。本系统通过SpringBoot的模块化设计很好地平衡了这些需求。 ## 2. 技术架构解析 ### 2.1 核心框架选型 **SpringBoot 2.7.x** 作为基础框架,相比传统SSM架构具备以下优势: - 内嵌Tomcat服务器(默认9.0版本) - 自动配置starter依赖 - Actuator监控端点 - 与MyBatis无缝集成 ```xml <!-- 典型POM依赖示例 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.2</version> </dependency>2.2 数据库设计
采用MySQL 8.0关系型数据库,主要表结构包括:
| 表名 | 核心字段 | 说明 |
|---|---|---|
| user_info | id, username, password, role_type | 用户基础信息 |
| competition | id, name, start_time, end_time | 竞赛基本信息 |
| submission | id, user_id, file_path, score | 作品提交记录 |
| judge_result | id, submission_id, comment | 评委评审结果 |
-- 建表示例 CREATE TABLE `competition` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, `description` text, `start_time` datetime DEFAULT NULL, `end_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;2.3 前端技术栈
- Thymeleaf模板引擎(服务端渲染)
- LayUI前端框架(简化DOM操作)
- ECharts数据可视化(用于数据统计展示)
3. 关键功能实现
3.1 多角色权限控制
采用Spring Security实现RBAC模型:
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/judge/**").hasRole("JUDGE") .antMatchers("/student/**").hasRole("STUDENT") .anyRequest().authenticated() .and() .formLogin().loginPage("/login"); } }3.2 文件上传模块
@PostMapping("/upload") public String handleFileUpload(@RequestParam("file") MultipartFile file) { String uploadDir = "/var/competition/uploads/"; String fileName = System.currentTimeMillis() + "_" + file.getOriginalFilename(); try { File dest = new File(uploadDir + fileName); file.transferTo(dest); return "上传成功:" + fileName; } catch (IOException e) { return "上传失败:" + e.getMessage(); } }3.3 评审流程状态机
定义竞赛作品的状态流转:
stateDiagram [*] --> PENDING PENDING --> UNDER_REVIEW : 管理员分配评委 UNDER_REVIEW --> APPROVED : 评分≥60 UNDER_REVIEW --> REJECTED : 评分<60 APPROVED --> PUBLISHED : 公示期结束4. 部署实践
4.1 开发环境配置
- JDK 1.8+
- Maven 3.6+
- MySQL 8.0
- IntelliJ IDEA(推荐)
# 初始化数据库 mysql -u root -p < schema.sql # 启动应用 mvn spring-boot:run4.2 生产环境部署
方案一:传统部署
# 打包 mvn clean package -DskipTests # 运行 java -jar target/competition-system-1.0.0.jar \ --server.port=8080 \ --spring.datasource.url=jdbc:mysql://prod-db:3306/competition方案二:Docker部署
FROM openjdk:8-jdk-alpine COPY target/*.jar app.jar ENTRYPOINT ["java","-jar","/app.jar"]5. 常见问题排查
5.1 数据库连接失败
现象:启动时报Communications link failure
解决方案:
- 检查MySQL用户权限
- 确认连接字符串格式:
jdbc:mysql://host:port/db?useSSL=false&serverTimezone=Asia/Shanghai
5.2 文件上传权限问题
现象:Linux系统上报Permission denied
处理步骤:
chmod 755 /var/competition chown -R springboot:springboot /var/competition5.3 性能优化建议
- 添加Redis缓存热门数据
- 配置Tomcat连接池参数:
spring.datasource.hikari.maximum-pool-size=20 server.tomcat.max-threads=200
6. 源码结构说明
src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── competition/ │ │ ├── config/ # 配置类 │ │ ├── controller/ # 控制器 │ │ ├── entity/ # 实体类 │ │ ├── mapper/ # MyBatis接口 │ │ ├── service/ # 业务逻辑 │ │ └── CompetitionApplication.java │ └── resources/ │ ├── static/ # 静态资源 │ ├── templates/ # 视图模板 │ ├── application.yml # 主配置文件 │ └── mybatis-config.xml # MyBatis配置 └── test/ # 测试代码提示:实际开发中建议添加Swagger文档支持,便于接口调试:
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency>
我在部署这类系统时有个实用技巧:使用Nginx做静态资源代理和负载均衡,可以显著提升性能。典型配置如下:
server { listen 80; server_name competition.example.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; } location ~* \.(js|css|png)$ { root /var/competition/static; expires 30d; } }对于需要处理高并发的场景,建议将文件存储迁移到OSS服务,数据库考虑读写分离架构。这些扩展方案可以根据实际用户规模逐步实施。