You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
3.4 KiB
143 lines
3.4 KiB
import { RouteRecordRaw } from 'vue-router';
|
|
import { dynamicImportRoute, getComponent } from '/nerv-base/router/helper/view-helper';
|
|
import { routeModule } from '/nerv-base/router/routes';
|
|
|
|
export interface RouteMenu {
|
|
code: string; //组件名
|
|
name?: string;
|
|
label: string;
|
|
sort: number;
|
|
parentCode?: string;
|
|
backApi?: Recordable[]; //组件内所使用的Api
|
|
route?: RouteRecordRaw;
|
|
menus?: RouteMenu[];
|
|
type?: string; //三种类型 menus菜单 noChildrenMenu不渲染该菜单下的子菜单 op操作
|
|
}
|
|
|
|
/***
|
|
* 转换权限菜单到路由
|
|
* @param menu
|
|
* @param parentCode
|
|
*/
|
|
export function transformMenuToRoute(menu: RouteMenu, parentCode = '') {
|
|
const { route, menus } = menu;
|
|
if (route.component) {
|
|
route.component = dynamicImportRoute(route.component);
|
|
}
|
|
|
|
const _route: RouteRecordRaw = {
|
|
...route,
|
|
};
|
|
if (menus) {
|
|
_route.children = transformMenus(menus);
|
|
}
|
|
return _route;
|
|
}
|
|
|
|
/***
|
|
* 转换权限菜单列表到路由列表
|
|
* @param menus
|
|
*/
|
|
export function transformMenus(menus: RouteMenu[]): RouteRecordRaw[] {
|
|
const list = [];
|
|
for (let i = 0, l = menus.length; i < l; i++) {
|
|
list.push(transformMenuToRoute(menus[i]));
|
|
}
|
|
return list;
|
|
}
|
|
|
|
export function sortMenu(menus: RouteMenu[]) {
|
|
menus.sort((a: RouteMenu, b: RouteMenu) => {
|
|
return a.sort - b.sort;
|
|
});
|
|
return menus;
|
|
}
|
|
|
|
export function dropMenu(menus, info) {
|
|
const { dragNode: menu, node: target, dropToGap, dropPosition } = info;
|
|
if (
|
|
(target.parentCode !== menu.parentCode && target.code !== menu.parentCode) ||
|
|
(target.parentCode !== '' && dropToGap === false)
|
|
) {
|
|
return {
|
|
success: false,
|
|
msg: '只在栏目内移动',
|
|
};
|
|
}
|
|
const list = getMenusArray(menus, menu);
|
|
// 移到当前栏目最顶部
|
|
if (target.code === menu.parentCode) {
|
|
}
|
|
|
|
moveMenuItem(list, menu.code, dropPosition, dropToGap);
|
|
|
|
return {
|
|
success: true,
|
|
menus,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* 获得移动的最终数组对象
|
|
* @param menus
|
|
* @param menu
|
|
*/
|
|
export function getMenusArray(menus, menu) {
|
|
let list: RouteMenu[] = [];
|
|
const index = -1;
|
|
|
|
function _getMenuArray(menus, menu) {
|
|
for (let i = 0, l = menus.length; i < l; i++) {
|
|
if (menus[i].code === menu.parentCode) {
|
|
list = menus[i];
|
|
return;
|
|
} else if (menus[i].menus) {
|
|
_getMenuArray(menus[i].menus, menu);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (menu.parentCode === '') {
|
|
return menus;
|
|
}
|
|
_getMenuArray(menus, menu);
|
|
|
|
return list.menus;
|
|
}
|
|
|
|
/**
|
|
* 数组内移动
|
|
* @param menus
|
|
* @param dragNodeCode
|
|
* @param dropPosition
|
|
* @param dropToGap
|
|
*/
|
|
function moveMenuItem(menus, dragNodeCode, dropPosition, dropToGap) {
|
|
const index = menus.findIndex((item) => dragNodeCode === item.code);
|
|
const _menus = menus.splice(index, 1);
|
|
if (dropToGap === false) {
|
|
menus.unshift(_menus[0]);
|
|
} else {
|
|
if (index < dropPosition) {
|
|
dropPosition--;
|
|
}
|
|
if (dropPosition === -1) dropPosition = 0;
|
|
menus.splice(dropPosition, 0, _menus[0]);
|
|
}
|
|
for (let i = 0, l = menus.length; i < l; i++) {
|
|
menus[i].sort = i + 1;
|
|
}
|
|
}
|
|
|
|
export function editMenuLabel(menus: RouteMenu[], code: string, newLabel: string) {
|
|
for (let i = 0, l = menus.length; i < l; i++) {
|
|
if (menus[i].code === code) {
|
|
menus[i].label = newLabel;
|
|
// menus[i].route.meta.title = newLabel;
|
|
return;
|
|
}
|
|
if (menus[i].menus) {
|
|
editMenuLabel(menus[i].menus as RouteMenu[], code, newLabel);
|
|
}
|
|
}
|
|
}
|
|
|