谷粒商城实战笔记-50-51-商品分类的删除

news2024/9/25 7:22:53

文章目录

  • 一,50-商品服务-API-三级分类-删除-逻辑删除
    • 1,逻辑删除的配置
      • 1.1 配置全局的逻辑删除规则(可省略)
      • 1.2 配置逻辑删除Bean(可省略)
      • 1.3 Bean相应字段上加上注解@TableLogic
    • 2,后台接口开发
      • 2.1,Controller类中修改接口
      • 2.2,CategoryServiceImpl类中增加接口
      • 2.3,postman验证
  • 二,51-商品服务-API-三级分类-删除-删除效果细化
    • 1,前端调用delete接口
    • 2,模板代码配置
    • 3,验证
    • 4,细节优化

这两节的内容是开发商品分类的删除功能。

一,50-商品服务-API-三级分类-删除-逻辑删除

前端已经开发了删除按钮,后端要有对应的接口实现。

1,逻辑删除的配置

在工作中,所有的删除都应该是逻辑删除,不能用物理硬删除。

mybatis-plus支持逻辑删除的配置,配置步骤如下:

  • ①配置全局的逻辑删除规则(可省略)
  • ②配置逻辑删除Bean(可省略)
  • ③Bean相应字段上加上注解@TableLogic

1.1 配置全局的逻辑删除规则(可省略)

mybatis-plus:
  global-config:
    db-config:
      logic-delete-value: 1
      logic-not-delete-value: 0

在这里插入图片描述

logic-delete-value: 1

这个配置项定义了当一个记录被逻辑删除时,其逻辑删除字段(通常是一个布尔型或整型字段)的值应该是多少。在这个例子中,如果一个记录的逻辑删除字段值为1,那么框架认为这个记录是被逻辑删除的。

logic-not-delete-value: 0

这个配置项定义了当一个记录未被逻辑删除时,其逻辑删除字段的值应该是多少。在这个例子中,如果一个记录的逻辑删除字段值为0,那么框架认为这个记录是有效的,没有被逻辑删除。

1.2 配置逻辑删除Bean(可省略)

在mybatis-plus3.1.1版本后,无需此步骤,我用的3.2,所以这步可以省略。

1.3 Bean相应字段上加上注解@TableLogic

商品分类表中用showStatus字段表示记录是否逻辑删除。

所以在对应的实体类CategoryEntity.java中showStatus字段上加上注解。
在这里插入图片描述
这里需要说明的是,如果表示逻辑删除的值和全局配置不一致,可以在注解上单独配置。

比如全局配置中1表示已删除,而三级分类表1表示未删除,产生了冲突,解决冲突的办法就是在注解上通过val和delVal字段进行设置。

2,后台接口开发

2.1,Controller类中修改接口

	@RequestMapping("/delete")
    public R delete(@RequestBody Long[] catIds){
//		categoryService.removeByIds(Arrays.asList(catIds));
		categoryService.removeMenuByIds(Arrays.asList(catIds));

        return R.ok();
    }

removeMenuByIds是新实现的方法,逆向工程生成的方法removeByIds缺少必要的校验,我们不用这个方法。

2.2,CategoryServiceImpl类中增加接口

    @Override
    public void removeMenuByIds(List<Long> ids) {
        baseMapper.deleteBatchIds(ids);
    }

在这里插入图片描述

2.3,postman验证

重启product服务,在postman中通过网关调用删除接口。

二,51-商品服务-API-三级分类-删除-删除效果细化

1,前端调用delete接口

category.vue模块中,remove方法如下。

remove(node, data) {
      var ids = [node.catId];

      this.$confirm(
        `确定对[id=${ids.join(",")}]进行[${id ? "删除" : "批量删除"}]操作?`,
        "提示",
        {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning",
        }
      )
        .then(() => {
          this.$http({
            url: this.$http.adornUrl("/product/category/delete"),
            method: "post",
            data: this.$http.adornData(ids, false),
          }).then(({ data }) => {
            if (data && data.code === 0) {
              this.$message({
                message: "操作成功",
                type: "success",
                duration: 1500,
                onClose: () => {
                  console.log("删除成功,关闭消息提示");
                  this.getMenus();
                },
              });
            } else {
              this.$message.error(data.msg);
            }
          });
        })
        .catch(() => {});
    },

在删除前弹窗提示是否确认删除,确认后,调用接口,把要删除的分类Id传递给后端,后端软删除对应分类记录。

2,模板代码配置

后续会频繁使用httpget和httppost请求,为了提高效率,可以配置到模板中。

"http-get 请求": {
		"prefix": "httpget",
		"body": [
			"this.\\$http({",
			"url: this.\\$http.adornUrl(''),",
			"method: 'get',",
			"params: this.\\$http.adornParams({})",
			"}).then(({data}) => {",
			"})"
		],
		"description": "httpGET 请求"
	},
	"http-post 请求": {
		"prefix": "httppost",
		"body": [
			"this.\\$http({",
			"url: this.\\$http.adornUrl(''),",
			"method: 'post',",
			"data: this.\\$http.adornData(data, false)",
			"}).then(({ data }) => { });"
		],
		"description": "httpPOST 请求"
	}

这样只要输入httpposthttpgetvscode就可以给出提示,确认后就可以自动插入模板代码,代替手敲,极大的提高编码效率。

3,验证

在页面上点击电子书分类后的delete按钮,弹出如下提示。

在这里插入图片描述

点击确定,提示删除成功。

在这里插入图片描述

在后台数据产看cat_id165的数据,show_status=0说明已经被逻辑删除。
在这里插入图片描述

4,细节优化

  • ①在删除前弹窗提示是否确认删除,确认后,调用接口,把要删除的分类Id传递给后端,后端软删除对应分类记录。
  • ②点击删除后,后端已经删除,但是前端未刷新,可以调用方法this.getMenus();重新查询分类数据刷新界面。
  • ③删除成功后重新请求会导致已经展开的菜单,又收缩了,用户体验不好,最好的效果是只有被删除的分类消失,页面其他部分保持不变。实现这个需求需要用到el-tree组件的default-expanded-keys,用来指定需要展开的节点的id。
    第一步,在el-tree中给属性绑定一个数组,default-expanded-keys="expandedKeys"
    第二步,在js脚本的data中声明这个数组,expandedKeys: []
    第三步,删除成功,重启请求分类数据后,将要被删除的分类节点的父节点的catId赋值给数组,this.expandedKeys = node.parent.data.catId; // 重置展开节点

Category.vue完整代码。

<template>
  <el-tree
    node-key="catId"
    :data="menus"
    :props="defaultProps"
    :expand-on-click-node="false"
    show-checkbox
    default-expanded-keys="expandedKeys"
  >
    <span class="custom-tree-node" slot-scope="{ node, data }">
      <span>{{ node.label }}</span>
      <span>
        <el-button
          v-if="node.level <= 2"
          size="mini"
          @click="() => append(data)"
        >
          Append
        </el-button>
        <el-button
          v-if="node.childNodes.length == 0"
          type="text"
          size="mini"
          @click="() => remove(node, data)"
        >
          Delete
        </el-button>
      </span>
    </span>
  </el-tree>
</template>

<script>
export default {
  components: {},
  props: {},
  data() {
    return {
      menus: [],
      expandedKeys: [],
      defaultProps: {
        children: "children",
        label: "name",
      },
    };
  },
  methods: {
    append(data) {
      console.log(data);
    },
    remove(node, data) {
      console.log(node, data);
      var ids = [node.data.catId];

      this.$confirm(
        `确定对[id=${ids.join(",")}]进行[${ids.length == 1 ? "删除" : "批量删除"}]操作?`,
        "提示",
        {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning",
        }
      )
        .then(() => {
          this.$http({
            url: this.$http.adornUrl("/product/category/delete"),
            method: "post",
            data: this.$http.adornData(ids, false),
          }).then(({ data }) => {
            if (data && data.code === 0) {
              this.$message({
                message: "操作成功",
                type: "success",
                duration: 1500,
                onClose: () => {
                  console.log("删除成功,关闭消息提示");
                  this.getMenus(); // 重新获取数据
                  this.expandedKeys = node.parent.data.catId; // 重置展开节点
                },
              });
            } else {
              this.$message.error(data.msg);
            }
          });
        })
        .catch(() => {});
    },
    // 获取分类数据
    getMenus() {
      this.dataListLoading = true;
      this.$http({
        url: this.$http.adornUrl("/product/category/list/tree"),
        method: "get",
      }).then(({ data }) => {
        console.log(data);
        this.dataListLoading = false;
        this.menus = data.data;
      });
    },
  },
  created() {
    this.getMenus(); // 获取分类数据
  },
};
</script>
<style scoped>
</style>

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

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

相关文章

力扣高频SQL 50题(基础版)第十题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第十题1661. 每台机器的进程平均运行时间题目说明思路分析实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题&#xff08;基础版&#xff09;第十题 1661. 每台机器的进程平均运行时间 题目说明 表: Activity…

数里行间创始人郭振:AIGC如何打造跨境电商增长新引擎

导读&#xff1a;在跨境电商领域&#xff0c;AI客服已经能够实现50%的问题平均解决率和不低于人工标准的客户满意度。 在生成式AI的商业化应用领域&#xff0c;跨境电商行业一直走在前列&#xff0c;成为最早实现技术落地的先锋之一。 “我们的AI客服机器人&#xff0c;已经帮助…

01 MySQL

文章目录 MySQL1、数据库相关概念2、MySQL3、SQL概述4、DDL:数据库操作5、DDL:表操作6、DML7、DQL8、约束9、数据库设计10、多表查询11、事务 MySQL 1、数据库相关概念 数据库 &#xff08;1&#xff09;存储和管理数据的仓库&#xff0c;数据是有组织的进行存储。 &#xff0…

【接口测试】params传参与body传参区别

文章目录 一.params传参二.body传参三.两者区别说明 一.params传参 params传参一般用于get请求 params传参时,参数会附于URL后面以问号形式展示。 示例&#xff1a; http://ip地址:端口号/login?usernamexm&pwd111二.body传参 body传参一般用于post请求 body传参时需…

2022真题-架构师案例(二)

1、某大型电商平台建立了一个在线B2B商店系统&#xff0c;并在全匡多地建设了货物仓储中心&#xff0c;通过提前备货的方式来提高货物的运送效率。但是在运营过程中&#xff0c;发现会出现很多跨仓储中心调货从而延误货物运送的情况。为此&#xff0c;该企业计划新建立一个全国…

搜维尔科技:Cyber​​glove通过其前所未有的柔性传感器技术,带来了多年的经验、专业知识和可靠性

Cyberglove 概述 新一代数据手套技术 MoCap 手套采用了原始 CyberGlove 产品 20 年经验所建立的技术&#xff0c;产生了改进的和新的特性、能力和设计&#xff0c;非常适合动作捕捉环境。 旧与新相遇&#xff0c; Cyberglove 通过其前所未有的柔性传感器技术&#xff0c;带来…

【深度学习】PyTorch框架(5):Transformer和多注意力机制

1、引言 在本文中&#xff0c;我们将探讨近两年来最具影响力的模型架构之一——Transformer模型。自从2017年Vaswani等人发表的论文《注意力是你所需要的全部》以来&#xff0c;Transformer架构在多个领域持续刷新着性能记录&#xff0c;尤其是在自然语言处理&#xff08;NLP&…

【网络安全的神秘世界】 文件上传及验证绕过

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 这个漏洞对于初学者好挖&#xff0c;先找到文件上传的位置 文件上传是web网页中常见的功能之一&#xff0c;通常情况下恶意文…

Windows 11 系统对磁盘进行分区保姆级教程

Windows 11磁盘分区 磁盘分区是将硬盘驱动器划分为多个逻辑部分的过程&#xff0c;每个逻辑部分都可以独立使用和管理。在Windows 11操作系统中进行磁盘分区主要有以下几个作用和意义&#xff1a; 组织和管理数据&#xff1a;分区可以帮助用户更好地组织他们的数据&#xff0c…

怎么使用动态IP地址上网

如何设置动态IP地址上网&#xff1f; 设置动态IP地址上网的步骤如下&#xff1a; 一、了解动态IP地址 动态IP地址是由网络服务提供商&#xff08;ISP&#xff09;动态分配给用户的IP地址&#xff0c;它会根据用户的需求和网络情况实时改变。相比于静态IP地址&#xff0c;动态…

闲鱼、抖音、快手纷纷入局,“谷子”经济千亿市场纷争再起

二次元的狂热&#xff0c;终于还是蔓延到了三次元。 此前&#xff0c;在咸鱼上的一场拍卖中&#xff0c;一块直径75mm&#xff0c;重达20克的“吧唧”&#xff08;徽章&#xff09;&#xff0c;以7.2万人民币的价格被成功拍下。而与此同时&#xff0c;上海黄金交易所中的金价是…

Three.js 官方文档学习笔记

Address&#xff1a;Three.js中文网 (webgl3d.cn) Author&#xff1a;方越 50041588 Date&#xff1a;2024-07-19 第一个3D案例—创建3D场景 创建3D场景对象Scene&#xff1a; const scene new THREE.Scene(); 创建一个长方体几何对象Geometry&#xff1a; const geomet…

【C++】:AVL树的深度解析及其实现

目录 前言一&#xff0c;AVL树的概念二&#xff0c;AVL树节点的定义三&#xff0c;AVL树的插入3.1 第一步3.2 第二步 四&#xff0c;AVL树的旋转4.1 右单旋4.2 左单旋4.3 右左双旋4.4 左右双旋4.5 插入代码的完整实现4.6 旋转总结 五&#xff0c;AVL树的验证六&#xff0c;实现…

详细讲解vue3 watch回调的触发时机

目录 Vue 3 watch 基本用法 副作用刷新时机 flush 选项 flush: pre flush: post flush: sync Vue 3 watch 基本用法 计算属性允许我们声明性地计算衍生值。然而在有些情况下&#xff0c;我们需要在状态变化时执行一些“副作用”&#xff1a;例如更改 DOM&#xff0c;或是…

数字图像处理笔记(一)---- 图像数字化与显示

系列文章目录 数字图像处理学习笔记&#xff08;一&#xff09;---- 图像数字化与显示 数字图像处理笔记&#xff08;二&#xff09;---- 像素加图像统计特征 数字图像处理笔记&#xff08;三) ---- 傅里叶变换的基本原理 文章目录 系列文章目录前言一、数字图像处理二、图像数…

文件I/O基础

一、传统I/O数据传输过程 用户进程调用 read() 函数,发送上下文切换,用户进程由用户态切换成内核态,CPU向磁盘发起数据读取IO请求,然后返回;磁盘控制器收到请求,就开始准备数据,把数据放入磁盘控制器的内存缓冲区中,然后产生一个中断;CPU收到中断信号,停下手头工作,…

linux系统查历史cpu使用数据(使用sar 查询cpu和网络占用最近1个月历史数据)。

一 sar 指令介绍 在 Linux 系统中&#xff0c;sar 是 System Activity Reporter 的缩写&#xff0c;是一个用于收集、报告和保存系统活动信息的工具。它是 sysstat 软件包的一部分&#xff0c;提供了丰富的系统性能数据&#xff0c;包括 CPU、内存、网络、磁盘等使用情况&am…

802.11 Omnipeek 抓包

802.11 Omnipeek 抓包 前言Omnipeek安装软件配置 前言 设备准备环节和前面一样&#xff0c;本文不再赘述&#xff0c;参考前面的文章&#xff1a;https://blog.csdn.net/m0_55334946/article/details/140671901 采用 Omnipeek 抓包分析&#xff0c;我可以说比起 wireshark 已…

计算一段英文句子的最后一个单词的长度,单词间以空格隔开。

# 计算一段英文句子的最后一个单词的长度&#xff0c;单词间以空格隔开。 # 例如&#xff1a;输入”how are you“&#xff0c;输出&#xff1a;3EnglishStr:str str(input("请输入你的英文句子:")) EnglishList:list EnglishStr.split( ) strLength len(EnglishL…

走难而正确的路并持之以恒

走难而正确的路并持之以恒 接近八月&#xff0c;台风频繁。气象台说台风“格美”今夜将至&#xff0c;往粤北走&#xff0c;而留在粤东的将是持续的高温。高温的广州&#xff0c;这几晚的天空惊喜不断&#xff0c;成片的火烧云&#xff0c;站在猎德大桥观望&#xff0c;丹红的凤…