项目名称:烟酒进销存管理系统

项目名称:烟酒进销存管理系统

公司名称:众诚科技:

作者:刘忠峰

日期: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        # 删除商品

建议的开发顺序:

  1. 商品管理 → 2. 库存查询 → 3. 采购入库 → 4. 销售出库 → 5. 盘点管理
相关推荐
纪莫3 小时前
技术面:SpringBoot(启动流程、如何优雅停机)
java·spring·java面试⑧股
Merrick3 小时前
亲手操作Java抽象语法树
java·后端
初级程序员Kyle3 小时前
开始改变第三天 Java并发(1)
java·后端
熊小猿4 小时前
如何在 Spring Boot 项目中使用 @Slf4j 注解结合 Logback 进行系统日志管理
java·开发语言·spring boot
豐儀麟阁贵4 小时前
5.4静态变量和静态方法
java·开发语言
ytgytg285 小时前
芋道源码:VUE3部署:避坑--验证码不现显示,管理后台无法访问后端接口等,完善中。。。
java·vue
乾坤瞬间5 小时前
【Java后端进行ai coding实践系列】如何使用ai coding实现计划任务增删改查
java·人工智能·python
昔我往昔5 小时前
@ApiModel注解升级成@Schema注解
java
superlls5 小时前
(场景题)Java 导出 Excel 的两种方式
java·开发语言·后端·excel