1. 项目背景与核心价值
去年帮学弟调试毕业设计时,发现市面90%的酒类电商系统都存在三个通病:库存同步延迟、支付流程断裂、移动端适配粗糙。这个基于Web的酒品商城系统正是针对这些痛点设计的全栈解决方案,特别适合计算机专业同学作为毕业设计选题。系统采用经典的三层架构,前端用Vue3+Element Plus实现响应式布局,后端Spring Boot整合Redis处理高并发库存,连微信支付SDK都做了二次封装处理掉单问题。
对开发者而言,这个项目的亮点在于:
- 完整覆盖电商核心流程(商品SPU/SKU管理、优惠券体系、分布式事务)
- 包含可复用的支付对账模块
- 提供可视化销售数据分析看板
- 源码注释率超过70%,关键算法都有流程图注释
2. 技术架构设计详解
2.1 系统分层架构
采用改良版DDD领域驱动设计,将传统三层架构细化为:
- 表现层:Vue3 + Vant移动端组件库
- 应用层:Spring Cloud Gateway统一路由
- 领域层:领域服务聚合根(如OrderAggregate)
- 基础设施层:Alibaba Cloud全家桶(OSS/SMS)
特别注意:领域层禁止直接调用基础设施层,必须通过依赖注入
2.2 数据库设计技巧
商品模块采用SPU+SKU分离设计:
sql复制CREATE TABLE `wine_spu` (
`id` bigint NOT NULL COMMENT '酒品ID',
`title` varchar(120) NOT NULL COMMENT '商品标题',
`subtitle` varchar(200) DEFAULT NULL COMMENT '副标题',
`alcohol_level` decimal(3,1) NOT NULL COMMENT '酒精度数',
`origin_place` varchar(50) NOT NULL COMMENT '原产地'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `wine_sku` (
`id` bigint NOT NULL COMMENT 'SKUID',
`spu_id` bigint NOT NULL COMMENT '关联SPU',
`spec` json NOT NULL COMMENT '规格属性(年份/容量)',
`price` decimal(10,2) NOT NULL COMMENT '实际售价',
`stock` int NOT NULL DEFAULT '0' COMMENT '库存'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
库存管理采用Redis+Lua原子操作:
lua复制-- 库存扣减脚本
local stock = redis.call('GET', KEYS[1])
if not stock or tonumber(stock) < tonumber(ARGV[1]) then
return 0
end
redis.call('DECRBY', KEYS[1], ARGV[1])
return 1
3. 核心功能实现要点
3.1 秒杀功能实现
采用分级缓存策略:
- 本地缓存:Guava Cache存储静态商品详情
- 分布式缓存:Redis Cluster处理库存预热
- 数据库:最终一致性校验
关键参数配置:
yaml复制# 秒杀线程池配置
seckill:
pool:
core-size: 20
max-size: 100
queue-capacity: 500
keep-alive: 60s
3.2 支付对账系统
自研对账引擎处理流程:
- 定时拉取微信支付账单(凌晨2点)
- 与本地订单流水比对
- 生成差异报告(状态机实现)
- 自动发起补单(支持人工干预)
状态机配置示例:
java复制@Transition(
source = "UNPAID",
target = "PAID",
event = "PAY_SUCCESS"
)
public void onPaySuccess(Order order) {
// 支付成功处理逻辑
}
4. 部署与性能优化
4.1 容器化部署方案
Docker Compose编排关键服务:
yaml复制version: '3'
services:
redis:
image: redis:6-alpine
ports:
- "6379:6379"
volumes:
- ./redis.conf:/usr/local/etc/redis/redis.conf
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root123
ports:
- "3306:3306"
4.2 压力测试数据
使用JMeter模拟1000并发:
| 接口名称 | TPS | 平均响应时间 | 错误率 |
|---|---|---|---|
| 商品详情页 | 1256 | 78ms | 0% |
| 提交订单 | 892 | 153ms | 0.2% |
| 支付回调 | 2048 | 42ms | 0% |
优化手段:
- Nginx静态资源缓存
- MySQL读写分离(使用ShardingSphere)
- 热点数据本地缓存
5. 毕业设计答辩技巧
5.1 演示数据准备
建议使用Python Faker生成测试数据:
python复制from faker import Faker
fake = Faker('zh_CN')
for _ in range(100):
print(f"INSERT INTO wine_spu VALUES (
{fake.random_number(8)},
'{fake.company()} {fake.color_name()}酒',
'{fake.sentence()}',
{fake.random_int(8, 53)},
'{fake.province()}'
);")
5.2 常见答辩问题
-
Q:如何防止超卖?
A:三级校验(前端限购按钮->Redis原子递减->数据库乐观锁) -
Q:支付掉单怎么处理?
A:对账系统+补偿事务(本地消息表) -
Q:为什么不用Elasticsearch?
A:商品数据量<10万,MySQL全文索引足够,避免过度设计
项目源码已通过SonarQube质量检测,技术债务率为0.8%,远低于行业平均5%的标准。建议同学们在理解架构设计的基础上,可以尝试扩展智能推荐模块(协同过滤算法)或物流跟踪功能(快递鸟API集成)。