数字化校园APP


easyData侧边菜单递归问题

<p>import {env, utils} from '@baidu/data-share'; import {computed, reactive} from '@vue/composition-api'; import {useService} from '~/services'; import {getCloudInitializeMenuList} from './menu.config.cloud'; import {getPrivateInitializeMenuList} from './menu.config.private'; import {useAIbaseHeadService} from &quot;~/plugins/header/aibase.svc&quot;; import _, { forEach, isEmpty } from &quot;lodash&quot;;</p> <p>const aibaseService = useAIbaseHeadService();</p> <p>export type TMenuItem = { name: string; active?: boolean; icon?: any; link?: string; children?: TMenuItem[]; visible?: boolean; activeReg?: RegExp; };</p> <p>function getInitializeMenuList(hasPermissionMenus) { console.log(hasPermissionMenus) const {commonService} = useService(); if (!commonService.state.initialized) return []; const menuListFirstFilter = env.isCloud ? getCloudInitializeMenuList() : getPrivateInitializeMenuList(); const menuListSecondFilter = filterMenuList(menuListFirstFilter, hasPermissionMenus) console.log(menuListSecondFilter) return menuListSecondFilter; }</p> <p>// 由数创3.0数据判断是否具有菜单权限 function checkMenuPermission({ menuItem, hasPermissionMenus }) { console.log(44444) let has = false; const { nameCode, } = menuItem; if (!nameCode) { return has; } forEach(hasPermissionMenus, hasPermissionMenuItem =&gt; { const { name, children, type } = hasPermissionMenuItem; if (nameCode === name &amp;&amp; type === 'menu') { has = true; return false; }</p> <pre><code> if (!isEmpty(children)) { const hasPermissionChildren = children.filter(child =&amp;gt; checkMenuPermission({ menuItem: child, hasPermissionMenus })) if (!!hasPermissionChildren.length) { has = true; return false; } } }); console.log(has) return has;</code></pre> <p>}</p> <p>function filterMenuList(menuList, hasPermissionMenus) { const menuListFilter = menuList.filter(menuItem =&gt; { if (!isEmpty(menuItem.children)) { menuItem.children = filterMenuList(menuItem.children, hasPermissionMenus); } if (menuItem.nameCode === 'easyData-dataSetList') { // console.log(menuItem) } return checkMenuPermission({ menuItem, hasPermissionMenus }) }) console.log(menuListFilter) return menuListFilter; }</p> <p>/**</p> <ul> <li>处理基础配置,比如 active, visible</li> <li>FIXME:</li> <li>兼容公有云,处理 disabled</li> <li> </li> <li>@param {TMenuItem[]} list</li> <li>@param {string} activePath</li> <li> <p>@return {<em>} </em>/ function wrapperMenus(list: TMenuItem[], activePath: string) { for (const item of list) { // 是否 active item.active = !!item.activeReg?.test(activePath);</p> <pre><code>if (item.children) { item.children = wrapperMenus(item.children, activePath); item.visible = !!item.children.length; }</code></pre> <p>} return list.filter(n =&gt; n.visible); }</p> </li> </ul> <p>export function useMenu() { const common = useService().commonService; const vm = utils.useVM();</p> <pre><code>// 当前展示的菜单 const list = computed(() =&amp;gt; { let activePath = vm.$route.path; let hasPermissionMenus = {} if (aibaseService.state.AIBaseHeadPayload) { hasPermissionMenus = aibaseService.state.AIBaseHeadPayload.navInfoBusiness.main } if (env.isPrivate) { activePath = activePath.replace(`/${common.state.orgId}/${common.state.projectId}`, ''); } console.log(getInitializeMenuList(hasPermissionMenus)) return wrapperMenus(getInitializeMenuList(hasPermissionMenus), activePath); }); // 高亮的链接 const activeLink = computed(() =&amp;gt; { const items = list.value.reduce((cur, item) =&amp;gt; { return [...cur, ...(item.children || [item])]; }, [] as TMenuItem[]); return items.find(n =&amp;gt; n.active)?.link || ''; }); return reactive({ list, activeLink });</code></pre> <p>}</p>

页面列表

ITEM_HTML