尚品汇-(五)

商品管理模块开发

下面用到的表:

属性表:

属性值表: 

分类一表:

分类二表:

 

分类三表:

 

 

1.1在service 模块下搭建service-product

搭建过程同common-util

 

添加配置文件application.yml

spring:application:name: service-productprofiles:active: devcloud:nacos:discovery:server-addr: 192.168.254.165:8848

添加配置文件application-dev.yml

server:port: 8206
mybatis-plus:mapper-locations: classpath:mapper/*Mapper.xmlconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
spring:datasource:driver-class-name: com.mysql.jdbc.Driverusername: rootpassword: rooturl: jdbc:mysql://192.168.254.165:3306/gmall_productredis:host: 192.168.200.129password:database: 0port: 6379zipkin:base-url: http://192.168.254.165:9411rabbitmq:host: 192.168.254.165port: 5672username: guestpassword: 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-selectv-model="category1Id"placeholder="请选择"@change="category1Changed"><el-optionv-for="category in categoryList1":key="category.id":label="category.name":value="category.id"/></el-select></el-form-item><!-- 二级分类 --><el-form-item label="二级分类"><el-selectv-model="category2Id"placeholder="请选择"@change="category2Changed"><el-optionv-for="category in categoryList2":key="category.id":label="category.name":value="category.id"/></el-select></el-form-item><!-- 三级分类 --><el-form-item label="三级分类"><el-selectv-model="category3Id"placeholder="请选择"@change="category3Changed"><el-optionv-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 = nullthis.category3Id = nullthis.categoryList2 = response.datathis.$emit('listenOnSelect', this.category1Id, 1)})// 清空属性列表this.attrInfoList = null},// 切换三级类别category2Changed() {prop.getCategory3(this.category2Id).then(response => {this.category3Id = nullthis.categoryList3 = response.datathis.$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 {@Autowiredprivate BaseCategory1Mapper baseCategory1Mapper;@Autowiredprivate BaseCategory2Mapper baseCategory2Mapper;@Autowiredprivate BaseCategory3Mapper baseCategory3Mapper;@Autowiredprivate BaseAttrInfoMapper baseAttrInfoMapper;@Autowiredprivate BaseAttrValueMapper baseAttrValueMapper;@Overridepublic List<BaseCategory1> getCategory1() {return baseCategory1Mapper.selectList(null);}@Overridepublic 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;}@Overridepublic List<BaseCategory3> getCategory3(Long category2Id) {// select * from baseCategory3 where Category2Id = ?QueryWrapper queryWrapper = new QueryWrapper<BaseCategory3>();queryWrapper.eq("category2_id",category2Id);return baseCategory3Mapper.selectList(queryWrapper);}@Overridepublic 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 {@Autowiredprivate 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">SELECTbai.id,bai.attr_name,bai.category_id,bai.category_level,bav.id attr_value_id,bav.value_name,bav.attr_idFROMbase_attr_info baiINNER 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.mzph.cn/web/32792.shtml

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

相关文章

C#基于SkiaSharp实现印章管理(1)

最近对着微软的教程学习SkiaSharp的概念及用法&#xff0c;由于之前使用GDI绘制过坐标系、印章等程序&#xff0c;准备使用SkiaSharp、SKControl控件编写简单的印章设计功能&#xff0c;并能用印章对图片盖章。本文实现创建印章背景、序列化及反序列化印章对象等功能。   VS2…

2-14 基于matlab的GA优化算法优化车间调度问题

基于matlab的GA优化算法优化车间调度问题。n个工作在m个台机器上加工。已知每个工作中工序加工顺序、各工序的加工时间以及每个工件所包含的工序&#xff0c;在满足约束条件的前提下&#xff0c;目的是确定机器上各工件顺序&#xff0c;以保证某项性能指标最优。程序功能说明&a…

视频讲解|【双层模型】分布式光伏储能系统的优化配置方法

1 主要内容 该讲解视频对应的程序链接为【双层模型】分布式光伏储能系统的优化配置方法&#xff0c;模型参考《分布式光伏储能系统的优化配置方法》&#xff0c;分为上下层求解方式&#xff0c;上层采用粒子群算法确定储能的选址和容量方案&#xff0c;以全年购电成本、网络损…

YouTube API接口:一键获取Playlist视频合集信息

核心功能介绍 在视频内容日益繁荣的今天&#xff0c;YouTube作为全球领先的视频分享平台&#xff0c;为内容创作者、品牌商家以及数据分析师提供了丰富的视频资源。其中&#xff0c;Playlist视频合集作为YouTube上的一种特色内容形式&#xff0c;深受用户喜爱。为了更好地满足…

TCP与UDP_三次握手_四次挥手

TCP vs UDP TCP数据 具体可以通过Cisco Packet Tracer工具查看&#xff1a; UDP数据 三次握手、四次挥手 为什么是3/4次&#xff1f;这牵扯到单工、双工通信的问题 TCP建立连接&#xff1a;表白 TCP释放连接&#xff1a;分手 TCP—建立连接—三次握手 解释&#xff1a; 首先&…

Rxjava2最全面的解析

说到区别&#xff0c;可能有的小伙伴会问&#xff0c;我没看过rxjava1。可以直接看rxjava2么。个人觉得不必要&#xff0c;因为 rxjava2.x 是按照 Reactive-Streams specification 规范完全的重写的&#xff0c;完全独立于 rxjava1.x 而存在&#xff0c;它改变了以往 rxjava1的…

如何看待鸿蒙HarmonyOS?

鸿蒙系统&#xff0c;自2019年8月9日诞生就一直处于舆论风口浪尖上的系统&#xff0c;从最开始的“套壳”OpenHarmony安卓的说法&#xff0c;到去年的不再兼容安卓的NEXT版本的技术预览版发布&#xff0c;对于鸿蒙到底是什么&#xff0c;以及鸿蒙的应用开发的讨论从来没停止过。…

物联网系统运维——移动电商服务器单点部署,web服务器部署,Nginx Web服务介绍,Nginx性能,部署,架构,及实验:安装并设置Nginx(重点)

一.web服务器介绍 Web服务器一般指网站服务器&#xff0c;是指驻留于因特网上提供某种特定类型计算机的程序&#xff0c;Web服务器可以向浏览器等Web客户端提供文档&#xff0c;也可以放置网站文件&#xff0c;让全世界浏览&#xff0c;可以放置数据文件&#xff0c;让全世界下…

力扣SQL50 游戏玩法分析 IV 子查询

Problem: 550. 游戏玩法分析 IV &#x1f468;‍&#x1f3eb; 参考题解 这个SQL查询的目的是计算每个玩家在登录后的第二天参与活动的比例。查询使用了子查询和左连接来实现这一目的。下面是查询的详细解释&#xff0c;包括每个部分的作用和注释&#xff1a; -- 计算每个玩…

文华财经多空精准买卖点止损止盈数值主图指标公式源码

文华财经多空精准买卖点止损止盈数值主图指标公式源码&#xff1a; DD:EVERY(H>HV(H,20),1); KK:EVERY(L<LV(L,20),1); D:DD&&SUM(DD,BARSLAST(KK))1; K:KK&&SUM(KK,BARSLAST(DD))1; Y:1; DRAWCOLORKLINE(Y&&ISDOWN,COLORYELLOW,0); DRAW…

【原创】springboot+mysql海鲜商城设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

Vue的Router?一个小demo秒了

效果展示 正文 登录页 <template><div><div class"login"><h3>图书管理系统</h3><div class"user"><span>账号&#xff1a;</span><input type"text" v-model"user" /></…

193.回溯算法:组合总和(力扣)

代码解决 class Solution { public:vector<int> res; // 当前组合的临时存储vector<vector<int>> result; // 存储所有符合条件的组合// 回溯函数void backtrcing(vector<int>& nums, int target, int flag, int index) {// 如果当前组合的和超过了…

高可用电商支付架构设计方案

高可用电商支付架构设计 在现代电商业务中&#xff0c;支付过程是其中至关重要的一环&#xff0c;一个高可用、安全稳定的支付架构不仅可以提高整个系统的可靠性和扩展性&#xff0c;降低维护成本&#xff0c;还可以优化用户体验&#xff0c;增加用户黏性。 本文将提出一种高…

121.网络游戏逆向分析与漏洞攻防-邮件系统数据分析-邮件读取与发送界面设计

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 现在的代码都是依据数据包来写的&#xff0c;如果看不懂代码&#xff0c;就说明没看懂数据包…

【jenkins1】gitlab与jenkins集成

文章目录 1.Jenkins-docker配置&#xff1a;运行在8080端口上&#xff0c;机器只要安装docker就能装载image并运行容器2.Jenkins与GitLab配置&#xff1a;docker ps查看正在运行&#xff0c;浏览器访问http://10....:8080/2.1 GitLab与Jenkins的Access Token配置&#xff1a;不…

Kubernetes排错(七)-Pod 状态一直 ContainerCreating

查看 Pod 事件 $ kubectl describe pod apigateway-6dc48bf8b6-l8xrw -n cn-staging 异常原因 1&#xff09;no space left on device ... Events:Type Reason Age From Message---- ------ …

[SAP ABAP] 读取内表数据

1.读取单条数据 1.1 索引查找 语法格式 READ TABLE <itab> INTO <wa> INDEX <idx>.<itab>&#xff1a;代表内表 <wa>&#xff1a;代表工作区 <idx>&#xff1a;代表索引值 示例1 结果显示&#xff1a; 1.2 关键字查找 READ TABLE <…

Redis协议规范简介

Redis客户端使用为名为RESP&#xff08;Redis序列化协议&#xff09;的协议与Redis服务器进行通信。虽然该协议是专门为Redis设计的&#xff0c;但它也可以用于其他的CS软件项目的通信协议。 RESP可以序列化不同的数据类型&#xff0c;如整型&#xff0c;字符串&#xff0c;数…

【python】python海底捞门店营业数据分析与可视化(数据集+源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…