lusa пре 1 месец
родитељ
комит
cd9051c210

+ 7 - 1
ui/sp-user-center/src/utils/auth.ts

@@ -2,7 +2,13 @@ const TokenKey = 'Admin-Token';
 
 const tokenStorage = useStorage<null | string>(TokenKey, null);
 
-export const getToken = () => tokenStorage.value;
+export const getToken = () => {
+    const val = tokenStorage.value;
+    if (!val || val === 'undefined' || val === 'null' || val === '""') {
+        return null;
+    }
+    return val;
+};
 
 export const setToken = (access_token: string) => (tokenStorage.value = access_token);
 

+ 28 - 0
ui/sp-user-center/src/utils/request.ts

@@ -131,6 +131,13 @@ service.interceptors.response.use(
       return res;
     }
     if (code === 401) {
+      if (msg === '未登录' || res.data.message === '未登录') {
+         // 未登录情况直接跳登录页,无需弹窗确认
+         useUserStore().logout().then(() => {
+             location.href = import.meta.env.VITE_APP_CONTEXT_PATH + 'login';
+         });
+         return Promise.reject('未登录,即将跳转到登录页。');
+      }
       // prettier-ignore
       if (!isRelogin.show) {
         isRelogin.show = true;
@@ -174,6 +181,27 @@ service.interceptors.response.use(
   },
   (error: any) => {
     console.log(error)
+    
+    // 如果是 HTTP 401,跳转到登录
+    if (error.response && error.response.status === 401) {
+      if (!isRelogin.show) {
+        isRelogin.show = true;
+        ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
+          confirmButtonText: '重新登录',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          isRelogin.show = false;
+          useUserStore().logout().then(() => {
+              location.href = import.meta.env.VITE_APP_CONTEXT_PATH + 'index';
+            });
+        }).catch(() => {
+          isRelogin.show = false;
+        });
+      }
+      return Promise.reject('无效的会话,或者会话已过期,请重新登录。');
+    }
+
     let { message } = error;
     if (message == 'Network Error') {
       message = '网络异常';

+ 14 - 4
ui/sp-user-center/src/views/index.vue

@@ -7,7 +7,8 @@
       </div>
       <div class="user-info">
         <img src="@/assets/images/home/Group@2x.png" alt="User" class="user-avatar" />
-        <span class="username">张小明</span>
+                <span class="username">{{ userName }}</span>
+     
       </div>
     </div>
 
@@ -31,22 +32,31 @@
 </template>
 
 <script setup name="Index" lang="ts">
-import { ref, onMounted } from 'vue';
+import { ref, onMounted, computed } from 'vue';
+import { storeToRefs } from 'pinia';
 import { getHomeApp, jumpToPage } from '@/api/app';
+import useUserStore from '@/store/modules/user';
 
 interface AppPage {
   pageId: number;
   appName: string;
+    pageIcon?: string;
 }
 
 interface AppInfo {
   appId: number;
-  appName: string;
-    pageIcon?: string;
+    appName: string;
   appPages: AppPage[];
 }
 
 const appList = ref<AppInfo[]>([]);
+const userStore = useUserStore();
+const { userInfo, nickname } = storeToRefs(userStore);
+
+// 获取用户姓名,优先显示真实姓名,如果没有则显示用户名
+const userName = computed(() => {
+    return userInfo.value?.realName || nickname.value || '用户';
+});
 
 // Helper to get icon path
 const getIconPath = (name: string) => {