尚品汇-(五)

news2025/1/15 16:33:09

商品管理模块开发

下面用到的表:

属性表:

属性值表: 

分类一表:

分类二表:

 

分类三表:

 

 

1.1在service 模块下搭建service-product

搭建过程同common-util

 

添加配置文件application.yml

spring:
  application:
    name: service-product
  profiles:
    active: dev
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.254.165:8848

添加配置文件application-dev.yml

server:
  port: 8206
mybatis-plus:
  mapper-locations: classpath:mapper/*Mapper.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: root
    url: jdbc:mysql://192.168.254.165:3306/gmall_product
  redis:
    host: 192.168.200.129
    password:
    database: 0
    port: 6379
  zipkin:
    base-url: http://192.168.254.165:9411
  rabbitmq:
    host: 192.168.254.165
    port: 5672
    username: guest
    password: guest

创建启动类

包名:com.atguigu.gmall.product
@SpringBootApplication
@ComponentScan({"com.atguigu.gmall"})
@EnableDiscoveryClient
public class ServiceProductApplication {
   public static void main(String[] args) {
      SpringApplication.run(ServiceProductApplication.class, args);
   }
}

1.2搭建后台页面

  1. 拷贝资料中的前端项目页面,放入一个没有中文目录的文件下
  2. 在gmall-admin当前目录下cmd 回车
    1. npm install [安装依赖 node_modules] 项目库中有node_modules 就不需要执行npm install
    2. npm run dev
    3. 直接访问浏览器
  3. 将两个配置文件
    1. dev.env.js  http://localhost
    2. index.js host: 'localhost', port: 8888

注:第一个为网关地址,第二个为项目访问地址

注意:如果出现未找到node-sass模块,只需要在窗口中运行

npm install node-sass 即可,然后重新npm installnpm run dev
运行项目的时候,没有提示node-sass 模块为找到,需要看一下当前的nodejs 版本

node -v :  建议v10.15.3

后端前端结构:

 配置目录:

api:定义请求的路径 

 

index:可以修改项目启动的端口

dev.env.js:有请求的基础路径:

npm run dev:启动项目: 

改变了数据库的结果,我们需要往ES中推送数据,为了更好的在两个服务建解耦,无论是依赖它调用还是Feign调用,都有依赖性,最终要保证原子性,保证原子性,如果一个不成功会影响其他的操作,这个是不允许的,我们会用到一种方式消息队列,完成数据修改,发送消息到消息队列,ES中的索引库会监听消息对列,进而操作索引库,达到数据同步。

1.3属性管理功能

三级分类组件封装:

一级分类组件:CategorySelector.vue

<template>
  <!--查询表单-->
  <el-form :inline="true" class="demo-form-inline">

    <!-- 一级分类 -->
    <el-form-item label="一级分类">
      <el-select
        v-model="category1Id"
        placeholder="请选择"
        @change="category1Changed">
        <el-option
          v-for="category in categoryList1"
          :key="category.id"
          :label="category.name"
          :value="category.id"/>
      </el-select>
    </el-form-item>

    <!-- 二级分类 -->
    <el-form-item label="二级分类">
      <el-select
        v-model="category2Id"
        placeholder="请选择"
        @change="category2Changed">
        <el-option
          v-for="category in categoryList2"
          :key="category.id"
          :label="category.name"
          :value="category.id"/>
      </el-select>
    </el-form-item>

    <!-- 三级分类 -->
    <el-form-item label="三级分类">
      <el-select
        v-model="category3Id"
        placeholder="请选择"
        @change="category3Changed">
        <el-option
          v-for="category in categoryList3"
          :key="category.id"
          :label="category.name"
          :value="category.id"/>
      </el-select>
    </el-form-item>

  </el-form>

</template>

<script>
import prop from '@/api/components/CategorySelector'

export default {

  data() {
    return {
      // 查询表单数据
      category1Id: null,
      category2Id: null,
      category3Id: null,
      categoryList1: [],
      categoryList2: [],
      categoryList3: []
    }
  },

  // 初始化一级类别
  created() {
    prop.getCategory1().then(response => {
      this.categoryList1 = response.data
    })
  },

  methods: {
    // 切换二级类别
    category1Changed() {
      prop.getCategory2(this.category1Id).then(response => {
        this.category2Id = null
        this.category3Id = null
        this.categoryList2 = response.data

        this.$emit('listenOnSelect', this.category1Id, 1)
      })

      // 清空属性列表
      this.attrInfoList = null
    },

    // 切换三级类别
    category2Changed() {
      prop.getCategory3(this.category2Id).then(response => {
        this.category3Id = null
        this.categoryList3 = response.data

        this.$emit('listenOnSelect', this.category2Id, 2)
      })
    },

    // 显示属性列表
    category3Changed() {
      const category = this.categoryList3.find(item => {
        return this.category3Id === item.id
      })
      console.log(category)

      // 子组件向父组件传值
      this.$emit('listenOnSelect', this.category3Id, 3)
      this.$emit('listenOnCateSelect', this.category3Id, category.name)
    }

  }

}
</script>

js访问接口:CategorySelector.js

import request from '@/utils/request'

export default {

  // 查找一级分类
  getCategory1() {
    return request({
      url: '/admin/product/getCategory1',
      method: 'get'
    })
  },

  // 查找二级分类
  getCategory2(category1Id) {
    return request({
      url: '/admin/product/getCategory2/' + category1Id,
      method: 'get'
    })
  },

  // 查找三级分类
  getCategory3(category2Id) {
    return request({
      url: '/admin/product/getCategory3/' + category2Id,
      method: 'get'
    })
  }

}

 <!--三级下拉列表-->
    <CategorySelector @listenOnSelect="getAttrInfoList" />

import prop from '@/api/baseinfo/prop' 


1.4三级分类(属性)查询实现

 创建Mapper:

包名:com.atguigu.gmall.product.mapper

BaseCategory1Mapper : 

@Mapper
public interface BaseCategory1Mapper extends BaseMapper<BaseCategory1> {
}

BaseCategory2Mapper : 

@Mapper
public interface BaseCategory2Mapper extends BaseMapper<BaseCategory2> {
}

BaseCategory3Mapper  

@Mapper
public interface BaseCategory3Mapper extends BaseMapper<BaseCategory3> {
}

BaseAttrInfoMapper :

@Mapper
public interface BaseAttrInfoMapper extends BaseMapper<BaseAttrInfo> {

BaseAttrValueMapper : 

@Mapper
public interface BaseAttrValueMapper extends BaseMapper<BaseAttrValue> {
}

 创建Service:


public interface ManageService {

/**
 * 查询所有的一级分类信息
 * @return
 */
List<BaseCategory1> getCategory1();

/**
 * 根据一级分类Id 查询二级分类数据
 * @param category1Id
 * @return
 */
List<BaseCategory2> getCategory2(Long category1Id);

/**
 * 根据二级分类Id 查询三级分类数据
 * @param category2Id
 * @return
 */
List<BaseCategory3> getCategory3(Long category2Id);


/**
 * 根据分类Id 获取平台属性数据
 * 接口说明:
 *      1,平台属性可以挂在一级分类、二级分类和三级分类
 *      2,查询一级分类下面的平台属性,传:category1Id,0,0;   取出该分类的平台属性
 *      3,查询二级分类下面的平台属性,传:category1Id,category2Id,0; 
 *         取出对应一级分类下面的平台属性与二级分类对应的平台属性
 *      4,查询三级分类下面的平台属性,传:category1Id,category2Id,category3Id;
 *         取出对应一级分类、二级分类与三级分类对应的平台属性
 *
 * @param category1Id
 * @param category2Id
 * @param category3Id
 * @return
 */
List<BaseAttrInfo> getAttrInfoList(Long category1Id, Long category2Id, Long category3Id);
}

实习类:ManageServiceImpl :

@Service
public class ManageServiceImpl implements ManageService {
    @Autowired
    private BaseCategory1Mapper baseCategory1Mapper;

    @Autowired
    private BaseCategory2Mapper baseCategory2Mapper;

    @Autowired
    private BaseCategory3Mapper baseCategory3Mapper;

    @Autowired
    private BaseAttrInfoMapper baseAttrInfoMapper;

    @Autowired
    private BaseAttrValueMapper baseAttrValueMapper;

    @Override
    public List<BaseCategory1> getCategory1() {
        return baseCategory1Mapper.selectList(null);
    }

    @Override
    public List<BaseCategory2> getCategory2(Long category1Id) {
        // select * from baseCategory2 where Category1Id = ?
        QueryWrapper queryWrapper = new QueryWrapper<BaseCategory2>();
        queryWrapper.eq("category1_id",category1Id);
        List<BaseCategory2> baseCategory2List = baseCategory2Mapper.selectList(queryWrapper);
        return baseCategory2List;
    }

    @Override
    public List<BaseCategory3> getCategory3(Long category2Id) {
        // select * from baseCategory3 where Category2Id = ?
        QueryWrapper queryWrapper = new QueryWrapper<BaseCategory3>();
        queryWrapper.eq("category2_id",category2Id);
        return baseCategory3Mapper.selectList(queryWrapper);
    }

    @Override
    public List<BaseAttrInfo> getAttrInfoList(Long category1Id, Long category2Id, Long category3Id) {
        // 调用mapper:
        return baseAttrInfoMapper.selectBaseAttrInfoList(category1Id, category2Id, category3Id);
    }
}

Servie中注入mapper的时候会显示报错,这个报错是警告,这是正常的,不管也没事,为了让他不显示可以这样干:

一:加一个注解

 二:Alt+回车

勾选去掉,或者更改提示颜色 

三:使用注解抑制警告

创建Controller:

@Api(tags = "商品基础属性接口")
@RestController
@RequestMapping("admin/product")
public class BaseManageController {

    @Autowired
    private ManageService manageService;

    /**
     * 查询所有的一级分类信息
     * @return
     */
    @GetMapping("getCategory1")
    public Result<List<BaseCategory1>> getCategory1() {
        List<BaseCategory1> baseCategory1List = manageService.getCategory1();
        return Result.ok(baseCategory1List);
    }

    /**
     * 根据一级分类Id 查询二级分类数据
     * @param category1Id
     * @return
     */
    @GetMapping("getCategory2/{category1Id}")
    public Result<List<BaseCategory2>> getCategory2(@PathVariable("category1Id") Long category1Id) {
        List<BaseCategory2> baseCategory2List = manageService.getCategory2(category1Id);
        return Result.ok(baseCategory2List);
    }

    /**
     * 根据二级分类Id 查询三级分类数据
     * @param category2Id
     * @return
     */
    @GetMapping("getCategory3/{category2Id}")
    public Result<List<BaseCategory3>> getCategory3(@PathVariable("category2Id") Long category2Id) {
        List<BaseCategory3> baseCategory3List = manageService.getCategory3(category2Id);
        return Result.ok(baseCategory3List);
    }
    
    /**
     * 根据分类Id 获取平台属性数据
     * @param category1Id
     * @param category2Id
     * @param category3Id
     * @return
     */
    @GetMapping("attrInfoList/{category1Id}/{category2Id}/{category3Id}")
    public Result<List<BaseAttrInfo>> attrInfoList(@PathVariable("category1Id") Long category1Id,
                                                   @PathVariable("category2Id") Long category2Id,
                                                   @PathVariable("category3Id") Long category3Id) {
        List<BaseAttrInfo> baseAttrInfoList = manageService.getAttrInfoList(category1Id, category2Id, category3Id);
        return Result.ok(baseAttrInfoList);
    }
}

 getCategory1接口:查询所有的一级分类信息

 根据一级分类Id 查询二级分类数据:getCategory2/{category1Id}

根据二级分类Id 查询三级分类数据:getCategory3/{category2Id}

随着分类的增加,下面的属性会逐渐增多,走到哪一级就会显示哪一级的修改

不用查询* 

 

多表查询就需要手动写sql了

 在BaseAttrInfoMapper类添加方法:

/**
 * 根据分类Id 查询平台属性集合对象 | 编写xml 文件
 * @param category1Id
 * @param category2Id 
 * @param category3Id
 * @return
 */
List<BaseAttrInfo> selectBaseAttrInfoList(@Param("category1Id")Long category1Id, @Param("category2Id")Long category2Id, @Param("category3Id")Long category3Id);

在BaseAttrInfoMapper.xml添加查询方法:

在resources目录添加mapper文件夹,添加 BaseAttrInfoMapper.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<!--namespace 定义接口的全路径-->
<mapper namespace="com.atguigu.gmall.product.mapper.BaseAttrInfoMapper">
    <!--
        resultMap:表示返回的映射结果集
        id : 表示唯一标识
        type:表示返回结果集的数据类型
        autoMapping : 自动映射
    -->
    <resultMap id="baseAttrInfoMap" type="com.atguigu.gmall.model.product.BaseAttrInfo" autoMapping="true">
        <!--id:表示主键 property:表示实体类的属性名 column:表示通过sql 执行以后查询出来的字段名-->
        <id property="id" column="id"></id>
        <!--result : 表示映射普通字段-->
        <!--<result property="" column=""></result>-->
        <!--mybatis 如何配置一对多-->
        <!--ofType : 返回的数据类型-->
        <collection property="attrValueList" ofType="com.atguigu.gmall.model.product.BaseAttrValue" autoMapping="true">
            <!--如果有字段重复则起别名-->
            <id property="id" column="attr_value_id"></id>
        </collection>
    </resultMap>
    <!--id:表示方法名-->
    <select id="selectBaseAttrInfoList" resultMap="baseAttrInfoMap">
       SELECT
           bai.id,
           bai.attr_name,
           bai.category_id,
           bai.category_level,
           bav.id attr_value_id,
           bav.value_name,
           bav.attr_id
        FROM
           base_attr_info bai
        INNER JOIN base_attr_value bav ON bai.id = bav.attr_id
        <where>
           <if test="category1Id != null and category1Id != 0">
               or (bai.category_id = #{category1Id} and bai.category_level = 1)
           </if>
            <if test="category2Id != null and category2Id != 0">
                or (bai.category_id = #{category2Id} and bai.category_level = 2)
            </if>
            <if test="category3Id != null and category3Id != 0">
                or (bai.category_id = #{category3Id} and bai.category_level = 3)
            </if>
        </where>
        order by bai.category_level, bai.id
</select>

</mapper>

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

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

相关文章

江协科技51单片机学习- p16 矩阵键盘

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

Linux中web集群-nginx负载均衡及案例

概述 代理&#xff1a;外卖&#xff0c;中介&#xff0c;中间商&#xff0c;用户无法直接做事情&#xff0c;通过中介进行处理 用户–》代理–》节点&#xff0c;后面只有一个节点&#xff0c;一般使用的是nginx代理功能即可&#xff0c;如果是集群就需要使用nginx负载均衡 …

【QT】Widget

目录 widget常用属性及其作用 enabled geomtry window frame window frame的影响 相关API windowTitle windowIcon qrc机制 qrc使用方式 自定义鼠标图片 设置字体样式 设置鼠标悬停提示 toolTip 控件获取焦点 styleSheet widget常用属性及其作用 属性作用…

C# 类中访问修饰符的优先级

参考链接 : C# 指南 - .NET 托管语言 | Microsoft Learn 访问修饰符 - C# | Microsoft Learn

Stable Diffusion初体验——基于机器学习通过神经网络的强大AI平台

文章目录 前言最新热门活动&#xff01;&#xff01;平台介绍 一.创建应用 Stable Diffusion WebUI初始化上传模型&#xff0c;VAE&#xff0c;lora 介绍sd模型&#xff0c;vae&#xff0c;lora模型进入应用文生图工作区调参区图生图 结语小程序活动——6.20火热上线&#x1f5…

【b站-湖科大教书匠】2 物理层-计算机网络微课堂

课程地址&#xff1a;【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;】 https://www.bilibili.com/video/BV1c4411d7jb/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 2 物理层 2.1 物理层的基本概念 2.2 物理层下面的传输媒…

Web渗透:文件上传-后端过滤

在上一篇文件上传的内容中笔者阐述了文件上传漏洞产生的相关原理以及使用了一个pikachu靶场的例子进行演示&#xff0c;在这个例子中涉及到了前端代码对于文件上传漏洞的相关防护&#xff0c;以及站在攻击者的角度我们要如何绕过前端的防护成功进行攻击&#xff1b;但是事实上对…

每日签到页面模板组件,简单好用,用了会上瘾的那种

uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、Web&#xff08;响应式&#xff09;、以及各种小程序&#xff08;微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝&#xff09;、快应用等多个平台。 今日给…

Django之云存储(二)

一、Django使用云存储 建立项目 django-admin startproject project_demo创建子应用 python manage.py startapp app_name修改配置文件,设置模板视图路径 settings.py TEMPLATES = [{BACKEND: django.template.backends.django.DjangoTemplates,DIRS: [os.path.join(BASE_DIR,…

【Unity服务器01】之AssetBundle上传加载u3d模型

首先打开一个项目导入一个简单的场景 导入怪物资源&#xff0c; AssetBundle知识点&#xff1a; 1.指定资源的AssetBundle属性标签 &#xff08;1&#xff09;找到AssetBundle属性标签 &#xff08;2&#xff09;A标签 代表&#xff1a;资源目录&#xff08;决定打包之后在哪…

微信小程序之横向列表展示

效果图 参考微信小程序可看 代码&#xff1a; <view class"lbtClass"><view class"swiper-container"><scroll-view class"swiper" scroll-x"true" :scroll-left"scrollLeft"><block v-for"(six…

怎么用Excel生成标签打印模板,自动生成二维码

环境&#xff1a; EXCEL2021 16.0 问题描述&#xff1a; 怎么用excel生成标签打印模板自动生成二维码 解决方案&#xff1a; 在Excel中生成标签打印模板并自动生成二维码&#xff0c;可以通过以下几个步骤完成&#xff1a; 1. 准备数据 首先&#xff0c;确保你的Excel表…

C#.net6.0+sqlserver2019医院手术麻醉信息管理系统源码 可对接院内HIS、LIS、PACS 支持二次开发

C#.net6.0sqlserver2019医院手术麻醉信息管理系统源码 可对接院内HIS、LIS、PACS 支持二次开发 手麻系统的功能涵盖了麻醉临床业务管理、麻醉运营业务管理以及手术进程管理等&#xff0c;实现了将多种麻醉病历文书与医院HIS系统的有效关联&#xff0c;让手术室人员、设备资源和…

鹅算法(GOOSE Algorithm,GOOSE)求解复杂城市地形下无人机避障三维航迹规划,可以修改障碍物及起始点(Matlab代码)

一、鹅算法 鹅优化算法&#xff08;GOOSE Algorithm&#xff0c;GOOSE)从鹅的休息和觅食行为获得灵感&#xff0c;当鹅听到任何奇怪的声音或动作时&#xff0c;它们会发出响亮的声音来唤醒群中的个体&#xff0c;并保证它们的安全。 参考文献 [1]Hamad R K, Rashid T A. GOO…

day16--513.找树左下角的值+112. 路径总和+106.从中序与后序遍历序列构造二叉树

一、513.找树左下角的值 题目链接&#xff1a;https://leetcode.cn/problems/find-bottom-left-tree-value/ 文章讲解&#xff1a;https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html 视频讲解&#xff1a;https://www.b…

JavaSE基础总结复习之面向对象の知识总结

目录 Java语言的基础特点 面向对象 类和对象 类 类的构造 一&#xff0c;发现类 二&#xff0c;发现类的共有属性&#xff08;成员变量&#xff09; 三&#xff0c;定义类的成员方法&#xff08;行为&#xff0c;动词&#xff09; 四&#xff0c;使用类创建对象 对象…

Linux——man帮助命令

一、man 获得帮助信息 基本语法&#xff1a;man [命令或配置文件] &#xff08;功能描述&#xff1a;获得帮助信息&#xff09; 查看 ls 命令的帮助信息 [roothadoop101 ~]# man ls man [数字] [函数] 1、Standard commands &#xff08;标准命令&#xff09; 2、System…

Structured Steaming结构化流详解:大案例解析(第12天)

系列文章目录 一、结构化流介绍&#xff08;了解&#xff09; 二、结构化流的编程模型&#xff08;掌握&#xff09; 三、Spark 和 Kafka 整合&#xff0c;流处理&#xff0c;批处理演示&#xff08;掌握&#xff09; 四、物联网数据分析案例&#xff08;熟悉&#xff09; 文章…

【服务器06】之【如何不开外网连接GitHub】

登录GitHub官网 GitHub: Let’s build from here GitHub 注册账号 登录账号 输入一个自定义名字&#xff0c;点击创建存储库就可以了 首先 如何在不开外网的条件下使用GitHub 第一步 下载安装Steam(Watt TooklKit) 区分一下如何查看哪个官网&#xff08;没有百度广告就是…

CPP-类对象大小的组成

要计算一个类对象的大小要先明白一个问题&#xff1a;类中既可以有成员变量&#xff0c;又可以有成员函数&#xff0c;那么一个类的对象中包含了什么&#xff1f; 下面来看一段代码&#xff1a; // 类中既有成员变量&#xff0c;又有成员函数 class A1 { public:void f1() {} …