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

前言

完整版演示

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

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

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

下面开始字段设计

分类表

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【工具分享】Annabelle勒索病毒解密工具

前言 Annabelle勒索病毒灵感来自恐怖电影系列 Annabelle。除了文件加密功能外,Annabelle 勒索软件还会试图禁用防火墙,强制停止一系列正在运行程序,通过连接的 USB 驱动器进行传播。 特征 勒索内容: Annabelle 使用 AES256 CBC 加…

喜讯!宝兰德斩获2024数字中国创新大赛·信创赛道全国总决赛三等奖

5月24日,由国家发展和改革委员会、国家数据局、国家互联网信息办公室、科学技术部、国务院国有资产监督管理委员会和福建省人民政府共同主办的2024数字中国创新大赛信创赛道全国总决赛颁奖典礼暨闭幕式大会在福州海峡国际会展中心圆满落幕。依托专业技术研发能力及丰…

IP地址在广告行业中的重要地位

新时代,广告已经成为了企业推广产品的必要手段,而企业想要广告效果好,就要做到精准投放营销广告,将“花钱”的广告精准送到产品的受众用户面前,让收益大于花销,而归根究底就是广告转化率与回报率是否达到预…

SwiftUI中TabView的基本用法及外观样式设置

TabView提供了一个交互式界面,允许用户在其内部的子界面间自由的切换,TabView有两种显示模式,一个是DefaultTabViewStyle,另一个是PageTabViewStyle,本文将对DefaultTabViewStyle这种类型的基本使用和外观样式设置进行…

Android消息机制回顾(Handler、Looper、MessageQueue源码解析)

回顾: Android消息机制 Android消息机制主要指的是Handler的运行机制以及Handler所附带的MessageQueue和Looper的工作机制。 介绍 通过Handler 消息机制来解决线程之间通信问题,或者用来切换线程。特别是在更新UI界面时,确保了线程间的数…

Swift使用JSONDecoder处理json数据,实现json序列化和反序列化

Json数据处理是开发中不可获取的一项技能,如果你不会处理json数据,那你离失业就不远了,所以学完了swift基础教程,还是先老老实实学习一下json处理吧,有了这项技能,你才可以继续下一个网络请求阶段的开发&am…

C++第二十弹---深入理解STL中vector的使用

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、vector的介绍 2、vector的使用 2.1、构造函数和赋值重载 2.1.1、构造函数的介绍 2.1.2、代码演示 2.2、容量操作 2.3、遍历 2.4、增删…

类和对象(上)【有关类的全面学习】【this指针的学习】

类和对象(上) 1.面向过程和面向对象初步认识 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C语言注重过程: C是基于面向对象的,关注的是对象&#xff0…

如何获取某个城市或区域的人口分布数据?

人口分布数据在多个领域都扮演着至关重要的角色。这些数据不仅反映了一个国家或地区的人口分布状况,而且为政策制定者、企业决策者和研究者提供了宝贵的信息。那么,我们如何获取这些重要的人口分布数据呢? 政府统计部门是最主要的来源。各国政…

绝缘鞋计量校准周期多长时间合适?校验检测方法是什么?

绝缘鞋的计量校准,通常是应用在电学相关领域,因此也是属于计量校准机构中的电学室管辖的范围,而绝缘鞋为了安全防护,也是采用了绝缘材料,其标准要求耐电压至少在15KV以下,可应用于工频(50到60F&…

git 检查用户是否是gitlab用户

背景: 公司代码要从老的git库迁到新的git库,老git库上部分提交用户在新git库上没有,解决方法: 让gitlab不再检查提交用户是否是gitlab用户。具体操作: 去掉下面的勾选,保存配置即可。

天气的雪碧图标(晴天,雨天,雪天,阴天,雾天,多云等)(2024-05-27)

天气的预览图标,可以自行下载,或者在资源中下载高清的

Matlab进阶绘图第57期—带填充纹理的横向柱状图

带填充纹理的横向柱状图是通过在原始横向柱状图的基础上添加不同的纹理得到的,可以很好地解决由于颜色区分不足而导致的对象识别困难问题。 由于Matlab中未提供纹理填充选项,因此需要大家自行设法解决。 本文使用Kesh Ikuma制作的hatchfill2工具&#…

buu[HCTF 2018]WarmUp(代码审计)

buu[HCTF 2018]WarmUp&#xff08;代码审计&#xff09; 题目 访问source.php <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php…

屎山代码SSM转换Springboot

SSM项目转Springboot项目 最近很多人可能是在网上买的那种屎山代码&#xff0c;数据库都是拼音的那种 比如项目如下所示&#xff1a; 这种屎山代码我改过太多了&#xff0c;很多人可能无从下手&#xff0c;因为代码结构太混乱了&#xff0c;但是我改过太多这种代码&#xff0…

【SpeedAI科研小助手】2分钟解决知网维普AIGC检测

2分钟搞定AIGC率&#xff1f;还能降到0%&#xff1f; 使用方法&#xff1a; 打开SpeedAI科研小助手&#xff0c;将功能模式换成降AIGC率&#xff0c;后面可以一段一段自己改&#xff0c;也可以直接上传论文文件&#xff0c;SpeedAI直接帮你全文修改&#xff08;主打一个用户友…

【云原生】kubernetes中的认证、权限设置---RBAC授权原理分析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…