| | |
| | | <template> |
| | | <div class="tree-menu"> |
| | | <SearchBar @search="handleSearch" /> |
| | | <div class="topMenu"> |
| | | <span class="topMenu-title">模型库</span> |
| | | <div class="btnGroup"> |
| | | <el-icon class="icon1"><FolderAdd /></el-icon> |
| | | <el-icon class="icon2"><Edit /></el-icon> |
| | | <el-icon class="icon3"><Delete /></el-icon> |
| | | </div> |
| | | </div> |
| | | <el-tree |
| | | ref="treeRef" |
| | | :data="filteredData" |
| | |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { ref, watch } from 'vue' |
| | | import { useRouter } from 'vue-router' |
| | | import SearchBar from './SearchBar.vue' |
| | | import { Document, FolderOpened } from '@element-plus/icons-vue' |
| | | import { ref, watch, defineProps } from "vue"; |
| | | import { useRouter } from "vue-router"; |
| | | import { Document, FolderOpened } from "@element-plus/icons-vue"; |
| | | |
| | | const router = useRouter() |
| | | const treeRef = ref() |
| | | const router = useRouter(); |
| | | const treeRef = ref(); |
| | | const props = defineProps<{ |
| | | menuItem: string; |
| | | }>(); |
| | | |
| | | interface TreeNode { |
| | | label: string |
| | | path?: string |
| | | icon?: string |
| | | children?: TreeNode[] |
| | | label: string; |
| | | path?: string; |
| | | icon?: string; |
| | | children?: TreeNode[]; |
| | | } |
| | | |
| | | const treeData = ref<TreeNode[]>([ |
| | | const modelTreeData = ref<TreeNode[]>([ |
| | | { |
| | | label: '模型管理', |
| | | icon: 'FolderOpened', |
| | | label: "型号", |
| | | icon: "FolderOpened", |
| | | children: [ |
| | | { |
| | | label: '机构模型', |
| | | path: '/mechanism', |
| | | icon: 'Document' |
| | | label: "着陆器模型库", |
| | | path: "/model/landerModel", |
| | | icon: "Document", |
| | | }, |
| | | { |
| | | label: '运动学模型', |
| | | path: '/kinematic', |
| | | icon: 'Document' |
| | | } |
| | | ] |
| | | label: "巡视器模型库", |
| | | path: "/model/roverModel", |
| | | icon: "Document", |
| | | }, |
| | | { |
| | | label: "飞跃器模型库", |
| | | path: "/model/leapMachineModel", |
| | | icon: "Document", |
| | | }, |
| | | ], |
| | | }, |
| | | { |
| | | label: '可视化仿真', |
| | | icon: 'FolderOpened', |
| | | children: [ |
| | | { |
| | | label: '仿真配置', |
| | | path: '/simulation-config', |
| | | icon: 'Document' |
| | | }, |
| | | { |
| | | label: '仿真结果', |
| | | path: '/simulation-result', |
| | | icon: 'Document' |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | label: '系统管理', |
| | | icon: 'FolderOpened', |
| | | children: [ |
| | | { |
| | | label: '用户管理', |
| | | path: '/system/user', |
| | | icon: 'Document' |
| | | }, |
| | | { |
| | | label: '权限设置', |
| | | path: '/system/permission', |
| | | icon: 'Document' |
| | | } |
| | | ] |
| | | } |
| | | ]) |
| | | ]); |
| | | |
| | | const defaultProps = { |
| | | children: 'children', |
| | | label: 'label' |
| | | } |
| | | children: "children", |
| | | label: "label", |
| | | }; |
| | | |
| | | const filteredData = ref(treeData.value) |
| | | const filteredData = ref(modelTreeData.value); |
| | | |
| | | const filterNode = (value: string, data: TreeNode) => { |
| | | if (!value) return true |
| | | return data.label.toLowerCase().includes(value.toLowerCase()) |
| | | } |
| | | |
| | | const handleSearch = (searchText: string) => { |
| | | treeRef.value?.filter(searchText) |
| | | } |
| | | if (!value) return true; |
| | | return data.label.toLowerCase().includes(value.toLowerCase()); |
| | | }; |
| | | |
| | | const handleNodeClick = (data: TreeNode) => { |
| | | if (data.path) { |
| | | router.push(data.path) |
| | | router.push(data.path); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | watch( |
| | | () => props.menuItem, |
| | | (value) => { |
| | | if (value == "/" || value == "/model") { |
| | | filteredData.value = modelTreeData.value; |
| | | } else { |
| | | filteredData.value = [] |
| | | } |
| | | } |
| | | ); |
| | | </script> |
| | | |
| | | <style lang="less" scoped> |
| | | .tree-menu { |
| | | height: 100%; |
| | | background-color: #fff; |
| | | |
| | | |
| | | :deep(.el-tree) { |
| | | padding: 10px; |
| | | } |
| | | |
| | | |
| | | .custom-tree-node { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 8px; |
| | | } |
| | | |
| | | .topMenu { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | padding: 10px; |
| | | border-bottom: 1px solid #ebeef5; |
| | | .topMenu-title { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | } |
| | | .btnGroup { |
| | | display: flex; |
| | | gap: 12px; |
| | | cursor: pointer; |
| | | |
| | | .icon1, |
| | | .icon2, |
| | | .icon3 { |
| | | font-size: 18px; |
| | | color: #606266; |
| | | &:hover { |
| | | color: #409eff; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | | </style> |