清河羊绒作为中国高端纺织原料的代表,长期以来面临传统批发模式带来的信息孤岛问题。我在实地调研中发现,当地商户普遍存在三个痛点:一是库存数据与销售渠道割裂,经常出现客户下单后才发现缺货;二是价格调整滞后,无法快速响应市场变化;三是客户资源分散在各销售员手中,缺乏统一管理。这个毕业设计项目正是瞄准这些行业痛点,构建了一个全链条的数字化解决方案。
系统采用SpringBoot+Vue的现代化技术栈,实现了传统羊绒产业从线下到线上的数字化转型。最核心的创新点在于将"人货场"三大要素完全数字化重构:
技术选型心得:选择SpringBoot而非传统SSM框架,主要考虑其内嵌Tomcat和自动配置特性,能大幅降低部署复杂度。这对技术储备有限的中小羊绒商户尤为重要。
后端架构采用经典的三层设计模式:
java复制// 典型Service层代码示例
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductMapper productMapper;
@Transactional
public void updateStock(Long productId, int quantity) {
Product product = productMapper.selectById(productId);
if(product.getStock() < quantity) {
throw new BusinessException("库存不足");
}
productMapper.updateStock(productId, quantity);
}
}
前端架构采用Vue3组合式API开发,值得注意的三个技术决策:
数据库设计遵循三个核心原则:
主要表结构设计示例:
| 表名 | 关键字段 | 索引设计 |
|---|---|---|
| t_product | id, category_id, name, price | 联合索引(category_id, is_deleted) |
| t_order | order_no, user_id, total_amount | 唯一索引(order_no), 普通索引(user_id) |
| t_inventory | product_id, stock, locked_stock | 主键(product_id) |
避坑指南:羊绒商品存在大量规格参数(如纱支、克重),最初设计为JSON字段存储,后发现统计查询性能极差。最终改造为专门的规格参数表,通过product_id关联。
库存扣减是电商系统的核心难点,我们实现了三级库存防护:
sql复制UPDATE t_inventory
SET stock = stock - #{quantity},
version = version + 1
WHERE product_id = #{productId}
AND version = #{version}
库存状态机设计:
code复制[可售] --(下单)--> [预占]
[预占] --(支付超时)--> [可售]
[预占] --(完成支付)--> [已售]
[可售] --(商家下架)--> [停售]
跨服务的预售定金支付采用TCC柔性事务方案:
关键代码实现:
java复制@Transactional
public boolean tryPayment(Long userId, BigDecimal amount) {
// 检查余额
Account account = accountMapper.selectForUpdate(userId);
if(account.getBalance().compareTo(amount) < 0) {
throw new BusinessException("余额不足");
}
// 冻结金额
accountMapper.freezeAmount(userId, amount);
// 记录事务日志
transactionLogMapper.insert(new TransactionLog(userId, amount));
return true;
}
针对羊绒原料价格波动大的特点,开发了基于规则引擎的价格计算系统:
规则配置表示例:
json复制{
"ruleName": "VIP折扣",
"condition": "user.level >= 2",
"action": "price = price * 0.9",
"priority": 1
}
通过Spring Schedule定时任务实现:
预警配置核心逻辑:
java复制@Scheduled(cron = "0 0 9 * * ?")
public void checkInventory() {
List<Product> products = productMapper.selectLowStockProducts();
products.forEach(product -> {
String msg = String.format("商品%s库存仅剩%d件",
product.getName(), product.getStock());
wechatNotifier.sendAlert(msg);
});
}
推荐使用Docker Compose编排服务:
yaml复制version: '3'
services:
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql-data:/var/lib/mysql
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
frontend:
build: ./frontend
ports:
- "80:80"
通过JMeter压测发现的三个性能瓶颈及解决方案:
Nginx关键配置优化:
nginx复制# 启用gzip压缩
gzip on;
gzip_min_length 1k;
gzip_types text/plain application/json;
# 静态资源缓存
location ~* \.(jpg|css|js)$ {
expires 30d;
add_header Cache-Control "public";
}
java复制// 错误做法:循环中单条insert
// 正确做法:使用BatchExecutor
SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
ProductMapper mapper = session.getMapper(ProductMapper.class);
for(Product product : productList) {
mapper.insert(product);
}
session.commit();
} finally {
session.close();
}
这个项目让我深刻体会到,传统产业数字化转型不是简单的"线下转线上",而是要通过技术手段重构业务流程。在开发过程中,最大的挑战不是技术实现,而是对羊绒行业特有业务规则的理解和抽象。比如羊绒商品的"预售定金"模式,就需要设计特殊的订单状态机和资金冻结逻辑。