1. 项目概述与背景
烟草行业作为特殊商品流通领域,长期以来实行严格的专卖管理制度。在传统运营模式下,烟草销售面临着多级流通环节数据割裂、库存周转效率低下、终端零售管理粗放等痛点。基于SpringBoot的烟草销售管理系统正是为解决这些问题而设计的全链路数字化解决方案。
这个毕业设计项目采用微服务架构思想,将复杂的烟草销售业务拆解为可灵活组合的功能模块。系统覆盖了从供应商到零售终端的完整业务链条,实现了"人、货、场、单、钱、账、规"七大要素的线上化管理。我在实际开发中发现,这种架构设计特别适合烟草行业的多层级管理特点,每个功能模块都可以独立部署和扩展。
2. 系统架构设计
2.1 技术选型与开发环境
系统采用前后端分离架构,主要技术栈包括:
- 后端框架:SpringBoot 2.5.6(提供自动配置和快速启动)
- 持久层:MyBatis-Plus 3.4.3(简化CRUD操作)
- 数据库:MySQL 8.0(关系型数据库存储业务数据)
- 前端技术:Vue.js + ElementUI(构建响应式管理界面)
- 开发工具:IntelliJ IDEA 2021.2 + Navicat Premium 15
提示:在实际开发中,我推荐使用JDK1.8与Tomcat8.5的组合,这个环境对SpringBoot的兼容性最好,也最容易找到问题解决方案。
2.2 系统模块划分
系统主要分为三大角色模块:
- 管理员模块:负责系统基础配置和全局监控
- 商家模块:处理商品管理和订单处理
- 用户模块:实现商品浏览和购买功能
每个模块又细分为多个功能组件,通过清晰的接口定义进行交互。这种模块化设计使得系统维护和功能扩展变得非常方便。
3. 核心功能实现
3.1 用户管理子系统
3.1.1 用户注册流程
用户注册采用了前后端分离的验证机制:
- 前端进行基础格式校验(手机号、密码强度等)
- 后端通过MyBatis查询数据库验证账号唯一性
- 密码使用BCryptPasswordEncoder进行加密存储
关键代码片段:
@PostMapping("/register") public Result register(@RequestBody User user) { // 检查用户名是否已存在 if(userService.getById(user.getUsername()) != null){ return Result.error("用户名已存在"); } // 密码加密 user.setPassword(bCryptPasswordEncoder.encode(user.getPassword())); userService.save(user); return Result.success("注册成功"); }3.1.2 登录认证设计
系统采用JWT(JSON Web Token)进行身份认证,具有以下特点:
- 令牌有效期设置为8小时
- 刷新令牌机制延长会话时间
- 前后端分离的权限校验方式
3.2 商品管理子系统
3.2.1 商品信息模型
商品实体设计考虑了烟草行业的特殊属性:
public class Product { private String barcode; // 商品条码 private String name; // 商品名称 private String category; // 商品分类 private String specification;// 规格(如20支/包) private String brand; // 品牌 private String origin; // 产地 private BigDecimal price; // 价格 private Integer stock; // 库存 private Integer limit; // 单次限购数量 // 其他字段... }3.2.2 库存预警机制
系统实现了动态库存监控:
- 当库存低于设定阈值时触发预警
- 预警信息实时推送给相关商家
- 支持自定义预警阈值设置
3.3 订单处理子系统
3.3.1 订单状态机设计
订单生命周期管理采用状态模式:
待支付 → 已支付 → 已发货 → 已完成 ↓ ↓ 已取消 退货中 → 已退货3.3.2 支付集成方案
系统预留了多种支付接口:
- 微信支付
- 支付宝
- 银联支付
- 账户余额支付
每种支付方式都通过策略模式实现,便于后续扩展新的支付渠道。
4. 数据库设计与优化
4.1 核心表结构
4.1.1 商品表(product)
CREATE TABLE `product` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `barcode` varchar(32) NOT NULL COMMENT '商品条码', `name` varchar(100) NOT NULL COMMENT '商品名称', `category_id` bigint(20) NOT NULL COMMENT '分类ID', `specification` varchar(50) DEFAULT NULL COMMENT '规格', `brand` varchar(50) DEFAULT NULL COMMENT '品牌', `price` decimal(10,2) NOT NULL COMMENT '价格', `stock` int(11) NOT NULL DEFAULT '0' COMMENT '库存', `limit_num` int(11) DEFAULT NULL COMMENT '单次限购', `merchant_id` bigint(20) NOT NULL COMMENT '商家ID', `create_time` datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `idx_barcode` (`barcode`), KEY `idx_category` (`category_id`), KEY `idx_merchant` (`merchant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';4.1.2 订单表(order)
CREATE TABLE `order` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `order_no` varchar(32) NOT NULL COMMENT '订单编号', `user_id` bigint(20) NOT NULL COMMENT '用户ID', `total_amount` decimal(10,2) NOT NULL COMMENT '总金额', `payment_type` tinyint(4) NOT NULL COMMENT '支付方式', `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态', `address` varchar(255) NOT NULL COMMENT '收货地址', `receiver` varchar(50) NOT NULL COMMENT '收货人', `phone` varchar(20) NOT NULL COMMENT '联系电话', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `create_time` datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `idx_order_no` (`order_no`), KEY `idx_user` (`user_id`), KEY `idx_create_time` (`create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';4.2 查询性能优化
针对烟草销售系统的高并发查询需求,我们采取了以下优化措施:
- 为高频查询字段添加合适索引
- 使用Redis缓存热点商品数据
- 对大表进行水平分表(按时间维度)
- 复杂报表查询使用预计算策略
5. 系统安全设计
5.1 接口安全防护
- 使用Spring Security进行权限控制
- 敏感接口增加防重放攻击机制
- 关键业务操作记录详细日志
- 定期审计接口访问情况
5.2 数据安全策略
- 敏感字段加密存储(如用户手机号)
- 数据库定期备份机制
- 传输层使用HTTPS加密
- 实现数据脱敏展示功能
6. 开发经验与问题解决
6.1 典型问题记录
6.1.1 库存超卖问题
初期版本在高并发下会出现库存超卖,解决方案:
@Transactional public Result createOrder(OrderDTO orderDTO) { // 使用乐观锁更新库存 int updateCount = productMapper.reduceStockWithVersion( orderDTO.getProductId(), orderDTO.getQuantity(), product.getVersion()); if(updateCount == 0) { throw new BusinessException("库存不足"); } // 创建订单逻辑... }6.1.2 分布式事务问题
跨服务调用时采用最终一致性方案:
- 本地消息表记录事务状态
- 定时任务补偿失败操作
- 设计幂等接口防止重复处理
6.2 性能优化技巧
- 前端采用懒加载和分页查询
- 后端接口响应时间控制在200ms内
- 静态资源使用CDN加速
- 启用Gzip压缩减少传输量
7. 系统部署方案
7.1 基础环境要求
- 服务器:2核4G以上配置
- 操作系统:CentOS 7.6+
- 中间件:Nginx 1.18+、Tomcat 8.5+
- 数据库:MySQL 8.0+、Redis 5.0+
7.2 容器化部署
系统支持Docker容器化部署,提供完整的docker-compose.yml文件:
version: '3' services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 123456 ports: - "3306:3306" volumes: - ./mysql/data:/var/lib/mysql redis: image: redis:5.0 ports: - "6379:6379" app: build: . ports: - "8080:8080" depends_on: - mysql - redis8. 项目总结与扩展方向
这个基于SpringBoot的烟草销售管理系统在毕业设计阶段已经实现了基础功能,但在实际商业应用中还可以进一步扩展:
- 增加大数据分析模块,实现销售预测
- 集成智能硬件设备,实现自动库存盘点
- 开发移动端APP,提升用户体验
- 引入区块链技术,增强溯源能力
在实际开发过程中,我深刻体会到良好的系统架构设计对项目可维护性的重要性。采用SpringBoot确实大幅提升了开发效率,但同时也需要注意避免过度依赖自动配置带来的"黑箱"问题。建议在关键组件上保持适度的手动配置,这样在出现问题时更容易定位和解决。