1. 项目概述
这个基于SSM框架的品牌车衣供应商管理系统,是我在毕业设计期间完成的一个综合性电商平台项目。作为一个汽车后市场领域的垂直电商解决方案,它整合了线上直播带货和线下门店管理的双重功能,为车衣供应商提供了一个完整的数字化运营平台。
系统采用B/S架构,前端使用Vue.js构建响应式界面,后端基于Spring+SpringMVC+MyBatis技术栈开发,数据库选用MySQL 8.0。整个系统实现了四大核心模块:面向消费者的电商购物模块、面向店长的门店管理模块、面向店员的工作台模块,以及面向管理员的系统管理模块。
特别说明:在开发过程中,我发现车衣这类汽车美容产品具有单价高、决策周期长的特点,因此系统特别强化了产品展示的视觉效果和用户互动功能,这在后续的用户测试中获得了很好的反馈。
2. 系统架构设计
2.1 技术选型解析
2.1.1 后端技术栈
选择SSM框架组合主要基于以下考虑:
- Spring 5.x:提供了完善的IoC容器和AOP支持,特别是声明式事务管理对电商系统的订单处理至关重要
- Spring MVC:RESTful风格的API设计,配合@ControllerAdvice实现统一的异常处理
- MyBatis 3.5:灵活的SQL映射,针对复杂报表查询编写了多个动态SQL模板
java复制// 典型的事务管理示例
@Transactional(rollbackFor = Exception.class)
public OrderResult createOrder(OrderDTO orderDTO) {
// 库存检查
// 订单创建
// 支付记录生成
// 积分计算
}
2.1.2 前端技术方案
采用Vue 2.6 + Element UI的组合:
- 通过axios拦截器实现JWT认证
- 使用vuex管理跨组件状态(如购物车数据)
- 直播模块集成腾讯云WebRTC SDK
2.1.3 数据库设计
MySQL 8.0的表设计遵循了几个原则:
- 将频繁查询的字段(如价格、库存)单独建索引
- 使用DECIMAL类型存储金额避免精度丢失
- 大文本内容(如商品详情)单独拆分到扩展表
2.2 系统分层架构
系统采用经典的三层架构,但针对电商特点做了优化:
| 层级 | 组件 | 优化点 |
|---|---|---|
| 表现层 | Vue.js | 添加页面静态化缓存 |
| 业务层 | Spring | 引入规则引擎处理促销活动 |
| 数据层 | MyBatis | 二级缓存+Redis热点数据缓存 |
3. 核心功能实现
3.1 直播带货模块
3.1.1 技术实现方案
采用腾讯云直播服务+自研互动系统的混合架构:
- 直播流使用RTMP推流到云服务器
- 互动消息通过WebSocket实时传输
- 商品卡片与直播流时间轴绑定
javascript复制// 前端直播互动处理
socket.on('message', (msg) => {
if(msg.type === 'product_show') {
this.showProduct(msg.productId)
}
// 其他消息处理...
})
3.1.2 关键业务逻辑
- 实时库存同步:建立Redis库存缓存,通过发布/订阅模式同步变更
- 限时优惠:使用Redis的过期时间特性实现自动失效
- 互动抽奖:采用雪花算法生成中奖编号保证公平性
3.2 线下门店管理
3.2.1 多角色权限控制
使用RBAC模型,通过Spring Security实现:
java复制@PreAuthorize("hasRole('STORE_MANAGER') && #storeId == principal.storeId")
public void updateStoreInfo(Long storeId, StoreVO vo) {
// 实现逻辑
}
3.2.2 考勤系统实现
结合百度地图API实现:
- 店员打卡时获取GPS位置
- 与门店坐标计算距离(500米范围内有效)
- 使用Quartz定时生成考勤报表
4. 数据库设计与优化
4.1 核心表结构
4.1.1 车衣商品表设计
sql复制CREATE TABLE `car_clothing` (
`id` bigint NOT NULL AUTO_INCREMENT,
`sku_code` varchar(32) NOT NULL COMMENT '商品编码',
`name` varchar(100) NOT NULL COMMENT '商品名称',
`category_id` int NOT NULL COMMENT '分类ID',
`price` decimal(10,2) NOT NULL COMMENT '销售价',
`cost_price` decimal(10,2) DEFAULT NULL COMMENT '成本价',
`stock` int NOT NULL DEFAULT '0' COMMENT '库存',
`weight` decimal(10,2) DEFAULT NULL COMMENT '重量(g)',
`main_image` varchar(255) DEFAULT NULL COMMENT '主图',
`sub_images` text COMMENT '子图JSON数组',
`detail` text COMMENT '商品详情',
`sales` int DEFAULT '0' COMMENT '销量',
`status` tinyint DEFAULT '1' COMMENT '状态',
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_sku` (`sku_code`),
KEY `idx_category` (`category_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4.2 查询优化实践
针对商品列表页的慢查询问题,采取了以下措施:
- 添加复合索引:(category_id, status, sales)
- 使用覆盖索引避免回表
- 大文本字段(detail)单独查询
5. 系统测试与部署
5.1 压力测试方案
使用JMeter模拟高并发场景:
- 直播期间瞬时下单:500TPS
- 门店交接班时考勤打卡:200TPS
- 管理员批量导入商品数据
测试环境配置:
- 阿里云ECS:4核8G × 2台
- RDS MySQL:8核16G
- Redis集群:3节点
5.2 典型问题排查
5.2.1 库存超卖问题
现象:促销期间出现库存负数
解决方案:
- 采用乐观锁控制更新:
sql复制UPDATE product_stock
SET quantity = quantity - #{num}
WHERE product_id = #{productId} AND quantity >= #{num}
- 引入Redis分布式锁保证原子性
- 添加库存操作流水表用于对账
5.2.2 直播延迟问题
现象:主播操作与观众看到的有3-5秒延迟
优化措施:
- 切换为低延迟直播协议(WebRTC)
- 前置CDN节点
- 压缩互动消息体积
6. 开发经验总结
在三个月开发周期内,我积累了几个关键经验:
-
复杂状态管理:车衣订单涉及支付、施工预约、评价等多个状态,最终采用状态机模式清晰管理流转逻辑
-
性能平衡点:初期过度追求缓存导致数据不一致,后来调整为:
- 基础数据缓存5分钟
- 库存数据不缓存
- 商品详情静态化
-
移动端适配:通过vw+rem方案实现多端适配,特别针对车衣展示页做了横屏优化
-
安全防护:
- 使用Spring Security的CSRF防护
- 敏感操作增加二次验证
- SQL查询全部使用预编译
这个项目让我深刻理解了电商系统的复杂性,特别是在库存和订单处理方面,任何一个环节考虑不周都可能导致严重问题。建议后续开发者可以在以下方面继续优化:
- 引入ELK实现日志集中分析
- 增加Prometheus监控
- 实现灰度发布能力