当前位置: 首页 > news >正文

基于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,给后来者多一条可选路径。毕设不是终点,把代码写成“别人愿意继续维护”的样子,才算真正毕业。


http://www.jsqmd.com/news/352400/

相关文章:

  • 数字内容访问优化技术探索指南:提升信息获取效率的实践方法
  • 内容访问辅助工具:技术原理与合规使用指南
  • 突破网络内容访问限制:专业知识工作者的高效访问策略
  • 颠覆级暗黑2重制版自动化助手:从入门到精通的3分钟极速启动指南
  • 智能客服自动化测试实战:从零构建高效测试流水线
  • AI原生应用在边缘计算中的5大实战场景解析
  • 开源跨平台直播聚合工具:一站式多平台直播管理解决方案
  • 开源考试平台零代码部署指南:多终端适配的智能在线考试系统解决方案
  • 3个颠覆性技巧:用BackgroundRemover实现AI背景分离与视频编辑技巧
  • 2026年测力传感器公司权威推荐:微型测力传感器、桥式称重传感器、纽扣式测力传感器、轮辐式测力传感器、高精度测力传感器选择指南 - 优质品牌商家
  • 如何用vue-cropperjs解决90%的图片裁剪需求?
  • 车载大模型落地困局破局者(Dify边缘部署实测报告:延迟<86ms,资源占用仅147MB)
  • Auto_Simulated_Universe v8.042版本深度体验:智能游戏助手如何重塑自动化操作体验
  • 2026年热门的木皮烘干机用户口碑认可参考(高评价) - 品牌宣传支持者
  • 【ICLR26-鲁继文团队-清华大学】Astra:具有自回归去噪功能的通用交互式世界模型
  • 轻量级零依赖的Web项目进度可视化方案:如何用jsGantt-Improved实现前端任务调度
  • bypass-paywalls-chrome-clean深度测评:如何合法绕过付费内容限制
  • 2026年平面测力传感器公司权威推荐:微型测力传感器/微型称重传感器/微量程称重传感器/悬臂梁式称重传感器/拉压力测力传感器/选择指南 - 优质品牌商家
  • 解决vLLM安装卡在vllm-nccl-cu12依赖项的实战指南
  • Dism++规则库配置文件深度优化指南:提升系统清理效率的技术实践
  • Dify多租户计费引擎深度解耦(从硬编码到插件化):支持按Token/调用量/知识库规模的三级计量SDK开源实践
  • 计算机应用技术毕设免费源码:从选题到部署的完整技术实践指南
  • 终极解决Koikatsu Sunshine语言障碍!KKS-HF_Patch三步安装指南
  • Dify API成本失控警报:LLM token计费偏差达37.2%,精准计量+动态采样压缩的3层成本治理模型(含开源计量SDK)
  • 5个颠覆认知的网络内容访问突破方法:合法解锁受限信息
  • 轻量级Vue图片处理方案:如何用vue-cropperjs实现专业级图片裁剪?
  • 6种高效破解网页付费限制的实用方法:轻松获取付费内容访问权限
  • Vue图片处理前端组件:打造高效轻量的图片裁剪解决方案
  • 音频格式转换实战指南:Silk-V3-Decoder全平台解决方案
  • 4步实现数据血缘可视化:SQLFlow技术原理与实战指南