谷粒商城实战笔记-48~49-商品服务-API-三级分类-查询-树形展示三级分类数据-前端优化

文章目录

  • 一,48-商品服务-API-三级分类-查询-树形展示三级分类数据
    • 1,创建商品服务命名空间
    • 2,商品服务增加配置
    • 3,网关增加商品服务的路由配置
    • 4,前端树形展示
    • 5,测试
  • 二,49-商品服务-API-三级分类-删除-页面效果
    • 1,支持编辑三级分类
    • 2,体验优化
    • 完整代码
  • 高效干活:nacos快速启动

本节的主要内容是前后端联调,解决网关到商品服务的路由配置、前端的树形展示、已经前端的功能增加和体验优化。

一,48-商品服务-API-三级分类-查询-树形展示三级分类数据

1,创建商品服务命名空间

在nacos上创建product命名空间,所有商品服务相关的配置都放在这个空间。

在这里插入图片描述

把商品服务数据库相关的配置从本地迁移到nacos。

在这里插入图片描述

2,商品服务增加配置

商品服务增加bootstrap.yml配置文件,其中包含nacos配置中心信息:

  • 配置中心地址
  • 配置中心命名空间
  • 服务名称
spring:cloud:nacos:config:server-addr: 127.0.0.1:8848namespace: 709272d4-12a3-4657-b039-af32012c794fapplication:name: gulimall-product

3,网关增加商品服务的路由配置

网关配置路由。

        - id: gulimall-producturi: lb://gulimall-productpredicates:- Path=/api/product/**filters:- RewritePath=/api/(?<segment>.*),/$\{segment}

在这里插入图片描述
这段配置是Spring Cloud Gateway的路由规则定义,它用于将特定的HTTP请求转发到微服务后端。下面是配置的详细解释:

  • id: gulimall-product:
    这是路由的唯一标识符,可以帮助你在配置中引用这个路由规则。

  • uri: lb://gulimall-product:
    这指定了当匹配路由规则时,请求应该被转发到哪个服务。这里的lb://表示使用负载均衡方式调用服务。gulimall-product是服务名,通常在服务发现机制(如Netflix Eureka、Consul等)中注册的服务实例会被查找。

  • predicates:
    这是一个谓词列表,用于定义哪些请求应该被此路由规则处理。这里的Path=/api/product/**表示任何以/api/product/开头的URL路径都会匹配这个规则。

  • filters:
    路由过滤器允许对请求和响应进行修改。这里的RewritePath=/api/(?<segment>.*),/$\{segment}是一个路径重写过滤器,其作用是将原始请求路径中的/api/部分移除,然后将剩余部分转发给目标服务。

    • /(?<segment>.*?): 这个正则表达式捕获从/api/开始直到下一个/前的所有字符(包括多个层级的路径),并将这部分保存为名为segment的组。
    • ,/$\{segment}: 这个字符串模板告诉Spring Cloud Gateway将捕获的segment值替换回URL中,但不包含/api/这部分。

举个例子,如果客户端发送一个请求到http://localhost:8080/api/product/list,根据上述配置,这个请求将会被重写为http://gulimall-product/list(假设gulimall-product服务监听在默认端口上),从而绕过/api/前缀直接转发给gulimall-product服务。

4,前端树形展示

为了将三级分类在前端以树形结构进行展示,需要对组件category.vue做几处调整。

在这里插入图片描述

  • 将数组名改为menus,更容易读
  • label改为name,是因为后台数据中分类名称字段名是那么

此外,请求接口获得分类数据后,为数组menus赋值。
在这里插入图片描述
完整代码

<template><el-tree:data="menus":props="defaultProps"@node-click="handleNodeClick"></el-tree>
</template><script>
export default {components: {},props: {},data () {return {menus: [],defaultProps: {children: 'children',label: 'name',},}},methods: {handleNodeClick (data) {console.log(data)},// 获取分类数据getDataList () {this.dataListLoading = truethis.$http({url: this.$http.adornUrl('/product/category/list/tree'),method: 'get'}).then(({data}) => {console.log(data)this.dataListLoading = falsethis.menus = data.data})}},created() {this.getDataList()  // 获取分类数据}
}
</script>
<style scoped>
</style>

5,测试

在浏览器中访问,发现商品分类已经以树形结构进行展示了。

在这里插入图片描述

二,49-商品服务-API-三级分类-删除-页面效果

这一节的内容是优化前端界面,增加下列特性。

1,支持编辑三级分类

在每个三级分类后面增加两个按钮:

  • append,每个分类增加子分类
  • delete,删除当前分类

在这里插入图片描述

要实现这个效果,参考官网,在el-tree标签下增加如下代码。

<span class="custom-tree-node" slot-scope="{ node, data }"><span>{{ node.label }}</span><span><el-button type="text" size="mini" @click="() => append(data)">Append</el-button><el-button type="text" size="mini" @click="() => remove(node, data)">Delete</el-button></span></span>

在这里插入图片描述

同时,脚本下增加两个相对应的函数。

在这里插入图片描述
保存代码,刷新浏览器界面,两个按钮就会出现分类后。

2,体验优化

①点击append和delete按钮时,不要收缩分类树

el-tree绑定属性即可::expand-on-click-node="false"

②一级和二级分类才能append子分类,三级分类不能append

使用v-if结合分类数据的结构,满足条件才展示响应的按钮。

在这里插入图片描述

在Vue.js中,v-if是一个条件渲染指令,它根据表达式的真假来判断是否应该渲染一段代码。当表达式的结果为真时,对应的元素或片段将被插入到DOM中;反之,如果结果为假,则对应的元素或片段将不会被渲染,也就是说,它们完全不会存在于最终的DOM树中。

现在分析一下代码段:

<el-button v-if="node.level<=2" size="mini" @click="() => append(data)">Append
</el-button>
<el-button v-if="node.childNodes.length==0" type="text" size="mini" @click="() => remove(node, data)">Delete
</el-button>

两个<el-button>标签,每个都使用了v-if指令:

  • ①第一个按钮的v-if条件是node.level<= 2。这意味着只有当node.level属性的值小于等于2时,这个按钮才会被渲染。

  • ②第二个按钮的v-if条件是node.childNodes.length == 0。这意味着只有当节点没有子节点时,“Delete”按钮才会被渲染,只允许删除没有子节点的节点。

③增加复选框

在这里插入图片描述
el-tree增加show-checkbox属性,即可显示复选框。
在这里插入图片描述
④el-tree增加node-key在这里插入图片描述

在Element UI的el-tree组件中,node-key属性用于指定树节点的唯一标识符。在树形结构的数据集中,每个节点通常都有一个唯一的ID或键,用来区分不同的节点。node-key属性就是用来告诉el-tree组件使用哪个字段作为节点的唯一标识。

作用:

①唯一标识:通过node-key属性,你可以指定树节点数据模型中哪个字段的值作为节点的唯一标识符。这在处理复杂的树形数据结构时非常有用,因为每个节点的标识符需要是全局唯一的,以避免在操作节点(如展开、折叠、选择、删除等)时产生冲突。

②性能优化:使用node-key可以提高el-tree组件在大数据量下的性能,尤其是在节点频繁变动的情况下。这是因为当el-tree内部需要查找或操作某个节点时,它可以快速定位到该节点,而无需遍历整个树。

③状态管理:在使用el-tree时,组件可能会存储某些状态信息,比如哪些节点被选中或展开。node-key属性的值可以帮助组件在更新状态时准确地追踪和识别每个节点。

完整代码

<template><el-tree node-key="catId" :data="menus" :props="defaultProps" :expand-on-click-node="false" show-checkbox><span class="custom-tree-node" slot-scope="{ node, data }" ><span>{{ node.label }}</span><span><el-button v-if="node.level<=2" size="mini" @click="() => append(data)">Append</el-button><el-button v-if="node.childNodes.length==0" type="text" size="mini" @click="() => remove(node, data)">Delete</el-button></span></span></el-tree>
</template><script>
export default {components: {},props: {},data() {return {menus: [],defaultProps: {children: "children",label: "name",},};},methods: {append(data){console.log(data);},remove(node, data){console.log(node, data);},// 获取分类数据getDataList() {this.dataListLoading = true;this.$http({url: this.$http.adornUrl("/product/category/list/tree"),method: "get",}).then(({ data }) => {console.log(data);this.dataListLoading = false;this.menus = data.data;});},},created() {this.getDataList(); // 获取分类数据},
};
</script>
<style scoped>
</style>

高效干活:nacos快速启动

windows上nacos的本地启动比较麻烦,每次要打开cmd,切换到对应目录,执行一个不容易记住命令,效率很低。

要解决这个问题也很简单,写一个bat脚本,配置到环境变量中,以后只要输入一个简单的命令就可以启动nacos了。

在这里插入图片描述

@echo off
setlocal enabledelayedexpansion
set NAOS_HOME=D:\sofeware\nacos-server-2.1.2\nacos
cd /d "!NAOS_HOME!\bin"
call startup.cmd -m standalone
endlocal

将这个脚本所在的目录配置到环境变量。

在这里插入图片描述

之后,只要在cmd输入下面的命令就可以启动nacos了。

在这里插入图片描述

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

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

相关文章

Python酷库之旅-第三方库Pandas(044)

目录 一、用法精讲 151、pandas.Series.any方法 151-1、语法 151-2、参数 151-3、功能 151-4、返回值 151-5、说明 151-6、用法 151-6-1、数据准备 151-6-2、代码示例 151-6-3、结果输出 152、pandas.Series.autocorr方法 152-1、语法 152-2、参数 152-3、功能 …

线上语音交友平台成熟案例源码出售本地找搭子交友app软件线下陪玩系统开发服务

1、上麦相亲互动:直播间内除了红娘外&#xff0c;还有男女用户两个视频麦位&#xff0c;直播间符合要求的用户可以申请上麦, 2、公屏聊天:为上麦用户可以通过在公屏发言的方式参与直播间内的话题互动。 3、私信异性用户之间可以发送私信消息&#xff0c;通过付要或开通会员可解…

无线领夹麦克风哪个牌子好?几十块和几百块的领夹麦克风推荐

现如今视频自媒体行业还在蓬勃发展&#xff0c;麦克风对于自媒体行业可以说是必不可少的装备了&#xff0c;在互联网“内卷”的时代&#xff0c;各大视频博主、Up主、主播大多都会使用无线麦克风来辅助视频和直播内容输出。无线领夹麦克风作为视频行业中的麦克风新宠&#xff0…

深入理解TCP:互联网通信的基石

深入理解TCP&#xff1a;互联网通信的基石 引言TCP的普遍应用TCP连接的建立与维护三次握手&#xff08;Three-Way Handshake&#xff09;连接的可靠性与超时重传数据传输与流量控制连接的终止状态转换 TCP与UDP的对比TCP协议栈的层级结构应用层&#xff08;Application Layer&a…

DevExpress WPF中文教程:如何完成GridControl的列和编辑器配置?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

【C++BFS算法】2192. 有向无环图中一个节点的所有祖先

本文涉及知识点 CBFS算法 LeetCode2192. 有向无环图中一个节点的所有祖先 给你一个正整数 n &#xff0c;它表示一个 有向无环图 中节点的数目&#xff0c;节点编号为 0 到 n - 1 &#xff08;包括两者&#xff09;。 给你一个二维整数数组 edges &#xff0c;其中 edges[i]…

springcloud rocketmq 新增的消费者组从哪里开始消费

如果新建一个新的消费者组&#xff0c;是否会消费历史消息&#xff0c;导致重复消费&#xff1f; 直接在 console 界面新增消费者组&#xff0c;但是没有办法绑定订阅关系&#xff0c;没有找到入口&#xff0c;在 控制台项目源码 rocketmq-externals 也没有找到可以确定订阅关系…

Android 常用调试工具/方法解析

一、内存相关 参考Android内存分析命令_dumpsys meminfo 算出rss-CSDN博客 1、基本概念 1&#xff09;PSS & RSS & USS & VSS a、PSS 概念&#xff1a;全称Proportional Set Size&#xff0c;根据进程实际使用的内存量按照共享比例分配给进程的一种内存度量方…

SpringBoot 项目配置文件注释乱码的问题解决方案

一、问题描述 在项目的配置文件中&#xff0c;我们写了一些注释&#xff0c;如下所示&#xff1a; 但是再次打开注释会变成乱码&#xff0c;如下所示&#xff1a; 那么如何解决呢&#xff1f; 二、解决方案 1. 点击” File→Setting" 2. 搜索“File Encodings”, 将框…

Wonder3D 论文学习

论文链接&#xff1a;https://arxiv.org/abs/2310.15008 代码链接&#xff1a;https://github.com/xxlong0/Wonder3D 解决了什么问题&#xff1f; 随着扩散模型的提出&#xff0c;3D 生成领域取得了长足进步。从单张图片重建出 3D 几何是计算机图形学和 3D 视觉的基础任务&am…

World of Warcraft [CLASSIC] Timebadge

游戏币【每个服务器实时金价不一样&#xff0c;本例子是5000-6000金】 1枚【魔兽世界时光徽章】 30天游戏时间。 5760金币游戏币&#xff0c;策划如何消耗游戏里面的金币总量&#xff0c;以及如何留住那些非人民币玩家呢 30天加上去了 World of Warcraft [CLASSIC] [魔兽世界…

搜索与下载Stable Diffusion 模型

我只是一个刚开始学习SD没多久小白&#xff0c;拿到别人的工作流想要运行时&#xff0c;很多时候还要下载对应的模型才能正常运行&#xff0c;虽然也可以通过comfyui-manager下载&#xff0c;不过有时候好像会下载失败&#xff0c;而单独下载所需模型&#xff0c;我自己试过&am…

英语科技写作 希拉里·格拉斯曼-蒂(英文版)pdf下载

下载链接&#xff1a; 链接1&#xff1a;https://pan.baidu.com 链接2&#xff1a;/s/1fxRUGnlJrKEzQVF6k1GmBA 提取码&#xff1a;b69t 由于是英文版&#xff0c;可能有些看着不太方便&#xff0c;可以在网页版使用以下软件中英文对照着看&#xff0c;看着更舒服&#xff0c;…

图书管理系统设计

设计一个图书管理系统时&#xff0c;我们需要考虑系统的基本功能、用户需求、技术选型以及数据的安全性和完整性。下面是一个基本的图书管理系统的设计概览&#xff1a; 1. 系统目标 管理图书信息&#xff1a;添加、删除、修改图书信息。借阅管理&#xff1a;处理借书、还书流…

Python 教程(二):语法与数据结构

目录 前言专栏列表语法特点实例代码基本数据类型变量命名规则赋值动态类型作用域示例代码 运算符list、set和dict 数据结构 区别1. list&#xff08;列表&#xff09;2. set&#xff08;集合&#xff09;3. dict&#xff08;字典&#xff09; 总结 前言 Python 是一种计算机编…

Linux调试器gdb

1.debug版本的文件才能调试 gcc默认编译生成的是release版本&#xff0c;在输入gcc编译指令时&#xff0c;要加-g&#xff0c;才会生成debug版本的可执行文件。 可以看到&#xff0c;code_dbug比code大&#xff0c;因为debug版本含有调试信息&#xff0c;往往比release版本的…

【BUG】已解决:SyntaxError:positional argument follows keyword argument

SyntaxError:positional argument follows keyword argument 目录 SyntaxError:positional argument follows keyword argument 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c…

【SOC 芯片设计 DFT 学习专栏 -- DFT OCC 与 ATPG的介绍】

请阅读【嵌入式及芯片开发学必备专栏】 请阅读【芯片设计 DFT 学习系列 】 如有侵权&#xff0c;请联系删除 转自&#xff1a; 简矽芯学堂 简矽芯学堂 2024年01月18日 09:00 陕西 文章目录 OCC 介绍Fast ScanFull chip ATPGPartition ATPGHierarchical ATPG OCC 介绍 OCC&am…

微信小程序实现聊天界面,发送功能

.wxml <scroll-view scroll-y"true" style"height: {{windowHeight}}px;"><view wx:for"{{chatList}}" wx:for-index"index" wx:for-item"item" style"padding-top:{{index0?30:0}}rpx"><!-- 左…

力扣高频SQL 50题(基础版)第十题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第十题1661. 每台机器的进程平均运行时间题目说明思路分析实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题&#xff08;基础版&#xff09;第十题 1661. 每台机器的进程平均运行时间 题目说明 表: Activity…