如果你正在为计算机专业的毕业设计选题发愁,或者想找一个能真正体现你全栈开发能力的实战项目来充实简历,那么这篇文章就是为你准备的。市面上很多“毕业设计项目”要么过于简单,像个玩具;要么文档不全,部署起来步步是坑。今天我们要拆解的,是一个基于SpringBoot + Vue前后端分离架构的家政服务平台项目。它不仅仅是一个“能跑起来”的Demo,更是一个涵盖了用户端、服务端、管理后台,并集成了权限管理、服务预约、订单支付、评价系统等核心业务模块的完整商业级应用雏形。
为什么这个项目值得你投入时间?因为它精准地踩中了几个关键点:第一,技术栈主流且实用,SpringBoot和Vue是当前企业招聘中最热门的组合之一;第二,业务场景真实,家政服务O2O模式逻辑清晰,能充分锻炼你的业务抽象和数据库设计能力;第三,架构清晰,前后端分离让你能深入理解RESTful API设计、跨域处理、状态管理等现代Web开发核心概念。
本文将带你从零开始,深入这个项目的每一个技术细节。我们不会只停留在“如何运行”,而是会剖析为什么这样设计,开发中会遇到哪些典型问题,以及如何将其优化得更像生产级项目。无论你是即将面临毕设的在校生,还是希望积累一个完整项目经验的初学者,这篇文章都将是一份详尽的实战指南。
1. 项目全景与核心价值:不止于“跑通”
在开始敲代码之前,我们首先要搞清楚这个家政服务平台项目的全貌和它真正的学习价值。很多同学拿到项目源码后,只关心“怎么配置数据库、怎么启动”,却忽略了项目背后的设计思想和可扩展性,这无异于买椟还珠。
1.1 项目业务模块拆解
一个完整的家政服务平台通常包含以下核心模块:
- 用户端(小程序/H5):用户注册登录、浏览服务、预约下单、支付、查看订单、发表评价。
- 服务端(后端API):提供所有业务逻辑的RESTful API接口,处理数据持久化、事务、安全认证等。
- 管理后台(Web):管理员审核家政人员、管理服务项目、处理订单、查看统计报表。
- 家政人员端(可选):接单、更新服务状态、查看收入。
我们的项目主要聚焦于用户端、服务端和管理后台的实现,这是大多数毕业设计的合理范围。业务流的核心是:用户浏览服务 -> 选择服务并预约 -> 生成订单 -> 支付(或线下)-> 服务完成 -> 双方评价。
1.2 技术栈选型解析
- 后端:SpringBoot 2.x + MyBatis-Plus + MySQL
- SpringBoot:提供了极简的配置和快速启动能力,是Java后端微服务的事实标准。
- MyBatis-Plus:在MyBatis基础上增强了单表CRUD操作,极大提升开发效率,同时保留了自定义SQL的灵活性。
- MySQL:关系型数据库,业务数据存储的最佳选择。
- 前端:Vue 2.x/3.x + Element UI + Axios
- Vue:渐进式JavaScript框架,组件化开发体验优秀,学习曲线平缓。
- Element UI:基于Vue的桌面端组件库,能快速搭建出美观且交互一致的管理后台界面。
- Axios:基于Promise的HTTP客户端,用于前后端数据交互。
- 关键中间件与工具:
- JWT:用于无状态的用户认证与授权,替代传统的Session。
- Redis:缓存热点数据(如服务分类)、存储短信验证码、会话信息等。
- Maven/Gradle:项目构建与依赖管理。
这个技术栈组合的价值在于:它是一套非常“抗打”的求职组合拳。掌握了它,你不仅能完成毕设,更能应对大多数中小型互联网公司Java后端或全栈开发的面试要求。
1.3 前后端分离架构的优势与挑战
优势:
- 职责清晰:后端专注数据和业务逻辑,前端专注交互和展示。
- 并行开发:前后端约定好API接口后,可以同时进行开发。
- 技术栈灵活:后端可以替换为其他语言框架,前端可以适配多种终端(Web、小程序、App)。
- 易于扩展:后端可以方便地演进为微服务架构。
挑战(也是本文重点要解决的):
- 跨域问题:浏览器安全策略导致前端无法直接访问不同源的API。
- 接口联调:需要清晰、稳定的API文档。
- 认证与授权:在无状态的HTTP协议下,如何安全地管理用户登录状态和权限。
- 部署复杂度:需要分别部署前端和后端服务。
理解了这些,我们就知道接下来的每一步操作是为了解决什么问题,而不仅仅是机械地复制命令。
2. 开发环境准备:搭建你的“作战平台”
工欲善其事,必先利其器。一个稳定、高效的开发环境是项目成功的基础。请确保你的电脑上已经安装了以下软件,并配置好相应环境变量。
2.1 后端环境准备
- JDK 8/11/17:推荐使用JDK 11或17(LTS长期支持版本)。安装后,在命令行输入
java -version和javac -version验证。 - Maven 3.6+:用于管理项目依赖、构建和打包。安装后,运行
mvn -v验证。 - IntelliJ IDEA(推荐)或 Eclipse:强大的Java IDE。社区版即可满足开发需求。
- MySQL 5.7/8.0:安装MySQL数据库,并记住root密码。建议使用图形化工具如Navicat、MySQL Workbench或DBeaver来管理数据库。
- Redis(可选但推荐):用于缓存和会话管理。可以从官网下载安装,或使用Docker快速启动。
2.2 前端环境准备
- Node.js 14+/16+:前端项目的运行环境,自带npm包管理器。安装后,运行
node -v和npm -v验证。 - Vue CLI:Vue项目的官方脚手架工具。通过npm全局安装:
安装后,运行npm install -g @vue/cli # 或使用 yarn # yarn global add @vue/clivue --version验证。 - 代码编辑器:Visual Studio Code是前端开发的首选,轻量且插件生态丰富。
2.3 初始化项目结构(关键步骤)
通常,你拿到的项目源码是一个压缩包。解压后,你会看到类似如下的目录结构:
homemaking-platform/ ├── backend/ # SpringBoot后端项目 │ ├── src/ │ ├── pom.xml │ └── ... ├── frontend/ # Vue前端项目 │ ├── public/ │ ├── src/ │ ├── package.json │ └── ... └── database/ # 数据库SQL脚本 └── homemaking.sql第一步,永远先看README.md文件(如果有的话)。里面通常包含了最关键的配置说明和启动步骤。
3. 后端项目启动与核心配置详解
让我们从后端开始,这是整个系统的大脑。我们将一步步配置并启动SpringBoot服务。
3.1 数据库初始化
- 使用你的MySQL客户端(如Navicat)连接数据库。
- 创建一个新的数据库,字符集建议使用
utf8mb4,排序规则utf8mb4_general_ci,以支持完整的UTF-8字符(如Emoji)。CREATE DATABASE IF NOT EXISTS `homemaking_db` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; - 运行项目提供的SQL脚本(通常是
database/homemaking.sql),初始化数据表结构和基础数据(如管理员账号、服务分类等)。# 在MySQL命令行中执行 mysql -u root -p homemaking_db < /path/to/homemaking.sql
3.2 使用IDEA导入并配置后端项目
- 打开IntelliJ IDEA,选择
File -> Open,找到并选择backend文件夹下的pom.xml文件,以Maven项目形式打开。 - IDEA会自动下载所有依赖(
pom.xml中定义的jar包)。这个过程取决于网络速度,请耐心等待。 - 关键配置:修改
application.yml或application.properties。 这是SpringBoot的核心配置文件。你需要修改数据库连接信息和Redis配置(如果用到)。
注意:# src/main/resources/application.yml server: port: 8080 # 后端服务启动端口 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/homemaking_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai username: root # 你的数据库用户名 password: your_password # 你的数据库密码 redis: host: localhost # 如果未安装Redis,可以暂时注释掉这部分配置 port: 6379 database: 0 jackson: time-zone: GMT+8 # 设置JSON返回的时间时区 # MyBatis-Plus 配置 mybatis-plus: mapper-locations: classpath:mapper/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开发环境开启SQL日志,生产环境关闭 global-config: db-config: logic-delete-field: deleted # 全局逻辑删除字段名 logic-delete-value: 1 # 逻辑已删除值 logic-not-delete-value: 0 # 逻辑未删除值 # JWT配置 jwt: secret: your_jwt_secret_key_here_make_it_long_and_complex # 用于签名Token的密钥,务必修改并保密 expire: 604800 # Token过期时间(秒),例如7天=604800秒 header: Authorization # 前端传递Token的请求头名称your_password和your_jwt_secret_key_here_make_it_long_and_complex必须替换为你自己的值。一个弱的JWT密钥是严重的安全隐患。
3.3 启动后端服务并验证
- 找到项目的主启动类,通常命名为
XxxApplication.java(例如HomemakingApplication.java),其类上会有@SpringBootApplication注解。 - 右键点击这个类,选择
Run 'HomemakingApplication'。 - 观察控制台日志。如果看到类似以下的输出,说明启动成功:
Started HomemakingApplication in 5.632 seconds (JVM running for 6.215) Tomcat started on port(s): 8080 (http) with context path '' - 验证API是否可用:打开浏览器或使用Postman等API测试工具,访问
http://localhost:8080/。如果项目配置了简单的欢迎页或健康检查接口(如/actuator/health),能收到响应即表示后端服务运行正常。
4. 前端项目启动与跨域联调
后端跑起来后,我们来让前端“活”起来,并解决前后端通信的第一个拦路虎——跨域。
4.1 安装依赖并启动前端服务
- 在终端或VS Code中,进入
frontend目录。 - 运行以下命令安装项目依赖(
package.json中定义的npm包):npm install # 如果网络较慢,可以使用淘宝镜像:npm install --registry=https://registry.npmmirror.com - 依赖安装完成后,启动开发服务器:
成功启动后,终端会显示类似信息:npm run serveApp running at: - Local: http://localhost:8081/ - Network: http://192.168.1.100:8081/
4.2 配置前端API代理,解决跨域问题
在开发阶段,前端运行在localhost:8081,后端运行在localhost:8080,端口不同,属于跨域请求,浏览器会阻止。Vue CLI提供了便捷的代理配置来解决此问题。
在frontend目录下找到或创建vue.config.js文件,添加以下配置:
// frontend/vue.config.js module.exports = { devServer: { port: 8081, // 前端开发服务器端口 proxy: { // 代理所有以 `/api` 开头的请求 '/api': { target: 'http://localhost:8080', // 后端API地址 changeOrigin: true, // 改变请求头中的host为目标地址的host pathRewrite: { '^/api': '' // 重写路径,去掉请求路径中的 `/api` 前缀 } } } } }配置原理:当前端请求/api/user/login时,开发服务器会将其代理到http://localhost:8080/user/login。这样,浏览器认为请求是同源的(都来自localhost:8081),而实际数据来自后端。
4.3 修改前端API基础地址
在前端项目的源代码中(通常在src/utils/request.js或src/api/axios.js文件中),会有一个Axios实例的创建和配置。你需要确保其baseURL与代理配置匹配。
// src/utils/request.js import axios from 'axios' // 创建axios实例 const service = axios.create({ baseURL: '/api', // 开发环境,使用代理前缀 // baseURL: 'http://your-domain.com:8080', // 生产环境,替换为实际后端地址 timeout: 10000 // 请求超时时间 }) // ... 后续可能还有请求拦截器、响应拦截器等配置4.4 验证前后端连通性
- 确保后端 (
localhost:8080) 和前端 (localhost:8081) 服务都在运行。 - 打开浏览器,访问
http://localhost:8081。 - 打开浏览器的开发者工具(F12),切换到
Network标签页。 - 在页面中进行一个操作,比如点击登录按钮。观察网络请求,应该能看到一个向
http://localhost:8081/api/...发起的请求,并且状态码为200(成功)或相应的业务状态码。这证明前后端联调成功。
5. 核心业务模块代码剖析
理解了如何运行,我们深入代码,看看核心业务是如何实现的。这里以用户登录和服务预约两个典型流程为例。
5.1 用户登录与JWT认证流程
后端实现 (AuthController.java):
// src/main/java/com/homemaking/controller/AuthController.java @RestController @RequestMapping("/api/auth") public class AuthController { @Autowired private UserService userService; @Autowired private JwtTokenUtil jwtTokenUtil; @PostMapping("/login") public Result login(@RequestBody LoginRequest request) { // 1. 参数校验 if (StringUtils.isEmpty(request.getUsername()) || StringUtils.isEmpty(request.getPassword())) { return Result.error("用户名或密码不能为空"); } // 2. 查询用户 User user = userService.findByUsername(request.getUsername()); if (user == null) { return Result.error("用户不存在"); } // 3. 验证密码 (实际项目中密码应加密存储,如BCrypt) if (!user.getPassword().equals(request.getPassword())) { // 这里仅为示例,生产环境必须用加密比对 return Result.error("密码错误"); } // 4. 生成JWT Token String token = jwtTokenUtil.generateToken(user); // 5. 构造返回数据,隐藏敏感信息 LoginResponse response = new LoginResponse(); response.setUserId(user.getId()); response.setUsername(user.getUsername()); response.setNickname(user.getNickname()); response.setRole(user.getRole()); // 用户角色,如:USER, ADMIN response.setToken(token); return Result.success("登录成功", response); } }JWT工具类 (JwtTokenUtil.java):
// src/main/java/com/homemaking/utils/JwtTokenUtil.java @Component public class JwtTokenUtil { @Value("${jwt.secret}") private String secret; @Value("${jwt.expire}") private Long expiration; // 生成Token public String generateToken(User user) { Map<String, Object> claims = new HashMap<>(); claims.put("sub", user.getUsername()); claims.put("userId", user.getId()); claims.put("role", user.getRole()); claims.put("created", new Date()); return Jwts.builder() .setClaims(claims) .setExpiration(new Date(System.currentTimeMillis() + expiration * 1000)) .signWith(SignatureAlgorithm.HS512, secret) .compact(); } // 验证并解析Token public Claims getClaimsFromToken(String token) { return Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) .getBody(); } // ... 其他方法:验证Token是否过期、刷新Token等 }前端登录请求 (login.vue):
// src/views/Login.vue (部分代码) <script> import { login } from '@/api/user' export default { data() { return { form: { username: '', password: '' } } }, methods: { handleLogin() { this.$refs.form.validate(valid => { if (valid) { // 调用登录API login(this.form).then(response => { const { data } = response // 1. 将Token存储到本地存储 (localStorage) 或 Vuex localStorage.setItem('token', data.token) localStorage.setItem('userInfo', JSON.stringify(data)) // 2. 将Token设置到Axios请求头,后续请求自动携带 this.$axios.defaults.headers.common['Authorization'] = 'Bearer ' + data.token // 3. 登录成功,跳转到首页 this.$router.push('/') this.$message.success('登录成功') }).catch(error => { this.$message.error(error.message || '登录失败') }) } }) } } } </script>5.2 服务预约与订单生成流程
这个流程涉及多张表(用户、服务、订单、订单明细)和事务管理。实体类关系简化:
User(用户)Service(家政服务项目)Order(订单主表)OrderItem(订单明细,关联服务)
服务层核心代码 (OrderServiceImpl.java):
// src/main/java/com/homemaking/service/impl/OrderServiceImpl.java @Service @Transactional // 声明式事务管理,确保以下操作要么全部成功,要么全部回滚 public class OrderServiceImpl implements OrderService { @Autowired private OrderMapper orderMapper; @Autowired private ServiceMapper serviceMapper; @Autowired private OrderItemMapper orderItemMapper; @Override public Order createOrder(OrderRequest orderRequest, Long userId) { // 1. 参数校验(略) // 2. 计算总价、验证服务库存等(略) BigDecimal totalAmount = BigDecimal.ZERO; List<OrderItem> itemList = new ArrayList<>(); for (OrderItemRequest itemReq : orderRequest.getItems()) { Service service = serviceMapper.selectById(itemReq.getServiceId()); if (service == null || service.getStatus() != 1) { throw new BusinessException("服务不存在或已下架"); } // 计算单项总价 BigDecimal itemTotal = service.getPrice().multiply(new BigDecimal(itemReq.getQuantity())); totalAmount = totalAmount.add(itemTotal); OrderItem orderItem = new OrderItem(); orderItem.setServiceId(service.getId()); orderItem.setServiceName(service.getName()); orderItem.setPrice(service.getPrice()); orderItem.setQuantity(itemReq.getQuantity()); orderItem.setSubtotal(itemTotal); itemList.add(orderItem); } // 3. 生成订单号(雪花算法等) String orderNo = generateOrderNo(); // 4. 创建订单主记录 Order order = new Order(); order.setOrderNo(orderNo); order.setUserId(userId); order.setTotalAmount(totalAmount); order.setStatus(OrderStatus.UNPAID.getCode()); // 初始状态:待支付 order.setAddress(orderRequest.getAddress()); order.setAppointmentTime(orderRequest.getAppointmentTime()); orderMapper.insert(order); // 插入后,MyBatis-Plus会自动回填主键id // 5. 批量插入订单明细,并关联订单ID for (OrderItem item : itemList) { item.setOrderId(order.getId()); orderItemMapper.insert(item); } // 6. (可选)扣减服务库存等后续操作 // ... return order; } }关键点:@Transactional注解确保了在创建订单的过程中,如果插入订单明细失败,订单主记录的插入也会被回滚,保证了数据的一致性。
6. 项目运行与功能测试
当前后端都成功启动后,你需要系统地测试核心功能,确保项目按预期工作。
6.1 测试流程清单
- 用户模块:
- 注册新用户。
- 使用新用户登录。
- 查看/修改个人资料。
- 服务模块:
- 在前端浏览服务分类和列表。
- 查看服务详情(价格、描述、评价)。
- 订单模块:
- 将服务加入“购物车”或直接预约。
- 填写预约信息(时间、地址、备注)。
- 提交订单,生成待支付订单。
- 在“我的订单”页面查看订单列表和详情。
- 管理后台模块:
- 使用管理员账号登录后台(通常有一个独立的登录入口,如
/admin)。 - 管理用户列表。
- 上架/下架家政服务。
- 查看和处理所有订单。
- 使用管理员账号登录后台(通常有一个独立的登录入口,如
6.2 使用Postman进行API接口测试
除了前端界面测试,直接测试后端API是排查问题的有效手段。
- 打开Postman,创建一个新的
POST请求。 - URL填写:
http://localhost:8080/api/auth/login - 在
Body标签下选择raw和JSON,输入:{ "username": "testuser", "password": "123456" } - 点击
Send。如果成功,你将在响应体(Response Body)中看到包含token和用户信息的JSON数据。 - 测试需要认证的接口(如创建订单):在
Headers标签中添加一个键值对:Authorization: Bearer <你的token>。
7. 常见问题与深度排查指南
在部署和运行过程中,你几乎一定会遇到下面这些问题。这里提供了系统的排查思路。
7.1 后端启动失败类问题
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
APPLICATION FAILED TO START | 1. 数据库连接失败 2. 端口被占用 3. 依赖冲突 | 1. 检查控制台错误日志,通常有详细描述。 2. 运行 netstat -ano | findstr :8080(Windows) 或lsof -i:8080(Mac/Linux) 查看端口占用。3. 检查 pom.xml依赖版本。 | 1. 核对application.yml中的数据库URL、用户名、密码。2. 杀死占用端口的进程,或修改 server.port。3. 使用 mvn dependency:tree查看依赖树,排除冲突。 |
Field xxxService in XxxController required a bean of type... | Spring容器未找到对应的Bean。可能是: 1. 忘记加 @Service/@Component注解。2. 包扫描路径不对。 | 1. 检查Service实现类是否有@Service注解。2. 检查主启动类 @SpringBootApplication的包位置,确保它能扫描到你的组件。 | 1. 为类添加正确的注解。 2. 在主启动类上使用 @ComponentScan指定扫描路径。 |
Table 'homemaking_db.xxx' doesn't exist | 数据库表不存在。 | 1. 确认是否执行了SQL初始化脚本。 2. 确认连接的数据库名是否正确。 | 1. 执行提供的SQL脚本。 2. 检查 application.yml中的spring.datasource.url。 |
7.2 前端启动与联调类问题
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
npm install失败,网络错误 | npm源访问慢或被墙。 | 查看错误信息是否包含ETIMEDOUT,ECONNRESET等。 | 切换为国内镜像源:npm config set registry https://registry.npmmirror.com |
npm run serve失败,依赖缺失 | node_modules安装不完整或版本冲突。 | 删除node_modules文件夹和package-lock.json,重新npm install。 | 1. 删除node_modules和package-lock.json。2. 运行 npm cache clean --force。3. 重新 npm install。 |
| 前端页面能打开,但所有API请求都404 | 1. 后端服务未启动。 2. 前端代理配置错误。 3. API路径错误。 | 1. 检查后端控制台是否运行。 2. 检查浏览器Network请求的URL,是否指向了正确的代理路径(如 /api/xxx)。3. 直接访问后端完整URL(如 http://localhost:8080/user/login)测试。 | 1. 启动后端服务。 2. 核对 vue.config.js中的proxy配置。3. 核对前端请求代码中的 baseURL或完整路径。 |
请求返回401 Unauthorized或403 Forbidden | 1. 未登录或Token过期。 2. Token未正确携带。 3. 用户权限不足。 | 1. 检查浏览器Application/Local Storage中是否有token。2. 检查Network请求头中是否有 Authorization: Bearer <token>。3. 查看后端接口的权限注解(如 @PreAuthorize("hasRole('ADMIN')"))。 | 1. 重新登录获取新Token。 2. 在前端请求拦截器中确保Token被正确设置。 3. 使用有足够权限的账号访问。 |
7.3 数据库与业务逻辑类问题
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 中文数据乱码 | 数据库、连接、程序编码不统一。 | 1. 查看数据库、表、字段的字符集。 2. 查看JDBC连接URL参数。 | 1. 确保数据库、表、字段字符集为utf8mb4。2. JDBC URL中添加 characterEncoding=utf-8。 |
| 日期时间显示错误 | 时区问题。 | 查看数据库存储的时间、Java程序处理的时间、JSON返回的时间。 | 1. 数据库连接URL添加serverTimezone=Asia/Shanghai。2. SpringBoot配置 spring.jackson.time-zone=GMT+8。 |
| 事务未回滚 | @Transactional未生效。 | 1. 检查方法是否是public。2. 检查异常是否被捕获未抛出。 3. 检查是否在同一个类内部调用。 | 1. 确保事务方法为public。2. 确保异常抛出到方法外,或手动 throw new RuntimeException()。3. 从其他Bean调用该方法。 |
8. 从“能运行”到“好项目”:最佳实践与进阶优化
一个优秀的毕业设计不应该仅仅停留在功能实现。以下优化方向能让你的项目脱颖而出,更贴近企业级开发标准。
8.1 代码结构与规范
- 统一响应格式:创建一个通用的
Result类,封装code、message、data,使所有API返回格式一致。 - 全局异常处理:使用
@ControllerAdvice和@ExceptionHandler捕获并处理各类异常(业务异常、参数校验异常、系统异常),返回友好的错误信息,而不是堆栈跟踪。 - 参数校验:在Controller层使用
@Validated注解和JSR-303校验注解(如@NotBlank,@Email,@Size)对入参进行校验,避免脏数据进入业务层。 - 日志规范:使用SLF4J+Logback,合理使用
DEBUG,INFO,WARN,ERROR级别记录日志。关键业务节点、异常处必须打日志。
8.2 安全加固
- 密码加密存储:绝对不要明文存储密码!使用
BCryptPasswordEncoder进行哈希加盐存储。// 在配置类中注入Bean @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } // 在保存用户时加密 user.setPassword(passwordEncoder.encode(rawPassword)); // 在登录时比对 passwordEncoder.matches(rawPassword, storedEncodedPassword); - SQL注入防护:坚持使用MyBatis的
#{}预编译占位符,严禁在动态SQL中拼接用户输入。 - XSS防护:对用户提交的富文本内容进行过滤(如使用Jsoup库),或在前端展示时进行转义。
- API接口限流与防刷:对登录、短信验证码等接口进行频率限制,可以使用Guava RateLimiter或Spring Boot Actuator。
8.3 性能与体验优化
- 引入缓存:将不常变但频繁访问的数据(如服务分类、城市列表)存入Redis,减轻数据库压力。
- 数据库索引优化:为订单表的
user_id、status、create_time,服务表的category_id、status等查询条件字段添加索引。 - 前端路由懒加载:在Vue Router中配置组件懒加载,提升首屏打开速度。
// router/index.js const Home = () => import('@/views/Home.vue') - 图片等静态资源上传OSS:不要将用户上传的图片保存到服务器本地,应使用阿里云OSS、腾讯云COS等对象存储服务。
8.4 部署上线(简易版)
毕业设计答辩通常需要演示,一个在公网可访问的演示地址是巨大的加分项。
- 购买云服务器:选择阿里云、腾讯云的学生机,成本很低。
- 环境安装:在服务器上安装JDK、MySQL、Redis、Nginx。
- 后端打包:在项目根目录执行
mvn clean package -DskipTests,在target目录下生成xxx.jar文件。 - 前端打包:执行
npm run build,生成dist静态文件目录。 - 部署:
- 将
jar包上传到服务器,使用nohup java -jar xxx.jar &后台运行。 - 将
dist目录下的文件上传到服务器,配置Nginx将请求代理到前端静态文件和后端Java服务。
# Nginx 配置示例片段 server { listen 80; server_name your-domain.com; # 你的域名或服务器IP # 前端静态文件 location / { root /path/to/your/frontend/dist; try_files $uri $uri/ /index.html; } # 后端API代理 location /api/ { proxy_pass http://localhost:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } - 将
通过以上步骤,你不仅拥有了一个可以运行的毕业设计项目,更理解了一个现代Web应用从开发到部署的完整生命周期。这个基于SpringBoot和Vue的家政服务平台项目,完全可以作为你求职简历上的一个亮眼作品。记住,在答辩时,不仅要演示功能,更要清晰地阐述你的技术选型理由、架构设计思路、遇到的问题及解决方案,这才能体现你的思考和能力。