• 谷粒商城 (十三) --------- 商品服务 API 三级分类 ④ 删除、新增分类



    需求:要求对三级菜单有增加和删除的功能,但只有一级和二级的菜单有增加的功能,空的没有子菜单的菜单才能进行删除。


    一、删除分类前端编写

    A、页面部分

    注意圈红圈的为新增的内容

    在这里插入图片描述

    B、方法部分

    在这里插入图片描述

    C、代码

    <template>
      <el-tree
        :data="menus"
        :props="defaultProps"
        :expand-on-click-node="false"
        show-checkbox="true"
        node-key="catId"
        :default-expanded-keys="expandedKey"
        ><span class="custom-tree-node" slot-scope="{ node, data }">
          <span>{{ node.label }}span>
          <span>
            <el-button
              v-if="node.level <= 2"
              type="text"
              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 {
      data() {
        return {
          menus: [],
          expandedKey: [],
          defaultProps: {
            children: "children",
            label: "name",
          },
        };
      },
      created() {
        this.getMenus();
      },
      methods: {
        getMenus() {
          this.$http({
            url: this.$http.adornUrl("/product/category/list/tree"),
            method: "get",
          }).then(({ data }) => {
            console.log("成功获取后台数据", data.data);
            this.menus = data.data;
          });
        },
        append(data) {
          const newChild = { id: id++, label: "testtest", children: [] };
          if (!data.children) {
            this.$set(data, "children", []);
          }
          data.children.push(newChild);
        },
    
        remove(node, data) {
          this.$confirm(`是否删除【${data.name}】菜单?`, "提示", {
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            type: "warning",
          })
            .then(() => {
              var ids = [data.catId];
              this.$http({
                url: this.$http.adornUrl("/product/category/delete"),
                method: "post",
                data: this.$http.adornData(ids, false),
              }).then(({ data }) => {
                this.$message({
                  message: "菜单删除成功",
                  type: "success",
                });
                // 刷新出新的菜单
                this.getMenus();
                // 设置需要默认展开的菜单
                this.expandedKey = [node.parent.data.catId]
              });
            })
            .catch(() => {});
        },
      },
    };
    script>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94

    二、编写删除后台

    逻辑删除:表中某一字段可以标志该条数据是否被删除,不是真正的从数据库表中直接删除,就比如 category 表中的 show_status 字段,0表示删除,1表示显示

    在这里插入图片描述

    物理删除:直接把该条数据从数据库中 delete 掉

    这里我们编写的删除则是使用逻辑删除。。。。。

    CategoryController 中:

    在这里插入图片描述

    /**
    * 删除
    * @RequestBody : 获取请求体, 必须发送 post 请求
    * SpringMVC 自动将请求体的数据(json), 转为对应的对象
    */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] catIds){
       //1、检查当前删除的菜单, 是否被别的地方引用
       //categoryService.removeByIds(Arrays.asList(catIds));
    
       categoryService.removeByMenuIds(Arrays.asList(catIds));
       return R.ok();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    CategoryService 及 CategoryServiceImpl 中:

    在这里插入图片描述

    @Override
    public void removeByMenuIds(List<Long> asList) {
        // TODO 1、检查当前删除的菜单, 是否在别的地方被引用
        // 逻辑删除
        baseMapper.deleteBatchIds(asList);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    逻辑删除步骤:

    A、配置全局的逻辑删除规则
    B、配置逻辑删除的组件(省略)
    C、加上逻辑删除注解 @TopicLogic

    MyBatis-Plus 中配置逻辑删除:

    在这里插入图片描述
    实体类属性加上 @TableLogic 注解

    在这里插入图片描述

    三、删除测试

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

    四、新增分类

    主要是编写前端的代码,后端我们调用框架生成的 save 方法去保存

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

    <template>
      <div>
        <el-tree
          :data="menus"
          :props="defaultProps"
          :expand-on-click-node="false"
          show-checkbox="true"
          node-key="catId"
          :default-expanded-keys="expandedKey"
          ><span class="custom-tree-node" slot-scope="{ node, data }">
            <span>{{ node.label }}</span>
            <span>
              <el-button
                v-if="node.level <= 2"
                type="text"
                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
        >
        <el-dialog title="提示" :visible.sync="dialogVisible" width="30%">
          <el-form :model="form">
            <el-form-item label="分类名称">
              <el-input v-model="category.name" autocomplete="off"></el-input>
            </el-form-item>
          </el-form>
          <span slot="footer" class="dialog-footer">
            <el-button @click="dialogVisible = false">取 消</el-button>
            <el-button type="primary" @click="addCategory">确 定</el-button>
          </span>
        </el-dialog>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          category: { name: "", parentCid: 0, catLevel: 0, showStatus: 1, sort: 0 },
          dialogVisible: false,
          menus: [],
          expandedKey: [],
          defaultProps: {
            children: "children",
            label: "name",
          },
        };
      },
      created() {
        this.getMenus();
      },
      methods: {
        getMenus() {
          this.$http({
            url: this.$http.adornUrl("/product/category/list/tree"),
            method: "get",
          }).then(({ data }) => {
            console.log("成功获取后台数据", data.data);
            this.menus = data.data;
          });
        },
        append(data) {
          this.dialogVisible = true;
          this.category.parentCid = data.catId;
          this.category.catLevel = data.catLevel * 1 + 1;
        },
    
        addCategory() {
          this.$http({
            url: this.$http.adornUrl("/product/category/save"),
            method: "post",
            data: this.$http.adornData(this.category, false),
          }).then(({ data }) => {
            this.$message({
              message: "菜单保存成功",
              type: "success",
            });
            //  关闭对话框
            this.dialogVisible = false;
            // 刷新出新的菜单
            this.getMenus();
            // 设置需要默认展开的菜单
            this.expandedKey = [this.category.parentCid];
          });
        },
    
        remove(node, data) {
          this.$confirm(`是否删除【${data.name}】菜单?`, "提示", {
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            type: "warning",
          })
            .then(() => {
              var ids = [data.catId];
              this.$http({
                url: this.$http.adornUrl("/product/category/delete"),
                method: "post",
                data: this.$http.adornData(ids, false),
              }).then(({ data }) => {
                this.$message({
                  message: "菜单删除成功",
                  type: "success",
                });
                // 刷新出新的菜单
                this.getMenus();
                // 设置需要默认展开的菜单
                this.expandedKey = [node.parent.data.catId];
              });
            })
            .catch(() => {});
        },
      },
    };
    </script>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126

    后台代码如图:

    在这里插入图片描述

  • 相关阅读:
    MQTT协议入门介绍
    点击化学PEG试剂DBCO-PEG4-NHS,1427004-19-0知识特点总结
    「Spring Boot 系列」03. Spring Boot配置文件&yaml的基本语法
    人工智能 | ShowMeAI资讯日报 #2022.06.29
    OCP Java17 SE Developers 复习题06
    调用API接口的一些注意技巧
    7、android 高级控件(1)(下拉列表)
    排序算法-选择排序
    加载数据列为空值时 format 取值为 3 和 5 的处理不同
    【51单片机】利用【时间延迟】的原理规避【按键抖动问题】
  • 原文地址:https://blog.csdn.net/m0_51111980/article/details/126715357