From c4cff2587c1056c9eb6eb32ec1c95a3409e19382 Mon Sep 17 00:00:00 2001 From: zhanghao <774378400@qq.com> Date: Wed, 24 Jun 2026 10:27:33 +0800 Subject: [PATCH] feat: aima --- .env.development | 2 +- src/api/intelligenceTest/car.js | 32 + src/api/intelligenceTest/mobilePhone.js | 32 + src/api/intelligenceTest/runningTask.js | 69 ++ src/api/intelligenceTest/taskManage.js | 47 + src/api/intelligenceTest/testCase.js | 32 + src/router/index.js | 154 --- src/views/device/profile/index.vue | 508 ++++++++++ .../register/components/Camera/index.vue | 330 +++++++ .../register/components/ControlCard/index.vue | 36 + .../components/DexHand/LeftBottomHand.vue | 431 +++++++++ .../components/DexHand/LeftTopHand.vue | 270 ++++++ .../components/DexHand/RightBottomCharts.vue | 229 +++++ .../components/DexHand/RightTopCharts.vue | 162 ++++ .../register/components/DexHand/index.vue | 158 ++++ .../device/register/components/Head/index.vue | 314 +++++++ .../components/LogicFlow/CustomGroup.js | 103 +++ .../components/LogicFlow/IPlayer/config.ts | 59 ++ .../components/LogicFlow/IPlayer/index.vue | 62 ++ .../components/LogicFlow/customFlow.vue | 238 +++++ .../components/LogicFlow/customFlowNode.js | 134 +++ .../register/components/LogicFlow/index.vue | 294 ++++++ .../MechanicalArm/components/JointControl.vue | 133 +++ .../MechanicalArm/components/UrdfViewer.vue | 394 ++++++++ .../components/MechanicalArm/index.vue | 350 +++++++ .../register/components/Microphone/index.vue | 225 +++++ .../register/components/Motor/index.vue | 76 ++ .../register/components/Speaker/index.vue | 276 ++++++ .../SpeechSynthesis/AudioPlayer.vue | 108 +++ .../components/SpeechSynthesis/chat.vue | 699 ++++++++++++++ .../components/SpeechSynthesis/img/ai.png | Bin 0 -> 12001 bytes .../components/SpeechSynthesis/img/user.png | Bin 0 -> 11973 bytes .../components/SpeechSynthesis/index.vue | 65 ++ .../SpeechSynthesis/soundRecording.vue | 115 +++ .../components/TouchInteraction/ai.png | Bin 0 -> 12001 bytes .../components/TouchInteraction/index.vue | 512 ++++++++++ .../components/TouchInteraction/zsj.png | Bin 0 -> 11973 bytes src/views/device/register/components/index.js | 59 ++ src/views/device/register/index.vue | 414 +++++++++ src/views/device/robot/ContextMenu.vue | 89 ++ src/views/device/robot/TechButtonWithLine.vue | 547 +++++++++++ src/views/device/robot/index.vue | 874 ++++++++++++++++++ src/views/device/terminal/index.vue | 316 +++++++ src/views/home/components/BarChart.vue | 117 +++ src/views/home/components/LineChart.vue | 118 +++ src/views/home/index.vue | 307 ++++++ src/views/index.vue | 32 +- src/views/intelligenceTest/car/index.vue | 304 ++++++ .../intelligenceTest/mobilePhone/index.vue | 321 +++++++ .../intelligenceTest/runningTask/index.vue | 647 +++++++++++++ .../intelligenceTest/runningTask/task-log.vue | 71 ++ .../runningTask/task-steps.vue | 88 ++ .../intelligenceTest/taskManage/index.vue | 357 +++++++ src/views/intelligenceTest/testCase/index.vue | 330 +++++++ 54 files changed, 11456 insertions(+), 184 deletions(-) create mode 100644 src/api/intelligenceTest/car.js create mode 100644 src/api/intelligenceTest/mobilePhone.js create mode 100644 src/api/intelligenceTest/runningTask.js create mode 100644 src/api/intelligenceTest/taskManage.js create mode 100644 src/api/intelligenceTest/testCase.js create mode 100644 src/views/device/profile/index.vue create mode 100644 src/views/device/register/components/Camera/index.vue create mode 100644 src/views/device/register/components/ControlCard/index.vue create mode 100644 src/views/device/register/components/DexHand/LeftBottomHand.vue create mode 100644 src/views/device/register/components/DexHand/LeftTopHand.vue create mode 100644 src/views/device/register/components/DexHand/RightBottomCharts.vue create mode 100644 src/views/device/register/components/DexHand/RightTopCharts.vue create mode 100644 src/views/device/register/components/DexHand/index.vue create mode 100644 src/views/device/register/components/Head/index.vue create mode 100644 src/views/device/register/components/LogicFlow/CustomGroup.js create mode 100644 src/views/device/register/components/LogicFlow/IPlayer/config.ts create mode 100644 src/views/device/register/components/LogicFlow/IPlayer/index.vue create mode 100644 src/views/device/register/components/LogicFlow/customFlow.vue create mode 100644 src/views/device/register/components/LogicFlow/customFlowNode.js create mode 100644 src/views/device/register/components/LogicFlow/index.vue create mode 100644 src/views/device/register/components/MechanicalArm/components/JointControl.vue create mode 100644 src/views/device/register/components/MechanicalArm/components/UrdfViewer.vue create mode 100644 src/views/device/register/components/MechanicalArm/index.vue create mode 100644 src/views/device/register/components/Microphone/index.vue create mode 100644 src/views/device/register/components/Motor/index.vue create mode 100644 src/views/device/register/components/Speaker/index.vue create mode 100644 src/views/device/register/components/SpeechSynthesis/AudioPlayer.vue create mode 100644 src/views/device/register/components/SpeechSynthesis/chat.vue create mode 100644 src/views/device/register/components/SpeechSynthesis/img/ai.png create mode 100644 src/views/device/register/components/SpeechSynthesis/img/user.png create mode 100644 src/views/device/register/components/SpeechSynthesis/index.vue create mode 100644 src/views/device/register/components/SpeechSynthesis/soundRecording.vue create mode 100644 src/views/device/register/components/TouchInteraction/ai.png create mode 100644 src/views/device/register/components/TouchInteraction/index.vue create mode 100644 src/views/device/register/components/TouchInteraction/zsj.png create mode 100644 src/views/device/register/components/index.js create mode 100644 src/views/device/register/index.vue create mode 100644 src/views/device/robot/ContextMenu.vue create mode 100644 src/views/device/robot/TechButtonWithLine.vue create mode 100644 src/views/device/robot/index.vue create mode 100644 src/views/device/terminal/index.vue create mode 100644 src/views/home/components/BarChart.vue create mode 100644 src/views/home/components/LineChart.vue create mode 100644 src/views/home/index.vue create mode 100644 src/views/intelligenceTest/car/index.vue create mode 100644 src/views/intelligenceTest/mobilePhone/index.vue create mode 100644 src/views/intelligenceTest/runningTask/index.vue create mode 100644 src/views/intelligenceTest/runningTask/task-log.vue create mode 100644 src/views/intelligenceTest/runningTask/task-steps.vue create mode 100644 src/views/intelligenceTest/taskManage/index.vue create mode 100644 src/views/intelligenceTest/testCase/index.vue diff --git a/.env.development b/.env.development index aca0341..9ddffd1 100644 --- a/.env.development +++ b/.env.development @@ -7,7 +7,7 @@ VITE_APP_ENV = 'development' # 招商车研物联网平台/开发环境 VITE_APP_BASE_API = '/dev-api' -VITE_API_URL = http://192.168.28.10:13080 +VITE_API_URL = http://192.168.0.201:13080 VITE_WS_URL = ws://192.168.0.201:13080/ws # explanation diff --git a/src/api/intelligenceTest/car.js b/src/api/intelligenceTest/car.js new file mode 100644 index 0000000..5d8c25e --- /dev/null +++ b/src/api/intelligenceTest/car.js @@ -0,0 +1,32 @@ +import request from '@/utils/request' + +export function addVehicle(data) { + return request({ + url: '/aima/vehicle', + method: 'post', + data: data + }) +} + +export function getVehicleList(params) { + return request({ + url: '/aima/vehicle/list', + method: 'get', + params: params + }) +} + +export function updateVehicle(data) { + return request({ + url: '/aima/vehicle', + method: 'put', + data: data + }) +} + +export function deleteVehicle(ids) { + return request({ + url: `/aima/vehicle/${ids}`, + method: 'delete' + }) +} \ No newline at end of file diff --git a/src/api/intelligenceTest/mobilePhone.js b/src/api/intelligenceTest/mobilePhone.js new file mode 100644 index 0000000..b683fc2 --- /dev/null +++ b/src/api/intelligenceTest/mobilePhone.js @@ -0,0 +1,32 @@ +import request from '@/utils/request' + +export function addPhone(data) { + return request({ + url: '/aima/phone', + method: 'post', + data: data + }) +} + +export function getPhoneList(params) { + return request({ + url: '/aima/phone/list', + method: 'get', + params: params + }) +} + +export function updatePhone(data) { + return request({ + url: '/aima/phone', + method: 'put', + data: data + }) +} + +export function deletePhone(ids) { + return request({ + url: `/aima/phone/${ids}`, + method: 'delete' + }) +} \ No newline at end of file diff --git a/src/api/intelligenceTest/runningTask.js b/src/api/intelligenceTest/runningTask.js new file mode 100644 index 0000000..adfd01e --- /dev/null +++ b/src/api/intelligenceTest/runningTask.js @@ -0,0 +1,69 @@ +import request from '@/utils/request' +import { method } from 'lodash' + +export function addTaskinstance(data) { + return request({ + url: '/aima/taskinstance', + method: 'post', + data: data + }) +} + +export function getTaskinstanceList(params) { + return request({ + url: '/aima/taskinstance/list', + method: 'get', + params: params + }) +} + +export function updateTaskinstance(data) { + return request({ + url: '/aima/taskinstance', + method: 'put', + data: data + }) +} + +export function deleteTaskinstance(ids) { + return request({ + url: `/aima/taskinstance/{ids}`, + method: 'delete' + }) +} + +export function startTaskinstance(id) { + return request({ + url: `/aima/taskinstance/start/${id}`, + method: 'put' + }) +} + +export function pauseTaskinstance(id) { + return request({ + url: `/aima/taskinstance/pause/${id}`, + method: 'put' + }) +} + +export function stopTaskinstance(id) { + return request({ + url: `/aima/taskinstance/stop/${id}`, + method: 'put' + }) +} + +export function resumeTaskinstance(id) { + return request({ + url: `/aima/taskinstance/resume/${id}`, + method: 'put' + }) +} + +export function getTaskLogListApi(params) { + return request({ + url: '/aima/testlog/list', + method: 'get', + params: params + }) +} \ No newline at end of file diff --git a/src/api/intelligenceTest/taskManage.js b/src/api/intelligenceTest/taskManage.js new file mode 100644 index 0000000..457d33f --- /dev/null +++ b/src/api/intelligenceTest/taskManage.js @@ -0,0 +1,47 @@ +import request from '@/utils/request' + +export function addTask(data) { + return request({ + url: '/aima/task', + method: 'post', + data: data + }) +} + +export function getTaskList(params) { + return request({ + url: '/aima/task/list', + method: 'get', + params: params + }) +} + +export function updateTask(data) { + return request({ + url: '/aima/task', + method: 'put', + data: data + }) +} + +export function deleteTask(ids) { + return request({ + url: `/aima/task/${ids}`, + method: 'delete' + }) +} + +export function getTestCaseByTaskId(taskId) { + return request({ + url: `/aima/task/testCases/${taskId}`, + method: 'get', + }) +} + +export function bindTastCase(taskId, ids) { + return request({ + url: `/aima/task/bindTestCases/${taskId}`, + method: 'post', + data: ids + }) +} \ No newline at end of file diff --git a/src/api/intelligenceTest/testCase.js b/src/api/intelligenceTest/testCase.js new file mode 100644 index 0000000..374ebe1 --- /dev/null +++ b/src/api/intelligenceTest/testCase.js @@ -0,0 +1,32 @@ +import request from '@/utils/request' + +export function addTestCase(data) { + return request({ + url: '/aima/testcase', + method: 'post', + data: data + }) +} + +export function getTestCaseList(params) { + return request({ + url: '/aima/testcase/list', + method: 'get', + params: params + }) +} + +export function updateTestCase(data) { + return request({ + url: '/aima/testcase', + method: 'put', + data: data + }) +} + +export function deleteTestCase(ids) { + return request({ + url: `/aima/testcase/${ids}`, + method: 'delete' + }) +} \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js index cf65917..7bd4be0 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -58,75 +58,6 @@ export const constantRoutes = [ component: () => import("@/views/error/401"), hidden: true, }, - { - path: "/device", - component: Layout, - children: [ - { - path: "mechanical_arm/:id", - component: () => - import("@/views/device/register/components/MechanicalArm/index.vue"), - name: "机械臂示教", - meta: { title: "机械臂详情" }, - hidden: true, - }, - { - path: "camera/:id", - component: () => - import("@/views/device/register/components/Camera/index.vue"), - name: "摄像头示教", - meta: { title: "摄像头详情" }, - hidden: true, - }, - { - path: "head/:id", - component: () => - import("@/views/device/register/components/Head/index.vue"), - name: "人工头示教", - meta: { title: "人工头详情" }, - hidden: true, - }, - { - path: "speaker/:id", - component: () => - import("@/views/device/register/components/Speaker/index.vue"), - name: "扬声器示教", - meta: { title: "扬声器详情" }, - hidden: true, - }, - { - path: "hand/:id", - component: () => - import("@/views/device/register/components/DexHand/index.vue"), - name: "灵巧手示教", - meta: { title: "灵巧手详情" }, - hidden: true, - },{ - path: "microphone/:id", - component: () => - import("@/views/device/register/components/Microphone/index.vue"), - name: "麦克风示教", - meta: { title: "麦克风详情" }, - hidden: true, - } - ], - }, - { - //语音合成 - path: "/speech_synthesis", - component: () => - import("@/views/device/register/components/SpeechSynthesis/index.vue"), - meta: { title: "语音合成", noLogin: true }, - hidden: true, - }, - { - //触摸交互 - path: "/touch_interaction", - component: () => - import("@/views/device/register/components/TouchInteraction/index.vue"), - meta: { title: "触摸交互", noLogin: true }, - hidden: true, - }, { //cockpit path: "/inspection/cockpit", @@ -135,14 +66,6 @@ export const constantRoutes = [ meta: { title: "logicFlow", noLogin: true }, hidden: true, }, - { - //logicFlow - path: "/logic_flow", - component: () => - import("@/views/device/register/components/LogicFlow/index.vue"), - meta: { title: "logicFlow", noLogin: true }, - hidden: true, - }, { //logicFlow path: "/flow", @@ -150,13 +73,6 @@ export const constantRoutes = [ meta: { title: "flow", noLogin: true }, hidden: true, }, - { - //电机路由 - path: "/Motor/:id", - component: () => - import("@/views/device/register/components/Motor/index.vue"), - hidden: true, - }, { path: "", component: Layout, @@ -216,76 +132,6 @@ export const dynamicRoutes = [ }, ], }, - { - path: "/vi/plan", - component: Layout, - hidden: true, - permissions: ["vi:testProject:list"], - children: [ - { - path: "index/:id", - component: () => import("@/views/vi/testProject/plan/index"), - name: "Plan", - meta: { title: "方案管理", activeMenu: "/vi/testProject" }, - }, - ], - }, - { - path: "/is/plan", - component: Layout, - hidden: true, - permissions: ["is:project:list"], - children: [ - { - path: "index/:id", - component: () => import("@/views/is/project/plan/index"), - name: "ProjectPlan", - meta: { title: "项目方案", activeMenu: "/is/plan" }, - }, - ], - }, - { - path: "/is/evaluate", - component: Layout, - hidden: true, - permissions: ["is:project:list"], - children: [ - { - path: "index/:id", - component: () => import("@/views/is/project/evaluate/index"), - name: "isProjectEvaluate", - meta: { title: "触控评价", activeMenu: "/is/evaluate" }, - }, - ], - }, - { - path: "/vi/evaluate", - component: Layout, - hidden: true, - permissions: ["is:project:list"], - children: [ - { - path: "index/:id", - component: () => import("@/views/vi/testProject/evaluate/index"), - name: "viProjectEvaluate", - meta: { title: "语音评价", activeMenu: "/vi/evaluate" }, - }, - ], - }, - { - path: "/monitor/job-log", - component: Layout, - hidden: true, - permissions: ["monitor:job:list"], - children: [ - { - path: "index/:jobId(\\d+)", - component: () => import("@/views/monitor/job/log"), - name: "JobLog", - meta: { title: "调度日志", activeMenu: "/monitor/job" }, - }, - ], - }, { path: "/tool/gen-edit", component: Layout, diff --git a/src/views/device/profile/index.vue b/src/views/device/profile/index.vue new file mode 100644 index 0000000..34443c3 --- /dev/null +++ b/src/views/device/profile/index.vue @@ -0,0 +1,508 @@ + + + diff --git a/src/views/device/register/components/Camera/index.vue b/src/views/device/register/components/Camera/index.vue new file mode 100644 index 0000000..466ccb9 --- /dev/null +++ b/src/views/device/register/components/Camera/index.vue @@ -0,0 +1,330 @@ + + + + + \ No newline at end of file diff --git a/src/views/device/register/components/ControlCard/index.vue b/src/views/device/register/components/ControlCard/index.vue new file mode 100644 index 0000000..1590fb4 --- /dev/null +++ b/src/views/device/register/components/ControlCard/index.vue @@ -0,0 +1,36 @@ + + + + + \ No newline at end of file diff --git a/src/views/device/register/components/DexHand/LeftBottomHand.vue b/src/views/device/register/components/DexHand/LeftBottomHand.vue new file mode 100644 index 0000000..27d3d37 --- /dev/null +++ b/src/views/device/register/components/DexHand/LeftBottomHand.vue @@ -0,0 +1,431 @@ + + + + + \ No newline at end of file diff --git a/src/views/device/register/components/DexHand/LeftTopHand.vue b/src/views/device/register/components/DexHand/LeftTopHand.vue new file mode 100644 index 0000000..5efda72 --- /dev/null +++ b/src/views/device/register/components/DexHand/LeftTopHand.vue @@ -0,0 +1,270 @@ + + + + + \ No newline at end of file diff --git a/src/views/device/register/components/DexHand/RightBottomCharts.vue b/src/views/device/register/components/DexHand/RightBottomCharts.vue new file mode 100644 index 0000000..bc42122 --- /dev/null +++ b/src/views/device/register/components/DexHand/RightBottomCharts.vue @@ -0,0 +1,229 @@ + + + + + \ No newline at end of file diff --git a/src/views/device/register/components/DexHand/RightTopCharts.vue b/src/views/device/register/components/DexHand/RightTopCharts.vue new file mode 100644 index 0000000..09cae93 --- /dev/null +++ b/src/views/device/register/components/DexHand/RightTopCharts.vue @@ -0,0 +1,162 @@ + + + + + \ No newline at end of file diff --git a/src/views/device/register/components/DexHand/index.vue b/src/views/device/register/components/DexHand/index.vue new file mode 100644 index 0000000..fd33381 --- /dev/null +++ b/src/views/device/register/components/DexHand/index.vue @@ -0,0 +1,158 @@ + + + + + + \ No newline at end of file diff --git a/src/views/device/register/components/Head/index.vue b/src/views/device/register/components/Head/index.vue new file mode 100644 index 0000000..3142033 --- /dev/null +++ b/src/views/device/register/components/Head/index.vue @@ -0,0 +1,314 @@ + + + + + \ No newline at end of file diff --git a/src/views/device/register/components/LogicFlow/CustomGroup.js b/src/views/device/register/components/LogicFlow/CustomGroup.js new file mode 100644 index 0000000..7cc34cf --- /dev/null +++ b/src/views/device/register/components/LogicFlow/CustomGroup.js @@ -0,0 +1,103 @@ + +import { GroupNodeModel, GroupNode } from '@logicflow/extension' +import { recursiveFilter } from "@/utils/convertNodeRedToLogicFlow"; + +class CustomGroupModel extends GroupNodeModel { + initNodeData(data) { + super.initNodeData(data); + this.children = new Set(data.children || []) + this.zIndex = 0; + + this.width = data.w + 80; // 增加内边距 + this.height = data.h + 80; + this.x = data.x; + this.y = data.y; + + setTimeout(() => { + this.updateSize() + const nodes = this.graphModel.nodes; + const arr = recursiveFilter(nodes, this.id) + arr.forEach((item) => { + item.updateSize() + }) + }, 0) + } + + setAttributes() { + this.text.editable = false; + } + + getTextStyle() { + const style = super.getTextStyle(); + style.fill = this.properties.style?.color || '#333'; + style.fontSize = 16; + return style; + } + + updateSize() { + const children = [] + this.children.forEach((id) => { + children.push(this.graphModel.getNodeModelById(id)) + }); + if (children.length === 0) return; + + let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity; + children.forEach((node) => { + minX = Math.min(minX, node.x - node.width / 2); + maxX = Math.max(maxX, node.x + node.width / 2); + minY = Math.min(minY, node.y - node.height / 2); + maxY = Math.max(maxY, node.y + node.height / 2); + }); + + this.width = maxX - minX + 80; // 增加内边距 + this.height = maxY - minY + 80; + this.x = (minX + maxX) / 2; + this.y = (minY + maxY) / 2; + this.setTextCoordinate(this.width, this.height, this.x, this.y) + } + + setTextCoordinate(width, height, x, y) { + const strategies = { + "n": () => { + this.text.x = x + this.text.y = y - height / 2 + 20 + }, + "ne": () => { + this.text.x = x + width / 2 - 20 + this.text.y = y - height / 2 + 20 + }, + "sw": () => { + this.text.x = x - width / 2 + 20 + this.text.y = y + height / 2 - 20 + }, + "s": () => { + this.text.x = x + this.text.y = y + height / 2 - 20 + }, + "se": () => { + this.text.x = x + width / 2 - 20 + this.text.y = y + height / 2 - 20 + }, + "default": () => { + this.text.x = x - width / 2 + 20 + this.text.y = y - height / 2 + 20 + } + }; + const labelPosition = this.properties.style?.['label-position'] || 'default' + const action = strategies[labelPosition] + action(); + } + + removeChild(id) { + this.children.delete(id) // 现在可安全调用 + } +} + +// 导出方法注册 +export function registerCustomGroup(lf) { + lf.register({ + type: "customGroup", + view: GroupNode, + model: CustomGroupModel + }) +} diff --git a/src/views/device/register/components/LogicFlow/IPlayer/config.ts b/src/views/device/register/components/LogicFlow/IPlayer/config.ts new file mode 100644 index 0000000..3048428 --- /dev/null +++ b/src/views/device/register/components/LogicFlow/IPlayer/config.ts @@ -0,0 +1,59 @@ +export const conf = { + /** + * 基础功能配置 + * */ + autoplay: false, // 是否自动播放,不自动播放,浏览器有限制规则 + autoplayMuted: false, // 是否自动播放(静音播放) + videoInit: true, // 是否默认初始化video,默认初始化,默认true + playsinline: true, // 是否启用内联播放模式,仅移动端生效 + defaultPlaybackRate: 1, // 默认播放速度(可选:0.5/0.75/1/1.5/2等) + volume: 0.72, // 播放音量(可选:0 ~ 1) + loop: false, // 是否循环播放,默认不循环播放 + startTime: 0, // 点播模式下,初始起播时间 + videoAttributes: {}, // video扩展属性,暂且不配置 + lang: 'zh-cn', // 播放器初始显示语言,设置为中文 + fluid: true, // 是否流式布局(宽高优先于流失布局,默认16:9)注掉上方宽高看效果 + fitVideoSize: 'fixed', // 保持容器宽/高,不做适配,按照容器来 + videoFillMode: 'auto', // 宽高不够自动底色填充(fill拉伸填充等...) + seekedStatus: 'play', // 跳转后继续播放 + // 播放器进度条故事点信息数组 + progressDot: [ + { + id: 0, // 唯一标识,用于删除的时候索引 + time: 30, // 展示的时间点,例子为在播放到10s钟的时候展示 + text: '进度条信息提示...', // hover的时候展示文案,可以为空 + duration: 1, // 展示时间跨度,单位为s + style: { // 指定样式 + backgroundColor: 'white' + } + }, + ], + thumbnail: null, // 进度条预览图配置,普通业务用不到 + marginControls: false, // 是否开启画面和控制栏分离模式,不开启空间多一些 + domEventType: 'default', // 响应的事件类型,不用指定,用默认的即可 + /** + * 交互功能配置(一般使用默认即可) + * */ + /** + * 插件配置,根据需求自选 + * */ + icons: {}, // 使用默认的icon图标 + i18n: [], // 使用默认的中文 + // 自定义一些颜色 + commonStyle: { + progressColor: 'green', // 整个进度条颜色 + playedColor: 'chocolate', // 已播放的进度条颜色 + volumeColor: 'pink', // 音量大小竖向滑块颜色 + }, + controls: true, // 是否使用底部控制栏,默认使用 + miniprogress: true, // 是否使用mini进度条(当底部控制栏隐藏时生效) + screenShot: false, // 关闭截图功能 + rotate: true, // 是否使用视频旋转插件,默认不使用 + download: true, // 是否使用下载按钮,一般不用,一般自定义控制 + pip: true, // 使用使用画中画模式,默认不用 + mini: true, // 是否使用小屏幕控件 + cssFullscreen: true, // 是否使用网页样式全屏按钮开关 + playbackRate: [0.5, 1, 1.5, 2, 3], //传入倍速可选数组 + // playbackRate: true, //false,禁用倍速播放(即控制栏不显示) + keyShortcut: false, // 是否开启快捷键模式 +} diff --git a/src/views/device/register/components/LogicFlow/IPlayer/index.vue b/src/views/device/register/components/LogicFlow/IPlayer/index.vue new file mode 100644 index 0000000..55be899 --- /dev/null +++ b/src/views/device/register/components/LogicFlow/IPlayer/index.vue @@ -0,0 +1,62 @@ + + + + + + diff --git a/src/views/device/register/components/LogicFlow/customFlow.vue b/src/views/device/register/components/LogicFlow/customFlow.vue new file mode 100644 index 0000000..9ba9db2 --- /dev/null +++ b/src/views/device/register/components/LogicFlow/customFlow.vue @@ -0,0 +1,238 @@ + + + + + + diff --git a/src/views/device/register/components/LogicFlow/customFlowNode.js b/src/views/device/register/components/LogicFlow/customFlowNode.js new file mode 100644 index 0000000..447800b --- /dev/null +++ b/src/views/device/register/components/LogicFlow/customFlowNode.js @@ -0,0 +1,134 @@ +// 导入 HtmlNode 及其模型,为后续继承做准备 +import { HtmlNode, HtmlNodeModel } from '@logicflow/core'; +// 导入 Vue 相关方法,用于渲染组件 +import { createApp, h } from 'vue'; +import ElementPlus from 'element-plus' +// 导入 Vue 组件 +import CustomFlow from './customFlow.vue'; + +/** + * 定义一个 元素的 HTML 节点类,继承自 HtmlNode + * 该类负责在 HTML 中渲染 元素,并处理其交互逻辑 + */ +class CustomFlowHtmlNode extends HtmlNode { + isMounted; // 标记组件是否已挂载 + r; // 渲染函数 + app; // Vue 应用实例 + + /** + * 构造函数 + * @param props 传递给节点的属性,包括模型、图模型等 + */ + constructor(props) { + super(props); + this.isMounted = false; + // 创建 元素的渲染函数 + this.r = h(CustomFlow, { + model: props.model, + graphModel: props.graphModel, + properties: { + ...props.model.getProperties(), + }, + text: props.model.text.value, + }); + + // 创建 Vue 应用实例,并指定渲染函数 + this.app = createApp({ + render: () => this.r + }); + } + + /** + * 将 HTML 内容设置到指定的根元素上 + * @param rootEl 根元素 + */ + setHtml(rootEl) { + if (!this.isMounted) { + this.isMounted = true; + const node = document.createElement('div'); + node.style.width = '100%' + node.style.height = '100%' + rootEl.appendChild(node); + this.app.use(ElementPlus) // 关键:单独注册ElementPlus + this.app.mount(node); + } else { + this.r.component.props.properties = this.props.model.getProperties(); + } + } + + /** + * 获取节点文本内容 + * 对于元素,返回 null,因为其内容由特定组件渲染 + * @returns {null} + */ + getText() { + return null; + } +} + +/** + * 定义一个元素的 HTML 模型类,继承自 HtmlNodeModel + * 该类主要设置节点的属性和样式 + */ +class CustomFlowHtmlModel extends HtmlNodeModel { + initNodeData(data) { + super.initNodeData(data); + // 仅允许从底部锚点连出 + this.sourceRules.push({ + message: '只能从输出锚点连线', + validate: (sourceNode, targetNode, sourceAnchor) => + // sourceAnchor.name === 'right' + sourceAnchor.properties.connectionType === 'source' + }); + + // 仅允许连接到顶部锚点 + this.targetRules.push({ + message: '只能连接到输入锚点', + validate: (sourceNode, targetNode, targetAnchor) => + // targetAnchor.name === 'left' + targetAnchor.properties.connectionType === 'target' + }); + } + + /** + * 设置节点属性 + * 包括宽度、高度、文本编辑属性等 + */ + setAttributes() { + this.width = 200; + this.height = 100; + this.text.editable = false; + } + + // 定义节点只有左右两个锚点. 锚点位置通过中心点和宽度算出来。 + getDefaultAnchor() { + let _a = this, x = _a.x, y = _a.y, width = _a.width, height = _a.height; + return [ + // { x: x, y: y - height / 2, id: "".concat(this.id, "_0") }, + { x: x + width / 2, y: y, name: 'left', id: "".concat(this.id, "_1"), properties: { connectionType: 'target' } }, + // { x: x, y: y + height / 2, id: "".concat(this.id, "_2") }, + { x: x - width / 2, y: y, name: 'right', id: "".concat(this.id, "_3"), properties: { connectionType: 'source' } }, + ]; + } + + /** + * 获取节点轮廓样式 + * 覆盖父类方法,设置 stroke 属性为 none,以适应特定的视觉效果 + * @returns {object} 节点轮廓样式 + */ + getOutlineStyle() { + const style = super.getOutlineStyle(); + style.stroke = 'none'; + style.hover.stroke = 'none'; + return style; + } +} + +// 导出方法注册 +export function registerCustomNode(lf) { + lf.register({ + type: "CustomNode", + view: CustomFlowHtmlNode, + model: CustomFlowHtmlModel + }) +} \ No newline at end of file diff --git a/src/views/device/register/components/LogicFlow/index.vue b/src/views/device/register/components/LogicFlow/index.vue new file mode 100644 index 0000000..facfd2a --- /dev/null +++ b/src/views/device/register/components/LogicFlow/index.vue @@ -0,0 +1,294 @@ + + + \ No newline at end of file diff --git a/src/views/device/register/components/MechanicalArm/components/JointControl.vue b/src/views/device/register/components/MechanicalArm/components/JointControl.vue new file mode 100644 index 0000000..f53b595 --- /dev/null +++ b/src/views/device/register/components/MechanicalArm/components/JointControl.vue @@ -0,0 +1,133 @@ + + + \ No newline at end of file diff --git a/src/views/device/register/components/MechanicalArm/components/UrdfViewer.vue b/src/views/device/register/components/MechanicalArm/components/UrdfViewer.vue new file mode 100644 index 0000000..bdcc52b --- /dev/null +++ b/src/views/device/register/components/MechanicalArm/components/UrdfViewer.vue @@ -0,0 +1,394 @@ + + + + + \ No newline at end of file diff --git a/src/views/device/register/components/MechanicalArm/index.vue b/src/views/device/register/components/MechanicalArm/index.vue new file mode 100644 index 0000000..558f317 --- /dev/null +++ b/src/views/device/register/components/MechanicalArm/index.vue @@ -0,0 +1,350 @@ + + + + + diff --git a/src/views/device/register/components/Microphone/index.vue b/src/views/device/register/components/Microphone/index.vue new file mode 100644 index 0000000..fa76496 --- /dev/null +++ b/src/views/device/register/components/Microphone/index.vue @@ -0,0 +1,225 @@ + + + diff --git a/src/views/device/register/components/Motor/index.vue b/src/views/device/register/components/Motor/index.vue new file mode 100644 index 0000000..8ecf371 --- /dev/null +++ b/src/views/device/register/components/Motor/index.vue @@ -0,0 +1,76 @@ + + + + + \ No newline at end of file diff --git a/src/views/device/register/components/Speaker/index.vue b/src/views/device/register/components/Speaker/index.vue new file mode 100644 index 0000000..f29bf07 --- /dev/null +++ b/src/views/device/register/components/Speaker/index.vue @@ -0,0 +1,276 @@ + + + + + \ No newline at end of file diff --git a/src/views/device/register/components/SpeechSynthesis/AudioPlayer.vue b/src/views/device/register/components/SpeechSynthesis/AudioPlayer.vue new file mode 100644 index 0000000..be36efc --- /dev/null +++ b/src/views/device/register/components/SpeechSynthesis/AudioPlayer.vue @@ -0,0 +1,108 @@ + + + + + + diff --git a/src/views/device/register/components/SpeechSynthesis/chat.vue b/src/views/device/register/components/SpeechSynthesis/chat.vue new file mode 100644 index 0000000..aaf1aca --- /dev/null +++ b/src/views/device/register/components/SpeechSynthesis/chat.vue @@ -0,0 +1,699 @@ + + + + diff --git a/src/views/device/register/components/SpeechSynthesis/img/ai.png b/src/views/device/register/components/SpeechSynthesis/img/ai.png new file mode 100644 index 0000000000000000000000000000000000000000..79bbe4537df7e7ca847fd3de3e8f2d3a785e5332 GIT binary patch literal 12001 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 literal 0 HcmV?d00001 diff --git a/src/views/device/register/components/SpeechSynthesis/img/user.png b/src/views/device/register/components/SpeechSynthesis/img/user.png new file mode 100644 index 0000000000000000000000000000000000000000..481f7e7cbc543d579dc21251b7985b673505c9e0 GIT binary patch literal 11973 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 literal 0 HcmV?d00001 diff --git a/src/views/device/register/components/SpeechSynthesis/index.vue b/src/views/device/register/components/SpeechSynthesis/index.vue new file mode 100644 index 0000000..94b9003 --- /dev/null +++ b/src/views/device/register/components/SpeechSynthesis/index.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/src/views/device/register/components/SpeechSynthesis/soundRecording.vue b/src/views/device/register/components/SpeechSynthesis/soundRecording.vue new file mode 100644 index 0000000..5b2a05b --- /dev/null +++ b/src/views/device/register/components/SpeechSynthesis/soundRecording.vue @@ -0,0 +1,115 @@ + + + + + + diff --git a/src/views/device/register/components/TouchInteraction/ai.png b/src/views/device/register/components/TouchInteraction/ai.png new file mode 100644 index 0000000000000000000000000000000000000000..79bbe4537df7e7ca847fd3de3e8f2d3a785e5332 GIT binary patch literal 12001 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 literal 0 HcmV?d00001 diff --git a/src/views/device/register/components/TouchInteraction/index.vue b/src/views/device/register/components/TouchInteraction/index.vue new file mode 100644 index 0000000..08788ae --- /dev/null +++ b/src/views/device/register/components/TouchInteraction/index.vue @@ -0,0 +1,512 @@ + + + + + diff --git a/src/views/device/register/components/TouchInteraction/zsj.png b/src/views/device/register/components/TouchInteraction/zsj.png new file mode 100644 index 0000000000000000000000000000000000000000..481f7e7cbc543d579dc21251b7985b673505c9e0 GIT binary patch literal 11973 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 literal 0 HcmV?d00001 diff --git a/src/views/device/register/components/index.js b/src/views/device/register/components/index.js new file mode 100644 index 0000000..93584d6 --- /dev/null +++ b/src/views/device/register/components/index.js @@ -0,0 +1,59 @@ +import {controlPageList} from "@/enum/index.js"; +import {ElMessage} from "element-plus"; +import router from "@/router"; + +export const intoControlPage = (path, params) => { + if (!controlPageList.includes(path)) { + ElMessage.warning('该页面不在控制台页面中,无法打开'); + return + } + // const fullPath = `${window.location.origin}${path}/${params}`; + // // 使用 window.open 在新标签页中打开 + // window.open(fullPath, '_blank'); + const fullPath = `${path}/${params}`; // 构造路由路径 + router.push(fullPath); // 使用路由跳转 +} + +// 定义需要转换的属性列表 +const propertiesToConvert = [ + "workModule", + "posStep", + "postureStep", + "jointStep", + "joint1", + "joint2", + "joint3", + "joint4", + "joint5", + "joint6", + "x", + "y", + "z", + "rx", + "ry", + "rz" +]; +export const formatNumber = (data) => { + const res = JSON.parse(JSON.stringify(data)); +// 遍历属性列表并转换值 + propertiesToConvert.forEach(property => { + if (data[property] !== null) { + res[property] = Number(data[property]); + } + }); + return res +} + +//对象中存在数字类型属性时,转换为字符串类型 +export const convertNumbersToStrings = (obj) => { + for (const key in obj) { + if (obj.hasOwnProperty(key)) { + const value = obj[key]; + // 检查值是否不是 null 且是数字类型 + if (value !== null && typeof value === 'number') { + obj[key] = String(value); // 转换为字符串 + } + } + } + return obj; +} diff --git a/src/views/device/register/index.vue b/src/views/device/register/index.vue new file mode 100644 index 0000000..7520614 --- /dev/null +++ b/src/views/device/register/index.vue @@ -0,0 +1,414 @@ + + + diff --git a/src/views/device/robot/ContextMenu.vue b/src/views/device/robot/ContextMenu.vue new file mode 100644 index 0000000..ab47455 --- /dev/null +++ b/src/views/device/robot/ContextMenu.vue @@ -0,0 +1,89 @@ + + + + + \ No newline at end of file diff --git a/src/views/device/robot/TechButtonWithLine.vue b/src/views/device/robot/TechButtonWithLine.vue new file mode 100644 index 0000000..a2a3526 --- /dev/null +++ b/src/views/device/robot/TechButtonWithLine.vue @@ -0,0 +1,547 @@ + + + + + \ No newline at end of file diff --git a/src/views/device/robot/index.vue b/src/views/device/robot/index.vue new file mode 100644 index 0000000..058ce86 --- /dev/null +++ b/src/views/device/robot/index.vue @@ -0,0 +1,874 @@ + + + + + \ No newline at end of file diff --git a/src/views/device/terminal/index.vue b/src/views/device/terminal/index.vue new file mode 100644 index 0000000..b47886d --- /dev/null +++ b/src/views/device/terminal/index.vue @@ -0,0 +1,316 @@ + + + diff --git a/src/views/home/components/BarChart.vue b/src/views/home/components/BarChart.vue new file mode 100644 index 0000000..cb08904 --- /dev/null +++ b/src/views/home/components/BarChart.vue @@ -0,0 +1,117 @@ + + + + \ No newline at end of file diff --git a/src/views/home/components/LineChart.vue b/src/views/home/components/LineChart.vue new file mode 100644 index 0000000..99ad96c --- /dev/null +++ b/src/views/home/components/LineChart.vue @@ -0,0 +1,118 @@ + + + + \ No newline at end of file diff --git a/src/views/home/index.vue b/src/views/home/index.vue new file mode 100644 index 0000000..3995412 --- /dev/null +++ b/src/views/home/index.vue @@ -0,0 +1,307 @@ + + + \ No newline at end of file diff --git a/src/views/index.vue b/src/views/index.vue index 60a9e14..60f2acb 100644 --- a/src/views/index.vue +++ b/src/views/index.vue @@ -1,40 +1,14 @@ diff --git a/src/views/intelligenceTest/car/index.vue b/src/views/intelligenceTest/car/index.vue new file mode 100644 index 0000000..a4ae1a2 --- /dev/null +++ b/src/views/intelligenceTest/car/index.vue @@ -0,0 +1,304 @@ + + + diff --git a/src/views/intelligenceTest/mobilePhone/index.vue b/src/views/intelligenceTest/mobilePhone/index.vue new file mode 100644 index 0000000..9b7acac --- /dev/null +++ b/src/views/intelligenceTest/mobilePhone/index.vue @@ -0,0 +1,321 @@ + + + diff --git a/src/views/intelligenceTest/runningTask/index.vue b/src/views/intelligenceTest/runningTask/index.vue new file mode 100644 index 0000000..0a23ee3 --- /dev/null +++ b/src/views/intelligenceTest/runningTask/index.vue @@ -0,0 +1,647 @@ + + + \ No newline at end of file diff --git a/src/views/intelligenceTest/runningTask/task-log.vue b/src/views/intelligenceTest/runningTask/task-log.vue new file mode 100644 index 0000000..28b562b --- /dev/null +++ b/src/views/intelligenceTest/runningTask/task-log.vue @@ -0,0 +1,71 @@ + + + \ No newline at end of file diff --git a/src/views/intelligenceTest/runningTask/task-steps.vue b/src/views/intelligenceTest/runningTask/task-steps.vue new file mode 100644 index 0000000..3aa7440 --- /dev/null +++ b/src/views/intelligenceTest/runningTask/task-steps.vue @@ -0,0 +1,88 @@ + + + + \ No newline at end of file diff --git a/src/views/intelligenceTest/taskManage/index.vue b/src/views/intelligenceTest/taskManage/index.vue new file mode 100644 index 0000000..57687c2 --- /dev/null +++ b/src/views/intelligenceTest/taskManage/index.vue @@ -0,0 +1,357 @@ + + + diff --git a/src/views/intelligenceTest/testCase/index.vue b/src/views/intelligenceTest/testCase/index.vue new file mode 100644 index 0000000..ef81792 --- /dev/null +++ b/src/views/intelligenceTest/testCase/index.vue @@ -0,0 +1,330 @@ + + +