当前位置: 首页 > news >正文

自定义多级联动选择器指南(uni-app)

  • 多端支持:可以运行在H5、APP、微信小程序还是支付宝小程序,都可以轻松使用改组件。
  • 自定义配置:您可以根据需要配置选择器的级数,使其适应不同的数据结构和用例。
  • 无限级联:此组件支持无限级联选择,使您能够创建具有复杂数据结构的选择器。
参数类型描述默认值必选
titlestring标题‘’
layernumber控制几级联动1
dataarray数据:[{name: ‘’, id: ‘’, children: [{name: ‘’, id: ‘’}]}][]

在这里插入图片描述

接口返回数据结构:

[{id: 47, name: "工厂1", parentId: 0, type: 0},{id: 48, name: "区域1", parentId: 47, type: 0},{id: 19, name: "设备1", parentId: 48, type: 1}
]

处理后数据结构:

[{ id: 47, name: "工厂1", parentId: 0, type: 0,children: [{ id: 48, name: "区域1", parentId: 47, type: 0,children: [{ id: 19, name: "设备1", parentId: 48, type: 1 }] }] 
}]

引用示例:

<template><view class="container"><view @click="bindDevice">选择设备</view><cascade-picker ref="picker" :title="cascadePicker.title" :layer="cascadePicker.layer" :data="cascadePicker.data" @callback="pickerCallback"></cascade-picker></view>
</template>
<script>
import cascadePicker from '@/components/cascade-picker/cascade-picker.vue';
import {handleTree} from "@/utils/tree";
export default {components: {cascadePicker},data() {return {deviceArr: [],deviceId: '',cascadePicker: {title: 'picker标题',layer: null,data: []}}},onLoad() {this.getDeviceSimpleList()},methods: {// 获取设备列表getDeviceSimpleList() {getDeviceSimpleList().then(res => {this.deviceArr = handleTree(res.data)})},// 打开设备选择器bindDevice() {const _this = this;_this.cascadePicker.data = _this.deviceArr;_this.$refs.picker.open().then(function() {console.log('打开成功');});},// picker多级联动回调pickerCallback(e) {const {data} = e;const lastItem = data[data.length - 1];this.deviceId = lastItem.id;}}
}
</script>

@/utils/tree文件中的handleTree方法

/*** 构造树型结构数据* @param {*} data 数据源* @param {*} id id字段 默认 'id'* @param {*} parentId 父节点字段 默认 'parentId'* @param {*} children 孩子节点字段 默认 'children'* @param {*} rootId 根Id 默认 0*/
export function handleTree(data, id = 'id', parentId = 'parentId', children = 'children', rootId = 0) {rootId = rootId || Math.min.apply(Math, data.map(item => {return item[parentId]})) || 0//对源数据深度克隆const cloneData = JSON.parse(JSON.stringify(data))//循环所有项const treeData = cloneData.filter(father => {let branchArr = cloneData.filter(child => {//返回每一项的子级数组return father[id] === child[parentId]});branchArr.length > 0 ? father.children = branchArr : '';//返回第一层return father[parentId] === rootId;});return treeData !== '' ? treeData : data;
}

cascade-picker组件完整代码:

components文件夹下创建cascade-picker文件夹,然后在此文件夹下创建cascade-picker.vue - 多级联动组件

<template name="cascade-picker"><view class="aui-picker" v-if="SHOW" :class="{'aui-picker-in': FADE==1,'aui-picker-out': FADE==0}"><view class="aui-mask" @click.stop="close"></view><view class="aui-picker-main"><view class="aui-picker-header"><view class="aui-picker-header-icon" @click.stop="close">取消</view><view class="aui-picker-title" v-if="title">{{ title }}</view><view class="aui-picker-header-icon aui-picker-confirm" @click.stop="_confirm">确认</view></view><view class="aui-picker-nav"><view class="aui-picker-navitem"v-if="nav.length>0"v-for="(item, index) in nav":key="index":data-index="index":class="[index==navCurrentIndex ? 'active' : '', 'aui-picker-navitem-'+index]":style="{margin: nav.length>2 ? '0 10px 0 0' : '0 30px 0 0'}"@click.stop="_changeNav($event)">{{ item.name }}</view><view class="aui-picker-navitem":key="nav.length":data-index="nav.length":class="[nav.length==navCurrentIndex ? 'active' : '', 'aui-picker-navitem-'+nav.length]":style="{margin: nav.length>2 ? '0 10px 0 0' : '0 30px 0 0'}"@click.stop="_changeNav($event)">请选择</view><view class="aui-picker-navborder" :style="{left: navBorderLeft+'px'}"></view></view><view class="aui-picker-content"><view class="aui-picker-lists"><view class="aui-picker-list"v-for="(list, index) in queryItems.length + 1":key="index":data-index="index":class="[index==navCurrentIndex ? 'active' : '']"><view class="aui-picker-list-warp" v-if="index == 0"><view class="aui-picker-item"v-for="(item, key) in items"v-if="item.pid=='0'":key="key":data-pindex="index":data-index="key":data-id="item.id":data-pid="item.pid":data-name="item.name":data-type="item.type":class="{'active': result.length>index && result[index].id==item.id}":style="{'background': touchConfig.index==key && touchConfig.pindex==index ? touchConfig.style.background : ''}"@click.stop="_chooseItem($event)"@touchstart="_btnTouchStart($event)"@touchmove="_btnTouchEnd($event)"@touchend="_btnTouchEnd($event)">{{ item.name }}</view></view><view class="aui-picker-list-warp" v-else><view class="aui-picker-item"v-for="(item, key) in queryItems[index-1]":key="key":data-pindex="index":data-index="key":data-id="item.id":data-pid="item.pid":data-name="item.name":data-type="item.type":class="{'active': result.length>index && result[index].id==item.id}":style="{'background': touchConfig.index==key && touchConfig.pindex==index ? touchConfig.style.background : ''}"@click.stop="_chooseItem($event)"@touchstart="_btnTouchStart($event)"@touchmove="_btnTouchEnd($event)"@touchend="_btnTouchEnd($event)">{{ item.name }}</view></view></view></view></view></view></view>
</template><script>
export default {name: 'cascade-picker',props: {title: { //标题type: String,default: ''},layer: { //控制几级联动,默认无限级(跟随数据有无下级)type: Number,default: null},data: { //数据 如:[{id: '', name: '', children: [{id: '', name: ''}]}]type: Array,default() {return [// [{id: '', name: '', children: [{id: '', name: ''}]}]]}}},data() {return {SHOW: false,FADE: -1,nav: [],items: [], // 第一级数据列表queryItems: [], // 各级数据列表navCurrentIndex: 0, // 当前选中的导航项索引navBorderLeft: 35, // 导航栏的边框左侧位置result: [],touchConfig: {index: -1,pindex: -1,style: {color: '#214579',background: '#EFEFEF'}},selectedData: [] // 用于回显数据的属性}},watch: {data() {const _this = this;const data = _this.data;_this.items = _this._flatten(data, '0')}},methods: {// 打开open() {const _this = this;_this.reset(); //打开时重置pickerreturn new Promise(function (resolve, reject) {_this.SHOW = true;_this.FADE = 1;resolve();});},// 关闭close() {const _this = this;return new Promise(function (resolve, reject) {_this.FADE = 0;const _hidetimer = setTimeout(() => {_this.SHOW = false;_this.FADE = -1;clearTimeout(_hidetimer);resolve();}, 100)});},//重置reset() {const _this = this;_this.queryItems = [];_this.nav = [];_this.navBorderLeft = 35;_this.navCurrentIndex = 0;_this.result = [];},//导航栏切换_changeNav(e) {const _this = this;const index = Number(e.currentTarget.dataset.index);_this.navCurrentIndex = index;const _el = uni.createSelectorQuery().in(this).select(".aui-picker-navitem-" + index);_el.boundingClientRect(data => {_this.navBorderLeft = data.left + 20;}).exec();},//数据选择_chooseItem(e) {const _this = this;const id = e.currentTarget.dataset.id;const name = e.currentTarget.dataset.name;const pid = e.currentTarget.dataset.pid;const type = e.currentTarget.dataset.type;const _arr = [];_this.result[_this.navCurrentIndex] = {id: id, name: name, pid: pid, type: type};if ((!_this._isDefine(_this.layer) && _this._isDefine(_this._deepQuery(_this.data, id).children))||(_this.navCurrentIndex < (Number(_this.layer) - 1) && _this._isDefine(_this._deepQuery(_this.data, id).children))) { //有下级数据_this._deepQuery(_this.data, id).children.forEach(function (item, index) {_arr.push({id: item.id, name: item.name, pid: id, type: item.type});});if (_this.navCurrentIndex == _this.queryItems.length) { //选择数据_this.queryItems.push(_arr);_this.nav.push({name: name});} else { //重新选择数据_this.queryItems.splice(_this.navCurrentIndex + 1, 1);_this.nav.splice(_this.navCurrentIndex + 1, 1);_this.queryItems.splice(_this.navCurrentIndex, 1, _arr);_this.nav.splice(_this.navCurrentIndex, 1, {name: name});}_this.navCurrentIndex = _this.navCurrentIndex + 1;const _el = uni.createSelectorQuery().in(this).select(".aui-picker-navitem-" + _this.navCurrentIndex);setTimeout(() => {_el.boundingClientRect(data => {_this.navBorderLeft = data.left + 20;}).exec();}, 100)} else { //无下级数据且最后一级数据的type为1时,则可以确认关闭_this._confirm();}},_confirm() {const _this = this;const lastItem = _this.result[_this.result.length - 1];if (lastItem && lastItem.type === 1) {_this.close().then(() => {_this.$emit("callback", {status: 0, data: _this.result});});} else {uni.$u.toast('请选择设备')}},//递归遍历——将树形结构数据转化为数组格式_flatten(tree, pid) {return tree.reduce((arr, {id, name, type, children = []}) =>arr.concat([{id, name, pid, type}], this._flatten(children, id)), [])},//根据id查询对应的数据(如查询id=10100对应的对象)_deepQuery(tree, id) {let isGet = false;let retNode = null;function deepSearch(tree, id) {for (let i = 0; i < tree.length; i++) {if (tree[i].children && tree[i].children.length > 0) {deepSearch(tree[i].children, id);}if (id === tree[i].id || isGet) {isGet || (retNode = tree[i]);isGet = true;break;}}}deepSearch(tree, id);return retNode;},/***判断字符串是否为空@param {string} str 变量@example: aui.isDefine("变量");*/_isDefine(str) {if (str == null || str == "" || str == "undefined" || str == undefined || str == "null" || str == "(null)" || str == 'NULL' || typeof (str) == 'undefined') {return false;} else {str = str + "";str = str.replace(/\s/g, "");if (str == "") {return false;}return true;}},_btnTouchStart(e) {const _this = this,index = Number(e.currentTarget.dataset.index),pindex = Number(e.currentTarget.dataset.pindex);_this.touchConfig.index = index;_this.touchConfig.pindex = pindex;},_btnTouchEnd(e) {const _this = this,index = Number(e.currentTarget.dataset.index),pindex = Number(e.currentTarget.dataset.pindex);_this.touchConfig.index = -1;_this.touchConfig.pindex = -1;},}
}
</script><style lang="scss" scoped>
/* ====================多级联动弹窗=====================*/
.aui-picker {width: 100vw;height: 100vh;//opacity: 0;position: fixed;top: 0;left: 0;z-index: 999;/* display: none; */
}// 遮罩层
.aui-mask {width: 100%;height: 100%;background: rgba(0, 0, 0, .3);position: absolute;left: 0;top: 0;z-index: 999;
}.aui-picker.aui-picker-in {-moz-animation: aui-fade-in .1s ease-out forwards;-ms-animation: aui-fade-in .1s ease-out forwards;-webkit-animation: aui-fade-in .1s ease-out forwards;animation: aui-fade-in .1s ease-out forwards;
}.aui-picker.aui-picker-out {-moz-animation: aui-fade-out .1s ease-out forwards;-ms-animation: aui-fade-out .1s ease-out forwards;-webkit-animation: aui-fade-out .1s ease-out forwards;animation: aui-fade-out .1s ease-out forwards;
}.aui-picker-main {width: 100vw;height: 50vh;background: #FFF;//border-radius: 15px 15px 0 0;position: absolute;left: 0px;bottom: 0;z-index: 999;
}.aui-picker.aui-picker-in .aui-picker-main {-moz-animation: aui-slide-up-screen .2s ease-out forwards;-ms-animation: aui-slide-up-screen .2s ease-out forwards;-webkit-animation: aui-slide-up-screen .2s ease-out forwards;animation: aui-slide-up-screen .2s ease-out forwards;
}.aui-picker.aui-picker-out .aui-picker-main {-moz-animation: aui-slide-down-screen .2s ease-out forwards;-ms-animation: aui-slide-down-screen .2s ease-out forwards;-webkit-animation: aui-slide-down-screen .2s ease-out forwards;animation: aui-slide-down-screen .2s ease-out forwards;
}.aui-picker-header {width: 100%;min-height: 50px;position: relative;z-index: 999;display: flex;justify-content: space-between;align-items: center;&-icon {font-size: 15px;color: #aaa;padding: 0 15px;}.aui-picker-confirm {height: 50px;line-height: 50px;text-align: center;font-size: 15px;color: $custom-content-color;padding: 0 15px;}
}.aui-picker-header::after {content: '';width: 100%;height: 1px;background: rgba(100, 100, 100, .3);-moz-transform: scaleY(.3);-ms-transform: scaleY(.3);-webkit-transform: scaleY(.3);transform: scaleY(.3);position: absolute;left: 0;bottom: 0;z-index: 999;
}.aui-picker-title {line-height: 20px;text-align: center;font-size: 17px;color: #333;padding: 15px;box-sizing: border-box;position: absolute;left: 50px;right: 50px;top: 0;
}.aui-picker-content {width: 100%;height: -webkit-calc(100% - 100px);height: calc(100% - 100px);
}.aui-picker-nav {width: 100%;height: 50px;text-align: left;padding: 0 15px;margin: 0 0 1px 0;justify-content: flex-start;white-space: nowrap;box-sizing: border-box;position: relative;overflow-x: scroll;overflow-y: hidden;
}.aui-picker-nav::after {content: '';width: 100%;height: 1px;background: rgba(100, 100, 100, .3);-moz-transform: scaleY(.3);-ms-transform: scaleY(.3);-webkit-transform: scaleY(.3);transform: scaleY(.3);position: absolute;left: 0;bottom: 0;z-index: 999;
}.aui-picker-navitem {width: 80px;line-height: 50px;font-size: 16px;margin: 0 30px 0 0;text-align: center;display: inline-block;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;
}.aui-picker-navitem.active {color: $custom-content-color;
}.aui-picker-navborder {width: 40px;height: 3px;background: $custom-content-color;border-radius: 5px;transition: left .15s;position: absolute;left: 40px;bottom: 0;
}.aui-picker-lists {width: 100%;height: 100%;justify-content: space-around;white-space: nowrap;
}.aui-picker-list {width: 100%;height: 100%;overflow: hidden;overflow-y: scroll;display: none;vertical-align: top;
}.aui-picker-list.active {display: inline-block;
}.aui-picker-list-warp {width: 100%;height: auto;box-sizing: border-box;padding: 15px 0;display: inline-block;
}.aui-picker-item {width: 100%;height: 50px;line-height: 50px;padding: 0 15px;box-sizing: border-box;font-size: 15px;color: #333;position: relative;
}.aui-picker-item.active {color: $custom-content-color;
}.aui-picker-item.active::after {content: '✔';font-size: 15px;color: $custom-content-color;position: absolute;top: 0px;right: 10px;
}</style>
总结

自定义多级联动选择器组件将有助于您在uni-app中创建灵活的选择器,以满足各种不同平台和级数的需求。如果有任何问题、反馈或需要进一步的帮助,请不要犹豫,在下面的评论中提出。期待听到您的声音,以便改进和完善这个组件。

相关文章:

自定义多级联动选择器指南(uni-app)

多端支持&#xff1a;可以运行在H5、APP、微信小程序还是支付宝小程序&#xff0c;都可以轻松使用改组件。自定义配置&#xff1a;您可以根据需要配置选择器的级数&#xff0c;使其适应不同的数据结构和用例。无限级联&#xff1a;此组件支持无限级联选择&#xff0c;使您能够创…...

RHCE笔记-SSH服务

一.对称加密与非对称加密 1.1对称加密 1. 原理 对称加密是指加密和解密使用相同的密钥。也就是说&#xff0c;发送方和接收方在通信之前需要共享一个秘密密钥&#xff0c;使用这个密钥对数据进行加密和解密。 2. 常见算法 AES (Advanced Encryption Standard)&#xff1a;…...

java实现文件分片上传并且断点续传

文章目录 什么是断点续传后端实现JAVA实现大文件分片上传断点续传 什么是断点续传 用户上传大文件,网络差点的需要历时数小时&#xff0c;万一线路中断&#xff0c;不具备断点续传的服务器就只能从头重传&#xff0c;而断点续传就是&#xff0c;允许用户从上传断线的地方继续传…...

leetcode hot100 之【LeetCode 15. 三数之和】 java实现

LeetCode 15. 三数之和 题目描述 给你一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c 使得 a b c 0&#xff1f;请你找出所有和为 0 且不重复的三元组。 注意&#xff1a; 答案中的三元组可以按任意顺序组织。在 n…...

mysql学习教程,从入门到精通,sql序列使用(45)

sql序列使用 在SQL中&#xff0c;序列&#xff08;Sequence&#xff09;是一种数据库对象&#xff0c;用于生成唯一的数值&#xff0c;通常用于自动递增的主键。不同的数据库管理系统&#xff08;DBMS&#xff09;对序列的支持和语法可能有所不同。以下是一些常见的DBMS&#…...

Java 中的异常处理、常见异常、如何自定义异常类、Checked 和 Unchecked 异常的区别、如何处理数据库事务中的异常

文章目录 1. 异常的基本概念与处理方法定义常见异常类补充说明&#xff1a; 异常处理方法示例 2.如何自定义异常类步骤示例 3. Java 中的 Checked 和 Unchecked 异常的区别Checked 异常Unchecked 异常示例 4. 如何处理数据库事务中的异常常见场景处理方式示例讨论 总结 异常是指…...

6.1 特征值介绍

一、特征值和特征向量介绍 本章会开启线性代数的新内容。前面的第一部分是关于 A x b A\boldsymbol x\boldsymbol b Axb&#xff1a;平衡、均衡和稳定状态&#xff1b;现在的第二部分是关于变化的。时间会加入进来 —— 连续时间的微分方程 d u / d t A u \pmb{\textrm{d}…...

Vue01

前端最新Vue2Vue3基础入门到实战项目全套教程&#xff0c;自学前端vue就选黑马程序员&#xff0c;一套全通关&#xff01;_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1HV4y1a7n4?spm_id_from333.788.videopod.episodes&vd_source016213ecd945408976ff307a6bda30…...

MySQL - Navicat自动备份MySQL数据

对于从事IT开发的工程师&#xff0c;数据备份我想大家并不陌生&#xff0c;这件工程太重要了&#xff01;对于比较重要的数据&#xff0c;我们希望能定期备份&#xff0c;每天备份1次或多次&#xff0c;或者是每周备份1次或多次。 如果大家在平时使用Navicat操作数据库&#x…...

系统分析师20:【案例特训专题3】系统设计与运维

1 Web开发 1.1 Web开发涉及技术的综合应用 高性能高可用可维护应变安全 1.2 Web系统架构演化过程 1.2.1 单台机器到数据库与Web服务器分离 早期的web系统往往以单台机器形态出现&#xff0c;web网站无论是前端还是后台数据库都部署在一台服务器上&#xff0c;部署起来比较…...

Linux 局域网中使用NTP配置时间服务

一&#xff1a;NTP 时间服务器配置 前提&#xff1a; 局域网环境中一般不能直接使用互联网上提供的时间服务器&#xff0c;例如ntp.aliyun.com。所以可以使用局域网中的一个服务器时间为基准&#xff0c;其他服务器的时间都和他保持一致。 1、将服务器的系统时间配置为时间源…...

Shiro会话管理和加密

一、会话相关API及会话使用 Shiro提供了完整的企业级会话管理功能&#xff0c;不依赖于底层容器&#xff08;如Web容器Tomcat&#xff09;&#xff0c;可以在JavaSE和JavaEE环境中使用。会话相关API主要包括&#xff1a; Subject.getSession(): 获取当前用户的会话&#xff0…...

GPON、XG-PON和XGS-PON的区别

类别GPON10G PON 细分 GPON XG-PON XGS-PON 下行速率 2.488 Gbps 9.953 Gbps 9.953Gbps 上行速率 1.244 Gbps 2.488 Gbps 9.953Gbps 可用带宽 2200Mbps 8500Mbps 8500Mbps 1000Mbps2000Mbps8500Mbps ITU-T标准 G.984&#xff08;2003年&#xff09; G.987 &a…...

Spring 项目返回值枚举类编写技巧

Spring 项目返回值枚举类编写技巧 在 Spring 项目中&#xff0c;使用枚举类来统一管理返回值和状态码是一种非常优雅的实现方式。这不仅能提升代码的可读性和维护性&#xff0c;还能避免在代码中硬编码字符串或数字来表示状态码。本文将以 ReturnCodeEnum 为例&#xff0c;介绍…...

【操作系统】06.进程控制

一、进程创建 1.1 认识fork函数 在linux中fork函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 进程调用fork&#xff0c;当控制转移到内核中的fork代码后&#xff0c;内核将 分配新的内存块和内核数据结构…...

16天自制CppServer-day02

day02-设置错误与异常处理机制 上一天我们写了一个客户端与服务器通过socket进行连接&#xff0c;对socket,bind,listen,accept,connect等函数&#xff0c;我们都设想程序完美地、没有任何异常地运行&#xff0c;但显然这不现实&#xff0c;应该设置出现异常的处理机制&#x…...

时空智友企业流程化管控系统uploadStudioFile接口存在任意文件上传漏洞

免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. 时空智友…...

Linux 中文件的权限说明

目录 一&#xff1a;文件权限类型二&#xff1a;默认权限管理1. 查看当前用户的umask值2. 修改当前用户的umask值3. 根据umask计算默认权限 三&#xff1a;普通权限管理1. 三种普通权限说明1.1 对于非目录文件来说1.2 对于目录文件来说 2. 查看某个文件的权限信息2.1 使用 ls -…...

MySql数据库中数据类型

本篇将介绍在 MySql 中的所有数据类型&#xff0c;其中主要分为四类&#xff1a;数值类型、文本和二进制类型、时间日期、String 类型。如下&#xff08;图片来源&#xff1a;MySQL数据库&#xff09;&#xff1a; 目录如下&#xff1a; 目录 数值类型 1. 整数类型 2. …...

Godot中的信号

目录 概念 signal connect方法连接Callable 信号要求参数 查看信号 连接信号 监听信号 Button - text属性 pressed 连接源 「按钮」的信号连接 使用代码&#xff0c;将方法与信号相连接 节点的connect方法 节点直接使用emit_signal方法通过字符串的方式触发信号…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...