Переглянути джерело

feat(profile): 隐藏第三方应用 tab; feat(layout): 头像下拉新增个人中心/布局设置; chore(sse): 重试改为无限重试(后端断连时不再放弃)

yangjingjing 1 день тому
батько
коміт
79e5e8a973
4 змінених файлів з 27 додано та 19 видалено
  1. 21 2
      src/layout/index.vue
  2. 1 1
      src/settings.ts
  3. 5 4
      src/utils/sse.ts
  4. 0 12
      src/views/system/user/profile/index.vue

+ 21 - 2
src/layout/index.vue

@@ -23,7 +23,13 @@
           </div>
           <template #dropdown>
             <el-dropdown-menu>
-              <el-dropdown-item command="logout">
+              <el-dropdown-item command="profile">
+                <el-icon><UserFilled /></el-icon>个人中心
+              </el-dropdown-item>
+              <el-dropdown-item v-if="settingsStore.showSettings" command="setLayout">
+                <el-icon><Setting /></el-icon>布局设置
+              </el-dropdown-item>
+              <el-dropdown-item divided command="logout">
                 <el-icon><SwitchButton /></el-icon>退出登录
               </el-dropdown-item>
             </el-dropdown-menu>
@@ -32,6 +38,9 @@
       </div>
     </header>
 
+    <!-- 布局设置抽屉(从框架 Navbar 复用) -->
+    <Settings v-model="showSettingsDrawer" />
+
     <div class="risk-body">
       <!-- 极简左侧菜单 -->
       <aside class="risk-sidebar">
@@ -70,12 +79,14 @@
 </template>
 
 <script setup lang="ts">
-import { computed, onMounted } from 'vue';
+import { computed, onMounted, ref } from 'vue';
 import { useRoute, useRouter } from 'vue-router';
 import { ElMessageBox } from 'element-plus';
 import { useUserStore } from '@/store/modules/user';
 import { usePermissionStore } from '@/store/modules/permission';
+import { useSettingsStore } from '@/store/modules/settings';
 import { Lock, Bell, ArrowDown, HomeFilled, SwitchButton, Document, Warning, User, UserFilled, Tickets, Connection, Message, WarningFilled, List, Edit, Odometer, Guide, OfficeBuilding, Histogram, Setting, Tools, ChatLineRound, DataLine, Cellphone } from '@element-plus/icons-vue';
+import Settings from '@/layout/components/Settings/index.vue';
 import { logout } from '@/api/login';
 import { initSSE } from '@/utils/sse';
 
@@ -83,6 +94,10 @@ const route = useRoute();
 const router = useRouter();
 const userStore = useUserStore();
 const permissionStore = usePermissionStore();
+const settingsStore = useSettingsStore();
+
+// 布局设置抽屉开关
+const showSettingsDrawer = ref(false);
 
 const userName = computed(() => userStore.nickname || '管理员');
 const avatarUrl = computed(() => userStore.avatar || 'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png');
@@ -233,6 +248,10 @@ const handleUserCmd = async (cmd: string) => {
     } catch {
       // cancel
     }
+  } else if (cmd === 'profile') {
+    router.push('/user/profile');
+  } else if (cmd === 'setLayout') {
+    showSettingsDrawer.value = true;
   }
 };
 

+ 1 - 1
src/settings.ts

@@ -16,7 +16,7 @@ const setting: DefaultSettings = {
   /**
    * 是否系统布局配置
    */
-  showSettings: false,
+  showSettings: true,
 
   /**
    * 默认布局

+ 5 - 4
src/utils/sse.ts

@@ -9,12 +9,13 @@ export const initSSE = (url: any) => {
   }
 
   url = url + '?Authorization=Bearer ' + getToken() + '&clientid=' + import.meta.env.VITE_APP_CLIENT_ID;
-  const { data, error } = useEventSource(url, [], {
+  const { data, error, status } = useEventSource(url, [], {
     autoReconnect: {
-      retries: 5,
-      delay: 5000,
+      // 后端 9225 没起来/重启/网络抖动时,一直重试,不放弃
+      retries: -1,
+      delay: 3000,
       onFailed() {
-        console.log('Failed to connect after 5 retries');
+        console.warn('[SSE] 已达最大重试次数,3s 后继续重连');
       }
     }
   });

+ 0 - 12
src/views/system/user/profile/index.vue

@@ -55,9 +55,6 @@
             <el-tab-pane label="修改密码" name="resetPwd">
               <resetPwd />
             </el-tab-pane>
-            <el-tab-pane label="第三方应用" name="thirdParty">
-              <thirdParty :auths="state.auths" />
-            </el-tab-pane>
             <el-tab-pane label="在线设备" name="onlineDevice">
               <onlineDevice :devices="state.devices" />
             </el-tab-pane>
@@ -72,9 +69,7 @@
 import UserAvatar from './userAvatar.vue';
 import UserInfo from './userInfo.vue';
 import ResetPwd from './resetPwd.vue';
-import ThirdParty from './thirdParty.vue';
 import OnlineDevice from './onlineDevice.vue';
-import { getAuthList } from '@/api/system/social/auth';
 import { getUserProfile } from '@/api/system/user';
 import { getOnline } from '@/api/monitor/online';
 import { UserVO } from '@/api/system/user/types';
@@ -84,14 +79,12 @@ interface State {
   user: Partial<UserVO>;
   roleGroup: string;
   postGroup: string;
-  auths: any;
   devices: any;
 }
 const state = ref<State>({
   user: {},
   roleGroup: '',
   postGroup: '',
-  auths: [],
   devices: []
 });
 
@@ -105,10 +98,6 @@ const getUser = async () => {
   state.value.postGroup = res.data.postGroup;
 };
 
-const getAuths = async () => {
-  const res = await getAuthList();
-  state.value.auths = res.data;
-};
 const getOnlines = async () => {
   const res = await getOnline();
   state.value.devices = res.rows;
@@ -116,7 +105,6 @@ const getOnlines = async () => {
 
 onMounted(() => {
   getUser();
-  getAuths();
   getOnlines();
 });
 </script>