store.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import { defineStore, } from 'pinia';
  2. export const useMainStore = defineStore('mainStore', {
  3. state: () => ({
  4. count: 0,
  5. token: "",
  6. loginState: false, // 登入狀態
  7. loginDialog: false, // 登入視窗
  8. profile: {}, // 使用者資訊
  9. }),
  10. getters: {
  11. isMobile: () => {
  12. // 判斷是否為手機裝置
  13. return /Mobile|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
  14. window.navigator.userAgent
  15. );
  16. },
  17. },
  18. actions: {
  19. // 檢查登入狀態
  20. checkToken() {
  21. const token = localStorage.getItem('token');
  22. console.log('checkToken', token);
  23. if (token) {
  24. this.token = token;
  25. this.loginState = true;
  26. } else {
  27. this.token = null;
  28. this.loginState = false;
  29. }
  30. return this.loginState;
  31. },
  32. logout() {
  33. localStorage.removeItem("token");
  34. return this.router.push("/");
  35. },
  36. getImageUrl(name) {
  37. return new URL(`/src/assets/img/${name}`, import.meta.url).href;
  38. },
  39. getTotalPages(totalRecords, recordsPerPage) { // 計算頁數
  40. return Math.ceil(totalRecords / recordsPerPage);
  41. },
  42. setProfile(data) {
  43. this.profile = data;
  44. },
  45. // 將日期格式轉成純字串
  46. formatDate(date) {
  47. const isTimestamp = !isNaN(date) && Number(date) >= 0; // 判斷是否為時間戳記
  48. if (!date) return ""; // 若選取的日期為空,回傳空字串
  49. if (!isTimestamp) {
  50. return date;
  51. } else {
  52. const year = date.getFullYear();
  53. const month = String(date.getMonth() + 1).padStart(2, "0");
  54. const day = String(date.getDate()).padStart(2, "0");
  55. // 組成 YYYY-MM-DD
  56. return `${year}-${month}-${day}`;
  57. }
  58. },
  59. // DatePicker
  60. datePickerFormat(date) {
  61. const day = date.getDate();
  62. const month = date.getMonth() + 1;
  63. const year = date.getFullYear();
  64. return `${year}-${month}-${day}`;
  65. },
  66. getPDF(name) {
  67. return `https://ntcri.org/pdf/${name}.pdf`;
  68. },
  69. // 過濾圖片標籤
  70. removeHtmlImages(value) {
  71. return value.replace(/<img\b[^>]*>/gi, "");
  72. },
  73. // 開啟登入視窗
  74. openLoginDialog() {
  75. this.loginDialog = true;
  76. },
  77. // 調整字串
  78. formatString(content) {
  79. if (content) {
  80. content = content.replace(/&lt;/g, "<");
  81. content = content.replace(/&gt;/g, ">");
  82. content = content.replace(/&amp;nbsp;/g, " ");
  83. content = content.replace(/&amp;times;/g, "×");
  84. content = content.replace(/&amp;#39;/g, "'");
  85. content = content.replace(/&middot;/g, "·");
  86. return content;
  87. }
  88. },
  89. checkTokenExpiration() {
  90. if (this.token) {
  91. // 解碼 JWT
  92. const base64Url = this.token.split(".")[1]; // 取得 JWT 的 payload
  93. const base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/"); // 處理 URL 安全的 Base64 字串
  94. const decodedPayload = atob(base64); // Base64 解碼
  95. // 將解碼後的 payload 轉換為 JSON 物件
  96. const payload = JSON.parse(decodedPayload);
  97. // 獲取過期時間(exp)
  98. const expirationTime = payload.exp; // 過期時間的 UNIX 時間戳
  99. // 創建 Date 物件並設定時間戳
  100. const expirationDate = new Date(expirationTime * 1000); // JS 時間戳以毫秒為單位故乘以 1000
  101. // 取得日期和時間的字串表示
  102. const formattedExpiration = expirationDate.toLocaleString();
  103. console.log("JWT 過期時間:", formattedExpiration);
  104. // 取得當前時間戳
  105. const currentTimestamp = Math.floor(Date.now() / 1000);
  106. let isTokenExpired;
  107. // 判斷 Token 是否已過期
  108. if (currentTimestamp > expirationTime) {
  109. isTokenExpired = true;
  110. } else {
  111. isTokenExpired = false;
  112. }
  113. return isTokenExpired;
  114. }
  115. }
  116. },
  117. })