商城项目08_三级分类前端展示新增修改删除

Posted 所得皆惊喜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了商城项目08_三级分类前端展示新增修改删除相关的知识,希望对你有一定的参考价值。

文章目录

①. 树形前端展示

  • ①. 这个时候去访问在页面访问:http://localhost:88/api/product/category/list/tree可以显示数据
    (在product的配置文件中配置注册中心和配置中心的配置文件)
#  如下的配置在nacos中也进行了配置(从spring 到 port: 88),可以进行注释掉
#  当一个请求过来的时候,会交给网关进行处理,通过一系列的预言,如果预言为真,会转到指定的服务,转到指定服务的时候,会经过一系列的过滤器
spring:
#  application:
#    name: gulimall-gateway
#  cloud:
#    nacos:
#      discovery:
#        server-addr: 127.0.0.1:8848
#server:
#  port: 88
  cloud:
    gateway:
      routes:
        # 测试网关的功能
        - id: test_route1
          uri: http://localhost:7001
          predicates:
            - Path=/coupon/coupon/nacos/config/simple/**
        # 商品服务网关配置(注意需要把product_route放在admin_route前面)
        # http://localhost:88/api/product/category/list/tree
        # http://localhost:10000/product/category/list/tree
        - id: product_route
          uri: lb://gulimall-product
          predicates:
            - Path=/api/product/**
          filters:
            - RewritePath=/api/(?<segment>/?.*), /$\\segment
        - id: admin_route
          uri: lb://renren-fast
          predicates:
            - Path=/api/**
          filters:
            - RewritePath=/api/(?<segment>/?.*), /renren-fast/$\\segment
# 前端项目 /api
# http://localhost:88/api/captcha.jpg?uuid=72b9da67-0130-4d1d-8dda-6bfe4b5f7935
# http://renren-fast:8080/renren-fast/captcha.jpg


  • ②. 使用java8新特性查找三级联洞并封装成树形结构
@RestController
@RequestMapping("product/category")
public class CategoryController 
    @Autowired
    private CategoryService categoryService;
    /**
     * 查出所有分类、以及子分类,以树形结构组装起来
     */
    @RequestMapping("/list/tree")
    //@RequiresPermissions("product:category:list")
    public R list()
        List<CategoryEntity> entities = categoryService.listWithTree();
        return R.ok().put("data", entities);
    

   @Override
    public List<CategoryEntity> listWithTree() 
        //1、查出所有分类
        List<CategoryEntity> entities = baseMapper.selectList(null);
        //2、组装成父子的树形结构
        //2.1)、找到所有的一级分类
        List<CategoryEntity> level1Menus = entities.stream().filter(categoryEntity ->
                categoryEntity.getParentCid() == 0
        ).map((menu)->
            menu.setChildren(getChildrens(menu,entities));
            return menu;
        ).sorted((menu1,menu2)->
            return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());
        ).collect(Collectors.toList());

        return level1Menus;
    

    //递归查找所有菜单的子菜单
    private List<CategoryEntity> getChildrens(CategoryEntity root,List<CategoryEntity> all)

        List<CategoryEntity> children = all.stream().filter(categoryEntity -> 
            return categoryEntity.getParentCid() == root.getCatId();
        ).map(categoryEntity -> 
            //1、找到子菜单
            categoryEntity.setChildren(getChildrens(categoryEntity,all));
            return categoryEntity;
        ).sorted((menu1,menu2)->
            //2、菜单的排序
            return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());
        ).collect(Collectors.toList());

        return children;
    
@Data
@TableName("pms_category")
public class CategoryEntity implements Serializable 
	private static final long serialVersionUID = 1L;
	/**
	 * 分类id
	 */
	@TableId
	private Long catId;
	/**
	 * 分类名称
	 */
	private String name;
	/**
	 * 父分类id
	 */
	private Long parentCid;
	/**
	 * 层级
	 */
	private Integer catLevel;
	/**
	 * 是否显示[0-不显示,1显示]
	 */
	@TableLogic(value = "1",delval = "0")
	private Integer showStatus;
	/**
	 * 排序
	 */
	private Integer sort;
	/**
	 * 图标地址
	 */
	private String icon;
	/**
	 * 计量单位
	 */
	private String productUnit;
	/**
	 * 商品数量
	 */
	private Integer productCount;
	@TableField(exist = false)
	private List<CategoryEntity>children;

  • ③. 设置前端代码,在页面展示树状结构查询
<!--  -->
<template>
  <div class="">
    <el-tree
      :data="menus"
      :props="defaultProps"
      @node-click="handleNodeClick"
    ></el-tree>
  </div>
</template>

<script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import 《组件名称》 from '《组件路径》';

export default 
  //import引入的组件需要注入到对象中才能使用
  components: ,
  data() 
    //这里存放数据
    return ;
  ,
  //监听属性 类似于data概念
  computed: ,
  data() 
    return 
      menus: [],
      defaultProps: 
        children: "children",
        label: "name"
      
    ;
  ,
  methods: 
    handleNodeClick(data) 
      console.log(data);
    ,
    getMenus() 
      this.$http(
        url: this.$http.adornUrl("/product/category/list/tree"),
        method: "get"
      ).then(( data ) => 
        if (data && data.code === 0) 
          this.menus = data.data;
        
      );
    
  ,
  //生命周期 - 创建完成(可以访问当前this实例)
  created() 
    this.getMenus();
  ,
  //生命周期 - 挂载完成(可以访问DOM元素)
  mounted() 
;
</script>
<style scoped></style>

②. 三级分类删除逻辑

    /**
     * 删除
     * @RequestBody:获取请求体,只有post请求才会有请求体,必须发送post请求
     * springMvc自动将请求体的数据(JSON)转为对应的对象
     */
    @RequestMapping("/delete")
    //@RequiresPermissions("product:category:delete")
    public R delete(@RequestBody Long[] catIds)
        //1. 检查当前删除菜单,是否被别的地方引用
        categoryService.removeMenuByIds(Arrays.asList(catIds));
        return R.ok();
    
  • ③. 使用postman发送删除的逻辑

  • ④. 前端代码如下所示

  1. show-checkbox:显示复选框
  2. node-key:每个树节点用来作为唯一标识的属性,整棵树应该是唯一的
  3. expand-on-click-node:是否在点击节点的时候展开或者收缩节点,默认值为true,如果为false,则只有点箭头图标的时候才会展开或者收缩节点
  4. default-expanded-keys:默认展开的节点的key的数组
<template>
  <div class="">
    <!-- 
     show-checkbox:显示复选框
     node-key:每个树节点用来作为唯一标识的属性,整棵树应该是唯一的
     expand-on-click-node:是否在点击节点的时候展开或者收缩节点,默认值为true,如果为false,则只有点箭头图标的时候才会展开或者收缩节点
     default-expanded-keys:默认展开的节点的key的数组
     -->
    <el-tree
      :data="menus"
      :props="defaultProps"
      show-checkbox
      node-key="catId"
      :expand-on-click-node="false"
      :default-expanded-keys="expandedkey"
    >
      <span class="custom-tree-node" slot-scope=" node, data ">
        <span> node.label </span>
        <span>
          <!-- 新增按钮是一二级菜单、删除按钮是三级菜单 -->
          <el-button
            type="text"
            size="mini"
            v-if="node.level <= 2"
            @click="() => append(data)"
          >
            Append
          </el-button>
          <el-button
            v-if="node.level == 3"
            type="text"
            size="mini"
            @click="() => remove(node, data)"
          >
            Delete
          </el-button>
        </span>
      </span>
    </el-tree>
  </div>
</template>

<script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import 《组件名称》 from '《组件路径》';

export default 
  //import引入的组件需要注入到对象中才能使用
  components: ,
  data() 
    //这里存放数据
    return ;
  ,
  //监听属性 类似于data概念
  computed: ,
  data() 
    return 
      menus: [],
      expandedkey: [],
      defaultProps: 
        children: "children",
        label: "name"
      
    ;
  ,
  methods: 
    getMenus() 
      this.$http(
        url: this.$http.adornUrl("/product/category/list/tree"),
        method: "get"
      ).then(( data ) => 
        if (data && data.code === 0) 
          this.menus = data.data;
        
      );
    ,
    append(data) 
      console.log("data", data);
    ,

    remove(node, data) 
      var ids = [data.catId];
      this.$confirm(`是否删除$data.name菜单`, "提示", 
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      )
        .then(() => 
          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();
            //设置默认需要展开的菜单(找到当前删除节点的父节点id)
            this.expandedkey = [node.parent.data.catId];
          );
        )
        .catch(() => );
    
  ,
  //生命周期 - 创建完成(可以访问当前this实例)
  created() 
    this.getMenus();
  ,
  //生命周期 - 挂载完成(可以访问DOM元素)
  mounted() 
;
</script>
<style scoped></style>


修改和删除等后续有时间再补充

以上是关于商城项目08_三级分类前端展示新增修改删除的主要内容,如果未能解决你的问题,请参考以下文章

第176天学习打卡(项目 谷粒商城 18 API三级分类 删除效果细化 新增效果)

商城项目11_商品SPUSKU详解表结构属性分组列表展示修改新增分类级联更新

商城项目11_商品SPUSKU详解表结构属性分组列表展示修改新增分类级联更新

商城项目07_网关工程初步搭建商品分类树状结构展示网关配置解决跨域问题

商城项目07_网关工程初步搭建商品分类树状结构展示网关配置解决跨域问题

商城项目12_规格参数新增与VO列表展示回显数据进行修改销售属性维护