谷粒商城-基础篇-Day07-品牌分类关联与级联更新

news2024/11/15 20:09:24

将品牌分类和品牌名称的关系放在pms_category_brand_relation表中

在这里插入图片描述

获取该列表品牌所有的关联信息

在这里插入图片描述

    /**
     * 列表
     */
    @GetMapping("/catelog/list")
    public R list(@RequestParam("brandId") Long brandId){
        List<CategoryBrandRelationEntity> data=categoryBrandRelationService.list(
                new QueryWrapper<CategoryBrandRelationEntity>().eq("brand_id",brandId));

        return R.ok().put("data", data);
    }

新增

在这里插入图片描述

    /**
     * 保存
     */
    @RequestMapping("/save")
    public R save(@RequestBody CategoryBrandRelationEntity categoryBrandRelation){
        //新增时,将名称也新增到数据库中
		categoryBrandRelationService.saveDetail(categoryBrandRelation);

        return R.ok();
    }

创建saveDetail方法

    @Override
    public void saveDetail(CategoryBrandRelationEntity categoryBrandRelation) {
        //先查数据库将品牌name和分类name查询出
        BrandEntity brandEntity = brandDao.selectById(categoryBrandRelation.getBrandId());

        CategoryEntity categoryEntity = categoryDao.selectById(categoryBrandRelation.getCatelogId());
categoryBrandRelation.setBrandName(brandEntity.getName());
categoryBrandRelation.setCatelogName(categoryEntity.getName());
       this.save(categoryBrandRelation);
    }

实现效果:
在这里插入图片描述

级联更新

当品牌名称修改后,品牌和分类的关联表中的品牌名称也应该修改

在brandController中修改原始的update方法

    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@Validated({UpdateGroup.class})@RequestBody BrandEntity brand){
//		brandService.updateById(brand);
        brandService.updateDetail(brand);
        return R.ok();
    }

创建一个updateDetail方法

    //级联更新
    @Override
    public void updateDetail(BrandEntity brand) {
     this.updateById(brand);
        Long brandId = brand.getBrandId();
        String name = brand.getName();
        if (!StringUtils.isEmpty(name)){
            //修改关联表中的数据
            categoryBrandRelationService.updateBrand(brandId,name);

        }
        //TODO 修改其他关联表中的数据
    }

创建要给updateBrand方法用来更新关联表中的数据

在CategoryBrandRelationServiceImpl中

    @Override
    public void updateBrand(Long brandId, String name) {
        QueryWrapper<CategoryBrandRelationEntity> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("brand_id",brandId);
        CategoryBrandRelationEntity categoryBrandRelationEntity=new CategoryBrandRelationEntity();
        categoryBrandRelationEntity.setBrandId(brandId);
        categoryBrandRelationEntity.setBrandName(name);
        this.update(categoryBrandRelationEntity,queryWrapper);
    }

实现效果:

在这里插入图片描述

在这里插入图片描述

同理:

当更新分类名后,关联表中的分类名称也应该修改

这里使用mybatis的方式写sql语句

在CategoryServiceImple中

@Override
public void updateCascade(CategoryEntity category) {
    //修改分类表
    this.updateById(category);
    //修改关联表
    categoryBrandRelationService.updateCategory(category.getCatId(),category.getName());
}

创建updateCategory方法

    @Override
    public void updateCategory(Long catId, String name) {
        //实现修改关联表
        this.baseMapper.updateCategory(catId,name);
    }

使用sql语句的方式

    void updateCategory(@Param("catId") Long catId, @Param("name") String name);
    <update id="updateCategory">
        UPDATE `pms_category_brand_relation` set  catelog_name=#{name} where catelog_id=#{catId}
    </update>

实现效果:

在这里插入图片描述

在这里插入图片描述

问题:在属性分组中如果不点击节点,直接查询的话,不能进行模糊查询

修改代码: AttrGroupServiceImpl中

    @Override
    public PageUtils queryPage(Map<String, Object> params, Long catelogId) {
        QueryWrapper<AttrGroupEntity> queryWrapper=new QueryWrapper<>();
        String key = (String)params.get("key");

        if (catelogId==0){
            //如果没有点击节点
            //查询全部--并且可以模糊查询
            if (!StringUtils.isEmpty(key)){
                queryWrapper.and((obj)->{
                    obj.like("attr_group_id",key).or().like("attr_group_name",key);

                });
            }
            IPage<AttrGroupEntity> page = this.page(
                    new Query<AttrGroupEntity>().getPage(params),
                    queryWrapper
            );
            return new PageUtils(page);
        }
        else{
            //构造查询条件
            queryWrapper.eq("catelog_id",catelogId);
            if (!StringUtils.isEmpty(key)){
                queryWrapper.and((obj)->{
                    obj.like("attr_group_id",key).or().like("attr_group_name",key);

                });
            }
            //还需要模糊查询
            IPage<AttrGroupEntity> page=this.page(
                    new Query<AttrGroupEntity>().getPage(params),
                    queryWrapper
            );
            return new PageUtils(page);

        }

    }

新增规格参数

在这里插入图片描述

将新增的参数添加到attr表中,并且实现关联表attr_attrgroup_relation表的添加

提交的数据
在这里插入图片描述

而AttrEntity中没有分组id

之前我们是在AttrEntity中新增一个属性,这样不规范

我们创建一个vo包,在vo包下新建一个实体类AttrVo

package com.atguigu.gulimall.product.vo;


import lombok.Data;

/**
 * @ClassName AttrVo
 * @Description TODO
 * @Author ylh
 * @Date 2022/9/12 17:39
 * @Description
 */
@Data
public class AttrVo {

    /**
     * 属性id
     */

    private Long attrId;
    /**
     * 属性名
     */
    private String attrName;
    /**
     * 是否需要检索[0-不需要,1-需要]
     */
    private Integer searchType;
    /**
     * 属性图标
     */
    private String icon;
    /**
     * 可选值列表[用逗号分隔]
     */
    private String valueSelect;
    /**
     * 属性类型[0-销售属性,1-基本属性,2-既是销售属性又是基本属性]
     */
    private Integer attrType;
    /**
     * 启用状态[0 - 禁用,1 - 启用]
     */
    private Long enable;
    /**
     * 所属分类
     */
    private Long catelogId;
    /**
     * 快速展示【是否展示在介绍上;0-否 1-是】,在sku中仍然可以调整
     */
    private Integer showDesc;

    private Long attrGroup;

}


在attrController中

  @RequestMapping("/save")
  public R save(@RequestBody AttrVo attrVo){

attrService.saveAttr(attrVo);
      
      return R.ok();
  }

编写一个saveAttr方法

    @Override
    public void saveAttr(AttrVo attrVo) {
        //保存attr表中的数据
        AttrEntity attr=new AttrEntity();
        BeanUtils.copyProperties(attrVo,attr);
        this.save(attr);
        //对attr_attrgroup_relation表进行关联

        AttrAttrgroupRelationEntity relationEntity=new AttrAttrgroupRelationEntity();
        relationEntity.setAttrId(attr.getAttrId());
        relationEntity.setAttrGroupId(attrVo.getAttrGroupId());

        attrAttrgroupRelationDao.insert(relationEntity);

psm_attr表中
在这里插入图片描述

attr_attrgroup_relation表中

在这里插入图片描述

查询规格参数列表功能

    @Override
    public PageUtils queryPageDetail(Map<String, Object> params, Long categoryId) {
        QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<>();
        String key = (String)params.get("key");

        if (StringUtils.isEmpty(key)){
            queryWrapper.eq("attr_id",key).or().like("attr_name",key);
        }

        if (categoryId!=0){
             //根据id查询
            queryWrapper.and((wrapper)->{
                wrapper.eq("catelod_id",categoryId);
            });
        }

        IPage<AttrEntity> page= this.page(
                new Query<AttrEntity>().getPage(params),
                queryWrapper
        );



        return new PageUtils(page);


    }


我们还需要将所属分类和所属分组给展示出来

在这里插入图片描述

需要创建一个vo类

@Data
public class AttrRepVo extends AttrEntity {


    //所属分类名称

    private String catelogName;
    //所属分组名称
    private String groupName;

}

    @Override
    public PageUtils queryPageDetail(Map<String, Object> params, Long catelogId) {
        QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<>();
        String key = (String)params.get("key");



        if (catelogId!=0){
             //根据id查询
            queryWrapper.eq("catelog_id",catelogId);
        }

        if (StringUtils.isEmpty(key)){
            queryWrapper.and((wrapper)->{
                wrapper.eq("attr_id",key).or().like("attr_name",key);
            });
        }

        IPage<AttrEntity> page = this.page(
                new Query<AttrEntity>().getPage(params),
                queryWrapper
        );

        PageUtils pageUtils = new PageUtils(page);
        List<AttrEntity> records = page.getRecords();
        List<AttrRepVo> respVos = records.stream().map((attrEntity -> {
            AttrRepVo attrRepVo = new AttrRepVo();
            BeanUtils.copyProperties(attrEntity, attrRepVo);

            //设置分类和分组

            //查询分组
            AttrAttrgroupRelationEntity attrId = attrAttrgroupRelationDao.selectOne(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", attrEntity.getAttrId()));
            if (attrId != null) {
                AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrId.getAttrGroupId());
                attrRepVo.setGroupName(attrGroupEntity.getAttrGroupName());
            }
            //查询分类
            CategoryEntity categoryEntity = categoryDao.selectById(attrEntity.getCatelogId());
            if (categoryEntity != null) {
                attrRepVo.setCatelogName(categoryEntity.getName());
            }

            return attrRepVo;
        })).collect(Collectors.toList());

        pageUtils.setList(respVos);
        return pageUtils;


    }

}

最终效果
在这里插入图片描述

规格修改

一、回显数据

二、修改

销售属性维护

查询分组关联属性

在AttrGroupController中

// http://localhost:88/api/product/attrgroup/1/attr/relation?t=1663076321684

 @GetMapping("/{attrgroupId}/attr/relation")
 public R attrRelation(@PathVariable("attrgroupId")Long attrgroupId){
     //跟据id查询所有分组信息
     List<AttrEntity> entities=attrService.getRelationList(attrgroupId);
 return R.ok().put("data",entities);
 }

创建getRelationList(attrgroupId)方法

    @Override
    public List<AttrEntity> getRelationList(Long attrgroupId) {
        List<AttrAttrgroupRelationEntity> attr_group_id = attrAttrgroupRelationDao.selectList(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_group_id", attrgroupId));

        List<Long> collect = attr_group_id.stream().map((attr) -> {
            Long attrId = attr.getAttrId();
            return attrId;
        }).collect(Collectors.toList());

        Collection<AttrEntity> attrEntities = this.listByIds(collect);
        return (List<AttrEntity>) attrEntities;

    }

实现效果:
在这里插入图片描述

删除分组关联

创建接受对象

@Data
public class AttrDeleteVo {

    private Long attrId;

    private Long attrGroupId;
}

在AttrGroupController中

///product/attrgroup/attr/relation/delet
    @PostMapping ("/attr/relation/delete")
    public R deleteRelationGroup(@RequestBody AttrDeleteVo[] attrDeleteVo){
        attrAttrgroupRelationService.deleteBatchRelation(attrDeleteVo);
    return  R.ok();
    }

创建方法deleteBatchRelation(attrDeleteVo);

    @Override
    public void deleteBatchRelation(AttrDeleteVo[] attrDeleteVo) {
//将AttrDeleteVo[]类型的数据转换为AttrAttrgroupRelationEntity 类型的集合
        List<AttrDeleteVo> attrDeleteVos = Arrays.asList(attrDeleteVo);

        List<AttrAttrgroupRelationEntity> collect = attrDeleteVos.stream().map((item) -> {
            AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
            BeanUtils.copyProperties(item, relationEntity);
            return relationEntity;
        }).collect(Collectors.toList());
        attrAttrgroupRelationDao.deleteBatchRelation(collect);
    }

    void deleteBatchRelation(@Param("collect") List<AttrAttrgroupRelationEntity> collect);

sql语句

    <delete id="deleteBatchRelation">
DELETE  FROM `pms_attr_attrgroup_relation` WHERE
    <foreach collection="collect" item="item" separator=" OR ">
        (attr_id=#{item.attrId} AND attr_group_id=#{item.attrGroupId})
    </foreach>

    </delete>

新建分组关联属性

一、查询所有可选属性

在这里插入图片描述

在attrGroupController中

    //Request URL: http://localhost:88/api/product/attrgroup/1/noattr/relation?t=1663139281168&page=1&limit=10&key=
    @GetMapping("/{attrgroupId}/noattr/relation")
    public R attrNoRelation(@PathVariable("attrgroupId") Long attrgroupId,@RequestParam Map<String,Object> params){

        PageUtils page=attrService.getNoRelationAttr(params,attrgroupId);
    return R.ok().put("page",page);
    }

创建一个getNoRelationAttr(Map<String, Object> params, Long attrgroupId) 方法

    @Override
    public PageUtils getNoRelationAttr(Map<String, Object> params, Long attrgroupId) {
        //获取当前分组还没有关联的属性
        //1、要这些属性要和该分组是一个分类下
        //2、这些属性没有被其他分组和自己关联
        AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrgroupId);
        Long catelogId = attrGroupEntity.getCatelogId();
        //查询其他分组--得到他们的id
        List<AttrGroupEntity> attrGroupEntities = attrGroupDao.selectList(new QueryWrapper<AttrGroupEntity>().eq("catelog_id", catelogId));
        List<Long> collect = attrGroupEntities.stream().map((item) -> {
            return item.getAttrGroupId();
        }).collect(Collectors.toList());


        //分组关系表中被关联的attr
        List<AttrAttrgroupRelationEntity> attrAttrgroupRelationEntities = attrAttrgroupRelationDao.selectList(new QueryWrapper<AttrAttrgroupRelationEntity>().in("attr_group_id", collect));

        List<Long> collect1 = attrAttrgroupRelationEntities.stream().map((item) -> {
            return item.getAttrId();
        }).collect(Collectors.toList());



        QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper();
        //从attr表中剔除这些被关联过的attr
        this.list(queryWrapper.eq("catelog_id", catelogId).eq("attr_type",ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode()));
        if (collect1 != null && collect1.size() != 0) {
            queryWrapper.notIn("attr_id", collect1);
        }

        String key = (String) params.get("key");
        if (!StringUtils.isEmpty(key)) {
            queryWrapper.and((wapper) -> {
                wapper.like("attr_name", key).or().eq("attr_id", "key");
            });
        }

        IPage page = this.page(new Query<AttrEntity>().getPage(params), queryWrapper);

        return new PageUtils(page);
    }

二、确认新增操作

AttrGroupController中

    //Request URL: http://localhost:88/api/product/attrgroup/attr/relation
    @PostMapping("/attr/relation")
    public R saveAttr(@RequestBody List<AttrRepVo>attrRepVo){
        attrAttrgroupRelationService.saveAttrRelation(attrRepVo);
        return R.ok();
    }

创建saveAttrRelation方法

    @Override
    public void saveAttrRelation(List<AttrRepVo> attrRepVo) {

        //新增
        List<AttrAttrgroupRelationEntity> collect = attrRepVo.stream().map((item) -> {
            AttrAttrgroupRelationEntity attrAttrgroupRelation = new AttrAttrgroupRelationEntity();
            BeanUtils.copyProperties(item, attrAttrgroupRelation);
            return attrAttrgroupRelation;
        }).collect(Collectors.toList());
        this.saveBatch(collect);
    }

修改两个bug

当新增规格参数时,所属分组为空点击新增后报错:

在查询基本属性时,添加一个判断
在这里插入图片描述

在新增时(saveAttr)也要添加一个判断

在这里插入图片描述

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

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

相关文章

Java日期时间类

Java日期时间类Datenew Date()**获取当前系统时间**通过**指定毫秒数得到时间**format**指定日期格式**SimpleDateFormat的模式字母&#xff1a;parse()可以把**格式化的String转成对应Date**Calendar&#xff08;日历&#xff09;创建日期类对象获取日历对象的某个日历字段第三…

【Linux】五、Linux 进程控制(总)|进程创建|进程终止|进程等待进程程序替换|模拟shell

目录 一、进程创建 1.1 再谈 fork 函数 1.2 fork 函数返回值问题 1.2 写时拷贝 1.3 fork 常规用法 1.4 fork调用失败的原因 二、进程终止 2.1 进程退出码 2.2 进程退出场景 2.3 进程如何退出 三、进程等待 3.1 进程等待必要性 3.2 进程等待的方法 3.2.1 通过 wai…

【二进制安全面试题】linux篇:保护机制、函数调用约定

前言 上来先道歉&#xff0c;对不起(&#xff1e;人&#xff1c;&#xff1b;)对不起&#xff0c;博客鸽了好久。私下有好多朋友问我毕业工作的事情&#xff0c;毕竟搞二进制最重要的是要有热情&#xff01;我能做的也是有限&#xff0c;每个人的学习方式不完全相同&#xff0c…

Http4s 存在输入验证不当漏洞(CVE-2023-22465)

漏洞描述 http4s 是一个用于处理 HTTP 服务的 Scala 接口。 http4s 的受影响版本延迟加载模型化标头&#xff08;modeled headers&#xff09;&#xff0c;用于处理规范化标头的请求&#xff08;如&#xff1a;Option[Header] req.headers.get(“User-Agent”.ci)&#xff0…

C语言进阶——字符串函数(一)

目录 一. strlen 二. strcpy 三. strcat 四. strcmp 五. strncpy 六. strncat 七. strncmp 八. strstr 九. strtok 一. strlen 字符串以 \0 作为结束标志&#xff0c;strlen函数返回的是在字符串中 \0 前面出现的字符个数&#xff08;不包 含 \0 …

陪诊软件开发,陪诊服务具备哪些好处,前景如何

在当下互联网快速发展的时代&#xff0c;我们要首先明确&#xff0c;一个行业的发展最重要的是什么&#xff0c;什么才能促进这个行业的前进。当然是用户的数量&#xff0c;**而我们的陪诊服务&#xff0c;潜在的用户数量是巨大的。因为自己独立不便就医的人群&#xff0c;都可…

maven导入第三方jar包,出现找不到类

我们开发时&#xff0c;会用到第三代第三方的jar包&#xff0c;私服上没有&#xff0c;只能导入使用。 导入步骤&#xff1a; 1、在项目根目录建文件夹lib&#xff0c;降jar包复制过去。 在pom.xml中引入jar包&#xff0c;如引入bcprov-jdk15on-1.59.jar <dependency>&…

c++ - 第21节 - 智能指针

1.为什么需要智能指针 分析一下下面这段程序有没有什么内存方面的问题&#xff1f;前面在异常的博客中&#xff0c;我们分析了下图一的代码Func函数中如果div()函数抛异常则程序会直接跳到主函数的catch捕获程序部分&#xff0c;然后接着主函数catch捕获程序部分往后执行代码&a…

【IOS的safari浏览器】uniapp的H5项目 safari<添加到主屏幕>功能的实现(多页面、单页面)

uniapp的H5项目safari <添加到主屏幕>功能的实现ios添加到主屏幕的需求具体效果实现前提完整的HTML页面如何判断应用是从主屏幕打开还是从浏览器打开特殊情况ios添加到主屏幕的需求 添加到主屏幕——这个功能属于ios的safari浏览器的特性之一&#xff0c;他可以让我们的…

Java环境安装、替换jdk后java编译javac无反应,但java和java -version可以成功:实操解决方案

这里写自定义目录标题问题背景方案一方案二方案三问题背景 最近换了新电脑&#xff0c;安装java环境&#xff0c;一次性下载了3个jdk版本&#xff0c;在配置后返现 cmd命令行下javac编译java文件不成功&#xff0c;但是输入java和java -version没问题 在CSDN看了许多解决方案…

linux安装go

下载地址 https://studygolang.com/dl?id2&id15&id0&id8&adinfo678baidu&adinfo678baidu%3Epage%3E go语言中文网 解压 tar -xvf go1.19.4.linux-amd64.tar.gz 解压之后在 root目录下面 有个 go的文件夹 vim ~/.bashrc 配置环境变量 export GOROOT/roo…

【Dash搭建可视化网站】项目10:疫情数据可视化大屏制作步骤详解

疫情数据可视化大屏制作步骤详解1 项目效果图2 项目架构3 文件介绍和功能完善3.1 assets文件夹介绍3.2 app.py和index.py文件完善3.3 header.py文件完善3.4 cards.py文件完善3.5 api.py和api.ipynb文件完善3.5.1 数据获取3.5.2 数据处理3.5.3 接口数据导入header.py和cards.py文…

SpringMVC基本使用

SpringMVC基本使用1、回顾MVC1.1、什么是MVC1.2、Model1时代1.3、Model2时代1.4、回顾Servlet2、什么是SpringMVC2.1、概述2.2、中心控制器2.3、SpringMVC执行原理3、HelloSpring3.1、配置版3.2、注解版3.3、小结4、Controller 及 RestFul4.1、控制器Controller4.2、实现Contro…

【笔记:第一课】学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春

文章目录前言来源正文小结前言 创作开始时间&#xff1a;2023年1月9日20:02:19 如题&#xff0c;学习一下RISC-V。 来源 https://www.bilibili.com/video/BV1Q5411w7z5/ 正文 打好基础&#xff01;好好学习 本课程目的&#xff1a; 了解 RISC-V 的相关知识学会查看RISC-…

week10

T1 Einstein学画画 题目描述 Einstein 学起了画画。 此人比较懒~~&#xff0c;他希望用最少的笔画画出一张画…… 给定一个无向图&#xff0c;包含 nnn 个顶点&#xff08;编号 1∼n1 \sim n1∼n&#xff09;&#xff0c;mmm 条边&#xff0c;求最少用多少笔可以画出图中所…

解决RuntimeError: CUDA error: out of memory

注意&#xff1a;报错内容只有这一行&#xff0c;RuntimeError: CUDA error: out of memory&#xff0c;没有后面的内存分析。 因为报错的时候忘记截图了&#xff0c;修改好了才来记录的。这里引用别的博主的图片。图片来源 1&#xff1a;刚开始我怀疑是batchsize设的太大了&a…

vue01-基础

一、vue简介 1.1 描述 一套用于构建用户界面的渐进式JavaScript框架 构建用户界面&#xff1a;把数据处理成界面 渐进式&#xff1a;可以从简单应用引入的轻量小巧核心库&#xff0c;扩展至各式vue插件 1.2 特点 1.组件化模式&#xff0c;提高代码复用率且便于维护&#…

【自学Python】Python整型(int)

Python整型(int) Python整型(int)教程 Python 整型专门用来表示整数。 Python 整型支持四种形式&#xff0c;即十进制形式、二进制形式、八进制形式和十六进制形式。 Python整型(int) 十进制形式 Python 最常见的整数就是十进制形式的整数。在使用十进制表示整数值时&…

虚拟化技术学习笔记7

1、KVM虚拟机CPU热添加&#xff1a; # 能够了解虚拟机添加CPU的作用及预准备 # 能够通过virt-manager为虚拟机添加CPU # 能够通过virsh命令为虚拟机添加CPU CPU热添加&#xff0c;不需要重新启动虚拟机。这个是CPU的热添加。 virsh list virsh dominfo centos7-1lscpuvish s…

软件测试中的网络问题

1.背景 在测试过程中&#xff0c;出现的问题&#xff0c;除了代码问题&#xff0c;还有很多的网络问题&#xff0c;所以需要了解网络知识&#xff0c;这样能发现网络问题&#xff0c;尽快解决就能提高效率。 2.计算机网络体系结构 OSI七层模型&#xff1a;物理层&#xff0c…