帖子分类

Change-Id: I17bafbfe3c1c8fd26c1e12499cb3c17cd1738e23
diff --git a/src/utils/axios.ts b/src/utils/axios.ts
index 1eaad87..273a9c4 100644
--- a/src/utils/axios.ts
+++ b/src/utils/axios.ts
@@ -12,6 +12,7 @@
   // 请求拦截器
   instance.interceptors.request.use(
     (config) => {
+      console.log('Request Config:', config)
       // 添加认证 token
       const token = localStorage.getItem('token')
       if (token) {
@@ -27,7 +28,6 @@
   // 响应拦截器
   instance.interceptors.response.use(
     (response) => {
-      console.log('Response:', response)
       // 统一处理响应数据格式
       if (response.status === 200) {
         return response.data
diff --git a/src/utils/jwt.ts b/src/utils/jwt.ts
new file mode 100644
index 0000000..42308dc
--- /dev/null
+++ b/src/utils/jwt.ts
@@ -0,0 +1,61 @@
+import { getRefreshToken } from '@/api/auth';
+import axios from 'axios';
+
+function parseJwt(token: string) {
+    console.log('Parsing JWT token:', token);
+    try {
+        const base64Url = token.split('.')[1];
+        const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
+        const jsonPayload = decodeURIComponent(
+            atob(base64)
+                .split('')
+                .map(c => `%${('00' + c.charCodeAt(0).toString(16)).slice(-2)}`)
+                .join('')
+        );
+        return JSON.parse(jsonPayload);
+    } catch (error) {
+        console.error('Invalid JWT token:', error);
+        return null;
+    }
+}
+
+/**
+ * 检查token是否过期
+ * @returns {string} -1: token无效 0: token未过期 1: token已过期
+**/
+export function isTokenExpired(token: string): string {
+    if (token === null || token === undefined) {
+        return '-1'; // 如果没有token,认为token无效
+    }
+    const decoded = parseJwt(token);
+    if (!decoded || !decoded.exp) {
+        return '-1'; // 如果解析失败或没有 `exp` 字段,认为token无效
+    }
+    const currentTime = Math.floor(Date.now() / 1000); // 当前时间(秒)
+    const bufferTime = 60 * 10; // 过期前的缓冲时间(秒)
+    return decoded.exp < currentTime ?decoded.exp < currentTime - bufferTime ? '-1' : '1'  :"0";
+}
+
+async function refreshToken() {
+    try {
+        const response = await axios.post(getRefreshToken, {
+            token: localStorage.getItem('token'),
+        });
+        const newToken = response.data.token;
+        localStorage.setItem('token', newToken);
+        return newToken;
+    } catch (error) {
+        console.error('Failed to refresh token:', error);
+        return null;
+    }
+}
+
+export async function checkAndRefreshToken() {
+    const token = localStorage.getItem('token');
+    if (token && isTokenExpired(token)=='1') {
+        const newToken = await refreshToken();
+        if (!newToken) {
+            localStorage.removeItem('token');
+        }
+    }
+}
\ No newline at end of file