fix: restore dashboard-rendered control center
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
@@ -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)
|
||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user