utils.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. import router from "@/router";
  2. import { store } from "@/store/store";
  3. import CryptoJS from "crypto-js";
  4. import { MD5 } from "./md5";
  5. export function setUUID() {
  6. if (!localStorage.getItem("uuidForEcs")) {
  7. const uuidForEcs = "" + Date.now() + Math.random();
  8. localStorage.setItem("uuidForEcs", uuidForEcs);
  9. }
  10. }
  11. // 如果这台机器上登录过的学生人数小于5,那么这台电脑就是学生的
  12. export function isThisMachineOwnByStudent() {
  13. return JSON.parse(localStorage.getItem("userIds") || "[]").length < 5;
  14. }
  15. /** 通用的退出登录函数
  16. * @param cause - 退出登录的原因
  17. */
  18. export function showLogout(cause: string) {
  19. logger({
  20. pgu: "AUTO",
  21. cnl: ["console", "local", "server"],
  22. dtl: "用户被要求重新登录",
  23. ext: { cause },
  24. });
  25. $message.warning(cause, { duration: 5 * 60 * 1000, closable: true });
  26. void router.push({ name: "UserLogin" });
  27. }
  28. /**
  29. * 将阿拉伯数字转换成汉字数字
  30. * @param num 数值
  31. * @returns 汉字数字
  32. */
  33. export function toChineseNumber(num: number) {
  34. let ret = "";
  35. if (num < 10) {
  36. ret = num.toLocaleString("zh-u-nu-hanidec");
  37. } else if (num === 10) {
  38. ret = "十";
  39. } else if (num > 10 && num < 20) {
  40. ret = "十" + (num % 10).toLocaleString("zh-u-nu-hanidec");
  41. } else if (num >= 20 && num < 100) {
  42. const s = num
  43. .toLocaleString("zh-u-nu-hanidec", { useGrouping: false })
  44. .split("");
  45. s.splice(1, 0, "十");
  46. ret = s.join("").replace("〇", "");
  47. } else {
  48. ret = num.toLocaleString("zh-u-nu-hanidec"); // 假设没有超过100的大题
  49. }
  50. return ret;
  51. }
  52. let salt: string;
  53. export function setSalt(_salt: string) {
  54. salt = _salt;
  55. }
  56. export function getSalt() {
  57. return salt;
  58. }
  59. export function getKey(timestamp: number) {
  60. const { key, token } = store.user;
  61. if (!key || !token) return "";
  62. return MD5(`key=${key}&token=${token}&timestamp=${timestamp}`);
  63. }
  64. function toHex(str: string) {
  65. if (!str) {
  66. return "";
  67. }
  68. const chars = [];
  69. for (let n = 0; n < str.length; n++) {
  70. chars.push(str.charCodeAt(n).toString(16));
  71. }
  72. return chars.join("");
  73. }
  74. const ivStr = "@M#A$G%A^2&0*2(1"; // 偏移量
  75. const iv = toHex(ivStr); // 16进制偏移量
  76. export function decryptLogin(encStr: string, key: string): string {
  77. return CryptoJS.enc.Utf8.stringify(
  78. CryptoJS.AES.decrypt(
  79. CryptoJS.format.Hex.parse(encStr),
  80. CryptoJS.enc.Hex.parse(toHex(key)),
  81. {
  82. iv: CryptoJS.enc.Hex.parse(iv),
  83. mode: CryptoJS.mode.CBC,
  84. padding: CryptoJS.pad.Pkcs7,
  85. }
  86. )
  87. );
  88. }
  89. /** AES(带向量) 简写 A */
  90. export function encryptA(str: string, key: string) {
  91. return CryptoJS.AES.encrypt(str, CryptoJS.enc.Hex.parse(toHex(key)), {
  92. // iv: CryptoJS.enc.Hex.parse(iv),
  93. mode: CryptoJS.mode.ECB,
  94. padding: CryptoJS.pad.Pkcs7,
  95. }).ciphertext.toString();
  96. }
  97. export function decryptA(encStr: string, key: string): string {
  98. return CryptoJS.enc.Utf8.stringify(
  99. CryptoJS.AES.decrypt(
  100. CryptoJS.format.Hex.parse(encStr),
  101. CryptoJS.enc.Hex.parse(toHex(key)),
  102. {
  103. // iv: CryptoJS.enc.Hex.parse(iv),
  104. mode: CryptoJS.mode.ECB,
  105. padding: CryptoJS.pad.Pkcs7,
  106. }
  107. )
  108. );
  109. }
  110. /** base64加密 简写B */
  111. export function encryptB(str: string): string {
  112. // return window.btoa(str);
  113. return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(str));
  114. }
  115. /** base64加密 简写B */
  116. export function decryptB(str: string): string {
  117. return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(str));
  118. }
  119. /** RC4(无向量) 简写 C */
  120. export function encryptC(str: string, key: string) {
  121. return CryptoJS.RC4.encrypt(
  122. str,
  123. CryptoJS.enc.Hex.parse(toHex(key))
  124. ).toString();
  125. }
  126. export function decryptC(encStr: string, key: string): string {
  127. return CryptoJS.enc.Utf8.stringify(
  128. CryptoJS.RC4.decrypt(encStr, CryptoJS.enc.Hex.parse(toHex(key)))
  129. );
  130. }
  131. /** DES(无向量) 简写 D */
  132. export function encryptD(str: string, key: string) {
  133. return CryptoJS.DES.encrypt(str, CryptoJS.enc.Hex.parse(toHex(key)), {
  134. mode: CryptoJS.mode.ECB,
  135. padding: CryptoJS.pad.Pkcs7,
  136. }).toString();
  137. }
  138. export function decryptD(encStr: string, key: string): string {
  139. return CryptoJS.enc.Utf8.stringify(
  140. CryptoJS.DES.decrypt(encStr, CryptoJS.enc.Hex.parse(toHex(key)), {
  141. mode: CryptoJS.mode.ECB,
  142. padding: CryptoJS.pad.Pkcs7,
  143. })
  144. );
  145. }
  146. /** TripleDES(无向量) 简写 E */
  147. export function encryptE(str: string, key: string) {
  148. return CryptoJS.TripleDES.encrypt(str, CryptoJS.enc.Hex.parse(toHex(key)), {
  149. mode: CryptoJS.mode.ECB,
  150. padding: CryptoJS.pad.Pkcs7,
  151. }).toString();
  152. }
  153. export function decryptE(encStr: string, key: string): string {
  154. return CryptoJS.enc.Utf8.stringify(
  155. CryptoJS.TripleDES.decrypt(encStr, CryptoJS.enc.Hex.parse(toHex(key)), {
  156. mode: CryptoJS.mode.ECB,
  157. padding: CryptoJS.pad.Pkcs7,
  158. })
  159. );
  160. }