1. 项目背景与核心价值
去年帮学弟调试毕业设计时,发现市面上很多所谓的"完整项目"都存在致命缺陷:要么前端用着过时的jQuery,要么后端连基本的RESTful规范都没遵循。这个基于SpringBoot+Vue的宠物用品商城项目,是我带过三届毕业生后沉淀下来的企业级解决方案,包含电商系统必备的六大核心模块:
- 多级分类商品系统(支持SKU属性联动)
- JWT+RBAC权限管理体系
- 支付宝沙箱支付集成
- 基于WebSocket的客服系统
- 高性能商品搜索(Elasticsearch可选)
- 数据可视化看板(Echarts实现)
关键区别:本项目使用Vue3+Composition API编写前端,相比Options API更符合现代前端开发趋势。后端采用SpringBoot 2.7+MyBatis Plus组合,避免了原生MyBatis的样板代码问题。
2. 技术栈深度解析
2.1 后端架构设计
SpringBoot部分采用经典三层架构,但做了重要优化:
java复制// 传统Controller写法
@PostMapping("/add")
public Result add(@RequestBody Product product) {
return productService.save(product)
? Result.success() : Result.fail();
}
// 本项目改进版(使用MyBatis Plus的Lambda写法)
@PostMapping
public Result<Boolean> add(@Valid @RequestBody ProductDTO dto) {
return Result.status(productService.lambdaSave(dto));
}
数据库设计有三大亮点:
- 商品表采用SPU+SKU分离设计
- 订单表包含冗余字段提升查询性能
- 使用全局ID生成器替代数据库自增ID
2.2 前端工程化实践
Vue3项目配置了这些关键插件:
bash复制# 开发依赖
npm install -D @vitejs/plugin-vue unplugin-auto-import pinia-plugin-persistedstate
# 生产依赖
npm install vue-router@4 axios mitt @element-plus/icons-vue
特别说明:项目使用Vite代替Webpack作为构建工具,启动速度提升70%以上。已在vue.config.js中配置了这些优化项:
javascript复制export default defineConfig({
plugins: [
vue(),
AutoImport({
imports: ['vue', 'vue-router']
})
],
build: {
chunkSizeWarningLimit: 1500,
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes('node_modules')) {
return 'vendor'
}
}
}
}
}
})
3. 核心业务实现
3.1 商品模块关键技术
商品详情页面临的两个性能瓶颈及解决方案:
- 图片加载优化:
- 使用OSS存储图片
- 前端实现懒加载
vue复制<template>
<img v-lazy="imgUrl" alt="商品图片">
</template>
<script setup>
import { useLazyload } from '@vueuse/core'
</script>
- 库存校验方案:
java复制// 错误的做法(存在超卖风险)
@Transactional
public boolean deductStock(Long skuId, Integer num) {
Product product = productMapper.selectById(skuId);
if (product.getStock() >= num) {
product.setStock(product.getStock() - num);
return productMapper.updateById(product) > 0;
}
return false;
}
// 正确的CAS方案
@Transactional
public boolean safeDeductStock(Long skuId, Integer num) {
int rows = productMapper.updateStock(skuId, num);
return rows > 0;
}
对应的Mapper XML:
xml复制<update id="updateStock">
UPDATE product
SET stock = stock - #{num}
WHERE id = #{skuId} AND stock >= #{num}
</update>
3.2 支付模块集成
支付宝沙箱环境配置常见问题排查:
- 应用公钥未正确配置到支付宝开放平台
- 签名算法不一致(推荐使用RSA2)
- 异步通知地址未通过ICP备案
支付成功后的状态同步方案:
mermaid复制sequenceDiagram
支付宝->>服务器: 异步通知
服务器->>数据库: 更新订单状态
服务器->>前端: WebSocket推送
前端->>用户: 显示支付成功
4. 毕业设计加分项实现
4.1 数据可视化看板
使用Echarts实现销售数据分析:
javascript复制// 在setup中使用
const initChart = () => {
const chart = echarts.init(dom.value)
chart.setOption({
tooltip: { trigger: 'axis' },
xAxis: { data: ['周一','周二','周三'] },
series: [{ data: [120,200,150], type: 'line' }]
})
window.addEventListener('resize', chart.resize)
}
4.2 高级搜索功能
基于Elasticsearch的商品搜索实现步骤:
- 安装ES 7.x并启动服务
- 集成Spring Data Elasticsearch
- 构建商品索引
java复制@Document(indexName = "products")
public class ESProduct {
@Id private Long id;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String name;
@Field(type = FieldType.Keyword)
private String category;
}
5. 项目部署指南
5.1 数据库准备
SQL脚本包含这些关键表:
pet_user(用户表)pet_product(商品SPU表)pet_sku(商品SKU表)pet_order(订单主表)pet_order_item(订单明细表)
快速导入技巧:
sql复制-- 避免外键约束导致导入失败
SET FOREIGN_KEY_CHECKS = 0;
source /path/to/pet_store.sql;
SET FOREIGN_KEY_CHECKS = 1;
5.2 前后端联调
解决跨域问题的三种方案对比:
- 开发环境:配置Vite代理
javascript复制// vite.config.js
server: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true
}
}
}
- 生产环境:Nginx反向代理
nginx复制location /api {
proxy_pass http://backend;
proxy_set_header Host $host;
}
- 终极方案:SpringBoot配置CORS
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*");
}
}
6. 毕设答辩技巧
我在评审毕业设计时最关注的三个要点:
- 技术深度:能说清楚JWT的刷新令牌机制
- 业务理解:解释SKU的设计为什么能减少库存占用
- 扩展思考:如何改进现有的秒杀方案
常见问题及应对策略:
-
Q:为什么选用Vue而不是React?
A:从学习曲线、生态成熟度、与Element Plus的兼容性三个维度分析 -
Q:系统能承受多少并发?
A:实测数据(附JMeter测试报告),指出瓶颈在于MySQL的QPS
项目二次开发建议方向:
- 增加推荐算法(基于用户行为)
- 接入微信小程序
- 实现分布式架构改造
