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

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

公司名称:众诚科技:

作者:刘忠峰

日期: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. 盘点管理
相关推荐
毕设源码-朱学姐2 小时前
【开题答辩全过程】以 工厂能耗分析平台的设计与实现为例,包含答辩的问题和答案
java·vue.js
Spring AI学习4 小时前
Spring AI深度解析(9/50):可观测性与监控体系实战
java·人工智能·spring
java1234_小锋5 小时前
Spring IoC的实现机制是什么?
java·后端·spring
xqqxqxxq5 小时前
背单词软件技术笔记(V2.0扩展版)
java·笔记·python
消失的旧时光-19435 小时前
深入理解 Java 线程池(二):ThreadPoolExecutor 执行流程 + 运行状态 + ctl 原理全解析
java·开发语言
哈哈老师啊6 小时前
Springboot学生综合测评系统hxtne(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·数据库·spring boot
4311媒体网6 小时前
帝国cms调用文章内容 二开基本操作
java·开发语言·php
zwxu_6 小时前
Nginx NIO对比Java NIO
java·nginx·nio
可观测性用观测云7 小时前
Pyroscope Java 接入最佳实践
java
气π8 小时前
【JavaWeb】——(若依 + AI)-基础学习笔记
java·spring boot·笔记·学习·java-ee·mybatis·ruoyi