import CryptoJS from "crypto-js"; // 递归获取底层子数组 export function findBottomSubarrays(arr) { let bottomSubarrays = []; function recursiveSearch(subArr) { for (let item of subArr) { if (item.children && item.children.length) { recursiveSearch(item.children); } else { bottomSubarrays.push(...subArr); break; } } } recursiveSearch(arr); return bottomSubarrays; } // 加密数据 export let encrypt = (str, keyStr, ivStr) => { keyStr = keyStr ? keyStr : "0000000671595991"; ivStr = ivStr ? ivStr : "tdrdadq59tbss5n7"; //密钥16位 let key = CryptoJS.enc.Utf8.parse(keyStr); //加密向量16位 let iv = CryptoJS.enc.Utf8.parse(ivStr); let encrypted = CryptoJS.AES.encrypt(str, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, }); return encrypted.toString(); }; // 解密 export const decrypt = (word, keyStr, ivStr) => { keyStr = keyStr ? keyStr : "0000000671595991"; ivStr = ivStr ? ivStr : "tdrdadq59tbss5n7"; let key = CryptoJS.enc.Utf8.parse(keyStr); let iv = CryptoJS.enc.Utf8.parse(ivStr); let decrypt = CryptoJS.AES.decrypt(word, key, { iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, }); return decrypt.toString(CryptoJS.enc.Utf8); }; /** * 加密存储临时数据并解析对象 */ const aseKey = "**_FXxx_1234_KEY"; const KEY = "KEY_EXTRA"; export class SessionCrypto { // 加密 static setItem(key = KEY, value = "") { if (typeof key === "string") { const stringify = JSON.stringify(value); const encrypt = CryptoJS.AES.encrypt( stringify, CryptoJS.enc.Utf8.parse(aseKey), { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7, } ).toString(); window.sessionStorage.setItem(key, encrypt); return encrypt; } } // 解密 static getItem(key = KEY) { const ssStr = window.sessionStorage.getItem(key) || ""; try { if (ssStr) { const decrypt = CryptoJS.AES.decrypt( ssStr, CryptoJS.enc.Utf8.parse(aseKey), { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7, } ).toString(CryptoJS.enc.Utf8); const parseStr = JSON.parse(decrypt); return parseStr; } return ""; } catch (e) { return ""; } } // 删除 static remove(key) { window.sessionStorage.removeItem(key); } } // 表单重置 export function resetForm(refName) { if (this.$refs[refName]) { this.$refs[refName].resetFields(); } } // 表格清除选中 export function clearSelection(refName) { if (this.$refs[refName]) { this.$refs[refName].clearSelection(); } } // 构建树形数据 export function buildTree(data, idField = "id", parentIdField = "parentId") { const idToItem = {}; data.forEach((item) => { idToItem[item[idField]] = { ...item, childList: [] }; }); const tree = []; data.forEach((item) => { const parentId = item[parentIdField]; if (parentId === null || parentId === 0) { tree.push(idToItem[item[idField]]); } else { const parent = idToItem[parentId]; if (parent) { parent.childList.push(idToItem[item[idField]]); } else { tree.push(idToItem[item[idField]]); } } }); return tree; } // 生成路由 export const generateRoutes = (menuList) => { let routers = menuList.map((item) => { // 构造符合要求的结构 let path = item.url.charAt(0) === "/" ? item.url : "/" + item.url; let name = item.url.replace(/^\//, ""); let activeMenu = item.activeDir ? "/" + item.activeDir.replace(/^\//, "") : ""; let component = item.component ? item.component.replace(/^\//, "") : null; const newItem = { path, name, hidden: !!item.visible, hideChildrenInMenu: !!item.hideChildrenInMenu, component: () => import(`@/${component}`), meta: { title: item.name, icon: item.imgPath, keepAlive: !!item.cache, activeMenu, }, }; // 递归处理子节点 if (item.children && item.children.length > 0) { newItem.children = generateRoutes(item.children); // 如果存在子路由,默认重定向到第一个不是在菜单栏隐藏的子路由 let firstChild = newItem.children.find((v) => !v.hidden); if (firstChild) { newItem.redirect = firstChild.path; } } return newItem; }); return routers; }; /** * 过滤菜单按钮项并提取 menuType = 2 的项 * @param {Array} menuList - 菜单列表 * @param {Boolean} menuType - true 获取 menuType = 2 的项并返回为一维数组, false 剔除 menuType = 2 的项 * @param {Array} btnItems - 用于存储 menuType = 2 的项(递归使用) * @returns {Array} - 返回提取到的 menuType = 2 的项(如果 menuType 为 true)或剔除 menuType = 2 的菜单 */ export const filterBtn = (menuList, menuType = true, btnItems = []) => { const result = menuList .map((menu) => { // 深拷贝对象,避免修改原数据 const newMenu = { ...menu }; if (newMenu.children && newMenu.children.length > 0) { newMenu.children = filterBtn(newMenu.children, menuType, btnItems); } const btnItem = newMenu.menuType == 2; if (menuType) { if (btnItem) { btnItems.push(newMenu); } return newMenu; } else { // 剔除 menuType = 2 的项 return !btnItem ? newMenu : null; } }) .filter((menu) => menu !== null); // 过滤掉 null 项 return menuType ? btnItems : result; };