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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ collapsed = !collapsed"
+ >
+
+
+
+ {{collapsed ? '展开' : '收起'}}菜单
+
+
+
+
+
+
+
+
+
+
+
\ 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 @@
+
+
+
+
+ {{ menu.title }}
+
+
+
+
+
+
+
+
+
+
\ 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 @@