1. 项目概述
这个手机商城销售网站项目采用Vue.js作为前端框架,Spring Boot作为后端框架,是一个典型的前后端分离架构的电商系统。作为一名全栈开发者,我最近刚完成了一个类似的商业项目,想分享一些实战经验。这种技术组合在当前企业级开发中非常流行,既能保证前端交互体验,又能确保后端服务的稳定性和扩展性。
手机商城这类电商平台有几个核心特点:需要处理高并发的商品展示和搜索、实现安全的支付流程、管理复杂的订单状态,以及提供个性化的用户推荐。Vue+SpringBoot的组合恰好能很好地满足这些需求——Vue的组件化开发让前端交互更流畅,而SpringBoot的自动化配置和丰富的生态让后端开发事半功倍。
2. 技术选型分析
2.1 为什么选择Vue.js
Vue.js作为前端框架有几个不可替代的优势:
- 渐进式框架特性:可以根据项目需求灵活选择使用哪些功能
- 单文件组件(SFC)开发模式:把HTML、CSS和JS写在同一个.vue文件中,开发效率极高
- 响应式数据绑定:自动追踪依赖关系,数据变化时视图自动更新
- 丰富的生态系统:Vue Router、Vuex、Vant UI等配套工具完善
在实际项目中,我推荐使用Vue 3的组合式API写法,比Options API更灵活。特别是对于商品列表页这种需要复杂逻辑的组件,用setup()函数组织代码会更加清晰。
2.2 为什么选择Spring Boot
后端选择Spring Boot主要基于以下考虑:
- 自动配置:省去了大量XML配置,开箱即用
- 内嵌服务器:可以直接打包成可执行JAR,部署简单
- 丰富的Starter依赖:轻松整合MyBatis、Redis、RabbitMQ等常用组件
- Actuator监控:方便查看应用健康状态和性能指标
对于电商系统,Spring Boot可以很好地支持:
- 高并发场景下的性能优化
- 分布式会话管理
- 微服务架构的平滑演进
- 与各种支付网关的对接
3. 系统架构设计
3.1 前端架构
code复制src/
├── api/ # 接口请求封装
├── assets/ # 静态资源
├── components/ # 公共组件
│ ├── Header.vue # 顶部导航
│ ├── Footer.vue # 底部信息
│ └── ProductCard.vue # 商品卡片
├── router/ # 路由配置
├── store/ # Vuex状态管理
├── views/ # 页面组件
│ ├── Home.vue # 首页
│ ├── Product.vue # 商品详情
│ ├── Cart.vue # 购物车
│ └── Order.vue # 订单页
└── App.vue # 根组件
关键点:
- 使用Vue CLI搭建项目骨架
- 采用Vue Router实现前端路由,支持懒加载
- 使用Vuex管理全局状态(如用户登录态、购物车数据)
- 按功能划分组件,保持高内聚低耦合
3.2 后端架构
code复制com.example.mall/
├── config/ # 配置类
├── controller/ # 控制器层
├── service/ # 业务逻辑层
│ ├── impl/ # 实现类
│ └── ProductService.java
├── dao/ # 数据访问层
├── entity/ # 实体类
├── dto/ # 数据传输对象
├── util/ # 工具类
└── MallApplication.java # 启动类
关键点:
- 经典的三层架构(Controller-Service-DAO)
- 使用MyBatis-Plus简化数据库操作
- 全局异常处理统一返回格式
- 分环境配置(dev/test/prod)
4. 核心功能实现
4.1 商品模块
4.1.1 商品列表
前端关键代码:
vue复制<template>
<div class="product-list">
<ProductCard
v-for="product in products"
:key="product.id"
:product="product"
@add-to-cart="handleAddToCart"
/>
<Pagination
:current="pagination.current"
:total="pagination.total"
@change="handlePageChange"
/>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { getProducts } from '@/api/product'
const products = ref([])
const pagination = ref({
current: 1,
pageSize: 10,
total: 0
})
const loadProducts = async () => {
const res = await getProducts({
page: pagination.value.current,
size: pagination.value.pageSize
})
products.value = res.data.list
pagination.value.total = res.data.total
}
onMounted(() => {
loadProducts()
})
const handlePageChange = (page) => {
pagination.value.current = page
loadProducts()
}
</script>
后端关键实现:
java复制@RestController
@RequestMapping("/api/product")
public class ProductController {
@Autowired
private ProductService productService;
@GetMapping
public Result<PageInfo<ProductDTO>> listProducts(
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer size) {
return Result.success(productService.listProducts(page, size));
}
}
4.1.2 商品详情
技术要点:
- 使用Vue Router的动态路由匹配商品ID
- 后端使用Redis缓存热门商品数据
- 实现商品浏览历史记录(使用LocalStorage或后端存储)
- 商品规格选择联动价格变化
4.2 购物车模块
4.2.1 数据结构设计
java复制public class CartItem {
private Long productId;
private String productName;
private String productImage;
private BigDecimal price;
private Integer quantity;
private List<Specification> specs; // 商品规格
}
4.2.2 核心逻辑
前端实现要点:
- 使用Vuex管理购物车状态
- 本地存储+服务端同步的双存储策略
- 实时计算总价和优惠
后端实现要点:
- 使用Redis存储购物车数据(用户未登录时也可暂存)
- 合并本地和服务端购物车
- 库存预检查
4.3 订单模块
4.3.1 下单流程
- 购物车结算页确认商品和收货地址
- 选择支付方式
- 创建订单(生成唯一订单号)
- 预减库存(防止超卖)
- 跳转支付网关
- 支付结果异步通知
4.3.2 订单状态机
java复制public enum OrderStatus {
UNPAID, // 待支付
PAID, // 已支付
SHIPPED, // 已发货
COMPLETED, // 已完成
CANCELLED, // 已取消
REFUNDING, // 退款中
REFUNDED // 已退款
}
5. 关键技术实现
5.1 图片上传与处理
方案选择:
- 阿里云OSS直传(前端签名后直接上传到OSS)
- 图片压缩:使用canvas在前端压缩
- 缩略图生成:使用OSS图片处理服务
关键代码:
javascript复制// 前端上传实现
const uploadImage = async (file) => {
// 1. 获取OSS上传凭证
const { data } = await getOSSToken()
// 2. 创建FormData
const formData = new FormData()
formData.append('key', data.dir + '/' + Date.now() + '-' + file.name)
formData.append('policy', data.policy)
formData.append('OSSAccessKeyId', data.accessId)
formData.append('signature', data.signature)
formData.append('file', file)
// 3. 上传到OSS
return axios.post(data.host, formData)
}
5.2 支付集成
支付宝支付流程:
- 后端创建支付订单,返回支付参数
- 前端调用AlipayJSBridge唤起支付
- 支付成功后,支付宝异步通知服务端
- 服务端验证通知真实性,更新订单状态
安全措施:
- 签名验证所有支付相关请求
- 支付结果以服务端异步通知为准
- 关键操作记录审计日志
5.3 性能优化
5.3.1 前端优化
- 路由懒加载
- 图片懒加载
- 组件按需引入
- 使用keep-alive缓存页面
5.3.2 后端优化
- Redis缓存热点数据
- 数据库读写分离
- 异步处理非核心流程(如发送通知)
- Nginx静态资源缓存
6. 项目部署
6.1 前端部署
- 生产环境构建
bash复制npm run build
- Nginx配置示例:
nginx复制server {
listen 80;
server_name mall.example.com;
location / {
root /var/www/mall;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://backend-server;
}
}
6.2 后端部署
- 打包Spring Boot应用
bash复制mvn clean package -DskipTests
- 使用Docker部署:
dockerfile复制FROM openjdk:11-jre
COPY target/mall-*.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
- 启动命令:
bash复制docker run -d -p 8080:8080 \
-e SPRING_PROFILES_ACTIVE=prod \
-e SPRING_DATASOURCE_URL=jdbc:mysql://mysql-server:3306/mall \
--name mall-server mall-image
7. 常见问题与解决方案
7.1 跨域问题
解决方案:
- Spring Boot配置CORS
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowedHeaders("*");
}
}
- 或者使用Nginx反向代理
7.2 接口防刷
实现方案:
- 使用Redis记录接口调用频率
- 对关键接口添加限流
- 图形验证码防护
示例代码:
java复制@Slf4j
@Aspect
@Component
public class RateLimitAspect {
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Around("@annotation(rateLimit)")
public Object around(ProceedingJoinPoint joinPoint, RateLimit rateLimit) throws Throwable {
String key = "rate_limit:" + getMethodSignature(joinPoint);
long count = redisTemplate.opsForValue().increment(key, 1);
if (count == 1) {
redisTemplate.expire(key, rateLimit.timeWindow(), TimeUnit.SECONDS);
}
if (count > rateLimit.threshold()) {
throw new BusinessException("操作过于频繁,请稍后再试");
}
return joinPoint.proceed();
}
}
7.3 数据一致性
电商系统中的典型场景:
- 下单减库存
- 支付状态同步
- 优惠券核销
解决方案:
- 使用分布式事务(Seata)
- 最终一致性+补偿机制
- 本地消息表
8. 项目扩展方向
8.1 微服务改造
当系统规模扩大时,可以考虑:
- 按业务拆分微服务(商品服务、订单服务、用户服务等)
- 使用Spring Cloud Alibaba套件
- 引入服务网格(Service Mesh)
8.2 大数据分析
增加:
- 用户行为分析
- 商品推荐系统
- 销售数据可视化
8.3 移动端适配
方案选择:
- 开发微信小程序版本
- 使用Uni-app跨平台开发
- PWA渐进式Web应用
在实际开发中,我发现电商系统最关键的不仅是技术实现,更要深入理解业务场景。比如促销活动的各种规则(满减、折扣、秒杀),库存管理的各种策略(预扣、超卖处理),这些业务逻辑的合理实现往往比单纯的技术选型更重要。
