feat: restore lightweight control center
This commit is contained in:
@@ -17,7 +17,7 @@ from core.menu.schema import MenuCreate, MenuUpdate
|
|||||||
menu_cache = CacheManager(prefix="menu:")
|
menu_cache = CacheManager(prefix="menu:")
|
||||||
|
|
||||||
# 缓存key
|
# 缓存key
|
||||||
AI_AGENT_ADMIN_MENU_CACHE_VERSION = "v10"
|
AI_AGENT_ADMIN_MENU_CACHE_VERSION = "v11"
|
||||||
MENU_TREE_CACHE_KEY = f"tree:ai_agent_admin:{AI_AGENT_ADMIN_MENU_CACHE_VERSION}"
|
MENU_TREE_CACHE_KEY = f"tree:ai_agent_admin:{AI_AGENT_ADMIN_MENU_CACHE_VERSION}"
|
||||||
USER_ROUTE_CACHE_PREFIX = f"user_route:ai_agent_admin:{AI_AGENT_ADMIN_MENU_CACHE_VERSION}:"
|
USER_ROUTE_CACHE_PREFIX = f"user_route:ai_agent_admin:{AI_AGENT_ADMIN_MENU_CACHE_VERSION}:"
|
||||||
|
|
||||||
@@ -48,10 +48,10 @@ def _filter_ai_agent_admin_menus(menus: List[Menu]) -> List[Menu]:
|
|||||||
|
|
||||||
|
|
||||||
def _normalize_ai_agent_admin_menu(menu: Menu) -> None:
|
def _normalize_ai_agent_admin_menu(menu: Menu) -> None:
|
||||||
"""Route the retained control center to the AI agent workspace."""
|
"""Keep the retained control center on the lightweight admin dashboard."""
|
||||||
if menu.name == "ControlCenter":
|
if menu.name == "ControlCenter":
|
||||||
menu.path = "/ai-platform/agent"
|
menu.path = "/page-render/main_home"
|
||||||
menu.component = "ai-platform/agent/index"
|
menu.component = "_core/page-render/index"
|
||||||
menu.query = None
|
menu.query = None
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ export const overridesPreferences = defineOverridesPreferences({
|
|||||||
enablePreferences: false,
|
enablePreferences: false,
|
||||||
accessMode: 'mixed',
|
accessMode: 'mixed',
|
||||||
authPageLayout: 'panel-center',
|
authPageLayout: 'panel-center',
|
||||||
defaultHomePath: '/ai-platform/agent',
|
defaultHomePath: '/page-render/main_home',
|
||||||
layout: 'header-sidebar-nav',
|
layout: 'header-sidebar-nav',
|
||||||
preferencesButtonPosition: 'header',
|
preferencesButtonPosition: 'header',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -168,6 +168,7 @@ async function generateAccess(options: GenerateMenuAndRoutesOptions) {
|
|||||||
'../views/_core/fallback/**/*.vue',
|
'../views/_core/fallback/**/*.vue',
|
||||||
'../views/_core/file-preview/index.vue',
|
'../views/_core/file-preview/index.vue',
|
||||||
'../views/_core/menu/index.vue',
|
'../views/_core/menu/index.vue',
|
||||||
|
'../views/_core/page-render/index.vue',
|
||||||
'../views/_core/permission/index.vue',
|
'../views/_core/permission/index.vue',
|
||||||
'../views/_core/role/index.vue',
|
'../views/_core/role/index.vue',
|
||||||
'../views/_core/user/index.vue',
|
'../views/_core/user/index.vue',
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ export const LIGHT_MENU_NAMES = new Set([
|
|||||||
'AnnouncementList',
|
'AnnouncementList',
|
||||||
'AnnouncementManage',
|
'AnnouncementManage',
|
||||||
'KnowledgeBase',
|
'KnowledgeBase',
|
||||||
|
'PageRenderMainHome',
|
||||||
'SystemManagement',
|
'SystemManagement',
|
||||||
'SystemMenu',
|
'SystemMenu',
|
||||||
'SystemPermission',
|
'SystemPermission',
|
||||||
@@ -23,6 +24,7 @@ const LIGHT_ROUTE_PATH_PREFIXES = [
|
|||||||
'/ai-platform/workflow',
|
'/ai-platform/workflow',
|
||||||
'/ai-platform/workflow-runs',
|
'/ai-platform/workflow-runs',
|
||||||
'/message/announcement',
|
'/message/announcement',
|
||||||
|
'/page-render/main_home',
|
||||||
'/system/menu',
|
'/system/menu',
|
||||||
'/system/new-permission',
|
'/system/new-permission',
|
||||||
'/system/role',
|
'/system/role',
|
||||||
|
|||||||
@@ -5,7 +5,16 @@ const routes: RouteRecordRaw[] = [
|
|||||||
meta: { hideInMenu: true },
|
meta: { hideInMenu: true },
|
||||||
name: 'ControlCenterLegacyRedirect',
|
name: 'ControlCenterLegacyRedirect',
|
||||||
path: '/control-center',
|
path: '/control-center',
|
||||||
redirect: '/ai-platform/agent',
|
redirect: '/page-render/main_home',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
meta: {
|
||||||
|
hideInMenu: true,
|
||||||
|
title: '控制中心',
|
||||||
|
},
|
||||||
|
name: 'PageRenderMainHome',
|
||||||
|
path: '/page-render/main_home',
|
||||||
|
component: () => import('#/views/_core/page-render/index.vue'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
meta: { hideInMenu: true },
|
meta: { hideInMenu: true },
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import { preferences } from '@vben/preferences';
|
|||||||
const LEGACY_HOME_PATTERNS = [
|
const LEGACY_HOME_PATTERNS = [
|
||||||
/^\/app\/[^/]+\/page-render\//,
|
/^\/app\/[^/]+\/page-render\//,
|
||||||
/^\/app\/[^/]+\/form-render\//,
|
/^\/app\/[^/]+\/form-render\//,
|
||||||
/^\/page-render\//,
|
|
||||||
/^\/form-render\//,
|
/^\/form-render\//,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -1,20 +1,27 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onMounted, ref, watch } from 'vue';
|
import type { Component } from 'vue';
|
||||||
|
|
||||||
|
import { computed, defineAsyncComponent, onMounted, ref, watch } from 'vue';
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
|
|
||||||
import { ElEmpty, ElMessage, ElScrollbar } from 'element-plus';
|
import { ElEmpty, ElMessage, ElScrollbar } from 'element-plus';
|
||||||
|
|
||||||
import { getPageByCodeApi } from '#/api/online-dev/page-manager';
|
|
||||||
import DashboardRenderer from '#/components/dashboard-design/DashboardRenderer.vue';
|
|
||||||
|
|
||||||
defineOptions({ name: 'PageRender' });
|
defineOptions({ name: 'PageRender' });
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
|
const DashboardRenderer = defineAsyncComponent(
|
||||||
|
() => import('#/components/dashboard-design/DashboardRenderer.vue'),
|
||||||
|
);
|
||||||
const loading = ref(false);
|
const loading = ref(false);
|
||||||
const pageConfig = ref<string>('');
|
const pageConfig = ref<string>('');
|
||||||
const pageName = ref('');
|
const pageName = ref('');
|
||||||
const pageCode = ref('');
|
const pageCode = ref('');
|
||||||
|
|
||||||
|
const builtinPages: Record<string, Component> = {
|
||||||
|
main_home: defineAsyncComponent(() => import('./AiAgentHome.vue')),
|
||||||
|
};
|
||||||
|
const currentBuiltinPage = computed(() => builtinPages[pageCode.value]);
|
||||||
|
|
||||||
// 获取页面编码
|
// 获取页面编码
|
||||||
function getPageCode(): string {
|
function getPageCode(): string {
|
||||||
// 优先从 query 获取
|
// 优先从 query 获取
|
||||||
@@ -46,9 +53,19 @@ async function loadPageData() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pageCode.value = code;
|
pageCode.value = code;
|
||||||
|
if (builtinPages[code]) {
|
||||||
|
pageName.value = '控制中心';
|
||||||
|
pageConfig.value = '';
|
||||||
|
loading.value = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
const { getPageByCodeApi } = await import(
|
||||||
|
'#/api/online-dev/page-manager'
|
||||||
|
);
|
||||||
const page = await getPageByCodeApi(code);
|
const page = await getPageByCodeApi(code);
|
||||||
pageName.value = page.name;
|
pageName.value = page.name;
|
||||||
pageConfig.value =
|
pageConfig.value =
|
||||||
@@ -78,7 +95,8 @@ watch(
|
|||||||
<template>
|
<template>
|
||||||
<ElScrollbar class="rounded-[8px] py-3">
|
<ElScrollbar class="rounded-[8px] py-3">
|
||||||
<div v-loading="loading" class="h-[calc(100vh-120px)] rounded-[8px] px-3">
|
<div v-loading="loading" class="h-[calc(100vh-120px)] rounded-[8px] px-3">
|
||||||
<DashboardRenderer v-if="pageConfig" :config="pageConfig" />
|
<component :is="currentBuiltinPage" v-if="currentBuiltinPage" />
|
||||||
|
<DashboardRenderer v-else-if="pageConfig" :config="pageConfig" />
|
||||||
<ElEmpty v-else-if="!loading" description="暂无页面配置" />
|
<ElEmpty v-else-if="!loading" description="暂无页面配置" />
|
||||||
</div>
|
</div>
|
||||||
</ElScrollbar>
|
</ElScrollbar>
|
||||||
|
|||||||
Reference in New Issue
Block a user