1. 项目概述与核心价值
这个家电销售展示平台是我在指导Java Web毕业设计过程中沉淀下来的一个典型项目案例。不同于市面上那些东拼西凑的"毕设模板",这个项目从架构设计到代码实现都遵循了企业级开发规范,特别适合计算机相关专业的学生用来理解现代Web开发的完整流程。
为什么选择这个技术栈? 采用SpringBoot+Vue的前后端分离架构,不仅因为这是当前企业开发的主流选择,更重要的是这种架构能让学习者同时掌握服务端和客户端的开发思维。我在实际教学中发现,很多同学做单体应用时看似完成了功能,但一旦需要扩展或协作就束手无策。而这个项目清晰地展示了前后端如何通过RESTful API交互,如何使用JWT进行安全认证,这些都是在实际工作中必须掌握的硬技能。
2. 系统架构设计解析
2.1 技术选型决策
后端选择SpringBoot框架主要基于三点考虑:
- 自动配置特性大幅减少了XML配置,让初学者能快速搭建可运行的环境
- 内嵌Tomcat服务器简化了部署流程,
mvn spring-boot:run即可启动服务 - 丰富的Starter依赖(如spring-boot-starter-web、spring-boot-starter-security)让集成主流组件变得异常简单
前端选用Vue.js+ElementUI的组合则是考虑到:
- Vue的渐进式特性允许从简单功能逐步扩展到复杂SPA
- 基于组件的开发模式与后端微服务思想高度契合
- ElementUI提供了开箱即用的美观组件,避免学生陷入CSS细节
2.2 数据库设计要点
项目中三个核心表的设计体现了典型的电商模式:
用户表(user_info)的密码字段:
sql复制user_password VARCHAR(100) NOT NULL COMMENT 'BCrypt加密后的密码'
这里特别强调要使用BCrypt加密而非MD5/SHA,因为:
- 内置随机盐值防止彩虹表攻击
- 故意设计为计算密集型操作增加暴力破解难度
- Spring Security原生支持BCryptPasswordEncoder
商品表的库存字段:
java复制@Version
private Integer productStock; // 使用乐观锁控制并发
通过JPA的@Version注解实现乐观锁,避免超卖问题。这是电商系统必须考虑的细节,我在代码中特意保留了相关实现。
3. 关键功能实现细节
3.1 JWT认证流程实现
认证模块采用JWT而非Session,这是现代Web应用的典型做法。核心代码结构:
code复制├── config
│ └── SecurityConfig.java # Spring Security配置
├── filter
│ └── JwtAuthenticationFilter.java # 拦截器
└── util
└── JwtTokenUtil.java # 令牌工具类
值得注意的实现细节:
- 在JwtTokenUtil中设置了合理的过期时间(建议2小时)
- 将用户角色信息嵌入token避免频繁查库
- 使用黑名单机制处理提前注销需求
重要提示:开发环境记得关闭CSRF保护,否则Postman测试会返回403。生产环境务必启用!
3.2 购物车模块设计
购物车采用两种存储方案并行:
java复制// 未登录用户:浏览器localStorage
{
"cartItems": [
{
"productId": 101,
"quantity": 2,
"addedAt": "2023-07-20T08:00:00"
}
]
}
// 已登录用户:服务端Redis存储
redisTemplate.opsForHash().put(
"user:cart:"+userId,
productId.toString(),
cartItemJson
);
这种设计既保证了用户体验,又实现了数据持久化。迁移逻辑在登录成功时自动执行。
4. 典型问题排查实录
4.1 跨域问题解决方案
前后端分离开发必定遇到的CORS问题,我的推荐配置:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:8080") // Vue开发服务器地址
.allowedMethods("*")
.allowCredentials(true)
.maxAge(3600);
}
}
常见踩坑点:
- 用了Security时忘记在SecurityConfig中禁用cors()配置
- 前端axios请求没设置withCredentials: true
- 响应头缺失Access-Control-Allow-Credentials
4.2 文件上传大小限制
SpringBoot默认限制文件上传大小为1MB,需要调整配置:
properties复制# application.properties
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
如果使用Nginx反向代理,还需要同步修改nginx.conf:
code复制client_max_body_size 10m;
5. 项目部署实践建议
5.1 生产环境配置
推荐使用Docker Compose编排服务:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:alpine
ports:
- "6379:6379"
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
frontend:
build: ./frontend
ports:
- "80:80"
volumes:
mysql_data:
5.2 性能优化技巧
- 启用Gzip压缩(Vue CLI默认已配置)
- 配置SpringBoot的HTTP缓存头:
java复制@Configuration
public class CacheConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/")
.setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS));
}
}
- 对商品列表接口添加Spring Cache注解:
java复制@Cacheable(value = "products", key = "#category")
public List<Product> getByCategory(String category) {
return productMapper.selectByCategory(category);
}
6. 学习路线建议
对于想深入学习这个项目的同学,我建议按这个顺序研究代码:
- 先跑通基础功能(用户注册→登录→浏览商品)
- 研究JWT在前后端的完整流转过程
- 分析购物车状态同步机制
- 跟踪一个订单的完整生命周期
- 尝试添加新的商品分类筛选功能
我在代码中刻意保留了一些"教学式"注释,比如在OrderServiceImpl中标注了事务边界的重要性,在Vue组件中说明了v-model的双向绑定原理。这些都是在实际工程中容易忽视但至关重要的知识点。