uni-app开发日志:实现无限层级树形分类页面,通过schema2code生成代码并在此基础上完善修改list、add和edit页面

news2024/9/27 19:19:25

本文中省略很多开发说明,可能需有一定uniapp的实战基础的朋友才能看明白。
schema2code 生成的无限级分类页面只提供超简易版的功能,没有层级选择,只能自己填入父类ID,列表的时候也是全部显示,没有层级关系,无法根据分类逐层显示,或者树形显示。因此,我们需要在这个基础上进行修改,当然,我的原则是尽量少改一点。

第一种:分层分页显示各级的方式

页面预览:

schema2code生成的分类修改后实现的功能

一、schema数据库结构设计

根据大意随便写一下,假设存在一个某某类别的数据表,其schema主要内容如下,其中授权、属性等在实际生产时再打磨。

{
	"bsonType": "object",
	"required": ["key","name"],
	"permission": {
		"read": true,
		"create": "'admin' in auth.role",
		"update": "'admin' in auth.role",
		"delete": "'admin' in auth.role"
	},
	"properties": {
		"_id": {
			"description": "ID,系统自动生成"
		},
		"parent_id": {
			"bsonType": "string",
			"title": "上级",
			"description": "父ID,用于多级分类",
			"parentKey": "_id", // 指定父子关系为:如果数据库记录A的_id和数据库记录B的parent_id相等,则A是B的父级。
			"enumType": "tree", // 默认表单控件将生成uni-data-picker
			"enum": {
				"collection": "test",
				"orderby": "sort asc, value asc",
				"field": "name as text, _id as value"
			}
		},
		"name":{
			"bsonType": "string",
			"title": "名称",
			"description": "分类名称",
			"defaultValue": ""
		},
		"sort": {
			"bsonType": "int",
			"title": "排序",
			"description": "类别排序,越大越靠后",
			"defaultValue": 0
		}
	}
}

二、生成前端

  • 选择schema2code生成前端,这时在uni-model或者pages目录下就应该会产生对应三个文件list.vueadd.vueedit.vue
  • 其中list.vue改动较多。
  • 在本案例中将用到一个云对象category,此云对象主要就是将类目数据进行排序并进行层级嵌套或扁平化处理,输出的结果可以为扁平化单层结果也可以嵌套多层结果(子类都嵌套于children中)。

结果示例:

// 扁平化
[{
	_id:'1',
	parent_id:''
	name:'a',
	sort:'0'
},{
	_id:'2',
	parent_id:''
	name:'b',
	sort:'0'
},{
	_id:'3',
	parent_id:'1'
	name:'c',
	sort:'0'
},{
	_id:'4',
	parent_id:'3'
	name:'d',
	sort:'d'
},{
	_id:'5',
	parent_id:'2'
	name:'e',
	sort:'0'
}]


// 嵌套
[{
	_id:'1',
	parent_id:''
	name:'a',
	sort:'0',
	children:[{
		_id:'3',
		parent_id:'1'
		name:'c',
		sort:'0'children:[{
			_id:'4',
			parent_id:'3'
			key:'d',
			name:'d',
			sort:'d'
		}]
	}]
},{
	_id:'2',
	parent_id:''
	name:'b',
	sort:'0',
	children:[{
		_id:'5',
		parent_id:'2'
		name:'e',
		sort:'0'
	}]
}]

三、修改list.vue

1. 增加基本配置

...
//导入云对象
const category = uniCloud.importObject('category') 
...
// 增加两个变量
export default {
		data() {
			return {
				parentId: '', // 当前父类id
				navTree: [], // 导航栏树形数据
...

2. 增加路径导航、刷新和重置

// html
<view class="uni-header">
	<view class="uni-group">
		<view class="uni-title">
			<uni-data-select v-model="parentId" :localdata="navTree" placeholder="当前位置" @change="navChange"></uni-data-select>
		</view>
		<view class="uni-sub-title">
			<button class="uni-button" type="default" size="mini" @click="navigateTo('./list?parentId='+parentId)">刷新</button>
			<button class="uni-button" type="default" size="mini" @click="navigateTo('./list?parentId=')">重置</button>
		</view>
	</view>
	...
// javascript
...
onLoad(e) {
	...	
	// 获取父级id
	this.parentId = (e.parentId) ? e.parentId : ''
	// 修改数据库读取条件
	this.where = 'parent_id == "' + this.parentId + '"'
	
	// 创建db引用
	// const db = uniCloud.database()
	
	// 查询获得父节点路径,用于当前位置
	db.collection(this.collectionList).field('_id, parent_id, name, sort').get({
			getTreePath: {
				"startWith": "_id=='" + this.parentId + "'"
			}
		})
		.then((res) => {
			//使用自建云对象category中的函数processTree对数据进行排序和符号标注,具体根据各自的对象函数要求操作
			cateogry.processTree(res.result.data, {
				isFlat: true,
				sourceFlat: false,
				spaceIcon: '・'
			}).then(res => {
				this.navTree = [
					...this.navTree,
					...res.result.map(item => ({
						value: item._id,
						text: item.__levelPrefix + item.name
					}))
				];
			}).catch(e => {
				console.log(e)
			})
		}).catch((err) => {
			uni.showModal({
				content: err.message || '请求服务失败',
				showCancel: false
			})
		}).finally(() => {
			uni.hideLoading()
			// console.log("finally")
		})
	},
...
methods: {
	// 导航位置下拉菜单选中后跳转页面同时传递一个parentId
	navChange(e) {
		uni.navigateTo({
			url: './list?parentId=' + e
		});
	},

3. 修改新增按钮

在原来的新增按钮点击动作加一个参数parentId,用来传递本层父类ID,这样点击新增按钮后打开的页面都将默认选中本层级的分类

<button class="uni-button" type="default" size="mini" @click="navigateTo('./add?parentId='+parentId)">新增</button>

这里有些人喜欢将新建子类按钮放在每条数据后,这样可以直接在该条创建子类,而默认的新建按钮改名为新建一级分类按钮。

本文实现的是点新建按钮默认选中当前分类,可以随时重选。

四、修改add.vue

这里修改的代码比较简单,就是将传递的父类id赋值给表单parent_id,这样父类picker默认就是当前父类,也可以自行重新选择。

...
onLoad(e) {
	this.formData.parent_id = e.parentId;
},
...

进化版的话就是不能选自己,不能选没有授权的。

五、修改edit.vue

主要就是根据选择的节点来修改picker选择器的当前值,默认情况下该picker选择器必须选中最后一层才有值,但实际上可能在中间某层就要选中,因此用选中节点事件 @nodeclick 来获取该节点的值的方法。

// html
...
<uni-forms-item name="parent_id" label="上级">
  <uni-data-picker ... @nodeclick="onNodeClick_parentId"></uni-data-picker>
</uni-forms-item>
...

// javascript
...
methods: {
	  onNodeClick_parentId(e){
		  this.formData.parent_id = e.value
	  },
...

第二种:单页显示所有层级的方式

就是在一个页面上显示所有的层级,适用场景:层数较少,数据量较少,当然,也可以进化到每次只显示一层,点击后再加载其下的子类。

页面预览
在这里插入图片描述
与分页显示主要不同点就是:

一、数据扁平化处理后赋值给组件

unicloud-db组件获取的数据在onqueryload方法中用自定义的云对象/云函数category进行一次处理,输出带层级符号的数据列表,把这个数据列表赋值给this.$refs.udb.dataList即可,该数据必须是扁平化的,这样页面仅需循环显示即可。

···
const category = uniCloud.importObject('category') //导入云对象
...
onqueryload(data) {
	category.processTree(data, {
		isFlat: true
	}).then(res => {			
		this.$refs.udb.dataList = res.result
	}).catch(e => {
		this.$refs.udb.dataList = []
	})
	this.exportExcelData = data
},
...

二、页面增加前缀符号

扁平化处理后的数据主要内容如下,我们需要其生成的__levelPrefix

[
    {
        "_id": "66c721dec390b34a06875acb",
        "name": "a",
        "parent_id": "",
        "__levelPrefix": "┬ "
    },
    {
        "_id": "66c721f00b9a11185f5c531f",
        "name": "c",
        "parent_id": "66c721dec390b34a06875acb",
        "__levelPrefix": "└┬ "
    }
    ...
]

页面中名称的位置加上符号

// 空格需要转为&nbsp;才能正常使用
<uni-td align="left">{{item.__levelPrefix ? item.__levelPrefix.replace(/ /g, '&nbsp;') : ''}}{{item.name}}</uni-td>

三、新增与修改

  • list.vue 右上方的新建按钮只能创造一级类;
  • list.vue 每条数据增加一个创建子类的按钮;
  • add.vueedit.vue和上一种方式类似,不再赘述

吐槽一下,其实add和edit这两个页面可以合并为一个,当_id不存在时就是add,存在就是edit,我原来的系统就是这么做的,这样的话,改动某一个组件只要动一个文件就行,现在就要动两个文件,增加了遗漏出错的可能。

在这里插入图片描述

参考:
uni-app开发日志:unicloud使用时遇到的问题解决汇总(不断补充)
制表符 制表符号大全
JQL语法
schema2code代码生成系统
组件名:uni-data-picker
uni-app之数据驱动的picker选择器( uni-data-picker)之可以选择到任意级别
unicloud项目中树形分类页面的快速开发(一)
unicloud项目中树形分类页面的快速开发(二)
unicloud项目中树形分类页面的快速开发(三)

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

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

相关文章

闲置物品交易平台网站商城-计算机毕设Java|springboot实战项目

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

WIFI 频段及信道简介

一、WiFi 三频AP规划信道时&#xff0c;建议分别采用2.4G、5.2G、5.8G频段可用信道。 2.4G频段&#xff1b;5.2G频段&#xff1b;5.8G频段。 1、中国5G WiFi频段 5.8GHz频段&#xff0c;中国开放只有149、153、157、161、165这5个信道&#xff1b; 其中可支持一组80MHz信道…

Linux 软件编程 数据库与网页

sqlite3数据库操作效率&#xff1a; 1.增加事务机制 2.关闭数据库磁盘同步写入 3.使用预处理SQL语句机制实现提升数据库效率 事务机制&#xff1a; 1.可以提高sqlite处理数据的效率 2.确保数据的一致性 关闭数据库中写同步机制&#xff1a; 在…

文献阅读:单细胞分辨率下小鼠大脑衰老的分子和空间特征

文献介绍 文献题目&#xff1a; Molecular and spatial signatures of mouse brain aging at single-cell resolution 研究团队&#xff1a; 庄小威&#xff08;美国哈佛大学&#xff09;、Catherine Dulac&#xff08;美国哈佛大学&#xff09; 发表时间&#xff1a; 2022-12…

具有手势识别的动捕设备——mHand Pro VR数据手套

数据手套是指通过手套内置的传感器&#xff0c;实时采集手部运动数据的动捕设备&#xff0c;通常被应用于虚拟仿真、虚拟现实vr交互、动画制作等领域。其中&#xff0c;基于惯性动作捕捉技术研发的数据手套&#xff0c;凭借其高性价比的优势&#xff0c;在市面上的应用更为广泛…

数据驱动的社交网络:分析Facebook的算法与用户体验

在现代社交网络中&#xff0c;Facebook以其庞大的用户基础和数据驱动的算法而著称。这些算法不仅决定了用户在平台上的体验&#xff0c;也深刻影响了他们与内容的互动方式。本文将深入分析Facebook的算法如何通过数据驱动优化用户体验&#xff0c;并探讨其在社交网络中的作用。…

图片合集

文章目录 线段树 8.23 线段树 8.23

企业网中网关的部署位置浅析

园区网网关部署位置 园区网络中的终端设备&#xff0c;想要访问外部的Internet&#xff0c;第一步首先要找自己的网关设备。然后通过网关设备再进入园区网内部进行数据路由。 一般园区网的网关部署方案有两类&#xff1a; 一、园区网关部署在汇聚层 如果把网关部署在汇聚交换…

安利一款企业都在用的Ser-U替代产品

Ser-U&#xff0c;这款历史悠久的FTP服务器软件&#xff0c;曾经在市场上占据着主导地位。然而&#xff0c;随着技术的不断进步&#xff0c;一些新兴的竞争对手开始崭露头角&#xff0c;比如镭速这样的替代品&#xff0c;正在逐渐成为企业的新宠。那么&#xff0c;企业为何要寻…

医院住院管理系统+vue

TOC ssm012医院住院管理系统vue 第1章 绪论 1.1背景及意义 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。人们生活水平的不断提高&#xff0c;日常生活中人们对医院住院管理系统方面的要求也在不断提高&#xff0c;随着医院住院管理系统受到广大用户的关注&…

CVPR 2024论文分享┆LMDrive:基于大模型的闭环端到端自动驾驶

论文简介 本推文主要介绍2024 CVPR接收的一篇论文《LMDrive: Closed-Loop End-to-End Driving with Large Language Models》&#xff0c;该论文提出了一种名为LMDrive的创新方法&#xff0c;展示了如何利用大型语言模型在自动驾驶系统中进行闭环的端到端驾驶控制。传统的自动…

用Python制作一个可以预测天气的程序(附代码)

要用Python制作一个简单的天气预报应用&#xff0c;你可以使用多种方法&#xff0c;但最常见和方便的是利用现有的天气API&#xff08;如OpenWeatherMap、Weatherbit、AccuWeather等&#xff09;。这里&#xff0c;我将以OpenWeatherMap为例&#xff0c;展示如何编写一个简单的…

pikachu SSRF通关(服务器端请求伪造)

开始闯关吧 一共有两关 第1关 SSRF(curl) 按照指示点击下图蓝色字体的链接 得到了下图地址栏里的带参数的url&#xff0c;参数名是url&#xff0c; PHP的curl PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。 libcurl目前…

融合定位系统的误差与什么有关

在当今科技日新月异的时代&#xff0c;融合定位系统作为精准导航与定位的关键技术&#xff0c;广泛应用于智能手机、自动驾驶、无人机及智能物流等领域。然而&#xff0c;这一技术的准确性并非无懈可击&#xff0c;其误差来源复杂多样&#xff0c;深刻影响着定位精度与用户体验…

在线制作9png的好网站

https://inloop.github.io/shadow4android/ fook &#xff1a; https://github.com/inloop/shadow4android

常用科研工具(持续更新)

正所谓&#xff0c;工欲善其事,必先利其器。想要更好的做好科研&#xff0c;相应的科研工具必不可少。下面介绍一些科研工具。 1、Zotero 2、Watt ToolKit 3、paperwithcode 4、Typora 5、kaggle 1、文献管理 对于文献管理&#xff0c;必然少不了Zotero。之前看文献都是放在文…

Selenium与Web Scraping:自动化获取电影名称和评分的实战指南

背景/引言 在信息化高度发展的今天&#xff0c;获取数据的能力变得尤为重要。通过 Web Scraping&#xff0c;我们可以从动态网页中提取有价值的信息&#xff0c;例如在豆瓣电影中获取电影名称和评分。然而&#xff0c;随着网站反爬虫措施的不断增强&#xff0c;传统的抓取技术…

001-springcloud-base工程创建

文章目录 前言SpringCloud与SpringBoot 对应版本SpringCloud与SpringCloudAlibaba对应版本官方文档 1 新建Project和Maven父工程1.1 Maven父工程步骤1.1.1 New Project1.1.2 聚合总父工程名字1.1.3 字符编码1.1.4 注解生效激活1.1.5 java编译版本选择JDK17 1.2 父工程POM文件1.…

ViT笔记学习

1.VIT ViT原理讲解 ViT结合代码 1.3 ViT模型架构 我们先结合下面的动图来粗略地分析一下ViT的工作流程&#xff0c;如下&#xff1a; 将一张图片分成patches将patches铺平将铺平后的patches的线性映射到更低维的空间添加位置embedding编码信息将图像序列数据送入标准Transfor…

Lagent 自定义你的 Agent 智能体

环境配置 开发机选择 30% A100&#xff0c;镜像选择为 Cuda12.2-conda。 首先来为 Lagent 配置一个可用的环境。 # 创建环境 conda create -n agent_camp3 python3.10 -y # 激活环境 conda activate agent_camp3 # 安装 torch conda install pytorch2.1.2 torchvision0.16.2 …