springboot vue 开源 会员收银系统 (4) 分类及商品模块开发

news2024/11/15 14:03:39

前言

完整版演示

前面我们对会员系统 门店模块开发的开发 完成了门店的基础管理 并与会员相关联

下面我们将开发门店的分类及商品管理 我们分析以下几个重点

  • 分类可以随时禁用不用单独下架某个商品便于管理
  • 商品添加应该有图片上传
  • 商品设置会员价和散客价便于营销
  • 商品应该参与库存管理 不参与管理的设置字段标明(相关字段加锁)
  • 商品应该有上下架功能
  • 商品加上提成相关设置 便于计算工资
  • 商品加上逻辑删除功能 防止后续统计无法取到原始值
  • 商品等敏感进行修改时应该进行记录防止恶意操作

下面开始字段设计

分类表

CREATE TABLE `business_category` (
  `CATEGORY_ID` varchar(32) NOT NULL COMMENT '分类id',
  `CATEGORY_NAME` varchar(255) DEFAULT NULL COMMENT '分类名',
  `CREATE_NAME` varchar(255) DEFAULT NULL COMMENT '创建人',
  `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
  `CREATE_ID` varchar(32) DEFAULT NULL COMMENT '创建人id',
  `UPDATE_TIME` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `UPDATE_NAME` varchar(255) DEFAULT NULL COMMENT '修改人',
  `UPDATE_ID` varchar(32) DEFAULT NULL COMMENT '修改人id',
  `CATEGORY_STATUS` tinyint(2) DEFAULT '0' COMMENT '0正常 1禁用',
  `SHOP_ID` varchar(32) DEFAULT NULL COMMENT '门店id',
  `SHOP_NAME` varchar(255) DEFAULT NULL COMMENT '门店名',
  PRIMARY KEY (`CATEGORY_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分类';

商品表

CREATE TABLE `business_product` (
  `PRODUCT_ID` varchar(32) NOT NULL COMMENT '商品id',
  `CATEGORY_ID` varchar(32) DEFAULT NULL COMMENT '分类id',
  `CATEGORY_NAME` varchar(255) DEFAULT NULL COMMENT '分类名',
  `PRODUCT_NAME` varchar(255) DEFAULT NULL COMMENT '商品名',
  `PRODUCT_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '商品金额',
  `PRODUCT_MEMBER_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '商品会员金额',
  `PRODUCT_IMAGE` varchar(255) DEFAULT NULL COMMENT '商品图片',
  `PRODUCT_COUNT` bigint(20) DEFAULT NULL COMMENT '库存数量',
  `PUSH_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '提成金额',
  `PUSH_PERCENT` varchar(255) DEFAULT NULL COMMENT '提成比例',
  `PRODUCT_STATUS` tinyint(2) DEFAULT '0' COMMENT '0正常 1下架',
  `VERSION` bigint(10) DEFAULT '0' COMMENT '乐观锁字段',
  `DELETED` tinyint(2) DEFAULT '0' COMMENT '0正常 1删除',
  `SHOP_ID` varchar(32) DEFAULT NULL COMMENT '门店id',
  `SHOP_NAME` varchar(255) DEFAULT NULL COMMENT '门店名',
  `CREATE_NAME` varchar(255) DEFAULT NULL COMMENT '创建人',
  `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
  `CREATE_ID` varchar(32) DEFAULT NULL COMMENT '创建人id',
  `UPDATE_TIME` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `UPDATE_NAME` varchar(255) DEFAULT NULL COMMENT '修改人',
  `UPDATE_ID` varchar(32) DEFAULT NULL COMMENT '修改人id',
  PRIMARY KEY (`PRODUCT_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品';

代码开发

在开发之前我们顺带完成文件上传功能
关键代码

   public FileVo uploadFile(MultipartFile file, String fileSavePath) {
        //需要返回的对象
        FileVo fileVo = new FileVo();

        //生成文件的唯一id
        String fileId = IdWorker.get32UUID();
        fileVo.setFileId(fileId);

        //获取文件后缀
        String fileSuffix = ToolUtil.getFileSuffix(file.getOriginalFilename());
        fileVo.setFileSuffix(fileSuffix);

        //获取文件原始名称
        String originalFilename = file.getOriginalFilename();
        fileVo.setOriginalFilename(originalFilename);

        //生成文件的最终名称
        String finalName = fileId + "." + ToolUtil.getFileSuffix(originalFilename);
        fileVo.setFinalName(finalName);
        fileVo.setFileSavePath(fileSavePath + finalName);

        String sysUploadPath = getSysUploadPath();

        String newFileSavePath = "";

        //判断有没有结尾符,没有得加上
        if (!fileSavePath.endsWith(java.io.File.separator)) {
            newFileSavePath = fileSavePath + java.io.File.separator;
        }

        try {
            java.io.File filepath = new java.io.File(sysUploadPath + newFileSavePath );
            //该目录不存在 则创建
            if (!filepath.exists()) {
                boolean mkdirs = filepath.mkdirs();
            }

            //保存文件到指定目录
            java.io.File newFile = new java.io.File(sysUploadPath + newFileSavePath + finalName);
            file.transferTo(newFile);

            File fileInfo = new File();
            //保存文件信息
            fileInfo.setFileId(fileId);
            fileInfo.setFileName(originalFilename);
            fileInfo.setFileSuffix(fileSuffix);

            fileInfo.setFilePath("/upload/" + fileSavePath + "/" + finalName);

            fileVo.setFileSavePath(fileInfo.getFilePath());
            fileInfo.setFinalName(finalName);

            //计算文件大小kb
            long kb = new BigDecimal(file.getSize())
                    .divide(BigDecimal.valueOf(1024))
                    .setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
            fileInfo.setFileSizeKb(kb);
            fileInfo.setFileSysPath(newFile.getAbsolutePath());

            save(fileInfo);
        } catch (Exception e) {
            log.error("上传文件错误!", e);
            throw new ApiException("上传文件错误!");
        }
        return fileVo;
    }

其实很简单

  • 提前维护好地址 设置保存路径
  • 将上传后的图片地址保存在数据库中
  • 业务表存图片id 随后进行地址转换

然后参考我们之前写的

vue element upload上传组件 裁剪后上传

进行业务完善
添加商品
商品列表

代码地址
https://gitee.com/ddeatrr/memberShop

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1685596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决updateByExample时属性值异常的问题(部分属性值没有使用占位符?进行占位,而是变成了属性的名称)

目录 场景简介代码片断实体类 报错信息排查原因解决测试过程解决方案 场景简介 1、程序将mybatis框架升级为3.5.9版本后执行updateByExample方法时报错 代码片断 Condition condition new Condition(MbCcsSessionConfig.class); condition.createCriteria().andEqualTo(&quo…

[STM32-HAL库]Flash库-HAL库-复杂数据读写-STM32CUBEMX开发-HAL库开发系列-主控STM32F103C6T6

目录 一、前言 二、实现步骤 1.STM32CUBEMX配置 2.导入Flash库 3.分析地址范围 4.找到可用的地址 5.写入读取普通数据 6.写入读取字符串 6.1 存储相关信息 6.2 存取多个参数 三、总结及源码 一、前言 在面对需要持久化存储的数据时,除了挂载TF卡,我们…

【线段图案】

描述 KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的线段图案。 输入描述: 多组输入,一个整数(1~100),表示线段长度,即“*”的数量。 输出描述…

.NET Core Web Api Swagger运行异常

遇到的问题 因为新增了一个控制器方法,从而导致在运行Swagger的时候直接报错,异常如下: SwaggerGeneratorException: Conflicting method/path combination "POST api/UserOperationExample" for actions - WebApi.Controllers.Us…

HCIP-Datacom-ARST自选题库__MPLS简答【4道题】

1.如图所示,R1、R2、R3、R4处于同一个MPLS域,且设备之间采用LDP分配MPLS标签,R4为4.4.4.0/24这条FEC的EgressLSR。若想实现R1访问4.4.4.0/24时,R4不需要查询标签表但能够了解该数据的转发优先级,则R3对于该FEC的出标签…

Linux中vim的基本使用

目录 vim中的三种模式以及基本操作命令模式(默认模式)插入模式底行模式 命令模式下的命令底行模式下的命令 vim是Linux和Unix环境下最基本的文本编辑器,类似于windows上的记事本 vim和Visual studio相比,vim并不集成,vim只能用来写代码 VS把写…

第六节 自动装配源码理解

tips:不同版本代码实现有差异。 前面两章了解的流程,就是 SpringBoot 自动转配的核心。 一、自动装配 1.1 什么是 SpringBoot 自动装配? 自动装配是 Spring 框架用来减少配置的显式需求而引入的一个特性,该特性通过 Autowired或者Resource…

Unity Terrain Adjust插件使用教程

一、Terrain Adjust插件介绍 二、插件下载以及导入 1、官方下载地址:Terrain Adjust 2、积分下载地址:Terrain Adjust 下载好之后,回到Unity当中,导入下载好之后的unitypackage包 三、插件使用 1、在使用之前一定要在场景中新…

KuberSphere 安装kubernates

准备机器 最少3台机器 centos Linux 内核&#xff1a;官方建议 3.10 以上 uname -rcontrol 一台 配置 2c 4g worker 二台 配置 2c 4g 3台设备需要用不同的hostname&#xff0c;需要提前修改 hostnamectl set-hostname <新的主机名> # 修改后执行一下命令刷新一下 su -…

【Android】联系人列表补充

真布局--叠起来垂直管 效果展示 部分代码&#xff08;在activity_main&#xff09;里面 <FrameLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"…

自动驾驶决策规划——坐标转换

以下内容来自b站up主忠厚老实的老王&#xff0c;视频链接&#xff1a;自动驾驶决策规划算法序章 总纲与大致目录_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1hP4y1p7es/?spm_id_from333.999.0.0&vd_sourced36e625f376908cfa88ef5ecf2fb0ed8侵删。 决策规划算法…

解除网页禁止选择

控制台输入以下命令 复制&#xff1a;javascript:void(document.body.οncοpy) 可选&#xff1a;javascript:void(document.body.onselectstart) 拖拉&#xff1a;javascript:void(document.body.οnmοuseup)

SecureFX 9.5.2 SecureCRT 9.5.2 官方下载

SecureCRT是一款由VanDyke Software公司开发的终端仿真软件&#xff0c;它提供了类似于Telnet和SSH等协议的远程访问功能。SecureCRT专门为网络管理员、系统管理员和其他需要保密访问网络设备的用户设计。 SecureCRT具有以下特点&#xff1a; 安全性&#xff1a;SecureCRT支持…

什么是安全左移如何实现安全左移

文章目录 一、传统软件开发面临的安全挑战二、什么是安全左移四、安全左移与安全开发生命周期&#xff08;SDL&#xff09;三、安全左移对开发的挑战五、从DevOps到DevSecOps六、SDL与DevSecOps 一、传统软件开发面临的安全挑战 传统软件开发面临的安全挑战主要包括以下几个方…

Stanford-Coursera 算法Week1 笔记

题外话&#xff1a;全文免费放心食用&#xff0c;作者在此求个 三连关注 1. Integer Multiplication&#xff08;引入&#xff09; &#xff08;很小的时候我们就学过&#xff1a;两个数字相乘的算法——将输入(两个数字)转换为输出(它们的乘积)的一组定义良好的规则&#xf…

MVSnet 代码详解(pytorch)

大致过一下MVSnet 论文中核心的点对应代码应该怎么写。 forward 函数需要 照片&#xff0c;映射矩阵&#xff0c;以及深度值。 照片的shape是 &#xff08;1&#xff0c;5,3&#xff0c;1184,1600&#xff09;代表着1个batch,5张图片&#xff0c;然后一次是每张图片的channel和…

LeetCode547省份数量

题目描述 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a 与城市 c 间接相连。省份 是一组直接或间接相连的城市&#xff0c;组内不含其他没有相连的城市。给…

彩色进度条(C语言版本)

.h文件 #include<stdio.h> #include<windows.h>#define NUM 101 #define LOAD_UP 50 #define LOAD_DOWN 60 #define SLEEP_SLOW 300 #define SLEEP_FAST 70 版本1&#xff1a;&#xff08;初始版&#xff09; //v1 #include "progress.h" int main() …

使用 Sonatype Nexus Repository Manager 如何安装npm.md

1. 安装与启动 Nexus2. 登录 Nexus Web UI3. 创建 npm 仓库4. &#xff08;可选&#xff09;配置 npm 代理仓库5. 创建 npm 仓库组6. 配置 npm 客户端7. 测试和使用 Sonatype Nexus Repository Manager (通常简称 Nexus) 是一个强大的二进制管理系统&#xff0c;用于存储和管理…

北京大学肖臻老师《区块链技术与应用》P20(挖矿难度调整)和P21(权益证明)

1️⃣ 参考 北京大学肖臻老师《区块链技术与应用》 P20 - ETH挖矿难度调整篇P21 - ETH权益证明篇 2️⃣0️⃣ ETH挖矿难度调整 在ETH中最长合法链也是最难合法链&#xff08;Total Difficulty&#xff09; 比特币与以太坊难度的宏观比较 比特币以太坊调整难度隔2016个区块…