Commit 677214c7 by ningjihai

路由

parent 45e60497
<template> <template>
<div v-if="!item.hidden"> <div v-if="!item.hidden">
{{ item }}
<template v-if="hasOneShowingChild(item.children, item) && (!onlyOneChild.children || onlyOneChild.noShowingChildren) && !item.alwaysShow"> <template v-if="hasOneShowingChild(item.children, item) && (!onlyOneChild.children || onlyOneChild.noShowingChildren) && !item.alwaysShow">
<app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path, onlyOneChild.query)"> <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)">
<el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{ 'submenu-title-noDropdown': !isNest }"> <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{ 'submenu-title-noDropdown': !isNest }">
<svg-icon :icon-class="onlyOneChild.meta.icon || (item.meta && item.meta.icon)"/> <!-- <svg-icon v-if="onlyOneChild.meta.icon" :icon-class="onlyOneChild.meta.icon"/> -->
<template #title><span class="menu-title" :title="hasTitle(onlyOneChild.meta.title)">{{ onlyOneChild.meta.title }}</span></template> <template #title>
<span class="menu-title" :title="hasTitle(onlyOneChild.meta.title)">
{{ onlyOneChild.meta.title }}
</span>
</template>
<!-- <span class="menu-title" :title="hasTitle(onlyOneChild.meta.title)">
{{ onlyOneChild.meta.title }}
</span> -->
</el-menu-item> </el-menu-item>
</app-link> </app-link>
</template> </template>
<el-sub-menu v-else ref="subMenu" :index="resolvePath(item.path)" teleported> <el-sub-menu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body>
<template v-if="item.meta" #title> <template #title>
<svg-icon :icon-class="item.meta && item.meta.icon" /> <!-- <svg-icon v-if="item.meta && item.meta.icon" :icon-class="item.meta.icon" /> -->
<span class="menu-title" :title="hasTitle(item.meta.title)">{{ item.meta.title }}</span> <span class="menu-title" :title="hasTitle(item.meta.title)">
{{ item.meta.title }}
</span>
</template> </template>
<sidebar-item <sidebar-item
v-for="(child, index) in item.children" v-for="child in item.children"
:key="child.path + index" :key="child.path"
:is-nest="true" :is-nest="true"
:item="child" :item="child"
:base-path="resolvePath(child.path)" :base-path="resolvePath(child.path)"
...@@ -31,9 +40,9 @@ ...@@ -31,9 +40,9 @@
import { isExternal } from '@/utils/validate' import { isExternal } from '@/utils/validate'
import AppLink from './Link' import AppLink from './Link'
import { getNormalPath } from '@/utils/ruoyi' import { getNormalPath } from '@/utils/ruoyi'
import { ref } from 'vue'
const props = defineProps({ const props = defineProps({
// route object
item: { item: {
type: Object, type: Object,
required: true required: true
...@@ -62,12 +71,10 @@ function hasOneShowingChild(children = [], parent) { ...@@ -62,12 +71,10 @@ function hasOneShowingChild(children = [], parent) {
return true return true
}) })
// When there is only one child router, the child router is displayed by default
if (showingChildren.length === 1) { if (showingChildren.length === 1) {
return true return true
} }
// Show parent if there are no child router to display
if (showingChildren.length === 0) { if (showingChildren.length === 0) {
onlyOneChild.value = { ...parent, path: '', noShowingChildren: true } onlyOneChild.value = { ...parent, path: '', noShowingChildren: true }
return true return true
...@@ -76,25 +83,17 @@ function hasOneShowingChild(children = [], parent) { ...@@ -76,25 +83,17 @@ function hasOneShowingChild(children = [], parent) {
return false return false
} }
function resolvePath(routePath, routeQuery) { function resolvePath(routePath) {
if (isExternal(routePath)) { if (isExternal(routePath)) {
return routePath return routePath
} }
if (isExternal(props.basePath)) { if (isExternal(props.basePath)) {
return props.basePath return props.basePath
} }
if (routeQuery) {
let query = JSON.parse(routeQuery)
return { path: getNormalPath(props.basePath + '/' + routePath), query: query }
}
return getNormalPath(props.basePath + '/' + routePath) return getNormalPath(props.basePath + '/' + routePath)
} }
function hasTitle(title){ function hasTitle(title) {
if (title.length > 5) { return title && title.length > 5 ? title : ""
return title
} else {
return ""
}
} }
</script> </script>
\ No newline at end of file
...@@ -14,8 +14,8 @@ ...@@ -14,8 +14,8 @@
:class="sideTheme" :class="sideTheme"
> >
<sidebar-item <sidebar-item
v-for="(route, index) in sidebarRouters" v-for="(route, index) in processedRouters"
:key="route.path + index" :key="route.id || route.path + index"
:item="route" :item="route"
:base-path="route.path" :base-path="route.path"
/> />
...@@ -30,14 +30,33 @@ import SidebarItem from './SidebarItem' ...@@ -30,14 +30,33 @@ import SidebarItem from './SidebarItem'
import variables from '@/assets/styles/variables.module.scss' import variables from '@/assets/styles/variables.module.scss'
import useAppStore from '@/store/modules/app' import useAppStore from '@/store/modules/app'
import useSettingsStore from '@/store/modules/settings' import useSettingsStore from '@/store/modules/settings'
import usePermissionStore from '@/store/modules/permission' import { computed } from 'vue'
const route = useRoute() const route = useRoute()
const appStore = useAppStore() const appStore = useAppStore()
const settingsStore = useSettingsStore() const settingsStore = useSettingsStore()
const permissionStore = usePermissionStore() console.log('appStore.navList',appStore.navList)
// 转换接口数据为组件需要的格式
const processedRouters = computed(() => {
return appStore.navList.map(item => ({
path: item.path,
meta: {
title: item.name,
icon: item.iconCls,
id: item.id
},
children: item.children?.map(child => ({
path: child.path,
name: child.name,
meta: {
title: child.name,
icon: child.iconCls,
id: child.id
}
})) || []
}))
})
const sidebarRouters = computed(() => permissionStore.sidebarRouters)
const showLogo = computed(() => settingsStore.sidebarLogo) const showLogo = computed(() => settingsStore.sidebarLogo)
const sideTheme = computed(() => settingsStore.sideTheme) const sideTheme = computed(() => settingsStore.sideTheme)
const theme = computed(() => settingsStore.theme) const theme = computed(() => settingsStore.theme)
...@@ -69,36 +88,5 @@ const activeMenu = computed(() => { ...@@ -69,36 +88,5 @@ const activeMenu = computed(() => {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.sidebar-container { /* 保持原有样式不变 */
background-color: v-bind(getMenuBackground); </style>
\ No newline at end of file
.scrollbar-wrapper {
background-color: v-bind(getMenuBackground);
}
.el-menu {
border: none;
height: 100%;
width: 100% !important;
.el-menu-item, .el-sub-menu__title {
&:hover {
background-color: var(--menu-hover, rgba(0, 0, 0, 0.06)) !important;
}
}
.el-menu-item {
color: v-bind(getMenuTextColor);
&.is-active {
color: var(--menu-active-text, #409eff);
background-color: var(--menu-hover, rgba(0, 0, 0, 0.06)) !important;
}
}
.el-sub-menu__title {
color: v-bind(getMenuTextColor);
}
}
}
</style>
...@@ -17,6 +17,7 @@ const router = useRouter() ...@@ -17,6 +17,7 @@ const router = useRouter()
localUserName: sessionStorage.getItem('localUserName') ? JSON.parse(sessionStorage.getItem('localUserName')) : '', localUserName: sessionStorage.getItem('localUserName') ? JSON.parse(sessionStorage.getItem('localUserName')) : '',
bindDataSourceInfo: sessionStorage.getItem('bindDataSourceInfo') ? JSON.parse(sessionStorage.getItem('bindDataSourceInfo')) : {}, bindDataSourceInfo: sessionStorage.getItem('bindDataSourceInfo') ? JSON.parse(sessionStorage.getItem('bindDataSourceInfo')) : {},
navList: sessionStorage.getItem('navList') ? JSON.parse(sessionStorage.getItem('navList')) : [], navList: sessionStorage.getItem('navList') ? JSON.parse(sessionStorage.getItem('navList')) : [],
allnavList: sessionStorage.getItem('allnavList') ? JSON.parse(sessionStorage.getItem('allnavList')) : [],
navStatus: sessionStorage.getItem('navStatus') ? JSON.parse(sessionStorage.getItem('navStatus')) : { type: 'manage' }, navStatus: sessionStorage.getItem('navStatus') ? JSON.parse(sessionStorage.getItem('navStatus')) : { type: 'manage' },
leftNavActiveId: '', leftNavActiveId: '',
queryData: sessionStorage.getItem('queryData') ? JSON.parse(sessionStorage.getItem('queryData')) : {}, queryData: sessionStorage.getItem('queryData') ? JSON.parse(sessionStorage.getItem('queryData')) : {},
...@@ -332,6 +333,10 @@ const router = useRouter() ...@@ -332,6 +333,10 @@ const router = useRouter()
this.navList = data this.navList = data
sessionStorage.setItem('navList', JSON.stringify(data)) sessionStorage.setItem('navList', JSON.stringify(data))
}, },
setallNav(data) {
this.allnavList = data
sessionStorage.setItem('allnavList', JSON.stringify(data))
},
setNavOpen(data) { setNavOpen(data) {
this.navOpen = data this.navOpen = data
......
...@@ -16,7 +16,8 @@ const usePermissionStore = defineStore( ...@@ -16,7 +16,8 @@ const usePermissionStore = defineStore(
addRoutes: [], addRoutes: [],
defaultRoutes: [], defaultRoutes: [],
topbarRouters: [], topbarRouters: [],
sidebarRouters: [] sidebarRouters: [],
allsidebarRouters: []
}), }),
actions: { actions: {
setRoutes(routes) { setRoutes(routes) {
...@@ -32,6 +33,10 @@ const usePermissionStore = defineStore( ...@@ -32,6 +33,10 @@ const usePermissionStore = defineStore(
setSidebarRouters(routes) { setSidebarRouters(routes) {
this.sidebarRouters = routes this.sidebarRouters = routes
}, },
allsidebarRouters(routes){
this.sidebarRoutersall = routes
console.log(routes)
},
generateRoutes(roles) { generateRoutes(roles) {
return new Promise(resolve => { return new Promise(resolve => {
// 向后端请求路由数据 // 向后端请求路由数据
......
...@@ -13,6 +13,12 @@ import { useDict } from '@/utils/dict' ...@@ -13,6 +13,12 @@ import { useDict } from '@/utils/dict'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import useAppStore from '@/store/modules/app'
import usePermissionStore from '@/store/modules/permission'
const appStore = useAppStore()
const permissionStore = usePermissionStore()
const router = useRouter() const router = useRouter()
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
...@@ -129,7 +135,19 @@ const handleEditField = (field) => { ...@@ -129,7 +135,19 @@ const handleEditField = (field) => {
console.log('编辑字段', field) console.log('编辑字段', field)
} }
const openDecrypt = ref(false) const openDecrypt = ref(false)
function pageProjectManage() { function pageProjectManage() {
let filterMenus = appStore.navStatus.type === 'manage' ? appStore.allnavList.filter(item => item.type === '1') : appStore.allnavList.filter(item => item.type === '2')
// 设置导航菜单
appStore.setNav(filterMenus)
permissionStore.setSidebarRouters(filterMenus)
let type = appStore.navStatus.type === 'manage' ? 'project' : 'manage'
appStore.setNavStatus({type: type})
router.push({ router.push({
path: '/projectManage' path: '/projectManage'
}) })
......
...@@ -6,6 +6,11 @@ import QueryForm from './QueryForm.vue' ...@@ -6,6 +6,11 @@ import QueryForm from './QueryForm.vue'
// import DownloadPluginDialog from './DownloadPluginDialog.vue' // import DownloadPluginDialog from './DownloadPluginDialog.vue'
// import ExportDialog from './ExportDialog.vue' // import ExportDialog from './ExportDialog.vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import useAppStore from '@/store/modules/app'
import usePermissionStore from '@/store/modules/permission'
const appStore = useAppStore()
const permissionStore = usePermissionStore()
const router = useRouter() const router = useRouter()
const emit = defineEmits(['page']) const emit = defineEmits(['page'])
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
...@@ -48,8 +53,18 @@ function getList() { ...@@ -48,8 +53,18 @@ function getList() {
} }
function pageProjectManage() { function pageProjectManage() {
let filterMenus = appStore.navStatus.type === 'manage' ? appStore.allnavList.filter(item => item.type === '1') : appStore.allnavList.filter(item => item.type === '2')
// 设置导航菜单
appStore.setNav(filterMenus)
permissionStore.setSidebarRouters(filterMenus)
let type = appStore.navStatus.type === 'manage' ? 'project' : 'manage'
appStore.setNavStatus({type: type})
router.push({ router.push({
path: '/projectManage' path: '/projectManage'
}) })
......
...@@ -26,6 +26,13 @@ ...@@ -26,6 +26,13 @@
@click="goTarget('http://ruoyi.vip')" @click="goTarget('http://ruoyi.vip')"
>访问主页</el-button >访问主页</el-button
> >
<el-button
icon="HomeFilled"
plain
@click="checkMenuType"
>区分路由</el-button
>
</p> </p>
</el-col> </el-col>
...@@ -1058,11 +1065,35 @@ ...@@ -1058,11 +1065,35 @@
</template> </template>
<script setup name="Index"> <script setup name="Index">
import useAppStore from '@/store/modules/app'
import usePermissionStore from '@/store/modules/permission'
const appStore = useAppStore()
const permissionStore = usePermissionStore()
const version = ref('3.9.0') const version = ref('3.9.0')
function goTarget(url) { function goTarget(url) {
window.open(url, '__blank') window.open(url, '__blank')
} }
function checkMenuType() {
console.log('appStore.navStatus',appStore.navStatus.type)
let filterMenus = appStore.navStatus.type === 'manage' ? appStore.allnavList.filter(item => item.type === '1') : appStore.allnavList.filter(item => item.type === '2')
// 设置导航菜单
appStore.setNav(filterMenus)
permissionStore.setSidebarRouters(filterMenus)
let type = appStore.navStatus.type === 'manage' ? 'project' : 'manage'
appStore.setNavStatus({type: type})
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
......
...@@ -71,9 +71,14 @@ import { sm4 as SM4 } from 'gm-crypt' ...@@ -71,9 +71,14 @@ import { sm4 as SM4 } from 'gm-crypt'
import { encrypt, decrypt } from "@/utils/jsencrypt" import { encrypt, decrypt } from "@/utils/jsencrypt"
import useUserStore from '@/store/modules/user' import useUserStore from '@/store/modules/user'
import useAppStore from '@/store/modules/app' import useAppStore from '@/store/modules/app'
import usePermissionStore from '@/store/modules/permission'
import { useRoute, useRouter } from 'vue-router' import { useRoute, useRouter } from 'vue-router'
const route = useRoute() const route = useRoute()
const router = useRouter() const router = useRouter()
const permissionStore = usePermissionStore()
const title = import.meta.env.VITE_APP_TITLE const title = import.meta.env.VITE_APP_TITLE
const userStore = useUserStore() const userStore = useUserStore()
const appStore = useAppStore() const appStore = useAppStore()
...@@ -155,9 +160,17 @@ function handleLogin() { ...@@ -155,9 +160,17 @@ function handleLogin() {
} }
try { try {
await appStore.signOut('login') await appStore.signOut('login')
let filterMenus = appStore.navStatus.type === 'manage' ? menus.filter(item => item.type === '1') : menus.filter(item => item.type === '2')
// 设置导航菜单 // 设置导航菜单
appStore.setNav({ menus: data.menus }) appStore.setNav(filterMenus)
appStore.setallNav(menus)
console.log('menus',filterMenus)
permissionStore.allsidebarRouters(menus)
permissionStore.setSidebarRouters(filterMenus)
// 设置用户信息 // 设置用户信息
appStore.setUserInfo({user, licenseRst: data.licenseRst, loginBlankMenus}) appStore.setUserInfo({user, licenseRst: data.licenseRst, loginBlankMenus})
...@@ -177,7 +190,6 @@ function handleLogin() { ...@@ -177,7 +190,6 @@ function handleLogin() {
return acc return acc
}, {}) }, {})
console.log('路由配置:', router.getRoutes())
router.push({ path:"/index", query: otherQueryParams }) router.push({ path:"/index", query: otherQueryParams })
// router.push({ path: redirect.value || "/index", query: otherQueryParams }) // router.push({ path: redirect.value || "/index", query: otherQueryParams })
......
...@@ -14,6 +14,15 @@ import neicun from '@/assets/images/project/neicun.png' ...@@ -14,6 +14,15 @@ import neicun from '@/assets/images/project/neicun.png'
import rateChart from './modules/rateChart.vue' import rateChart from './modules/rateChart.vue'
import DiskUsageChart from './modules/DiskUsageChart.vue' import DiskUsageChart from './modules/DiskUsageChart.vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import useAppStore from '@/store/modules/app'
import usePermissionStore from '@/store/modules/permission'
const appStore = useAppStore()
const permissionStore = usePermissionStore()
const router = useRouter() const router = useRouter()
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
...@@ -73,6 +82,17 @@ getInfo() ...@@ -73,6 +82,17 @@ getInfo()
function pageProjectManage() { function pageProjectManage() {
let filterMenus = appStore.navStatus.type === 'manage' ? appStore.allnavList.filter(item => item.type === '1') : appStore.allnavList.filter(item => item.type === '2')
// 设置导航菜单
appStore.setNav(filterMenus)
permissionStore.setSidebarRouters(filterMenus)
let type = appStore.navStatus.type === 'manage' ? 'project' : 'manage'
appStore.setNavStatus({type: type})
router.push({ router.push({
path: '/projectManage' path: '/projectManage'
}) })
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论