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

Vue3+Element Plus如何实现左树右表页面案例:即根据左边的树筛选右侧表功能实现

文章目录

  • 一、最终效果
  • 二、源代码
    • 2.1 AddDataSource.vue
    • 2.2 LeftTree.vue
    • 2.3 FieldDrawer.vue
    • 2.4 RightTable.vue
    • 2.5 Emp.vue
  • 三、代码解读
    • 3.1 AddDataSource.vue —— 数据源新增对话框
    • 3.2 LeftTree.vue —— 数据源树视图
    • 3.3 FieldDrawer.vue —— 字段详情抽屉
    • 3.4 RightTable.vue —— 表数据展示
    • 3.5 Emp.vue —— 综合展示视图


前端用的vue3+Element Plus


可以自行创建脚手架vue3 命令使用手册及常用概念

也可以用已经创建的,Vue3-Project-Basic在github上;(注意安装node,版本建议16以上)
下载后直接

npm i

npm run dev

即可,组件路由都配了,快速验证,如果用到,帮忙点个Follow(可能要代理)
下载后把Emp.vue原本的代码删除即可。


一、最终效果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
当然实际中是从后端拿数据,本案例为模拟数据。

二、源代码

2.1 AddDataSource.vue

<template><el-dialogv-model="localVisible"title="新增数据源"width="500px":close-on-click-modal="false"class="add-dialog"><el-form :model="form" ref="formRef" label-width="100px" class="add-form"><el-form-item label="数据源名称" required><el-input v-model="form.name" placeholder="请输入数据源名称"maxlength="50"show-word-limit/></el-form-item></el-form><template #footer><span class="dialog-footer"><el-button @click="localVisible = false">取消</el-button><el-button type="primary" @click="handleSubmit">确认</el-button></span></template></el-dialog>
</template><script setup>
import { ref, reactive, watch } from 'vue'
import { ElMessage } from 'element-plus'const props = defineProps({modelValue: { type: Boolean, default: false }
})
const emit = defineEmits(['update:modelValue', 'success'])const localVisible = ref(props.modelValue)
const form = reactive({ name: '' })
const formRef = ref()function handleSubmit() {if (form.name.trim() === '') {ElMessage.error('请输入数据源名称')return}ElMessage.success('新增数据源成功')// 模拟返回新增数据源对象,使用当前时间戳作为 idemit('success', { id: Date.now(), db_name: form.name, label: form.name })localVisible.value = falseform.name = '' // 清空表单
}watch(() => props.modelValue, (newVal) => {localVisible.value = newVal
})watch(localVisible, (newVal) => {emit('update:modelValue', newVal)if (!newVal) {form.name = '' // 关闭弹窗时清空表单}
})
</script><style scoped>
.add-dialog {:deep(.el-dialog__header) {margin: 0;padding: 20px;border-bottom: 1px solid #e6e6e6;}:deep(.el-dialog__body) {padding: 30px 20px;}:deep(.el-dialog__footer) {padding: 20px;border-top: 1px solid #e6e6e6;}
}
.add-form {:deep(.el-form-item__label) {font-weight: 500;}
}
.dialog-footer {display: flex;justify-content: flex-end;gap: 12px;
}
</style>

2.2 LeftTree.vue

<template><div class="left-tree"><div class="tree-header"><el-button type="primary" @click="handleAdd" class="add-btn"><el-icon><Plus /></el-icon>新增数据源</el-button></div><el-tree:data="treeData":props="defaultProps"@node-click="handleNodeClick"node-key="id"class="custom-tree"><template #default="{ node }"><span class="custom-tree-node"><el-icon><Connection /></el-icon><span>{{ node.label }}</span></span></template></el-tree><AddDataSource v-model="addDialogVisible" @success="handleAddSuccess" /></div>
</template><script setup>
import { ref, onMounted } from 'vue'
import { Plus, Connection } from '@element-plus/icons-vue'
import AddDataSource from './AddDataSource.vue'// 此处使用硬编码的数据模拟分组情况
const treeData = ref([{ id: 1, db_name: '数据源A', label: '数据源A' },{ id: 2, db_name: '数据源B', label: '数据源B' }
])
const defaultProps = {children: 'children',label: 'db_name'
}
const addDialogVisible = ref(false)
const emit = defineEmits(['node-click'])const handleNodeClick = (data) => {// 若节点存在 children,则为组节点,不触发点击事件if (data.children) returnemit('node-click', data)
}const handleAdd = () => {addDialogVisible.value = true
}const handleAddSuccess = (newDataSource) => {// 将新增的数据源添加到树中treeData.value.push(newDataSource)
}onMounted(() => {// 这里不从后端加载,而是使用硬编码数据
})
</script><style scoped>
.left-tree {height: 100%;display: flex;flex-direction: column;padding: 16px;
}
.tree-header {margin-bottom: 16px;
}
.add-btn {width: 100%;
}
.custom-tree {flex: 1;overflow: auto;
}
.custom-tree-node {display: flex;align-items: center;gap: 8px;font-size: 14px;
}
:deep(.el-tree-node__content) {height: 36px;
}
:deep(.el-tree-node:focus > .el-tree-node__content) {background-color: #f0f7ff;
}
:deep(.el-tree-node__content:hover) {background-color: #f5f7fa;
}
</style>

2.3 FieldDrawer.vue

<template><el-drawerv-model="localVisible"title="字段信息"direction="rtl"size="30%":before-close="handleClose"><el-table :data="fieldList" border style="width: 100%;"><el-table-column prop="fieldEnglishName" label="字段英文名称" /><el-table-column prop="fieldType" label="字段类型" /><el-table-column prop="fieldRemark" label="字段备注" /></el-table></el-drawer>
</template><script setup>
import { ref, watch } from 'vue'
import { ElMessage } from 'element-plus'// props: tableId 用于选择不同的模拟数据;
// 使用 modelValue 来实现 v-model 绑定
const props = defineProps({tableId: { type: [Number, String], required: true },modelValue: { type: Boolean, default: false }
})
const emit = defineEmits(['update:modelValue'])const localVisible = ref(props.modelValue)
const fieldList = ref([])// 模拟数据,根据不同的 tableId 返回不同字段数据
const simulateFieldData = (tableId) => {if (tableId == 101) {return [{ id: 1, fieldEnglishName: 'empId', fieldType: 'INT', fieldRemark: '员工ID' },{ id: 2, fieldEnglishName: 'name', fieldType: 'VARCHAR', fieldRemark: '姓名' },{ id: 3, fieldEnglishName: 'age', fieldType: 'INT', fieldRemark: '年龄' }]} else if (tableId == 102) {return [{ id: 4, fieldEnglishName: 'salaryId', fieldType: 'INT', fieldRemark: '工资ID' },{ id: 5, fieldEnglishName: 'amount', fieldType: 'DECIMAL', fieldRemark: '金额' }]} else if (tableId == 201) {return [{ id: 6, fieldEnglishName: 'orderId', fieldType: 'INT', fieldRemark: '订单ID' },{ id: 7, fieldEnglishName: 'customerId', fieldType: 'INT', fieldRemark: '客户ID' }]} else if (tableId == 202) {return [{ id: 8, fieldEnglishName: 'custId', fieldType: 'INT', fieldRemark: '客户ID' },{ id: 9, fieldEnglishName: 'custName', fieldType: 'VARCHAR', fieldRemark: '客户姓名' }]} else {return []}
}const loadFieldList = () => {fieldList.value = simulateFieldData(props.tableId)if (fieldList.value.length === 0) {ElMessage.warning('未获取到字段信息')}
}const handleClose = (done) => {done()
}watch(() => props.modelValue, (newVal) => {localVisible.value = newValif (newVal) {loadFieldList()}
})watch(localVisible, (newVal) => {emit('update:modelValue', newVal)
})
</script><style scoped>
/* 根据需要添加样式 */
</style>

2.4 RightTable.vue

<template><div class="right-table"><div class="table-header"><el-inputv-model="searchKeyword"placeholder="搜索表名"class="search-input"clearable@input="handleSearch"/></div><el-table :data="pagedTableList" border style="width: 100%;" @row-click="handleRowClick"><el-table-column prop="tableEnglishName" label="表名" /><el-table-column prop="tableRemark" label="表备注" /><el-table-column prop="fieldCount" label="字段数量" width="100" /><el-table-column prop="dataCount" label="数据量" width="100" /><el-table-column prop="createTime" label="创建时间" width="180" /><el-table-column label="操作" width="120"><template #default="{ row }"><el-button link type="primary" @click.stop="handleViewDetails(row)">查看详情</el-button></template></el-table-column></el-table><div class="pagination-container"><el-paginationbackground:current-page="currentPage":page-size="pageSize":total="total"layout="total, prev, pager, next, jumper"@current-change="handlePageChange"/></div></div>
</template><script setup>
import { ref, computed, watch, onMounted } from 'vue'const props = defineProps({dataSourceId: { type: [Number, String], required: true }
})
const emit = defineEmits(['row-select'])
const searchKeyword = ref('')
const currentPage = ref(1)
const pageSize = ref(10)
const total = ref(0)// 模拟不同数据源的表数据,这里硬编码两组数据
const tableList = ref([])
const loadTableData = () => {// 根据 dataSourceId 模拟不同数据if (props.dataSourceId === 1) {tableList.value = [{ id: 101, tableEnglishName: '员工表', tableRemark: '员工基本信息', fieldCount: 5, dataCount: 10, createTime: '2022-01-01' },{ id: 102, tableEnglishName: '工资表', tableRemark: '员工工资信息', fieldCount: 3, dataCount: 10, createTime: '2022-02-01' }]} else if (props.dataSourceId === 2) {tableList.value = [{ id: 201, tableEnglishName: '订单表', tableRemark: '订单数据', fieldCount: 8, dataCount: 20, createTime: '2022-03-01' },{ id: 202, tableEnglishName: '客户表', tableRemark: '客户信息', fieldCount: 6, dataCount: 15, createTime: '2022-04-01' }]} else {tableList.value = []}total.value = tableList.value.length
}const filteredTableList = computed(() => {if (!searchKeyword.value) return tableList.valuereturn tableList.value.filter(item =>item.tableEnglishName.toLowerCase().includes(searchKeyword.value.toLowerCase()))
})const pagedTableList = computed(() => {const start = (currentPage.value - 1) * pageSize.valuereturn filteredTableList.value.slice(start, start + pageSize.value)
})function handleSearch() {currentPage.value = 1
}
function handlePageChange(page) {currentPage.value = page
}
function handleRowClick(row) {// 如果直接点击行,也可触发详情显示emit('row-select', row.id)
}
function handleViewDetails(row) {// 点击“查看详情”按钮emit('row-select', row.id)
}watch(() => props.dataSourceId, () => {currentPage.value = 1loadTableData()
})onMounted(() => {loadTableData()
})
</script><style scoped>
.right-table {height: 100%;padding: 10px;display: flex;flex-direction: column;
}
.table-header {margin-bottom: 10px;
}
.search-input {width: 300px;
}
.pagination-container {margin-top: 15px;display: flex;justify-content: flex-end;
}
</style>

2.5 Emp.vue

<template><div class="conn-container"><div class="left-panel"><LeftTree @node-click="handleNodeClick" /></div><div class="right-panel"><RightTable v-if="currentDataSourceId" :dataSourceId="currentDataSourceId" @row-select="handleRowSelect" /><div v-else class="empty-tip"><el-empty description="请选择左侧数据源查看表信息" /></div></div><FieldDrawer v-model="drawerVisible" :tableId="currentTableId" /></div>
</template><script setup>
import { ref } from 'vue'
import LeftTree from './LeftTree.vue'
import RightTable from './RightTable.vue'
import FieldDrawer from './FieldDrawer.vue'const currentDataSourceId = ref(null)
const currentTableId = ref(null)
const drawerVisible = ref(false)const handleNodeClick = (data) => {currentDataSourceId.value = data.id
}
const handleRowSelect = (tableId) => {currentTableId.value = tableIddrawerVisible.value = true
}
</script><style scoped>
.conn-container {display: flex;height: 100%;background-color: #f5f7fa;padding: 20px;gap: 20px;
}
.left-panel {width: 300px;height: 100%;background-color: #fff;border-radius: 8px;box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);overflow: hidden;
}
.right-panel {flex: 1;height: 100%;background-color: #fff;border-radius: 8px;box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);overflow: hidden;
}
.empty-tip {height: 100%;display: flex;align-items: center;justify-content: center;
}
</style>

三、代码解读

在项目中,我们使用了 Vue3 的组合式 API(Composition API)与 Element Plus UI 组件库,完成了一个数据管理的基本示例。整个示例主要包含五个组件,每个组件承担着特定的业务逻辑与视图展现,下面详细解释各模块的技术亮点和实现思路。

3.1 AddDataSource.vue —— 数据源新增对话框

  • 业务功能与交互
    该组件通过 Element Plus 的 el-dialog 实现模态对话框,为用户提供了添加数据源的入口。通过 v-model 实现双向绑定,保证父子组件之间的数据同步。
  • 核心代码讲解
    • 双向绑定与响应式数据:利用 refreactive 建立响应数据,props 接收父组件传入的 modelValue 并通过 watch 监听实现状态同步。
    • 表单验证:在提交前先进行字符串去除空格的简单校验,通过 Element Plus 的 ElMessage 提供即时的反馈提醒用户。
    • 事件通信:通过 emit 触发 success 事件,将新数据源对象传递给父组件;同时利用 update:modelValue 实现 v-model 的模式更新。
  • 技术术语说明
    • ref 与 reactiveref 用于基本类型或单一对象的响应式包装,reactive 则适合包装较复杂的对象。
    • watch:实现数据副作用处理,在响应式数据发生变化时自动执行指定函数。

3.2 LeftTree.vue —— 数据源树视图

  • 业务功能与交互
    使用 Element Plus 的 el-tree 展示数据源树,并通过按钮触发新增数据源对话框。
  • 核心代码讲解
    • 硬编码数据模拟:在初始加载时,通过预设数据构成树结构,后续可根据业务需求替换为后端数据。
    • 自定义节点模板:通过 #default 插槽自定义树节点的展示,采用图标和文本结合的形式,提升用户体验。
    • 事件传递:点击节点或新增成功后,通过事件向父组件传递数据(例如 node-clicksuccess 事件),实现组件间解耦协同。
  • 专业名词解释
    • 插槽(slot):Vue 中的一种内容分发机制,用于灵活地将父组件的内容传递给子组件指定位置,从而实现高度复用的自定义模板。

3.3 FieldDrawer.vue —— 字段详情抽屉

  • 业务功能与交互
    该组件通过抽屉(Drawer)展示选中表的字段详细信息,同样采用了 Element Plus 的 el-drawerel-table 组合展示数据。
  • 核心代码讲解
    • 根据 tableId 加载模拟数据:通过对不同 tableId 传入对应的硬编码数据,示例化如何根据参数返回不同字段列表。
    • 生命周期与状态监听:使用 watch 监听 modelValue,当抽屉状态变为打开时触发加载数据,确保数据与组件状态同步。
    • 模块隔离与复用:由于字段详情只关注数据展现,整个组件实现了高内聚、低耦合,可以方便地在其他业务场景中复用。
  • 专业术语解释
    • 抽屉(Drawer):常用于移动端或桌面端 UI 设计中的侧边弹出窗口,简化界面操作同时不干扰主体页面的展示。

3.4 RightTable.vue —— 表数据展示

  • 业务功能与交互
    主要负责展示选中数据源下的表信息,并提供搜索、分页以及“查看详情”功能。
  • 核心代码讲解
    • 数据处理与分页:通过 computed 属性实现数据过滤与分页处理,确保在搜索和分页操作中数据始终正确渲染。
    • 事件处理:监听行点击以及按钮点击,通过自定义事件 row-select 通知父组件显示详细信息。
    • 表格组件:Element Plus 的 el-table 提供丰富的功能支持,如边框、固定列、行点击事件等,便于根据业务需求进一步扩展交互。
  • 专业术语解释
    • 计算属性(computed):在 Vue 中用于声明依赖其他响应式数据并返回计算结果的属性,具有缓存功能,有效提升性能。

3.5 Emp.vue —— 综合展示视图

  • 业务功能与交互
    综合展示左侧数据源树和右侧表数据,在用户选择左侧数据源后展示右侧表信息,并通过抽屉展示字段详情。
  • 核心代码讲解
    • 组件间通信:主要体现在子组件事件传递到父组件,通过监听 node-clickrow-select 事件动态更新当前数据源和选中表 ID,进而控制抽屉的显示。
    • 状态管理:利用局部状态 ref 保存当前选中的数据源和表 ID,实现页面整体交互的状态联动。
    • 布局设计:左右分栏布局利用 Flex 布局实现,同时引入盒子阴影、边框圆角等视觉提升元素,保证企业级系统页面整洁美观。
  • 专业术语解释
    • 状态管理:在前端应用中,指的是数据的集中处理与管理方式,通过响应式数据管理,使应用对外部事件有一致且稳定的响应。

通过以上解析,我们不仅明确了每个组件的技术实现,也揭示了 Vue3 生态中重要的设计理念和最佳实践。希望通过这一章的深入解读,能帮助开发者在面对更复杂业务时能够灵活应用这些技术,打破常规思维,实现更高效的工程交付。

相关文章:

Vue3+Element Plus如何实现左树右表页面案例:即根据左边的树筛选右侧表功能实现

文章目录 一、最终效果二、源代码2.1 AddDataSource.vue2.2 LeftTree.vue2.3 FieldDrawer.vue2.4 RightTable.vue2.5 Emp.vue 三、代码解读3.1 AddDataSource.vue —— 数据源新增对话框3.2 LeftTree.vue —— 数据源树视图3.3 FieldDrawer.vue —— 字段详情抽屉3.4 RightTabl…...

Redisson的红锁,分段锁,公平锁,联锁。。。。。。

红锁&#xff1a;Redisson红锁可以防止主从集群锁丢失问题。Redisson红锁要求&#xff0c;必须要构建至少三个Redis主从集群&#xff0c;若一个请求要申请锁&#xff0c;必须向所有主从集群中提交key写入请求&#xff0c;只有当大多数集群&#xff08;过半集群&#xff09;锁写…...

system V 共享内存

system V是一种标准&#xff0c;linux内核支持这种标准&#xff0c;专门设计了一个ipc模板(通信的接口设计&#xff0c;原理&#xff0c;接口&#xff0c;相似性) 使用各自的虚拟地址访问物理内存 共享内存描述共享内存的内核数据结构它所对应的物理空间 进程间通信的本质&…...

ResNet改进(27):融合EfficientViT 高效混合网络设计

在计算机视觉领域,卷积神经网络(CNN)和视觉Transformer(ViT)各有优势。 今天分享的是一种将两者巧妙结合的方案——在ResNet18基础上引入轻量化ViT模块的设计思路。 整体架构概览 这个混合网络主要由三部分组成: ResNet18骨干网络:作为特征提取器,去掉了原模型的平均池化…...

字符串与栈和队列-算法小结

字符串 双指针 反转字符串(双指针) 力扣题目链接 void reverseString(vector<char>& s) {for (int i 0, j s.size() - 1; i < s.size()/2; i, j--) {swap(s[i],s[j]);} }反转字符串II 力扣题目链接 遍历字符串的过程中&#xff0c;只要让 i (2 * k)&#…...

go语言学习笔记:gin + gorm + mysql 用户增删改查案例入门

大家好&#xff0c;我是此林。 Golang 语言现在已经成为了编程的趋势&#xff0c;毕竟是大厂背书嘛&#xff0c;Google 研发的。 目前很多云原生项目都是基于 go 来编写的&#xff0c;比如&#xff1a; Kubernetes (K8s)​ 容器编排系统&#xff0c; Docker​ 容器化技术&…...

设计模式——建造者模式(生成器模式)总结

当我们需要创建一个非常复杂的对象时&#xff0c;可以使用建造者模式&#xff0c;分步骤建造一个对象&#xff0c;最后将完整的对象返回给客户端。 比如&#xff0c;我们要生成一个房子对象&#xff0c;建造一个房子&#xff0c;需要打地基、盖围墙、盖地板、安装门、安装窗户…...

Nginx代理Minio出现AccessDeniedAccessDenied

一、问题描述 AccessDeniedAccessDenied.sight.jpgmediafiles/mediafiles/sight.jpg1835E50603CB8FE0dd9025bab4ad464b049177c95eb6ebf374d3b3fd1af9251148b658df7ac2e3e8 二、问题排查 &#xff08;1&#xff09;minio 和 nginx 是否正常启动 &#xff08;2&#xff09;检…...

在ArcGIS Pro中将栅格NoData值修改为特定值

目录 问题如下&#xff1a;栅格文件中NoData值为65535&#xff0c;要将该NoData值修改为-9999 步骤一&#xff1a;使用栅格计算器&#xff08;Raster Calculator&#xff09;输出具有新NoData值的栅格文件 步骤二&#xff1a;输出修改值后的栅格文件&#xff08;Export Rast…...

模糊表示学习 笔记

图表示学习通常从图的拓扑结构和高维节点属性中产生低维和清晰的表示。然而&#xff0c;节点或图的清晰表示实际上隐藏了特征的不确定性和可解释性。例如&#xff0c;在引文网络中&#xff0c;两篇论文之间的引用总是涉及表示相关度的future&#xff0c;也就是说&#xff0c;一…...

GitHub 趋势日报 (2025年04月12日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1yeongpin/cursor-free-vip[Support 0.48.x]&#xff08;Reset Cursor AI MachineID & Auto Sign Up / In & Bypass Higher…...

FreertosHAL库笔记

堆和栈 堆&#xff1a;一块内存空间&#xff0c;用于存储程序运行时动态申请的内存空间。在堆上分配内存可以根据程序的需要灵活地申请和释放不同大小的内存块。可用pvProMalllloc()和vPortFree()函数来开辟和释放 栈&#xff1a;也是一块内存空间&#xff0c;主要用于函数调用…...

迷你世界脚本之容器接口:WorldContainer

容器接口&#xff1a;WorldContainer 彼得兔 更新时间: 2023-04-26 10:21:02 具体函数名及描述如下: 序号 函数名 函数描述 1 addFurnace(...) 新增熔炉 2 removeFurnace(...) 移除熔炉 3 checkFurnace(...) 检测是否为熔炉 4 getFurnaceHeatPerce…...

springboot框架集成websocket依赖实现物联网设备、前端网页实时通信!

需求&#xff1a; 最近在对接一个物联网里设备&#xff0c;他的通信方式是 websocket 。所以我需要在 springboot框架中集成websocket 依赖&#xff0c;从而实现与设备实时通信&#xff01; 框架&#xff1a;springboot2.7 java版本&#xff1a;java8 好了&#xff0c;还是直接…...

【linux知识】web服务环境搭建(一):用户以及开发环境初始化

toc 创建用户组以及用户 以下是 创建用户组 wendao 和用户 wendao 并指定 GID、UID 及家目录 的完整操作指南&#xff1a; 一、创建用户组&#xff08;指定 GID&#xff09; sudo groupadd -g 1500 wendao # 创建组并指定 GID 为 1500• 注意&#xff1a;GID 需唯一&#…...

消息中间件——RocketMQ(一)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 RocketMQ&#xff08;一&#xff09; 一、MQ出现的背景 在传统的单体应用架构中&#xff0c;系统的各个模块紧密耦合在一起。随着业务…...

[oeasy]python087_[词根溯源]suspend词源_append_depend

087_[词根溯源]suspend词源_append [词根溯源]suspend词源_append_depend 回忆上次内容 上次了解了 方法 和 函数的 不同之处 方法(method) 函数(function) 需要对象调用 无需对象调用 可以根据 名字调用 无需名字 直接调用 基于类的对象 独立的 需要self 不需要self…...

Ubuntu 安装 Cursor AppImage 到应用程序中

如果 Cursor AppImage 安装到 Ubuntu 系统中&#xff08;而不是每次手动运行 .AppImage 文件&#xff09;&#xff0c;可以按照以下方法操作&#xff1a; 方法 1&#xff1a;直接运行 AppImage&#xff08;最简单&#xff0c;但不完全“安装”&#xff09; 赋予执行权限chmod …...

二叉树 --- 堆(下)

今天我们来把堆完结了。 对于一个高度为 h 的满二叉树&#xff0c;有 F(h) 2 ^ 0 2 ^ 1 …… 2 ^ (h - 1) 2 ^ h - 1 h log2 (N1) 对于一个高度为 h 的完全二叉树&#xff0c;且最后一层只有一个 &#xff0c;则 F(h) 2 ^ 0 2 ^ 1 …… 2 ^ (h - 2) 1 2 ^ (h -…...

数组对象[object],五种如何去重方法 js

前言 数组有很多方法都可以实现去重。本章分享比较常用的。 准备工作 准备一组数组对象 let arr [{ id: "1", name: "张晓", age: 14 },{ id: "2", name: "张晓", age: 14 },{ id: "3", name: "张晓", age: 1…...

PyRoboPlan 库,给 panda 机械臂微分 IK 上大分,关节限位、碰撞全不怕

视频讲解&#xff1a; PyRoboPlan 库&#xff0c;给 panda 机械臂微分 IK 上大分&#xff0c;关节限位、碰撞全不怕 代码仓库&#xff1a;https://github.com/LitchiCheng/mujoco-learning 今天分享PyRoboPlan库&#xff0c;比之前的方式优点在于&#xff0c;这个库考虑了机械…...

【模态分解】EMD-经验模态分解

算法配置页面&#xff0c;也可以一键导出结果数据 报表自定义绘制 获取和下载【PHM学习软件PHM源码】的方式 获取方式&#xff1a;Docshttps://jcn362s9p4t8.feishu.cn/wiki/A0NXwPxY3ie1cGkOy08cru6vnvc...

Sentinel规则持久化pull模式核心源码解析

文章目录 前言一、服务端新增/修改规则1.1、repository.save1.2、publishRules 二、客户端接收规则三、持久化扩展3.1、持久化原理3.1.1、FileRefreshableDataSource3.1.1.1、super关键字3.1.1.2、firstLoad()方法 3.1.2、FlowRuleManager.register2Property 3.2、持久化实现 总…...

【go】--编译

go build -o [编译完成的可执行文件] [需要编译的.go文件]#例如 go build -o myapp main.go#确保编译的结果和当前运行环境相同 #查看arch uname -a在 Linux 中查看和修改 GOOS 和 GOARCH 环境变量&#xff1a; 1. 查看当前 Go 环境变量 # 查看所有Go相关的环境变量 go env# …...

【Spring底层分析】Spring IoC

Spring IoC IoC&#xff1a;控制反转。将对象创建和对象之间的调用交给Spring容器来管理。好处是降低了对象之间的耦合度。 DI&#xff1a;依赖注入。给bean对象注入依赖的对象。 大白话就是&#xff1a;Spring帮你创建对象&#xff0c;对象的属性如果依赖于某个对象&#xf…...

Ubuntu系统进程管理

在Ubuntu系统中&#xff0c;进程管理是系统维护和性能调优的重要部分。以下是关键命令和技巧的总结&#xff0c;帮助你有效管理系统进程&#xff1a; 1. 查看进程 ps 命令&#xff1a;查看当前进程快照。 bash ps aux # 查看所有运行中的进程&#xff08;a所有用户…...

HDU2196 Computer 树形DP

原题链接 既然要查找每个节点的最远到达距离&#xff0c;由于该图是个树&#xff0c;我们就找从根节点向下遍历方向的终点的距离与先返回父节点再从最优的父节点沿着原来的方向的终点的距离的最大值 如图所示 也就是说&#xff0c;我们需要获得当前点的正距离最大值和正距离最…...

【第四十周】文献阅读:用于检索-增强大语言模型的查询与重写

目录 摘要Abstract用于检索-增强大语言模型的查询与重写研究背景方法论基于冻结LLM的重写方案基于可训练重写器的方案重写器预热训练&#xff08;Rewriter Warm-up&#xff09;强化学习&#xff08;Reinforcement Learning&#xff09; 创新性实验结果局限性总结 摘要 这篇论文…...

Istio常用命令

Istio常用命令 1. 安装和配置2. Sidecar 注入3. 验证和状态4. 升级和卸载5. 故障排除6. 配置管理 istioctl 的常用命令及其详细说明&#xff1a; 1. 安装和配置 安装 Istio # 使用指定的配置文件&#xff08;如 demo&#xff09;安装 Istio 到 Kubernetes 集群。 istioctl m…...

Linux基础15

一、网络模型 二、eNSP模拟器 拖拽操作建立模拟网络环境 交换机视图操作&#xff1a; <> 用户视图 [] 系统视图 接口视图 协议视图 ​ display version #显示版本和设备型号 ​ display current-configuration #查看设备配置(查错) ​…...

FISCO BCOS群组扩容实战指南:从原理到操作全解析

引言&#xff1a;为什么需要群组扩容&#xff1f; 在区块链技术迅猛发展的今天&#xff0c;企业级应用对区块链平台提出了更高的要求。"如何在不影响现有业务的情况下扩展区块链处理能力&#xff1f;"、"能否实现不同业务数据的物理隔离&#xff1f;"、&qu…...

【pytorch图像视觉】lesson17深度视觉应用(上)构建自己的深度视觉项目

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、 数据1、认识经典数据1.1入门数据&#xff1a;MNIST、其他数字与字母识别&#xff08;1&#xff09;数据加载&#xff08;2&#xff09;查看数据的特征和标…...

从“被动跳闸”到“主动预警”:智慧用电系统守护老旧小区安全

安科瑞顾强 近年来&#xff0c;老旧小区电气火灾事故频发&#xff0c;成为威胁居民生命财产安全的重要隐患。据统计&#xff0c;我国居住场所火灾伤亡人数远超其他场所&#xff0c;仅今年一季度就发生8.3万起住宅火灾&#xff0c;造成503人遇难。这些建筑多建于上世纪&#x…...

2.1 全栈运维管理:Proxmox VE单节点配置桥接、VLAN和Bonding的详细实验指南

本文是Proxmox VE 全栈管理体系的系列文章之一&#xff0c;如果对 Proxmox VE 全栈管理感兴趣&#xff0c;可以关注“Proxmox VE 全栈管理”专栏&#xff0c;后续文章将围绕该体系&#xff0c;从多个维度深入展开。 概要&#xff1a;本文介绍 Proxmox VE 单节点网络配置。桥接基…...

docker面试题

1.docker网络 Docker网络是Docker容器之间进行通信的关键功能。Docker提供了多种网络模式和驱动&#xff0c;以满足不同的网络需求。以下是Docker网络的详细介绍&#xff1a; 1.Docker网络模式 Docker提供了以下几种网络模式&#xff0c;每种模式适用于不同的场景&#xff1a;…...

计算机视觉——基于YOLOV8 的人体姿态估计训练与推理

概述 自 Ultralytics 发布 YOLOV5 之后&#xff0c;YOLO 的应用方向和使用方式变得更加多样化且简单易用。从图像分类、目标检测、图像分割、目标跟踪到关键点检测&#xff0c;YOLO 几乎涵盖了计算机视觉的各个领域&#xff0c;似乎已经成为计算机视觉领域的“万能工具”。 Y…...

【本地图床搭建】宝塔+Docker+MinIO+PicGo+cpolar:打造本地化“黑科技”图床方案

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言宝塔安装DockerMinIO 安装与设置cploar内网穿透PicGo下载与安装typora安装总结互动…...

【家政平台开发(41)】家政平台性能蜕变:性能测试与优化全解析

本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…...

监控docker中的java应用

1)进入指定的容器 docker exec -it demo /bin/bash 2)下载curl root89a67e345354:/# apt install curl -y 3)下载arthas root89a67e345354:/# curl -O https://arthas.aliyun.com/arthas-boot.jar 4)运行 root89a67e345354:/# java -jar arthas-boot.jar 5)监控 […...

Android游戏辅助工具开发详解

文章目录 第一部分&#xff1a;概述与基础准备1.1 游戏辅助工具的定义与用途1.2 开发环境准备1.3 项目创建与配置 第二部分&#xff1a;核心功能实现2.1 屏幕点击功能实现2.1.1 基础点击功能2.1.2 多点触控实现 2.2 滑动功能实现2.2.1 基础滑动功能2.2.2 曲线滑动实现 2.3 屏幕…...

重生之外卖配送时被投诉后的反思

重生之外卖配送时被投诉后的反思 写苍穹外卖时 我们发现在每一次调用sql语句时 insert update语句总会需要在service的实现类里加入例如create_time,create_user , update_time , update_user的填充 每次赋值都要重新编写代码&#xff0c;会造成代码冗余 &#xff1b; 序号字…...

计算机基础复习资料整理

计算机基础复习资料整理 一、操作系统 &#xff08;一&#xff09;定义 操作系统&#xff08;Operating System&#xff0c;OS&#xff09;是介于计算机硬件和用户&#xff08;程序或人&#xff09;之间的接口。作为通用管理程序&#xff0c;它管理计算机系统中每个部件的活动…...

Profibus DP主站网关数据映射全解析!

Profibus DP主站网关数据映射全解析&#xff01; 在工业自动化领域&#xff0c;Profibus DP主站网关作为一种关键的通讯设备&#xff0c;其数据映射的精准度和效率对整个控制系统的性能有着至关重要的影响。本文旨在深入探讨Profibus DP主站网关的数据映射过程&#xff0c;揭示…...

ocr-不动产权识别

目录 一、在阿里云申请ocr识别服务 二、创建springboot项目 三、后续 一、在阿里云申请ocr识别服务 在线体验&#xff1a;房产证图片上传 [阿里官方]不动产权证OCR文字识别_API专区_云市场-阿里云 (aliyun.com) 可以选择一毛500次这个 当然也可以白嫖100 下面有个在线调试…...

leetcode 198. House Robber

本题是动态规划问题。 第一步&#xff0c;明确并理解dp数组以及下标的含义 dp[i]表示从第0号房间一直到第i号房间(包含第i号房间)可以偷到的最大金额&#xff0c;具体怎么偷这里不考虑&#xff0c;第i1号及之后的房间也不考虑。换句话说&#xff0c;dp[i]也就是只考虑[0,i]号…...

【2025软考高级架构师】——软件架构设计(4)

摘要 本文主要介绍了几种软件架构设计相关的概念和方法。包括C2架构风格的规则&#xff0c;模型驱动架构&#xff08;MDA&#xff09;的起源、目标、核心模型及各模型之间的关系&#xff1b;软件架构复用的概念、历史发展、维度、类型及相关过程&#xff1b;特定领域架构&…...

分发饼干问题——用贪心算法解决

目录 一&#xff1a;问题描述 二&#xff1a;解决思路 贪心策略&#xff08;C语言&#xff09;算法复习总结3——贪心算法-CSDN博客 三&#xff1a;代码实现 四&#xff1a;复杂度分析 一&#xff1a;问题描述 分发饼干问题是一个经典的可以使用贪心算法解决的问题&#xf…...

深入详解MYSQL的MVCC机制

参考资料: 参考视频(注意第二个视频关于幻读的讲解是错误的,详情见本文) redoLog的结构详解 参考资料 学习内容: 1. MVCC要解决的问题 MVCC要解决的问题是,在不产生脏读等数据库问题的前提下,数据库的查询语句和更改语句不相互阻塞的情况; 在InnoDB中,MVCC仅仅存…...

DNS域名解析

目录 一.DNS 1.1DNS的简介 1.2DNS的背景 1.3DNS的架构 1.4实现DNS的方式 1.5DNS的查询类型 1.6DNS解析的基本流程 二.主从复制 2.1定义 2.2优缺点 三.DNS服务软件 3.1bind 3.1.1定义 3.1.2bind相关文件 3.2DNS服务器的核心文件 3.2.1主配置文件 3.2.2域名文件 …...

Java基础:一文讲清多线程和线程池和线程同步

01-概述 02-线程创建 继承Thread 实现Runnable(任务对象) 实现Callable接口 public class ThreadDemo3 {public static void main(String[] args) throws ExecutionException, InterruptedException {// 目标&#xff1a;线程创建3// 需求&#xff1a;求1-100的和Callable<…...