@liuit/core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +26 -0
  2. package/dist/aop/AopUtil.d.ts +26 -0
  3. package/dist/aop/ClassUtil.d.ts +39 -0
  4. package/dist/aop/MethodHandler.d.ts +33 -0
  5. package/dist/aop/TestAopUtil.d.ts +5 -0
  6. package/dist/common/Constant.d.ts +8 -0
  7. package/dist/common/adapter/StorageApi.d.ts +48 -0
  8. package/dist/common/auto/AutoSize.d.ts +56 -0
  9. package/dist/common/enums/index.d.ts +25 -0
  10. package/dist/common/index.d.ts +20 -0
  11. package/dist/common/utils/AssertUtil.d.ts +17 -0
  12. package/dist/common/utils/BrowserUtil.d.ts +11 -0
  13. package/dist/common/utils/CommonTreeUtil.d.ts +20 -0
  14. package/dist/common/utils/CommonUtil.d.ts +200 -0
  15. package/dist/common/utils/ConfigUtil.d.ts +13 -0
  16. package/dist/common/utils/CookieUtil.d.ts +50 -0
  17. package/dist/common/utils/DateUtil.d.ts +50 -0
  18. package/dist/common/utils/EnumUtil.d.ts +101 -0
  19. package/dist/common/utils/EventBus.d.ts +22 -0
  20. package/dist/common/utils/FileUtil.d.ts +64 -0
  21. package/dist/common/utils/OssUtil.d.ts +29 -0
  22. package/dist/common/utils/ProxyUtil.d.ts +27 -0
  23. package/dist/common/utils/RegexUtil.d.ts +67 -0
  24. package/dist/common/utils/StorageUtil.d.ts +46 -0
  25. package/dist/common/utils/UrlUtil.d.ts +53 -0
  26. package/dist/common/utils/ZeroUtil.d.ts +68 -0
  27. package/dist/index.cjs.js +1 -0
  28. package/dist/index.d.ts +13 -0
  29. package/dist/index.esm.js +2 -0
  30. package/dist/index.esm.js.map +1 -0
  31. package/dist/index.umd.js +1 -0
  32. package/dist/ioc/common/Container.d.ts +100 -0
  33. package/dist/ioc/common/IocContext.d.ts +61 -0
  34. package/dist/ioc/decorators/index.d.ts +19 -0
  35. package/dist/ioc/index.d.ts +11 -0
  36. package/dist/ioc/model/Meta.d.ts +51 -0
  37. package/dist/ioc/util/IocDecoratorUtil.d.ts +23 -0
  38. package/dist/ioc/util/IocUtil.d.ts +30 -0
  39. package/dist/logger/index.d.ts +117 -0
  40. package/dist/model/CommonMenuTree.d.ts +28 -0
  41. package/dist/model/CommonTree.d.ts +21 -0
  42. package/dist/model/DictDto.d.ts +41 -0
  43. package/dist/security/encrypt/AesUtil.d.ts +36 -0
  44. package/dist/security/encrypt/DesUtil.d.ts +38 -0
  45. package/dist/security/encrypt/Rc4Util.d.ts +24 -0
  46. package/dist/security/encrypt/RsaUtil.d.ts +94 -0
  47. package/dist/security/encrypt/RsaUtilPlus.d.ts +75 -0
  48. package/dist/security/encrypt/Sm2Util.d.ts +81 -0
  49. package/dist/security/encrypt/Sm4Util.d.ts +30 -0
  50. package/dist/security/hash/HashUtil.d.ts +23 -0
  51. package/dist/security/index.d.ts +18 -0
  52. package/dist/security/model/index.d.ts +31 -0
  53. package/dist/security/test/TestRsaUtil.d.ts +8 -0
  54. package/dist/security/test/TestRsaUtilPlus.d.ts +8 -0
  55. package/dist/security/test/TestSm2Enc.d.ts +1 -0
  56. package/dist/security/test/TestSm2Encrypt.d.ts +6 -0
  57. package/dist/security/test/TestSm2Util.d.ts +8 -0
  58. package/dist/security/test/TestSm4Util.d.ts +8 -0
  59. package/dist/security/test/TestSmExchange.d.ts +8 -0
  60. package/dist/utils/CryptoWebUtil.d.ts +21 -0
  61. package/dist/utils/TestPwd.d.ts +3 -0
  62. package/dist/validator/ValidatorUtil.d.ts +7 -0
  63. package/package.json +86 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../src/common/utils/AssertUtil.ts","../src/common/utils/DateUtil.ts","../src/common/utils/StorageUtil.ts","../src/common/utils/EnumUtil.ts","../src/common/utils/CommonUtil.ts","../src/common/utils/CookieUtil.ts","../src/common/utils/EventBus.ts","../src/common/utils/FileUtil.ts","../src/common/utils/OssUtil.ts","../src/common/utils/UrlUtil.ts","../src/common/utils/ZeroUtil.ts","../src/model/CommonTree.ts","../src/common/utils/CommonTreeUtil.ts","../src/common/utils/ConfigUtil.ts","../src/common/utils/RegexUtil.ts","../src/common/auto/AutoSize.ts","../src/common/utils/BrowserUtil.ts","../src/common/enums/index.ts","../src/ioc/model/Meta.ts","../src/aop/AopUtil.ts","../src/aop/ClassUtil.ts","../src/model/CommonMenuTree.ts","../src/model/DictDto.ts","../src/ioc/util/IocUtil.ts","../src/ioc/common/Container.ts","../src/ioc/common/IocContext.ts","../src/ioc/util/IocDecoratorUtil.ts","../src/ioc/decorators/index.ts","../src/logger/index.ts","../src/security/encrypt/AesUtil.ts","../src/security/encrypt/DesUtil.ts","../src/security/encrypt/Rc4Util.ts","../src/security/model/index.ts","../src/security/encrypt/RsaUtil.ts","../src/security/encrypt/RsaUtilPlus.ts","../src/security/encrypt/Sm2Util.ts","../src/security/encrypt/Sm4Util.ts","../src/security/hash/HashUtil.ts"],"sourcesContent":["/**\r\n *@desc\r\n *@author liudejian\r\n *@date 2020-06-12 10:11\r\n **/\r\nexport class AssertUtil {\r\n\r\n /**\r\n * 不能为空判断\r\n * @param obj\r\n */\r\n public static notNull(obj: any, message?: string): any {\r\n if (obj === null || obj === undefined || obj === \"\") {\r\n throw new Error(message ? message : \"对象不能为空\");\r\n }\r\n return obj;\r\n }\r\n\r\n /**\r\n * 包装空对象\r\n * @param obj\r\n */\r\n public static wrapNull(obj: any): any {\r\n if (obj === null || obj === undefined || obj === \"\") {\r\n return null;\r\n }\r\n return obj;\r\n }\r\n\r\n\r\n}\r\n","/**\r\n *@desc 日期工具类\r\n *@author liudejian\r\n *@date 2020-01-13 17:47\r\n **/\r\nexport class DateUtil {\r\n /**\r\n * 时间格式化\r\n * @param time 后台时间长整型/date\r\n * @param fmt 时间格式 yyyy-MM-dd hh:mm:ss\r\n * @returns {*}\r\n */\r\n public static dateFormat(time: Date | number, fmt ?: string): string {\r\n if (time === null || time == undefined) {\r\n return ''\r\n }\r\n if (fmt == undefined) {\r\n fmt = 'yyyy-MM-dd hh:mm:ss'\r\n }\r\n let date = null\r\n\r\n if (typeof time == 'object') {\r\n date = time\r\n } else if (typeof time == 'number') {\r\n date = new Date(time)\r\n } else {\r\n return time\r\n }\r\n\r\n if (/(y+)/.test(fmt)) {\r\n fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))\r\n }\r\n const o = {\r\n 'M+': date.getMonth() + 1,\r\n 'd+': date.getDate(),\r\n 'h+': date.getHours(),\r\n 'm+': date.getMinutes(),\r\n 's+': date.getSeconds()\r\n }\r\n\r\n // 遍历这个对象\r\n for (const k in o) {\r\n if (new RegExp(`(${k})`).test(fmt)) {\r\n // console.log(`${k}`)\r\n // console.log(RegExp.$1)\r\n // @ts-ignore\r\n const str = o[k] + ''\r\n fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : (('00' + str).substr(str.length)))\r\n }\r\n }\r\n return fmt\r\n }\r\n\r\n\r\n /*\r\n * 年(Y) 可用1-4个占位符\r\n * 月(m)、日(d)、小时(H)、分(M)、秒(S) 可用1-2个占位符\r\n * 星期(W) 可用1-3个占位符\r\n * 季度(q为阿拉伯数字,Q为中文数字)可用1或4个占位符\r\n *\r\n * let date = new Date()\r\n * formatDate(date, \"YYYY-mm-dd HH:MM:SS\") // 2020-02-09 14:04:23\r\n * formatDate(date, \"YYYY-mm-dd HH:MM:SS Q\") // 2020-02-09 14:09:03 一\r\n * formatDate(date, \"YYYY-mm-dd HH:MM:SS WWW\") // 2020-02-09 14:45:12 星期日\r\n * formatDate(date, \"YYYY-mm-dd HH:MM:SS QQQQ\") // 2020-02-09 14:09:36 第一季度\r\n * formatDate(date, \"YYYY-mm-dd HH:MM:SS WWW QQQQ\") // 2020-02-09 14:46:12 星期日 第一季度\r\n */\r\n public static formatDate(date: Date, format: string = 'YYYY-mm-dd HH:MM:SS'): string {\r\n let we = date.getDay(); // 星期\r\n let qut = Math.floor((date.getMonth() + 3) / 3).toString(); // 季度\r\n const opt: any = {\r\n 'Y+': date.getFullYear().toString(), // 年\r\n 'm+': (date.getMonth() + 1).toString(), // 月(月份从0开始,要+1)\r\n 'd+': date.getDate().toString(), // 日\r\n 'H+': date.getHours().toString(), // 时\r\n 'M+': date.getMinutes().toString(), // 分\r\n 'S+': date.getSeconds().toString(), // 秒\r\n 'q+': qut, // 季度\r\n };\r\n // 中文数字 (星期)\r\n const week: any = {\r\n '0': '日',\r\n '1': '一',\r\n '2': '二',\r\n '3': '三',\r\n '4': '四',\r\n '5': '五',\r\n '6': '六',\r\n };\r\n // 中文数字(季度)\r\n const quarter: any = {\r\n '1': '一',\r\n '2': '二',\r\n '3': '三',\r\n '4': '四',\r\n };\r\n if (/(W+)/.test(format))\r\n format = format.replace(RegExp.$1, RegExp.$1.length > 1 ? (RegExp.$1.length > 2 ? '星期' + week[we] : '周' + week[we]) : week[we]);\r\n if (/(Q+)/.test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 4 ? '第' + quarter[qut] + '季度' : quarter[qut]);\r\n for (let k in opt) {\r\n let r = new RegExp('(' + k + ')').exec(format);\r\n // 若输入的长度不为1,则前面补零\r\n if (r) format = format.replace(r[1], RegExp.$1.length == 1 ? opt[k] : opt[k].padStart(RegExp.$1.length, '0'));\r\n }\r\n return format;\r\n }\r\n\r\n /**\r\n * 10秒: 10 * 1000\r\n * 1分: 60 * 1000\r\n * 1小时: 60 * 60 * 1000\r\n * 24小时:60 * 60 * 24 * 1000\r\n * 3天: 60 * 60* 24 * 1000 * 3\r\n *\r\n * let data = new Date()\r\n * formatPast(data) // 刚刚\r\n * formatPast(data - 11 * 1000) // 11秒前\r\n * formatPast(data - 2 * 60 * 1000) // 2分钟前\r\n * formatPast(data - 60 * 60 * 2 * 1000) // 2小时前\r\n * formatPast(data - 60 * 60 * 2 * 1000) // 2小时前\r\n * formatPast(data - 60 * 60 * 71 * 1000) // 2天前\r\n * formatPast(\"2020-06-01\") // 2020-06-01\r\n * formatPast(\"2020-06-01\", \"YYYY-mm-dd HH:MM:SS WWW QQQQ\") // 2020-06-01 08:00:00 星期一 第二季度\r\n */\r\n public static formatPast(param: any, format: string = 'YYYY-mm-dd') {\r\n // 传入格式处理、存储转换值\r\n let t: any, s: any;\r\n // 获取js 时间戳\r\n let time: any = new Date().getTime();\r\n // 是否是对象\r\n typeof param === 'string' || 'object' ? (t = new Date(param).getTime()) : (t = param);\r\n // 当前时间戳 - 传入时间戳\r\n time = Number.parseInt(`${time - t}`);\r\n if (time < 10000) {\r\n // 10秒内\r\n return '刚刚';\r\n } else if (time < 60000 && time >= 10000) {\r\n // 超过10秒少于1分钟内\r\n s = Math.floor(time / 1000);\r\n return `${s}秒前`;\r\n } else if (time < 3600000 && time >= 60000) {\r\n // 超过1分钟少于1小时\r\n s = Math.floor(time / 60000);\r\n return `${s}分钟前`;\r\n } else if (time < 86400000 && time >= 3600000) {\r\n // 超过1小时少于24小时\r\n s = Math.floor(time / 3600000);\r\n return `${s}小时前`;\r\n } else if (time < 259200000 && time >= 86400000) {\r\n // 超过1天少于3天内\r\n s = Math.floor(time / 86400000);\r\n return `${s}天前`;\r\n } else {\r\n // 超过3天\r\n let date = typeof param === 'string' || 'object' ? new Date(param) : param;\r\n return DateUtil.formatDate(date, format);\r\n }\r\n }\r\n\r\n /**\r\n * formatAxis(new Date()) // 上午好\r\n */\r\n public static formatAxis(param: any): string {\r\n let hour: number = new Date(param).getHours();\r\n if (hour < 6) return '凌晨好';\r\n else if (hour < 9) return '早上好';\r\n else if (hour < 12) return '上午好';\r\n else if (hour < 14) return '中午好';\r\n else if (hour < 17) return '下午好';\r\n else if (hour < 19) return '傍晚好';\r\n else if (hour < 22) return '晚上好';\r\n else return '夜里好';\r\n }\r\n\r\n /**\r\n * 获取当前月第一天\r\n */\r\n public static getMonthFirstDay(): Date {\r\n let now = new Date(); //当前日期\r\n let nowMonth = now.getMonth(); //当前月\r\n let nowYear = now.getFullYear(); //当前年\r\n return new Date(nowYear, nowMonth, 1);\r\n }\r\n\r\n /**\r\n * 获取当前月最后一天\r\n */\r\n public static getMonthLastDay(): Date {\r\n let now = new Date(); //当前日期\r\n let nowMonth = now.getMonth(); //当前月\r\n let nowYear = now.getFullYear(); //当前年\r\n //本月的结束时间\r\n return new Date(nowYear, nowMonth + 1, 0);\r\n }\r\n\r\n\r\n /**\r\n * 将时间秒转为HH:MM:SS\r\n * @param second 时间秒\r\n */\r\n public static formatSecondToHms(second: any): string {\r\n if (second == null || second == \"\") {\r\n return \"00:00:00\";\r\n }\r\n let secondInt = parseInt(second);\r\n let hours = Math.round((secondInt - 30 * 60) / (60 * 60));\r\n let minutes = Math.round((secondInt - 30) / 60) % 60;\r\n let seconds = secondInt % 60;\r\n return (hours > 9 ? (hours) : \"0\"+hours) +\":\"+ (minutes > 9 ? (minutes) : \"0\"+minutes) +\":\"+ (seconds > 9 ? (seconds +\"\") : \"0\"+seconds);\r\n\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n","import {StorageApi} from \"/@/common/adapter/StorageApi\";\r\n\r\n/**\r\n * 本地存储工具\r\n * @desc\r\n * @author liudejian\r\n * @date 2020-03-26 17:54\r\n */\r\nexport class StorageUtil {\r\n\r\n public static storageApi: StorageApi;\r\n\r\n public static setStorageApi(storageApi: StorageApi): void {\r\n StorageUtil.storageApi = storageApi\r\n }\r\n\r\n public static isObject(object: any): boolean {\r\n return Object.prototype.toString.apply(object) == '[object Object]';\r\n }\r\n\r\n /**\r\n * 返回所有localStorage中的keys\r\n */\r\n public static getLocalStorageKeys(): Array<string> {\r\n if (StorageUtil.storageApi) {\r\n return StorageUtil.storageApi.getLocalStorageKeys();\r\n } else {\r\n const len = localStorage.length;\r\n const keys = new Array<string>();\r\n for (let i = 0; i < len; i++) {\r\n keys.push(localStorage.key(i) as string);\r\n }\r\n return keys;\r\n }\r\n }\r\n\r\n /**\r\n * 返回sessionStorage中所有key\r\n */\r\n public static getSessionStorageKeys(): Array<string> {\r\n if (StorageUtil.storageApi) {\r\n return StorageUtil.storageApi.getSessionStorageKeys();\r\n } else {\r\n const len = sessionStorage.length;\r\n const keys = new Array<string>();\r\n for (let i = 0; i < len; i++) {\r\n keys.push(sessionStorage.key(i) as string);\r\n }\r\n return keys;\r\n }\r\n\r\n }\r\n\r\n /**\r\n * session存储\r\n * @param key\r\n * @param value\r\n */\r\n public static setSessionStorage(key: string, value: any): void {\r\n if (StorageUtil.storageApi) {\r\n StorageUtil.storageApi.setSessionStorage(key, value);\r\n } else {\r\n if (StorageUtil.isObject(value)) {\r\n window.sessionStorage.setItem(key, JSON.stringify(value))\r\n } else {\r\n window.sessionStorage.setItem(key, value)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * session获取\r\n * @param key\r\n */\r\n public static getSessionStorage(key: string): any {\r\n if (StorageUtil.storageApi) {\r\n return StorageUtil.storageApi.getSessionStorage(key);\r\n } else {\r\n let value = window.sessionStorage.getItem(key) || \"\";\r\n try {\r\n if (value.startsWith(\"{\")) {\r\n return JSON.parse(value);\r\n }\r\n } catch (e) {\r\n value = \"\";\r\n console.error(e);\r\n }\r\n if (value == undefined || value == 'undefined' || value == 'null' || value == null) {\r\n value = \"\";\r\n }\r\n return value;\r\n }\r\n\r\n }\r\n\r\n public static removeSessionStorage(key: string): void {\r\n if (StorageUtil.storageApi) {\r\n StorageUtil.storageApi.removeSessionStorage(key);\r\n } else {\r\n window.sessionStorage.removeItem(key);\r\n }\r\n }\r\n\r\n public static clearSessionStorage(): void {\r\n if (StorageUtil.storageApi) {\r\n StorageUtil.storageApi.clearSessionStorage();\r\n } else {\r\n window.sessionStorage.clear();\r\n }\r\n }\r\n\r\n /**\r\n * session存储\r\n * @param key\r\n * @param value\r\n */\r\n public static setLocalStorage(key: string, value: any): void {\r\n if (StorageUtil.storageApi) {\r\n StorageUtil.storageApi.setLocalStorage(key, value);\r\n } else {\r\n if (StorageUtil.isObject(value)) {\r\n localStorage.setItem(key, JSON.stringify(value))\r\n } else {\r\n localStorage.setItem(key, value)\r\n }\r\n }\r\n\r\n }\r\n\r\n /**\r\n * session获取\r\n * @param key\r\n */\r\n public static getLocalStorage(key: string): any {\r\n if (StorageUtil.storageApi) {\r\n return StorageUtil.storageApi.getLocalStorage(key);\r\n } else {\r\n let value = window.localStorage.getItem(key) || \"\";\r\n try {\r\n if (value.startsWith(\"{\")) {\r\n return JSON.parse(value);\r\n }\r\n\r\n } catch (e) {\r\n value = \"\";\r\n console.error(e)\r\n }\r\n if (value == undefined || value == 'undefined' || value == 'null' || value == null) {\r\n value = \"\";\r\n }\r\n return value;\r\n }\r\n\r\n }\r\n\r\n public static removeLocalStorage(key: string): void {\r\n if (StorageUtil.storageApi) {\r\n StorageUtil.storageApi.removeLocalStorage(key);\r\n } else {\r\n window.localStorage.removeItem(key);\r\n }\r\n\r\n }\r\n\r\n public static clearLocalStorage(): void {\r\n if (StorageUtil.storageApi) {\r\n StorageUtil.storageApi.clearLocalStorage();\r\n } else {\r\n window.localStorage.clear();\r\n }\r\n }\r\n\r\n\r\n}\r\n","\r\nimport {DictDto} from \"../../model/DictDto\";\r\nimport {StorageUtil} from \"./StorageUtil\";\r\n\r\n\r\n//const GLOBAL_APP_ENUMS: Map<string, Map<string, Array<any>>> = new Map<string, Map<string, Array<any>>>();\r\n\r\n/**\r\n *@desc 后台枚举工具\r\n *@author liudejian\r\n *@date 2020-01-13 17:47\r\n **/\r\n\r\n/**\r\n * 枚举工具类\r\n */\r\nexport class EnumUtil {\r\n\r\n private static CACHE_ENUMS_KEY = \"dj_enums\";\r\n\r\n public static readonly GLOBAL_APP_ENUMS = new Map<string, Map<string, Array<any>>>();\r\n\r\n public static cacheEnums(enums: Array<DictDto>): boolean {\r\n StorageUtil.setLocalStorage(EnumUtil.CACHE_ENUMS_KEY, JSON.stringify(enums));\r\n return true;\r\n }\r\n\r\n public static getCacheEnums(): Array<DictDto> {\r\n let enumsJson = StorageUtil.getLocalStorage(EnumUtil.CACHE_ENUMS_KEY);\r\n if (enumsJson != null && enumsJson != undefined && enumsJson != \"\") {\r\n return JSON.parse(enumsJson);\r\n }\r\n return new Array<DictDto>();\r\n }\r\n\r\n /**\r\n * 清空枚举\r\n * @constructor\r\n */\r\n public static ClearEnum(): boolean {\r\n EnumUtil.GLOBAL_APP_ENUMS.clear()\r\n StorageUtil.removeLocalStorage(EnumUtil.CACHE_ENUMS_KEY)\r\n return true;\r\n }\r\n\r\n /**\r\n * 返回枚举\r\n * @param appCode 应用编码\r\n * @param dictCode 字典code\r\n * @constructor\r\n */\r\n public static GetEnum(dictCode: string, appCode?: any): Array<any> | undefined {\r\n // console.log(\"dictCode===\", dictCode, appCode)\r\n if (appCode != null || appCode != undefined) {\r\n let appEnums = EnumUtil.GetEnums(appCode);\r\n if (appEnums != null && appEnums != undefined) {\r\n return appEnums.get(dictCode);\r\n }\r\n } else {\r\n //从全局里面去查询\r\n let appCodes = EnumUtil.GetAllAppCodes();\r\n for (let appCode of appCodes) {\r\n let appEnums = EnumUtil.GetEnums(appCode);\r\n if (appEnums != null && appEnums != undefined) {\r\n let dictDetails = appEnums.get(dictCode);\r\n if (dictDetails != undefined && dictDetails.length > 0) {\r\n return dictDetails;\r\n }\r\n }\r\n }\r\n }\r\n return new Array<any>();\r\n }\r\n\r\n\r\n /**\r\n * 用户所有应用编码\r\n * @constructor\r\n */\r\n public static GetAllAppCodes(): Array<string> {\r\n let keys = EnumUtil.GLOBAL_APP_ENUMS.keys();\r\n let next = keys.next();\r\n let arys: string[] = []\r\n while (!next.done) {\r\n arys.push(<string>next.value);\r\n next = keys.next();\r\n }\r\n return arys;\r\n }\r\n\r\n /**\r\n * 获取当前用户下所有 枚举\r\n * @param appCode 应用编码\r\n * @constructor\r\n */\r\n public static GetEnums(appCode: string) {\r\n let appEnums = EnumUtil.GLOBAL_APP_ENUMS.get(appCode);\r\n if (appEnums == null && appEnums == undefined) {\r\n appEnums = new Map<string, Array<any>>();\r\n }\r\n return appEnums;\r\n }\r\n\r\n /**\r\n * 向全局enums中添加值\r\n * @param appCode 应用编码\r\n * @param dictCode 字典code\r\n * @param datas 数据字典\r\n * @constructor\r\n */\r\n public static PutEnum(appCode: string, dictCode: string, datas: Array<any>): Map<string, Array<any>> {\r\n let appEnums = EnumUtil.GetEnums(appCode);\r\n if (appEnums == null || appEnums == undefined || appEnums.size == 0) {\r\n appEnums = new Map<string, Array<any>>();\r\n }\r\n appEnums.set(dictCode, datas);\r\n // console.log(appCode, \"===========\", appEnums)\r\n EnumUtil.GLOBAL_APP_ENUMS.set(appCode, appEnums);\r\n return appEnums;\r\n }\r\n\r\n\r\n /**\r\n * 根据编码获取对应的标签值\r\n * @param appCode 应用编号\r\n * @param dictCode 枚举字典编码\r\n * @param code 对应的枚举值编码\r\n * @param codeName\r\n * @param codeCnName\r\n */\r\n public static getEnumLabelByCode(appCode: string, dictCode: string, code: number, codeName ?: string, codeCnName ?: string): string {\r\n let appEnums = EnumUtil.GetEnums(appCode);\r\n let enums = appEnums.get(dictCode) || [];\r\n return this.getEnumLabel(enums, code, codeName, codeCnName);\r\n }\r\n\r\n /**\r\n * @param enumAlls 枚举集合[AppCode:[{codeCn: \"用户系统\", code: 1, ordianl: 0, codeEn: \"UC\"},{codeCn: \"代理系统\", code: 2, ordianl: 1, codeEn: \"PROXY\"}]]\r\n * @param enumName 枚举名称 AppCode\r\n * @param key 比如: code\r\n * @param keyValue 比如:1\r\n * @param keyCnName 比如:codeCn\r\n */\r\n public static getEnumValue(enumAlls: Map<string, Array<any>>, enumName: string, key: string, keyValue: string | number, keyCnName: string): string | number {\r\n if (enumAlls != null) {\r\n let singleEnums = enumAlls.get(enumName);\r\n if (singleEnums != null && singleEnums != undefined) {\r\n for (let item of singleEnums) {\r\n if (item[key] == keyValue) {\r\n return item[keyCnName]\r\n }\r\n }\r\n }\r\n }\r\n return keyValue\r\n }\r\n\r\n\r\n /**\r\n *\r\n * @param enums\r\n * @param code\r\n * @param codeName\r\n * @param codeCnName\r\n */\r\n public static getEnumLabel(enums: any[], code: number, codeName ?: string, codeCnName ?: string): string {\r\n if (enums == null) {\r\n return \"\"\r\n }\r\n let codeDesc = codeName;\r\n let codeCnDesc = codeCnName;\r\n if (codeDesc == undefined || codeDesc == \"\") {\r\n codeDesc = \"code\"\r\n }\r\n if (codeCnDesc == undefined || codeCnDesc == \"\") {\r\n codeCnDesc = \"codeCn\"\r\n }\r\n\r\n let result = \"\";\r\n enums.forEach((v, i, ary) => {\r\n if (codeDesc != undefined) {\r\n if (v[codeDesc] == code && codeCnDesc != undefined) {\r\n result = v[codeCnDesc];\r\n return\r\n }\r\n }\r\n\r\n })\r\n return result;\r\n }\r\n\r\n /**\r\n * 枚举格式化(针对el-table-column的)\r\n * @param enums 枚举集合\r\n * @param row 行\r\n * @param column 列\r\n * @param cellVal 当前值\r\n * @param index 当前值的行索引\r\n * @param manulEnumName 手动传入枚举名称\r\n * @param appCode 应用编码\r\n * @returns {*}\r\n */\r\n public static enumFormat(enums: Map<string, Array<any>>, row: any, column: any, cellVal?: any, manulEnumName?: string): string | number {\r\n let cellValue = row[column.property]\r\n let enumName = EnumUtil.firstWordUpperCase(column.property)\r\n if (manulEnumName != undefined && manulEnumName != null) {\r\n enumName = manulEnumName;\r\n }\r\n if (cellVal == null) {\r\n cellVal = cellValue;\r\n }\r\n return EnumUtil.getEnumValue(enums, enumName, 'code', cellVal, 'codeCn');\r\n }\r\n\r\n /**\r\n * 枚举格式化(针对el-table-column的)\r\n * @param enums 枚举集合\r\n * @param row 行\r\n * @param column 列\r\n * @param cellVal 当前值\r\n * @param index 当前值的行索引\r\n * @param manulEnumName 手动传入枚举名称\r\n * @param appCode 应用编码\r\n * @returns {*}\r\n */\r\n public static enumDefaultFormat(row: any, column: any, cellVal?: any, manulEnumName?: any, appCode?: any): string | number {\r\n let cellValue = row[column.property]\r\n let enumName = EnumUtil.firstWordUpperCase(column.property)\r\n if (manulEnumName != undefined && manulEnumName != null) {\r\n enumName = manulEnumName;\r\n }\r\n let cellFinalValue = cellVal ? cellVal : cellValue;\r\n if (cellFinalValue == null || cellFinalValue == undefined) {\r\n return \"\";\r\n }\r\n if (appCode != null && appCode != undefined) {\r\n return EnumUtil.getEnumValue(EnumUtil.GetEnums(appCode), enumName, 'code', cellFinalValue, 'codeCn');\r\n }\r\n let appCodes = EnumUtil.GetAllAppCodes();\r\n for (let appCodeKey of appCodes) {\r\n let appEnums = EnumUtil.GetEnums(appCodeKey);\r\n let resultValue = EnumUtil.getEnumValue(appEnums, enumName, 'code', cellFinalValue, 'codeCn');\r\n if (resultValue != null && resultValue != undefined && resultValue != cellFinalValue) {\r\n return resultValue;\r\n }\r\n }\r\n return \"\";\r\n }\r\n /**\r\n * 单词首字母大写\r\n * @param str\r\n * @returns {string}\r\n */\r\n public static firstWordUpperCase(str: string): string {\r\n if (str != null && str != undefined) {\r\n return str.slice(0, 1).toUpperCase() + str.slice(1)\r\n }\r\n return \"\";\r\n }\r\n}\r\n\r\n","/**\r\n *@desc 通用工具类\r\n *@author liudejian\r\n *@date 2020-03-20 21:45\r\n **/\r\nimport {DateUtil} from \"./DateUtil\";\r\nimport {EnumUtil} from \"./EnumUtil\";\r\nimport {SnowflakeIdv1} from 'simple-flakeid'\r\n\r\nconst snowflake = new SnowflakeIdv1({workerId: 1, seqBitLength: 16})\r\n\r\nexport class CommonUtil {\r\n\r\n /**\r\n * 雪花算法ID (18位)\r\n */\r\n public static genSnowflake(): number | bigint {\r\n return snowflake.NextId()\r\n }\r\n\r\n /**\r\n * map 转对象\r\n * @param mapData\r\n */\r\n public static mapToObject(mapData:Map<string, any>): any {\r\n let result = {} as any;\r\n for (let [key,value] of mapData) {\r\n result[key] = value;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * 随机数生成\r\n * @param min 最小值\r\n * @param max 最大值\r\n */\r\n public static genRandom(min: number, max: number): number {\r\n let range = max - min;\r\n let rand = Math.random();\r\n let res = (min + Math.round(rand * range));\r\n return res;\r\n }\r\n\r\n /**\r\n * 产生UID\r\n * @param len 长度\r\n * @param radix 因子长度\r\n * @returns {string}\r\n */\r\n public static genUid(len: number, radix?: number): string {\r\n let chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')\r\n let uuid = [];\r\n let i: number;\r\n radix = radix || chars.length\r\n\r\n if (len) {\r\n for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix]\r\n } else {\r\n let r\r\n uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'\r\n uuid[14] = '4'\r\n for (i = 0; i < 36; i++) {\r\n if (!uuid[i]) {\r\n r = 0 | Math.random() * 16\r\n uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]\r\n }\r\n }\r\n }\r\n return uuid.join('')\r\n }\r\n\r\n /**\r\n * 左右对其\r\n * @param str\r\n */\r\n public static trim(str: string): string {\r\n if (str == null || str == undefined) {\r\n return \"\";\r\n }\r\n return str.replace(/(^[ \\t\\n\\r]+)|([ \\t\\n\\r]+$)/g, '');\r\n }\r\n\r\n /**\r\n * 判断obj对象是否为空\r\n * @method isEmptyObject\r\n * @param { * } obj 需要判断的对象\r\n * @remind 如果判断的对象是NULL, 将直接返回true, 如果是数组且为空, 返回true, 如果是字符串, 且字符串为空,\r\n * 返回true, 如果是普通对象, 且该对象没有任何实例属性, 返回true\r\n * @return { Boolean } 对象是否为空\r\n * @example\r\n * ```javascript\r\n *\r\n * //output: true\r\n * console.log( utils.isEmptyObject( {} ) );\r\n *\r\n * //output: true\r\n * console.log( utils.isEmptyObject( [] ) );\r\n *\r\n * //output: true\r\n * console.log( utils.isEmptyObject( \"\" ) );\r\n *\r\n * //output: false\r\n * console.log( utils.isEmptyObject( { key: 1 } ) );\r\n *\r\n * //output: false\r\n * console.log( utils.isEmptyObject( [1] ) );\r\n *\r\n * //output: false\r\n * console.log( utils.isEmptyObject( \"1\" ) );\r\n *\r\n * ```\r\n */\r\n public static isEmptyObject(obj: any): boolean {\r\n if (obj == null || obj == undefined) return true\r\n if (this.isArray(obj) || this.isString(obj)) {\r\n return obj.length === 0\r\n }\r\n if (this.isNumber(obj)) {\r\n return false\r\n }\r\n for (let key in obj) if (Object.prototype.hasOwnProperty.call(obj, key)) return false\r\n return true\r\n }\r\n\r\n /**\r\n * 单词首字母大写\r\n * @param str\r\n * @returns {string}\r\n */\r\n public static firstWordUpperCase(str: string): string {\r\n if (str != null && str != undefined) {\r\n return str.slice(0, 1).toUpperCase() + str.slice(1)\r\n }\r\n return \"\";\r\n }\r\n\r\n\r\n /**\r\n * 获取模板值\r\n * @param template 模板 {username}/{age}\r\n * @param data {username:'good',age:100}\r\n * @return good/100\r\n * @example templateEngine(template,data);\r\n */\r\n public static templateEngine(template: string, json: any): string {\r\n let pattern = /\\{(\\w*[:]*[=]*\\w+)\\}(?!})/g;\r\n return template.replace(pattern, function (match, key, value) {\r\n return json[key]\r\n })\r\n }\r\n\r\n\r\n public static isArray(object: any): boolean {\r\n return Array.isArray(object);\r\n }\r\n\r\n public static isNumber(object: any): boolean {\r\n return Object.prototype.toString.apply(object) == '[object Number]';\r\n }\r\n\r\n public static isString(object: any): boolean {\r\n return Object.prototype.toString.apply(object) == '[object String]';\r\n }\r\n\r\n public static isFunction(object: any): boolean {\r\n return Object.prototype.toString.apply(object) == '[object Function]';\r\n }\r\n\r\n public static isObject(object: any): boolean {\r\n return Object.prototype.toString.apply(object) == '[object Object]';\r\n }\r\n\r\n public static isDate(object: any): boolean {\r\n return Object.prototype.toString.apply(object) == '[object Date]';\r\n }\r\n\r\n public static isRegExp(object: any): boolean {\r\n return Object.prototype.toString.apply(object) == '[object RegExp]';\r\n }\r\n\r\n public static isMap(object: any): boolean {\r\n return Object.prototype.toString.apply(object) == '[object Map]';\r\n }\r\n\r\n public static isSet(object: any): boolean {\r\n return Object.prototype.toString.apply(object) == '[object Set]';\r\n }\r\n\r\n /**\r\n * 对象copy\r\n * @param target 目标对象\r\n * @param source 原始对象\r\n * @param deep 是否深度copy\r\n */\r\n public static copy(target: any, source: any, deep: boolean) {\r\n if (deep) {\r\n let proto = Object.getPrototypeOf(source)\r\n return Object.assign(target, Object.create(proto), source)\r\n } else {\r\n return Object.assign(target, source)\r\n }\r\n }\r\n\r\n /**\r\n * 空判断\r\n * @param str\r\n * @returns {boolean}\r\n */\r\n public static isBlank(str: string): boolean {\r\n return CommonUtil.isEmptyObject(str)\r\n }\r\n\r\n /**\r\n *\r\n * @param str\r\n * @returns {boolean}\r\n */\r\n public static isNotBlank(str: string) {\r\n return !CommonUtil.isBlank(str)\r\n }\r\n\r\n /**\r\n * 开始\r\n * @param str\r\n * @param prefix 前缀\r\n */\r\n public static startWith(str: string, prefix: string): boolean {\r\n let reg = new RegExp(\"^\" + prefix + \".*\", 'i');\r\n return reg.test(str);\r\n /*if (str != null && str.startWith(prefix)) {\r\n return true;\r\n }\r\n return false;*/\r\n }\r\n\r\n /**\r\n * 以 stuff结尾\r\n * @param str\r\n * @param stuff\r\n * @returns {boolean}\r\n */\r\n public static endWith(str: string, stuff: string): boolean {\r\n let reg: RegExp = new RegExp('.*\" + stuff + \"$', 'i');\r\n return reg.test(str);\r\n /* if (str != null && str.endsWith(stuff)) {\r\n return true;\r\n }\r\n return false;*/\r\n }\r\n\r\n /**\r\n * 时间格式化\r\n * @param time 后台时间长整型/date\r\n * @param fmt 时间格式 yyyy-MM-dd hh:mm:ss\r\n */\r\n public static dateFormat(time: Date | number | string, fmt ?: string) {\r\n if (time == '' || time == undefined || time == null || time == 'null' || time == 'NULL') {\r\n return \"\";\r\n }\r\n if (typeof time == 'string') {\r\n time = parseInt(time);\r\n }\r\n return DateUtil.dateFormat(time, fmt);\r\n }\r\n\r\n /**\r\n * 数据格式化(针对el-table-column的)\r\n * @param datas 数据集\r\n * @param keyName 指定对比KEY名称\r\n * @param returnValueName 返回值 KEY名称\r\n * @returns {{}|*}\r\n */\r\n public static dataFormat(datas: Array<any>, returnValueName: string, keyName: string, value: string | number): string {\r\n if (datas == undefined || returnValueName == undefined || keyName == undefined || value == undefined) {\r\n return \"\";\r\n }\r\n if (datas) {\r\n let data = datas.find(item => item[keyName] == value);\r\n if (data) {\r\n return data[returnValueName];\r\n }\r\n }\r\n return value as string;\r\n }\r\n\r\n /**\r\n * 根据编码获取对应的标签值\r\n * @param appCode 应用编号\r\n * @param dictCode 枚举字典编码\r\n * @param code 对应的枚举值编码\r\n * @param codeName\r\n * @param codeCnName\r\n */\r\n public static getEnumLabelByCode(appCode: string, dictCode: string, code: number, codeName ?: string, codeCnName ?: string): string {\r\n let appEnums = EnumUtil.GetEnums(appCode);\r\n let enums = appEnums.get(dictCode) || [];\r\n return this.getEnumLabel(enums, code, codeName, codeCnName);\r\n }\r\n\r\n /**\r\n * @param enumAlls 枚举集合[AppCode:[{codeCn: \"用户系统\", code: 1, ordianl: 0, codeEn: \"UC\"},{codeCn: \"代理系统\", code: 2, ordianl: 1, codeEn: \"PROXY\"}]]\r\n * @param enumName 枚举名称 AppCode\r\n * @param key 比如: code\r\n * @param keyValue 比如:1\r\n * @param keyCnName 比如:codeCn\r\n */\r\n public static getEnumValue(enumAlls: Map<string, Array<any>>, enumName: string, key: string, keyValue: string | number, keyCnName: string): string | number {\r\n if (enumAlls != null) {\r\n let singleEnums = enumAlls.get(enumName);\r\n if (singleEnums != null && singleEnums != undefined) {\r\n for (let item of singleEnums) {\r\n if (item[key] == keyValue) {\r\n return item[keyCnName]\r\n }\r\n }\r\n }\r\n }\r\n return keyValue\r\n }\r\n\r\n\r\n /**\r\n *\r\n * @param enums\r\n * @param code\r\n * @param codeName\r\n * @param codeCnName\r\n */\r\n public static getEnumLabel(enums: any[], code: number, codeName ?: string, codeCnName ?: string): string {\r\n if (enums == null) {\r\n return \"\"\r\n }\r\n let codeDesc = codeName;\r\n let codeCnDesc = codeCnName;\r\n if (codeDesc == undefined || codeDesc == \"\") {\r\n codeDesc = \"code\"\r\n }\r\n if (codeCnDesc == undefined || codeCnDesc == \"\") {\r\n codeCnDesc = \"codeCn\"\r\n }\r\n\r\n let result = \"\";\r\n enums.forEach((v, i, ary) => {\r\n if (codeDesc != undefined) {\r\n if (v[codeDesc] == code && codeCnDesc != undefined) {\r\n result = v[codeCnDesc];\r\n return\r\n }\r\n }\r\n\r\n })\r\n return result;\r\n }\r\n\r\n /**\r\n * 枚举格式化(针对el-table-column的)\r\n * @param enums 枚举集合\r\n * @param row 行\r\n * @param column 列\r\n * @param cellVal 当前值\r\n * @param index 当前值的行索引\r\n * @param manulEnumName 手动传入枚举名称\r\n * @param appCode 应用编码\r\n * @returns {*}\r\n */\r\n public static enumFormat(enums: Map<string, Array<any>>, row: any, column: any, cellVal?: any, manulEnumName?: string): string | number {\r\n let cellValue = row[column.property]\r\n let enumName = CommonUtil.firstWordUpperCase(column.property)\r\n if (manulEnumName != undefined && manulEnumName != null) {\r\n enumName = manulEnumName;\r\n }\r\n if (cellVal == null) {\r\n cellVal = cellValue;\r\n }\r\n return CommonUtil.getEnumValue(enums, enumName, 'code', cellVal, 'codeCn');\r\n }\r\n\r\n /**\r\n * 枚举格式化(针对el-table-column的)\r\n * @param enums 枚举集合\r\n * @param row 行\r\n * @param column 列\r\n * @param cellVal 当前值\r\n * @param index 当前值的行索引\r\n * @param manulEnumName 手动传入枚举名称\r\n * @param appCode 应用编码\r\n * @returns {*}\r\n */\r\n public static enumDefaultFormat(row: any, column: any, cellVal?: any, manulEnumName?: any, appCode?: any): string | number {\r\n let cellValue = row[column.property]\r\n let enumName = CommonUtil.firstWordUpperCase(column.property)\r\n if (manulEnumName != undefined && manulEnumName != null) {\r\n enumName = manulEnumName;\r\n }\r\n let cellFinalValue = cellVal ? cellVal : cellValue;\r\n if (cellFinalValue == null || cellFinalValue == undefined) {\r\n return \"\";\r\n }\r\n if (appCode != null && appCode != undefined) {\r\n return CommonUtil.getEnumValue(EnumUtil.GetEnums(appCode), enumName, 'code', cellFinalValue, 'codeCn');\r\n }\r\n let appCodes = EnumUtil.GetAllAppCodes();\r\n for (let appCodeKey of appCodes) {\r\n let appEnums = EnumUtil.GetEnums(appCodeKey);\r\n let resultValue = CommonUtil.getEnumValue(appEnums, enumName, 'code', cellFinalValue, 'codeCn');\r\n if (resultValue != null && resultValue != undefined && resultValue != cellFinalValue) {\r\n return resultValue;\r\n }\r\n }\r\n return \"\";\r\n }\r\n\r\n\r\n /**\r\n * 添加前缀\r\n * @param value\r\n * @param prefix\r\n */\r\n public static addPrefix(value: any, prefix: any): any {\r\n return prefix + value;\r\n }\r\n\r\n /**\r\n * 添加后缀\r\n * @param value\r\n * @param suffix\r\n */\r\n public static addSuffix(value: any, suffix: any): any {\r\n return value + suffix;\r\n }\r\n\r\n\r\n /**\r\n * 清空一个数组\r\n * @param ary\r\n */\r\n public static clearArray(ary: Array<any>): Array<any> {\r\n if (ary != null && ary != undefined) {\r\n return ary.splice(0, ary.length)\r\n }\r\n return ary\r\n }\r\n\r\n /**\r\n * 将时间秒转为HH:MM:SS\r\n * @param second 时间秒\r\n */\r\n public static formatSecondToHms(seconds: number): string {\r\n return DateUtil.formatSecondToHms(seconds);\r\n }\r\n}\r\n","/**\r\n *@desc cookie工具\r\n *@author liudejian\r\n *@date 2020-03-26 17:28\r\n **/\r\nimport Cookies, {CookieAttributes} from 'js-cookie'\r\n\r\n/**\r\n * cookie工具\r\n */\r\nexport class CookieUtil {\r\n\r\n /**\r\n * 默认cookie配置\r\n */\r\n public static defaultCookieConfig(): CookieAttributes {\r\n let attr = {\r\n expires: 365,\r\n path: '/',\r\n secure: true,\r\n sameSite: 'strict'\r\n } as CookieAttributes;\r\n return attr;\r\n }\r\n\r\n /**\r\n * 设置cookie\r\n * @param key\r\n * @param value\r\n * @param options\r\n */\r\n public static setCookie(key: string, value: string, options: CookieAttributes): string | undefined {\r\n return Cookies.set(key, value, options);\r\n }\r\n\r\n /**\r\n * 设置cookie\r\n * @param key\r\n * @param value\r\n */\r\n public static setDefaultCookie(key: string, value: string): string | undefined {\r\n return CookieUtil.setCookie(key, value, CookieUtil.defaultCookieConfig());\r\n }\r\n\r\n /**\r\n * 设置对象cookie\r\n * @param key\r\n * @param value\r\n * @param options\r\n */\r\n public static setObjCookie(key: string, value: any, options: CookieAttributes): string | undefined {\r\n return CookieUtil.setCookie(key, JSON.stringify(value), options);\r\n }\r\n\r\n /**\r\n * 获取cookie\r\n * @param key\r\n */\r\n public static getObjCookie<T>(key: string): T {\r\n let json = CookieUtil.getCookie(key) || \"{}\";\r\n return JSON.parse(json);\r\n }\r\n\r\n /**\r\n * 获取cookie\r\n * @param key\r\n */\r\n public static getCookie(key: string): string | undefined {\r\n return Cookies.get(key)\r\n }\r\n\r\n /**\r\n * 删除cookie\r\n * @param key\r\n */\r\n public static removeCookie(key: string) {\r\n Cookies.remove(key);\r\n }\r\n\r\n\r\n}\r\n","import mitt from 'mitt';\r\n\r\n\r\n/**\r\n *@desc\r\n *@author liudejian\r\n *@date 2020-03-26 13:12\r\n **/\r\n// @ts-ignore\r\nconst BUS = mitt()\r\n\r\n/**\r\n * 事件总线\r\n */\r\nexport class EventBus {\r\n\r\n /**\r\n * 发布事件\r\n * @param key\r\n * @param data\r\n */\r\n public static publish(key: string, data: any) {\r\n BUS.emit(key, data)\r\n }\r\n\r\n /**\r\n * 监听事件\r\n * @param key\r\n * @param callback\r\n */\r\n public static on(key: string, callback: any) {\r\n BUS.on(key, callback);\r\n }\r\n\r\n /**\r\n * 关闭事件\r\n * @param key\r\n */\r\n public static off(key:string) {\r\n BUS.off(key);\r\n }\r\n}\r\n","/*import fs from \"fs\";\r\nimport path from \"path\";*/\r\n\r\n/**\r\n *@desc 文件工具\r\n *@author liudejian\r\n *@date 2020-01-13 17:47\r\n **/\r\nexport class FileUtil {\r\n /**\r\n * 格式化文件大小 ( 参数:表示要被转化的容量大小,以字节为单)\r\n * @param a 待格式化的文件大小(byte)\r\n * @param b 参数:表示如果转换时出小数,四舍五入保留多少位 默认为2位小数\r\n */\r\n public static formatBytes(a: number, b: number): string {\r\n if (0 == a) return \"0 B\";\r\n let c = 1024, d = b || 2, e = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"],\r\n f = Math.floor(Math.log(a) / Math.log(c));\r\n return parseFloat((a / Math.pow(c, f)).toFixed(d)) + \" \" + e[f];\r\n }\r\n\r\n\r\n /**\r\n * 判断是否为Base64字符串\r\n * @param data\r\n */\r\n public static isBase64Img(data:string) {\r\n //正则表达式判断\r\n let reg = /^\\s*data:([a-z]+\\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;base64)?,([a-z0-9!$&',()*+;=\\-._~:@\\/?%\\s]*?)\\s*$/i;\r\n return reg.test(data);\r\n }\r\n /**\r\n * 判断是否为Blob对象\r\n * @param data\r\n */\r\n public static isBlob(data:any):boolean {\r\n return data instanceof Blob;\r\n }\r\n /**\r\n * 判断是否为File对象\r\n * @param data\r\n */\r\n public static isFile(data:any):boolean {\r\n return data instanceof File && !(data instanceof Blob)\r\n }\r\n /**\r\n * Base64转换为File\r\n * @param dataurl\r\n * @param filename\r\n */\r\n public static dataURLtoFile(dataurl:any, filename:string) {\r\n var arr = dataurl.split(','),\r\n mime = arr[0].match(/:(.*?);/)[1],\r\n bstr = atob(arr[1]),\r\n n = bstr.length,\r\n u8arr = new Uint8Array(n);\r\n while (n--) {\r\n u8arr[n] = bstr.charCodeAt(n);\r\n }\r\n return new File([u8arr], filename, { type: mime });\r\n }\r\n\r\n\r\n /**\r\n * Base64转换为Blob\r\n * @param dataurl\r\n * @param filename\r\n */\r\n public static dataURLtoBlob(dataurl:any, filename:string) {\r\n var arr = dataurl.split(','),\r\n mime = arr[0].match(/:(.*?);/)[1],\r\n bstr = atob(arr[1]),\r\n n = bstr.length,\r\n u8arr = new Uint8Array(n);\r\n while (n--) {\r\n u8arr[n] = bstr.charCodeAt(n);\r\n }\r\n return new Blob([u8arr], { type: mime });\r\n }\r\n\r\n /**\r\n * Blob转File\r\n * @param blob\r\n */\r\n public static blobToFile(blob:any) {\r\n return new File([blob], 'screenshot.png', { type: 'image/jpeg' })\r\n }\r\n\r\n public static blobToFileDefineName(blob:any,fileName:string) {\r\n return new File([blob], fileName, { type: 'image/jpeg' })\r\n }\r\n\r\n /**\r\n * 获取图片高宽\r\n * @param file\r\n *\r\n */\r\n public static getImageWidthHeight(file:File) :Promise<ImageHw>{\r\n return new Promise((resolve, reject) => {\r\n // 获取上传的图片的宽高\r\n let reader = new FileReader();\r\n reader.readAsDataURL(file);\r\n reader.onload = function (evt:any) {\r\n let replaceSrc = evt.target.result;\r\n let imageObj = new Image();\r\n imageObj.src = replaceSrc as any;\r\n imageObj.onload = function () {\r\n resolve({width:imageObj.width,height:imageObj.height} as ImageHw)\r\n };\r\n };\r\n reader.onerror = function (err:any) {\r\n reject(err)\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 获取音视频 播放时长(单位:秒(s))\r\n * @param file\r\n */\r\n public static getMediaDuration(file: File): Promise<any> {\r\n return new Promise<any>((resolve, reject) => {\r\n //获取音频、视频时长\r\n const url = URL.createObjectURL(file);\r\n const audioElement = new Audio(url);\r\n let duration;\r\n audioElement.addEventListener(\"loadedmetadata\", (_event) => {\r\n duration = audioElement.duration;\r\n resolve(duration)\r\n });\r\n })\r\n }\r\n /**\r\n * 加载文件夹下所有文件\r\n * @param fileDir\r\n */\r\n /* public static loadAllFiles(fileDir: any): Array<string> {\r\n let files = new Array<string>();\r\n let stat = fs.statSync(fileDir);\r\n if (stat.isFile()) {\r\n files.push(fileDir);\r\n return files;\r\n }\r\n /!**\r\n * 加载文件\r\n * @param fileDir\r\n *!/\r\n function loadFile(fileDir: any) {\r\n let res = fs.readdirSync(fileDir)\r\n res.forEach((item, index, ary) => {\r\n // @ts-ignore\r\n let filePath = path.join(fileDir, item);\r\n let stat = fs.statSync(filePath);\r\n if (stat.isDirectory()) {\r\n loadFile(filePath)\r\n } else {\r\n files.push(filePath);\r\n }\r\n })\r\n }\r\n\r\n loadFile(fileDir);\r\n return files;\r\n }\r\n*/\r\n}\r\n\r\n/**\r\n * 图片高宽\r\n */\r\nexport interface ImageHw {\r\n height:number;\r\n width:number;\r\n}\r\n","export type ThumbnailMode = \"lfit\"|\"mfit\"|\"fill\"|\"pad\"|\"fixed\"\r\n\r\n/**\r\n *@desc OSS工具\r\n *@author liudejian\r\n *@date 2024-04-21 11:16\r\n **/\r\nexport class OssUtil {\r\n\r\n /**\r\n * 阿里云OSS,百分比缩放图片\r\n * @param url 图片URL\r\n * @param percentage 百分比:example(10,20,50)\r\n * @return 返回最终于URL\r\n */\r\n public static aliThumbnailPercentage(url:string,percentage:number):string {\r\n if (url){\r\n percentage = Math.ceil(percentage);\r\n if (url.indexOf(\"?\") !=-1) {\r\n url+=\"&x-oss-process=image/resize,p_\"+percentage;\r\n } else {\r\n url+=\"?x-oss-process=image/resize,p_\"+percentage;\r\n }\r\n }\r\n return url\r\n }\r\n\r\n /**\r\n * 将原图指定按短边缩略\r\n * @param url 图片URL\r\n * @param width 宽 example:100\r\n * @param height 高 example:200\r\n * @param tm 缩放方式 (\r\n * lfit(默认值):等比缩放,缩放图限制为指定w与h的矩形内的最大图片。\r\n * mfit:等比缩放,缩放图为延伸出指定w与h的矩形框外的最小图片。\r\n * fill:将原图等比缩放为延伸出指定w与h的矩形框外的最小图片,然后将超出的部分进行居中裁剪。\r\n * pad:将原图缩放为指定w与h的矩形内的最大图片,然后使用指定颜色居中填充空白部分。\r\n * fixed:固定宽高,强制缩放。)\r\n * @return 返回最终于URL\r\n */\r\n public static aliThumbnai(url:string,width:number,height:number,tm?:ThumbnailMode):string {\r\n if (url){\r\n if (!tm) {\r\n tm=\"lfit\";\r\n }\r\n width = Math.ceil(width);\r\n height = Math.ceil(height);\r\n if (url.indexOf(\"?\") !=-1) {\r\n url+=\"&x-oss-process=image/resize,m_\"+tm+\",h_\"+height+\",w_\"+width+\"\";\r\n } else {\r\n url+=\"?x-oss-process=image/resize,m_\"+tm+\",h_\"+height+\",w_\"+width+\"\";\r\n }\r\n }\r\n return url\r\n }\r\n}","/**\r\n *@desc url工具\r\n *@author liudejian\r\n *@date 2020-02-06 22:15\r\n **/\r\nimport {CommonUtil} from \"./CommonUtil\";\r\n\r\n\r\nexport class UrlUtil {\r\n public static readonly PATTERN = /\\{(.*)\\}/g\r\n /**\r\n * URL拼接 (以 / 拼接两个字符串)\r\n * @param uriFirst\r\n * @param uriSecond\r\n */\r\n public static urlJoin(uriFirst: string, uriSecond: string): string {\r\n if (CommonUtil.isBlank(uriFirst)) {\r\n return uriSecond;\r\n }\r\n if (CommonUtil.isBlank(uriSecond)) {\r\n return uriFirst;\r\n }\r\n if (uriFirst.endsWith(\"/\") && uriSecond.startsWith(\"/\")) {\r\n return uriFirst + uriSecond.substring(1, uriSecond.length);\r\n } else if (uriFirst.endsWith(\"/\") && !uriSecond.startsWith(\"/\")) {\r\n return uriFirst + uriSecond;\r\n } else if (!uriFirst.endsWith(\"/\") && !uriSecond.startsWith(\"/\")) {\r\n return uriFirst + \"/\" + uriSecond;\r\n } else {\r\n return uriFirst + uriSecond;\r\n }\r\n }\r\n\r\n /**\r\n * 解析URI\r\n * @param uri\r\n */\r\n public static parseUri(uri: string): any {\r\n if (uri.indexOf(\"?\") != -1) {\r\n uri = uri.substring(uri.indexOf(\"?\")+1);\r\n }\r\n let params = {} as any, queries, temp, i, l;\r\n queries = uri.split(\"&\");\r\n for (i = 0, l = queries.length; i < l; i++) {\r\n temp = queries[i].split('=');\r\n params[(temp[0] as string)] = temp[1];\r\n }\r\n return params;\r\n }\r\n\r\n /**\r\n * 解析参数\r\n */\r\n public static parseLocationParams(): any {\r\n let uri = window.location.href;\r\n if (uri.indexOf(\"?\") != -1) {\r\n uri = uri.substring(uri.indexOf(\"?\")+1);\r\n }\r\n let params = {} as any, queries, temp, i, l;\r\n queries = uri.split(\"&\");\r\n for (i = 0, l = queries.length; i < l; i++) {\r\n temp = queries[i].split('=');\r\n params[(temp[0] as string)] = temp[1];\r\n }\r\n return params;\r\n }\r\n\r\n /**\r\n * 根据参数名获取(window.location.search中)URI参数值\r\n * @param paramName\r\n */\r\n public static getUriParam(paramName:string):string {\r\n let params = UrlUtil.parseLocationParams();\r\n if (params) {\r\n return params[paramName];\r\n }\r\n return \"\"\r\n }\r\n\r\n /**\r\n * 更新当前 window.location.href 中的key=value (刷新页面)\r\n * @param key\r\n * @param value\r\n */\r\n public static updateLocationUrlReload(key: string, value: string) {\r\n window.location.href = UrlUtil.updateLocationParam(window.location.href, key, value)\r\n }\r\n\r\n /**\r\n * 更新当前 window.location.href 中的key=value (不刷新页面)\r\n * @param key\r\n * @param value\r\n */\r\n public static updateLocationUrl(key: string, value: string) {\r\n let uri = window.location.href\r\n let newurl = UrlUtil.updateLocationParam(uri, key, value)\r\n //向当前url添加参数,没有历史记录\r\n window.history.replaceState({\r\n path: newurl\r\n }, '', newurl);\r\n }\r\n\r\n /**\r\n * 更新当前 uri 中的key=value\r\n * @param url example:http://127.0.0.1:8599/#/cvparse?sourceId=1118606561115582464\r\n * @param key example:sourceId\r\n * @param value example: 1118606561115582464\r\n */\r\n public static updateLocationParam(uri: string, key: string, value: string): string {\r\n\r\n if (!value) {\r\n return uri;\r\n }\r\n let re = new RegExp(\"([?&])\" + key + \"=.*?(&|$)\", \"i\");\r\n let separator = uri.indexOf('?') !== -1 ? \"&\" : \"?\";\r\n if (uri.match(re)) {\r\n return uri.replace(re, '$1' + key + \"=\" + value + '$2');\r\n } else {\r\n return uri + separator + key + \"=\" + value;\r\n }\r\n }\r\n\r\n /**\r\n * URL替换\r\n * @param template\r\n * @param json\r\n */\r\n public static urlReplaceEngine(template: string, json: any):string {\r\n return template.replace(UrlUtil.PATTERN, function (match, key, value) {\r\n // console.log(\"match-key===\",key)\r\n return json[key]\r\n })\r\n }\r\n\r\n /**\r\n * 对URL编码\r\n * @param url\r\n */\r\n public static encodeUrl(url: string): string {\r\n return encodeURIComponent(url);\r\n }\r\n}\r\n\r\n\r\n","import {CommonUtil} from \"../../common\";\r\n\r\n/**\r\n *@desc 零宽字符处理\r\n *@author liudejian\r\n *@date 2023-10-14 21:41\r\n **/\r\nexport class ZeroUtil {\r\n // 用户替换1\r\n public static HIDE_WORD_1: string = \"\\u200b\";\r\n // zero-width non-joiner 用于替换0\r\n public static HIDE_WORD_0: string = \"\\u200c\";\r\n //分割使用\r\n public static HIDE_WORD_FEFF: string = \"\\ufeff\";\r\n\r\n /**\r\n * 将 word 进行字符拆分,然后每个字符进行转译\r\n * @param word\r\n */\r\n public static textToBinary(word: string): Array<any> {\r\n return word.split('').map(char => {\r\n return char.charCodeAt(0).toString(2);\r\n })\r\n }\r\n\r\n\r\n /**\r\n * 将二进制转零宽字符\r\n * @param arr\r\n */\r\n public static binaryToZeroAry(arr: Array<any>): Array<any> {\r\n return arr.map((binary: string) => {\r\n return binary.split('').map((num: any) => {\r\n if (+num === 1) {\r\n return ZeroUtil.HIDE_WORD_1; // zero-width space\r\n // '•'.charCodeAt(0).toString(16) => '200b'\r\n } else {\r\n return ZeroUtil.HIDE_WORD_0; // zero-width non-joiner\r\n // '•'.charCodeAt(0).toString(16) => '200c'\r\n }\r\n }).join('')\r\n })\r\n }\r\n\r\n /**\r\n * 将零宽字符拼接在字符串 prefix后面\r\n * @param prefix 前缀\r\n * @param zeroAry 零宽字符数组\r\n */\r\n public static joinZeroAryToString(prefix: string, zeroAry: Array<any>): string {\r\n return prefix + zeroAry.join(ZeroUtil.HIDE_WORD_FEFF);\r\n }\r\n\r\n\r\n /**\r\n * 零宽字符转字符串\r\n * @param zeroWidthStr\r\n */\r\n public static zeroWidthToStr(zeroWidthStr: string): string {\r\n let binaryStr = zeroWidthStr.split('').map((zeroWidthChar) => {\r\n if (zeroWidthChar === ZeroUtil.HIDE_WORD_1) {\r\n return '1';\r\n } else {\r\n return '0';\r\n }\r\n }).join('');\r\n return ZeroUtil.binaryToStr(+binaryStr)\r\n }\r\n\r\n /**\r\n * 将二进制数转成字符\r\n * @param binary\r\n * @private\r\n */\r\n public static binaryToStr(binary: any): string {\r\n return String.fromCharCode(parseInt(binary, 2));\r\n }\r\n\r\n\r\n /**\r\n * 零宽转String\r\n * @param zeroArr\r\n */\r\n public static zeroArrToString(zeroArr: Array<any>): string {\r\n return zeroArr.map(ZeroUtil.zeroWidthToStr).join('');\r\n }\r\n /**\r\n * 【1】将word转为零宽字符\r\n * @param word\r\n */\r\n public static convertToZeroString(word:string):string {\r\n if (CommonUtil.isBlank(word)) {\r\n return \"\";\r\n }\r\n let binaryAry = ZeroUtil.textToBinary(word);\r\n let zeroAry = ZeroUtil.binaryToZeroAry(binaryAry);\r\n return zeroAry.join(ZeroUtil.HIDE_WORD_FEFF)\r\n }\r\n\r\n /**\r\n * 【2】提取word中隐藏的零宽字符串\r\n * @param word\r\n */\r\n public static extractHideInfo(word: string): string {\r\n return word.replace(/[^\\u200b-\\u200f\\uFEFF\\u202a-\\u202e]/g, \"\");\r\n }\r\n\r\n\r\n\r\n /**\r\n * 【3】将零宽字符还原为正常字符串\r\n * @param zeroWord\r\n */\r\n public static convertZeroStringToString(zeroWord:string):string {\r\n if (CommonUtil.isBlank(zeroWord)) {\r\n return \"\";\r\n }\r\n let zeroWordAry = zeroWord.split(ZeroUtil.HIDE_WORD_FEFF);\r\n let result = ZeroUtil.zeroArrToString(zeroWordAry);\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * console.log(\"===============================\")\r\n * let link = 'lvalue.com'\r\n * let zeroWord = ZeroUtil.convertToZeroString(\"中华人民共和国\")\r\n * zeroWord = link+zeroWord;\r\n * console.log(zeroWord+\"===========\");\r\n * zeroWord = ZeroUtil.extractHideInfo(zeroWord);\r\n * console.log(zeroWord+\"===========\");\r\n * let res = ZeroUtil.convertZeroStringToString(zeroWord);\r\n * console.log(res)\r\n */\r\n\r\n","/**\n *\n *@author :<a href=\"mailto:zuiwoxing@qq.com\">liudejian</a>\n *@version :Ver 1.0\n *@date :2020-05-03 21:04:12\n */\nexport class CommonTree {\n // 当前节点ID\n id?: number;\n // 节点唯一标识,不能为空\n key!: string;\n // 父节点ID\n pid?: number;\n // 节点名称\n label?: string;\n url?: string;\n\ticon?: string;\n//\tleaf?:boolean;\n // 是否选种\n checked: boolean = false;\n // 是否禁用\n disabled: boolean = false;\n // 排序\n order: number = 0;\n // 层级\n level: number = 0;\n // 根据业务决定该值的使用\n nodeType?:number;\n // 子节点\n children: Array<CommonTree> = new Array<CommonTree>();\n // 扩展参数\n params?: Map<string, any>;\n\n}\n","/**\r\n *@desc 通用树\r\n *@author liudejian\r\n *@date 2020-07-03 16:03\r\n **/\r\nimport {CommonTree} from \"../../model/CommonTree\";\r\n\r\nexport class CommonTreeUtil {\r\n\r\n /**\r\n * 将分类转为树结构\r\n * @param categorys\r\n * @param checkedIds\r\n * @param maxLevel\r\n */\r\n public static convertToTree(treeBos: Array<CommonTree>, checkedIds: Array<number>, maxLevel: number): Array<CommonTree> {\r\n let results = new Array<CommonTree>();\r\n if (treeBos) {\r\n //第一步:将所有层级初始化空对应放入List\r\n let levelMap = new Map<number, Array<CommonTree>>();\r\n for (let i = 0; i <= maxLevel; i++) {\r\n levelMap.set(i, new Array<CommonTree>());\r\n }\r\n let checkMaps = new Map<number, boolean>();\r\n if (checkedIds) {\r\n checkedIds.forEach((checkedId => {\r\n checkMaps.set(checkedId, true);\r\n }))\r\n }\r\n //第二步:遍历所有子节点数据,取得根节点集合数据并且将数据按层级归类。\r\n treeBos.forEach(source => {\r\n let commonTree = new CommonTree();\r\n commonTree.level = source.level;\r\n commonTree.key = source.key;\r\n commonTree.id = source.id;\r\n commonTree.pid = source.pid;\r\n commonTree.label = source.label;\r\n commonTree.order = source.order;\r\n // commonTree.leaf = source.leaf;\r\n commonTree.url = source.url;\r\n commonTree.params = source.params;\r\n if (checkMaps.get(commonTree.id || 0)) {\r\n commonTree.checked = true\r\n }\r\n if (commonTree.level >= maxLevel) {\r\n return;\r\n }\r\n if (commonTree.level <= 0) {\r\n results.push(commonTree);\r\n }\r\n let tempList = levelMap.get(commonTree.level);\r\n if (tempList != null) {\r\n tempList.push(commonTree);\r\n levelMap.set(commonTree.level,tempList);\r\n }\r\n })\r\n\r\n //第三步: 根据层级倒序遍历,设置子节点\r\n for (let n = maxLevel; n > 0; n--) {\r\n //子节点\r\n let childList = levelMap.get(n);\r\n let parentList = null;\r\n if (n - 1 >= 0) {\r\n //父节点\r\n parentList = levelMap.get(n - 1);\r\n } else {\r\n //父节点\r\n parentList = results;\r\n }\r\n if (parentList != null && parentList.length > 0\r\n && childList != null && childList.length > 0) {\r\n for (let parent of parentList) {\r\n let id = parent.id;\r\n for (let child of childList) {\r\n if (child.pid != null && child.pid == id) {\r\n parent.children?.push(child);\r\n }\r\n }\r\n //为空才设置\r\n /* if (parent.leaf == null || parent.leaf == undefined) {\r\n if (parent.children == undefined || parent.children.length == 0) {\r\n parent.leaf = (true);\r\n } else {\r\n parent.leaf = (false);\r\n }\r\n }*/\r\n }\r\n }\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n\r\n /**\r\n * 排序\r\n * @param rts\r\n */\r\n public static sortTree(rts: Array<CommonTree>) {\r\n if (rts) {\r\n rts.sort((o1: CommonTree, o2: CommonTree) => {\r\n if (o1.order == null) {\r\n o1.order = 0;\r\n }\r\n if (o2.order == null) {\r\n o2.order = 0;\r\n }\r\n return o1.order - o2.order;\r\n })\r\n\r\n for(let rt of rts) {\r\n let childs = rt.children || [];\r\n if (childs && childs.length > 0) {\r\n // rt.leaf = true;\r\n rt.children = [];\r\n } else {\r\n // rt.leaf = false;\r\n }\r\n this.sortTree(childs);\r\n }\r\n }\r\n }\r\n\r\n\r\n}\r\n","/**\r\n *@desc\r\n *@author liudejian\r\n *@date 2020-04-05 22:17\r\n **/\r\n\r\nconst GLOBAL_CONFIG = new Map<string, any>();\r\nexport class ConfigUtil {\r\n\r\n\r\n public static getConfigMap(): Map<string, any> {\r\n return GLOBAL_CONFIG;\r\n }\r\n\r\n public static getConfigMapToObject(): any {\r\n let result = {} as any;\r\n for (let [key,value] of GLOBAL_CONFIG) {\r\n result[key] = value;\r\n }\r\n return result;\r\n }\r\n\r\n public static put(key: string, value: any): Map<string, any> {\r\n return GLOBAL_CONFIG.set(key, value);\r\n }\r\n\r\n public static remove(key: string): boolean {\r\n return GLOBAL_CONFIG.delete(key);\r\n }\r\n\r\n public static get(key: string): any {\r\n return GLOBAL_CONFIG.get(key);\r\n }\r\n\r\n public static has(key: string): boolean {\r\n return GLOBAL_CONFIG.has(key);\r\n }\r\n}\r\n","export class Word {\r\n //匹配单词下标\r\n index!: number;\r\n //单词\r\n word!: string;\r\n}\r\n\r\n/**\r\n *@desc 正则表达式工具类\r\n *@author liudejian\r\n *@date 2022-11-03 14:03\r\n **/\r\nexport class RegexUtil {\r\n\r\n /**\r\n * g 全局搜索。\r\n * i 不区分大小写搜索。\r\n * m 多行搜索。\r\n * s 允许 . 匹配换行符。\r\n * u 使用 unicode 码的模式进行匹配。\r\n * y 执行“粘性 (sticky)”搜索,匹配从目标字符串的当前位置开始。\r\n * 从 text中提取 所有满足条件的单词数据\r\n * @param text\r\n * @param regex 格式 /xxx/gi\r\n */\r\n public static extractAll(text: string, regex: object): Array<Word> {\r\n let result = new Array<Word>();\r\n if (text && regex) {\r\n // @ts-ignore\r\n text.replace(regex, (matchWord, index, content) => {\r\n result.push({index: index, word: matchWord} as Word);\r\n return matchWord;\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * 提取第一个匹配\r\n * @param text\r\n * @param regex 格式 /xxx/gi\r\n */\r\n public static extractFirst(text: string, regex: object): Word | null {\r\n let word: any = null;\r\n if (text && regex) {\r\n // @ts-ignore\r\n text.replace(regex, (matchWord, index, content) => {\r\n if (word == null) {\r\n word = {index: index, word: matchWord} as Word;\r\n }\r\n return matchWord;\r\n });\r\n }\r\n return word;\r\n }\r\n\r\n /**\r\n * 提取最后一个匹配\r\n * @param text\r\n * @param regex 格式 /xxx/gi\r\n */\r\n public static extractLast(text: string, regex: object): Word | null {\r\n let word = null;\r\n if (text && regex) {\r\n // @ts-ignore\r\n text.replace(regex, (matchWord, index, content) => {\r\n word = {index: index, word: matchWord} as Word;\r\n return matchWord;\r\n });\r\n }\r\n return word;\r\n }\r\n\r\n /**\r\n * 分割单词\r\n * @param text\r\n * @param regex 格式 /xxx/gi\r\n * @param limit 限制分割数\r\n */\r\n public static splitWord(text: string, regex: object, limit?: number): Array<string> {\r\n if (text && regex) {\r\n // @ts-ignore\r\n return text.split(regex, limit)\r\n }\r\n return new Array<string>();\r\n }\r\n\r\n /**\r\n * 检索匹配\r\n * @param text\r\n * @param regex 格式 /xxx/gi\r\n */\r\n public static searchWord(text: string, regex: object): number {\r\n if (text && regex) {\r\n // @ts-ignore\r\n return text.search(regex)\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * 匹配单词\r\n * @param text\r\n * @param regex 格式 /xxx/gi\r\n */\r\n public static matchWord(text: string, regex: object): Array<string> {\r\n if (text && regex) {\r\n // @ts-ignore\r\n return text.match(regex)\r\n }\r\n return new Array<string>();\r\n }\r\n\r\n /**\r\n * 是否匹配单词\r\n * @param text\r\n * @param regex 格式 /xxx/gi\r\n */\r\n public static testWord(text: string, regex: object):boolean {\r\n if (text && regex) {\r\n // @ts-ignore\r\n return new RegExp(regex).test(text)\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 按正则-替换\r\n * @param text 原始内容\r\n * @param regex 正则表达式\r\n * @param map 替换内容k-v形式 example: {name:'liu',age:20}\r\n */\r\n public static replaceWord(text:string,regex:object,map:any):string {\r\n if (text && regex) {\r\n // @ts-ignore\r\n return text.replace(regex, (matchWord, index, content) => {\r\n return map[matchWord];\r\n });\r\n }\r\n return text;\r\n }\r\n}\r\n\r\n\r\n/*let words = \"中华人民共和国,中A国共产a党\";\r\nlet arys = RegexUtil.extractAll(words, /a/gi);\r\narys.forEach((word) => {\r\n console.log(word)\r\n})\r\n\r\nlet arysx = RegexUtil.splitWord(words, /a/gi);\r\n\r\nconsole.log(arysx)\r\nconsole.log(RegexUtil.searchWord(words,/a/gi));\r\nconsole.log(RegexUtil.matchWord(words,/a/gi));\r\nlet reg = new RegExp(/a/gi)\r\nconsole.log(RegexUtil.testWord(words,/a/gi))\r\nconsole.log(RegexUtil.replaceWord(words,/中/gi,{\"中\":\"<h1>中</h1>\"}))*/\r\n","/**\r\n *@desc 自动获取浏览器窗口 高宽\r\n *@author liudejian\r\n *@date 2023-03-31 14:41\r\n **/\r\n\r\nexport class DataSize {\r\n /**\r\n * 高度\r\n * @private\r\n */\r\n public height: number = 0;\r\n /**\r\n * 宽度\r\n * @private\r\n */\r\n public width: number = 0;\r\n\r\n public static of(height: number, width: number): DataSize {\r\n let rs = new DataSize();\r\n rs.height = height;\r\n rs.width = width;\r\n return rs;\r\n }\r\n}\r\n\r\n/**\r\n * 动态获取高宽\r\n */\r\nexport class AutoSize {\r\n public flag: boolean = false;\r\n\r\n /**\r\n * 抹去的高度/宽度\r\n * @private\r\n */\r\n private eraseSize: DataSize = DataSize.of(0, 0);\r\n\r\n /**\r\n * 1= window.innerHeight / window.innerWidth\r\n * 2= document.body.clientHeight / document.body.clientWidth\r\n * @private\r\n */\r\n private clientType: number = 1;\r\n\r\n /**\r\n * 结果高度/宽度\r\n * @private\r\n */\r\n private resultSize: DataSize;\r\n\r\n /**\r\n * 回调函数\r\n * @private\r\n */\r\n private callback: Function;\r\n\r\n /**\r\n * 结果 高宽\r\n */\r\n public getSize(): DataSize {\r\n return this.resultSize\r\n }\r\n\r\n /**\r\n *\r\n * @param eraseHeight 抹去的高度\r\n * @param callback 高度变化就回调\r\n */\r\n public constructor(callback: Function, eraseSize?: DataSize, clientType?: number) {\r\n this.eraseSize = eraseSize == undefined ? DataSize.of(0, 0) : eraseSize;\r\n this.callback = callback;\r\n this.clientType = clientType == undefined ? 1 : clientType;\r\n\r\n if (this.clientType == 1) {\r\n this.resultSize = DataSize.of(window.innerHeight - this.eraseSize.height, window.innerWidth - this.eraseSize.width);\r\n } else {\r\n this.resultSize = DataSize.of(document.body.clientHeight - this.eraseSize.height, document.body.clientWidth - this.eraseSize.width);\r\n }\r\n this.initWindowResize(this)\r\n }\r\n\r\n private initWindowResize(instance: AutoSize) {\r\n window.onresize = function () {\r\n if (!instance.flag) {\r\n instance.flag = true;\r\n setTimeout(() => {\r\n if (instance.clientType == 1) {\r\n instance.resultSize.height = window.innerHeight - instance.eraseSize.height;\r\n instance.resultSize.width = window.innerWidth - instance.eraseSize.width;\r\n } else {\r\n instance.resultSize.height = document.body.clientHeight - instance.eraseSize.height;\r\n instance.resultSize.width = document.body.clientWidth - instance.eraseSize.width;\r\n }\r\n instance.flag = false;\r\n instance.callback(instance.resultSize)\r\n }, 200)\r\n }\r\n }\r\n }\r\n}\r\n","// 引入 FingerprintJS\r\nimport FingerprintJS from '@fingerprintjs/fingerprintjs';\r\n\r\n\r\n/**\r\n *@desc\r\n *@author liudejian\r\n *@date 2025-09-24 9:41\r\n **/\r\nexport class BrowserUtil {\r\n\r\n /**\r\n * 获取客户端浏览器唯一标识\r\n */\r\n public static async getBrowerUniqueId() {\r\n // 初始化并获取指纹\r\n const fp = await FingerprintJS.load();\r\n const result = await fp.get();\r\n // 唯一指纹 ID\r\n const fingerprint = result.visitorId;\r\n return Promise.resolve(fingerprint);\r\n }\r\n}\r\n\r\n\r\n","/**\r\n *@desc\r\n *@author liudejian\r\n *@date 2022-09-19 11:14\r\n **/\r\nexport enum Sex {\r\n //男\r\n MALE = 1,\r\n //女\r\n FEMALE = 2\r\n}\r\nexport enum CommonYn {\r\n //是\r\n YES = 1,\r\n //否\r\n NO = 2\r\n}\r\nexport enum Status {\r\n //启用\r\n ENABLE = 1,\r\n //禁用\r\n DISABLE = 2\r\n}\r\nexport enum LoginType {\r\n //用户名密码+验证码\r\n BASIC = 1,\r\n //令牌\r\n TOKEN = 2,\r\n //手机验证码\r\n MOBILE = 3,\r\n //开放ID\r\n OPENID = 4,\r\n //用户名密码\r\n PASSWORD = 5,\r\n //邮箱\r\n EMAIL=6\r\n}\r\n","/**\r\n *@desc 元信息\r\n *@author liudejian\r\n *@date 2020-03-04 22:37\r\n **/\r\n\r\nexport enum Scope {\r\n //单例\r\n SINGLE = 1,\r\n //多例\r\n PROTOTYPE = 2\r\n}\r\n\r\n/**\r\n * bean定义类元信息\r\n */\r\nexport class BeanDefinition {\r\n //类名\r\n name: string = \"\";\r\n //类构造函数\r\n // @ts-ignore\r\n type: any;\r\n //bean作用域(默认:单例)\r\n scope: Scope = Scope.SINGLE;\r\n //候选标识\r\n qualifier?:string=\"\";\r\n //属性或者方法\r\n fields?: Set<PropertyInfo>;\r\n\r\n\r\n public getPropertySet(): Set<PropertyInfo> {\r\n return this.fields ? this.fields : new Set<PropertyInfo>();\r\n }\r\n\r\n public addProperty(propertyInfo: PropertyInfo): this {\r\n if (this.fields == undefined) {\r\n this.fields = new Set<PropertyInfo>();\r\n }\r\n this.fields.add(propertyInfo);\r\n return this;\r\n }\r\n\r\n public setScope(scope: Scope): this {\r\n this.scope = scope;\r\n return this;\r\n }\r\n\r\n /**\r\n * 构建\r\n * @param name\r\n * @param classConstructor\r\n */\r\n public static build(name: string, classConstructor: any,qualifier?:string): BeanDefinition {\r\n let cm = new BeanDefinition();\r\n cm.name = name;\r\n cm.type = classConstructor;\r\n cm.qualifier = qualifier;\r\n return cm;\r\n }\r\n}\r\n\r\n/**\r\n * 属性信息\r\n */\r\nexport class PropertyInfo {\r\n //名称\r\n name?: string;\r\n //类型\r\n type?: any;\r\n //值\r\n value?: any;\r\n\r\n public static build(name: string, type: any, value: any): PropertyInfo {\r\n let fi = new PropertyInfo();\r\n fi.name = name;\r\n fi.type = type;\r\n fi.value = value;\r\n return fi;\r\n }\r\n}\r\n\r\n/**\r\n * 注册服务源信息\r\n */\r\nexport interface ServiceMeta {\r\n //作用域\r\n scope?: Scope;\r\n //候选标识\r\n qualifier?:string;\r\n}\r\n\r\n/**\r\n * 适配元信息\r\n */\r\nexport interface AutowireMeta{\r\n //候选标识\r\n qualifier?:string;\r\n //注入类的类型\r\n classType?:any;\r\n}\r\n\r\n\r\n","/**\r\n *@desc aop代理工具类\r\n *@author liudejian\r\n *@date 2020-03-20 21:45\r\n **/\r\nimport {MethodHandler} from \"./MethodHandler\";\r\n\r\n/**\r\n * AOP工具类\r\n */\r\nexport class AopUtil {\r\n\r\n\r\n /**\r\n * 创建代理实例\r\n * @param classType 原始类\r\n * @param handler 方法拦截器\r\n * @return 返回原始代理类实例\r\n */\r\n public static createProxyInstance<T>(classType: new () => T, handler: MethodHandler): T {\r\n let ProxyClass = AopUtil.createProxy<T>(classType, handler,undefined);\r\n return new ProxyClass();\r\n }\r\n\r\n /**\r\n * 创建代理\r\n * @param classType 原始类\r\n * @param handler 方法拦截器\r\n * @param excludeMethods 排除的方法名[选填]\r\n * @return 返回代理类\r\n */\r\n public static createProxy<T>(classType: new () => T, handler: MethodHandler,excludeMethods?: Array<string>): new () => T {\r\n let className = classType.name;\r\n let proto = classType.prototype;\r\n let keys = Reflect.ownKeys(proto);\r\n keys.forEach((key) => {\r\n if ('constructor' == key) {\r\n return;\r\n }\r\n //排除无需代理的方法\r\n if (excludeMethods && excludeMethods.length > 0 && excludeMethods.includes(key as string)) {\r\n return;\r\n }\r\n\r\n let descriptor = Reflect.getOwnPropertyDescriptor(proto, key);\r\n if (descriptor) {\r\n let method = descriptor.value;\r\n descriptor.value = function () {\r\n let obj = null;\r\n let args = null;\r\n try {\r\n args = handler.before(method,arguments);\r\n if (!args) {\r\n args = arguments;\r\n }\r\n obj = method.apply(this, args);\r\n handler.after(method,obj, args);\r\n } catch (e) {\r\n handler.exception(method,e);\r\n } finally {\r\n handler.finally(method,obj, args)\r\n }\r\n return obj;\r\n }\r\n }\r\n //重新定义\r\n if (descriptor) {\r\n Reflect.defineProperty(proto, key, descriptor);\r\n }\r\n })\r\n return classType;\r\n\r\n }\r\n\r\n}\r\n","import 'reflect-metadata';\r\n\r\n/**\r\n *@desc\r\n *@author liudejian\r\n *@date 2023-12-24 11:00\r\n **/\r\nexport class ClassUtil {\r\n\r\n /**\r\n * 创建对象实例\r\n * @param cls 类\r\n * @param params 构造参数\r\n */\r\n public static newInstance(cls: any, params: any): any {\r\n return new cls(params);\r\n }\r\n\r\n /**\r\n * 判断一个对象是class 还是 class实例\r\n * @param obj\r\n */\r\n public static isClass(obj: any): boolean {\r\n return Object.getOwnPropertyNames(obj).includes('prototype')\r\n }\r\n\r\n /**\r\n * 获取对象声明字段\r\n * @param cls\r\n */\r\n public static getFields(cls: any): Array<string> {\r\n let cs = new cls();\r\n /* let fields = new Array<string>()\r\n for (const c of Object.keys(cs)) {\r\n fields.push(c);\r\n }\r\n return fields;*/\r\n return Object.getOwnPropertyNames(cs);\r\n }\r\n\r\n /**\r\n * 获取所有 声明方法\r\n * @param cls\r\n */\r\n public static getMethodNames(cls: any): Array<string> {\r\n let ins = new cls();\r\n const prototype = Object.getPrototypeOf(ins);\r\n let methodNames = new Array<string>()\r\n let methods = Reflect.ownKeys(prototype);\r\n for (let i = 0; i < methods.length; i++) {\r\n let methodName = methods[i];\r\n if (methodName != 'constructor') {\r\n methodNames.push(methodName.toString());\r\n }\r\n }\r\n return methodNames;\r\n }\r\n\r\n /**\r\n * 获取所有声明的方法\r\n * @param cls\r\n */\r\n public static getMethods(cls: any): Array<Function> {\r\n let ins = new cls();\r\n let results = new Array<Function>()\r\n const prototype = Object.getPrototypeOf(ins);\r\n let methods = Object.getOwnPropertyDescriptors(prototype);\r\n let keys = Object.keys(methods);\r\n for (let key of keys) {\r\n if (key == 'constructor') {\r\n continue;\r\n }\r\n results.push(methods[key] as Function)\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * 获取方法参数名\r\n * @param method\r\n */\r\n public static getMethodParamNames(method: Function): Array<string> {\r\n const funcStr = method.toString();\r\n // console.log(\"funcStr======\",funcStr)\r\n //xxx(a,b)\r\n const regex = /[a-zA-Z0-9]+\\s*\\w*\\(([\\w\\s,]*)\\)/;\r\n const match = regex.exec(funcStr);\r\n const result = new Array<string>()\r\n if (match && match[1]) {\r\n const paramStr = match[1].trim();\r\n const params = paramStr.split(',').map(param => param.trim());\r\n params.map(param => {\r\n const [name, type] = param.split(':').map(p => p.trim());\r\n result.push(name);\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n\r\n}\r\n","/**\r\n *@desc 通用菜单树\r\n *@author liudejian\r\n *@date 2023-11-25 13:34\r\n **/\r\nexport class CommonMenuTree {\r\n //ID\r\n id?: number;\r\n //PID\r\n pid?: number;\r\n //路由路径\r\n path?: string;\r\n //路由名称\r\n name?: string;\r\n //重定向地址\r\n redirect?: string;\r\n //是否虚拟节点\r\n isVirtual?: boolean;\r\n //层级\r\n level?: number;\r\n //组件路径:example:/views/gc/Test.vue\r\n component?: string;\r\n //排序值\r\n orderNum?: number;\r\n //子节点\r\n children?: Array<CommonMenuTree>;\r\n // 元信息\r\n meta?: Meta;\r\n}\r\n\r\nexport class Meta {\r\n //图标\r\n icon?: string;\r\n //标题\r\n title?: string;\r\n //是否嵌入式\r\n embedded?: boolean;\r\n //是否链接\r\n isLink?: boolean = false;\r\n //是否隐藏\r\n isHide?: boolean = false;\r\n //是否保持存活\r\n isKeepAlive?: boolean = true;\r\n //是否固定\r\n isAffix?: boolean = false;\r\n //是否iframe\r\n isIframe?: boolean = false;\r\n\r\n}","/**\r\n *@desc\r\n *@author liudejian\r\n *@date 2020-04-06 21:54\r\n **/\r\nexport class DictDto {\r\n\r\n\r\n /**\r\n * 名称空间 编码\r\n */\r\n namespace?: string;\r\n\r\n /**\r\n * 应用Code\r\n */\r\n appCode?: string;\r\n /**\r\n * 字典名称(中文)\r\n */\r\n dictName?: string;\r\n\r\n /**\r\n * 字典编码\r\n */\r\n dictCode?: string;\r\n\r\n /**\r\n * 字典枚举详细信息\r\n */\r\n dictDetails?: Array<DictDetailDto>\r\n\r\n}\r\n\r\nexport class DictDetailDto {\r\n /**\r\n * 字典名称中文\r\n */\r\n codeCn?: string;\r\n\r\n /**\r\n * 字典编码英文\r\n */\r\n codeEn?: string;\r\n\r\n /**\r\n * 字典编码\r\n */\r\n code?: number;\r\n\r\n}\r\n","/**\r\n *@desc IOC工具\r\n *@author liudejian\r\n *@date 2020-03-05 16:11\r\n **/\r\nimport {CommonUtil} from \"../../common\";\r\n\r\n\r\nexport class IocUtil {\r\n public static INSTANCE_ID: string = \"_instanceId_\"\r\n\r\n /**\r\n * 为每个实例生成唯一ID\r\n * @param instance\r\n */\r\n public static genInstanceId<T>(instance: any): T {\r\n if (instance) {\r\n instance[IocUtil.INSTANCE_ID] = CommonUtil.genUid(16, 10);\r\n }\r\n return instance;\r\n }\r\n\r\n /**\r\n * 转为数组\r\n * @param values\r\n */\r\n public static convertToArray<T>(values: IterableIterator<T>): Array<T> {\r\n let arrAry = new Array<T>()\r\n if (values) {\r\n let result = values.next();\r\n while (!result.done) {\r\n arrAry.push(result.value);\r\n result = values.next();\r\n }\r\n }\r\n return arrAry;\r\n }\r\n\r\n /**\r\n * 获取类的构造函数\r\n * @param clsBiz\r\n */\r\n public static getConstructor(clsBiz: any): any {\r\n let prototype = null;\r\n if (typeof clsBiz === \"function\") {\r\n prototype = clsBiz.prototype;\r\n } else if (typeof clsBiz === \"object\") {\r\n prototype = Reflect.getPrototypeOf(clsBiz);\r\n } else {\r\n throw new Error(\"not suport type \" + typeof clsBiz)\r\n }\r\n let keys = Reflect.ownKeys(prototype);\r\n for (let key of keys) {\r\n if (key === \"constructor\") {\r\n return prototype[key];\r\n break;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * 包装beanName\r\n * @param classType class\r\n * @param qualifier 候选标识\r\n */\r\n public static wrapBeanName(classType: Function,qualifier?: string):string {\r\n let key = classType.name;\r\n if (qualifier) {\r\n key += qualifier;\r\n }\r\n return key;\r\n }\r\n\r\n /**\r\n * 包装beanName\r\n * @param beanName 原始名称\r\n * @param qualifier 候选标识\r\n */\r\n public static wrapBeanNameByStr(beanName:string,qualifier?: string):string {\r\n let key = beanName;\r\n if (qualifier) {\r\n key += qualifier;\r\n }\r\n return key;\r\n }\r\n}\r\n\r\n\r\n","/**\r\n *@desc bean定义与实例容器\r\n *@author <a href=\"mailto:zuiwoxing@qq.com\">liudejian</a>\r\n *@date 2020-03-05 21:47\r\n **/\r\nimport {BeanDefinition, PropertyInfo, Scope} from \"../model/Meta\";\r\nimport {IocUtil} from \"../util/IocUtil\";\r\nimport {AssertUtil} from \"../../common\";\r\n\r\n\r\nexport class Container {\r\n /**\r\n * 存放实例\r\n * @param key beanNameKey=Object.name+qualifier\r\n * @param value bean实例\r\n */\r\n private BEAN_INSTANCE_MAP = new Map<string, any>();\r\n /**\r\n * 存放bean定义\r\n * @param key beanNameKey=Object.name+qualifier\r\n * @param value ClassMeta\r\n */\r\n private BEAN_DEFINITION_MAP = new Map<string, BeanDefinition>();\r\n\r\n\r\n /**\r\n * 获取所有 bean名称\r\n */\r\n public getBeanNames(): Array<string> {\r\n let aryList = new Array<string>();\r\n for (let [key, beanDef] of this.BEAN_DEFINITION_MAP) {\r\n aryList.push(beanDef.name);\r\n }\r\n return aryList;\r\n }\r\n\r\n /**\r\n * 获取所有bean定义\r\n */\r\n public getBeanDefinitions(): Array<BeanDefinition> {\r\n return IocUtil.convertToArray(this.BEAN_DEFINITION_MAP.values());\r\n }\r\n\r\n /**\r\n * 注册bean定义\r\n * @param beanDefinition\r\n */\r\n public registerBeanDefinition(beanDefinition: BeanDefinition): this {\r\n let key = IocUtil.wrapBeanNameByStr(beanDefinition.name, beanDefinition.qualifier);\r\n this.BEAN_DEFINITION_MAP.set(key, beanDefinition);\r\n return this;\r\n }\r\n\r\n /**\r\n * 获取bean定义\r\n * @param classType class\r\n * @param qualifier 候选标识\r\n */\r\n public getBeanDefinition(classType: Function, qualifier?: string): BeanDefinition {\r\n let key = IocUtil.wrapBeanName(classType, qualifier);\r\n return AssertUtil.wrapNull(this.BEAN_DEFINITION_MAP.get(key));\r\n }\r\n\r\n /**\r\n * 获取bean定义\r\n * @param classType class\r\n * @param qualifier 候选标识\r\n */\r\n public getBeanDefinitionByName(className: string, qualifier?: string): BeanDefinition {\r\n let key = IocUtil.wrapBeanNameByStr(className, qualifier);\r\n return AssertUtil.wrapNull(this.BEAN_DEFINITION_MAP.get(key));\r\n }\r\n\r\n /**\r\n * 是否存在bean定义\r\n * @param classType class\r\n * @param qualifier 候选标识\r\n */\r\n public hasBeanDefinition(classType: Function, qualifier?: string): boolean {\r\n let key = IocUtil.wrapBeanName(classType, qualifier);\r\n return this.BEAN_DEFINITION_MAP.has(key)\r\n }\r\n\r\n\r\n /**\r\n * 注册单例bean\r\n * @param classType class\r\n * @param instance 实例\r\n * @param qualifier 候选标识\r\n */\r\n public registerSingleBean<T>(classType: Function, instance: T, qualifier?: string): this {\r\n let key = IocUtil.wrapBeanName(classType, qualifier);\r\n this.BEAN_INSTANCE_MAP.set(key, instance);\r\n //注册单例bean定义\r\n this.registerBeanDefinition(BeanDefinition.build(classType.name, IocUtil.getConstructor(instance), qualifier))\r\n return this;\r\n }\r\n\r\n /**\r\n * 是否存在 bean\r\n * @param classType class\r\n */\r\n public hasBean<T>(classType: Function, qualifier?: string): boolean {\r\n let key = IocUtil.wrapBeanName(classType, qualifier);\r\n return this.BEAN_INSTANCE_MAP.has(key);\r\n }\r\n\r\n /**\r\n * 获取单例bean\r\n * @param classType class\r\n */\r\n public getSingleBean<T>(classType: Function, qualifier?: string): T {\r\n let key = IocUtil.wrapBeanName(classType, qualifier);\r\n //console.log(\"key==\",key,this.BEAN_INSTANCE_MAP)\r\n return this.BEAN_INSTANCE_MAP.get(key);\r\n }\r\n\r\n /**\r\n * 获取单例bean\r\n * @param classType class\r\n */\r\n public getSingleBeanByName<T>(className: string, qualifier?: string): T {\r\n let key = IocUtil.wrapBeanNameByStr(className, qualifier);\r\n return this.BEAN_INSTANCE_MAP.get(key);\r\n }\r\n\r\n\r\n /**\r\n * 根据bean类型获取所有bean信息,不能自动创建bean\r\n * @param classType\r\n */\r\n public getBeansByType<T>(classType: new () => T): Array<any> {\r\n let beans = new Array<any>()\r\n for (let [key, beanDef] of this.BEAN_DEFINITION_MAP) {\r\n if (beanDef.type instanceof classType) {\r\n let bean = this.BEAN_INSTANCE_MAP.get(key);\r\n if (bean) {\r\n beans.push(bean);\r\n }\r\n }\r\n }\r\n return beans;\r\n }\r\n\r\n /**\r\n * 根据bean的名称获取其下所有bean\r\n * @param beanName\r\n */\r\n public getBeansByName<T>(beanName:string): Array<any> {\r\n let beans = new Array<any>()\r\n for (let [key, beanDef] of this.BEAN_DEFINITION_MAP) {\r\n if (beanDef.name === beanName) {\r\n let bean = this.BEAN_INSTANCE_MAP.get(key);\r\n if (bean) {\r\n beans.push(bean);\r\n }\r\n }\r\n }\r\n return beans;\r\n }\r\n\r\n /**\r\n * 根据bean名称获取[如果不存在则自动创建]\r\n * @param className\r\n * @param qualifier\r\n */\r\n public getBeanByName<T>(className: string, qualifier?: string): any {\r\n //获取当前类全局meta信息\r\n let res = this.getSingleBeanByName(className, qualifier)\r\n //bean定义\r\n let beanDefinition = this.getBeanDefinitionByName(className, qualifier);\r\n //[1]如果存在就直接返回\r\n if (res) {\r\n if (Scope.SINGLE == beanDefinition.scope) {\r\n this.recursionSetProperty(res, beanDefinition)\r\n return res;\r\n } else if (Scope.PROTOTYPE == beanDefinition.scope) {\r\n let serviceType = beanDefinition.type;\r\n let instance = IocUtil.genInstanceId(new serviceType());\r\n this.recursionSetProperty(instance, beanDefinition)\r\n return instance;\r\n }\r\n return res;\r\n }\r\n if (beanDefinition === null || beanDefinition === undefined) {\r\n return null;\r\n }\r\n //验证bean定义不能为空\r\n let classType = beanDefinition.type;\r\n //[2]如果不存在就直接创建\r\n let beanInstance = IocUtil.genInstanceId(new classType());\r\n //初始化时,默认单例\r\n beanDefinition = BeanDefinition.build(classType.name, classType, qualifier);\r\n this.registerBeanDefinition(beanDefinition);\r\n this.registerSingleBean(classType, beanInstance, qualifier);\r\n return beanInstance;\r\n }\r\n\r\n /**\r\n * 获取bean实例(单例|多例)[如果不存在则自动创建]\r\n * @param classType class\r\n */\r\n public getBean<T>(classType: new () => T, qualifier?: string): any {\r\n //获取当前类全局meta信息\r\n // console.log(\"classType======\", classType.name, qualifier)\r\n let res = this.getSingleBean(classType, qualifier)\r\n //bean定义\r\n let beanDefinition = this.getBeanDefinition(classType, qualifier);\r\n // console.log(\"res======\", beanDefinition, res)\r\n //[1]如果存在就直接返回\r\n if (res) {\r\n if (Scope.SINGLE == beanDefinition.scope) {\r\n this.recursionSetProperty(res, beanDefinition)\r\n return res;\r\n } else if (Scope.PROTOTYPE == beanDefinition.scope) {\r\n let serviceType = beanDefinition.type;\r\n let instance = IocUtil.genInstanceId(new serviceType());\r\n this.recursionSetProperty(instance, beanDefinition)\r\n return instance;\r\n }\r\n return res;\r\n }\r\n // let cm: ClassMeta = Reflect.getOwnMetadata(CLASS_META_KEY, clsConstructor, CLASS_PROP_KEY);\r\n // console.log(\"cm==========\",cm)\r\n //[2]如果不存在就直接创建\r\n let beanInstance = IocUtil.genInstanceId(new classType());\r\n //初始化时,默认单例\r\n beanDefinition = BeanDefinition.build(classType.name, classType, qualifier);\r\n this.registerBeanDefinition(beanDefinition);\r\n this.registerSingleBean(classType, beanInstance, qualifier);\r\n return beanInstance;\r\n }\r\n\r\n\r\n /**\r\n * 递归设置属性\r\n * @param parentInstance\r\n * @param parentClassMeta\r\n */\r\n private recursionSetProperty(parentInstance: any, parentBeanDefinition: BeanDefinition) {\r\n let fields = parentBeanDefinition.getPropertySet();\r\n let values = fields.values();\r\n let result = values.next();\r\n while (!result.done) {\r\n let fieldInfo = result.value as PropertyInfo;\r\n let fieldType = fieldInfo.type;\r\n let fieldName = fieldInfo.name || \"\";\r\n // console.log(\"fieldType======\", fieldType)\r\n let fieldCm = this.getBeanDefinition(fieldType);\r\n // console.log(\"fieldCm======\", fieldCm)\r\n if (Scope.SINGLE === fieldCm.scope) {\r\n parentInstance[fieldName] = fieldInfo.value;\r\n } else if (Scope.PROTOTYPE === fieldCm.scope) {\r\n let currentInstance = IocUtil.genInstanceId(new fieldType());\r\n parentInstance[fieldName] = currentInstance;\r\n this.recursionSetProperty(currentInstance, fieldCm);\r\n }\r\n result = values.next();\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n","/**\r\n *@desc 应用上下文\r\n *@author liudejian\r\n *@date 2020-03-05 21:40\r\n **/\r\nimport {Container} from \"./Container\";\r\nimport {IocUtil} from \"../util/IocUtil\";\r\nimport {BeanDefinition} from \"/@/ioc\";\r\n\r\n/**\r\n * 存放容器\r\n */\r\nconst IOC_CONTAINER_MAP = new Map<string, Container>();\r\n\r\n/**\r\n * 应用上下文\r\n */\r\nexport class IocContext {\r\n\r\n private static DEFAULT_KEY: string = \"default\";\r\n\r\n /**\r\n * 获取默认容器\r\n */\r\n public static get(): Container {\r\n let container = IOC_CONTAINER_MAP.get(this.DEFAULT_KEY)\r\n if (!container) {\r\n container = IocUtil.genInstanceId<Container>(new Container());\r\n IOC_CONTAINER_MAP.set(this.DEFAULT_KEY, container);\r\n }\r\n return container;\r\n }\r\n\r\n /**\r\n * 根据名称获取容器\r\n * @param name\r\n */\r\n public static getContainer(name: string): Container | undefined {\r\n return IOC_CONTAINER_MAP.get(name)\r\n }\r\n\r\n /**\r\n * 创建一个容器\r\n * @param name\r\n */\r\n public static createContainer(name: string): void {\r\n let container = IocUtil.genInstanceId<Container>(new Container());\r\n IOC_CONTAINER_MAP.set(name, container)\r\n }\r\n\r\n /**\r\n * 获取bean实例\r\n * @param classType bean类型\r\n * @param qualifier 候选标识\r\n */\r\n public static getBean<T>(classType: any, qualifier?: string): T {\r\n return this.get().getBean<T>(classType, qualifier);\r\n }\r\n\r\n /**\r\n * 根据bean名称获取bean 实例\r\n * @param className bean名称\r\n * @param qualifier 候选标识\r\n */\r\n public static getBeanByName<T>(className: string, qualifier?: string): T {\r\n return this.get().getBeanByName<T>(className, qualifier);\r\n }\r\n\r\n /**\r\n * 根据类型获取所有 bean\r\n * @param classType\r\n */\r\n public static getBeansByType<T>(classType: any): Array<T> {\r\n return this.get().getBeansByType<T>(classType);\r\n }\r\n\r\n /**\r\n * 根据名称获取所有bean\r\n * @param className\r\n */\r\n public static getBeansByName<T>(className: string): Array<T> {\r\n return this.get().getBeansByName<T>(className);\r\n }\r\n\r\n /**\r\n * 注册bean定义\r\n * @param beanDefinition bean定义\r\n */\r\n public static registerBeanDefinition(beanDefinition: BeanDefinition): Container {\r\n return this.get().registerBeanDefinition(beanDefinition);\r\n }\r\n\r\n /**\r\n * 注册单例bean\r\n * @param classType class\r\n * @param instance 实例\r\n * @param qualifier 候选标识\r\n */\r\n public static registerSingleBean(classType: Function, instance: any, qualifier?: string):Container {\r\n return this.get().registerSingleBean(classType, instance, qualifier);\r\n }\r\n}\r\n","import {IocUtil} from \"./IocUtil\";\r\nimport {IocContext} from \"../common/IocContext\";\r\nimport {Scope,BeanDefinition,AutowireMeta, PropertyInfo, ServiceMeta} from \"../model/Meta\";\r\n\r\nexport const CLASS_META_KEY = Symbol(\"class_meta_key\");\r\nexport const CLASS_PROP_KEY = Symbol(\"class_prop_key\");\r\n\r\n/**\r\n *@desc\r\n *@author liudejian\r\n *@date 2025-11-15 10:14\r\n **/\r\nexport class IocDecoratorUtil {\r\n\r\n /**\r\n * 通过类注释,将类自动注册为服务\r\n * @param constructor 构造函数\r\n * @param sm service元信息\r\n */\r\n public static autoService(constructor: any, sm:ServiceMeta) {\r\n let name = constructor.name;\r\n let meta = new BeanDefinition()\r\n meta.name = name;\r\n meta.scope = sm.scope ? sm.scope : Scope.SINGLE;\r\n meta.type = constructor;\r\n meta.qualifier = sm.qualifier;\r\n //【1】将类元信息,定义为当前类原型链-全局属性\r\n Reflect.defineMetadata(CLASS_META_KEY, meta, constructor.prototype, CLASS_PROP_KEY);\r\n //【1.1】获取默认容器\r\n let defaultContainer = IocContext.get();\r\n //【2】 将meta信息中的scope 重新覆盖为类定义的范围\r\n if (defaultContainer.hasBeanDefinition(meta.type, meta.qualifier)) {\r\n let existMeta = defaultContainer.getBeanDefinition(meta.type, meta.qualifier);\r\n //覆盖范围,以注注释的范围为准\r\n existMeta.scope = meta.scope;\r\n } else {\r\n defaultContainer.registerBeanDefinition(meta);\r\n }\r\n //【3】如果容器中没有当前类实例,则自动注册\r\n if (!defaultContainer.hasBean(meta.type, meta.qualifier)) {\r\n let instance = IocUtil.genInstanceId(new constructor());\r\n defaultContainer.registerSingleBean(meta.type, instance, meta.qualifier)\r\n }\r\n }\r\n\r\n /**\r\n * 自动注入\r\n * @param targetClas 目标类\r\n * @param fieldName 参数名\r\n * @param meta 注入元信息\r\n */\r\n public static autowired(targetClas: any, fieldName: string,meta:AutowireMeta) {\r\n let descClassConstructor = targetClas.constructor;\r\n //【1】获取该类中,声明的属性类型\r\n let autowiredServiceCls = Reflect.getMetadata('design:type', targetClas, fieldName);\r\n if (autowiredServiceCls == undefined && meta?.classType) {\r\n autowiredServiceCls = meta.classType;\r\n }\r\n if (autowiredServiceCls == undefined) {\r\n //throw new Error(fieldName+\" does't exist!\")\r\n console.error(fieldName + \" does't exist property!\")\r\n console.log(Object.keys(targetClas))\r\n console.log(Object.keys(descClassConstructor))\r\n return;\r\n }\r\n //获取默认容器\r\n let defaultContainer = IocContext.get();\r\n //【1.1】 构建注入类【定义】\r\n let autowiredCm = BeanDefinition.build(autowiredServiceCls.name, autowiredServiceCls)\r\n autowiredCm.qualifier = meta ? (meta.qualifier ? meta.qualifier : \"\") : \"\"\r\n //【1.2】检查容器中是否存在该类元信息,不存在就注册\r\n if (!defaultContainer.hasBeanDefinition(autowiredServiceCls,autowiredCm.qualifier)) {\r\n autowiredCm.qualifier = autowiredCm.qualifier;\r\n defaultContainer.registerBeanDefinition(autowiredCm);\r\n }\r\n //【2】检查容器中是否存在autowired的【实例】\r\n let autoInstance = null;\r\n //bean 名称\r\n let beanName = autowiredServiceCls.name;\r\n //【2.1】 检查容器中是否存在自动注入的实例\r\n if (!defaultContainer.hasBean(beanName,autowiredCm.qualifier)) {\r\n autoInstance = IocUtil.genInstanceId(new autowiredServiceCls())\r\n defaultContainer.registerSingleBean(autowiredServiceCls, autoInstance,autowiredCm.qualifier);\r\n } else {\r\n autoInstance = defaultContainer.getSingleBean(autowiredServiceCls,autowiredCm.qualifier);\r\n }\r\n //【3】获取当前声明类实例(如果不存在将自动创建声明类实例)\r\n let parentService = defaultContainer.getBean(descClassConstructor,autowiredCm.qualifier) as any;\r\n //【4】将自动注入实例赋值给声明类的对应属性\r\n parentService[fieldName] = autoInstance;\r\n //【4.1】重新覆盖类实例\r\n defaultContainer.registerSingleBean(descClassConstructor.name, parentService,autowiredCm.qualifier);\r\n //【5】 获取声明类 BeanDefinitaion信息\r\n let beanDefinition = defaultContainer.getBeanDefinition(descClassConstructor,autowiredCm.qualifier);\r\n if (beanDefinition) {\r\n beanDefinition.addProperty(PropertyInfo.build(fieldName, autowiredServiceCls, autoInstance))\r\n beanDefinition.qualifier = autowiredCm.qualifier;\r\n //【5.1】 重新覆盖bean定义信息\r\n defaultContainer.registerBeanDefinition(beanDefinition);\r\n }\r\n }\r\n}\r\n","/**\r\n *@desc\r\n *@author liudejian\r\n *@date 2020-03-12 21:17\r\n **/\r\nimport 'reflect-metadata';\r\nimport {AutowireMeta, ServiceMeta} from \"../model/Meta\";\r\nimport {IocDecoratorUtil} from \"../util/IocDecoratorUtil\";\r\n\r\n\r\n/**\r\n * 服务\r\n * @param sm\r\n * @constructor\r\n */\r\nexport function Service(sm: ServiceMeta = {}): ClassDecorator {\r\n return (constructor: any) => {\r\n return IocDecoratorUtil.autoService(constructor, sm);\r\n }\r\n}\r\n\r\n/**\r\n * 自动注入\r\n * @param am\r\n * @constructor\r\n */\r\nexport function Autowired(meta: AutowireMeta = {}): PropertyDecorator {\r\n // @ts-ignore\r\n return (targetClas: any, fieldName: string) => {\r\n return IocDecoratorUtil.autowired(targetClas, fieldName, meta);\r\n }\r\n}\r\n\r\n\r\n","import \"reflect-metadata\";\r\nimport {CommonUtil} from \"../common\";\r\n\r\n\r\n/**\r\n * 日志级别\r\n */\r\nexport enum Level {\r\n DEBUG = 0,\r\n TRACE = 1,\r\n WARN = 2,\r\n INFO = 3,\r\n ERROR = 4,\r\n}\r\n\r\nexport function getLevelName(index: number): string {\r\n switch (index) {\r\n case 0:\r\n return \"DEBUG\"\r\n case 1:\r\n return \"TRACE\"\r\n case 2:\r\n return \"WARN\"\r\n case 3:\r\n return \"INFO\"\r\n case 4:\r\n return \"ERROR\"\r\n default:\r\n return \"INFO\"\r\n }\r\n\r\n}\r\n\r\n/**\r\n *@desc 日志类\r\n *@author liudejian\r\n *@date 2020-02-27 12:05\r\n **/\r\nexport class Logger {\r\n /**\r\n * 日志模板\r\n * @private\r\n */\r\n // private category: string = \"{time} {level} {module} {msg}\";\r\n public static ENABLE: boolean = true;\r\n\r\n /**\r\n * 默认info级别\r\n * @private\r\n */\r\n private static LEVEL: number = Level.INFO;\r\n\r\n /**\r\n * 启用日志\r\n */\r\n public static enable() {\r\n Logger.ENABLE = true\r\n }\r\n\r\n /**\r\n * 禁用日志\r\n */\r\n public static disable() {\r\n Logger.ENABLE = false;\r\n }\r\n\r\n /**\r\n * 获取日志级别\r\n */\r\n public static getLevel(): Level {\r\n return Logger.LEVEL;\r\n }\r\n\r\n /**\r\n * 设置日志级别\r\n * @param level\r\n */\r\n public static setLevel(level: Level) {\r\n Logger.LEVEL = level;\r\n }\r\n\r\n /**\r\n * 模块名class类\r\n * @private\r\n */\r\n private classModule?: any;\r\n\r\n /**\r\n * 当前类名\r\n * @private\r\n */\r\n private className?: string;\r\n\r\n /**\r\n * 当前类原型\r\n * @private\r\n */\r\n private classProto?: any;\r\n\r\n private static CURRENT_METHOD_NAME = Symbol(\"currentMethodName\")\r\n private static CURRENT_METHOD_NAME_KEY = Symbol(\"currentMethodNameKey\")\r\n\r\n /**\r\n * 获取日志类\r\n * @param classModule typescript 类\r\n */\r\n public static getLogger(classModule: any): Logger {\r\n let logger = new Logger();\r\n logger.classModule = classModule;\r\n logger.className = classModule.name;\r\n logger.classProto = classModule.prototype;\r\n Logger.redefineClass(logger.classModule);\r\n return logger;\r\n }\r\n\r\n /**\r\n * 重新定义类\r\n * @param classModule\r\n */\r\n private static redefineClass(classModule: any) {\r\n let proto = classModule.prototype;\r\n //es5以及以前可以\r\n //let keys = Object.keys(proto);\r\n //es5以后使用些方式获取\r\n let keys = Reflect.ownKeys(proto);\r\n let currentMethodName = this.CURRENT_METHOD_NAME;\r\n let currentMthoeNameKey = this.CURRENT_METHOD_NAME_KEY\r\n keys.forEach((key, index, ary) => {\r\n if ('constructor' != key) {\r\n let method = proto[key];\r\n if (typeof method == 'function') {\r\n let descriptor = Reflect.getOwnPropertyDescriptor(proto, key);\r\n method = descriptor?.value;\r\n // @ts-ignore\r\n descriptor.value = function () {\r\n try {\r\n Reflect.defineMetadata(currentMethodName, key, proto, currentMthoeNameKey);\r\n //obj = Reflect.apply(method,this, arguments);\r\n return method?.apply(this, arguments)\r\n } finally {\r\n Reflect.deleteMetadata(currentMethodName, proto)\r\n }\r\n }\r\n if (descriptor) {\r\n Reflect.defineProperty(proto, key, descriptor);\r\n }\r\n }\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 给日志增加前缀\r\n * @param template 原日志模板\r\n * @param level 日志级别\r\n * @private\r\n */\r\n private addPrefix(template: any, level: Level) {\r\n if (typeof template == 'object') {\r\n template = JSON.stringify(template);\r\n }\r\n let currentMethodName = Logger.CURRENT_METHOD_NAME;\r\n let currentMthoeNameKey = Logger.CURRENT_METHOD_NAME_KEY\r\n let currentMethod = Reflect.getOwnMetadata(currentMethodName, this.classProto, currentMthoeNameKey);\r\n let methodStr = \"\";\r\n if (currentMethod != undefined) {\r\n methodStr = \".\" + currentMethod;\r\n }\r\n\r\n let prefix = CommonUtil.dateFormat(new Date()) + \"|\" + getLevelName(level) + \"|\" + this.className + methodStr\r\n return prefix + \" \" + template;\r\n }\r\n\r\n /**\r\n * 格式化字符串\r\n * @param template\r\n * @param val\r\n * @constructor\r\n */\r\n public formatString(template: any, ...args: any): string {\r\n if (typeof template == 'object') {\r\n return JSON.stringify(template);\r\n }\r\n if (args) {\r\n let params = args[0] || [];\r\n for (let index = 0; index < params.length; index++) {\r\n let value = params[index];\r\n if (typeof value == 'object') {\r\n value = JSON.stringify(value);\r\n }\r\n template = template.replace(`{${index}}`, value);\r\n template = template.replace(`{}`, value);\r\n }\r\n }\r\n return template;\r\n }\r\n\r\n /**\r\n * info信息\r\n * @param message\r\n * @param args\r\n */\r\n public info(message: any, ...args: any): void {\r\n if (!Logger.ENABLE) {\r\n return;\r\n }\r\n if (Logger.LEVEL > Level.INFO) {\r\n return;\r\n }\r\n let data = this.formatString(message, args)\r\n data = this.addPrefix(data, Level.INFO)\r\n console.log(data);\r\n }\r\n\r\n /**\r\n * error\r\n * @param message\r\n * @param args\r\n */\r\n public error(message: any, ...args: any): void {\r\n if (!Logger.ENABLE) {\r\n return;\r\n }\r\n if (Logger.LEVEL > Level.ERROR) {\r\n return;\r\n }\r\n let data = this.formatString(message, args)\r\n data = this.addPrefix(data, Level.ERROR)\r\n console.error(data);\r\n }\r\n\r\n /**\r\n * debug\r\n * @param message\r\n * @param args\r\n */\r\n public debug(message: any, ...args: any): void {\r\n if (!Logger.ENABLE) {\r\n return;\r\n }\r\n if (Logger.LEVEL > Level.DEBUG) {\r\n return;\r\n }\r\n let data = this.formatString(message, args)\r\n data = this.addPrefix(data, Level.DEBUG)\r\n console.debug(data);\r\n }\r\n\r\n /**\r\n * trace\r\n * @param message\r\n * @param args\r\n */\r\n public trace(message: any, ...args: any): void {\r\n if (!Logger.ENABLE) {\r\n return;\r\n }\r\n if (Logger.LEVEL > Level.TRACE) {\r\n return;\r\n }\r\n let data = this.formatString(message, args)\r\n data = this.addPrefix(data, Level.TRACE)\r\n console.trace(data);\r\n }\r\n\r\n /**\r\n * warn\r\n * @param message\r\n * @param args\r\n */\r\n public warn(message: any, ...args: any): void {\r\n if (!Logger.ENABLE) {\r\n return;\r\n }\r\n if (Logger.LEVEL > Level.WARN) {\r\n return;\r\n }\r\n let data = this.formatString(message, args)\r\n data = this.addPrefix(data, Level.WARN)\r\n console.warn(data);\r\n }\r\n}\r\n","import CryptoJS from 'crypto-js';\r\n\r\n\r\n/**\r\n *@desc\r\n *@author liudejian\r\n *@date 2025-09-14 17:14\r\n **/\r\nexport class AesUtil {\r\n /**\r\n * AES-128:128位(16字节)\r\n * AES-192:192位(24字节)\r\n * AES-256:256位(32字节)\r\n * 密钥长度越长,破解难度越大(如AES-256的安全性高于AES-128)\r\n */\r\n\r\n public static readonly VITE_GLOB_DEFAULT_KEY = '13k86xyzd5r62425'\r\n /**\r\n * IV(初始化向量):增强加密随机性的关键参数,与KEY不同,IV不需要保密,但必须唯一\r\n * IV的长度必须与AES的 块大小一致(128位/16字节)。这是因为AES是分组加密算法,每次处理16字节的数据块,IV需匹配块大小才能正确发挥作用\r\n */\r\n public static readonly VITE_GLOB_DEFAULT_IV = '9zo45lq09q1p8865'\r\n\r\n public static readonly DEFAULT_KEY = CryptoJS.enc.Latin1.parse(AesUtil.VITE_GLOB_DEFAULT_KEY);\r\n public static readonly DEFAULT_IV = CryptoJS.enc.Latin1.parse(AesUtil.VITE_GLOB_DEFAULT_IV);\r\n\r\n /**\r\n * 加密数据\r\n * @param data 待加密数据\r\n * @param secretKey 加密KEY\r\n * @param iv 初始化向量\r\n */\r\n public static encrypt(data: string, secretKey?: string, iv?: string) {\r\n let KEY = AesUtil.DEFAULT_KEY;\r\n let IV = AesUtil.DEFAULT_IV;\r\n if (secretKey) {\r\n KEY = CryptoJS.enc.Latin1.parse(secretKey);\r\n }\r\n if (iv) {\r\n IV = CryptoJS.enc.Latin1.parse(iv);\r\n }\r\n return CryptoJS.AES.encrypt(data, KEY, {\r\n iv: IV,\r\n mode: CryptoJS.mode.CBC,\r\n padding: CryptoJS.pad.ZeroPadding\r\n }).toString();\r\n }\r\n\r\n\r\n /**\r\n * 解密数据\r\n * @param encDta 待解密数据\r\n * @param secretKey 解密kEY\r\n * @param iv 初始化向量\r\n */\r\n public static decrypt(encDta: string, secretKey?: string, iv?: string) {\r\n let KEY = AesUtil.DEFAULT_KEY;\r\n let IV = AesUtil.DEFAULT_IV;\r\n if (secretKey) {\r\n KEY = CryptoJS.enc.Latin1.parse(secretKey);\r\n }\r\n if (iv) {\r\n IV = CryptoJS.enc.Latin1.parse(iv);\r\n }\r\n const decrypted = CryptoJS.AES.decrypt(encDta, KEY, {iv: IV, padding: CryptoJS.pad.ZeroPadding});\r\n return decrypted.toString(CryptoJS.enc.Utf8);\r\n }\r\n}\r\n\r\n","import CryptoJS from 'crypto-js';\r\n\r\n\r\n/**\r\n * 【弃用】--安全系数低\r\n * @deprecated 安全系数低\r\n *@desc DES基本被淘汰,安全程度入不AES\r\n *@author liudejian\r\n *@date 2025-09-14 17:14\r\n **/\r\nexport class DesUtil {\r\n /**\r\n * AES-128:128位(16字节)\r\n * AES-192:192位(24字节)\r\n * AES-256:256位(32字节)\r\n * 密钥长度越长,破解难度越大(如AES-256的安全性高于AES-128)\r\n */\r\n public static readonly VITE_GLOB_DEFAULT_KEY = '13k86xyzd5r62425'\r\n /**\r\n * IV(初始化向量):增强加密随机性的关键参数,与KEY不同,IV不需要保密,但必须唯一\r\n * IV的长度必须与AES的 块大小一致(128位/16字节)。这是因为AES是分组加密算法,每次处理16字节的数据块,IV需匹配块大小才能正确发挥作用\r\n */\r\n public static readonly VITE_GLOB_DEFAULT_IV = '9zo45lq09q1p8865'\r\n\r\n public static readonly DEFAULT_KEY = CryptoJS.enc.Latin1.parse(DesUtil.VITE_GLOB_DEFAULT_KEY);\r\n public static readonly DEFAULT_IV = CryptoJS.enc.Latin1.parse(DesUtil.VITE_GLOB_DEFAULT_IV);\r\n\r\n /**\r\n * 加密数据\r\n * @param data 待加密数据\r\n * @param secretKey 加密KEY\r\n * @param iv 初始化向量\r\n */\r\n public static encrypt(data: string, secretKey?: string, iv?: string) {\r\n let KEY = DesUtil.DEFAULT_KEY;\r\n let IV = DesUtil.DEFAULT_IV;\r\n if (secretKey) {\r\n KEY = CryptoJS.enc.Latin1.parse(secretKey);\r\n }\r\n if (iv) {\r\n IV = CryptoJS.enc.Latin1.parse(iv);\r\n }\r\n\r\n return CryptoJS.DES.encrypt(data, KEY, {\r\n iv: IV,\r\n mode: CryptoJS.mode.CBC,\r\n padding: CryptoJS.pad.ZeroPadding\r\n }).toString();\r\n }\r\n\r\n\r\n /**\r\n * 解密数据\r\n * @param encDta 待解密数据\r\n * @param secretKey 解密kEY\r\n * @param iv 初始化向量\r\n */\r\n public static decrypt(encDta: string, secretKey?: string, iv?: string) {\r\n let KEY = DesUtil.DEFAULT_KEY;\r\n let IV = DesUtil.DEFAULT_IV;\r\n if (secretKey) {\r\n KEY = CryptoJS.enc.Latin1.parse(secretKey);\r\n }\r\n if (iv) {\r\n IV = CryptoJS.enc.Latin1.parse(iv);\r\n }\r\n const decrypted = CryptoJS.DES.decrypt(encDta, KEY, {iv: IV, padding: CryptoJS.pad.ZeroPadding});\r\n return decrypted.toString(CryptoJS.enc.Utf8);\r\n }\r\n}\r\n\r\n\r\n","import CryptoJS from 'crypto-js';\r\n/**\r\n * 【弃用】--安全系数低\r\n * @deprecated 安全系数低\r\n * RC4因高效、轻量,适合资源受限且对安全性要求较低的场景:\r\n * RC4已被国际密码学界【弃用】:2015年RFC 7465明确禁止在TLS中使用RC4;2020年NIST建议停止使用RC4,因其漏洞易被利用(如捕获少量密文即可恢复密钥)\r\n *@desc\r\n *@author liudejian\r\n *@date 2025-09-14 17:44\r\n **/\r\nexport class Rc4Util {\r\n\r\n public static readonly DEFAULT_KEY = \"b66a46f80fb114aef5240eec328bfe3c\";\r\n\r\n /**\r\n * 加密数据\r\n * @param data\r\n * @param secretKey\r\n */\r\n public static encrypt(data:string,secretKey?:string) :string{\r\n if (!secretKey) {\r\n secretKey = Rc4Util.DEFAULT_KEY;\r\n }\r\n const encrypted = CryptoJS.RC4.encrypt(data, secretKey);\r\n return encrypted.toString();\r\n }\r\n\r\n /**\r\n * 解密数据\r\n * @param encData\r\n * @param secretKey\r\n */\r\n public static decrypt(encData:string,secretKey?:string):string {\r\n if (!secretKey) {\r\n secretKey = Rc4Util.DEFAULT_KEY;\r\n }\r\n const decryptData = CryptoJS.RC4.decrypt(encData, secretKey);\r\n return decryptData.toString(CryptoJS.enc.Utf8);\r\n }\r\n}\r\n\r\n\r\n\r\n","/**\r\n *@desc\r\n *@author liudejian\r\n *@date 2025-09-14 21:45\r\n **/\r\nexport class RsaKey {\r\n privateKey: string;\r\n publicKey: string;\r\n compressedPublicKey?: string;\r\n\r\n public static of(privateKey: string, publicKey: string, compressedPublicKey?: string): RsaKey {\r\n return {\r\n privateKey: privateKey,\r\n publicKey: publicKey,\r\n compressedPublicKey: compressedPublicKey\r\n } as RsaKey;\r\n }\r\n}\r\n\r\nexport interface SignaturePoint {\r\n k: bigint;\r\n x1: bigint;\r\n}\r\n\r\nexport interface Sm2Option {\r\n pointPool?: SignaturePoint[];\r\n der?: boolean;\r\n hash?: boolean;\r\n publicKey?: string;\r\n userId?: string;\r\n}\r\n\r\nexport interface SM4Options {\r\n padding?: 'pkcs#7' | 'pkcs#5' | 'none' | null;\r\n mode?: 'cbc' | 'ecb' | 'gcm';\r\n iv?: Uint8Array<ArrayBufferLike> | string;\r\n output?: 'string' | 'array';\r\n associatedData?: Uint8Array<ArrayBufferLike> | string;\r\n outputTag?: boolean;\r\n tag?: Uint8Array<ArrayBufferLike> | string;\r\n}\r\n","import jsr from \"jsrsasign\";\r\nimport {RsaKey} from \"../model\";\r\nimport KEYUTIL = jsr.KEYUTIL;\r\nimport RSAKey = jsr.RSAKey;\r\nimport KJUR = jsr.KJUR;\r\n\r\n\r\nexport type Curve = \"secp256r1\" | \"secp256k1\" | \"secp384r1\";\r\nexport type RSAHashAlg =\r\n \"sha1\"\r\n | \"sha256\"\r\n | \"sha512\"\r\n | \"md5\"\r\n | \"ripemd-160\"\r\n | \"sha1withrsa\"\r\n | \"sha256withrsa\"\r\n | \"sha512withrsa\";\r\n\r\n/**\r\n * 来源:cryptojs/jsrsa\r\n */\r\nexport type CryptoHashAlg =\r\n \"MD5withRSA\"\r\n | \"SHA1withRSA\"\r\n | \"SHA224withRSA\"\r\n | \"SHA256withRSA\"\r\n | \"SHA384withRSA\"\r\n | \"SHA512withRSA\"\r\n | \"RIPEMD160withRSA\"\r\n | \"MD5withECDSA\"\r\n | \"SHA1withECDSA\"\r\n | \"SHA224withECDSA\"\r\n | \"SHA256withECDSA\"\r\n | \"SHA384withECDSA\"\r\n | \"SHA512withECDSA\"\r\n | \"RIPEMD160withECDSA\"\r\n | \"MD5withRSAandMGF1\"\r\n | \"SHAwithRSAandMGF1\"\r\n | \"SHA1withRSAandMGF1\"\r\n | \"SHA224withRSAandMGF1\"\r\n | \"SHA256withRSAandMGF1\"\r\n | \"SHA384withRSAandMGF1\"\r\n | \"SHA512withRSAandMGF1\"\r\n | \"RIPEMD160withRSAandMGF1\"\r\n | \"SHA1withDSA\"\r\n | \"SHA224withDSA\"\r\n | \"SHA256withDSA\";\r\n\r\n\r\n/**\r\n * 使用说明:\r\n * 1. ECDSA的核心是数字签名:ECDSA用于验证消息的完整性和发送方身份,而非加密大量数据。若需加密数据,\r\n * 应使用对称加密(如AES)+ 非对称加密(如RSA)的组合(如RSA-OAEP用于加密AES密钥,AES用于加密数据)。\r\n * 2. 密钥管理:私钥必须严格保密,公钥可公开分发。私钥泄露会导致签名伪造风险。\r\n * 3. 曲线选择:ECDSA的曲线类型(如secp256r1、secp384r1)影响安全性与性能,secp256r1是目前最常用的平衡选择。\r\n *\r\n *@desc RSA工具【目前@types/jsrsasign=10.5.15 与 jsrsasign=11.1.0 版本 不完全适配,\r\n * 例如:encrypt 与 decrypt 不兼容,加密与解密使用jsencrypt替代】\r\n *@author liudejian\r\n *@date 2020-06-26 20:56\r\n **/\r\nexport class RsaUtil {\r\n\r\n private static RSA_PRIVATE_KEY = \"-----BEGIN RSA PRIVATE KEY-----\\n\" +\r\n \"MIICXQIBAAKBgQDjnqokLXzkRl/dMNieoV8xIEjPjkiyCg1ll0qsLhCRadgbp5nJ\\n\" +\r\n \"dGRlBrkg5HLfWEyZ6c3mDe0LRlPecomrmGK5TL1ry3YTlKtfAxz+W/yTrDHLIe/w\\n\" +\r\n \"dGL8GGx4x3j5HB4bxCXaOowNmE12oZahn00R+K6YaJFJw5buOGz7p0YOGQIDAQAB\\n\" +\r\n \"AoGBAIkwfEPJ1tiPQgBDDIyvnnwxhTD0BQSp4mE0yqD0MrAyJzqjzaEKMehiIPqe\\n\" +\r\n \"Nk4/Hgw2Sw85nYGKJcqRJkDyW61IPbqKBc5aNiO+7oIEM6n9rXhXuilfSExSFAYA\\n\" +\r\n \"90pSRoQUW3BmZKne5AQj9sjwKfYrCoikpU1dCBKdLF8ydUoBAkEA/Ag8Aw8onDeS\\n\" +\r\n \"qxG1Jj8IjkM7tt3FTlbXDkGCfh5RQMi8S27SZDpqqUIw0P9kR8498wp6FXksTjqW\\n\" +\r\n \"ujhOTMciaQJBAOc0CnrPIU6liKY3Zw6O6vMOltnGv5STpvtJAeuGzxh7nx9U+x9d\\n\" +\r\n \"sH6z8NygYoyy3lv2sEhFcXaR4JJAaxlluDECQC2aB9G94mkxnPYbBB3hddjXzWwv\\n\" +\r\n \"AE5GZC8OJ2BOeAEy0O8NJEBCWZ46fb6zFx/u70KUeLZ98EhPTYpwOaqmtVECQBDz\\n\" +\r\n \"gtUwPIvsnRE6vKaXmehKKIs9BCzbioGf/7EKCEMORUNh0quhDeCsRruWUsNoFd9+\\n\" +\r\n \"Pbx+wuvjlCiE6pVJHPECQQCuLyYXVrHCkvj0IhLt07QT/XoQrGwhXI0GwVwDl+ui\\n\" +\r\n \"fihjd8to4NMx13L29RN/cArpd7q6kXnd2kLVCyxxAIV3\\n\" +\r\n \"-----END RSA PRIVATE KEY-----\";\r\n\r\n private static RSA_PUBLIC_KEY = \"-----BEGIN PUBLIC KEY-----\\n\" +\r\n \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjnqokLXzkRl/dMNieoV8xIEjP\\n\" +\r\n \"jkiyCg1ll0qsLhCRadgbp5nJdGRlBrkg5HLfWEyZ6c3mDe0LRlPecomrmGK5TL1r\\n\" +\r\n \"y3YTlKtfAxz+W/yTrDHLIe/wdGL8GGx4x3j5HB4bxCXaOowNmE12oZahn00R+K6Y\\n\" +\r\n \"aJFJw5buOGz7p0YOGQIDAQAB\\n\" +\r\n \"-----END PUBLIC KEY-----\";\r\n\r\n\r\n // 512/1024/2048/4096\r\n private static readonly DEFAULT_KEY_SIZE: number = 1024;\r\n\r\n //======================================密钥对生成=====================================//\r\n /**\r\n *\r\n * RSA 密钥对\r\n * @param keySize 512/1024/2048/4096\r\n */\r\n public static genRSAKey(keySize: number): RsaKey {\r\n let generateKeypair = KEYUTIL.generateKeypair(\"RSA\", keySize);\r\n const privateKey = generateKeypair.prvKeyObj;\r\n const publicKey = generateKeypair.pubKeyObj;\r\n const privateKeyPEM = KEYUTIL.getPEM(privateKey, \"PKCS8PRV\");\r\n const publicKeyPEM = KEYUTIL.getPEM(publicKey);\r\n return RsaKey.of(privateKeyPEM, publicKeyPEM);\r\n }\r\n\r\n /**\r\n * 源自 椭圆曲线密码学(ECC),它依赖于 椭圆曲线离散对数问题(ECDLP)——在椭圆曲线上找到一个随机点的离散对数在计算上是不可行的。这使得 ECDSA 在相同安全级别下比 RSA 更高效。\r\n * EC 密钥对 ECDSA\r\n * @param curve \"secp256r1\" | \"secp256k1\" | \"secp384r1\" 目前:secp256r1性能较高\r\n */\r\n public static genECKey(curveStr: Curve): RsaKey {\r\n const ecKeypair = KEYUTIL.generateKeypair(\"EC\", curveStr);\r\n const privateKey = ecKeypair.prvKeyObj;\r\n const publicKey = ecKeypair.pubKeyObj;\r\n const privateKeyPEM = KEYUTIL.getPEM(privateKey, \"PKCS8PRV\");\r\n const publicKeyPEM = KEYUTIL.getPEM(publicKey);\r\n return RsaKey.of(privateKeyPEM, publicKeyPEM);\r\n }\r\n\r\n //======================================签名-验证=================================================//\r\n /**\r\n * 【公钥签名,私钥验证 | 私钥签名,公钥验证】\r\n * @see https://github.com/kjur/jsrsasign/tree/master/sample\r\n * @param data 待签名数据\r\n * @param rsaKey rsa的公钥或者私钥\r\n * @param hashAlg hash算法\r\n */\r\n public static signRyRsa(data: string, rsaKey: string, hashAlg: RSAHashAlg): string {\r\n let instance = KEYUTIL.getKey(rsaKey) as RSAKey;\r\n return instance.sign(data, hashAlg)\r\n }\r\n\r\n /**\r\n * 验证签名【公钥签名,私钥验证 | 私钥签名,公钥验证】\r\n * @param signStr 签名值\r\n * @param data 原始数据\r\n * @param rsaKey rsa的公钥或者私钥\r\n * @param hashAlg 签名算法\r\n */\r\n public static verifByRsa(data: string, signStr: string, rsaKey: string): boolean {\r\n let instance = KEYUTIL.getKey(rsaKey) as RSAKey;\r\n return instance.verify(data, signStr);\r\n }\r\n\r\n /**\r\n * EC签名\r\n * @param data 待签名数据\r\n * @param ecKey 【公钥|私钥】\r\n * @param sigAlg 签名算法\r\n * @param privPass 私钥密码【选填】\r\n * @return 返回16进制签名值\r\n */\r\n public static signRyEc(data: string, ecKey: string, sigAlg: CryptoHashAlg, privPass?: string): string {\r\n const sig = new KJUR.crypto.Signature({\"alg\": sigAlg});\r\n sig.init(ecKey, privPass);\r\n sig.updateString(data);\r\n const sigValueHex = sig.sign();\r\n return sigValueHex;\r\n }\r\n\r\n /**\r\n * 验证签名\r\n * @param data 待验证数据\r\n * @param signStr 签名值\r\n * @param rsaKey 【公钥|私钥】\r\n * @param sigAlg 签名算法\r\n * @param privPass 私钥密码【选填】\r\n */\r\n public static verifByEc(data: string, signStr: string, ecKey: string, sigAlg: CryptoHashAlg, privPass?: string): boolean {\r\n const sig = new KJUR.crypto.Signature({\"alg\": sigAlg});\r\n sig.init(ecKey, privPass);\r\n sig.updateString(data);\r\n const result = sig.verify(signStr);\r\n return result;\r\n }\r\n\r\n //=========================================加解密【暂不可用】=============================================//\r\n\r\n /**\r\n * 公钥加密\r\n * @param plaintext 待加密内容\r\n * @param publicKey 公钥字符串\r\n */\r\n public static publicEncrypt(plaintext: string, publicKey?: string): string {\r\n if(!publicKey) {\r\n publicKey = RsaUtil.RSA_PUBLIC_KEY;\r\n }\r\n let pub = KEYUTIL.getKey(publicKey) as RSAKey;\r\n let enc = KJUR.crypto.Cipher.encrypt(plaintext, pub, \"RSAOAEP\");\r\n return jsr.hextob64(enc);\r\n }\r\n\r\n\r\n /**\r\n * 公钥解密\r\n * @param plaintext 密文\r\n * @param publicKey 公钥\r\n */\r\n public static publicDecrypt(ciphertext: string, publicKey?: string): string {\r\n if(!publicKey) {\r\n publicKey = RsaUtil.RSA_PUBLIC_KEY;\r\n }\r\n let pub = KEYUTIL.getKey(publicKey) as any;\r\n let enc = KJUR.crypto.Cipher.decrypt(ciphertext, pub, \"RSAOAEP\");\r\n return jsr.hextob64(enc);\r\n }\r\n\r\n /**\r\n * 私钥加密\r\n * @param plaintext 明文\r\n * @param privateKey 私钥\r\n */\r\n public static privateEncrypt(plaintext: string, privateKey?: string): string {\r\n if (!privateKey) {\r\n privateKey = RsaUtil.RSA_PRIVATE_KEY;\r\n }\r\n let priv = KEYUTIL.getKey(privateKey) as any;\r\n let enc = KJUR.crypto.Cipher.encrypt(plaintext, priv, \"RSAOAEP\");\r\n return jsr.hextob64(enc);\r\n }\r\n\r\n\r\n /**\r\n * 私钥解密\r\n * @param ciphertext 密文\r\n * @param privateKey 私钥\r\n */\r\n public static privateDecrypt(ciphertext: string, privateKey?: string): string {\r\n if (!privateKey) {\r\n privateKey = RsaUtil.RSA_PRIVATE_KEY;\r\n }\r\n let priv = KEYUTIL.getKey(privateKey) as any;\r\n ciphertext = jsr.b64nltohex(ciphertext)\r\n let enc = KJUR.crypto.Cipher.decrypt(ciphertext, priv, \"RSAOAEP\");\r\n return enc;\r\n }\r\n\r\n //===================================================================================//\r\n\r\n}\r\n\r\n\r\n\r\n\r\n","import JSEncrypt from 'jsencrypt';\r\nimport {RsaKey} from \"../model\";\r\nimport CryptoJS from \"crypto-js\"\r\n\r\nexport interface JSEncryptOptions {\r\n key?: any;\r\n default_key_size?: string;\r\n default_public_exponent?: string;\r\n log?: boolean;\r\n}\r\n\r\nexport type DigestName = \"SHA256\" | \"SHA1\" | \"MD5\" | \"SHA512\"\r\n\r\n\r\n/**\r\n *@desc 【该类目前就jsencrypt-3.4.0 版本可用】\r\n *@author liudejian\r\n *@date 2020-06-26 20:56\r\n **/\r\nexport class RsaUtilPlus {\r\n\r\n private static RSA_PRIVATE_KEY = \"-----BEGIN RSA PRIVATE KEY-----\\n\" +\r\n \"MIICXQIBAAKBgQDjnqokLXzkRl/dMNieoV8xIEjPjkiyCg1ll0qsLhCRadgbp5nJ\\n\" +\r\n \"dGRlBrkg5HLfWEyZ6c3mDe0LRlPecomrmGK5TL1ry3YTlKtfAxz+W/yTrDHLIe/w\\n\" +\r\n \"dGL8GGx4x3j5HB4bxCXaOowNmE12oZahn00R+K6YaJFJw5buOGz7p0YOGQIDAQAB\\n\" +\r\n \"AoGBAIkwfEPJ1tiPQgBDDIyvnnwxhTD0BQSp4mE0yqD0MrAyJzqjzaEKMehiIPqe\\n\" +\r\n \"Nk4/Hgw2Sw85nYGKJcqRJkDyW61IPbqKBc5aNiO+7oIEM6n9rXhXuilfSExSFAYA\\n\" +\r\n \"90pSRoQUW3BmZKne5AQj9sjwKfYrCoikpU1dCBKdLF8ydUoBAkEA/Ag8Aw8onDeS\\n\" +\r\n \"qxG1Jj8IjkM7tt3FTlbXDkGCfh5RQMi8S27SZDpqqUIw0P9kR8498wp6FXksTjqW\\n\" +\r\n \"ujhOTMciaQJBAOc0CnrPIU6liKY3Zw6O6vMOltnGv5STpvtJAeuGzxh7nx9U+x9d\\n\" +\r\n \"sH6z8NygYoyy3lv2sEhFcXaR4JJAaxlluDECQC2aB9G94mkxnPYbBB3hddjXzWwv\\n\" +\r\n \"AE5GZC8OJ2BOeAEy0O8NJEBCWZ46fb6zFx/u70KUeLZ98EhPTYpwOaqmtVECQBDz\\n\" +\r\n \"gtUwPIvsnRE6vKaXmehKKIs9BCzbioGf/7EKCEMORUNh0quhDeCsRruWUsNoFd9+\\n\" +\r\n \"Pbx+wuvjlCiE6pVJHPECQQCuLyYXVrHCkvj0IhLt07QT/XoQrGwhXI0GwVwDl+ui\\n\" +\r\n \"fihjd8to4NMx13L29RN/cArpd7q6kXnd2kLVCyxxAIV3\\n\" +\r\n \"-----END RSA PRIVATE KEY-----\";\r\n\r\n private static RSA_PUBLIC_KEY = \"-----BEGIN PUBLIC KEY-----\\n\" +\r\n \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjnqokLXzkRl/dMNieoV8xIEjP\\n\" +\r\n \"jkiyCg1ll0qsLhCRadgbp5nJdGRlBrkg5HLfWEyZ6c3mDe0LRlPecomrmGK5TL1r\\n\" +\r\n \"y3YTlKtfAxz+W/yTrDHLIe/wdGL8GGx4x3j5HB4bxCXaOowNmE12oZahn00R+K6Y\\n\" +\r\n \"aJFJw5buOGz7p0YOGQIDAQAB\\n\" +\r\n \"-----END PUBLIC KEY-----\";\r\n\r\n private static readonly DEFAULT_KEY_SIZE = \"1024\";\r\n /**\r\n *\r\n * @param options\r\n * options.default_key_size ( 512, 1024, 2048, 4096)\r\n */\r\n public static getJsEncrypt(options: JSEncryptOptions) {\r\n const encryptor = new JSEncrypt(options);\r\n return encryptor;\r\n }\r\n\r\n /**\r\n * 获取默认JSEncrypt\r\n */\r\n public static getDefaultJsEncrypt() {\r\n return new JSEncrypt({\r\n default_key_size: RsaUtilPlus.DEFAULT_KEY_SIZE\r\n } as JSEncryptOptions);\r\n }\r\n\r\n /**\r\n * 生成 公钥与私钥\r\n * @param keySize (512, 1024, 2048, 4096)\r\n * @return ary[0]=公钥 ary[1]=私钥\r\n */\r\n public static genRSAKey(keySize:number): RsaKey {\r\n const instance = RsaUtilPlus.getJsEncrypt({default_key_size:keySize.toString()});\r\n // 同步获取\r\n const keypair = instance.getKey();\r\n const privateKey = keypair.getPrivateKey();\r\n const publicKey = keypair.getPublicKey();\r\n return RsaKey.of(privateKey,publicKey);\r\n }\r\n\r\n /**\r\n * 公钥加密\r\n * @param plaintext 待加密内容\r\n * @param publicKey 公钥字符串\r\n * @param isOaep 是否使用oaep加密\r\n */\r\n public static publicEncrypt(plaintext: string,publicKey?: string,isOaep?:boolean): string {\r\n if (!publicKey) {\r\n publicKey = RsaUtilPlus.RSA_PUBLIC_KEY;\r\n }\r\n //实例化jsEncrypt对象\r\n const jse = new JSEncrypt();\r\n //设置公钥\r\n jse.setPublicKey(publicKey);\r\n if (isOaep) {\r\n return jse.encryptOAEP(plaintext) as string\r\n }\r\n return jse.encrypt(plaintext) as string;\r\n }\r\n\r\n /**\r\n * 生产环境强烈建议使用标准流程(公钥加密+私钥解密)。\r\n * 公钥解密【暂时不支持】\r\n * @param plaintext 密文\r\n * @param publicKey 公钥\r\n */\r\n /* public static publicDecrypt(ciphertext: string, publicKey?: string): string {\r\n if (!publicKey) {\r\n publicKey = RsaUtilPlus.RSA_PUBLIC_KEY;\r\n }\r\n //实例化jsEncrypt对象\r\n const jse = new JSEncrypt();\r\n //设置公钥\r\n jse.setPublicKey(publicKey);\r\n return jse.decrypt(ciphertext) as string;\r\n }*/\r\n\r\n\r\n //===================================================================================//\r\n\r\n\r\n /**\r\n * 生产环境强烈建议使用标准流程(公钥加密+私钥解密)。\r\n * 私钥加密 【暂时不支持】\r\n * @param plaintext 明文\r\n * @param privateKey 私钥\r\n */\r\n /* public static privateEncrypt(plaintext: string, privateKey?: string): string {\r\n if (!privateKey) {\r\n privateKey = RsaUtilPlus.RSA_PRIVATE_KEY;\r\n }\r\n //实例化jsEncrypt对象\r\n const jse = new JSEncrypt();\r\n //设置私钥\r\n jse.setPrivateKey(privateKey);\r\n return jse.encrypt(plaintext) as string;\r\n }*/\r\n\r\n\r\n /**\r\n * 私钥解密\r\n * @param ciphertext 密文\r\n * @param privateKey 私钥\r\n */\r\n public static privateDecrypt(ciphertext: string,privateKey?: string): string {\r\n if (!privateKey) {\r\n privateKey = RsaUtilPlus.RSA_PRIVATE_KEY;\r\n }\r\n //实例化jsEncrypt对象\r\n const jse = new JSEncrypt();\r\n //设置私钥\r\n jse.setPrivateKey(privateKey);\r\n return jse.decrypt(ciphertext) as string;\r\n }\r\n\r\n\r\n /**\r\n * 私钥 签名\r\n * @param data 待签名数据\r\n * @param privateKey 私钥\r\n * @param digestName 签名算法\r\n * @return false表示失败。 成功返回签名值\r\n */\r\n public static sign(data: string, privateKey: string,digestName:DigestName): string {\r\n const jse = new JSEncrypt();\r\n //设置私钥\r\n jse.setPrivateKey(privateKey);\r\n let signature;\r\n switch (digestName) {\r\n case \"SHA256\":\r\n signature =jse.sign(data,CryptoJS.SHA256 as any,digestName);\r\n break\r\n case \"SHA1\":\r\n signature =jse.sign(data,CryptoJS.SHA1 as any,digestName);\r\n break\r\n case \"MD5\":\r\n signature =jse.sign(data,CryptoJS.MD5 as any,digestName);\r\n break;\r\n case \"SHA512\":\r\n signature =jse.sign(data,CryptoJS.SHA512 as any,digestName);\r\n break;\r\n }\r\n return signature as string;\r\n }\r\n\r\n /**\r\n * 验证签名值\r\n * @param data 原始数据\r\n * @param signText 签名值\r\n * @param publicKey 公钥\r\n */\r\n public static verify(data: string, signText: string, publicKey: string,digestName:DigestName): boolean {\r\n const jse = new JSEncrypt();\r\n //设置私钥\r\n jse.setPublicKey(publicKey);\r\n let result = false\r\n switch (digestName) {\r\n case \"SHA256\":\r\n result =jse.verify(data,signText,CryptoJS.SHA256 as any);\r\n break\r\n case \"SHA1\":\r\n result =jse.verify(data,signText,CryptoJS.SHA1 as any);\r\n break\r\n case \"MD5\":\r\n result =jse.verify(data,signText,CryptoJS.MD5 as any);\r\n break;\r\n case \"SHA512\":\r\n result =jse.verify(data,signText,CryptoJS.SHA512 as any);\r\n break;\r\n }\r\n return result;\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/**\r\n *@desc\r\n *@author liudejian\r\n *@date 2025-09-14 18:06\r\n **/\r\nimport {kdf, sm2, sm3} from 'sm-crypto-v2'\r\nimport {RsaKey, Sm2Option} from \"../model\";\r\n\r\n\r\nexport class Sm2Util {\r\n\r\n public static genKeyPair(): RsaKey {\r\n // 生成密钥对\r\n let keypair = sm2.generateKeyPairHex()\r\n let publicKey = keypair.publicKey\r\n let privateKey = keypair.privateKey\r\n let compressedPublicKey = sm2.compressPublicKeyHex(publicKey)\r\n return RsaKey.of(privateKey, publicKey, compressedPublicKey);\r\n }\r\n\r\n /**\r\n * 加密数据\r\n * @param data 待加密数据\r\n * @param key 加密KEY(公钥|私钥)\r\n * @param cipherMode // 1 - C1C3C2| 0 - C1C2C3,默认为1\r\n * @param asn1 支持使用 asn1 对加密结果进行编码,在 options 参数中传入 { asn1: true } 即可,默认不开启\r\n */\r\n public static encrypt(data: string, pubKey: string, cipherMode?: number, asn1?: boolean) {\r\n if (!cipherMode) {\r\n cipherMode = 1;\r\n }\r\n if (!asn1) {\r\n asn1 = false;\r\n }\r\n let encryptData = sm2.doEncrypt(data, pubKey, cipherMode, {asn1: asn1})\r\n return encryptData;\r\n }\r\n\r\n /**\r\n * 私钥解密\r\n * @param encData 待解密数据\r\n * @param privKey 私钥\r\n * @param cipherMode // 1 - C1C3C2,0 - C1C2C3,默认为1\r\n * @param asn1 支持使用 asn1 对加密结果进行编码,在 options 参数中传入 { asn1: true } 即可,默认不开启\r\n */\r\n public static decrypt(encData: string, privateKey: string, cipherMode?: number, asn1?: boolean) {\r\n if (!cipherMode) {\r\n cipherMode = 1;\r\n }\r\n if (!asn1) {\r\n asn1 = false;\r\n }\r\n let encryptData = sm2.doDecrypt(encData, privateKey, cipherMode, {output: 'string', asn1: asn1})\r\n return encryptData;\r\n }\r\n\r\n /**\r\n * 签名\r\n * @param data 待签名数据\r\n * @param privateKey 私钥\r\n * @param options 配置参数【选填】\r\n */\r\n public static sign(data: string, privateKey: string, options?: Sm2Option): string {\r\n return sm2.doSignature(data, privateKey, options);\r\n }\r\n\r\n /**\r\n * 验证签名\r\n * @param data 待验证数据\r\n * @param signStr 签名值\r\n * @param publicKey 公钥\r\n * @param options 配置参数【选填】\r\n */\r\n public static verify(data: string, signStr: string, publicKey: string, options?: Sm2Option): boolean {\r\n return sm2.doVerifySignature(data, signStr, publicKey, options);\r\n }\r\n\r\n /**\r\n * 根据私钥获取公钥\r\n * @param privateKey 私钥\r\n */\r\n public static getPublicKey(privateKey: string): string {\r\n return sm2.getPublicKeyFromPrivateKey(privateKey);\r\n }\r\n\r\n /**\r\n * 主要用于计算数据摘要hash\r\n * 应用场景:发送方计算原始数据的SM3摘要并随数据传输,接收方收到数据后重新计算摘要,比对两者是否一致:\r\n * @param data 待计算数据\r\n * @param keyStr // 要求为 16 进制串或字节数组\r\n * @param mode\r\n */\r\n public static sm3Hash(data: string, keyStr?: string, mode?: \"hmac\" | \"mac\"): string {\r\n // 杂凑\r\n let hashData;\r\n if (keyStr) {\r\n hashData = sm3(data, {mode: mode, key: keyStr} as any);\r\n } else {\r\n hashData = sm3(data);\r\n }\r\n return hashData;\r\n }\r\n\r\n /**\r\n * KDF(密钥派生函数)的核心作用是通过伪随机函数(如SM3哈希)从主密钥、密码或椭圆曲线点等输入中,派生出符合加密要求的密钥(如SM4的对称密钥),解决直接使用原始密钥可能存在的安全问题(如长度不足、随机性不够)。其应用场景主要集中在需要\r\n *1.对称加密密钥生成(如SM2加密流程)\r\n * 2. 密码存储与验证(如用户密码保护)\r\n * 3. 数字信封密钥封装(如PKCS#7数字信封)\r\n * 4. 大块数据加密(如金融、交通等领域的大数据场景)\r\n * 5. 密钥交换与协商(如SM2密钥交换协议)\r\n * @param data\r\n * @param length\r\n */\r\n public static kdfHash(data: string, length: number): string {\r\n // 杂凑\r\n const result = kdf(data, length);\r\n let aryx = new Array<number>();\r\n result.forEach((v, index) => {\r\n aryx.push(v);\r\n })\r\n return sm2.arrayToHex(aryx);\r\n }\r\n\r\n /**\r\n * ArrayBuffer 转 十六进制\r\n * @param uint8Array\r\n */\r\n public static arrayToHex(uint8Array: Uint8Array<ArrayBuffer>): string {\r\n let aryx = new Array<number>();\r\n uint8Array.forEach((v, index) => {\r\n aryx.push(v);\r\n })\r\n return sm2.arrayToHex(aryx);\r\n }\r\n\r\n /**\r\n * 十六进制转 ArrayBuffer\r\n * @param hexData\r\n */\r\n public static hexToArray(hexData: string): Uint8Array<ArrayBuffer> {\r\n return sm2.hexToArray(hexData);\r\n }\r\n\r\n /**\r\n * 生成共享秘钥\r\n * @param keyPairA A的秘钥对\r\n * @param tempKeyPairA A的临时秘钥对\r\n * @param publicKeyB B的公钥\r\n * @param tempPublicKeyB B的临时公钥\r\n * @param sharedKeyLen 生成的共享秘钥长度\r\n * @param isReceiver 是否为接收方(例如:A发送数据给B,那么A方isReceiver=false, B方isReceiver=true)\r\n * @param identityA A的身份: 例如:A的邮箱或者固定KEY【选填】\r\n * @param identityB B的身份: 例如:B的邮箱或者固定KEY【选填】\r\n */\r\n public static genSharedKey(keyPairA: RsaKey, tempKeyPairA: RsaKey, publicKeyB: string,\r\n tempPublicKeyB: string, sharedKeyLen: number, isReceiver: boolean, identityA?: string, identityB?: string): string {\r\n if (identityA && identityB) {\r\n return Sm2Util.arrayToHex(sm2.calculateSharedKey(keyPairA, tempKeyPairA, publicKeyB,\r\n tempPublicKeyB, sharedKeyLen, isReceiver, identityA, identityB))\r\n } else {\r\n return Sm2Util.arrayToHex(sm2.calculateSharedKey(keyPairA, tempKeyPairA, publicKeyB,\r\n tempPublicKeyB, sharedKeyLen, isReceiver));\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import {sm4} from 'sm-crypto-v2'\r\nimport {SM4Options} from \"../model\";\r\n\r\n/**\r\n * SM4是中国自主可控的国家密码算法:经过多年安全性评估(如国家密码管理局的密码模块检测),\r\n * 广泛应用于金融、政务等敏感领域,是目前国内替代AES的推荐算法\r\n * SM4因安全、合规,适合安全敏感且需要自主可控的场景:\r\n *@desc 加解密\r\n *@author liudejian\r\n *@date 2025-09-14 19:04\r\n **/\r\nexport class Sm4Util {\r\n // 可以为 16 进制串或字节数组,要求为 128 比特\r\n public static readonly DEFAULT_KEY = '2cdeeb8324fc098e49d498fae4c8f526'\r\n public static readonly DEFAULT_IV = 'fedcba98765432100123456789abcdef'\r\n\r\n public static readonly DEFAULT_PADDING = \"pkcs#7\";\r\n public static readonly DEFAULT_MODE = \"cbc\";\r\n\r\n public static getDefaultOptions(iv?: string) {\r\n return {\r\n padding: Sm4Util.DEFAULT_PADDING,\r\n mode: Sm4Util.DEFAULT_MODE,\r\n output: \"string\",\r\n iv: iv ? iv : Sm4Util.DEFAULT_IV\r\n } as SM4Options\r\n }\r\n\r\n /**\r\n * 加密\r\n * @param data 待加密数据\r\n * @param secretKey 加密KEY\r\n * @param options 可选配置\r\n */\r\n // @ts-ignore\r\n public static encrypt(data: string, secretKey?: string, options?: SM4Options): any {\r\n if (!secretKey) {\r\n secretKey = Sm4Util.DEFAULT_KEY;\r\n }\r\n if (!options) {\r\n options = Sm4Util.getDefaultOptions();\r\n }\r\n // @ts-ignore\r\n return sm4.encrypt(data, secretKey, options);\r\n }\r\n\r\n /**\r\n * 解密\r\n * @param encData 待解密数据\r\n * @param secretKey 解密KEY\r\n * @param options 可选配置\r\n */\r\n // @ts-ignore\r\n public static decrypt(encData: string, secretKey?: string, options?: SM4Options): any {\r\n if (!secretKey) {\r\n secretKey = Sm4Util.DEFAULT_KEY;\r\n }\r\n if (!options) {\r\n options = Sm4Util.getDefaultOptions();\r\n }\r\n // @ts-ignore\r\n return sm4.decrypt(encData, secretKey, options);\r\n }\r\n\r\n\r\n}\r\n\r\n\r\n","import jsr from \"jsrsasign\";\r\n\r\n/**\r\n * @see jsr.KJUR.crypto.Util.DEFAULTPROVIDER\r\n *\r\n */\r\nexport type HashAlg = \"hmacmd5\"|\"hmacripemd160\"|\"hmacsha1\"|\"hmacsha224\"|\"hmacsha256\"|\"hmacsha384\"|\"hmacsha512\"|\"md5\"|\"MD5withECDSA\"|\"MD5withRSA\"|\"MD5withRSAandMGF1\"|\"ripemd160\"|\"RIPEMD160withECDSA\"|\"RIPEMD160withRSA\"|\"RIPEMD160withRSAandMGF1\"|\"sha1\"|\"SHA1withDSA\"|\"SHA1withECDSA\"|\"SHA1withRSA\"|\"SHA1withRSAandMGF1\"|\"sha224\"|\"SHA224withDSA\"|\"SHA224withECDSA\"|\"SHA224withRSA\"|\"SHA224withRSAandMGF1\"|\"sha256\"|\"SHA256withDSA\"|\"SHA256withECDSA\"|\"SHA256withRSA\"|\"SHA256withRSAandMGF1\"|\"sha384\"|\"SHA384withECDSA\"|\"SHA384withRSA\"|\"SHA384withRSAandMGF1\"|\"sha512\"|\"SHA512withECDSA\"|\"SHA512withRSA\"|\"SHA512withRSAandMGF1\";\r\n\r\n/**\r\n *@desc\r\n *@author liudejian\r\n *@date 2025-09-14 16:56\r\n **/\r\nexport class HashUtil {\r\n\r\n public static md5(data:string):string {\r\n return jsr.KJUR.crypto.Util.md5(data);\r\n }\r\n\r\n public static sha1(data:string):string {\r\n return jsr.KJUR.crypto.Util.sha1(data);\r\n }\r\n public static sha256(data:string):string {\r\n return jsr.KJUR.crypto.Util.sha256(data);\r\n }\r\n public static sha512(data:string):string {\r\n return jsr.KJUR.crypto.Util.sha512(data);\r\n }\r\n\r\n public static sha256Hex(data:string):string {\r\n return jsr.KJUR.crypto.Util.sha256Hex(data);\r\n }\r\n\r\n /**\r\n * 计算文本hash\r\n * @param data 文本数据\r\n * @param alg hash算法名称\r\n */\r\n public static hashHex(data:string,alg:HashAlg):string {\r\n return jsr.KJUR.crypto.Util.hashHex(data,alg);\r\n }\r\n}\r\n\r\n/*const data = \"liudejian\";\r\nconsole.log(HashUtil.md5(data));\r\nconsole.log(HashUtil.sha1(data));\r\nconsole.log(HashUtil.sha256(data));\r\nconsole.log(HashUtil.sha256Hex(data));\r\nconsole.log(HashUtil.sha512(data));\r\nconsole.log(HashUtil.hashHex(data,\"sha512\"));*/\r\n\r\n"],"names":["AssertUtil","notNull","obj","message","Error","wrapNull","DateUtil","dateFormat","time","fmt","undefined","date","Date","test","replace","RegExp","$1","getFullYear","substr","length","o","getMonth","getDate","getHours","getMinutes","getSeconds","k","str","formatDate","format","we","getDay","qut","Math","floor","toString","opt","week","quarter","r","exec","padStart","formatPast","param","t","s","getTime","Number","parseInt","formatAxis","hour","getMonthFirstDay","now","nowMonth","nowYear","getMonthLastDay","formatSecondToHms","second","secondInt","hours","round","minutes","seconds","StorageUtil","setStorageApi","storageApi","isObject","object","Object","prototype","apply","getLocalStorageKeys","len","localStorage","keys","Array","i","push","key","getSessionStorageKeys","sessionStorage","setSessionStorage","value","window","setItem","JSON","stringify","getSessionStorage","getItem","startsWith","parse","e","console","error","removeSessionStorage","removeItem","clearSessionStorage","clear","setLocalStorage","getLocalStorage","removeLocalStorage","clearLocalStorage","EnumUtil","cacheEnums","enums","CACHE_ENUMS_KEY","getCacheEnums","enumsJson","ClearEnum","GLOBAL_APP_ENUMS","GetEnum","dictCode","appCode","appEnums","GetEnums","get","appCodes","GetAllAppCodes","dictDetails","next","arys","done","Map","PutEnum","datas","size","set","getEnumLabelByCode","code","codeName","codeCnName","this","getEnumLabel","getEnumValue","enumAlls","enumName","keyValue","keyCnName","singleEnums","item","codeDesc","codeCnDesc","result","forEach","v","ary","enumFormat","row","column","cellVal","manulEnumName","cellValue","property","firstWordUpperCase","enumDefaultFormat","cellFinalValue","appCodeKey","resultValue","slice","toUpperCase","defineProperty","snowflake","SnowflakeIdv1","workerId","seqBitLength","CommonUtil","genSnowflake","NextId","mapToObject","mapData","genRandom","min","max","range","rand","random","genUid","radix","chars","split","uuid","join","trim","isEmptyObject","isArray","isString","isNumber","hasOwnProperty","call","templateEngine","template","json","match","isFunction","isDate","isRegExp","isMap","isSet","copy","target","source","deep","proto","getPrototypeOf","assign","create","isBlank","isNotBlank","startWith","prefix","endWith","stuff","dataFormat","returnValueName","keyName","data","find","addPrefix","addSuffix","suffix","clearArray","splice","CookieUtil","defaultCookieConfig","expires","path","secure","sameSite","setCookie","options","Cookies","setDefaultCookie","setObjCookie","getObjCookie","getCookie","removeCookie","remove","BUS","mitt","EventBus","publish","emit","on","callback","off","FileUtil","formatBytes","a","b","d","f","log","parseFloat","pow","toFixed","isBase64Img","isBlob","Blob","isFile","File","dataURLtoFile","dataurl","filename","arr","mime","bstr","atob","n","u8arr","Uint8Array","charCodeAt","type","dataURLtoBlob","blobToFile","blob","blobToFileDefineName","fileName","getImageWidthHeight","file","Promise","resolve","reject","reader","FileReader","readAsDataURL","onload","evt","replaceSrc","imageObj","Image","src","width","height","onerror","err","getMediaDuration","url","URL","createObjectURL","audioElement","Audio","duration","addEventListener","_event","OssUtil","aliThumbnailPercentage","percentage","ceil","indexOf","aliThumbnai","tm","UrlUtil","urlJoin","uriFirst","uriSecond","endsWith","substring","parseUri","uri","queries","temp","l","params","parseLocationParams","location","href","getUriParam","paramName","updateLocationUrlReload","updateLocationParam","updateLocationUrl","newurl","history","replaceState","re","separator","urlReplaceEngine","PATTERN","encodeUrl","encodeURIComponent","ZeroUtil","textToBinary","word","map","char","binaryToZeroAry","binary","num","HIDE_WORD_1","HIDE_WORD_0","joinZeroAryToString","zeroAry","HIDE_WORD_FEFF","zeroWidthToStr","zeroWidthStr","binaryStr","zeroWidthChar","binaryToStr","String","fromCharCode","zeroArrToString","zeroArr","convertToZeroString","binaryAry","extractHideInfo","convertZeroStringToString","zeroWord","zeroWordAry","CommonTree","constructor","CommonTreeUtil","convertToTree","treeBos","checkedIds","maxLevel","results","levelMap","checkMaps","checkedId","commonTree","level","id","pid","label","order","checked","tempList","childList","parentList","parent","child","_a","children","sortTree","rts","sort","o1","o2","rt","childs","GLOBAL_CONFIG","ConfigUtil","getConfigMap","getConfigMapToObject","put","delete","has","Word","RegexUtil","extractAll","text","regex","matchWord","index","content","extractFirst","extractLast","splitWord","limit","searchWord","search","testWord","replaceWord","DataSize","of","rs","AutoSize","getSize","resultSize","eraseSize","clientType","innerHeight","innerWidth","document","body","clientHeight","clientWidth","initWindowResize","instance","onresize","flag","setTimeout","BrowserUtil","getBrowerUniqueId","fp","FingerprintJS","load","fingerprint","visitorId","Sex","CommonYn","Status","LoginType","Scope","AopUtil","createProxyInstance","classType","handler","createProxy","excludeMethods","name","Reflect","ownKeys","includes","descriptor","getOwnPropertyDescriptor","method","args","before","arguments","after","exception","finally","ClassUtil","newInstance","cls","isClass","getOwnPropertyNames","getFields","cs","getMethodNames","ins","methodNames","methods","methodName","getMethods","getOwnPropertyDescriptors","getMethodParamNames","funcStr","p","CommonMenuTree","Meta","DictDto","BeanDefinition","SINGLE","getPropertySet","fields","Set","addProperty","propertyInfo","add","setScope","scope","build","classConstructor","qualifier","cm","PropertyInfo","fi","IocUtil","genInstanceId","INSTANCE_ID","convertToArray","values","arrAry","getConstructor","clsBiz","wrapBeanName","wrapBeanNameByStr","beanName","Container","getBeanNames","aryList","beanDef","BEAN_DEFINITION_MAP","getBeanDefinitions","registerBeanDefinition","beanDefinition","getBeanDefinition","getBeanDefinitionByName","className","hasBeanDefinition","registerSingleBean","BEAN_INSTANCE_MAP","hasBean","getSingleBean","getSingleBeanByName","getBeansByType","beans","bean","getBeansByName","getBeanByName","res","recursionSetProperty","PROTOTYPE","serviceType","beanInstance","getBean","parentInstance","parentBeanDefinition","fieldInfo","fieldType","fieldName","fieldCm","currentInstance","IOC_CONTAINER_MAP","IocContext","container","DEFAULT_KEY","getContainer","createContainer","CLASS_META_KEY","Symbol","CLASS_PROP_KEY","IocDecoratorUtil","autoService","sm","meta","defineMetadata","defaultContainer","autowired","targetClas","descClassConstructor","autowiredServiceCls","getMetadata","autowiredCm","autoInstance","parentService","Service","Autowired","Level","Logger","enable","ENABLE","disable","getLevel","LEVEL","setLevel","getLogger","classModule","logger","classProto","redefineClass","currentMethodName","CURRENT_METHOD_NAME","currentMthoeNameKey","CURRENT_METHOD_NAME_KEY","deleteMetadata","currentMethod","getOwnMetadata","methodStr","getLevelName","formatString","info","INFO","ERROR","debug","DEBUG","trace","TRACE","warn","WARN","AesUtil","encrypt","secretKey","iv","KEY","IV","DEFAULT_IV","CryptoJS","enc","Latin1","AES","mode","CBC","padding","pad","ZeroPadding","decrypt","encDta","Utf8","VITE_GLOB_DEFAULT_KEY","VITE_GLOB_DEFAULT_IV","DesUtil","DES","Rc4Util","RC4","encData","RsaKey","privateKey","publicKey","compressedPublicKey","KEYUTIL","jsr","KJUR","RsaUtil","genRSAKey","keySize","generateKeypair","prvKeyObj","pubKeyObj","privateKeyPEM","getPEM","publicKeyPEM","genECKey","curveStr","ecKeypair","signRyRsa","rsaKey","hashAlg","getKey","sign","verifByRsa","signStr","verify","signRyEc","ecKey","sigAlg","privPass","sig","crypto","Signature","alg","init","updateString","verifByEc","publicEncrypt","plaintext","RSA_PUBLIC_KEY","pub","Cipher","hextob64","publicDecrypt","ciphertext","privateEncrypt","RSA_PRIVATE_KEY","priv","privateDecrypt","b64nltohex","RsaUtilPlus","getJsEncrypt","JSEncrypt","getDefaultJsEncrypt","default_key_size","DEFAULT_KEY_SIZE","keypair","getPrivateKey","getPublicKey","isOaep","jse","setPublicKey","encryptOAEP","setPrivateKey","digestName","signature","SHA256","SHA1","MD5","SHA512","signText","Sm2Util","genKeyPair","sm2","generateKeyPairHex","compressPublicKeyHex","pubKey","cipherMode","asn1","doEncrypt","doDecrypt","output","doSignature","doVerifySignature","getPublicKeyFromPrivateKey","sm3Hash","keyStr","hashData","sm3","kdfHash","kdf","aryx","arrayToHex","uint8Array","hexToArray","hexData","genSharedKey","keyPairA","tempKeyPairA","publicKeyB","tempPublicKeyB","sharedKeyLen","isReceiver","identityA","identityB","calculateSharedKey","Sm4Util","getDefaultOptions","DEFAULT_PADDING","DEFAULT_MODE","sm4","HashUtil","md5","Util","sha1","sha256","sha512","sha256Hex","hashHex"],"mappings":"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"}