fix: restore dashboard-rendered control center

This commit is contained in:
2026-06-13 09:50:51 +08:00
parent ff9dcdd4e1
commit af879e4607
6 changed files with 52 additions and 1240 deletions
@@ -0,0 +1 @@
+42
View File
@@ -0,0 +1,42 @@
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.database import get_db
from online_dev.page_manager.model import PageMeta
router = APIRouter(prefix="/page", tags=["page-render"])
def _format_datetime(dt) -> str:
return dt.strftime("%Y-%m-%d %H:%M:%S") if dt else ""
def _build_page_out(page: PageMeta) -> dict:
return {
"id": str(page.id),
"application_id": page.application_id,
"name": page.name,
"code": page.code,
"category": page.category or "",
"description": page.description or "",
"status": page.status,
"version": page.version,
"page_config": page.page_config or {},
"sort": page.sort or 0,
"sys_create_datetime": _format_datetime(page.sys_create_datetime),
"sys_update_datetime": _format_datetime(page.sys_update_datetime),
}
@router.get("/code/{code}", summary="Get page config by code")
async def get_page_by_code(code: str, db: AsyncSession = Depends(get_db)):
stmt = select(PageMeta).where(
PageMeta.code == code,
PageMeta.is_deleted == False, # noqa: E712
)
result = await db.execute(stmt)
page = result.scalar_one_or_none()
if not page:
raise HTTPException(status_code=404, detail="Page config not found")
return _build_page_out(page)
+4
View File
@@ -14,11 +14,13 @@ from core.menu.api import router as menu_router
from core.message.api import announcement_router from core.message.api import announcement_router
from core.message.api import router as message_router from core.message.api import router as message_router
from core.oauth.api import router as oauth_router from core.oauth.api import router as oauth_router
from core.page_manager.api import router as page_manager_router
from core.permission.api import router as permission_router from core.permission.api import router as permission_router
from core.post.api import router as post_router from core.post.api import router as post_router
from core.resource_scope.field_permission.api import router as field_permission_router from core.resource_scope.field_permission.api import router as field_permission_router
from core.resource_scope.scope_permission.api import router as resource_scope_router from core.resource_scope.scope_permission.api import router as resource_scope_router
from core.role.api import router as role_router from core.role.api import router as role_router
from core.server_monitor.api import router as server_monitor_router
from core.ui_config.api import router as ui_config_router from core.ui_config.api import router as ui_config_router
from core.user.api import router as user_router from core.user.api import router as user_router
@@ -41,5 +43,7 @@ router.include_router(file_manager_router)
router.include_router(message_router) router.include_router(message_router)
router.include_router(announcement_router) router.include_router(announcement_router)
router.include_router(oauth_router) router.include_router(oauth_router)
router.include_router(page_manager_router)
router.include_router(server_monitor_router)
router.include_router(ui_config_router) router.include_router(ui_config_router)
router.include_router(api_token_router) router.include_router(api_token_router)
@@ -16,5 +16,5 @@ export interface PageMeta {
} }
export async function getPageByCodeApi(code: string) { export async function getPageByCodeApi(code: string) {
return requestClient.get<PageMeta>(`/api/online_dev/page/code/${code}`); return requestClient.get<PageMeta>(`/api/core/page/code/${code}`);
} }
File diff suppressed because it is too large Load Diff
@@ -1,11 +1,11 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { Component } from 'vue'; import { defineAsyncComponent, onMounted, ref, watch } 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/core/page-manager';
defineOptions({ name: 'PageRender' }); defineOptions({ name: 'PageRender' });
const route = useRoute(); const route = useRoute();
@@ -17,11 +17,6 @@ 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 获取
@@ -53,19 +48,9 @@ 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 =
@@ -95,8 +80,7 @@ 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">
<component :is="currentBuiltinPage" v-if="currentBuiltinPage" /> <DashboardRenderer v-if="pageConfig" :config="pageConfig" />
<DashboardRenderer v-else-if="pageConfig" :config="pageConfig" />
<ElEmpty v-else-if="!loading" description="暂无页面配置" /> <ElEmpty v-else-if="!loading" description="暂无页面配置" />
</div> </div>
</ElScrollbar> </ElScrollbar>