<template> <div class="menuManagement-container"> <el-divider content-position="left"> 演示环境仅做基础功能展示,若想实现不同角色的真实菜单配置,需将settings.js路由加载模式改为all模式,由后端全面接管路由渲染与权限控制 </el-divider> <el-row> <el-col :xs="24" :sm="24" :md="8" :lg="4" :xl="4"> <el-tree :data="data" :props="defaultProps" node-key="id" :default-expanded-keys="['root']" @node-click="handleNodeClick" ></el-tree> </el-col> <el-col :xs="24" :sm="24" :md="16" :lg="20" :xl="20"> <vab-query-form> <vab-query-form-top-panel :span="12"> <el-button icon="el-icon-plus" type="primary" @click="handleEdit"> 添加 </el-button> </vab-query-form-top-panel> </vab-query-form> <el-table v-loading="listLoading" :data="list" :element-loading-text="elementLoadingText" row-key="path" border default-expand-all :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" > <el-table-column show-overflow-tooltip prop="name" label="name" ></el-table-column> <el-table-column show-overflow-tooltip prop="path" label="路径" ></el-table-column> <el-table-column show-overflow-tooltip label="是否隐藏"> <template #default="{ row }"> <span> {{ row.hidden ? "是" : "否" }} </span> </template> </el-table-column> <el-table-column show-overflow-tooltip label="是否一直显示当前节点"> <template #default="{ row }"> <span> {{ row.alwaysShow ? "是" : "否" }} </span> </template> </el-table-column> <el-table-column show-overflow-tooltip prop="component" label="vue文件路径" ></el-table-column> <el-table-column show-overflow-tooltip prop="redirect" label="重定向" ></el-table-column> <el-table-column show-overflow-tooltip prop="meta.title" label="标题" ></el-table-column> <el-table-column show-overflow-tooltip label="图标"> <template #default="{ row }"> <span v-if="row.meta"> <vab-icon v-if="row.meta.icon" :icon="['fas', row.meta.icon]" ></vab-icon> </span> </template> </el-table-column> <el-table-column show-overflow-tooltip label="是否固定"> <template #default="{ row }"> <span v-if="row.meta"> {{ row.meta.affix ? "是" : "否" }} </span> </template> </el-table-column> <el-table-column show-overflow-tooltip label="是否无缓存"> <template #default="{ row }"> <span v-if="row.meta"> {{ row.meta.noKeepAlive ? "是" : "否" }} </span> </template> </el-table-column> <el-table-column show-overflow-tooltip label="badge"> <template #default="{ row }"> <span v-if="row.meta"> {{ row.meta.badge }} </span> </template> </el-table-column> <el-table-column show-overflow-tooltip label="操作" width="200"> <template #default="{ row }"> <el-button type="text" @click="handleEdit(row)">编辑</el-button> <el-button type="text" @click="handleDelete(row)">删除</el-button> </template> </el-table-column> </el-table> </el-col> </el-row> <edit ref="edit" @fetch-data="fetchData"></edit> </div> </template> <script> import { getRouterList as getList } from "@/api/router"; import { getTree, doDelete } from "@/api/menuManagement"; import Edit from "./components/MenuManagementEdit"; export default { name: "MenuManagement", components: { Edit }, data() { return { data: [], defaultProps: { children: "children", label: "label", }, list: [], listLoading: true, elementLoadingText: "正在加载...", }; }, async created() { const roleData = await getTree(); this.data = roleData.data; this.fetchData(); }, methods: { handleEdit(row) { if (row.path) { this.$refs["edit"].showEdit(row); } else { this.$refs["edit"].showEdit(); } }, handleDelete(row) { if (row.id) { this.$baseConfirm("你确定要删除当前项吗", null, async () => { const { msg } = await doDelete({ ids: row.id }); this.$baseMessage(msg, "success"); this.fetchData(); }); } }, async fetchData() { this.listLoading = true; const { data } = await getList(); this.list = data; setTimeout(() => { this.listLoading = false; }, 300); }, handleNodeClick(data) { this.fetchData(); }, }, }; </script>