1. 项目概述
这个基于SpringBoot+Vue的宠物一站式服务平台,是我去年带队完成的一个计算机专业毕业设计项目。作为一个完整的全栈系统,它整合了宠物领养、商城购物、社区交流等核心功能模块,采用前后端分离架构实现。不同于简单的课程作业,这个项目从需求分析到上线部署共耗时4个月,期间我们踩过不少坑,也积累了大量实战经验。
系统最核心的价值在于解决了传统宠物服务中的三个痛点:一是领养流程不透明,二是商品购买渠道分散,三是养宠知识获取困难。我们通过数字化手段将这三个场景整合到一个平台中,用户可以在一个应用内完成从领养到后续养护的全流程操作。
技术选型方面,后端采用SpringBoot 2.7 + MyBatis Plus的组合,前端使用Vue 3 + Element Plus。这种技术栈的选择主要基于三点考虑:首先,SpringBoot的自动配置特性大幅简化了后端开发复杂度;其次,Vue的响应式特性非常适合构建交互复杂的单页应用;最后,这两个框架都有丰富的社区支持,遇到问题容易找到解决方案。
2. 系统架构设计
2.1 整体架构解析
系统采用经典的三层架构设计,分为表现层、业务逻辑层和数据访问层。表现层包含Web前端和管理后台两个部分,都通过RESTful API与后端交互。业务逻辑层采用领域驱动设计(DDD)思想,将核心业务划分为领养、商城、社区三个子域。
数据库设计上,我们使用MySQL 8.0作为主数据库,Redis 6.2用于缓存和会话管理。考虑到宠物图片等非结构化数据的存储,额外引入了MinIO对象存储服务。这种混合存储方案在保证性能的同时,也控制了成本。
提示:在毕业设计项目中,建议使用Docker容器化部署数据库服务,这样既方便环境统一,又能在答辩演示时快速重建环境。
2.2 技术栈深度解析
后端技术栈的核心是SpringBoot框架,我们特别利用了以下特性:
- 自动配置:通过spring-boot-starter-web等starter简化依赖管理
- Actuator端点:用于系统监控和健康检查
- 条件化Bean:根据不同环境加载不同配置
- AOP支持:统一处理日志和权限校验
前端技术栈选择了Vue 3的组合式API写法,相比选项式API更利于逻辑复用。主要使用的技术包括:
- Vue Router:实现前端路由和权限控制
- Pinia:状态管理,替代传统的Vuex
- Axios:封装HTTP请求,统一处理错误
- Element Plus:提供丰富的UI组件
3. 核心功能实现
3.1 宠物领养模块
领养模块是整个系统的核心,其业务流程包括:宠物信息发布→领养申请→审核→签订电子协议→后续跟进。我们实现了完整的线上领养流程,关键点在于:
-
宠物信息管理:采用富文本编辑器(CKEditor 5)处理宠物详情描述,支持图片、视频等多媒体的上传和展示。后端使用MinIO存储这些文件,数据库只保存引用地址。
-
领养申请流程:采用状态机模式管理申请状态流转。定义了一个枚举类包含所有可能的状态:
java复制public enum AdoptionStatus {
PENDING, // 待审核
INTERVIEW, // 面试中
APPROVED, // 已批准
REJECTED, // 已拒绝
COMPLETED // 已完成
}
- 电子协议签署:集成第三方电子签名服务(我们使用了模拟实现),生成具有法律效力的领养协议。协议模板使用Freemarker动态渲染,关键条款可配置。
3.2 宠物商城模块
商城模块实现了完整的电商功能链:商品管理→购物车→订单→支付→物流跟踪。几个关键技术实现:
-
商品SKU系统:采用组合模式设计SKU数据结构,支持不同属性的组合定价。例如宠物食品可以根据重量、口味等属性生成不同SKU。
-
购物车优化:使用Redis缓存购物车数据,采用Hash结构存储用户ID与商品信息的映射。相比直接使用数据库,性能提升约15倍。
-
支付对接:封装了支付宝和微信支付的SDK,提供统一的支付接口。支付结果通过异步通知处理,解决了网络抖动导致的状态不一致问题。
3.3 社区互动模块
社区模块包含论坛、知识库和即时通讯三个子功能。技术难点主要在于:
-
实时通讯:使用SpringBoot整合WebSocket实现简单的即时通讯功能。为支持集群部署,额外引入了STOMP协议和RabbitMQ作为消息代理。
-
内容审核:对接阿里云内容安全API,自动过滤敏感词和违规图片。同时实现了人工复审工作流,确保UGC内容合规。
-
搜索引擎:基于Elasticsearch构建了宠物知识库的全文检索功能,支持同义词扩展和拼音搜索,大幅提升搜索体验。
4. 前后端协作实践
4.1 API设计规范
我们制定了严格的RESTful API规范,主要包含以下要点:
- 资源命名使用复数形式,如
/api/pets - 使用HTTP动词表示操作类型(GET/POST/PUT/DELETE)
- 状态码遵循标准语义,如200表示成功,400表示客户端错误
- 响应体统一包装,包含code、message和data三个字段
一个典型的响应示例:
json复制{
"code": 200,
"message": "success",
"data": {
"id": 123,
"name": "布偶猫"
}
}
4.2 跨域与安全方案
前后端分离项目必须解决跨域问题。我们的方案是:
- 后端配置CORS,只允许指定来源的请求
- 使用Spring Security实现基于JWT的身份认证
- 敏感接口额外验证CSRF Token
- 密码等敏感字段使用BCrypt加密存储
安全配置的核心代码片段:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and().csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()));
}
}
4.3 文件上传方案
系统中有大量图片上传需求,我们实现了分片上传和断点续传功能。前端使用el-upload组件,后端接口设计要点:
- 预检查:上传前校验文件类型和大小
- 分片上传:将大文件分割为2MB的块
- 合并处理:所有分片上传完成后合并为完整文件
- 进度反馈:通过WebSocket实时推送上传进度
5. 部署与性能优化
5.1 容器化部署方案
项目使用Docker Compose编排服务,包含以下容器:
- 前端:Nginx镜像托管Vue静态资源
- 后端:基于OpenJDK镜像构建SpringBoot应用
- MySQL:官方镜像,挂载数据卷持久化
- Redis:用作缓存和会话存储
- MinIO:对象存储服务
docker-compose.yml关键配置:
yaml复制services:
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
frontend:
build: ./frontend
ports:
- "80:80"
5.2 性能调优经验
在压力测试阶段我们发现并解决了几个性能瓶颈:
-
数据库查询优化:
- 为高频查询字段添加索引
- 使用JOIN替代多次单表查询
- 引入MyBatis二级缓存
-
接口响应优化:
- 启用Gzip压缩
- 分页查询默认每页10条记录
- 耗时操作改为异步处理
-
前端性能提升:
- 路由懒加载
- 组件按需引入
- 图片懒加载和WebP格式转换
6. 毕业设计特别建议
基于这个项目的开发经验,给计算机专业毕业设计的同学几点建议:
-
需求分析阶段一定要做充分,我们最初因为需求不明确导致后期多次返工。建议使用原型工具(如Axure)先画出界面流程。
-
技术选型不要盲目求新,稳定性和社区支持更重要。我们曾尝试用新技术解决某个问题,结果因为资料太少耽误了一周时间。
-
代码规范要统一,我们前期没定规范,后期合并代码时风格混乱。建议使用Checkstyle和Prettier等工具强制规范。
-
文档同样重要,包括技术文档和用户手册。我们使用Swagger生成API文档,用GitBook编写使用说明,这在答辩时加分不少。
-
测试环节不能省略,我们建立了完整的测试套件:单元测试(JUnit)、接口测试(Postman)、UI测试(Cypress)。这大大减少了线上bug。
