Files
SaaS-lib/lib/paas/store/modules/catalog-config.ts
xuziqiang d0155dbe3c push
2024-05-15 17:29:42 +08:00

343 lines
12 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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;
},
},
});