Spring Boot+Vue教务系统实战:前后端分离与权限控制详解

发布时间:2026/9/17 2:06:45
Spring Boot+Vue教务系统实战:前后端分离与权限控制详解 简介这是一套面向计算机专业本科生的JavaWeb毕设实战项目聚焦高校教务管理核心业务涵盖学籍、课程、成绩、教师及教学资源等模块采用主流前后端分离架构助力学生完成高质量毕业设计并掌握企业级开发全流程。压缩包共279个文件含112个Java后端逻辑代码、48个Vue前端组件与页面、23个JS交互脚本、12个CSS样式文件如app.c6668e59.css、chunk-vendors.9650af1e.css等、18个XML配置及1个SQL建库脚本辅以30张界面截图、14张图标资源及PDF说明文档整体7.57MB结构清晰、命名规范便于模块化学习与二次开发。已有75人学习下载。资源提供完整可运行源码、详细部署说明、数据库设计文档及MySQL 5.7建表脚本开箱即用VueSpring Boot技术栈覆盖现代Web开发关键能力适合夯实Java基础、理解RESTful接口设计、实践Maven依赖管理与跨端调试流程。1. 这不是又一个“登录增删改查”的教务系统而是一套可跑通、可调试、可拆解的 Spring Boot Vue 前后端分离教学闭环你手头这份java毕设项目之基于JavaWeb的教务管理系统(源码说明文档mysql).zip表面看是毕业设计常见题但实际藏着一条被多数教程跳过的暗线它把「Spring Boot 后端服务如何定义 REST 接口」、「Vue 前端如何通过 axios 拦截器统一处理 token 和错误」、「MySQL 5.7 表结构如何支撑多角色权限学生/教师/管理员」三者真正拧在一起跑通了。不是静态页面拼接也不是后端模板渲染manage_code/src下的 Vue 组件调用的是/api/student/list这类纯 JSON 接口server_code里对应的是RestController注解的StudentController—— 这才是当前企业级 JavaWeb 开发的真实切口。它适合两类人一是正在写毕设、卡在「前后端联调失败」「登录后跳转404」「MySQL建表报错1071」的学生二是想快速复现一个完整 JavaWeb 流程、验证自己对 Spring Security 权限控制或 Vue Router 路由守卫理解是否到位的初级开发者。项目不追求炫技但每个模块都留有可打断点、可改 SQL、可重写接口的清晰边界。2. 从 Maven 多模块结构到 MySQL 5.7 表设计看清前后端分离项目的物理骨架这个项目虽未显式声明为 Maven 多模块工程但从路径server_code/和manage_code/的并列结构、pom.xml中spring-boot-starter-web与mybatis-spring-boot-starter的依赖组合能明确判断其采用「后端服务独立打包、前端资源独立构建」的物理分离模式。这种结构直接决定了你本地运行时必须分两步启动先起 Spring Boot 后端服务监听8080再用npm run serve启动 Vue 开发服务器默认8081并通过vue.config.js中的devServer.proxy将/api/**请求代理到http://localhost:8080。若忽略此代理配置浏览器控制台必现跨域错误 —— 这是绝大多数初学者卡住的第一关。2.1 server_code 后端模块的核心依赖与启动逻辑server_code/pom.xml中关键依赖如下dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.2.0/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency dependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-starter/artifactId version1.2.8/version /dependency提示druid-spring-boot-starter是本项目选用的数据库连接池而非 HikariCP。它自带监控页面/druid需在application.yml中配置druid.stat-view-servlet.enabledtrue并设置登录账号密码否则访问会 404。这是排查数据库连接慢、SQL 执行异常的首选入口。server_code/src/main/java/com/example/manage/ManageApplication.java是启动类其SpringBootApplication注解已隐含ComponentScan因此所有Controller、Service、Mapper类都会被自动扫描。特别注意src/main/resources/mapper/目录下的 XML 映射文件如StudentMapper.xml它们与StudentMapper.java接口一一对应SQL 语句全部外置便于审计和优化。2.2 manage_code 前端模块的构建链路与 API 对接方式manage_code是标准 Vue CLI 3 项目package.json中scripts定义了开发与构建命令scripts: { serve: vue-cli-service serve, build: vue-cli-service build, lint: vue-cli-service lint }核心对接逻辑在src/utils/request.js中import axios from axios const service axios.create({ baseURL: process.env.NODE_ENV production ? /api : http://localhost:8080/api, timeout: 10000 }) // 请求拦截器携带 token service.interceptors.request.use( config { const token localStorage.getItem(token) if (token) { config.headers.Authorization Bearer ${token} } return config }, error Promise.reject(error) ) // 响应拦截器统一错误处理 service.interceptors.response.use( response { const { code, data, msg } response.data if (code 200) { return data } else { ElMessage.error(msg || 请求失败) return Promise.reject(new Error(msg)) } }, error { ElMessage.error(网络异常请检查后端服务是否启动) return Promise.reject(error) } ) export default service注意baseURL的条件判断是关键。开发时走http://localhost:8080/api依赖 devServer.proxy生产构建后则走相对路径/api需确保 Nginx 或 Tomcat 静态资源部署时将/api路径反向代理到后端服务。若漏掉此步上线后所有接口 404。2.3 MySQL 5.7 数据库表结构解析为什么user_role表不能少项目提供的sql/目录下manage.sql文件包含完整建表语句。重点观察三张核心表表名主要字段作用关键约束sys_userid,username,password,role_id,status用户基础信息role_id外键关联sys_role.idsys_roleid,role_name,description角色定义如 ADMIN/TEACHER/STUDENT主键自增user_roleuser_id,role_id用户-角色多对多关系联合主键(user_id, role_id)提示sys_user.role_id字段仅用于单角色场景而真实教务系统中教师可能同时是「课程负责人」和「班主任」必须依赖user_role中间表实现灵活授权。项目虽未在前端 UI 层开放多角色选择但数据库设计已预留扩展能力 —— 这正是区分“能跑通”和“可演进”的分水岭。manage.sql中CREATE TABLE语句均指定ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_unicode_ci明确要求 MySQL 5.7 必须启用utf8mb4字符集否则插入 emoji 或生僻字会报错Incorrect string value。执行前务必确认 MySQL 配置文件my.cnf包含[client] default-character-set utf8mb4 [mysqld] character-set-server utf8mb4 collation-server utf8mb4_unicode_ci3. 启动全流程实操从 JDK 1.8 环境校验到 Navicat 导入数据的七步闭环一套毕设项目能否 10 分钟内跑起来取决于环境准备是否精准匹配摘要描述。本项目严格限定 JDK 1.8、Tomcat 7、MySQL 5.7 —— 任何版本越界都会引发不可预知错误。以下步骤经实测验证每一步均可复制粘贴执行。3.1 JDK 1.8 与 Maven 环境确认Windows/Linux 通用首先验证 JDK 版本java -version # 正确输出应为 # java version 1.8.0_3XX # Java(TM) SE Runtime Environment (build 1.8.0_3XX-bXX) # Java HotSpot(TM) 64-Bit Server VM (build 25.3XX-bXX, mixed mode)若显示11或17需切换 JDK。在 IDEA 中File → Project Structure → Project → Project SDK选择 JDK 1.8在命令行中临时切换# Linux/macOS export JAVA_HOME/path/to/jdk1.8.0_3XX export PATH$JAVA_HOME/bin:$PATH # WindowsPowerShell $env:JAVA_HOMEC:\Program Files\Java\jdk1.8.0_3XX $env:PathC:\Program Files\Java\jdk1.8.0_3XX\bin; $env:PathMaven 版本需 ≥ 3.5.0mvn -v # 输出应含 Apache Maven 3.5.x 或更高3.2 MySQL 5.7 数据库初始化Navicat 图形化操作打开 Navicat新建连接主机localhost端口3306用户名root密码按实际填写右键连接 → 「新建数据库」数据库名填manage字符集选utf8mb4排序规则选utf8mb4_unicode_ci右键新建的manage数据库 → 「运行SQL文件」选择项目包内sql/manage.sql执行成功后刷新数据库确认sys_user、sys_course、sys_score等 12 张表均已创建关键验证执行SELECT * FROM sys_user LIMIT 1;检查password字段值是否为加密字符串如$2a$10$...确认 BCrypt 加密已生效若报错ERROR 1071 (42000): Specified key was too long说明表索引长度超限需在my.cnf中添加innodb_large_prefixON并重启 MySQL最后执行INSERT INTO sys_user (username, password, role_id, status) VALUES (admin, $2a$10$ZLQJzX9Y7VtKjRcFgHmN.OeIbJkLmNpQrStUvWxYzA1B2C3D4E5F6, 1, 1);插入初始管理员账号密码为123456BCrypt 加密后值。3.3 后端服务启动与端口验证进入server_code目录执行# 清理并重新编译 mvn clean compile # 启动 Spring Boot 应用跳过测试 mvn spring-boot:run -DskipTests # 或使用 IDEA右键 ManageApplication.java → Run ManageApplication启动成功标志控制台输出Tomcat started on port(s): 8080 (http)浏览器访问http://localhost:8080/swagger-ui.html若集成 Swagger或http://localhost:8080/actuator/health返回{status:UP}若报错Failed to configure a DataSource检查application.yml中spring.datasource.url是否为jdbc:mysql://localhost:3306/manage?useUnicodetruecharacterEncodingUTF-8serverTimezoneGMT%2B8且username/password与 Navicat 连接一致。3.4 前端服务启动与跨域代理生效验证进入manage_code目录# 安装依赖首次运行 npm install # 启动开发服务器 npm run serve启动成功标志控制台输出App running at: - Local: http://localhost:8081/浏览器打开http://localhost:8081出现登录页关键验证打开浏览器开发者工具F12→ Network 标签页 → 点击登录按钮 → 查看login请求的Headers→Request URL应为http://localhost:8080/api/login而非http://localhost:8081/api/login证明devServer.proxy代理生效。4. 权限控制与接口调试用 Postman 验证 Spring Security 的角色拦截逻辑项目虽未在说明文档中明说安全框架但server_code的pom.xml包含spring-boot-starter-security依赖且src/main/java/com/example/manage/config/SecurityConfig.java存在。该类定义了基于HttpSecurity的 URL 权限规则是理解“为什么学生不能访问教师管理页”的核心。4.1 SecurityConfig.java 的关键配置解析Configuration EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() .antMatchers(/api/login, /api/register, /api/public/**).permitAll() // 公共接口放行 .antMatchers(/api/admin/**).hasRole(ADMIN) // /api/admin/ 开头需 ADMIN 角色 .antMatchers(/api/teacher/**).hasRole(TEACHER) // /api/teacher/ 开头需 TEACHER 角色 .antMatchers(/api/student/**).hasRole(STUDENT) // /api/student/ 开头需 STUDENT 角色 .anyRequest().authenticated(); // 其他所有请求需认证 } Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }提示hasRole(ADMIN)实际校验的是sys_user.role_id对应的sys_role.role_name字段值。若数据库中sys_role表里role_name存储为admin小写而代码中写hasRole(ADMIN)则权限校验永远失败。必须确保数据库role_name值与代码中hasRole()参数完全一致大小写敏感。4.2 使用 Postman 调试角色权限链路四步法获取 TokenPOSThttp://localhost:8080/api/loginBody 选raw → JSON输入{username:admin,password:123456}成功返回{code:200,data:{token:eyJhbGciOiJIUzUxMiJ9...},msg:登录成功}复制data.token值。以 Admin 身份访问受限接口GEThttp://localhost:8080/api/admin/user/listHeaders 添加Authorization: Bearer eyJhbGciOiJIUzUxMiJ9...返回用户列表200。以 Student 身份尝试访问 Admin 接口先用学生账号登录如{username:student1,password:123456}获取其 token再用该 token 访问http://localhost:8080/api/admin/user/list返回{code:403,msg:Access Denied}证明权限拦截生效。验证未登录状态不带AuthorizationHeader 直接访问http://localhost:8080/api/student/info返回{code:401,msg:Unauthorized}确认认证网关工作正常。4.3 常见 403/401 错误定位表错误码现象检查点快速修复401 Unauthorized未登录或 token 过期SecurityConfig中permitAll()是否遗漏登录接口JwtTokenUtil解析 token 时secret是否与生成时一致确认application.yml中jwt.secret值与JwtTokenUtil构造函数传入值完全相同403 Forbidden已登录但无权限数据库sys_user.role_id与sys_role.id是否匹配sys_role.role_name大小写是否与hasRole()参数一致执行SELECT u.username, r.role_name FROM sys_user u JOIN sys_role r ON u.role_idr.id WHERE u.usernameadmin;核对结果500 Internal Server Error后端抛异常StudentController.list()方法中studentService.list()是否空指针MyBatisStudentMapper.xml中 SQL 是否存在语法错误在StudentService的list()方法首行加log.info(list method invoked);确认是否进入方法体5. CSS 资源加载与 Vue 组件拆解从chunk-vendors.9650af1e.css到可定制的教务界面项目前端manage_code/src/assets/css/下的canvas-bg-1.css等文件与server_code/src/main/resources/manage/css/下的app.c6668e59.css等看似冗余实则是 Vue CLI 构建产物与 Spring Boot 静态资源路径的双重映射。理解这一机制才能真正修改首页背景、调整成绩表格样式而非仅停留在“能运行”。5.1 Vue CLI 构建产物 CSS 文件命名逻辑manage_code执行npm run build后dist/css/目录生成app.[hash].css主业务样式含src/views/下所有.vue单文件组件的style块chunk-vendors.[hash].css第三方 UI 库如 Element Plus样式57.[hash].css、563.[hash].css等路由懒加载组件的异步样式块对应router/index.js中component: () import(/views/teacher/CourseList.vue)。这些[hash]值由 Webpack 的contenthash生成内容变更则 hash 变确保浏览器缓存更新。因此若你修改了src/views/student/ScoreList.vue中的样式重新构建后57.[new_hash].css会变化旧文件仍保留在dist/css/中 —— 这就是为何生产环境需清理旧 CSS 文件避免缓存冲突。5.2 Spring Boot 静态资源路径映射原理server_code的application.yml中默认配置spring: web: resources: static-locations: classpath:/static/,classpath:/public/,classpath:/resources/,classpath:/META-INF/resources/当manage_code/dist/构建完成需将dist/整个目录复制到server_code/src/main/resources/static/下此时http://localhost:8080/→ 映射static/index.htmlhttp://localhost:8080/css/app.c6668e59.css→ 映射static/css/app.c6668e59.csshttp://localhost:8080/js/app.[hash].js→ 映射static/js/app.[hash].js。注意server_code/src/main/resources/manage/css/下的 CSS 文件是开发阶段供vue.config.js中devServer.proxy代理使用的占位文件实际运行时不被加载。真正生效的是static/目录下的构建产物。若你修改了manage_code/src/assets/css/canvas-bg-1.css必须重新npm run build并覆盖static/否则改动无效。5.3 定制首页 Canvas 背景的实操步骤项目首页/使用canvas-bg-1.css定义动态粒子背景。要更换为校徽图片背景将校徽图片logo.png放入manage_code/public/目录此目录文件会原样复制到dist/根目录修改manage_code/src/assets/css/canvas-bg-1.cssbody { /* 删除原有 canvas 相关样式 */ background: url(~/assets/img/logo.png) no-repeat center center fixed; background-size: contain; background-color: #f0f2f5; }在manage_code/src/main.js中注释掉import ./assets/css/canvas-bg-1.css改为// import ./assets/css/canvas-bg-1.css import ./assets/css/custom-bg.css // 新建 custom-bg.css 文件执行npm run build检查dist/下css/app.[hash].css是否包含新背景样式将dist/全部内容覆盖至server_code/src/main/resources/static/重启server_code访问http://localhost:8080首页即显示校徽背景。此过程印证所谓“可定制”本质是掌控 Vue 构建链路与 Spring Boot 静态资源映射的衔接点。每一次样式调整都是对现代前端工程化流程的一次微缩实践。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询