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

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

公司名称:众诚科技:

作者:刘忠峰

日期: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. 盘点管理
相关推荐
Cherry的跨界思维7 分钟前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
alonewolf_9944 分钟前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
一嘴一个橘子1 小时前
spring-aop 的 基础使用(啥是增强类、切点、切面)- 2
java
sheji34161 小时前
【开题答辩全过程】以 中医药文化科普系统为例,包含答辩的问题和答案
java
恋爱绝缘体11 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
wszy18092 小时前
新文章标签:让用户一眼发现最新内容
java·python·harmonyos
wszy18092 小时前
顶部标题栏的设计与实现:让用户知道自己在哪
java·python·react native·harmonyos
程序员小假3 小时前
我们来说一下无锁队列 Disruptor 的原理
java·后端
资生算法程序员_畅想家_剑魔3 小时前
Kotlin常见技术分享-02-相对于Java 的核心优势-协程
java·开发语言·kotlin
ProgramHan3 小时前
Spring Boot 3.2 新特性:虚拟线程的落地实践
java·jvm·spring boot