基于Java+Vue+Spring Boot的课程作业管理系统毕业设计全栈实战

基于Java+Vue+Spring Boot的课程作业管理系统毕业设计全栈实战 如果你正在为计算机专业的毕业设计发愁不知道如何选择一个既有技术含量、又能实际运行、还能写进简历的完整项目那么这篇文章就是为你准备的。每年毕业季无数同学在“选题-开发-写论文-答辩”这个循环里挣扎。最常见的困境是要么选题太简单技术栈陈旧答辩时被老师质疑要么选题太复杂从零搭建一个系统光环境配置和基础框架就耗尽了所有时间最后代码跑不起来论文也成了空中楼阁。今天要拆解的这个“课程作业管理系统”就是一个典型的、能解决上述困境的“黄金级”毕业设计选题。它不是一个空泛的概念而是一个已经跑通的、采用Java Vue Spring Boot MySQL主流技术栈的完整开源项目。更重要的是它配套了源码、数据库、文档甚至答辩教程意味着你可以直接站在一个可运行的原型上进行二次开发和深度研究把精力从“从0到1”的基建转移到“从1到10”的业务逻辑实现、性能优化和系统设计上。本文将带你彻底剖析这个项目。我们不止步于告诉你“它有什么”而是深入分析为什么这个技术栈组合是毕业设计的“安全牌”与“加分项”如何快速将开源项目本地化变成你自己的毕业设计在开发、部署、论文撰写和答辩各个环节有哪些必须避开的“坑”如何基于现有功能进行拓展体现你的个人工作量与创新点无论你是Java后端、Vue前端初学者还是正在寻找完整项目练手的同学这篇文章都将提供一条清晰的、可落地的路径。1. 毕业设计选题为什么“课程作业管理系统”是个好选择毕业设计选题本质上是一次技术选型与风险评估。一个理想的选题应该满足技术主流、业务清晰、工作量适中、有扩展空间。“课程作业管理系统”完美契合这四点。首先技术栈“主流且安全”。Java Spring Boot 是企业级后端开发的事实标准Vue 是国内最流行的前端框架之一MySQL 是使用最广泛的关系型数据库。选择这个组合意味着资料丰富任何问题几乎都能找到解决方案和社区讨论。求职加分这套技术栈写在简历上能直接证明你具备市场需要的技能。答辩顺利答辩老师对这些技术非常熟悉便于理解你的工作提问也更聚焦于业务实现而非冷门技术本身。其次业务场景“熟悉且完整”。每个学生都经历过提交作业、查看成绩的过程。这个系统涵盖了用户管理学生、教师、管理员、课程管理、作业发布、提交、批改、成绩统计等核心模块。它麻雀虽小五脏俱全涉及了权限控制不同角色看到不同页面执行不同操作。数据流转作业从发布到批改的完整生命周期。文件操作作业附件的上传与下载。数据统计成绩的查询与分析。最后基于开源项目“启动快、风险低”。从零开始造轮子对毕业设计而言风险极高。一个配套完善的开源项目为你提供了一个可运行的Demo确保你的核心功能是通的避免项目“烂尾”。一个清晰的代码结构你可以学习良好的分层架构Controller, Service, Mapper。一个真实的数据库设计ER图、表结构都摆在你面前。宝贵的二次开发时间你可以把时间花在添加新功能、优化界面、撰写高质量论文上而不是纠结于如何让项目跑起来。这个项目的真正价值在于它为你提供了一个高起点的脚手架。你的任务不是重复发明轮子而是理解它、改进它并在这个过程中展示你的工程能力。2. 技术栈深度解析不止是组合更是工程实践仅仅列出 Java、Vue、Spring Boot、MySQL 是不够的。我们要理解在这个项目中它们是如何协同工作解决具体问题的。2.1 后端Spring Boot 如何简化企业级开发Spring Boot 的核心价值是“约定大于配置”。在这个作业管理系统中它主要体现在内嵌Web服务器无需单独部署 Tomcat一个jar包直接运行。自动配置引入spring-boot-starter-web依赖就自动配置好了MVC、JSON转换等。简化数据访问通过spring-boot-starter-data-jpa或配合 MyBatis-Plus极大简化了数据库操作。统一管理application.properties或application.yml文件集中管理数据库连接、服务器端口等所有配置。关键依赖示例 (pom.xml):!-- Web 支持 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- 数据库驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency !-- 数据访问 (以MyBatis-Plus为例) -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3/version /dependency !-- 单元测试 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency2.2 前端Vue 的组件化如何提升开发效率Vue 的核心是响应式数据绑定和组件化。在这个系统的前端项目中页面即组件Teacher.vue、Student.vue、AssignmentList.vue都是独立的组件。状态管理可能会使用 Vuex 或 Pinia 来集中管理用户登录状态、课程列表等全局数据。路由管理使用 Vue Router 实现单页面应用SPA的无刷新跳转提升用户体验。与后端交互使用 Axios 库发起 HTTP 请求调用后端的 RESTful API。一个简单的作业列表组件示例 (AssignmentList.vue):template div h3作业列表/h3 el-table :dataassignments stylewidth: 100% el-table-column proptitle label作业标题/el-table-column el-table-column propcourseName label所属课程/el-table-column el-table-column propdeadline label截止日期/el-table-column el-table-column label操作 template #defaultscope el-button sizesmall clickviewDetail(scope.row)查看/el-button el-button sizesmall typeprimary clicksubmitWork(scope.row) v-ifuserRole student提交/el-button /template /el-table-column /el-table /div /template script import { ref, onMounted } from vue; import axios from axios; import { ElMessage } from element-plus; export default { name: AssignmentList, setup() { const assignments ref([]); const userRole ref(localStorage.getItem(userRole) || student); // 从本地存储获取角色 const fetchAssignments async () { try { const response await axios.get(/api/assignment/list); assignments.value response.data.data; } catch (error) { ElMessage.error(获取作业列表失败); } }; const viewDetail (row) { // 跳转到作业详情页 console.log(查看作业:, row.id); }; const submitWork (row) { // 跳转到作业提交页 console.log(提交作业ID:, row.id); }; onMounted(() { fetchAssignments(); }); return { assignments, userRole, viewDetail, submitWork }; } }; /script2.3 数据层MySQL 表结构设计与 MyBatis-Plus 的妙用数据库设计是系统的基石。一个典型的作业管理系统至少包含以下核心表user用户表学生、教师、管理员通过role字段区分。course课程表。student_course学生选课关联表。assignment作业表关联course_id。submission作业提交表关联assignment_id和student_id。grade成绩表关联submission_id。使用 MyBatis-Plus 可以极大简化 CRUD 操作// 1. 实体类 (Assignment.java) Data TableName(assignment) public class Assignment { TableId(type IdType.AUTO) private Long id; private String title; private String description; private Long courseId; private LocalDateTime deadline; // ... 其他字段及 getter/setter } // 2. Mapper 接口继承 BaseMapper 即可获得通用方法 public interface AssignmentMapper extends BaseMapperAssignment { // 可以在此定义自定义复杂SQL方法 ListAssignment selectByCourseId(Param(courseId) Long courseId); } // 3. Service 层使用 Service public class AssignmentServiceImpl extends ServiceImplAssignmentMapper, Assignment implements AssignmentService { Autowired private AssignmentMapper assignmentMapper; public ListAssignment getAssignmentsByCourse(Long courseId) { // 使用 MyBatis-Plus 的 QueryWrapper 构建查询条件 QueryWrapperAssignment wrapper new QueryWrapper(); wrapper.eq(course_id, courseId); wrapper.orderByDesc(deadline); return assignmentMapper.selectList(wrapper); // 或者调用自定义方法 // return assignmentMapper.selectByCourseId(courseId); } }3. 环境准备从零搭建开发环境在开始编码之前一个稳定、一致的开发环境至关重要。以下是详细的准备步骤。3.1 后端开发环境 (Java Spring Boot)JDK安装 JDK 8 或 JDK 11LTS版本。推荐使用 Amazon Corretto 或 OpenJDK。安装后配置JAVA_HOME环境变量。# 检查安装 java -versionMaven用于项目构建和依赖管理。下载并配置MAVEN_HOME和PATH。# 检查安装 mvn -vIDE推荐使用 IntelliJ IDEA社区版或旗舰版。它对 Spring Boot 和 Maven 的支持非常出色。MySQL安装 MySQL 5.7 或 8.0。记住 root 密码。建议使用图形化工具如 MySQL Workbench 或 Navicat 进行管理。3.2 前端开发环境 (Vue)Node.jsVue 的运行环境。安装 LTS 版本。它自带 npm 包管理器。# 检查安装 node -v npm -vVue CLIVue 的官方脚手架工具用于快速创建项目。# 全局安装 npm install -g vue/cli # 检查安装 vue --versionIDE推荐使用 Visual Studio Code安装 Vetur、ESLint、Prettier 等插件提升开发体验。3.3 数据库初始化使用 MySQL 客户端连接数据库。创建数据库例如course_homework_db。CREATE DATABASE IF NOT EXISTS course_homework_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;运行项目提供的 SQL 脚本通常是sql/init.sql或database.sql创建所有表结构和初始数据。修改后端项目的application.yml配置文件更新数据库连接信息。# application.yml spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/course_homework_db?useUnicodetruecharacterEncodingutf-8useSSLfalseserverTimezoneAsia/Shanghai username: root password: your_password_here jpa: hibernate: ddl-auto: update # 或设为 none使用我们自己的SQL脚本 show-sql: true # 开发时显示SQL便于调试4. 项目启动与核心流程拆解假设你已经从开源平台如 Gitee、GitHub克隆了项目源码。项目结构通常如下course-homework-system/ ├── backend/ # Spring Boot 后端项目 │ ├── src/ │ ├── pom.xml │ └── ... ├── frontend/ # Vue 前端项目 │ ├── src/ │ ├── package.json │ └── ... └── docs/ # 文档、数据库脚本等 ├── sql/ └── ...4.1 后端启动步骤导入项目用 IntelliJ IDEA 打开backend文件夹等待 Maven 自动下载依赖。检查配置确认application.yml中的数据库配置正确。找到主类通常名为XxxApplication.java包含SpringBootApplication注解。运行主类点击运行按钮。控制台出现Started ... Application in x.xxx seconds即表示启动成功。默认端口常为8080。4.2 前端启动步骤打开终端在frontend目录下打开命令行。安装依赖npm install # 或使用淘宝镜像加速 # npm install --registryhttps://registry.npmmirror.com启动开发服务器npm run serve访问控制台输出的地址通常是http://localhost:8081。4.3 核心业务流程走读系统启动后你可以通过以下流程理解核心业务登录使用初始化的账号如 学生student/123456 教师teacher/123456登录。教师端创建课程教师可以创建一门新课。发布作业在课程下发布作业设置标题、内容、截止日期、附件。批改作业查看学生提交的作业列表下载附件评分并填写评语。成绩管理查看课程下所有学生的成绩统计。学生端选课浏览并选择课程。查看作业在“我的课程”中查看已发布作业。提交作业在截止日期前提交作业内容或附件。查看成绩查看已批改作业的成绩和教师评语。这个流程覆盖了系统的核心数据流转理解它对你后续的二次开发和论文撰写至关重要。5. 二次开发实战如何添加“作业查重”功能仅仅运行别人的代码不足以通过答辩。你需要体现个人工作量。一个很好的切入点是添加一个创新或优化模块。我们以“作业查重”功能为例展示如何从零开始集成一个新特性。目标教师批改作业时可以一键对本次作业的所有提交进行文本相似度分析并生成报告。5.1 后端实现集成文本相似度算法我们使用一个简单的 SimHash 算法作为示例。在实际项目中可以考虑更复杂的算法或调用第三方API。步骤1添加工具类SimHashUtil.javapackage com.example.homework.utils; import com.hankcs.hanlp.HanLP; import java.math.BigInteger; import java.util.HashMap; import java.util.Map; import java.util.List; public class SimHashUtil { /** * 计算文本的SimHash值 */ public static String getSimHash(String text) { // 1. 分词 ListString keywordList HanLP.extractKeyword(text, 100); // 提取关键词 // 2. 哈希并加权 int[] v new int[128]; for (String keyword : keywordList) { BigInteger hash hash(keyword); for (int i 0; i 128; i) { BigInteger bitmask BigInteger.ONE.shiftLeft(i); if (hash.and(bitmask).signum() ! 0) { v[i] 1; // 权重简单设为1 } else { v[i] - 1; } } } // 3. 降维 StringBuilder simHash new StringBuilder(); for (int i 0; i 128; i) { if (v[i] 0) { simHash.append(1); } else { simHash.append(0); } } return simHash.toString(); } /** * 计算海明距离 */ public static int getHammingDistance(String simHash1, String simHash2) { if (simHash1.length() ! simHash2.length()) { return -1; } int distance 0; for (int i 0; i simHash1.length(); i) { if (simHash1.charAt(i) ! simHash2.charAt(i)) { distance; } } return distance; } /** * 计算相似度 */ public static double getSimilarity(String simHash1, String simHash2) { int distance getHammingDistance(simHash1, simHash2); if (distance -1) { return 0.0; } return (128 - distance) / 128.0; } private static BigInteger hash(String source) { if (source null || source.length() 0) { return BigInteger.ZERO; } // 简单的哈希函数实际应用应使用更健壮的哈希 return new BigInteger(source.getBytes()).abs(); } }步骤2添加 Maven 依赖HanLP在backend/pom.xml中添加dependency groupIdcom.hankcs/groupId artifactIdhanlp/artifactId versionportable-1.8.4/version /dependency步骤3创建 Service 和 Controller// CheckService.java Service public class CheckService { public MapString, Object checkPlagiarism(Long assignmentId) { // 1. 根据 assignmentId 查询所有提交的作业内容 // 假设 Submission 实体有 content 字段存储文本内容 ListSubmission submissions submissionMapper.selectList( new QueryWrapperSubmission().eq(assignment_id, assignmentId) ); // 2. 计算每份作业的 SimHash ListString simHashList submissions.stream() .map(sub - SimHashUtil.getSimHash(sub.getContent())) .collect(Collectors.toList()); // 3. 两两比较计算相似度矩阵 int size submissions.size(); double[][] similarityMatrix new double[size][size]; ListMapString, Object result new ArrayList(); for (int i 0; i size; i) { for (int j i 1; j size; j) { double sim SimHashUtil.getSimilarity(simHashList.get(i), simHashList.get(j)); similarityMatrix[i][j] sim; similarityMatrix[j][i] sim; if (sim 0.8) { // 设定一个阈值例如0.8 MapString, Object pair new HashMap(); pair.put(studentA, submissions.get(i).getStudent().getName()); pair.put(studentB, submissions.get(j).getStudent().getName()); pair.put(similarity, String.format(%.2f%%, sim * 100)); result.add(pair); } } } // 4. 返回高相似度对 MapString, Object response new HashMap(); response.put(assignmentId, assignmentId); response.put(totalSubmissions, size); response.put(highSimilarityPairs, result); return response; } }// CheckController.java RestController RequestMapping(/api/check) public class CheckController { Autowired private CheckService checkService; PostMapping(/plagiarism/{assignmentId}) public Result checkPlagiarism(PathVariable Long assignmentId) { MapString, Object result checkService.checkPlagiarism(assignmentId); return Result.success(result); } }5.2 前端实现添加查重按钮与结果展示步骤1在教师批改页面添加按钮在TeacherAssignmentDetail.vue组件中template !-- ... 原有代码 ... -- el-button typewarning clickhandleCheckPlagiarism作业查重/el-button !-- ... 原有代码 ... -- /template script import { ref } from vue; import axios from axios; import { ElMessage, ElLoading } from element-plus; export default { props: [assignmentId], setup(props) { const checkResult ref(null); const dialogVisible ref(false); const handleCheckPlagiarism async () { const loading ElLoading.service({ text: 正在分析请稍候... }); try { const response await axios.post(/api/check/plagiarism/${props.assignmentId}); checkResult.value response.data.data; dialogVisible.value true; ElMessage.success(查重分析完成); } catch (error) { ElMessage.error(查重分析失败); } finally { loading.close(); } }; return { handleCheckPlagiarism, checkResult, dialogVisible }; } }; /script步骤2创建查重结果弹窗组件template el-dialog v-modeldialogVisible title作业查重报告 width60% div v-ifcheckResult p作业ID: {{ checkResult.assignmentId }}/p p总提交数: {{ checkResult.totalSubmissions }}/p el-table :datacheckResult.highSimilarityPairs border el-table-column propstudentA label学生A/el-table-column el-table-column propstudentB label学生B/el-table-column el-table-column propsimilarity label相似度/el-table-column el-table-column label操作 template #defaultscope el-button sizesmall clickviewComparison(scope.row)对比详情/el-button /template /el-table-column /el-table /div template #footer el-button clickdialogVisible false关闭/el-button el-button typeprimary clickexportReport导出报告/el-button /template /el-dialog /template通过这个完整的二次开发示例你不仅为系统增加了新功能更在论文中拥有了一个可以大书特书的“系统特色与创新点”章节。6. 数据库设计与优化建议原项目的数据库设计可能满足基本功能但你可以从以下角度进行优化体现你的数据库知识。6.1 核心表结构优化示例-- 1. 为用户表添加索引加速登录查询 ALTER TABLE user ADD INDEX idx_username (username); ALTER TABLE user ADD INDEX idx_role (role); -- 2. 为作业提交表添加联合索引优化按作业和学生的查询 ALTER TABLE submission ADD INDEX idx_assignment_student (assignment_id, student_id); -- 3. 考虑添加作业附件表实现文件与元数据分离如果原设计是字段存储路径 CREATE TABLE submission_attachment ( id bigint PRIMARY KEY AUTO_INCREMENT, submission_id bigint NOT NULL COMMENT 关联的提交ID, file_name varchar(255) NOT NULL COMMENT 原始文件名, file_path varchar(500) NOT NULL COMMENT 服务器存储路径, file_size bigint COMMENT 文件大小(字节), upload_time datetime DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (submission_id) REFERENCES submission(id) ON DELETE CASCADE ) COMMENT 作业提交附件表;6.2 复杂查询统计每门课程的平均分与最高分在论文的“系统实现”或“测试与分析”章节展示一个复杂的SQL查询能大大加分。SELECT c.id AS course_id, c.name AS course_name, t.name AS teacher_name, COUNT(DISTINCT s.student_id) AS student_count, COUNT(sub.id) AS submission_count, AVG(g.score) AS average_score, MAX(g.score) AS max_score FROM course c LEFT JOIN user t ON c.teacher_id t.id LEFT JOIN student_course sc ON c.id sc.course_id LEFT JOIN user s ON sc.student_id s.id LEFT JOIN assignment a ON c.id a.course_id LEFT JOIN submission sub ON a.id sub.assignment_id AND sub.student_id s.id LEFT JOIN grade g ON sub.id g.submission_id GROUP BY c.id, c.name, t.name ORDER BY average_score DESC;这个查询展示了多表连接、聚合函数和分组统计能很好地体现你对数据库操作的掌握。7. 部署上线从开发环境到可访问的演示系统一个能在公网访问的演示系统是答辩时的巨大亮点。最简单的方式是使用云服务器。7.1 后端打包与部署打包在backend目录下执行mvn clean package -DskipTests生成target/*.jar文件。上传将 jar 包和application-prod.yml生产环境配置文件上传到云服务器。运行在服务器上使用nohup或systemd后台运行。# 简单后台运行 nohup java -jar your-project.jar --spring.profiles.activeprod app.log 21 # 使用 systemd 管理更规范 # sudo vim /etc/systemd/system/coursework.servicesystemd 服务文件示例[Unit] DescriptionCoursework Management System Backend Afternetwork.target [Service] Typesimple Userwww WorkingDirectory/opt/coursework/backend ExecStart/usr/bin/java -jar coursework-backend.jar --spring.profiles.activeprod Restarton-failure [Install] WantedBymulti-user.target7.2 前端打包与部署打包在frontend目录下执行npm run build生成dist文件夹。部署将dist文件夹内的所有文件上传到云服务器的 Nginx 或 Apache 的网站根目录下。配置 Nginx解决前端路由刷新404问题。server { listen 80; server_name your-domain.com; # 或服务器IP location / { root /opt/coursework/frontend/dist; index index.html; try_files $uri $uri/ /index.html; # 关键配置支持Vue Router的history模式 } # 反向代理后端API location /api/ { proxy_pass http://localhost:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }7.3 域名与HTTPS可选但推荐购买一个便宜的域名。使用 Let‘s Encrypt 免费申请 SSL 证书。在 Nginx 中配置 HTTPS提升系统专业度和安全性。8. 论文撰写核心要点与答辩准备有了可运行的系统论文就是将你的工作系统化、理论化的过程。8.1 论文结构建议对应毕业设计常见要求摘要浓缩精华讲清楚系统做了什么、用了什么技术、有什么特色。绪论阐述背景、意义、国内外研究现状、本文工作。相关技术介绍不要罗列教科书定义重点写 Spring Boot 如何简化开发、Vue 的组件化优势、MyBatis-Plus 如何提升效率。结合你的项目谈。系统分析可行性分析、需求分析画用例图、功能模块设计。系统设计重中之重。包括架构设计前后端分离、数据库设计ER图、核心表结构、接口设计列出几个关键API用表格说明URL、方法、参数、返回值。系统实现展示核心代码片段并配以文字说明。例如“图5-1展示了基于SimHash的查重算法核心逻辑”然后贴上SimHashUtil.java的关键代码。系统测试功能测试设计测试用例表、性能测试用JMeter测试接口响应时间。总结与展望总结成果客观说明不足如查重算法精度可提升并提出未来可扩展的方向如移动端、AI自动批改。8.2 答辩常见问题与应对策略Q你这个项目和网上开源的有什么区别A承认基于开源项目但强调你的改进1修复了某个Bug2优化了某个功能如UI3新增了XX模块如作业查重4重新设计了数据库XX表以提升性能。Q你的系统能承受多少用户并发A这是一个课程作业系统预期用户是单个学校的师生并发不会极高。但我们采用了连接池、数据库索引、前端资源压缩等手段进行了基础优化。如果未来需要可以通过集群、缓存Redis来扩展。Q前后端是如何交互的A采用前后端分离架构。前端Vue通过Axios发送HTTP请求到后端Spring Boot的RESTful API。后端返回JSON数据前端进行渲染。这种架构松耦合便于独立开发和部署。Q遇到的最大技术难点是什么A提前准备一个例如文件上传的并发处理、大文本查重算法的性能优化、前端路由权限的动态管理等。详细说明你排查和解决的过程。Q系统有什么安全措施A1密码MD5加盐存储2使用JWT进行接口鉴权3后端对用户输入进行校验4SQL使用预编译防止注入5文件上传限制了类型和大小。9. 常见问题排查清单在开发部署过程中你一定会遇到问题。以下是高频问题速查表问题现象可能原因排查方式解决方案后端启动失败端口被占用8080端口已被其他程序使用netstat -ano | findstr :8080(Win) 或lsof -i:8080(Mac/Linux)1. 终止占用进程2. 修改application.yml中的server.port。前端npm install失败网络错误npm源访问慢或公司网络限制检查网络尝试pingregistry.npmjs.org切换为国内镜像源npm config set registry https://registry.npmmirror.com前端运行正常但访问后端API 4041. 后端未启动2. 跨域问题3. 代理配置错误1. 检查后端日志2. 浏览器F12看Network报错3. 检查前端vue.config.js的proxy配置。1. 确保后端服务运行2. 后端添加CrossOrigin注解或配置全局CORS3. 正确配置前端代理。数据库连接失败1. 数据库服务未启动2. 用户名密码错误3. 连接URL或时区错误查看后端启动日志中的具体错误信息。1. 启动MySQL服务2. 核对application.yml中的配置3. URL中加入serverTimezoneAsia/Shanghai。页面刷新后出现404前端路由问题部署后Vue Router的history模式需要服务器支持直接访问一个子路由如/teacher刷新。在Nginx配置中添加try_files $uri $uri/ /index.html;见7.2节。文件上传失败或大小限制Spring Boot默认文件上传大小限制为1MB查看后端日志是否有MaxUploadSizeExceededException。在application.yml中配置spring.servlet.multipart.max-file-size10MB和max-request-size10MB。遵循以上步骤和思路你不仅能顺利运行这个“课程作业管理系统”更能将其深度定制转化为一份体现你个人技术能力、充满细节和思考的优秀毕业设计。记住毕业设计考察的不仅是编码能力更是发现问题、分析问题、解决问题并清晰表达的全流程工程能力。从这个项目开始祝你答辩顺利