UNPKG

@antdp/basic-layouts

Version:

入口框架公共界面

565 lines (551 loc) 20.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"]; Object.defineProperty(exports, "__esModule", { value: true }); exports.defaultThemeColors = exports.HandleMenu = void 0; exports.getIcon = getIcon; exports.getSiderMenus = void 0; exports.isUrl = isUrl; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _icons = _interopRequireDefault(require("@ant-design/icons")); var _react = _interopRequireDefault(require("react")); var _reactRouterDom = require("react-router-dom"); var _max = require("@umijs/max"); var _jsxRuntime = require("react/jsx-runtime"); // @ts-ignore /** * * 1. 对路由权限进行判定 * 2. 保存每个子集对应的父级 * 3. 父级链 */ var HandleMenu = exports.HandleMenu = /*#__PURE__*/function () { function HandleMenu(props) { (0, _classCallCheck2["default"])(this, HandleMenu); (0, _defineProperty2["default"])(this, "authMenus", []); /**所有直接渲染的父级菜单*/ (0, _defineProperty2["default"])(this, "parentMenu", []); (0, _defineProperty2["default"])(this, "parentflatMenu", []); /**子集key对应的父级key*/ (0, _defineProperty2["default"])(this, "childParent", new Map([])); /**key对应子集数据*/ (0, _defineProperty2["default"])(this, "childMenu", new Map([])); // 所有子集菜单 平铺 (0, _defineProperty2["default"])(this, "flatMenu", []); // 所有菜单 平铺 (0, _defineProperty2["default"])(this, "flatAllMenu", []); /**语言转换*/ (0, _defineProperty2["default"])(this, "intlLanguage", void 0); /**路由数据*/ (0, _defineProperty2["default"])(this, "routers", []); /**处理权限后的菜单**/ (0, _defineProperty2["default"])(this, "checkAuthMenus", []); /**当前菜单对应的父级菜单*/ (0, _defineProperty2["default"])(this, "pathToParentMenus", new Map([])); /**是否进行权限校验*/ (0, _defineProperty2["default"])(this, "isCheckAuth", false); /**是否使用*/ (0, _defineProperty2["default"])(this, "isTOPLEFT", false); /**记录上次父级菜单*/ (0, _defineProperty2["default"])(this, "preParentPath", ''); /**记录上次菜单*/ (0, _defineProperty2["default"])(this, "prePath", ''); var store = ANTD_IS_STORAGE ? sessionStorage : localStorage; // 所有的 权限菜单 var auth_menus = store.getItem('authMenu'); if (auth_menus) { this.authMenus = JSON.parse(auth_menus); } else { this.authMenus = []; } this.routers = props.routers; this.intlLanguage = props.intlLanguage; this.isCheckAuth = props.isCheckAuth; this.isTOPLEFT = props.isTOPLEFT; if (this.isCheckAuth) { this.initAuth(this.routers); } else { this.checkAuthMenus = this.routers; } if (this.intlLanguage) { this.initLanguage(this.checkAuthMenus); } this.initFlat(this.checkAuthMenus); if (this.isTOPLEFT) { this.handelSiderMenu(this.checkAuthMenus); this.getTopMenus(this.checkAuthMenus); } /**默认 / 指定所有子集 */ this.childMenu.set('/', this.checkAuthMenus); } /**验证权限*/ return (0, _createClass2["default"])(HandleMenu, [{ key: "checkAuth", value: function checkAuth(path) { if (['/404', '/403', '/500', '/', '/welcome'].includes(path)) { return true; } var finx = this.authMenus.find(function (item) { return item === path; }); if (finx) { return true; } return false; } /** * 1. 权限处理 * 1. 子集全部没权限,父级也没有权限 * 2. 子集存在权限,父级也存在权限 * 3. 没有权限的自动把 path 转换成 403 * */ }, { key: "initAuth", value: function initAuth(routers) { var _this = this; var isParent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var child = []; routers.sort(function (it) { return Number(it.order || 0); }).forEach(function (item) { var routes = item.routes; var newItem = (0, _objectSpread2["default"])({}, item); if (Array.isArray(routes)) { newItem.routes = _this.initAuth(routes, true); } if (!isParent) { _this.checkAuthMenus.push((0, _objectSpread2["default"])({}, item)); } child.push(newItem); }); return child; } /** * 2. 国际化翻译 * */ }, { key: "initLanguage", value: function initLanguage() { var _this2 = this; var menus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.checkAuthMenus; var parentLocale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'menu'; menus.forEach(function (item) { var name = item.name, locale = item.locale, routes = item.routes; var parentLocales = parentLocale; if (name || locale) { var _this2$intlLanguage; var _locale = "".concat(parentLocale, ".").concat(item.locale || item.name); parentLocales = _locale; var localeName = (_this2$intlLanguage = _this2.intlLanguage) === null || _this2$intlLanguage === void 0 ? void 0 : _this2$intlLanguage.formatMessage({ id: _locale, defaultMessage: item.name || item.locale }); item.name = localeName; item.locale = localeName; } if (Array.isArray(routes)) { _this2.initLanguage(routes, parentLocales); } }); } /** * 3. 扁平化数据 */ }, { key: "initFlat", value: function initFlat() { var _this3 = this; var menus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.checkAuthMenus; var parentMenu = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; menus.forEach(function (item) { var routes = item.routes; var newparentMenu = (0, _toConsumableArray2["default"])(parentMenu).concat([item]); if (Array.isArray(routes)) { _this3.initFlat(routes, newparentMenu); } if (item.path) { _this3.flatAllMenu.push((0, _objectSpread2["default"])({}, item)); _this3.pathToParentMenus.set(item.path, newparentMenu); } if (item.path && !Array.isArray(routes)) { _this3.flatMenu.push((0, _objectSpread2["default"])({}, item)); } }); } /** * 4. 处理数据,用于顶部和侧边菜单展示联动 * */ }, { key: "handelSiderMenu", value: function handelSiderMenu() { var _this4 = this; var menus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.checkAuthMenus; var isSider = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var parentPath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '/'; menus.forEach(function (item) { var routes = item.routes, side = item.side, _item$path = item.path, path = _item$path === void 0 ? '' : _item$path; if (side) { if (Array.isArray(routes) && routes.length) { _this4.childMenu.set(path, routes); _this4.handelSiderMenu(routes, true, path); } _this4.childParent.set(path, parentPath); } else { if (Array.isArray(routes) && routes.length) { _this4.handelSiderMenu(routes); } } if (isSider) { _this4.childParent.set(path, parentPath); } else { _this4.childParent.set(path, path); } }); } /** * 5. 获取顶部渲染数据 * */ }, { key: "getTopMenus", value: function getTopMenus() { var _this5 = this; var menus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.checkAuthMenus; var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var topMenus = []; menus.forEach(function (item) { var side = item.side, path = item.path, routes = item.routes; var newItem = (0, _objectSpread2["default"])({}, item); if (Array.isArray(routes)) { newItem.routes = _this5.getTopMenus(routes, index + 1); } if (!side && path) { topMenus.push((0, _objectSpread2["default"])({}, newItem)); _this5.parentflatMenu.push((0, _objectSpread2["default"])({}, newItem)); } if (index === 0) { _this5.parentMenu.push((0, _objectSpread2["default"])({}, newItem)); } }); return topMenus; } /** * 6. 获取导航面包屑 * */ }, { key: "getBreadcrumb", value: function getBreadcrumb(path) { return this.pathToParentMenus.get(path) || []; } /**7. 根据当前路由地址取父级key,再使用父级key进行取渲染内容,如果不是顶部渲染方式,则直接默认*/ }, { key: "getSiderMenus", value: function getSiderMenus(path) { if (this.isTOPLEFT) { var siderMenus = this.childMenu.get(path); if (!siderMenus) { siderMenus = this.childMenu.get(this.getParentPath(path)); } return siderMenus || []; } return this.checkAuthMenus; } /**8. 获取父级path*/ }, { key: "getParentPath", value: function getParentPath(path) { var parentPath = this.childParent.get(path) || '/'; return parentPath; } // 查询所有父节点和自己是否有权限 }, { key: "getCheckAuthAll", value: function getCheckAuthAll(path) { var node = this.flatAllMenu.find(function (item) { return item.path === path; }); if (!node) { return false; } var pathList = []; var currentNode = node; while (currentNode) { pathList.push(currentNode.path || ''); currentNode = this.flatAllMenu.find(function (item) { var _currentNode; return item.id === ((_currentNode = currentNode) === null || _currentNode === void 0 ? void 0 : _currentNode.parentId); }); } var hasPermission = true; // 假设有权限 // 从最上层父节点开始逐一判断权限 for (var i = pathList.length - 1; i >= 0; i--) { var p = pathList[i]; if (!this.checkAuth(p)) { hasPermission = false; break; } } return hasPermission; } /**9. 获取跳转地址*/ }, { key: "getToPath", value: function getToPath(path) { var _currentItem, _currentItem2, _currentItem3; var _matchRoutes = (0, _max.matchRoutes)(this.flatAllMenu, path), _matchRoutes2 = (0, _slicedToArray2["default"])(_matchRoutes, 1), currentItem = _matchRoutes2[0]; if (currentItem && currentItem.route) { currentItem = currentItem.route; } // 1. 先判断是不是 side === true // const currentItem = this.flatAllMenu.find((item) => item.path === path); if (((_currentItem = currentItem) === null || _currentItem === void 0 ? void 0 : _currentItem.path) === '/') { this.preParentPath = ''; this.prePath = currentItem.redirectTo; return currentItem.redirectTo; } if (!currentItem) { this.preParentPath = ''; if (this.prePath === '/404') { return false; } this.prePath = '/404'; return '/404'; } // 查询所有父节点和自己是否有权限 if (!!ANTD_AUTH_CONF && !this.getCheckAuthAll(((_currentItem2 = currentItem) === null || _currentItem2 === void 0 ? void 0 : _currentItem2.path) || '')) { this.prePath = '/403'; this.preParentPath = ''; return '/403'; } if (!((_currentItem3 = currentItem) !== null && _currentItem3 !== void 0 && _currentItem3.side)) { this.prePath = currentItem.path || ''; this.preParentPath = ''; return false; } if (this.preParentPath === currentItem.path) { this.prePath = currentItem.path; return false; } this.preParentPath = currentItem.path; var siderMenus = this.childMenu.get(path); var findx = siderMenus === null || siderMenus === void 0 ? void 0 : siderMenus.find(function (item) { return item.index || item.redirectTo; }); var current = (findx === null || findx === void 0 ? void 0 : findx.path) || (findx === null || findx === void 0 ? void 0 : findx.redirectTo); if (this.prePath === current) { return false; } this.prePath = current; return current; } /**10 更加path地址获取当前配置数据*/ }, { key: "getPathItem", value: function getPathItem(path) { var currentItem = this.flatAllMenu.find(function (item) { return item.path === path; }); return currentItem; } }]); }(); function isUrl(path) { /* eslint no-useless-escape:0 */ return /(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/.test(path); } // Allow menu.js config icon as string or ReactNode // icon: 'setting', // icon: 'icon-geren' #For Iconfont , // icon: 'http://demo.com/icon.png', // icon: <Icon type="setting" />, function getIcon(icon) { if (typeof icon === 'string') { if (isUrl(icon)) { return /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons["default"], { component: function component() { return /*#__PURE__*/(0, _jsxRuntime.jsx)("img", { src: icon, alt: "icon" }); } }); } return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {}); } return icon; } /**获取菜单渲染**/ var getSiderMenus = exports.getSiderMenus = function getSiderMenus() { var menus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var isSider = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var _loop = function loop() { var menus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var parentSider = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; return menus.filter(function (items) { if (items.hideInMenu || !items.name || isSider && parentSider) { return false; } return true; }).map(function (item) { var path = item.path, icon = item.icon, name = item.name, routes = item.routes; var ite = {}; if (icon) { ite.icon = getIcon(icon); } if (name) { ite.label = name; ite.title = name; } if (routes && routes.length && (!item.side || !isSider)) { ite.children = _loop(routes, item.side); } else if (path && name) { ite.label = /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactRouterDom.NavLink, { to: path, children: name }); } ite.key = path; return ite; }); }; return _loop(menus); }; var defaultThemeColors = exports.defaultThemeColors = function defaultThemeColors(layout) { if (layout === 'slider') { return { light: { '--primary-slider-bg': 'rgb(36, 37, 37)', '--primary-header-bg': '#fff', '--primary-shadow': 'rgba(29,35,41,.05)', '--primary-slider-trigger-border': '#fff', '--primary-sider-trigger-text-color': '#fff', '--primary-header-text-color': 'rgb(36, 37, 37)', '--primary-title-text-color': '#fff', '--primary-content-bg': '#f5f5f5', 'itemSelectedBg': 'rgb(24, 144, 255)', 'colorItemBgSelected': '#fff', 'itemActiveBg': '#fff', 'horizontalItemSelectedBg': '#fff', 'itemColor': 'rgba(229, 224, 216, 0.85)', 'itemHoverColor': 'rgba(229, 224, 216, 0.85)', 'itemSelectedColor': '#fff', 'colorBgElevated': 'rgba(229, 224, 216, 0.85)' }, dark: { '--primary-slider-bg': 'rgb(36, 37, 37)', '--primary-header-bg': 'rgb(36, 37, 37)', '--primary-shadow': 'rgba(13, 13, 13, 0.65)', '--primary-slider-trigger-border': '#fff', '--primary-sider-trigger-text-color': '#fff', '--primary-header-text-color': '#fff', '--primary-title-text-color': '#fff', '--primary-content-bg': '#1d1d1d', 'itemSelectedBg': 'rgb(24, 144, 255)', 'colorItemBgSelected': '#fff', 'itemActiveBg': '#fff', 'horizontalItemSelectedBg': '#fff', 'itemColor': 'rgba(229, 224, 216, 0.85)', 'itemHoverColor': 'rgba(229, 224, 216, 0.85)', 'itemSelectedColor': '#fff', 'colorBgElevated': 'rgba(229, 224, 216, 0.85)' } }; } if (layout === 'topleft') { return { light: { '--primary-slider-bg': '#fff', '--primary-header-bg': '#fff', '--primary-shadow': 'rgba(0,21,41,.12)', '--primary-slider-trigger-border': 'rgba(0,0,0,.06)', '--primary-sider-trigger-text-color': '#1d1d1d', '--primary-header-text-color': '#1d1d1d', '--primary-title-text-color': '#1d1d1d', '--primary-content-bg': '#f5f5f5', 'itemSelectedBg': '#e6f7ff', 'colorItemBgSelected': 'rgba(0, 0, 0, 0.06)', 'itemActiveBg': '#e6f7ff', 'horizontalItemSelectedBg': 'rgba(0, 0, 0, 0.06)', 'itemColor': 'rgba(0, 0, 0, 0.65)', 'itemHoverColor': 'rgba(0, 0, 0, 0.85)', 'itemSelectedColor': 'rgb(24, 144, 255)', 'colorBgElevated': '#fff' }, dark: { '--primary-slider-bg': 'rgb(36, 37, 37)', '--primary-header-bg': 'rgb(36, 37, 37)', '--primary-shadow': 'rgba(13, 13, 13, 0.65)', '--primary-slider-trigger-border': '#fff', '--primary-sider-trigger-text-color': '#fff', '--primary-header-text-color': '#fff', '--primary-title-text-color': '#fff', '--primary-content-bg': '#1d1d1d', 'itemSelectedBg': 'rgb(24, 144, 255)', 'colorItemBgSelected': 'rgb(36, 37, 37)', 'itemActiveBg': '#fff', 'horizontalItemSelectedBg': 'rgb(36, 37, 37)', 'itemColor': 'rgba(229, 224, 216, 0.85)', 'itemHoverColor': 'rgba(229, 224, 216, 0.85)', 'itemSelectedColor': '#fff', 'colorBgElevated': 'rgba(229, 224, 216, 0.85)' } }; } if (layout === 'mix') { return { light: { '--primary-slider-bg': '#fff', '--primary-header-bg': 'rgb(36, 37, 37)', '--primary-shadow': 'rgba(0,21,41,.08)', '--primary-slider-trigger-border': 'rgba(0,0,0,.06)', '--primary-sider-trigger-text-color': 'rgb(36, 37, 37)', '--primary-header-text-color': '#fff', '--primary-title-text-color': '#fff', '--primary-content-bg': '#f5f5f5', 'itemSelectedBg': '#e6f7ff', 'colorItemBgSelected': 'rgba(0, 0, 0, 0.06)', 'itemActiveBg': '#e6f7ff', 'horizontalItemSelectedBg': 'rgba(0, 0, 0, 0.06)', 'itemColor': 'rgba(0, 0, 0, 0.65)', 'itemHoverColor': 'rgba(0, 0, 0, 0.85)', 'itemSelectedColor': 'rgb(24, 144, 255)', 'colorBgElevated': '#fff' }, dark: { '--primary-slider-bg': 'rgb(36, 37, 37)', '--primary-header-bg': 'rgb(15, 28, 41)', '--primary-shadow': 'rgba(13, 13, 13, 0.65)', '--primary-slider-trigger-border': '#fff', '--primary-sider-trigger-text-color': '#fff', '--primary-header-text-color': '#fff', '--primary-title-text-color': '#fff', '--primary-content-bg': '#1d1d1d', 'itemSelectedBg': 'rgb(24, 144, 255)', 'colorItemBgSelected': '#fff', 'itemActiveBg': '#fff', 'horizontalItemSelectedBg': '#fff', 'itemColor': 'rgba(229, 224, 216, 0.85)', 'itemHoverColor': 'rgba(229, 224, 216, 0.85)', 'itemSelectedColor': '#fff', 'colorBgElevated': 'rgba(229, 224, 216, 0.85)' } }; } };