import { useEffect, useState, lazy, Suspense } from 'react' import { Layout, Card, Tabs, Button, Space, Typography, Tag, message, Spin, Modal, Select, Menu } from 'antd' import { ReloadOutlined, ThunderboltOutlined, BranchesOutlined, UserOutlined } from '@ant-design/icons' import { api } from './api' import type { SceneSchema } from './types' import { SceneForm } from './engine/SceneForm' import { TracePanel, ProvenancePanel, ModelViewer, OrdersEventsPanel } from './panels' // 重量级视图(模型编辑器 + 三张可视化图,含 cytoscape/xyflow/bpmn-js)按需懒加载, // 让默认「场景运行台」的首屏包保持轻量。 const ModelEditor = lazy(() => import('./model/ModelEditor').then((m) => ({ default: m.ModelEditor }))) const OntologyCanvas = lazy(() => import('./viz/OntologyCanvas').then((m) => ({ default: m.OntologyCanvas }))) const LazyFallback = () => (
) const { Header, Sider, Content } = Layout const { Title, Text, Paragraph } = Typography type View = 'runner' | 'editor' | 'er' | 'network' | 'process' const VIEW_ITEMS = [ { key: 'runner', label: '场景运行台' }, { key: 'editor', label: '模型编辑器' }, { key: 'er', label: '数据结构图' }, { key: 'network', label: '本体网络图' }, { key: 'process', label: '场景流程图' }, ] export default function App() { const [view, setView] = useState('runner') const [scenes, setScenes] = useState([]) const [sceneId, setSceneId] = useState('') // 初始不硬编码,待场景列表返回后取首个可渲染场景 const [schema, setSchema] = useState(null) const [loading, setLoading] = useState(false) const [result, setResult] = useState(null) const [refreshKey, setRefreshKey] = useState(0) const [formKey, setFormKey] = useState(0) // 演示态主体(M5 principal):随手切换以观察权限"通过/拒绝"分支;管理员方可热重载/保存模型/新增客户 const [principal, setPrincipal] = useState('backend_admin') // 拉取场景列表(首个可渲染场景兜底选中;已有选择则保留,以便热重载后停留在当前场景) const loadScenes = () => api.scenes().then((list) => { setScenes(list) setSceneId((cur) => cur || list.find((s: any) => s.hasTemplate)?.sceneId || '') }).catch(() => message.error('无法连接引擎(8080),请先启动后端')) useEffect(() => { loadScenes() }, []) useEffect(() => { if (!sceneId) return setLoading(true); setResult(null) api.sceneSchema(sceneId).then(setSchema).catch((e) => message.error('加载场景失败:' + e.message)).finally(() => setLoading(false)) }, [sceneId, formKey]) // 模型(含热重载/保存)变化后:重拉场景列表 + 重挂当前表单,让改动即时反映 const afterModelChange = async () => { await loadScenes() setFormKey((k) => k + 1) } async function reloadModels() { try { const r = await api.reload(principal) message.success(r.message) await afterModelChange() } catch (e: any) { message.error('热重载失败:' + e.message) } } const onExecuted = (r: any) => { setResult(r); if (r.success) setRefreshKey((k) => k + 1) } return (
本体驱动 DDD+EDA · 元数据引擎 setView(e.key as View)} items={VIEW_ITEMS} style={{ flex: 1, minWidth: 0, background: 'transparent', borderBottom: 'none' }} />