From 015030d65078de7a9535c64100be60f3577e7554 Mon Sep 17 00:00:00 2001 From: libertyspy Date: Sun, 8 Feb 2026 15:38:50 +0800 Subject: [PATCH] Initial commit --- modeler/index.html | 2 +- modeler/src/router/config.ts | 2 +- modeler/src/views/ai/builder/element.ts | 41 ++- modeler/src/views/ai/builder/graph.ts | 4 +- modeler/src/views/ai/builder/hooks.ts | 3 +- modeler/src/views/ai/builder/node.vue | 2 +- modeler/src/views/ai/builder/props.ts | 2 +- modeler/src/views/ai/config.ts | 15 +- modeler/src/views/ai/header.vue | 12 +- modeler/src/views/ai/sidebar.vue | 14 +- modeler/src/views/behaviour/config.ts | 16 + modeler/src/views/behaviour/graph/element.ts | 61 ++++ modeler/src/views/behaviour/graph/graph.ts | 177 ++++++++++ modeler/src/views/behaviour/graph/hooks.ts | 250 ++++++++++++++ modeler/src/views/behaviour/graph/index.ts | 11 + modeler/src/views/behaviour/graph/line.ts | 47 +++ modeler/src/views/behaviour/graph/node.vue | 322 ++++++++++++++++++ modeler/src/views/behaviour/graph/ports.ts | 51 +++ modeler/src/views/behaviour/graph/props.ts | 29 ++ modeler/src/views/behaviour/graph/register.ts | 50 +++ modeler/src/views/behaviour/header.vue | 77 +++++ modeler/src/views/behaviour/layout.vue | 47 +++ modeler/src/views/behaviour/menu.vue | 58 ++++ modeler/src/views/behaviour/router.ts | 47 +++ .../src/views/behaviour/rules/management.vue | 20 ++ modeler/src/views/behaviour/sidebar.vue | 169 +++++++++ modeler/src/views/signin.vue | 2 +- 27 files changed, 1496 insertions(+), 35 deletions(-) create mode 100644 modeler/src/views/behaviour/config.ts create mode 100644 modeler/src/views/behaviour/graph/element.ts create mode 100644 modeler/src/views/behaviour/graph/graph.ts create mode 100644 modeler/src/views/behaviour/graph/hooks.ts create mode 100644 modeler/src/views/behaviour/graph/index.ts create mode 100644 modeler/src/views/behaviour/graph/line.ts create mode 100644 modeler/src/views/behaviour/graph/node.vue create mode 100644 modeler/src/views/behaviour/graph/ports.ts create mode 100644 modeler/src/views/behaviour/graph/props.ts create mode 100644 modeler/src/views/behaviour/graph/register.ts create mode 100644 modeler/src/views/behaviour/header.vue create mode 100644 modeler/src/views/behaviour/layout.vue create mode 100644 modeler/src/views/behaviour/menu.vue create mode 100644 modeler/src/views/behaviour/router.ts create mode 100644 modeler/src/views/behaviour/rules/management.vue create mode 100644 modeler/src/views/behaviour/sidebar.vue diff --git a/modeler/index.html b/modeler/index.html index 8e91f79..1035b09 100644 --- a/modeler/index.html +++ b/modeler/index.html @@ -4,7 +4,7 @@ - 博弈竞赛环境 + 决策管理
diff --git a/modeler/src/router/config.ts b/modeler/src/router/config.ts index 0aa9c03..6cb6855 100644 --- a/modeler/src/router/config.ts +++ b/modeler/src/router/config.ts @@ -8,7 +8,7 @@ */ import { type RouteRecordRaw } from 'vue-router'; -import { routers } from '@/views/ai/router'; +import { routers } from '@/views/behaviour/router'; export const routes: RouteRecordRaw[] = [ ...routers, diff --git a/modeler/src/views/ai/builder/element.ts b/modeler/src/views/ai/builder/element.ts index 46472fe..bbc7b4d 100644 --- a/modeler/src/views/ai/builder/element.ts +++ b/modeler/src/views/ai/builder/element.ts @@ -8,6 +8,7 @@ */ import type { NullableString } from '@/types'; +import type { ModelParameters } from '@/views/ai/model/types'; export interface DraggableElement { id: number | null, @@ -19,4 +20,42 @@ export interface DraggableElement { parent?: DraggableElement, children: DraggableElement[] [key: string]: unknown; -} \ No newline at end of file +} + +export interface ModelElementPosition { + x: number; + y: number; +} + +export interface ModelElementEdge { + key: NullableString; + sourceKey: NullableString; + sourceName: NullableString; + targetKey: NullableString; + targetName: NullableString; +} + +export interface ModelBaseElement { + key: string; + name: string; + type: string; + width: number; + height: number; + position: ModelElementPosition; + category: NullableString; + element?: DraggableElement; + + [key: string]: unknown; +} + +export interface ModelElement extends ModelBaseElement { + // 连线 + edges: ModelElementEdge[]; + // 模型参数设置 + parameters: ModelParameters; +} + +export interface SavedGraphData { + nodes: ModelElement[]; + edges: any[]; +} diff --git a/modeler/src/views/ai/builder/graph.ts b/modeler/src/views/ai/builder/graph.ts index f8527f1..9fceb78 100644 --- a/modeler/src/views/ai/builder/graph.ts +++ b/modeler/src/views/ai/builder/graph.ts @@ -8,9 +8,9 @@ */ import { Edge, Graph, Path, Selection } from '@antv/x6'; -import type { ModelElement } from '../model/types'; +import type { ModelElement } from './element'; import type { Connecting } from '@antv/x6/lib/graph/options'; -import {createLineOptions} from './line' +import { createLineOptions } from './line'; Graph.registerConnector( 'sequenceFlowConnector', diff --git a/modeler/src/views/ai/builder/hooks.ts b/modeler/src/views/ai/builder/hooks.ts index 3065ae6..64c7709 100644 --- a/modeler/src/views/ai/builder/hooks.ts +++ b/modeler/src/views/ai/builder/hooks.ts @@ -12,7 +12,8 @@ import { type Dom, Graph, Node } from '@antv/x6'; import type { NodeViewPositionEventArgs } from '@antv/x6/es/view/node/type'; import { createGraphCanvas } from './graph'; import { EventListener } from '@/utils/event'; -import type { ModelElement } from '../model/types'; +import type { ModelElement } from './element'; + // import {createLineOptions} from './line' export interface UseGraphCanvas { diff --git a/modeler/src/views/ai/builder/node.vue b/modeler/src/views/ai/builder/node.vue index 3115cb3..aae3806 100644 --- a/modeler/src/views/ai/builder/node.vue +++ b/modeler/src/views/ai/builder/node.vue @@ -75,7 +75,7 @@ + + \ No newline at end of file diff --git a/modeler/src/views/behaviour/graph/ports.ts b/modeler/src/views/behaviour/graph/ports.ts new file mode 100644 index 0000000..cd24310 --- /dev/null +++ b/modeler/src/views/behaviour/graph/ports.ts @@ -0,0 +1,51 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +export const createPort = (name: string = 'top', args: Record = { dx: 0 }) => { + return { + position: { name: name, args: args }, + attrs: { + circle: { + r: 4, // 大小 + magnet: true, + stroke: '#1b5e9f', // 边框颜色 + strokeWidth: 1, // 边框大小 + fill: '#3578bf', // 填充颜色 + style: { + visibility: 'visible', // 是否可见 + }, + }, + }, + }; +}; + +export const createPorts = (top: boolean = true, right: boolean = true, bottom: boolean = true, left: boolean = true) => { + const groups: any = {}; + const items: any = []; + if (top) { + groups['top'] = createPort('top'); + items.push({ group: 'top', id: 'top' }); + } + if (right) { + groups['right'] = createPort('right'); + items.push({ group: 'right', id: 'right' }); + } + if (bottom) { + groups['bottom'] = createPort('bottom'); + items.push({ group: 'bottom', id: 'bottom' }); + } + if (left) { + groups['left'] = createPort('left'); + items.push({ group: 'left', id: 'left' }); + } + return { + groups: groups, + items: items, + }; +}; \ No newline at end of file diff --git a/modeler/src/views/behaviour/graph/props.ts b/modeler/src/views/behaviour/graph/props.ts new file mode 100644 index 0000000..dc093e6 --- /dev/null +++ b/modeler/src/views/behaviour/graph/props.ts @@ -0,0 +1,29 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import { Graph, Node } from '@antv/x6'; +import { type ExtractPropTypes, type PropType } from 'vue'; +import type { ModelElement } from './element'; + +export const elementProps = { + node: { + type: Object as PropType, + required: true, + }, + graph: { + type: Object as PropType, + required: true, + }, + element: { + type: Object as PropType, + required: false, + }, +}; + +export type ElementPropsType = ExtractPropTypes \ No newline at end of file diff --git a/modeler/src/views/behaviour/graph/register.ts b/modeler/src/views/behaviour/graph/register.ts new file mode 100644 index 0000000..a75a27e --- /dev/null +++ b/modeler/src/views/behaviour/graph/register.ts @@ -0,0 +1,50 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ +import { register } from '@antv/x6-vue-shape'; +import ModelElement from './node.vue'; + +export const registerNodeElement = () => { + console.info('registerNodeElement'); + register({ + shape: 'model', + component: ModelElement, + width: 120, + attrs: { + body: { + stroke: 'transparent', + strokeWidth: 0, + fill: 'transparent', + rx: 4, + ry: 4, + }, + }, + dragging: { + enabled: true, + }, + // 配置端口识别规则, + portMarkup: [ + { + tagName: 'div', + selector: 'port-body', + }, + ], + // 告诉 X6 如何识别 Vue 组件内的端口 + portAttribute: 'data-port', + // ports: createPorts(), + }); +}; \ No newline at end of file diff --git a/modeler/src/views/behaviour/header.vue b/modeler/src/views/behaviour/header.vue new file mode 100644 index 0000000..76ca76e --- /dev/null +++ b/modeler/src/views/behaviour/header.vue @@ -0,0 +1,77 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/behaviour/layout.vue b/modeler/src/views/behaviour/layout.vue new file mode 100644 index 0000000..8c4826e --- /dev/null +++ b/modeler/src/views/behaviour/layout.vue @@ -0,0 +1,47 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/behaviour/menu.vue b/modeler/src/views/behaviour/menu.vue new file mode 100644 index 0000000..8b7f121 --- /dev/null +++ b/modeler/src/views/behaviour/menu.vue @@ -0,0 +1,58 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/behaviour/router.ts b/modeler/src/views/behaviour/router.ts new file mode 100644 index 0000000..1061150 --- /dev/null +++ b/modeler/src/views/behaviour/router.ts @@ -0,0 +1,47 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import { type RouteRecordRaw, type RouteRecordRedirect } from 'vue-router'; + +export const routers: RouteRecordRaw[] = [ + { + name: 'index', + path: '/', + redirect: '/app/behaviour/rules', + meta: { + hidden: true, + }, + } as RouteRecordRedirect, + + { + name: 'signin', + path: '/signin', + meta: { + title: '登录', + }, + component: () => import('@/views/signin.vue'), + }, + + { + path: '/', + meta: { + title: '指挥决策规则库管理', + }, + children: [ + { + name: 'app-behaviour-rules', + path: '/app/behaviour/rules', + meta: { + title: '指挥决策规则库管理', + }, + component: () => import('@/views/behaviour/rules/management.vue'), + }, + ], + }, +]; \ No newline at end of file diff --git a/modeler/src/views/behaviour/rules/management.vue b/modeler/src/views/behaviour/rules/management.vue new file mode 100644 index 0000000..044070a --- /dev/null +++ b/modeler/src/views/behaviour/rules/management.vue @@ -0,0 +1,20 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/behaviour/sidebar.vue b/modeler/src/views/behaviour/sidebar.vue new file mode 100644 index 0000000..6665bf8 --- /dev/null +++ b/modeler/src/views/behaviour/sidebar.vue @@ -0,0 +1,169 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/signin.vue b/modeler/src/views/signin.vue index 1dc6c5a..70bf2ee 100644 --- a/modeler/src/views/signin.vue +++ b/modeler/src/views/signin.vue @@ -7,7 +7,7 @@