123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- import { defineStore, } from 'pinia';
- export const useMainStore = defineStore('mainStore', {
- state: () => ({
- count: 0,
- token: "",
- loginState: false, // 登入狀態
- loginDialog: false, // 登入視窗
- profile: {}, // 使用者資訊
- }),
- getters: {
- isMobile: () => {
- // 判斷是否為手機裝置
- return /Mobile|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
- window.navigator.userAgent
- );
- },
- },
- actions: {
- // 檢查登入狀態
- checkToken() {
- const token = localStorage.getItem('token');
- console.log('checkToken', token);
- if (token) {
- this.token = token;
- this.loginState = true;
- } else {
- this.token = null;
- this.loginState = false;
- }
- return this.loginState;
- },
- logout() {
- localStorage.removeItem("token");
- return this.router.push("/");
- },
- getImageUrl(name) {
- return new URL(`/src/assets/img/${name}`, import.meta.url).href;
- },
- getTotalPages(totalRecords, recordsPerPage) { // 計算頁數
- return Math.ceil(totalRecords / recordsPerPage);
- },
- setProfile(data) {
- this.profile = data;
- },
- // 將日期格式轉成純字串
- formatDate(date) {
- const isTimestamp = !isNaN(date) && Number(date) >= 0; // 判斷是否為時間戳記
- if (!date) return ""; // 若選取的日期為空,回傳空字串
- if (!isTimestamp) {
- return date;
- } else {
- const year = date.getFullYear();
- const month = String(date.getMonth() + 1).padStart(2, "0");
- const day = String(date.getDate()).padStart(2, "0");
- // 組成 YYYY-MM-DD
- return `${year}-${month}-${day}`;
- }
- },
- // DatePicker
- datePickerFormat(date) {
- const day = date.getDate();
- const month = date.getMonth() + 1;
- const year = date.getFullYear();
- return `${year}-${month}-${day}`;
- },
- getPDF(name) {
- return `https://ntcri.org/pdf/${name}.pdf`;
- },
- // 過濾圖片標籤
- removeHtmlImages(value) {
- return value.replace(/<img\b[^>]*>/gi, "");
- },
- // 開啟登入視窗
- openLoginDialog() {
- this.loginDialog = true;
- },
- // 調整字串
- formatString(content) {
- if (content) {
- content = content.replace(/</g, "<");
- content = content.replace(/>/g, ">");
- content = content.replace(/&nbsp;/g, " ");
- content = content.replace(/&times;/g, "×");
- content = content.replace(/&#39;/g, "'");
- content = content.replace(/·/g, "·");
- return content;
- }
- },
- checkTokenExpiration() {
- if (this.token) {
- // 解碼 JWT
- const base64Url = this.token.split(".")[1]; // 取得 JWT 的 payload
- const base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/"); // 處理 URL 安全的 Base64 字串
- const decodedPayload = atob(base64); // Base64 解碼
- // 將解碼後的 payload 轉換為 JSON 物件
- const payload = JSON.parse(decodedPayload);
- // 獲取過期時間(exp)
- const expirationTime = payload.exp; // 過期時間的 UNIX 時間戳
- // 創建 Date 物件並設定時間戳
- const expirationDate = new Date(expirationTime * 1000); // JS 時間戳以毫秒為單位故乘以 1000
- // 取得日期和時間的字串表示
- const formattedExpiration = expirationDate.toLocaleString();
- console.log("JWT 過期時間:", formattedExpiration);
- // 取得當前時間戳
- const currentTimestamp = Math.floor(Date.now() / 1000);
- let isTokenExpired;
- // 判斷 Token 是否已過期
- if (currentTimestamp > expirationTime) {
- isTokenExpired = true;
- } else {
- isTokenExpired = false;
- }
- return isTokenExpired;
- }
- }
- },
- })
|