From de59371f50991a0dbee997eb4a13fd3f5f415ffd Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期五, 21 三月 2025 09:45:21 +0800
Subject: [PATCH] feat(login): 添加 Keycloak 登录支持
---
src/components/TopNav/index.vue | 139 +++++++++++++++++++++++++++-------------------
1 files changed, 81 insertions(+), 58 deletions(-)
diff --git a/src/components/TopNav/index.vue b/src/components/TopNav/index.vue
index 41e3a11..cfe2cd7 100644
--- a/src/components/TopNav/index.vue
+++ b/src/components/TopNav/index.vue
@@ -1,21 +1,22 @@
<template>
- <el-menu :default-active="activeMenu" mode="horizontal" @select="handleSelect" :ellipsis="false">
- <template v-for="(item, index) in topMenus">
- <el-menu-item :style="{'--theme': theme}" :index="item.path" :key="index" v-if="index < visibleNumber"
- ><svg-icon :icon-class="item.meta ? item.meta.icon : '' " /> {{ item.meta?.title }}</el-menu-item
- >
- </template>
+ <el-menu :default-active="activeMenu" mode="horizontal" :ellipsis="false" @select="handleSelect">
+ <template v-for="(item, index) in topMenus">
+ <el-menu-item v-if="index < visibleNumber" :key="index" :style="{ '--theme': theme }" :index="item.path"
+ ><svg-icon v-if="item.meta && item.meta.icon && item.meta.icon !== '#'" :icon-class="item.meta ? item.meta.icon : ''" />
+ {{ item.meta?.title }}</el-menu-item
+ >
+ </template>
- <!-- 椤堕儴鑿滃崟瓒呭嚭鏁伴噺鎶樺彔 -->
- <el-sub-menu :style="{'--theme': theme}" index="more" v-if="topMenus.length > visibleNumber">
- <template #title>鏇村鑿滃崟</template>
- <template v-for="(item, index) in topMenus">
- <el-menu-item :index="item.path" :key="index" v-if="index >= visibleNumber"
- ><svg-icon :icon-class="item.meta ? item.meta.icon : '' " /> {{ item.meta?.title }}</el-menu-item
- >
- </template>
- </el-sub-menu>
- </el-menu>
+ <!-- 椤堕儴鑿滃崟瓒呭嚭鏁伴噺鎶樺彔 -->
+ <el-sub-menu v-if="topMenus.length > visibleNumber" :style="{ '--theme': theme }" index="more">
+ <template #title>鏇村鑿滃崟</template>
+ <template v-for="(item, index) in topMenus">
+ <el-menu-item v-if="index >= visibleNumber" :key="index" :index="item.path"
+ ><svg-icon :icon-class="item.meta ? item.meta.icon : ''" /> {{ item.meta?.title }}</el-menu-item
+ >
+ </template>
+ </el-sub-menu>
+ </el-menu>
</template>
<script setup lang="ts">
@@ -24,7 +25,7 @@
import useAppStore from '@/store/modules/app';
import useSettingsStore from '@/store/modules/settings';
import usePermissionStore from '@/store/modules/permission';
-import { RouteOption } from 'vue-router';
+import { RouteRecordRaw } from 'vue-router';
// 椤堕儴鏍忓垵濮嬫暟
const visibleNumber = ref<number>(-1);
@@ -33,121 +34,130 @@
// 闅愯棌渚ц竟鏍忚矾鐢�
const hideList = ['/index', '/user/profile'];
-const appStore = useAppStore()
-const settingsStore = useSettingsStore()
-const permissionStore = usePermissionStore()
+const appStore = useAppStore();
+const settingsStore = useSettingsStore();
+const permissionStore = usePermissionStore();
const route = useRoute();
const router = useRouter();
// 涓婚棰滆壊
const theme = computed(() => settingsStore.theme);
// 鎵�鏈夌殑璺敱淇℃伅
-const routers = computed(() => permissionStore.topbarRouters);
+const routers = computed(() => permissionStore.getTopbarRoutes());
// 椤堕儴鏄剧ず鑿滃崟
const topMenus = computed(() => {
- let topMenus:RouteOption[] = [];
+ let topMenus: RouteRecordRaw[] = [];
routers.value.map((menu) => {
if (menu.hidden !== true) {
// 鍏煎椤堕儴鏍忎竴绾ц彍鍗曞唴閮ㄨ烦杞�
- if (menu.path === "/") {
- topMenus.push(menu.children? menu.children[0] : menu);
+ if (menu.path === '/') {
+ topMenus.push(menu.children ? menu.children[0] : menu);
} else {
- topMenus.push(menu);
+ topMenus.push(menu);
}
}
- })
+ });
return topMenus;
-})
+});
// 璁剧疆瀛愯矾鐢�
const childrenMenus = computed(() => {
- let childrenMenus:RouteOption[] = [];
+ let childrenMenus: RouteRecordRaw[] = [];
routers.value.map((router) => {
router.children?.forEach((item) => {
if (item.parentPath === undefined) {
- if(router.path === "/") {
- item.path = "/" + item.path;
+ if (router.path === '/') {
+ item.path = '/' + item.path;
} else {
- if(!isHttp(item.path)) {
- item.path = router.path + "/" + item.path;
+ if (!isHttp(item.path)) {
+ item.path = router.path + '/' + item.path;
}
}
item.parentPath = router.path;
}
childrenMenus.push(item);
- })
- })
+ });
+ });
return constantRoutes.concat(childrenMenus);
-})
+});
// 榛樿婵�娲荤殑鑿滃崟
const activeMenu = computed(() => {
- const path = route.path;
+ let path = route.path;
+ if (path === '/index') {
+ path = '/system/user';
+ }
let activePath = path;
- if (path !== undefined && path.lastIndexOf("/") > 0 && hideList.indexOf(path) === -1) {
+ if (path !== undefined && path.lastIndexOf('/') > 0 && hideList.indexOf(path) === -1) {
const tmpPath = path.substring(1, path.length);
- activePath = "/" + tmpPath.substring(0, tmpPath.indexOf("/"));
if (!route.meta.link) {
- appStore.toggleSideBarHide(false);
+ activePath = '/' + tmpPath.substring(0, tmpPath.indexOf('/'));
+ appStore.toggleSideBarHide(false);
}
- } else if(!route.children) {
+ } else if (!route.children) {
activePath = path;
appStore.toggleSideBarHide(true);
}
activeRoutes(activePath);
return activePath;
-})
+});
const setVisibleNumber = () => {
const width = document.body.getBoundingClientRect().width / 3;
visibleNumber.value = parseInt(String(width / 85));
-}
+};
-const handleSelect = (key: string, keyPath: string[]) => {
+const handleSelect = (key: string) => {
currentIndex.value = key;
- const route = routers.value.find(item => item.path === key);
+ const route = routers.value.find((item) => item.path === key);
if (isHttp(key)) {
// http(s):// 璺緞鏂扮獥鍙f墦寮�
- window.open(key, "_blank");
+ window.open(key, '_blank');
} else if (!route || !route.children) {
// 娌℃湁瀛愯矾鐢辫矾寰勫唴閮ㄦ墦寮�
- router.push({ path: key, fullPath: '' });
+ const routeMenu = childrenMenus.value.find((item) => item.path === key);
+ if (routeMenu && routeMenu.query) {
+ let query = JSON.parse(routeMenu.query);
+ router.push({ path: key, query: query });
+ } else {
+ router.push({ path: key });
+ }
appStore.toggleSideBarHide(true);
} else {
// 鏄剧ず宸︿晶鑱斿姩鑿滃崟
activeRoutes(key);
appStore.toggleSideBarHide(false);
}
-}
+};
const activeRoutes = (key: string) => {
- let routes:RouteOption[] = [];
+ let routes: RouteRecordRaw[] = [];
if (childrenMenus.value && childrenMenus.value.length > 0) {
childrenMenus.value.map((item) => {
- if (key == item.parentPath || (key == "index" && "" == item.path)) {
+ if (key == item.parentPath || (key == 'index' && '' == item.path)) {
routes.push(item);
}
});
}
- if(routes.length > 0) {
+ if (routes.length > 0) {
permissionStore.setSidebarRouters(routes);
} else {
appStore.toggleSideBarHide(true);
}
return routes;
-}
+};
onMounted(() => {
- window.addEventListener('resize', setVisibleNumber)
-})
+ window.addEventListener('resize', setVisibleNumber);
+});
onBeforeUnmount(() => {
- window.removeEventListener('resize', setVisibleNumber)
-})
+ window.removeEventListener('resize', setVisibleNumber);
+});
onMounted(() => {
- setVisibleNumber()
-})
+ setVisibleNumber();
+});
</script>
<style lang="scss">
@@ -160,7 +170,8 @@
margin: 0 10px !important;
}
-.topmenu-container.el-menu--horizontal > .el-menu-item.is-active, .el-menu--horizontal > .el-sub-menu.is-active .el-submenu__title {
+.topmenu-container.el-menu--horizontal > .el-menu-item.is-active,
+.el-menu--horizontal > .el-sub-menu.is-active .el-submenu__title {
border-bottom: 2px solid #{'var(--theme)'} !important;
color: #303133;
}
@@ -174,4 +185,16 @@
padding: 0 5px !important;
margin: 0 10px !important;
}
+
+/* 鑳屾櫙鑹查殣钘� */
+.topmenu-container.el-menu--horizontal > .el-menu-item:not(.is-disabled):focus,
+.topmenu-container.el-menu--horizontal > .el-menu-item:not(.is-disabled):hover,
+.topmenu-container.el-menu--horizontal > .el-submenu .el-submenu__title:hover {
+ background-color: #ffffff !important;
+}
+
+/* 鍥炬爣鍙抽棿璺� */
+.topmenu-container .svg-icon {
+ margin-right: 4px;
+}
</style>
--
Gitblit v1.9.3