项目名称:烟酒进销存管理系统
项目名称:烟酒进销存管理系统
公司名称:众诚科技:
作者:刘忠峰
日期:2025年10月27日
项目架构:Spring Boot、MySQL
第一步:创建 Spring Boot 项目
# 使用 Spring Initializr 创建项目
# 选择依赖:
# - Spring Web
# - MyBatis Framework
# - MySQL Driver
# - Lombok
第二步:项目结构规划
src/main/java/com/zhongcheng_tech/smokewine/
├── entity/ # 实体类
├── mapper/ # MyBatis Mapper
├── service/ # 业务层
├── controller/ # 控制层
└── config/ # 配置类
第三步:配置 application.yml
server:port: 8080spring:datasource:url: jdbc:mysql://localhost:3306/smoke_wine_erp?useSSL=false&serverTimezone=UTCusername: rootpassword: 825864driver-class-name: com.mysql.cj.jdbc.Drivermybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.zhongcheng_tech.smokewine.entityconfiguration:map-underscore-to-camel-case: truelogging:level:com.zhongcheng_tech.smokewine.mapper: debug
第四步:创建实体类(Entity)
1. 商品实体类
package com.zhongcheng_tech.smokewine.entity;import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;@Data
public class Product {private Long id;private String productCode; // 商品编码private String productName; // 商品名称private String brand; // 品牌private String category; // 分类:烟/酒private String spec; // 规格private String unit; // 单位private BigDecimal purchasePrice; // 进货价private BigDecimal salePrice; // 销售价private Integer minStock; // 最低库存预警private Integer status; // 状态:1-正常 0-停用private LocalDateTime createTime;
}
2. 库存实体类
package com.zhongcheng_tech.smokewine.entity;import lombok.Data;
import java.time.LocalDateTime;@Data
public class Inventory {private Long id;private Long productId; // 商品IDprivate Integer quantity; // 当前库存private Integer lockQuantity; // 锁定数量private LocalDateTime updateTime;// 关联商品信息(查询时用)private String productName;private String productCode;private String brand;
}
第五步:创建 Mapper 接口
1. 商品 Mapper
package com.zhongcheng_tech.smokewine.mapper;import com.zhongcheng_tech.smokewine.entity.Product;
import org.apache.ibatis.annotations.*;import java.util.List;@Mapper
public interface ProductMapper {// 查询所有商品@Select("SELECT * FROM product WHERE status = 1 ORDER BY create_time DESC")List<Product> findAll();// 根据ID查询商品@Select("SELECT * FROM product WHERE id = #{id}")Product findById(Long id);// 新增商品@Insert("INSERT INTO product(product_code, product_name, brand, category, spec, unit, purchase_price, sale_price, min_stock) " +"VALUES(#{productCode}, #{productName}, #{brand}, #{category}, #{spec}, #{unit}, #{purchasePrice}, #{salePrice}, #{minStock})")@Options(useGeneratedKeys = true, keyProperty = "id")int insert(Product product);// 更新商品@Update("UPDATE product SET product_name=#{productName}, brand=#{brand}, category=#{category}, spec=#{spec}, " +"unit=#{unit}, purchase_price=#{purchasePrice}, sale_price=#{salePrice}, min_stock=#{minStock} " +"WHERE id=#{id}")int update(Product product);// 删除商品(软删除)@Update("UPDATE product SET status = 0 WHERE id = #{id}")int delete(Long id);
}
2. 库存 Mapper
package com.zhongcheng_tech.smokewine.mapper;import com.zhongcheng_tech.smokewine.entity.Inventory;
import org.apache.ibatis.annotations.*;import java.util.List;@Mapper
public interface InventoryMapper {// 查询库存列表(关联商品信息)@Select("SELECT i.*, p.product_name, p.product_code, p.brand " +"FROM inventory i " +"LEFT JOIN product p ON i.product_id = p.id " +"WHERE p.status = 1")List<Inventory> findAllWithProduct();// 根据商品ID查询库存@Select("SELECT * FROM inventory WHERE product_id = #{productId}")Inventory findByProductId(Long productId);// 更新库存数量@Update("UPDATE inventory SET quantity = #{quantity}, update_time = NOW() WHERE id = #{id}")int updateQuantity(Inventory inventory);// 锁定库存@Update("UPDATE inventory SET lock_quantity = lock_quantity + #{lockQuantity} WHERE product_id = #{productId}")int lockInventory(Long productId, Integer lockQuantity);
}
第六步:创建 Service 层
1. 商品 Service
package com.zhongcheng_tech.smokewine.service;import com.zhongcheng_tech.smokewine.entity.Product;
import com.zhongcheng_tech.smokewine.mapper.ProductMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class ProductService {@Autowiredprivate ProductMapper productMapper;public List<Product> getAllProducts() {return productMapper.findAll();}public Product getProductById(Long id) {return productMapper.findById(id);}public boolean addProduct(Product product) {// 检查商品编码是否重复return productMapper.insert(product) > 0;}public boolean updateProduct(Product product) {return productMapper.update(product) > 0;}public boolean deleteProduct(Long id) {return productMapper.delete(id) > 0;}
}
第七步:创建 Controller 层
1. 商品 Controller
package com.zhongcheng_tech.smokewine.controller;import com.zhongcheng_tech.smokewine.entity.Product;
import com.zhongcheng_tech.smokewine.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/api/products")
public class ProductController {@Autowiredprivate ProductService productService;// 获取所有商品@GetMappingpublic List<Product> getAllProducts() {return productService.getAllProducts();}// 根据ID获取商品@GetMapping("/{id}")public Product getProductById(@PathVariable Long id) {return productService.getProductById(id);}// 新增商品@PostMappingpublic String addProduct(@RequestBody Product product) {boolean result = productService.addProduct(product);return result ? "商品添加成功" : "商品添加失败";}// 更新商品@PutMapping("/{id}")public String updateProduct(@PathVariable Long id, @RequestBody Product product) {product.setId(id);boolean result = productService.updateProduct(product);return result ? "商品更新成功" : "商品更新失败";}// 删除商品@DeleteMapping("/{id}")public String deleteProduct(@PathVariable Long id) {boolean result = productService.deleteProduct(id);return result ? "商品删除成功" : "商品删除失败";}
}
第八步:测试接口
启动项目后,用 Postman 测试:
# 启动项目
mvn spring-boot:run# 测试接口
GET http://localhost:8080/api/products # 获取所有商品
GET http://localhost:8080/api/products/1 # 获取单个商品
POST http://localhost:8080/api/products # 新增商品
PUT http://localhost:8080/api/products/1 # 更新商品
DELETE http://localhost:8080/api/products/1 # 删除商品
建议的开发顺序:
- 商品管理 → 2. 库存查询 → 3. 采购入库 → 4. 销售出库 → 5. 盘点管理
