《尚品甄选》:后台系统——商品管理,对商品数据进行维护(debug一遍)

文章目录

  • 一、表结构介绍
  • 二、列表查询
  • 三、添加功能(复杂)
    • 3.1 加载品牌数据
    • 3.2 加载商品单元数据
    • 3.3 加载商品规格数据
    • 3.4 保存商品数据
  • 四、修改功能
    • 4.1 查询商品详情
    • 4.2 保存修改数据
  • 五、删除商品
  • 六、商品审核
  • 七、商品上下架

一、表结构介绍

商品管理就是对电商项目中所涉及到的商品数据进行维护,其所对应的表结构如下所示:

CREATE TABLE `product` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '商品名称',
  `brand_id` bigint DEFAULT NULL COMMENT '品牌ID',
  `category1_id` bigint DEFAULT NULL COMMENT '一级分类id',
  `category2_id` bigint DEFAULT NULL COMMENT '二级分类id',
  `category3_id` bigint DEFAULT NULL COMMENT '三级分类id',
  `unit_name` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '计量单位',
  `slider_urls` text COMMENT '轮播图',
  `spec_value` varchar(255) DEFAULT NULL COMMENT '商品规格json',
  `status` tinyint NOT NULL DEFAULT '0' COMMENT '线上状态:0-初始值,1-上架,-1-自主下架',
  `audit_status` tinyint NOT NULL DEFAULT '0' COMMENT '审核状态:0-初始值,1-通过,-1-未通过',
  `audit_message` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '审核信息',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `is_deleted` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记(0:可用 1:不可用)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='商品'

二、列表查询

需求说明:
如果在搜索表单中选择了某一个品牌以及分类,那么此时就需要按照品牌id和分类id进行查询;搜索的时候需要进行分页搜索。前端进行参数传递的时候,不一定会传递搜索条件,因此sql语句的编写需要使用到动态sql
在这里插入图片描述
debug到controller层,可以看到拿到了品牌id值2,对应的就是品牌华为
在这里插入图片描述
在业务层进行分页查询,通过查询结果可知,只查询到了一条数据。并且返回了商品名称、二级、三级分类名称等信息
在这里插入图片描述
SQL复杂在多表查询,因为要查询一级、二级、三级分类,所以有些复杂,SQL代码如下:

<!--    List<Product> findByPage(ProductDto productDto);-->
    <select id="findByPage" resultType="com.atguigu.spzx.model.entity.product.Product">
        select
        p.id, p.name , p.brand_id , p.category1_id , p.category2_id , p.category3_id, p.unit_name,
        p.slider_urls , p.spec_value , p.status , p.audit_status , p.audit_message , p.create_time , p.update_time ,
        p.is_deleted ,
        b.name brandName , c1.name category1Name , c2.name category2Name , c3.name category3Name
        from product p
        LEFT JOIN brand b on b.id = p.brand_id
        LEFT JOIN category c1 on c1.id = p.category1_id
        LEFT JOIN category c2 on c2.id = p.category2_id
        LEFT JOIN category c3 on c3.id = p.category3_id
        <where>
            p.is_deleted = 0
            <if test="brandId != null and brandId != ''">
                and p.brand_id = #{brandId}
            </if>
            <if test="category1Id != null and category1Id != ''">
                and p.category1_id = #{category1Id}
            </if>
            <if test="category2Id != null and category2Id != ''">
                and p.category2_id = #{category2Id}
            </if>
            <if test="category3Id != null and category3Id != ''">
                and p.category3_id = #{category3Id}
            </if>
        </where>
        order by id desc
    </select>

三、添加功能(复杂)

需求说明:
当用户点击添加按钮的时候,在对话框中需要展示添加商品的表单。当用户在该表单中点击提交按钮的时候那么此时就需要将表单进行提交,在后端需要将提交过来的表单数据保存到数据库中。通过业务分析,我们需要在添加功能中完成四个接口:加载品牌数据接口加载商品单元数据接口加载商品规格数据接口保存商品数据接口。接下来让我们一个一个完成接口的需求分析和debug分析。

在这里插入图片描述
在这里插入图片描述

3.1 加载品牌数据

需求: 当用户选择了三级分类以后,此时需要将三级分类所对应的品牌数据查询出来,并在品牌下拉框中进行展示

这个接口还是比较简单的,来到controller层,获取到分类id值694
在这里插入图片描述
业务层调用分类品牌表mapper接口,查询到品牌数据,放到list接口中
在这里插入图片描述
对应的SQL如下,这里设计到两表查询

    <!--    List<Brand> findBrandByCategoryId(Long categoryId);-->
    <select id="findBrandByCategoryId" resultType="com.atguigu.spzx.model.entity.product.Brand">
        select b.*
        from category_brand cb
        left join brand b
            on b.id = cb.brand_id
        where cb.category_id = #{categoryId} and b.is_deleted = 0
        order by cb.id desc
    </select>

3.2 加载商品单元数据

需求: 当添加商品的表单对话框展示出来以后,此时就需要从数据库中查询出来所有的商品单元数据,并将查询到的商品单元数据在商品单元下拉框中进行展示。

这个接口也很简单,就是查询所有数据的操作。
在这里插入图片描述
在这里插入图片描述
SQL代码编写如下:

    @Select("select * from product_unit where is_deleted = 0 order by id")
    List<ProductUnit> findAll();

3.3 加载商品规格数据

需求: 当添加商品的表单对话框展示出来以后,此时就需要从数据库中查询出来所有的商品规格数据,并将查询到的商品规格数据在商品规格下拉框中进行展示。

controller层代码如下:
在这里插入图片描述
这里是业务层代码:
在这里插入图片描述
SQL语句如下:

    @Select("select * from product_spec where is_deleted = 0 order by id")
    List<ProductSpec> findAll();

3.4 保存商品数据

这个接口比较复杂,思路分析:

  • 前端提交过来的数据,包含了SPU的基本数据,SKU的列表数据,商品详情数据
    后端可以直接使用Product接收请求参数,但是需要扩展对应的属性
    保存数据的时候需要操作三张表: product、product_sku、product_detail

添加测试信息如下图:
在这里插入图片描述
在这里插入图片描述
提交表格,debug到controller层,可以看到提交过来的参数信息
在这里插入图片描述
业务层首先是保存商品数据
在这里插入图片描述
接着保存商品sku数据
在这里插入图片描述
最后保存商品详情数据
在这里插入图片描述
这里的SQL语句不是很难,三个SQL语句代码如下:

    <!--    void save(Product product);-->
    <insert id="save">
        insert into product
        values (#{id}, #{name}, #{brandId}, #{category1Id}, #{category2Id}, #{category3Id}, #{unitName},
                #{sliderUrls}, #{specValue}, #{status}, #{auditStatus}, #{auditMessage}, now(), now(), 0)
    </insert>
    <!--    void save(ProductSku productSku);-->
    <insert id="save">
        insert into product_sku
        values (#{id}, #{skuCode}, #{skuName}, #{productId}, #{thumbImg}, #{salePrice}, #{marketPrice}, #{costPrice},
                #{stockNum}, #{saleNum}, #{skuSpec}, #{weight}, #{volume}, #{status}, now(), now(), 0)
    </insert>
    <!--    void save(ProductDetails productDetails);-->
    <insert id="save">
        insert into product_details
        values (#{id}, #{productId}, #{imageUrls}, now(), now(), 0)
    </insert>

四、修改功能

需求分析: 当用户点击修改按钮的时候,那么此时就弹出对话框,在该对话框的商品表单中回显商品相关数据,此时用户对商品数据进行修改,修改完毕以后点击提交按钮将表单进行提交,后端服务修改数据库中数据即可。这里的业务处理思路跟添加商品类似,主要是SQL语句编写的区别。涉及到两个接口:查询商品详情接口保存修改数据接口

4.1 查询商品详情

controller层获取到要修改商品的id值
在这里插入图片描述
业务层涉及到三个查询语句:根据id查询商品数据、根据商品的id查询sku数据、根据商品的id查询商品详情数据,最后返回数据。
在这里插入图片描述
查询数据的三个SQL语句编写如下,难度不大。

<!--Product selectById(Long id);-->
    <select id="selectById" resultType="com.atguigu.spzx.model.entity.product.Product">
        select p.id,
               p.name,
               p.brand_id,
               p.category1_id,
               p.category2_id,
               p.category3_id,
               p.unit_name,
               p.slider_urls,
               p.spec_value,
               p.status,
               p.audit_status,
               p.audit_message,
               p.create_time,
               p.update_time,
               p.is_deleted,
               b.name  brandName,
               c1.name category1Name,
               c2.name category2Name,
               c2.name category3Name
        from product p
                 LEFT JOIN brand b on b.id = p.brand_id
                 LEFT JOIN category c1 on c1.id = p.category1_id
                 LEFT JOIN category c2 on c2.id = p.category2_id
                 LEFT JOIN category c3 on c3.id = p.category3_id
        where p.id = #{id}
          and p.is_deleted = 0
    </select>
    <!--    List<ProductSku> selectByProductId(Long id);-->
    <select id="selectByProductId" resultType="com.atguigu.spzx.model.entity.product.ProductSku">
        select *
        from product_sku
        where product_id = #{productId}
          and is_deleted = 0
        order by id desc
    </select>
    <!--    ProductDetails selectByProductId(Long id);-->
    <select id="selectByProductId" resultType="com.atguigu.spzx.model.entity.product.ProductDetails">
        select *
        from product_details
        where product_id = #{productId}
          and is_deleted = 0
    </select>

4.2 保存修改数据

controller层用来接收表单数据
在这里插入图片描述
业务层逻辑与查询一致
在这里插入图片描述
修改的三个SQL语句看着多,其实不难的

<!--    void updateById(Product product);-->
    <update id="updateById">
        update product set
        <if test="name != null and name != ''">
            name = #{name},
        </if>
        <if test="brandId != null and brandId != ''">
            brand_id = #{brandId},
        </if>
        <if test="category1Id != null and category1Id != ''">
            category1_id = #{category1Id},
        </if>
        <if test="category2Id != null and category2Id != ''">
            category2_id = #{category2Id},
        </if>
        <if test="category3Id != null and category3Id != ''">
            category3_id = #{category3Id},
        </if>
        <if test="unitName != null and unitName != ''">
            unit_name = #{unitName},
        </if>
        <if test="sliderUrls != null and sliderUrls != ''">
            slider_urls = #{sliderUrls},
        </if>
        <if test="specValue != null and specValue != ''">
            spec_value = #{specValue},
        </if>
        <if test="status != null and status != ''">
            status = #{status},
        </if>
        <if test="auditStatus != null and auditStatus != ''">
            audit_status = #{auditStatus},
        </if>
        <if test="auditMessage != null and auditMessage != ''">
            audit_message = #{auditMessage},
        </if>
        update_time = now()
        where
        id = #{id}
    </update>
 <!--void updateById(ProductSku productSku);-->
    <update id="updateById">
        update product_sku set
        <if test="skuCode != null and skuCode != ''">
            sku_code = #{skuCode},
        </if>
        <if test="skuName != null and skuName != ''">
            sku_name = #{skuName},
        </if>
        <if test="productId != null and productId != ''">
            product_id = #{productId},
        </if>
        <if test="thumbImg != null and thumbImg != ''">
            thumb_img = #{thumbImg},
        </if>
        <if test="salePrice != null and salePrice != ''">
            sale_price = #{salePrice},
        </if>
        <if test="marketPrice != null and marketPrice != ''">
            market_price = #{marketPrice},
        </if>
        <if test="costPrice != null and costPrice != ''">
            cost_price = #{costPrice},
        </if>
        <if test="stockNum != null and stockNum != ''">
            stock_num = #{stockNum},
        </if>
        <if test="skuSpec != null and skuSpec != ''">
            sku_spec = #{skuSpec},
        </if>
        <if test="weight != null and weight != ''">
            weight = #{weight},
        </if>
        <if test="volume != null and volume != ''">
            volume = #{volume},
        </if>
        <if test="status != null and status != ''">
            status = #{status},
        </if>
        update_time = now()
        where
        id = #{id}
    </update>
    <!--    void updateById(ProductDetails productDetails);-->
    <update id="updateById">
        update product_details set
        <if test="productId != null and productId != ''">
            product_id = #{productId},
        </if>
        <if test="imageUrls != null and imageUrls != ''">
            image_urls = #{imageUrls},
        </if>
        update_time = now()
        where
        id = #{id}
    </update>

五、删除商品

需求说明:
当点击删除按钮的时候此时需要弹出一个提示框,询问是否需要删除数据?如果用户点击是,那么此时向后端发送请求传递id参数,后端接收id参数进行逻辑删除。效果如下所示:
在这里插入图片描述
来到controller层,获取到要删除商品的id值
在这里插入图片描述
业务层涉及到三张表,对应着三个mapper操作语句
在这里插入图片描述
三个SQL语句编写如下:

    @Update("update product set update_time = now() , is_deleted = 1 where id = #{id}")
    void deleteById(Long id);
    @Update("update product_sku set update_time = now() ,is_deleted = 1 where product_id = #{productId}")
    void deleteByProductId(Long id);
    @Update("update product_details set update_time = now() ,is_deleted = 1 where product_id = #{productId}")
    void deleteByProductId(Long id);

六、商品审核

需求说明:
当点击审核按钮的时候此时需要弹出一个对话框,在该对话框中展示商品的详情信息,用户可以在该对话框中点击通过或者驳回按钮对商品进行审核操作。效果如下所示:
在这里插入图片描述
debug来到controller层,获取到要设置的商品id值、状态值
在这里插入图片描述
业务层的mapper接口前面已经实现过了,如果状态值为1,则表名审批通过;反之审批不通过。
在这里插入图片描述

七、商品上下架

商品上下架的逻辑跟商品审核类似,对比一下即可。
在这里插入图片描述
其中的mapper接口方法前面也已经实现过了
在这里插入图片描述

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

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

相关文章

基于H5“汉函谷关起点新安县旅游信息系统”设计与实现

目 录 摘 要 1 ABSTRACT 2 第1章 绪论 3 1.1 系统开发背景及意义 3 1.2 系统开发的目标 3 第2章 主要开发技术介绍 5 2.1 H5技术介绍 5 2.2 Visual Studio 技术介绍 5 2.3 SQL Server数据库技术介绍 6 第3章 系统分析与设计 7 3.1 可行性分析 7 3.1.1 技术可行性 7 3.1.2 操作…

办公软件PDF转换工具 - Bruce的PDF工具pdftool

Bruce的PDF工具 - 办公软件PDF转换工具 - pdftool&#xff0c;支持&#xff1a; 1、图片转PDF&#xff0c;支持图片自动压缩&#xff0c;可预览图片 2、合并PDF&#xff0c;支持多个PDF合并成一个PDF 3、PDF转图片&#xff0c;PDF的每页转成一张图片 4、OFD转PDF&#xff0c;O…

Postman:专业API测试工具,提升Mac用户体验

如果你是一名开发人员或测试工程师&#xff0c;那么你一定知道Postman。这是一个广泛使用的API测试工具&#xff0c;适用于Windows、Mac和Linux系统。今天&#xff0c;我们要重点介绍Postman的Mac版本&#xff0c;以及为什么它是你进行API测试的理想选择。 一、强大的功能和易…

honle电源维修UV电源控制器EVG EPS40C-HMI

好乐UV电源控制器维修&#xff1b;honle控制器维修&#xff1b;UV电源维修MUC-Steuermodul 2 LΛmpen D-82166 主要维修型号&#xff1a; EVG EPS 60/120、EVG EPS 100、EVG EPS200、EVG EPS 220、EVG EPS 340、EVG EPS40C-HMI、EVG EPS60 HONLE好乐uv电源维修故障包括&#…

2023年第十二届数学建模国际赛小美赛B题工业表面缺陷检测求解分析

2023年第十二届数学建模国际赛小美赛 B题 工业表面缺陷检测 原题再现&#xff1a; 金属或塑料制品的表面缺陷不仅影响产品的外观&#xff0c;还可能对产品的性能或耐久性造成严重损害。自动表面异常检测已经成为一个有趣而有前景的研究领域&#xff0c;对视觉检测的应用领域有…

智能优化算法应用:基于平衡优化器算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于平衡优化器算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于平衡优化器算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.平衡优化器算法4.实验参数设定5.算法结果…

Docker容器中的OpenCV:轻松构建可移植的计算机视觉环境

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 构建可移植的计算机视觉环境 文章目录 前言引言简介&#xff1a;目的和重要性&#xff1a; 深入理解Docker和OpenCVDocker的基本概念和优势&#xff1a;OpenCV简介和应用领域&#xff1a;…

几个linux指令提升编程效率

history history命令是Linux/Unix系统中的一个常用命令&#xff0c;用于查看当前用户在命令行中执行过的命令历史记录。该命令允许用户查看、搜索、编辑和执行之前执行过的命令&#xff0c;为用户提供了方便、快捷的操作方式。 查看历史命令&#xff1a; history查看最近n条…

nginx三种虚拟主机的配置(IP,端口,域名)

准备工作&#xff1a; [rootbogon ~]# mkdir -p /data/nginx{1..3} #-p是用于递归创建使用 [rootbogon ~]# echo "hello nginx1" > /data/nginx1/index.html [rootbogon ~]# echo "hello nginx2" > /data/nginx2/index.html [rootbogon ~]# echo &q…

adb环境搭建(adb下载与安装)

文章目录 前言一、adb下载二、adb安装1.将下载的安装包解压缩2.将解压缩后的文件夹放到自己想存放的目录下&#xff08;不要放到带有中文的目录下&#xff09;——我这放到D盘根目录下3.配置环境变量3.1.鼠标放到 "此电脑"→鼠标右击→选择属性3.2.点击 "高级系…

海银・颖奕海南国际健康管理基地启航!“财富+健康”双轮驱动战略加速中

现场&#xff0c;颖奕集团、颖奕生物科技集团董事长凌临贵&#xff0c;海南博鳌乐城国际医疗旅游先行区管理局党委书记、局长贾宁&#xff0c;海银控股董事长韩宏伟&#xff08;从左至右&#xff09;共同启动该项目。 11月24日&#xff0c;“海银颖奕海南国际健康管理基地”在…

正则表达式及文本三剑客grep sed awk

正则表达式 1.元字符 . //匹配任意单个字符&#xff0c;可以是个汉字 [yang] //匹配范围内的任意单个字符 [^y] //匹配处理指定范围外的任意单个字符 [:alnum:] //字母和数字 [:alpha:] //代表…

二叉树的操作(C++实现)

目录 ⚽实现要求&#xff1a; &#x1f3d0;题目分析&#xff1a; &#x1f3c0;代码展示&#xff1a; &#x1f4cc;前提类和函数声明&#xff1a; &#x1f94e;模块一&#xff08;层次—>创建二叉树&#xff09;&#xff1a; &#x1f3b1;模块二&#xff08;三种…

QT Creator 保存(Ctrl+S)时,会将Tab制表符转换为空格

今天在写makefile文件时&#xff0c;发现QT Creator 保存(CtrlS)时&#xff0c;会将Tab制表符转换为空格&#xff0c;之前没有发现&#xff0c;略坑&#xff0c;官网上也有说明&#xff0c;点这里 简单来说&#xff0c;解决办法如下 依次点击&#xff1a;Tools ->Options-&g…

C51--DHT11数据读取

DHT11传输0的时序分析&#xff1a; DHT11传输1的时序分析&#xff1a; 用while(dht)卡点&#xff0c;当不满足while时&#xff0c;信号拉低&#xff1b; 用while(&#xff01;dht)卡点&#xff0c;当不满足while时&#xff0c;信号拉高。 传输0和1时有效数据都是高电平&…

每日一题:LeetCode-1089. 复写零

每日一题系列&#xff08;day 09&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

Linux:服务器管理工具宝塔(bt)安装教程

一、简介 bt宝塔Linux面板是提升运维效率的服务器管理软件&#xff0c;支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA等多项服务的管理功能 二、安装 使用 SSH 连接工具&#xff0c;如堡塔SSH终端连接到您的 Linux 服务器后&#xff0c;挂载磁盘&#xff0c;根据系统执…

微信如何单独隐藏某个人的聊天记录?

微信&#xff0c;如今已成为我们生活中不可或缺的沟通工具&#xff0c;它的应用范围涵盖了工作、学习及日常生活的方方面面。然而&#xff0c;有时为了保护个人隐私&#xff0c;或是不愿让他人看到特定对话&#xff0c;我们需要对与某人的聊天记录进行隐藏。那么&#xff0c;微…

【已解决】如何打开设置了密码的7Z压缩文件?

7Z是一种常见的压缩文件格式&#xff0c;相比RAR和ZIP格式&#xff0c;它的压缩率更高&#xff0c;可以压缩出更小的文件体积&#xff0c;也同样可以设置密码保护&#xff0c;那设置了密码的7Z压缩文件要如何打开呢&#xff1f; 我们知道&#xff0c;7Z压缩文件设置密码保护后…

06-Git分支相关的命令,如创建/删除/切换分支

Git分支(副本) 在版本控制过程中需要同时推进多个任务,此时可以为每个任务创建单独分支即开一个一模一样的副本 ,最终分支开发完后再合并到主分支提高开发效率 使用分支意味着程序员可以把自己的工作从开发主线上分离开来&#xff0c;开发自己分支的时候不会影响主线分支的运…