news 2026/8/29 4:15:44

基于SpringBoot和Vue的毕设系统架构解析:从技术选型到代码实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于SpringBoot和Vue的毕设系统架构解析:从技术选型到代码实现


背景痛点:毕设开发的三座“隐形大山”

做毕设时,很多同学把“能跑起来”当成唯一目标,结果在答辩前一周集体踩坑:

  1. 前后端混写:JSP 里嵌 Vue,Vue 里写 SQL,代码一耦合,改需求就“牵一发动全身”。
  2. 接口随意:URL 叫/login2/getData,状态码清一色 200,前端拿到 500 只能alert("报错"),老师一问“幂等性怎么保证”就集体沉默。
  3. 部署黑洞:Windows 上跑得好好的,上云就 404,静态资源 404、跨域 502,最后把 jar 包和 node_modules 一起塞进 FTP,服务器 1G 内存直接 OOM。

这些痛点的本质是“缺一套教学友好、又能平滑过渡到生产的脚手架”。下面这套 SpringBoot + Vue 的“最小可用骨架”,就是为此而生。

技术选型:为什么不是 SSM 与 React

维度SpringBoot vs SSMVue vs React
冷启动内嵌 Tomcat,一键启动CLI 开箱即用,模板语法近似 HTML
配置量零 XML,yml 即可单文件组件,样式作用域天然隔离
学习曲线注解驱动,无需整合 Struts双向绑定 + 选项式 API,学生可“猜”语法
生态对齐MyBatis-Plus、Knife4j 一键集成Element-Plus 与 Boot 配套脚手架最多

结论:SpringBoot 让“跑起来”成本最低,Vue 让“写出来”心智负担最小,两者组合是“教学—生产”梯度最平滑的栈。

核心实现细节

1. 项目骨架

back └─ src ├─ main │ ├─ java │ │ └─ com.example.demo │ │ ├─ config │ │ ├─ controller │ │ ├─ entity │ │ ├─ mapper │ │ ├─ service │ │ └─ DemoApplication.java │ └─ resources │ ├─ application.yml │ └─ mapper/*.xml front └─ src ├─ api ├─ router ├─ store └─ views

前后端彻底解耦,端口级联通过.env文件注入,方便 CI 时替换。

2. 统一响应封装

@Data public class R<T> { private int code; private String msg; private T data; public static <T> R<T> ok(T data){ return new R<>(200,"ok",data); } public static R<Void> fail(int code,String msg){ return new R<>(code,msg,null); } }

所有 Controller 返回R,前端拦截器只需判断code !== 200即可集中弹窗,降低心智负担。

3. JWT 鉴权 & 幂等性保证

登录接口:

@PostMapping("/login") public R<String> login(@RequestBody LoginDTO dto){ User user = service.lambdaQuery() .eq(User::getUsername,dto.getUsername()) .one(); if(user==null || !BCrypt.checkpw(dto.getPassword(),user.getPassword())){ return R.fail(401,"账号或密码错误"); } String token = Jwts.builder() .setSubject(user.getId().toString()) .setExpiration(new Date(System.currentTimeMillis()+EXPIRE)) .signWith(SignatureAlgorithm.HS512,SECRET) .compact(); return R.ok(token); }

Token 存入 Vuex,Axios 拦截器统一挂载:

service.interceptors.request.use(config=>{ config.headers['Authorization'] = 'Bearer ' + store.getters.token return config })

为防止重复提交,在 JWT payload 加入jti字段,后端用 RedisSETNX做幂等性校验,30 s 过期,既防重复,又避免长期占用内存。

4. MyBatis-Plus 通用 CRUD

@RestController @RequestMapping("/api/student") @PreAuthorize("hasRole('ADMIN')") public class StudentController { @Resource private StudentService service; @GetMapping("/page") public R<IPage<Student>> page(PageDTO dto){ LambdaQueryWrapper<Student> qw = Wrappers.lambdaQuery(); qw.like(StringUtils.isNotBlank(dto.getName()),Student::getName,dto.getName()); return R.ok(service.page(dto.toPage(),qw)); } }

前端直接传current & size,后端返回records & total,列表分页零 SQL。

5. 跨域与 OPTIONS 缓存

spring: mvc: cors: allowed-origins: "*" allowed-methods: "*" allowed-headers: "*" allow-credentials: true max-age: 3600

CORS 预检缓存 1 h,减少 50% 以上无效 OPTIONS 请求。

精简代码片段

后端:登录 + 密码加密

// UserService.java public void addUser(UserDTO dto){ User user = new User(); user.setUsername(dto.getUsername()); user.setPassword(BCrypt.hashpw(dto.getPassword(),BCrypt.gensalt())); save(user); }

前端:Vue3 组合式登录调用

// api/user.js export function login(data){ return request.post('/login',data) } // views/Login.vue const form = reactive({username:'',password:''}) async function handleLogin(){ const {data} = await login(form) store.commit('SET_TOKEN',data) router.push('/dashboard') }

Nginx 静态资源映射

location / { root /usr/share/nginx/html/dist; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:8080/; }

安全性 & 性能

  1. XSS:Vue 默认转义,后端富文本用 Jsoup 白名单过滤onerrorjavascript:等危险属性。
  2. SQL 注入:MyBatis-Plus 内置#{}预编译,拒绝${}拼接。
  3. 密码加密:BCrypt 10 轮盐值,彩虹表成本指数级上升。
  4. 接口缓存:对热点字典加Cacheable(key="#root.methodName"),配合 Spring Cache + Caffeine,QPS 提升 3 倍。
  5. 懒加载:Vue Router 动态import(()=>),首屏 chunk 减少 40%,3G 网络 2 s 内可交互。

生产环境避坑指南

  1. 数据库连接池:默认 HikariCP,max=10在 1C2G 学生机足够;云服务器 4C8G 可提到 30,并打开leakDetectionThreshold=60000揪出慢 SQL。
  2. 静态资源 404:SpringBoot 打包后jar里无webapp,前端必须走 Nginx,禁止spring.resources.static-locations指到file:绝对路径,否则重启即失效。
  3. 文件上传:Linux 默认/tmp7 天清理,上传目录改到/data/upload,并在application.yml显式声明spring.servlet.multipart.location
  4. 时区:容器镜像用openjdk:8-jre-alpine记得加-Duser.timezone=GMT+08,否则定时任务差 8 小时。
  5. 日志:使用logback-spring.xml按天归档,保留 30 天;学生机磁盘小,关闭console输出,只留file

可扩展方向

  • 加 Redis:把幂等 token、热点榜单缓存 5 min,压测 QPS 再翻一倍。
  • 上 WebSocket:通知模块用 STOMP,毕业答辩实时弹幕,老师印象分 +10。
  • 多模块拆分:将userfileorder拆成独立 SpringBoot 微服务,用 Nacos 注册,提前体验分布式。
  • 代码生成器:基于mybatis-plus-generator自定义模板,一键生成 DTO、VO、Converter,CURD 页面 5 分钟搞定。

模板已开源在 GitHub,欢迎提 PR 补充单元测试、Docker Compose 脚本,或者把 Element-Plus 换成 Ant Design Vue,给后来者多一条可选路径。毕设不是终点,把代码写成“别人愿意继续维护”的样子,才算真正毕业。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 15:07:10

开源考试平台零代码部署指南:多终端适配的智能在线考试系统解决方案

开源考试平台零代码部署指南&#xff1a;多终端适配的智能在线考试系统解决方案 【免费下载链接】xzs-mysql 学之思开源考试系统是一款 java vue 的前后端分离的考试系统。主要优点是开发、部署简单快捷、界面设计友好、代码结构清晰。支持web端和微信小程序&#xff0c;能覆盖…

作者头像 李华
网站建设 2026/8/28 18:43:25

ChatGPT在软件测试中的实战应用:从自动化测试到缺陷预测

背景痛点&#xff1a;传统测试的“三座大山” 用例维护像“打地鼠”。需求一改&#xff0c;上百条 Excel 用例就要人工对齐&#xff0c;漏改一条就可能把缺陷带到线上。边界场景靠“拍脑袋”。等价类、边界值分析全看测试同学经验&#xff0c;新人写出的用例常常漏掉 0、null、…

作者头像 李华
网站建设 2026/8/21 10:32:36

平价家具零售商Bob’s Discount Furniture纽交所上市:市值22亿美元

雷递网 雷建平 2月6日平价家具零售商Bobs Discount Furniture(简称&#xff1a;“股票代码&#xff1a;BOBS”&#xff09;昨日在纽交所上市。Bob’s Discount Furniture发行价为17美元&#xff0c;发行1945万股&#xff0c;募资3.3亿美元。Bobs Discount Furniture首席执行官比…

作者头像 李华
网站建设 2026/8/26 14:02:15

我如何用FastReport解决.NET报表开发的三大核心难题

我如何用FastReport解决.NET报表开发的三大核心难题 【免费下载链接】FastReport Free Open Source Reporting tool for .NET6/.NET Core/.NET Framework that helps your application generate document-like reports 项目地址: https://gitcode.com/gh_mirrors/fa/FastRepo…

作者头像 李华