分类和品牌关联

news2024/11/15 15:46:02

文章目录

    • 1.数据库表设计
        • 1.多表关联设计
        • 2.创建表
    • 2.使用renren-generator生成CRUD
        • 1.基本配置检查
          • 1.generator.properties
          • 2.application.yml
        • 2.生成代码
          • 1.进入localhost:81生成代码
          • 2.将main目录覆盖sunliving-commodity模块的main目录
        • 3.代码检查
          • 1.注释掉CategoryBrandRelationController.java的@RequiresPermissions注解即可
          • 2.接口测试(通过网关访问)
            • 1.http://localhost:5050/api/sunliving-commodity/commodity/categorybrandrelation/list
            • 2.http://localhost:5050/api/sunliving-commodity/commodity/categorybrandrelation/save
    • 3.第五次部署
        • 1.后端部署
          • 1.由于没有添加新模块,所以不需区分多环境,网关也不需要改
          • 2.将sunliving-commodity模块激活为prod
          • 3.maven打包
          • 4.测试执行
          • 5.部署上线
          • 6.启动成功
        • 2.前端部署
          • 1.根目录打包
          • 2.切换到node16,dist目录执行serve
          • 3.Nacos将上线四个后端项目
          • 4.测试无误
          • 5.部署上线
          • 6.测试依然无误
    • 4.前端显示界面 brand.vue
        • 1.新增关联分类的按钮
          • 1.新增按钮
          • 2.实现方法
        • 2.引入品牌和分类关联的对话框
          • 1.最后的div前面引入
          • 2.数据池中定义信息
          • 3.方法显示对话框
        • 3.显示关联分类的级联菜单
          • 1.添加方法,获取分类列表,带层级
          • 2.初始化时调用这个方法
          • 3.结果展示
    • 5.添加分类关联
        • 1.前端 brand.vue
          • 1.点击关联分类按钮,将品牌id放到数据池的brandId中
          • 2.编写addBrandCategoryRelation,发送新增关联的请求
        • 2.后端 sunliving-commodity模块
          • 1.service层
            • 1.CategoryBrandRelationService.java 新增方法
            • 2.CategoryBrandRelationServiceImpl.java 实现方法
          • 2.controller层
            • CategoryBrandRelationController.java 编写接口
        • 3.测试
        • 4.两个小问题
          • 1.添加成功之后关闭弹窗
          • 2.下一次点击新增关联时不保存上一次记录
    • 6.显示分类关联列表
        • 1.后端sunliving-commodity模块
          • 1.service层
            • 1.CategoryBrandRelationService.java
            • 2.CategoryBrandRelationServiceImpl.java
          • 2.controller层
          • 3.测试
        • 2.前端 brand.vue
          • 1.找到列表绑定的属性
          • 2.找到点击关联按钮触发的方法,为属性赋值
          • 3.查看结果
        • 3.几个小问题
          • 1.在新增关联之后并没有刷新分类列表
            • 1.只需在addBrandCategoryRelation这个新增关联的方法操作成功后刷新表格即可
            • 2.展示
          • 2.已经有关联了,但是还会重复插入的问题
            • 1.修改后端CategoryBrandRelationServiceImpl.java的saveRelationById方法,先检测是否表中已经有关联信息了
            • 2.重启测试
    • 7.删除分类关联列表
        • 1.后端sunliving-commodity模块
          • 1.CategoryBrandRelationController.java 已经提供了根据id删除的接口
        • 2.前端brand.vue
          • 1.发现移除按钮,使用的是插槽机制,可以直接获取当前行的id和brandId
          • 2.编写deleteCateRelationHandle方法
          • 3.测试

1.数据库表设计

1.多表关联设计

image-20240418195253885

2.创建表
use sunliving_commodity;

CREATE TABLE commodity_category_brand_relation
(
    id            BIGINT NOT NULL AUTO_INCREMENT,
    brand_id      BIGINT COMMENT '品牌 id',
    category_id   BIGINT COMMENT '分类 id',
    brand_name    VARCHAR(255) COMMENT '品牌名称',
    category_name VARCHAR(255) COMMENT '分类名称',
    PRIMARY KEY (id)
) CHARSET = utf8mb4 COMMENT ='品牌分类关联表';

SELECT *
FROM `commodity_category_brand_relation`;

2.使用renren-generator生成CRUD

1.基本配置检查
1.generator.properties

image-20240418195944810

2.application.yml

image-20240418200023765

2.生成代码
1.进入localhost:81生成代码

image-20240418200124912

2.将main目录覆盖sunliving-commodity模块的main目录

image-20240418200502230

image-20240418200552845

3.代码检查
1.注释掉CategoryBrandRelationController.java的@RequiresPermissions注解即可

image-20240418200917839

2.接口测试(通过网关访问)
1.http://localhost:5050/api/sunliving-commodity/commodity/categorybrandrelation/list

image-20240418201554073

2.http://localhost:5050/api/sunliving-commodity/commodity/categorybrandrelation/save

image-20240418202057349

3.第五次部署

1.后端部署
1.由于没有添加新模块,所以不需区分多环境,网关也不需要改
2.将sunliving-commodity模块激活为prod
3.maven打包

image-20240418203435669

4.测试执行

image-20240418203605883

5.部署上线

image-20240418203829855

6.启动成功

image-20240418203911794

2.前端部署
1.根目录打包

image-20240418204118744

2.切换到node16,dist目录执行serve

image-20240418204217618

3.Nacos将上线四个后端项目

image-20240418204330705

4.测试无误

image-20240418204522400

5.部署上线

image-20240418204826925

6.测试依然无误

image-20240418204953485

4.前端显示界面 brand.vue

1.新增关联分类的按钮
1.新增按钮

image-20240419093623315

2.实现方法

image-20240419093711833

2.引入品牌和分类关联的对话框
1.最后的div前面引入
    <!-- 品牌和分类关联的对话框 -->
    <el-dialog title="关联分类" :visible.sync="cateRelationDialogVisible" width="30%">
      <el-popover placement="right-end" v-model="popCatelogSelectVisible">
        <!-- <category-cascader :catelogPath.sync="catelogPath"></category-cascader>-->
        <!-- 这里我们加入分类的 Cascader 级联选择器, 前面我们使用过 -->
        <el-cascader
          v-model="cascadedCategoryId" :options="categorys" :props="props"></el-cascader>
        <div style="text-align: right; margin: 0">
          <el-button size="mini" type="text" @click="popCatelogSelectVisible = false">取 消
          </el-button>
          <el-button type="primary" size="mini" @click="addBrandCategoryRelation"> 确 定
          </el-button>
        </div>
        <el-button slot="reference">新增关联</el-button>
      </el-popover>
      <el-table :data="cateRelationTableData" style="width: 100%">
        <el-table-column prop="id" label="#"></el-table-column>
        <el-table-column prop="brandName" label="品牌名"></el-table-column>
        <el-table-column prop="categoryName" label="分类名"></el-table-column>
        <el-table-column fixed="right" header-align="center" align="center" label="操作">
          <template slot-scope="scope">
            <el-button
              type="text" size="small" @click="deleteCateRelationHandle(scope.row.id,scope.row.brandId)">移除
            </el-button>
          </template>
        </el-table-column>
      </el-table>
      <span slot="footer" class="dialog-footer">
    <el-button @click="cateRelationDialogVisible = false">取 消</el-button>
    <el-button type="primary" @click="cateRelationDialogVisible = false"> 确 定
    </el-button>
    </span>
    </el-dialog>
2.数据池中定义信息
      cateRelationDialogVisible: false, // 品牌和分类关联的对话框
      cateRelationTableData: [], // 品牌和分类关联的表格数据
      cascadedCategoryId: [], // 级联选择器的值,从 categories 中取
      popCatelogSelectVisible: false, // 是否显示分类选择器
      props: { //显示返回的家居分类的哪些字段/信息
        value: "id", // 级联选择器的值
        label: "name", // 级联选择器的显示标签
        children: "childrenCategories" // 级联选择器的子选项
      },
      categorys: [], //所有的家居分类
      brandId: 0, //品牌 id, 默认为 0
3.方法显示对话框

image-20240419093946923

image-20240419094002089

3.显示关联分类的级联菜单
1.添加方法,获取分类列表,带层级
    // 获取分类列表(带层级)
    getCategories() {
      this.$http({
        url: process.env.COMMODITY_BASEPATH + '/commodity/category/list/tree',
        method: 'get'
      }).then(({data}) => { // 解构了data
        this.categorys = data.data;
      })
    }
2.初始化时调用这个方法

image-20240419094516747

3.结果展示

image-20240419094247215

5.添加分类关联

1.前端 brand.vue
1.点击关联分类按钮,将品牌id放到数据池的brandId中

image-20240419095645659

2.编写addBrandCategoryRelation,发送新增关联的请求
    // 新增关联
    addBrandCategoryRelation() {
      // 获取品牌 id 和分类 id
      this.$http({
        // 向品牌分类关联表的接口发送请求,要求得到品牌名和分类名
        url: process.env.COMMODITY_BASEPATH + '/commodity/categorybrandrelation/relation',
        method: 'post',
        params: this.$http.adornParams({
          brandId: this.brandId,
          categoryId: this.cascadedCategoryId[this.cascadedCategoryId.length - 1]
        })
      }).then(({data}) => {
        if (data && data.code === 0) {
          this.$message({
            message: '操作成功',
            type: 'success',
            duration: 1500
          })
          this.cateRelationDialogVisible = false
        } else {
          this.$message.error(data.msg)
        }
      })
    }
2.后端 sunliving-commodity模块
1.service层
1.CategoryBrandRelationService.java 新增方法
    /**
     * 获取品牌分类关联信息
     * @param brandId
     * @param categoryId
     * @return
     */
    void saveRelationById(Long brandId, Long categoryId);
2.CategoryBrandRelationServiceImpl.java 实现方法

image-20240419110605445

    @Override
    public void saveRelationById(Long brandId, Long categoryId) {
        // 根据brandId和categoryId查询品牌名和分类名
        String brandName = brandDao.selectById(brandId).getName();
        String categoryName = categoryDao.selectById(categoryId).getName();
        // 插入到关联表中
        CategoryBrandRelationEntity categoryBrandRelationEntity = new CategoryBrandRelationEntity();
        categoryBrandRelationEntity.setBrandName(brandName);
        categoryBrandRelationEntity.setCategoryId(categoryId);
        categoryBrandRelationEntity.setCategoryName(categoryName);
        categoryBrandRelationEntity.setBrandId(brandId);
        categoryBrandRelationDao.insert(categoryBrandRelationEntity);
    }
2.controller层
CategoryBrandRelationController.java 编写接口
    /**
     * 关联
     */
    @RequestMapping("/relation")
    // @RequiresPermissions("commodity:categorybrandrelation:list")
    public R relation(@RequestParam Map<String, Object> params){
        long brandId = Long.parseLong(params.get("brandId").toString());
        long categoryId = Long.parseLong(params.get("categoryId").toString());
        categoryBrandRelationService.saveRelationById(brandId, categoryId);
        return R.ok();
    }
3.测试

image-20240419110629470

image-20240419110619989

4.两个小问题
1.添加成功之后关闭弹窗

image-20240419110915704

image-20240419110935565

2.下一次点击新增关联时不保存上一次记录

image-20240419111307317

image-20240419111259069

6.显示分类关联列表

1.后端sunliving-commodity模块
1.service层
1.CategoryBrandRelationService.java
    /**
     * 根据品牌id获取关联的分类
     * @param brandId
     * @return
     */
    List<CategoryBrandRelationEntity> getCateRelationTableDataById(Long brandId);
2.CategoryBrandRelationServiceImpl.java
    @Override
    public List<CategoryBrandRelationEntity> getCateRelationTableDataById(Long brandId) {
        return categoryBrandRelationDao.selectList(new QueryWrapper<CategoryBrandRelationEntity>().eq("brand_id", brandId));
    }
2.controller层
    /**
     * 根据brandId查询关联的分类
     */
    @RequestMapping("/list/{brandId}")
    // @RequiresPermissions("commodity:categorybrandrelation:list")
    public R getCateRelationTableDataById(@PathVariable("brandId") Long brandId){
        // 根据brandId查询关联的分类
        return R.ok().put("data", categoryBrandRelationService.getCateRelationTableDataById(brandId));
    }
3.测试

image-20240419113554394

2.前端 brand.vue
1.找到列表绑定的属性

image-20240419113756264

2.找到点击关联按钮触发的方法,为属性赋值
    // 关联分类
    relateCategoryHandle(id) {
      // 显示分类信息
      this.$http({
        url: process.env.COMMODITY_BASEPATH + '/commodity/categorybrandrelation/list/' + id,
        method: 'get'
      }).then(({data}) => {
        if (data && data.code === 0) {
          this.cateRelationTableData = data.data
        } else {
          this.cateRelationTableData = []
        }
      })
      // 点击关联分类按钮,得到品牌 id,并放到 brandId 中
      this.brandId = id
      this.cateRelationDialogVisible = true
    }
3.查看结果

image-20240419114728799

3.几个小问题
1.在新增关联之后并没有刷新分类列表
1.只需在addBrandCategoryRelation这个新增关联的方法操作成功后刷新表格即可

image-20240419115339506

2.展示

image-20240419115608631

2.已经有关联了,但是还会重复插入的问题
1.修改后端CategoryBrandRelationServiceImpl.java的saveRelationById方法,先检测是否表中已经有关联信息了
        // 查询一下是否已经存在关联关系,如果有就不插入
        List<CategoryBrandRelationEntity> categoryBrandRelationEntities = categoryBrandRelationDao.selectList(new QueryWrapper<CategoryBrandRelationEntity>().eq("brand_id", brandId).eq("category_id", categoryId));
        if (categoryBrandRelationEntities.size() > 0) {
            return;
        }

image-20240419120159719

2.重启测试

image-20240419120235271

image-20240419120248294

7.删除分类关联列表

1.后端sunliving-commodity模块
1.CategoryBrandRelationController.java 已经提供了根据id删除的接口

image-20240419134427521

2.前端brand.vue
1.发现移除按钮,使用的是插槽机制,可以直接获取当前行的id和brandId

image-20240419134558267

2.编写deleteCateRelationHandle方法
    // 根据id删除品牌和分类的关联
    deleteCateRelationHandle(id, brandId) {
      this.$http({
        url: process.env.COMMODITY_BASEPATH + '/commodity/categorybrandrelation/delete',
        method: 'post',
        // 数组的形式传入id参数
        data: this.$http.adornData([id], false)
      }).then(({data}) => {
        if (data && data.code === 0) {
          this.$message({
            message: '操作成功',
            type: 'success',
            duration: 1500
          })
          this.relateCategoryHandle(brandId)
        } else {
          this.$message.error(data.msg)
        }
      })
    }
3.测试

image-20240419134857206

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

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

相关文章

使用xsd验证xml格式的正确性

1.1 基础知识介绍 XML简介&#xff1a;XML是可扩展标记语言&#xff08;eXtensible Markup Language&#xff09;的缩写&#xff0c;它是一种数据表示格式&#xff0c;可以描述非常复杂的数据结构&#xff0c;常用于传输和存储数据。xml文件、xml消息。XSD简介&#xff1a;是X…

JS对象超细

目录 一、对象是什么 1.对象声明语法 2.对象有属性和方法组成 二、对象的使用 1.对象的使用 &#xff08;1&#xff09;查 &#xff08;2&#xff09;改 &#xff08;3&#xff09;增 &#xff08;4&#xff09;删&#xff08;了解&#xff09; &#xff08;5&#xf…

九州未来十二周年丨聚力同行,奔赴智能新未来

九州未来迎来十二周年&#xff01; 从国内首批提供 OpenStack 云服务的专业公司&#xff0c; 经过十二年的发展&#xff0c; 现今成长为开放智能云边架构引领者。 在这十二年的时间中&#xff0c; 九州未来持续创新&#xff0c;步履不停&#xff0c; 打造成熟的云基础设施…

【软件测试】软件测试基础理论

目录 软件测试简介软件产生过程小结 主流测试掌握技能功能测试功能测试的注意事项 自动化测试自动化测试的优势自动化测试的限制和适用性&#xff1a;自动化测试的注意事项 接口测试接口测试通常可以涵盖以下方面接口测试的注意事项 性能测试性能测试的几个方面性能测试的注意事…

JavaSE:Clonable接口、浅拷贝与深拷贝

1、引言 我们在学习的数组时&#xff0c;就了解到了数组克隆方法&#xff0c;可以通过数组克隆方法来拷贝一个一模一样的数组&#xff1a; 那对于自定义类型中有没有克隆方法呢&#xff1f;答案是有的&#xff01; 就让这篇文章来帮助大家学习自定义类型的拷贝&#xff01; …

基于深度学习的表情识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着人工智能技术的快速发展&#xff0c;表情识别成为了人机交互领域的一个研究热点。表情识别技术旨…

docker redis 持久化

1、拉取redis镜像 docker pull redis:latest 2、 mkdir /data/redis 3、填充redis.conf文件及根据需求修改相应的配置 •通过官网地址找到对应版本的配置文件 •将配置信息复制到redis.conf中 •常见的修改配置 https://redis.io/docs/latest/operate/oss_and_stack/managem…

K8s 高级调度

文章目录 K8s 高级调度CronJobinitContainerTaint 和 Toleration污点&#xff08;Taint&#xff09;容忍&#xff08;Toleration&#xff09; AffinityNodeAffinityPodAnffinity 和 PodAntiAffinity 总结 K8s 高级调度 CronJob 在 k8s 中周期性运行计划任务&#xff0c;与 li…

获取支持Windows7的最新Edge离线版本

从110版本开始&#xff0c;微软Edge和谷歌停止了对Win7、Win8/8.1的支持&#xff0c;后续又发布了几版安全更新&#xff0c;截止目前为止&#xff0c;能支持Win7的版本是 109.0.1518.140。 如果你想用最新版本谷歌浏览器&#xff0c;可以考虑下Supermium&#xff0c;这个浏览器…

Flask CORS: 解决跨域资源共享问题的利器

文章目录 安装和启用 CORS配置 CORS拓展 在本文中&#xff0c;我们介绍了如何使用 Flask-CORS 扩展来解决跨域问题。Flask-CORS 是一个方便的工具&#xff0c;可以帮助我们轻松地实现跨域资源共享支持。 安装和启用 CORS 要开始使用 Flask-CORS&#xff0c;我们需要先安装它。…

一些常见的程序设计问题

秒杀 redis缓存库存 1.判断库存名额是否充足&#xff0c;2.进行扣减 为了防止超卖&#xff0c;必须保证这两部的原子性 库存扣减后发送mq消息&#xff0c;去异步执行创建订单流程&#xff0c;创建订单失败会造成少卖。可加重试机制&#xff0c;对多次重试依旧失败的&#xff…

react 函数组件 开发模式默认被渲染两次

这是 React 刻意为之&#xff0c;函数式组件应当遵从函数式编程风格&#xff0c;每次执行应该是无副作用的(no sideEffect)&#xff0c;在 dev 下多次渲染组件&#xff0c;是为了防止开发者写出有问题的代码。 用 React 写函数组件&#xff0c;如何避免重复渲染&#xff1f; -…

【BUG】流式响应requests得到: ping - 和时间戳

前情提要 运行Langchain-Chatchat项目&#xff0c;使用自定义请求访问API Server流式输出 报错展示 b: ping - 2024-05-22 00:46:04.83252000:00\r\n\r\n报错原因 这通常是由于 Server-Sent Events (SSE) 实现中使用的“心跳”机制&#xff0c;以确保连接保持活跃。一些 SSE…

使用python实现socket进行消息传输-demo

Socket 是什么 Socket 是一种在计算机网络中用于实现进程间通信的一种机制。它是网络编程中的重要概念&#xff0c;通过它可以在不同的计算机之间进行数据传输和通信。Socket 可以用于实现各种网络应用&#xff0c;包括客户端-服务器模型、P2P 应用等。基本上&#xff0c;Sock…

新零售数据中台:构建零售业高效率、智能化的数据处理平台_光点科技

随着互联网技术的快速发展和移动支付、大数据等技术的广泛应用&#xff0c;零售行业已经逐渐从传统零售向新零售模式转变。在这个变革的时代背景下&#xff0c;新零售数据中台应运而生&#xff0c;它作为零售行业数据资源的整合与智能分析的核心载体&#xff0c;成为推动零售行…

基于消息中间件的异步通信机制在系统解耦中的优化与实现

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起进步&am…

重生之我要精通JAVA--第五周笔记

文章目录 APIJDK7时间Date时间类CalendarSimpleDateFormat 类SimpleDateFormat 类作用 JDK8时间Zoneld时区 包装类Integer成员方法 Arrays Lambda表达式标准格式注意点好处省略写法 集合进阶Collection迭代器遍历Collection集合获取迭代器Iterator中的常用方法细节注意点 增强f…

【软考中级 软件设计师】计算机网络和安全

计算机网络和安全是软件设计师&#xff08;软考中级&#xff09;考试中的重要组成部分&#xff0c;它涵盖了网络基础、网络协议、网络架构、网络安全等多个方面。以下是一些核心概念和要点&#xff0c; 计算机网络基础 OSI七层模型&#xff1a;物理层、数据链路层、网络层、传…

【20天拿下Pytorch:Day 7】Dataset和DataLoader

文章目录 1. Dataset和DataLoader概述1.1 概要1.2 获取一个batch数据的步骤1.3 Dataset和DataLoader的功能分工1.4 Dataset和DataLoader的主要接口 2. 使用Dataset创建数据集2.1 根据Tensor创建数据集2.2 根据图片目录创建图片数据集2.3 创建自定义数据集 3. 使用DataLoader加载…

C++ TCP发送Socket数据

DEVC需要加入ws2_32库 #include <iostream> #include <winsock2.h>#pragma comment(lib, "ws2_32.lib")void sendData(const char* ip, int port, const char* data) {WSADATA wsaData;SOCKET sockfd;struct sockaddr_in server_addr;// 初始化Winsock…