util.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. import { ref, toRef } from "vue";
  2. import CryptoJS from "crypto-js";
  3. // 构造树型结构数据
  4. export function handleTree(arr: any, id: string) {
  5. // 数组去重
  6. arr = arr.filter((item: any, index: number) => {
  7. if (arr.findIndex((ite: any) => ite[id] === item[id]) === index) {
  8. return item;
  9. }
  10. });
  11. function turnTree(arr: any, id: string) {
  12. const tree = ref<any>([]);
  13. for (let i = 0; i < arr.length; i++) {
  14. const isFirst = tree.value.findIndex((item: any) => arr[i][id].includes(item[id]));
  15. if (isFirst !== -1) {
  16. tree.value[isFirst].children.push(arr[i]);
  17. } else {
  18. arr[i].children = [];
  19. tree.value.push(arr[i]);
  20. }
  21. }
  22. return tree.value;
  23. }
  24. return turnTree(arr, id);
  25. }
  26. /**
  27. * 生成随机len位数字
  28. */
  29. export const randomLenNum = (len: number, date?: boolean) => {
  30. let random = "";
  31. random = Math.ceil(Math.random() * 100000000000000)
  32. .toString()
  33. .substr(0, len);
  34. if (date) random = random + Date.now();
  35. return random;
  36. };
  37. /**
  38. *加密处理
  39. */
  40. export const encryption = (params: any) => {
  41. let { key } = params;
  42. const { data, type, param } = params;
  43. const result = JSON.parse(JSON.stringify(data));
  44. if (type === "Base64") {
  45. param.forEach((ele: any) => {
  46. result[ele] = btoa(result[ele]);
  47. });
  48. } else {
  49. param.forEach((ele: any) => {
  50. const data = result[ele];
  51. key = CryptoJS.enc.Latin1.parse(key);
  52. const iv = key;
  53. // 加密
  54. const encrypted = CryptoJS.AES.encrypt(data, key, {
  55. iv: iv,
  56. mode: CryptoJS.mode.CFB,
  57. padding: CryptoJS.pad.NoPadding
  58. });
  59. result[ele] = encrypted.toString();
  60. });
  61. }
  62. return result;
  63. };
  64. /**
  65. * 判断路由是否相等
  66. */
  67. export const diff = (obj1: any, obj2: any): boolean => {
  68. delete obj1.close;
  69. const o1 = obj1 instanceof Object;
  70. const o2 = obj2 instanceof Object;
  71. if (!o1 || !o2) {
  72. /* 判断不是对象 */
  73. return obj1 === obj2;
  74. }
  75. if (Object.keys(obj1).length !== Object.keys(obj2).length) {
  76. return false;
  77. // Object.keys() 返回一个由对象的自身可枚举属性(key值)组成的数组,例如:数组返回下表:let arr = ["a", "b", "c"];console.log(Object.keys(arr))->0,1,2;
  78. }
  79. for (const attr in obj1) {
  80. const t1 = obj1[attr] instanceof Object;
  81. const t2 = obj2[attr] instanceof Object;
  82. if (t1 && t2) {
  83. return diff(obj1[attr], obj2[attr]);
  84. } else if (obj1[attr] !== obj2[attr]) {
  85. return false;
  86. }
  87. }
  88. return true;
  89. };
  90. /**
  91. * 对象深拷贝
  92. */
  93. export const deepClone = (data: any) => {
  94. const type = getObjType(data);
  95. let obj: any;
  96. if (type === "array") {
  97. obj = [];
  98. } else if (type === "object") {
  99. obj = {};
  100. } else {
  101. // 不再具有下一层次
  102. return data;
  103. }
  104. if (type === "array") {
  105. for (let i = 0, len = data.length; i < len; i++) {
  106. obj.push(deepClone(data[i]));
  107. }
  108. } else if (type === "object") {
  109. for (const key in data) {
  110. obj[key] = deepClone(data[key]);
  111. }
  112. }
  113. return obj;
  114. };
  115. export const getObjType = (obj: any) => {
  116. const toString = Object.prototype.toString;
  117. const map: any = {
  118. "[object Boolean]": "boolean",
  119. "[object Number]": "number",
  120. "[object String]": "string",
  121. "[object Function]": "function",
  122. "[object Array]": "array",
  123. "[object Date]": "date",
  124. "[object RegExp]": "regExp",
  125. "[object Undefined]": "undefined",
  126. "[object Null]": "null",
  127. "[object Object]": "object"
  128. };
  129. if (obj instanceof Element) {
  130. return "element";
  131. }
  132. return map[toString.call(obj)];
  133. };
  134. // 表单序列化
  135. export const serialize = (data: any) => {
  136. const list: string[] = [];
  137. Object.keys(data).forEach((ele) => {
  138. list.push(`${ele}=${data[ele]}`);
  139. });
  140. return list.join("&");
  141. };
  142. /**
  143. * 日期格式化
  144. */
  145. export const timestampToTime = (timestamp: number) => {
  146. const date = new Date(timestamp);
  147. const year = date.getFullYear();
  148. const month = (date.getMonth() + 1).toString().padStart(2, "0");
  149. const day = date.getDate().toString().padStart(2, "0");
  150. const hour = date.getHours().toString().padStart(2, "0");
  151. const minute = date.getMinutes().toString().padStart(2, "0");
  152. const second = date.getSeconds().toString().padStart(2, "0");
  153. return `${year}-${month}-${day} ${hour}:${minute}:${second}`;
  154. };
  155. // 数组中获取对应value的label
  156. export function getValueLabel(arr: any, value: string, valueName?: string, labelName?: string) {
  157. const valName = valueName ?? "value";
  158. const label = labelName ?? "label";
  159. return arr.find((item: any) => item[valName] === value)[label];
  160. }
  161. // 从字典中获取多选value的label
  162. export function getValueListLabel(arr: any, value: string[], valueName?: string, labelName?: string) {
  163. const valName = valueName ?? "value";
  164. const label = labelName ?? "label";
  165. const showBackList = typeof value === "string" ? JSON.parse(value) : value;
  166. if (!value || value?.length === 0) return;
  167. const result: string[] = [];
  168. showBackList.forEach((item: any) => {
  169. result.push(arr.find((ite: any) => ite[valName] === item)[label] || "");
  170. });
  171. return result.join("、");
  172. }
  173. // 级联字典获取对应value的label
  174. export function getLabelFromMutDict(arr: any, val: string, valueName?: string, labelName?: string): any {
  175. const value = valueName ?? "value";
  176. const label = labelName ?? "label";
  177. for (const item of arr) {
  178. if (item[value] === val) {
  179. return item[label];
  180. } else if (item.children?.length > 0) {
  181. return getLabelFromMutDict(item.children, val, value, label);
  182. }
  183. }
  184. }