1. 项目概述
这个基于SpringBoot3+Vue3的进销存管理系统是我在指导毕业设计过程中开发的一个完整商业项目案例。作为一个有10年全栈开发经验的工程师,我设计这个系统的初衷是帮助初学者掌握企业级应用开发的核心技术栈。系统采用前后端分离架构,后端使用SpringBoot3构建RESTful API,前端使用Vue3实现响应式界面,数据库选用MySQL8.0。
提示:本系统特别适合作为计算机相关专业的毕业设计项目,完整覆盖了从需求分析到部署上线的全流程开发环节。
系统最显著的特点是采用了2023年最新的技术组合:
- 后端:SpringBoot3 + Mybatis + JWT
- 前端:Vue3 + Element Plus + Axios
- 开发工具:IntelliJ IDEA + VS Code
- 运行环境:JDK17 + Node.js18
2. 系统架构设计
2.1 技术选型解析
选择SpringBoot3作为后端框架主要基于以下考虑:
- 自动配置特性大幅减少XML配置
- 内嵌Tomcat服务器简化部署
- 完善的Starter生态快速集成常用组件
- 对Java17新特性的完整支持
Vue3作为前端框架的优势:
- Composition API提供更好的逻辑复用
- 更小的打包体积和更快的渲染速度
- 更好的TypeScript支持
- 活跃的社区和丰富的UI组件库
2.2 系统模块划分
系统采用经典的三层架构设计:
code复制com.ruige
├── config # 配置类
├── controller # 控制器层
├── service # 业务逻辑层
├── mapper # 数据访问层
├── entity # 实体类
├── util # 工具类
├── exception # 异常处理
└── vo # 视图对象
前端项目结构:
code复制src
├── api # 接口定义
├── assets # 静态资源
├── components # 公共组件
├── router # 路由配置
├── store # 状态管理
├── utils # 工具函数
└── views # 页面组件
3. 核心功能实现
3.1 商品管理模块
商品表设计关键字段:
sql复制CREATE TABLE `product` (
`id` bigint NOT NULL AUTO_INCREMENT,
`product_code` varchar(64) NOT NULL COMMENT '商品编码',
`product_name` varchar(128) NOT NULL COMMENT '商品名称',
`category_id` bigint NOT NULL COMMENT '分类ID',
`specification` varchar(255) DEFAULT NULL COMMENT '规格型号',
`unit` varchar(32) NOT NULL COMMENT '单位',
`purchase_price` decimal(10,2) NOT NULL COMMENT '采购价',
`selling_price` decimal(10,2) NOT NULL COMMENT '销售价',
`min_stock` int NOT NULL DEFAULT '0' COMMENT '最低库存',
`current_stock` int NOT NULL DEFAULT '0' COMMENT '当前库存',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态(0-禁用 1-启用)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_product_code` (`product_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
商品新增接口实现:
java复制@PostMapping("/products")
public Result addProduct(@Valid @RequestBody ProductVO productVO) {
// 校验商品编码唯一性
if(productService.existsProductCode(productVO.getProductCode())) {
throw new BusinessException(ErrorCode.PRODUCT_CODE_EXISTS);
}
// VO转Entity
Product product = new Product();
BeanUtils.copyProperties(productVO, product);
// 设置默认状态
product.setStatus(1);
// 保存商品
boolean success = productService.save(product);
return success ? Result.success() : Result.error();
}
3.2 采购订单流程
采购订单状态机设计:
code复制待入库 → 部分入库 → 已完成
↘ 取消
采购入库核心逻辑:
java复制@Transactional
public boolean processPurchaseInbound(Long orderId, List<InboundItemDTO> items) {
// 1. 校验订单状态
PurchaseOrder order = getById(orderId);
if(order.getStatus() != OrderStatus.PENDING_INBOUND) {
throw new BusinessException(ErrorCode.ORDER_STATUS_ERROR);
}
// 2. 处理入库明细
for(InboundItemDTO item : items) {
// 更新订单明细已入库数量
orderItemService.updateInboundQuantity(
item.getItemId(),
item.getInboundQuantity()
);
// 增加商品库存
inventoryService.increaseStock(
item.getProductId(),
item.getInboundQuantity(),
InventoryOperationType.PURCHASE_INBOUND,
orderId.toString()
);
}
// 3. 更新订单状态
boolean allInbound = orderItemService.checkAllInbound(orderId);
order.setStatus(allInbound ? OrderStatus.COMPLETED : OrderStatus.PARTIAL_INBOUND);
return updateById(order);
}
4. 关键技术实现
4.1 JWT认证方案
认证流程设计:
- 用户登录成功后生成JWT token
- 前端将token存储在localStorage
- 每次请求携带token在Authorization头
- 服务端通过拦截器校验token有效性
JWT配置类示例:
java复制@Configuration
public class JwtConfig {
@Value("${jwt.secret}")
private String secret;
@Value("${jwt.expire}")
private Long expire;
@Bean
public JwtUtil jwtUtil() {
return new JwtUtil(secret, expire);
}
@Bean
public JwtAuthenticationFilter jwtAuthenticationFilter() {
return new JwtAuthenticationFilter();
}
}
4.2 库存预警实现
定时任务配置:
java复制@Scheduled(cron = "0 0/30 * * * ?")
public void checkInventoryWarning() {
// 1. 查询所有启用状态的商品
List<Product> products = productService.list(
new QueryWrapper<Product>()
.eq("status", 1)
);
// 2. 检查库存预警
for(Product product : products) {
if(product.getCurrentStock() <= product.getMinStock()) {
// 生成预警记录
InventoryWarning warning = new InventoryWarning();
warning.setProductId(product.getId());
warning.setCurrentStock(product.getCurrentStock());
warning.setThresholdStock(product.getMinStock());
warning.setWarningType(
product.getCurrentStock() == 0 ?
WarningType.STOCK_OUT :
WarningType.LOW_STOCK
);
warning.setStatus(WarningStatus.PENDING);
warningService.save(warning);
}
}
}
5. 项目部署指南
5.1 后端部署步骤
- 安装JDK17并配置环境变量
- 安装MySQL8.0并创建数据库
- 修改application.yml中的数据库配置
- 打包项目:
bash复制mvn clean package -DskipTests
- 运行jar包:
bash复制java -jar inventory-system.jar
5.2 前端部署步骤
- 安装Node.js18和npm
- 安装依赖:
bash复制npm install
- 修改.env文件中的API地址
- 构建生产环境代码:
bash复制npm run build
- 部署dist目录到Nginx
6. 开发经验分享
在实际开发过程中,我总结了以下几个关键点:
-
事务处理:采购入库、销售出库等涉及多表操作的业务一定要添加@Transactional注解,确保数据一致性。我在初期版本中曾因漏加事务导致库存数据不一致的问题。
-
接口幂等性:对于采购退货、销售退货等操作,要设计防重机制。我采用的方案是让前端传递唯一请求ID,服务端做去重校验。
-
性能优化:
- 商品列表接口添加分页查询
- 复杂报表使用缓存
- 批量操作使用Mybatis的批量插入
-
异常处理:自定义BusinessException统一处理业务异常,结合@ControllerAdvice实现全局异常捕获。
这个项目从技术选型到最终上线历时两个月,期间遇到了各种挑战,但最终完成了一个功能完善、性能稳定的进销存系统。对于想学习SpringBoot3和Vue3的开发者来说,这个项目涵盖了大部分企业应用开发的典型场景。