当前位置: 首页 > news >正文

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

项目名称:烟酒进销存管理系统
公司名称:众诚科技:
作者:刘忠峰
日期: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        # 删除商品

建议的开发顺序:

  1. 商品管理 → 2. 库存查询 → 3. 采购入库 → 4. 销售出库 → 5. 盘点管理
http://www.dtcms.com/a/536172.html

相关文章:

  • web开发,在线%蛋糕销售%管理系统,基于asp.net,webform,c#,sql server
  • UE5 蓝图-25:主 mainUI界面蓝图,右侧的颜色按钮的实现,换色逻辑与材质参数集,
  • 腾讯优图开源Youtu-Embedding通用文本表示模型,用处在哪?
  • parser_error UnicodeDecodeError: ‘utf-8‘ codec can‘t decode bytes
  • 慕课网站开发wordpress 当前页面登录密码
  • 从零学习 Agentic RL(四)—— 超越 ReAct 的线性束缚:深入解析 Tree-of-Thoughts (ToT)
  • 宁德城乡建设网站首页无法删除wordpress
  • Spring Boot3零基础教程,天气 API 测试,笔记73
  • 基于 STM32 的智能语音唤醒与关键词识别系统设计 —— 从硬件集成到算法实现
  • Redis数据库基础命令
  • 1.3 StorageTransient的gas计算
  • 物联网技术与基础第六节上课笔记
  • SAP SD系统开票查询报表分享
  • it网站设计培训制作网站的工具
  • 南京网站建设工作室电商卖什么产品有前景
  • iOS 开发推送功能全流程详解 从 APNs 配置到上架发布的完整实践(含跨平台上传方案)
  • 李宏毅机器学习笔记33
  • 深入理解Bitbucket Pipelines:强大的CICD开源解决方案
  • Android 14 系统启动流程深度解析:rc文件的语法、解析及常见语法详解
  • 商城网站的seo优化改怎么做软件公司 网站建设费分录
  • 免费做淘宝客网站有哪些石家庄网站优化推广
  • 【瑆箫】正式入驻爱发电平台
  • 第三十三篇:贪心算法(二):区间调度与跳跃游戏
  • 美颜SDK跨平台适配实战解析:让AI美颜功能在iOS与Android都丝滑运行
  • 条款24:区分通用引用和右值引用
  • zookeeper + kafka
  • 旅游网站建设与规划网站可以做被告嘛
  • 医护上门系统开发的关键技术解析与实践指南
  • 大模型-模型压缩:量化、剪枝、蒸馏、二值化 (3
  • Win10结束支持后,Linux发行版ZorinOS下载量两天破10w?怎么安装?