mirror of
https://gh-proxy.org/https://github.com/klinsmaya/SQLBot.git
synced 2026-11-08 01:06:59 +08:00
perf: System ui
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<script lang="ts" setup>
|
||||
import { ref } from 'vue'
|
||||
import { ref, computed } from 'vue'
|
||||
import Menu from './Menu.vue'
|
||||
import Workspace from './Workspace.vue'
|
||||
import Person from './Person.vue'
|
||||
@@ -8,16 +8,19 @@ import LOGO_fold from '@/assets/LOGO-fold.svg'
|
||||
import icon_moments_categories_outlined from '@/assets/svg/icon_moments-categories_outlined.svg'
|
||||
import icon_side_fold_outlined from '@/assets/svg/icon_side-fold_outlined.svg'
|
||||
import icon_side_expand_outlined from '@/assets/svg/icon_side-expand_outlined.svg'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
const router = useRouter()
|
||||
const collapse = ref(false)
|
||||
|
||||
const handleFoldExpand = () => {
|
||||
collapse.value = !collapse.value
|
||||
}
|
||||
const toWorkspace = () => {
|
||||
router.push('/')
|
||||
}
|
||||
const route = useRoute()
|
||||
const showSysmenu = computed(() => {
|
||||
return route.path.includes('/system')
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -25,10 +28,10 @@ const toWorkspace = () => {
|
||||
<div class="left-side" :class="collapse && 'left-side-collapse'">
|
||||
<LOGO_fold v-if="collapse" style="margin: 0 0 6px 5px"></LOGO_fold>
|
||||
<LOGO v-else style="margin-bottom: 6px"></LOGO>
|
||||
<Workspace :collapse="collapse"></Workspace>
|
||||
<Workspace v-if="!showSysmenu" :collapse="collapse"></Workspace>
|
||||
<Menu :collapse="collapse"></Menu>
|
||||
<div class="bottom">
|
||||
<div class="back-to_workspace" @click="toWorkspace">
|
||||
<div v-if="showSysmenu" class="back-to_workspace" @click="toWorkspace">
|
||||
<el-icon size="16">
|
||||
<icon_moments_categories_outlined></icon_moments_categories_outlined>
|
||||
</el-icon>
|
||||
|
||||
@@ -1,25 +1,47 @@
|
||||
<script lang="ts" setup>
|
||||
import { computed } from 'vue'
|
||||
import { ElMenu } from 'element-plus-secondary'
|
||||
import { useRoute } from 'vue-router'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import MenuItem from './MenuItem.vue'
|
||||
|
||||
const router = useRouter()
|
||||
defineProps({
|
||||
collapse: Boolean,
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
const menuList = computed(() => route.matched[0]?.children || [])
|
||||
|
||||
const activeIndex = computed(() => {
|
||||
// const menuList = computed(() => route.matched[0]?.children || [])
|
||||
const activeMenu = computed(() => route.path)
|
||||
/* const activeIndex = computed(() => {
|
||||
const arr = route.path.split('/')
|
||||
return arr[arr.length - 1]
|
||||
}) */
|
||||
|
||||
const showSysmenu = computed(() => {
|
||||
return route.path.includes('/system')
|
||||
})
|
||||
|
||||
const routerList = computed(() => {
|
||||
if (showSysmenu.value) {
|
||||
return router.getRoutes().filter((route) => route.path.includes('/system') && !route.redirect)
|
||||
}
|
||||
return router.getRoutes().filter((route) => {
|
||||
return (
|
||||
!route.path.includes('canvas') &&
|
||||
!route.path.includes('preview') &&
|
||||
route.path !== '/login' &&
|
||||
!route.path.includes('/system') &&
|
||||
!route.redirect &&
|
||||
route.path !== '/:pathMatch(.*)*' &&
|
||||
!route.path.includes('dsTable')
|
||||
)
|
||||
})
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<el-menu :default-active="activeIndex" class="ed-menu-vertical" :collapse="collapse">
|
||||
<MenuItem v-for="menu in menuList" :key="menu.path" :menu="menu"></MenuItem>
|
||||
<el-menu :default-active="activeMenu" class="el-menu-demo ed-menu-vertical" :collapse="collapse">
|
||||
<MenuItem v-for="menu in routerList" :key="menu.path" :menu="menu"></MenuItem>
|
||||
</el-menu>
|
||||
</template>
|
||||
|
||||
|
||||
@@ -1,13 +1,19 @@
|
||||
<script lang="ts">
|
||||
import { h } from 'vue'
|
||||
import { h, defineComponent } from 'vue'
|
||||
import { ElMenuItem, ElSubMenu, ElIcon } from 'element-plus-secondary'
|
||||
|
||||
import model from '@/assets/svg/icon_dataset_filled.svg'
|
||||
import ds from '@/assets/svg/ds.svg'
|
||||
|
||||
import dashboard from '@/assets/svg/dashboard.svg'
|
||||
import chat from '@/assets/svg/chat.svg'
|
||||
import icon_user from '@/assets/svg/icon_user.svg'
|
||||
import { useRouter } from 'vue-router'
|
||||
const iconMap = {
|
||||
icon_ai: model,
|
||||
ds,
|
||||
dashboard,
|
||||
chat,
|
||||
icon_user: icon_user,
|
||||
} as { [key: string]: any }
|
||||
|
||||
const titleWithIcon = (props: any) => {
|
||||
@@ -17,8 +23,56 @@ const titleWithIcon = (props: any) => {
|
||||
h('span', null, { default: () => title }),
|
||||
]
|
||||
}
|
||||
const MenuItem = defineComponent({
|
||||
name: 'MenuItem',
|
||||
props: {
|
||||
menu: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
setup(props) {
|
||||
const router = useRouter()
|
||||
|
||||
const MenuItem = (props: any) => {
|
||||
const handleMenuClick = (e: any) => {
|
||||
router.push(e.index)
|
||||
}
|
||||
|
||||
return () => {
|
||||
const { children, hidden, path } = props.menu
|
||||
if (hidden) {
|
||||
return null
|
||||
}
|
||||
|
||||
if (children?.length) {
|
||||
return h(
|
||||
ElSubMenu,
|
||||
{ index: path, onClick: (e: any) => handleMenuClick(e) },
|
||||
{
|
||||
title: () => titleWithIcon(props),
|
||||
default: () => children.map((ele: any) => h(MenuItem, { menu: ele })),
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
const { title, icon } = props.menu?.meta || {}
|
||||
const iconCom: any = iconMap[icon] ? ElIcon : null
|
||||
return h(
|
||||
ElMenuItem,
|
||||
{ index: path, onClick: (e: any) => handleMenuClick(e) },
|
||||
{
|
||||
default: () => [
|
||||
h(iconCom, null, {
|
||||
default: () => h(iconMap[icon]),
|
||||
}),
|
||||
h('span', null, { default: () => title }),
|
||||
],
|
||||
}
|
||||
)
|
||||
}
|
||||
},
|
||||
})
|
||||
/* const MenuItem = (props: any) => {
|
||||
const { children, hidden, path } = props.menu
|
||||
if (hidden) {
|
||||
return null
|
||||
@@ -26,7 +80,7 @@ const MenuItem = (props: any) => {
|
||||
if (children?.length) {
|
||||
return h(
|
||||
ElSubMenu,
|
||||
{ index: path },
|
||||
{ index: path, onClick: (e: any) => handleMenuClick(e) },
|
||||
{
|
||||
title: () => titleWithIcon(props),
|
||||
default: () => children.map((ele: any) => h(MenuItem, { menu: ele })),
|
||||
@@ -37,7 +91,7 @@ const MenuItem = (props: any) => {
|
||||
const iconCom: any = iconMap[icon] ? ElIcon : null
|
||||
return h(
|
||||
ElMenuItem,
|
||||
{ index: path },
|
||||
{ index: path, onClick: (e: any) => handleMenuClick(e) },
|
||||
{
|
||||
title: h('span', null, { default: () => title }),
|
||||
default: h(iconCom, null, {
|
||||
@@ -45,6 +99,6 @@ const MenuItem = (props: any) => {
|
||||
}),
|
||||
}
|
||||
)
|
||||
}
|
||||
} */
|
||||
export default MenuItem
|
||||
</script>
|
||||
|
||||
@@ -41,8 +41,8 @@ const languageList = [
|
||||
value: 'zh-CN',
|
||||
}, */,
|
||||
]
|
||||
const handlePersonChange = () => {
|
||||
emit('selectPerson')
|
||||
const toSystem = () => {
|
||||
router.push('/system')
|
||||
}
|
||||
|
||||
const changeLanguage = (lang: string) => {
|
||||
@@ -88,7 +88,7 @@ const logout = () => {
|
||||
<div class="top">{{ name }}</div>
|
||||
<div class="bottom">{{ account }}</div>
|
||||
</div>
|
||||
<div v-if="isAdmin" class="popover-item" @click="handlePersonChange">
|
||||
<div v-if="isAdmin" class="popover-item" @click="toSystem">
|
||||
<el-icon size="16">
|
||||
<icon_admin_outlined></icon_admin_outlined>
|
||||
</el-icon>
|
||||
|
||||
@@ -22,7 +22,7 @@ const router = createRouter({
|
||||
},
|
||||
{
|
||||
path: '/chat',
|
||||
component: Layout,
|
||||
component: LayoutDsl,
|
||||
redirect: '/chat/index',
|
||||
children: [
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user