63 lines
2.5 KiB
Vue
63 lines
2.5 KiB
Vue
<script setup lang="ts">
|
|
import { computed, defineAsyncComponent } from 'vue'
|
|
import type { Component } from 'vue'
|
|
import { useRoute } from 'vue-router'
|
|
|
|
import { useLoginStore } from '@/stores/login'
|
|
import PagePlaceholder from '@/components/PagePlaceholder.vue'
|
|
|
|
const route = useRoute()
|
|
const loginStore = useLoginStore()
|
|
|
|
const componentRegistry: Record<string, Component> = {
|
|
'dashboard/index': defineAsyncComponent(() => import('@/views/workbench/home/index.vue')),
|
|
'sign/workbench/index': defineAsyncComponent(() => import('@/views/workbench/signing/index.vue')),
|
|
'sign/record/index': defineAsyncComponent(() => import('@/views/workbench/records/index.vue')),
|
|
'system/org/index': defineAsyncComponent(() => import('@/views/management/users/index.vue')),
|
|
'system/role/index': defineAsyncComponent(() => import('@/views/management/roles/index.vue')),
|
|
'doc/library/index': defineAsyncComponent(() => import('@/views/management/documents/index.vue')),
|
|
'report/index': defineAsyncComponent(() => import('@/views/management/reports/index.vue')),
|
|
'report/sign/overview/index': defineAsyncComponent(
|
|
() => import('@/views/reports/overview/index.vue'),
|
|
),
|
|
'report/sign/volume/index': defineAsyncComponent(
|
|
() => import('@/views/reports/volume/index.vue'),
|
|
),
|
|
'report/sign/timeliness/index': defineAsyncComponent(
|
|
() => import('@/views/reports/timeliness/index.vue'),
|
|
),
|
|
'report/patient/structure/index': defineAsyncComponent(
|
|
() => import('@/views/reports/patient-structure/index.vue'),
|
|
),
|
|
'system/setting/index': defineAsyncComponent(
|
|
() => import('@/views/management/settings/index.vue'),
|
|
),
|
|
}
|
|
|
|
const resource = computed(() => loginStore.menuForPath(route.path))
|
|
const pageComponent = computed(() => {
|
|
const path = resource.value?.componentPath
|
|
return path ? (componentRegistry[path] ?? null) : null
|
|
})
|
|
const unsupportedMessage = computed(() => {
|
|
const componentPath = resource.value?.componentPath
|
|
return componentPath
|
|
? `前端暂未接入组件「${componentPath}」。资源路由和权限已从菜单资源读取。`
|
|
: '当前路由没有对应的启用菜单资源。'
|
|
})
|
|
</script>
|
|
|
|
<template>
|
|
<KeepAlive v-if="pageComponent && resource?.cacheable">
|
|
<component :is="pageComponent" :key="resource?.id" />
|
|
</KeepAlive>
|
|
<component :is="pageComponent" v-else-if="pageComponent" />
|
|
<PagePlaceholder
|
|
v-else
|
|
group="菜单资源"
|
|
:title="resource?.name ?? '页面未接入'"
|
|
:icon="resource?.icon ?? '◇'"
|
|
:description="unsupportedMessage"
|
|
/>
|
|
</template>
|