
1. 项目概述数码产品购物商城是一个典型的B2C电商平台专注于3C数码产品在线销售。这个基于SpringBootVue的前后端分离项目是我在开发实践中总结出的一套高可用电商解决方案。相比传统单体架构这种分离设计让前端展示更灵活后端服务更稳定特别适合需要快速迭代的电商业务场景。在实际开发中我发现数码产品商城有几个特殊需求SKU属性复杂比如手机有颜色、内存等组合、高并发秒杀场景、精准的参数对比功能。这些都需要在架构设计阶段就做好技术选型。SpringBoot的自动配置和starter机制能快速搭建微服务而Vue的组件化开发完美适配商品详情页的多变需求。2. 技术架构设计2.1 后端SpringBoot技术栈采用SpringBoot 2.7作为基础框架其内嵌Tomcat容器和约定优于配置的特性让项目初始化时间从传统SSM的3天缩短到2小时。关键依赖包括Spring Security OAuth2处理第三方登录和权限控制MyBatis-Plus 3.5简化DAO层开发内置分页插件Redis 6.2缓存热点数据和实现分布式锁Elasticsearch 7.17商品搜索服务RabbitMQ 3.9异步处理订单消息数据库设计采用分库分表策略CREATE TABLE product_sku ( id bigint NOT NULL AUTO_INCREMENT COMMENT 复合主键, spu_id bigint NOT NULL COMMENT 商品ID, attributes json NOT NULL COMMENT SKU属性JSON, price decimal(10,2) NOT NULL COMMENT 实际售价, stock int NOT NULL DEFAULT 0 COMMENT 库存, PRIMARY KEY (id), KEY idx_spu (spu_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENTSKU表;2.2 前端Vue技术栈使用Vue 3组合式API开发管理后台和H5端主要技术组合Vite 4极速的开发服务器启动Element Plus后台管理系统UI组件库Pinia 2状态管理替代VuexAxios 1.3封装了自动重试的HTTP客户端Vue Router 4实现动态路由权限控制商品详情页的典型组件结构// 参数对比组件 const compareTable computed(() { return selectedSKUs.value.map(sku ({ name: sku.spuName, attributes: Object.entries(sku.attributes) .map(([key, val]) ${key}:${val}) })) })3. 核心功能实现3.1 商品系统设计数码产品的商品模型比普通商品更复杂采用SPUSKU两级结构SPUStandard Product Unit如iPhone 14SKUStock Keeping Unit如iPhone 14 128GB 黑色后端采用组合模式实现public class ProductSpu { private Long id; private String name; private ListSpecGroup specGroups; // 规格参数组 private ListProductSku skus; // SKU列表 } public class ProductSku { private Long id; private MapString,String specs; // 规格值键值对 private BigDecimal price; private Integer stock; }前端使用Vue的递归组件渲染规格选择器template div v-forgroup in specGroups :keygroup.id h3{{ group.name }}/h3 SpecSelector :specsgroup.specs selecthandleSpecSelect / /div /template3.2 高并发库存控制秒杀场景下采用分层校验策略前端限流按钮点击后立即禁用防止重复提交缓存校验Redis预减库存异步下单RabbitMQ消息队列削峰数据库最终一致性乐观锁更新库存扣减的Redis Lua脚本local key KEYS[1] local num tonumber(ARGV[1]) local stock tonumber(redis.call(GET, key)) if stock num then return redis.call(DECRBY, key, num) else return -1 end3.3 支付与订单系统采用状态机模式管理订单生命周期public enum OrderStatus { UNPAID(1, 待支付) { Override public boolean canChangeTo(OrderStatus status) { return status PAID || status CANCELLED; } }, PAID(2, 已支付) { Override public boolean canChangeTo(OrderStatus status) { return status SHIPPED || status REFUNDING; } }; // 其他状态... }支付回调处理采用策略模式Service public class PaymentCallbackStrategy { Resource private MapString, PaymentHandler handlers; public void handle(String paymentType, CallbackData data) { handlers.get(paymentType).process(data); } }4. 性能优化实践4.1 缓存设计策略采用多级缓存架构本地缓存Caffeine缓存用户个性化数据分布式缓存Redis缓存热点商品数据静态化Nginx商品详情页HTML静态化缓存Key设计规范业务前缀:数据维度:唯一标识 示例product:detail:1234.2 数据库优化针对商品列表页的深度分页问题采用游标分页SELECT * FROM product WHERE id #{lastId} AND status 1 ORDER BY id ASC LIMIT #{size}建立组合索引时遵循最左前缀原则ALTER TABLE order ADD INDEX idx_user_status (user_id, status);4.3 前端性能优化图片懒加载img v-lazyproduct.image alt商品图组件异步加载const ProductDetail defineAsyncComponent(() import(./views/ProductDetail.vue) )Webpack分包策略configureWebpack: { optimization: { splitChunks: { chunks: all, maxSize: 244 * 1024 // 244KB } } }5. 部署与监控5.1 容器化部署使用Docker Compose编排服务version: 3 services: app: image: openjdk:17-jdk ports: - 8080:8080 volumes: - ./logs:/app/logs environment: - SPRING_PROFILES_ACTIVEprod redis: image: redis:6.2-alpine ports: - 6379:63795.2 监控告警系统SpringBoot Actuator集成Prometheusmanagement: endpoints: web: exposure: include: health,metrics,prometheus metrics: tags: application: ${spring.application.name}配置Grafana监控看板重点关注JVM内存使用率接口QPS/RTRedis命中率数据库连接池状态6. 踩坑经验分享6.1 跨域问题解决方案开发环境使用Webpack代理devServer: { proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } }生产环境配置Nginxlocation /api/ { proxy_pass http://backend; add_header Access-Control-Allow-Origin $http_origin; add_header Access-Control-Allow-Credentials true; }6.2 微信支付签名错误注意参数排序和编码问题public String generateSign(SortedMapString,String params) { StringBuilder sb new StringBuilder(); params.forEach((k,v) - { if (StringUtils.isNotEmpty(v)) { sb.append(k).append().append(v).append(); } }); sb.append(key).append(apiKey); return DigestUtils.md5Hex(sb.toString()).toUpperCase(); }6.3 订单超时处理使用延迟队列实现Bean public Queue orderDelayQueue() { return QueueBuilder.durable(order.delay.queue) .withArgument(x-dead-letter-exchange, order.event.exchange) .withArgument(x-dead-letter-routing-key, order.cancel) .withArgument(x-message-ttl, 1800000) // 30分钟 .build(); }7. 扩展功能建议商品对比工具使用IndexedDB存储用户选择的对比商品AR展示集成Three.js实现3C产品的3D展示智能推荐采用协同过滤算法实现个性化推荐直播带货集成WebRTC实现直播功能在实现商品搜索时Elasticsearch的mapping设计要注意{ properties: { name: { type: text, analyzer: ik_max_word }, attributes: { type: nested, properties: { key: {type: keyword}, value: {type: keyword} } } } }