1. 项目概述
这个基于SpringBoot+Vue的毕业设计管理系统是我在指导计算机专业学生毕业设计过程中逐步完善的一个实战项目。系统采用前后端分离架构,后端使用Java+SpringBoot技术栈,前端基于Vue.js框架,数据库选用MySQL,是一个典型的现代化Web应用开发案例。
提示:本系统特别适合计算机相关专业的毕业设计选题参考,包含了从需求分析到部署上线的完整开发流程。
作为高校教学管理系统的一个细分领域,毕业设计管理具有其特殊性:需要协调教师命题、学生选题、过程管理和成果评定等多个环节。传统的人工管理方式效率低下,容易出错,而这个系统正是为了解决这些痛点而设计的。
2. 技术选型与架构设计
2.1 技术栈解析
后端技术栈:
- Java 8:稳定的LTS版本,语言特性成熟
- SpringBoot 2.x:快速构建生产级应用
- MyBatis:轻量级ORM框架
- Maven:项目构建和依赖管理
前端技术栈:
- Vue.js 2.x:渐进式前端框架
- Element UI:基于Vue的UI组件库
- Axios:HTTP请求库
- Vue Router:前端路由管理
数据库:
- MySQL 5.7:关系型数据库
- Navicat:数据库管理工具
开发工具:
- IntelliJ IDEA:Java开发IDE
- Visual Studio Code:前端开发IDE
- Git:版本控制
2.2 系统架构设计
系统采用经典的三层架构:
- 表现层:Vue前端负责用户交互
- 业务逻辑层:SpringBoot处理核心业务
- 数据访问层:MyBatis操作数据库
前后端通过RESTful API进行通信,使用JSON格式传输数据。这种架构的优势在于:
- 前后端分离,职责清晰
- 便于团队协作开发
- 可独立部署和扩展
- 技术栈选择灵活
3. 核心功能实现
3.1 管理员模块
管理员是整个系统的超级用户,拥有最高权限。主要功能包括:
-
课题信息管理
- 增删改查课题基本信息
- 设置课题开放/关闭状态
- 分配课题给指定教师
-
成绩统计报表
- 按年度/专业/班级统计成绩
- 可视化展示(柱状图/折线图)
- 导出Excel报表
-
教师管理
- 教师账号CRUD操作
- 分配教师权限
- 重置教师密码
注意:管理员账号应该严格控制数量,建议采用二次验证机制确保安全。
3.2 教师模块
教师用户的核心业务流程:
-
课题发布流程
- 创建新课题(含题目、要求、难易度等)
- 设置课题最大可选人数
- 提交管理员审核
-
任务管理
- 发布阶段性任务(开题、中期、终稿)
- 设置任务截止时间
- 批改学生提交的文档
-
成绩评定
- 设置评分标准(开题20%、中期30%、终稿50%)
- 录入各环节分数
- 计算并发布最终成绩
3.3 学生模块
学生用户的主要操作:
-
课题选择
- 浏览可选课题列表
- 查看课题详情和要求
- 提交选题申请(每人限选1个)
-
任务提交
- 查看各阶段任务要求
- 上传文档(支持PDF/DOCX格式)
- 查看教师批改意见
-
成绩查询
- 查看各环节得分
- 查看最终成绩和排名
- 导出成绩单
4. 数据库设计
4.1 主要数据表结构
-
用户表(users)
sql复制CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `password` varchar(100) NOT NULL, `real_name` varchar(50) DEFAULT NULL, `role` enum('admin','teacher','student') NOT NULL, `email` varchar(100) DEFAULT NULL, `phone` varchar(20) DEFAULT NULL, `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -
课题表(topics)
sql复制CREATE TABLE `topics` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(200) NOT NULL, `description` text, `teacher_id` int(11) NOT NULL, `max_students` int(11) DEFAULT '1', `status` enum('draft','published','closed') DEFAULT 'draft', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `teacher_id` (`teacher_id`), CONSTRAINT `topics_ibfk_1` FOREIGN KEY (`teacher_id`) REFERENCES `users` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -
选题表(selections)
sql复制CREATE TABLE `selections` ( `id` int(11) NOT NULL AUTO_INCREMENT, `topic_id` int(11) NOT NULL, `student_id` int(11) NOT NULL, `status` enum('applied','approved','rejected','completed') DEFAULT 'applied', `apply_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `approve_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `student_id` (`student_id`), KEY `topic_id` (`topic_id`), CONSTRAINT `selections_ibfk_1` FOREIGN KEY (`topic_id`) REFERENCES `topics` (`id`), CONSTRAINT `selections_ibfk_2` FOREIGN KEY (`student_id`) REFERENCES `users` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4.2 关键业务表关系
- 教师-课题:一对多(一个教师可发布多个课题)
- 课题-学生:多对多(通过选题表关联)
- 任务-学生:一对多(一个学生有多个任务记录)
5. 系统部署指南
5.1 开发环境搭建
-
后端环境
bash复制# 安装JDK 1.8 sudo apt-get install openjdk-8-jdk # 安装Maven sudo apt-get install maven # 克隆项目 git clone https://github.com/xxx/thesis-system.git # 导入IDEA作为Maven项目 -
前端环境
bash复制# 安装Node.js 14.x curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - sudo apt-get install -y nodejs # 安装依赖 cd frontend npm install -
数据库初始化
sql复制# 创建数据库 CREATE DATABASE thesis_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # 导入SQL脚本 mysql -u root -p thesis_system < db/schema.sql
5.2 生产环境部署
-
后端部署
bash复制# 打包项目 mvn clean package -DskipTests # 运行jar包 nohup java -jar target/thesis-system-1.0.0.jar --spring.profiles.active=prod > server.log 2>&1 & -
前端部署
bash复制# 构建生产版本 npm run build # 配置Nginx server { listen 80; server_name yourdomain.com; location / { root /path/to/frontend/dist; try_files $uri $uri/ /index.html; } location /api { proxy_pass http://localhost:8080; proxy_set_header Host $host; } }
6. 开发经验与技巧
6.1 后端开发注意事项
-
接口设计规范
- 遵循RESTful风格
- 统一返回格式:
json复制{ "code": 200, "message": "success", "data": {} } - 合理使用HTTP状态码
-
事务管理
java复制@Transactional public void approveSelection(int selectionId) { // 1. 更新选题状态 // 2. 减少课题剩余名额 // 3. 发送通知 } -
性能优化
- 合理使用缓存(Redis)
- 批量操作代替循环单次操作
- 必要的数据库索引
6.2 前端开发技巧
-
组件化开发
- 按功能划分组件
- 合理使用props和emit
- 状态管理使用Vuex
-
表单验证
javascript复制rules: { title: [ { required: true, message: '请输入课题标题', trigger: 'blur' }, { min: 5, max: 200, message: '长度在5到200个字符', trigger: 'blur' } ] } -
API封装
javascript复制// api/teacher.js export function getTopics(teacherId) { return request({ url: `/api/teachers/${teacherId}/topics`, method: 'get' }) }
7. 常见问题与解决方案
7.1 开发阶段问题
-
跨域问题
java复制// SpringBoot配置 @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("GET", "POST", "PUT", "DELETE") .maxAge(3600); } } -
时区问题
properties复制# application.properties spring.jackson.time-zone=GMT+8 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss -
文件上传大小限制
properties复制# application.properties spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB
7.2 部署阶段问题
-
端口冲突
bash复制# 查看端口占用 netstat -tunlp | grep 8080 # 终止进程 kill -9 <PID> -
数据库连接失败
- 检查数据库服务是否启动
- 验证连接字符串和权限
- 检查防火墙设置
-
前端路由404
nginx复制location / { try_files $uri $uri/ /index.html; }
在实际开发过程中,我们还遇到了许多细节问题,比如SpringBoot的多环境配置、Vue的按需加载、Element UI的样式覆盖等。这些问题的解决过程都记录在项目的Wiki中,可以作为后续开发的参考。