218 lines
5.7 KiB
Vue
218 lines
5.7 KiB
Vue
|
|
<template>
|
|||
|
|
<div class="data-manage-page">
|
|||
|
|
<CSearch
|
|||
|
|
@search="handleSearch"
|
|||
|
|
@reset="handleReset"
|
|||
|
|
>
|
|||
|
|
<el-form-item label="用户名称:" class="search-item">
|
|||
|
|
<el-input
|
|||
|
|
v-model="searchForm.uname"
|
|||
|
|
placeholder="请输入用户名称"
|
|||
|
|
clearable
|
|||
|
|
class="search-input"
|
|||
|
|
/>
|
|||
|
|
</el-form-item>
|
|||
|
|
<el-form-item label="登录账户:" class="search-item">
|
|||
|
|
<el-input
|
|||
|
|
v-model="searchForm.userName"
|
|||
|
|
placeholder="请输入登录账户"
|
|||
|
|
clearable
|
|||
|
|
class="search-input"
|
|||
|
|
/>
|
|||
|
|
</el-form-item>
|
|||
|
|
<el-form-item label="用户状态:" class="search-item">
|
|||
|
|
<el-select
|
|||
|
|
v-model="searchForm.ustatus"
|
|||
|
|
placeholder="请选择用户状态"
|
|||
|
|
clearable
|
|||
|
|
class="search-select"
|
|||
|
|
>
|
|||
|
|
<el-option label="停用" value="0" />
|
|||
|
|
<el-option label="在用" value="1" />
|
|||
|
|
<el-option label="锁定" value="2" />
|
|||
|
|
</el-select>
|
|||
|
|
</el-form-item>
|
|||
|
|
</CSearch>
|
|||
|
|
|
|||
|
|
|
|||
|
|
<div class="main-wrapper">
|
|||
|
|
<div class="main-section">
|
|||
|
|
<div class="action-section">
|
|||
|
|
<el-button type="primary" icon="Plus" @click="handleAdd">
|
|||
|
|
新增
|
|||
|
|
</el-button>
|
|||
|
|
<el-button type="success" icon="Download" @click="handleExport">
|
|||
|
|
导出
|
|||
|
|
</el-button>
|
|||
|
|
</div>
|
|||
|
|
<TreeTable
|
|||
|
|
:table-data="tableData"
|
|||
|
|
:loading="loading"
|
|||
|
|
@load-children="handleLoadChildren"
|
|||
|
|
>
|
|||
|
|
<template #columns>
|
|||
|
|
<el-table-column prop="name" label="名称" width="350" :tree-node="true" />
|
|||
|
|
<el-table-column prop="desc" label="描述" width="400" />
|
|||
|
|
<el-table-column prop="createTime" label="创建时间" width="200" />
|
|||
|
|
<el-table-column prop="createTime" label="创建时间" width="200" />
|
|||
|
|
<el-table-column prop="createTime" label="创建时间" width="200" />
|
|||
|
|
<el-table-column prop="createTime" label="创建时间" width="200" />
|
|||
|
|
<el-table-column prop="createTime" label="创建时间" width="200" fixed="right" />
|
|||
|
|
</template>
|
|||
|
|
</TreeTable>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup>
|
|||
|
|
import { ref, reactive, onMounted } from 'vue'
|
|||
|
|
import CSearch from '@/components/Search/proSearch.vue'
|
|||
|
|
import TreeTable from '@/components/Table/proTreeTable.vue'
|
|||
|
|
|
|||
|
|
|
|||
|
|
const searchForm = reactive({
|
|||
|
|
uname: '',
|
|||
|
|
ustatus: '',
|
|||
|
|
userName: ''
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 模拟树形表格数据(一级节点)
|
|||
|
|
const tableData = ref([
|
|||
|
|
{
|
|||
|
|
id: 1,
|
|||
|
|
name: '一级节点1',
|
|||
|
|
desc: '这是一级节点1(可展开到二级)',
|
|||
|
|
createTime: '2026-03-04',
|
|||
|
|
hasChildren: true // 标记有子节点
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
id: 2,
|
|||
|
|
name: '一级节点2',
|
|||
|
|
desc: '这是一级节点2(无下级)',
|
|||
|
|
createTime: '2026-03-04',
|
|||
|
|
hasChildren: false
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
id: 3,
|
|||
|
|
name: '一级节点3',
|
|||
|
|
desc: '这是一级节点3(可展开到二级,二级可展开到三级)',
|
|||
|
|
createTime: '2026-03-04',
|
|||
|
|
hasChildren: true
|
|||
|
|
}
|
|||
|
|
])
|
|||
|
|
|
|||
|
|
const loading = ref(false)
|
|||
|
|
const handleLoadChildren = async ({ row, resolve }) => {
|
|||
|
|
loading.value = true
|
|||
|
|
try {
|
|||
|
|
// 模拟接口请求延迟
|
|||
|
|
await new Promise(resolve => setTimeout(resolve, 800))
|
|||
|
|
|
|||
|
|
const nodeId = row.id.toString()
|
|||
|
|
const level = nodeId.split('-').length // 通过ID分割判断层级:1=一级,2=二级,3=三级...
|
|||
|
|
|
|||
|
|
let childrenData = []
|
|||
|
|
// 一级节点的子节点(二级)
|
|||
|
|
if (level === 1) {
|
|||
|
|
childrenData = [
|
|||
|
|
{
|
|||
|
|
id: `${row.id}-1`,
|
|||
|
|
name: `二级节点-${row.id}-1`,
|
|||
|
|
desc: `这是【${row.name}】的二级子节点1`,
|
|||
|
|
createTime: '2026-03-04',
|
|||
|
|
// 只有一级节点3的二级子节点1可以展开到三级
|
|||
|
|
hasChildren: row.id === 3 ? true : false
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
id: `${row.id}-2`,
|
|||
|
|
name: `二级节点-${row.id}-2`,
|
|||
|
|
desc: `这是【${row.name}】的二级子节点2`,
|
|||
|
|
createTime: '2026-03-04',
|
|||
|
|
hasChildren: false
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
id: `${row.id}-3`,
|
|||
|
|
name: `二级节点-${row.id}-3`,
|
|||
|
|
desc: `这是【${row.name}】的二级子节点3`,
|
|||
|
|
createTime: '2026-03-04',
|
|||
|
|
hasChildren: false
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
// 二级节点的子节点(三级)
|
|||
|
|
else if (level === 2) {
|
|||
|
|
childrenData = [
|
|||
|
|
{
|
|||
|
|
id: `${row.id}-1`,
|
|||
|
|
name: `三级节点-${row.id}-1`,
|
|||
|
|
desc: `这是【${row.name}】的三级子节点1`,
|
|||
|
|
createTime: '2026-03-04',
|
|||
|
|
hasChildren: false
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
id: `${row.id}-2`,
|
|||
|
|
name: `三级节点-${row.id}-2`,
|
|||
|
|
desc: `这是【${row.name}】的三级子节点2`,
|
|||
|
|
createTime: '2026-03-04',
|
|||
|
|
hasChildren: false
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 通过 resolve 回调返回子节点数据
|
|||
|
|
resolve(childrenData)
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('加载子节点失败:', error)
|
|||
|
|
resolve([]) // 加载失败返回空数组
|
|||
|
|
} finally {
|
|||
|
|
loading.value = false
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style scoped>
|
|||
|
|
.data-manage-page {
|
|||
|
|
width: 100%;
|
|||
|
|
height: 100%;
|
|||
|
|
padding: 4px;
|
|||
|
|
box-sizing: border-box;
|
|||
|
|
display: flex;
|
|||
|
|
flex-direction: column;
|
|||
|
|
overflow: hidden !important;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.main-wrapper {
|
|||
|
|
flex: 1;
|
|||
|
|
width: 100%;
|
|||
|
|
overflow: hidden;
|
|||
|
|
min-height: 0;
|
|||
|
|
border: 1px solid #e5e7eb;
|
|||
|
|
border-radius: 6px;
|
|||
|
|
margin: 0 !important;
|
|||
|
|
padding: 0;
|
|||
|
|
box-sizing: border-box;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.main-section {
|
|||
|
|
width: 100%;
|
|||
|
|
height: 100%;
|
|||
|
|
display: flex;
|
|||
|
|
flex-direction: column;
|
|||
|
|
overflow: hidden;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.action-section {
|
|||
|
|
padding: 12px 16px;
|
|||
|
|
border-bottom: 1px solid #e5e7eb;
|
|||
|
|
display: flex;
|
|||
|
|
gap: 8px;
|
|||
|
|
flex-shrink: 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
:deep(.el-button .el-icon) {
|
|||
|
|
margin-right: 4px;
|
|||
|
|
}
|
|||
|
|
</style>
|