项目名称:烟酒进销存管理系统
公司名称:众诚科技:
作者:刘忠峰
日期:2025年10月27日
项目架构:Spring Boot、MySQL
第一步:创建 Spring Boot 项目
bash
# 使用 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
yaml
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/smoke_wine_erp?useSSL=false&serverTimezone=UTC
username: root
password: 825864
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.zhongcheng_tech.smokewine.entity
configuration:
map-underscore-to-camel-case: true
logging:
level:
com.zhongcheng_tech.smokewine.mapper: debug
第四步:创建实体类(Entity)
1. 商品实体类
java
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. 库存实体类
java
package com.zhongcheng_tech.smokewine.entity;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class Inventory {
private Long id;
private Long productId; // 商品ID
private Integer quantity; // 当前库存
private Integer lockQuantity; // 锁定数量
private LocalDateTime updateTime;
// 关联商品信息(查询时用)
private String productName;
private String productCode;
private String brand;
}
第五步:创建 Mapper 接口
1. 商品 Mapper
java
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
java
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
java
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 {
@Autowired
private 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
java
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 {
@Autowired
private ProductService productService;
// 获取所有商品
@GetMapping
public List<Product> getAllProducts() {
return productService.getAllProducts();
}
// 根据ID获取商品
@GetMapping("/{id}")
public Product getProductById(@PathVariable Long id) {
return productService.getProductById(id);
}
// 新增商品
@PostMapping
public 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 测试:
bash
# 启动项目
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. 盘点管理