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.
342 lines
12 KiB
342 lines
12 KiB
|
|
|
|
// import { message } from 'ant-design-vue';
|
|
import { defineStore } from 'pinia';
|
|
import { authorizationService } from './authorization-service';
|
|
import { cloneDeep } from 'lodash-es';
|
|
// import { router } from '/nerv-lib/paas/router';
|
|
// import { http } from '/nerv-lib/util/http';
|
|
|
|
export interface Catalog {
|
|
label: string;
|
|
name?: string;
|
|
items: CatalogItem[];
|
|
}
|
|
|
|
export interface CatalogItem {
|
|
label: string;
|
|
name: string;
|
|
icon: string;
|
|
url: string;
|
|
dock?: boolean;
|
|
queryParams?: QueryParams;
|
|
isRedirect?: boolean;
|
|
app?: string;
|
|
authModuleNames?: any[]; //权限控制所需的所有模块名
|
|
splitMenuModule?: string; //某个菜单单独拆分出去放在一个app中,权限照旧
|
|
splitModule?: boolean; //被拆分的模块
|
|
}
|
|
// QueryParams修改声明view和region都为非必选
|
|
export interface QueryParams {
|
|
view?: string;
|
|
region?: string;
|
|
}
|
|
|
|
export const CatalogConfigService = defineStore({
|
|
id: 'CatalogConfigService',
|
|
/**
|
|
* sideMenu 侧边栏菜单
|
|
* @returns
|
|
*/
|
|
state(): { region: any; data: any[] } {
|
|
return { region: '', data: [] };
|
|
},
|
|
getters: {},
|
|
actions: {
|
|
getCatalogs() {
|
|
if (this.data.length != 0) {
|
|
return this.data;
|
|
}
|
|
|
|
// @ts-ignore
|
|
const { ModulesRes } = authorizationService();
|
|
const modules = cloneDeep(ModulesRes);
|
|
this.data = this.convert2Catalog(modules);
|
|
return this.data;
|
|
},
|
|
|
|
convert2Catalog(modules: any): any {
|
|
const authService = authorizationService();
|
|
let catalogs: Array<Catalog> = [];
|
|
let sort: any[] = [];
|
|
const storage = JSON.parse((window.localStorage.docks as string) || '[]');
|
|
// console.log('storage', storage);
|
|
|
|
modules.forEach((module: any) => {
|
|
if (module.hasOwnProperty('sort')) {
|
|
sort = module.sort;
|
|
} else {
|
|
const catalogName = module.catalog;
|
|
let catalog: Catalog;
|
|
catalogs.forEach((cl) => {
|
|
if (cl.name == catalogName) {
|
|
catalog = cl;
|
|
}
|
|
});
|
|
if (!catalog) {
|
|
catalog = {
|
|
label: catalogName,
|
|
name: catalogName,
|
|
items: [],
|
|
};
|
|
catalogs.push(catalog);
|
|
}
|
|
|
|
const catalogItem: CatalogItem = {
|
|
label: module.label,
|
|
name: module.name,
|
|
icon: module.icon,
|
|
url: module.url,
|
|
app: module.app,
|
|
dock: storage.includes(module.name),
|
|
};
|
|
let catalogItemName = module.name;
|
|
if (module['authModuleNames']) {
|
|
catalogItem['authModuleNames'] = module.authModuleNames;
|
|
}
|
|
if (module['splitMenuModule']) {
|
|
catalogItemName = catalogItem['splitMenuModule'] = module['splitMenuModule'];
|
|
}
|
|
if (module['splitModule']) {
|
|
catalogItem['splitModule'] = module['splitModule'];
|
|
}
|
|
if (module.queryParams) {
|
|
catalogItem['queryParams'] = {
|
|
view: module.queryParams.view,
|
|
};
|
|
}
|
|
|
|
const isCurrentApp = authService.isCurrentApp(module.app);
|
|
catalogItem['isRedirect'] = !isCurrentApp;
|
|
|
|
let firstMenuName;
|
|
|
|
/**
|
|
* 如果module.json最外层没有指定url 并且 当前登录是admin账号, 则取module.json中menus的第0个
|
|
*/
|
|
if (!catalogItem.url && authService.isAdmin()) {
|
|
if (module['menus'] && module['menus'].length > 0) {
|
|
firstMenuName = module['menus'][0]['name'];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 如果module.json中的最外层没有指定url 且 当前登陆非admin, 则取menus中有权限的第0个
|
|
*/
|
|
const menusForAppMap: any = {};
|
|
if (!catalogItem.url && !authService.isAdmin()) {
|
|
/**
|
|
* 将独立模块的子菜单menu['submenus']加进一级菜单里 module['menus']
|
|
* 将文件夹模块的菜单处理和独立模块处理成同一种逻辑
|
|
*/
|
|
const globalMenus: Array<any> = []; //保留独立模块的子菜单
|
|
if (module['menus'] && module['menus'].length > 0) {
|
|
module['menus'].forEach((menu: { [x: string]: any[] }) => {
|
|
if ((menu['isGlobal'] || menu['isDir']) && menu['submenus'].length > 0) {
|
|
menu['submenus'].forEach((subMenu) => {
|
|
module['menus'].push({
|
|
name: subMenu['operation']['resource'],
|
|
url: subMenu['url'],
|
|
label: subMenu['label'],
|
|
});
|
|
});
|
|
globalMenus.push(menu);
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* 独立模块下的资源与菜单顺序不一致时候,需要重新对菜单按照menusSort排序
|
|
*/
|
|
if (module['menusSort'] && module['menusSort'] instanceof Array) {
|
|
if (module['menus'] && module['menus'].length > 0) {
|
|
let sortMenus: any[] = [];
|
|
module['menusSort'].forEach((sortMenuName) => {
|
|
module['menus'].forEach((menu: { [x: string]: any }) => {
|
|
//独立模块下的菜单
|
|
if (menu['isGlobal'] && menu['submenus'].length > 0) {
|
|
menu['submenus'].forEach((subMenu: { [x: string]: any }) => {
|
|
if (!subMenu['operation']['resource']) return;
|
|
const menuName = subMenu['operation']['resource'];
|
|
if (menuName == sortMenuName) {
|
|
sortMenus.push({
|
|
name: subMenu['operation']['resource'],
|
|
url: subMenu['url'],
|
|
label: subMenu['label'],
|
|
});
|
|
}
|
|
});
|
|
//普通菜单
|
|
} else if (menu['name'] == sortMenuName) {
|
|
sortMenus.push(menu);
|
|
}
|
|
});
|
|
});
|
|
sortMenus = [...sortMenus, ...globalMenus];
|
|
module['menus'] = sortMenus;
|
|
}
|
|
}
|
|
/***如果app下一级菜单属于不同后端注册模块:authModuleNames存放所有的模块**/
|
|
let authMenus: any[] = [];
|
|
if (catalogItem['authModuleNames'] && catalogItem['authModuleNames'].length > 0) {
|
|
const authModuleNames: any[] = catalogItem['authModuleNames'];
|
|
authModuleNames.forEach((moduleName) => {
|
|
const tempAuthMenus = authService.getValidFirstMenuName(moduleName); //每个模块有权限的菜单
|
|
if (tempAuthMenus && tempAuthMenus.length > 0) {
|
|
tempAuthMenus.forEach((menu) => {
|
|
menusForAppMap[menu] = moduleName;
|
|
});
|
|
}
|
|
// authMenus = [...authMenus, ...tempAuthMenus];
|
|
if (tempAuthMenus) {
|
|
authMenus = [...authMenus, ...tempAuthMenus];
|
|
} else {
|
|
authMenus = [...authMenus];
|
|
}
|
|
});
|
|
} else {
|
|
/***如果app下所有资源属于同一个后端注册模块:没有authModuleNames字段**/
|
|
authMenus = authService.getValidFirstMenuName(catalogItemName);
|
|
if (authMenus && authMenus.length > 0) {
|
|
authMenus.forEach((menu) => {
|
|
menusForAppMap[menu] = catalogItemName;
|
|
});
|
|
}
|
|
}
|
|
if (module['menus'] && module['menus'].length > 0) {
|
|
if (authMenus && authMenus.length > 0) {
|
|
let count = 0;
|
|
module['menus'].forEach((menusItem: { [x: string]: any }) => {
|
|
if (authMenus.indexOf(menusItem['name']) != -1) {
|
|
count++;
|
|
if (count == 1) {
|
|
firstMenuName = menusItem['name'];
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取第0个子菜单的url以及queryParams
|
|
*/
|
|
if (firstMenuName) {
|
|
let moduleName = catalogItemName;
|
|
if (menusForAppMap && menusForAppMap[firstMenuName]) {
|
|
moduleName = menusForAppMap[firstMenuName];
|
|
}
|
|
let urlObj = {};
|
|
let isSubModule = false;
|
|
if (moduleName == catalogItemName) {
|
|
urlObj = this.getUrlObj(firstMenuName, module['menus']);
|
|
} else {
|
|
isSubModule = true;
|
|
let globalModule: any = {};
|
|
if (module['menus'] && module['menus'].length > 0) {
|
|
module['menus'].forEach((subMenusModule: { [x: string]: any }) => {
|
|
if (subMenusModule['name'] == moduleName) {
|
|
globalModule = subMenusModule;
|
|
}
|
|
});
|
|
}
|
|
urlObj = this.getUrlObj(firstMenuName, globalModule['submenus'], isSubModule);
|
|
}
|
|
const url: any = urlObj['url'];
|
|
const queryParams = urlObj['queryParams'];
|
|
|
|
if (url) {
|
|
catalogItem['url'] = url;
|
|
}
|
|
|
|
if (queryParams) {
|
|
catalogItem['queryParams'] = queryParams;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 如果不是当前应用的url 并且 不是http开头的url, 则加上应用名
|
|
*/
|
|
if (catalogItem.url && catalogItem.url.toLowerCase().indexOf('http') != 0) {
|
|
catalogItem.url = '/' + module.app + catalogItem.url;
|
|
|
|
/* 如果存在queryParams, 则在url中追加 */
|
|
const queryParams = catalogItem['queryParams'];
|
|
if (queryParams) {
|
|
const paramStringArr = [];
|
|
for (const k in queryParams) {
|
|
const paramString = k + '=' + queryParams[k];
|
|
paramStringArr.push(paramString);
|
|
}
|
|
if (catalogItem.url.indexOf('http') == 0 || catalogItem['isRedirect']) {
|
|
catalogItem.url = catalogItem.url + '?' + paramStringArr.join('&');
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!catalogItem.url) {
|
|
catalogItem.url = '';
|
|
}
|
|
|
|
catalog.items.push(catalogItem);
|
|
}
|
|
});
|
|
// console.log(catalogs);
|
|
if (sort) {
|
|
catalogs = this.sortcatalogs(catalogs, sort);
|
|
}
|
|
// console.log(catalogs);
|
|
return catalogs;
|
|
},
|
|
getUrlObj(menuName: any, menus: any[], isSubModule?: boolean) {
|
|
let url = null;
|
|
let queryParams = null;
|
|
if (menus && menus instanceof Array) {
|
|
menus.forEach((mu) => {
|
|
if (isSubModule) {
|
|
if (mu['operation']['resource'] != menuName) {
|
|
return;
|
|
}
|
|
} else {
|
|
if (mu['name'] != menuName) {
|
|
return;
|
|
}
|
|
}
|
|
if (this.region) {
|
|
if (mu['queryParams']) {
|
|
mu['queryParams']['region'] = this.region.value;
|
|
} else {
|
|
mu['queryParams'] = { region: this.region.value };
|
|
}
|
|
} else {
|
|
if (mu['queryParams']) {
|
|
delete mu['queryParams']['region'];
|
|
}
|
|
}
|
|
url = mu['url'];
|
|
queryParams = mu['queryParams'];
|
|
});
|
|
}
|
|
return {
|
|
url: url,
|
|
queryParams: queryParams,
|
|
};
|
|
},
|
|
|
|
sortcatalogs(orginCatalogs: any[], sort: string | any[]) {
|
|
let destCatalogs = [];
|
|
for (let index = 0; index < sort.length; index++) {
|
|
for (let idx = 0; idx < orginCatalogs.length; idx++) {
|
|
if (orginCatalogs[idx].label == sort[index]) {
|
|
destCatalogs.push(orginCatalogs[idx]);
|
|
orginCatalogs.splice(idx, 1);
|
|
}
|
|
}
|
|
}
|
|
if (orginCatalogs) {
|
|
destCatalogs = destCatalogs.concat(orginCatalogs);
|
|
}
|
|
// console.log(destCatalogs);
|
|
return destCatalogs;
|
|
},
|
|
},
|
|
});
|
|
|