fix web get scenario data

This commit is contained in:
jiegeaiai 2025-02-19 02:08:00 +08:00
parent ca109841f3
commit b422174e02
7 changed files with 479 additions and 135 deletions

135
web/package-lock.json generated
View File

@ -10,6 +10,7 @@
"dependencies": { "dependencies": {
"core-js": "^3.6.5", "core-js": "^3.6.5",
"echarts": "^5.3.2", "echarts": "^5.3.2",
"element-ui": "^2.15.14",
"lib-flexible": "^0.3.2", "lib-flexible": "^0.3.2",
"simple-peer": "^9.11.1", "simple-peer": "^9.11.1",
"vue": "^2.6.11" "vue": "^2.6.11"
@ -3207,6 +3208,14 @@
"integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
"dev": true "dev": true
}, },
"node_modules/async-validator": {
"version": "1.8.5",
"resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz",
"integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
"dependencies": {
"babel-runtime": "6.x"
}
},
"node_modules/asynckit": { "node_modules/asynckit": {
"version": "0.4.0", "version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@ -3304,6 +3313,11 @@
"eslint": ">= 4.12.1" "eslint": ">= 4.12.1"
} }
}, },
"node_modules/babel-helper-vue-jsx-merge-props": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
"integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
},
"node_modules/babel-loader": { "node_modules/babel-loader": {
"version": "8.4.1", "version": "8.4.1",
"resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz",
@ -3371,6 +3385,27 @@
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
} }
}, },
"node_modules/babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
"dependencies": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"node_modules/babel-runtime/node_modules/core-js": {
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
"deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
"hasInstallScript": true
},
"node_modules/babel-runtime/node_modules/regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
},
"node_modules/balanced-match": { "node_modules/balanced-match": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@ -5566,7 +5601,6 @@
"version": "1.5.2", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
"integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==",
"dev": true,
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
} }
@ -6115,6 +6149,22 @@
"integrity": "sha512-8AJUW6dh75Fm/ny8+kZKJzI1pgoE8bKLZlzDU2W1ENd+DXKJrx7I7l9hb8UWR4ojlnb5OlixMt00QWiYJoVw1w==", "integrity": "sha512-8AJUW6dh75Fm/ny8+kZKJzI1pgoE8bKLZlzDU2W1ENd+DXKJrx7I7l9hb8UWR4ojlnb5OlixMt00QWiYJoVw1w==",
"dev": true "dev": true
}, },
"node_modules/element-ui": {
"version": "2.15.14",
"resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.14.tgz",
"integrity": "sha512-2v9fHL0ZGINotOlRIAJD5YuVB8V7WKxrE9Qy7dXhRipa035+kF7WuU/z+tEmLVPBcJ0zt8mOu1DKpWcVzBK8IA==",
"dependencies": {
"async-validator": "~1.8.1",
"babel-helper-vue-jsx-merge-props": "^2.0.0",
"deepmerge": "^1.2.0",
"normalize-wheel": "^1.0.1",
"resize-observer-polyfill": "^1.5.0",
"throttle-debounce": "^1.0.1"
},
"peerDependencies": {
"vue": "^2.5.17"
}
},
"node_modules/elliptic": { "node_modules/elliptic": {
"version": "6.6.1", "version": "6.6.1",
"resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz",
@ -10456,6 +10506,11 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/normalize-wheel": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
"integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA=="
},
"node_modules/npm-run-path": { "node_modules/npm-run-path": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
@ -12939,6 +12994,11 @@
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
"dev": true "dev": true
}, },
"node_modules/resize-observer-polyfill": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
"integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
},
"node_modules/resolve": { "node_modules/resolve": {
"version": "1.22.10", "version": "1.22.10",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
@ -14897,6 +14957,14 @@
"node": ">=4.0.0" "node": ">=4.0.0"
} }
}, },
"node_modules/throttle-debounce": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
"integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==",
"engines": {
"node": ">=4"
}
},
"node_modules/through": { "node_modules/through": {
"version": "2.3.8", "version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@ -19552,6 +19620,14 @@
"integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
"dev": true "dev": true
}, },
"async-validator": {
"version": "1.8.5",
"resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz",
"integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
"requires": {
"babel-runtime": "6.x"
}
},
"asynckit": { "asynckit": {
"version": "0.4.0", "version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@ -19622,6 +19698,11 @@
"resolve": "^1.12.0" "resolve": "^1.12.0"
} }
}, },
"babel-helper-vue-jsx-merge-props": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
"integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
},
"babel-loader": { "babel-loader": {
"version": "8.4.1", "version": "8.4.1",
"resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz",
@ -19673,6 +19754,27 @@
"@babel/helper-define-polyfill-provider": "^0.6.3" "@babel/helper-define-polyfill-provider": "^0.6.3"
} }
}, },
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
},
"dependencies": {
"core-js": {
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
}
}
},
"balanced-match": { "balanced-match": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@ -21387,8 +21489,7 @@
"deepmerge": { "deepmerge": {
"version": "1.5.2", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
"integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ=="
"dev": true
}, },
"default-gateway": { "default-gateway": {
"version": "5.0.5", "version": "5.0.5",
@ -21818,6 +21919,19 @@
"integrity": "sha512-8AJUW6dh75Fm/ny8+kZKJzI1pgoE8bKLZlzDU2W1ENd+DXKJrx7I7l9hb8UWR4ojlnb5OlixMt00QWiYJoVw1w==", "integrity": "sha512-8AJUW6dh75Fm/ny8+kZKJzI1pgoE8bKLZlzDU2W1ENd+DXKJrx7I7l9hb8UWR4ojlnb5OlixMt00QWiYJoVw1w==",
"dev": true "dev": true
}, },
"element-ui": {
"version": "2.15.14",
"resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.14.tgz",
"integrity": "sha512-2v9fHL0ZGINotOlRIAJD5YuVB8V7WKxrE9Qy7dXhRipa035+kF7WuU/z+tEmLVPBcJ0zt8mOu1DKpWcVzBK8IA==",
"requires": {
"async-validator": "~1.8.1",
"babel-helper-vue-jsx-merge-props": "^2.0.0",
"deepmerge": "^1.2.0",
"normalize-wheel": "^1.0.1",
"resize-observer-polyfill": "^1.5.0",
"throttle-debounce": "^1.0.1"
}
},
"elliptic": { "elliptic": {
"version": "6.6.1", "version": "6.6.1",
"resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz",
@ -25174,6 +25288,11 @@
"sort-keys": "^1.0.0" "sort-keys": "^1.0.0"
} }
}, },
"normalize-wheel": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
"integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA=="
},
"npm-run-path": { "npm-run-path": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
@ -27174,6 +27293,11 @@
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
"dev": true "dev": true
}, },
"resize-observer-polyfill": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
"integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
},
"resolve": { "resolve": {
"version": "1.22.10", "version": "1.22.10",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
@ -28746,6 +28870,11 @@
} }
} }
}, },
"throttle-debounce": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
"integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg=="
},
"through": { "through": {
"version": "2.3.8", "version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",

View File

@ -10,6 +10,7 @@
"dependencies": { "dependencies": {
"core-js": "^3.6.5", "core-js": "^3.6.5",
"echarts": "^5.3.2", "echarts": "^5.3.2",
"element-ui": "^2.15.14",
"lib-flexible": "^0.3.2", "lib-flexible": "^0.3.2",
"simple-peer": "^9.11.1", "simple-peer": "^9.11.1",
"vue": "^2.6.11" "vue": "^2.6.11"

View File

@ -1,20 +1,16 @@
<template> <template>
<div id="app"> <div id="app">
<WebRTC /> <WebRTC />
<div id="ui"> <div id="ui">
<TopBar @open-task-modal="openTaskModal" /> <TopBar @open-task-modal="openTaskModal" />
<LeftPane /> <TaskModal ref="taskModal" />
<RightPane /> </div>
<TaskModal ref="taskModal" />
</div>
</div> </div>
</template> </template>
<script> <script>
import WebRTC from './components/WebRTC.vue' import WebRTC from './components/WebRTC.vue'
import TopBar from './components/TopBar.vue' import TopBar from './components/TopBar.vue'
import LeftPane from "./components/LeftPane.vue"
import RightPane from "./components/RightPane.vue"
import TaskModal from './components/TaskModal.vue' import TaskModal from './components/TaskModal.vue'
export default { export default {
@ -22,40 +18,34 @@ export default {
components: { components: {
WebRTC, WebRTC,
TopBar, TopBar,
LeftPane,
RightPane,
TaskModal, TaskModal,
}, },
methods: { methods: {
openTaskModal() { openTaskModal() {
this.$refs.taskModal.openModal(); this.$refs.taskModal.openModal();
}, },
},
mounted()
{
//this.webrtc.load();
} }
} }
</script> </script>
<style> <style>
html,body html, body {
{
width: 100%; width: 100%;
height: 100%; height: 100%;
margin: 0; margin: 0;
padding: 0; padding: 0;
overflow: hidden; overflow: hidden;
} }
#app { #app {
height: 100%; height: 100%;
} }
#ui
{ #ui {
position:absolute; position: absolute;
width:100%; width: 100%;
left:0; left: 0;
top:0; top: 0;
pointer-events: none; pointer-events: none;
} }
</style> </style>

View File

@ -8,12 +8,22 @@
<div class="search-area"> <div class="search-area">
<div class="search-item"> <div class="search-item">
<label for="year">年度:</label> <label for="year">年度:</label>
<input type="number" v-model="year" class="year-input" @change="handleChangeYear" /> <el-date-picker
v-model="year"
type="year"
placeholder="选择年"
format="yyyy"
value-format="yyyy"
@change="handleChangeYear"
class="year-picker"
/>
</div> </div>
<div class="search-item"> <div class="search-item">
<label for="taskName">任务名称:</label> <label for="taskName">任务名称:</label>
<select v-model="taskName" class="task-select"> <select v-model="taskName" class="task-select">
<option value="xxx任务">xxx任务</option> <option v-for="task in taskList" :key="task.id" :value="task.value">
{{ task.label }}
</option>
</select> </select>
</div> </div>
<button class="search-btn" @click="handleSearch">查询</button> <button class="search-btn" @click="handleSearch">查询</button>
@ -32,14 +42,17 @@
</thead> </thead>
<tbody> <tbody>
<tr v-for="(task, index) in tasks" :key="index"> <tr v-for="(task, index) in tasks" :key="index">
<td>{{ task.date }}</td> <td>{{ task.date || 'N/A' }}</td>
<td>{{ task.gameCount }}</td> <td>{{ task.gameCount || 0 }}</td>
<td>{{ task.practiceDay }}</td> <td>{{ task.practiceDay || 0 }}</td>
<td>{{ task.paramFlightCount }}</td> <td>{{ task.paramFlightCount || 0 }}</td>
<td>{{ task.paramModel }}</td> <td>{{ task.paramModel || 'N/A' }}</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<div v-if="tasks.length === 0" class="no-data">
暂无数据
</div>
</div> </div>
<div class="footer"> <div class="footer">
<label class="effect-checkbox"> <label class="effect-checkbox">
@ -57,23 +70,40 @@
<script> <script>
import webrtc from '../webrtc'; import webrtc from '../webrtc';
import { DatePicker } from 'element-ui';
export default { export default {
name: 'TaskModal', name: 'TaskModal',
components: {
'el-date-picker': DatePicker
},
data() { data() {
return { return {
isVisible: false, isVisible: false,
year: new Date().getFullYear(), year: new Date().getFullYear().toString(),
taskName: '', taskName: '',
showEffect: false, showEffect: false,
tasks: [ tasks: [],
{ date: '2025-11-10', gameCount: 1, practiceDay: 3, paramFlightCount: 65, paramModel: 'J-11,模型-7' }, originalTasks: [],
], taskList: [
originalTasks: [ {
{ date: '2025-11-10', gameCount: 1, practiceDay: 3, paramFlightCount: 65, paramModel: 'J-11,模型-7' }, id: 1,
value: 'J-11,模型-7',
label: 'J-11,模型-7'
},
], ],
}; };
}, },
watch: {
year(newVal) {
const yearNum = parseInt(newVal);
if (yearNum < 2000) {
this.year = String(2000);
} else if (yearNum > 2100) {
this.year = String(2100);
}
}
},
methods: { methods: {
openModal() { openModal() {
this.isVisible = true; this.isVisible = true;
@ -100,55 +130,154 @@ export default {
this.closeModal(); this.closeModal();
}, },
initData() { initData() {
this.originalTasks = [ // const data = {
{ date: '2025-11-10', gameCount: 1, practiceDay: 3, paramFlightCount: 65, paramModel: 'J-11,模型-7' }, // command: "LoadScenario"
{ date: '2025-11-11', gameCount: 2, practiceDay: 4, paramFlightCount: 75, paramModel: 'J-11,模型-8' }, // }
{ date: '2025-11-12', gameCount: 1, practiceDay: 3, paramFlightCount: 65, paramModel: 'J-11,模型-9' }, // webrtc.webrtc.emitUIInter(data);
]; // this.originalTasks = [
this.tasks = [...this.originalTasks]; // { date: '2025-11-10', gameCount: 1, practiceDay: 3, paramFlightCount: 65, paramModel: 'J-11,-7' },
// { date: '2025-11-11', gameCount: 2, practiceDay: 4, paramFlightCount: 75, paramModel: 'J-11,-8' },
// { date: '2025-11-12', gameCount: 1, practiceDay: 3, paramFlightCount: 65, paramModel: 'J-11,-9' },
// ];
// this.tasks = [...this.originalTasks];
},
formatTimestamp(timestamp) {
try {
// timestamp
const ts = Number(timestamp) - 15607766499;
if (isNaN(ts)) {
console.warn('Invalid timestamp:', timestamp);
return 'Invalid Date';
}
const date = new Date(ts * 1000); //
if (date.toString() === 'Invalid Date') {
console.warn('Invalid date from timestamp:', ts);
return 'Invalid Date';
}
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
} catch (error) {
console.error('Error formatting timestamp:', error);
return 'Error';
}
}, },
handleSearch() { handleSearch() {
this.tasks = this.originalTasks.filter(task => { const currentTaskName = this.taskName;
const yearMatch = task.date.includes(this.year.toString());
const taskNameMatch = !this.taskName || task.paramModel.includes(this.taskName); if (!currentTaskName) {
return yearMatch && taskNameMatch; console.warn('Task name is empty');
}); return;
}
try { try {
const data = { webrtc.webrtc.emitUIInter({
command: "LoadScenario" command: "SelectScenarioTask",
} task: currentTaskName
webrtc.webrtc.emitUIInter(data); });
//
console.log('Sending request with task:', currentTaskName);
webrtc.webrtc.addResponseEventListener('SelectScenarioTask', (response) => {
console.log('SelectScenarioTask response1111:', response);
try {
const parsedResponse = JSON.parse(response);
console.log('Parsed response:', parsedResponse, Array.isArray(parsedResponse.data));
if (parsedResponse.response === 'SelectScenarioTaskResponse' && Array.isArray(parsedResponse.data)) {
console.log('Parsed response:', parsedResponse);
this.tasks = parsedResponse.data.map(item => {
const mappedItem = {
date: this.formatTimestamp(Number(item.timestamp)),
gameCount: Number(item.bc) || 0,
practiceDay: Number(item.yxr) || 0,
paramFlightCount: 0,
paramModel: ''
};
console.log('Mapped item:', mappedItem);
return mappedItem;
});
console.log('Updated tasks array:', this.tasks);
//
this.$forceUpdate();
} else {
console.warn('Invalid response format:', parsedResponse);
this.tasks = [];
}
} catch (parseError) {
console.error('Error parsing response:', parseError);
this.tasks = [];
}
webrtc.webrtc.removeResponseEventListener('SelectScenarioTask');
});
} catch (error) { } catch (error) {
console.error('Error in emitCommand:', error); console.error('Error in emitUIInter:', error);
this.tasks = [];
} }
}, },
handleReset() { handleReset() {
this.year = new Date().getFullYear(); this.year = String(new Date().getFullYear());
this.taskName = ''; this.taskName = '';
this.tasks = [...this.originalTasks]; this.tasks = [...this.originalTasks];
try { try {
webrtc.webrtc.emitCommand("ResetTask", {}); webrtc.webrtc.emitUIInter({
ResetTask: true
});
} catch (error) { } catch (error) {
console.error('Error in emitCommand:', error); console.error('Error in emitUIInter:', error);
} }
}, },
handleChangeYear() { handleChangeYear() {
const data = {
command: "LoadScenarioTask",
year: this.year
};
try { try {
webrtc.webrtc.emitUIInter(data); webrtc.webrtc.emitUIInter({
command: "LoadScenarioTask",
year: this.year
});
webrtc.webrtc.addResponseEventListener('LoadScenarioTask', (response) => {
console.log('LoadScenarioTask response:222', response);
const parsedResponse = JSON.parse(response);
if (parsedResponse.response === 'LoadScenarioTaskResponse' && parsedResponse.data) {
if (Array.isArray(parsedResponse.data) && parsedResponse.data.length > 0) {
this.taskList = parsedResponse.data.map(task => ({
id: task,
value: task,
label: task
}));
if (this.taskList.length > 0) {
this.taskName = this.taskList[0].value;
} else {
this.taskName = '';
}
} else {
console.warn('Response data is empty or not an array');
this.taskName = '';
this.taskList = [];
}
}
webrtc.webrtc.removeResponseEventListener('LoadScenarioTask');
});
} catch (error) { } catch (error) {
console.error('Error in emitCommand:', error); console.error('Error in emitUIInter:', error);
} }
}, },
}, },
created() { created() {
this.initData(); this.initData();
},
mounted() {
//
if (this.taskName) {
this.handleSearch();
}
} }
}; };
</script> </script>
@ -211,15 +340,37 @@ h2 {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 4px; gap: 4px;
position: relative;
} }
.search-item label { .search-item label {
font-size: 12px; font-size: 12px;
white-space: nowrap; margin-right: 4px;
color: #fff;
} }
.year-input { .year-picker {
width: 60px; width: 100px !important;
}
/* 覆盖 element-ui 默认样式 */
:deep(.el-input__inner) {
background-color: #1e2c42 !important;
border: 1px solid #3a4b66 !important;
color: white !important;
height: 24px !important;
line-height: 24px !important;
font-size: 12px !important;
}
:deep(.el-input__icon) {
line-height: 24px !important;
color: #fff !important;
}
:deep(.el-input__prefix),
:deep(.el-input__suffix) {
top: 0 !important;
} }
.task-select { .task-select {
@ -342,4 +493,16 @@ button:hover {
.table-container::-webkit-scrollbar-track { .table-container::-webkit-scrollbar-track {
background: #1e2c42; background: #1e2c42;
} }
.year-picker:focus {
outline: none;
border-color: #1890ff;
}
.no-data {
text-align: center;
padding: 20px;
color: #999;
font-size: 12px;
}
</style> </style>

View File

@ -1,99 +1,154 @@
<template> <template>
<div id="top_bar"> <div id="top_bar">
<div id="top_bar_left"> <div id="top_bar_left">
<span>XXXXXXX管理平台</span> <span class="time">{{ currentTime }}</span>
<span class="date">{{ currentDate }}<br>{{ currentDay }}</span>
</div>
<div id="top_bar_center">
<span>KZDK战术分析系统</span>
</div> </div>
<div id="top_bar_right"> <div id="top_bar_right">
<span class="time">19:00</span>
<span class="date">2022年5月8日<br>星期天</span>
<span class="temp">10-15</span>
<span class="weather">晴转多云<br>微风2</span>
<button @click="openTaskModal" class="open-modal-button">打开任务选择</button> <button @click="openTaskModal" class="open-modal-button">打开任务选择</button>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
export default { export default {
name:'TopBar', name: 'TopBar',
data() {
return {
currentTime: '',
currentDate: '',
currentDay: '',
timer: null
}
},
methods: { methods: {
openTaskModal() { openTaskModal() {
this.$emit('open-task-modal'); this.$emit('open-task-modal');
}, },
updateTime() {
const now = new Date();
// - 24
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
const seconds = String(now.getSeconds()).padStart(2, '0');
this.currentTime = `${hours}:${minutes}:${seconds}`;
//
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const date = String(now.getDate()).padStart(2, '0');
this.currentDate = `${year}${month}${date}`;
//
const days = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
this.currentDay = days[now.getDay()];
}
},
mounted() {
//
this.updateTime();
//
this.timer = setInterval(() => {
this.updateTime();
}, 1000); // 1000 = 1
},
beforeDestroy() {
if (this.timer) {
clearInterval(this.timer);
this.timer = null;
}
} }
} }
</script> </script>
<style> <style>
#top_bar #top_bar {
{ width: 100%;
width:100%;
color: white; color: white;
pointer-events: auto; pointer-events: auto;
background: linear-gradient(to right, #1a2942, #141e30);
height: 60px;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 20px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
} }
#top_bar_left
{
float:left;
width:723px;
height:100px;
background: url('../assets/images/top_bar_left_bg.png') no-repeat;
background-size: cover;
font-size:50px;
text-align:left;
font-weight: bold;
padding-left: 50px;
line-height:80px;
}
#top_bar_right
{
float:right;
width:914px;
height:70px;
background: url('../assets/images/top_bar_right_bg.png') no-repeat;
background-size: cover;
line-height: 70px;
#top_bar_left {
display: flex;
align-items: center;
gap: 15px;
min-width: 300px;
padding-left: 40px;
} }
#top_bar_right .time
{ #top_bar_center {
float:left; position: absolute;
margin-left: 100px; left: 50%;
font-size: 35px; transform: translateX(-50%);
font-weight: bold; font-size: 24px;
font-weight: bold;
color: #4bb5ff;
} }
#top_bar_right .date
{ #top_bar_right {
float:left; display: flex;
margin-left: 10px; align-items: center;
font-size: 25px; min-width: 300px;
line-height: 30px; justify-content: center;
padding-top:5px; padding-right: 40px;
} }
#top_bar_right .temp
{ #top_bar_right .time {
float:left; font-size: 24px;
margin-left: 160px; font-weight: normal;
font-size: 35px; color: #4bb5ff;
font-weight: bold; display: flex;
align-items: center;
} }
#top_bar_right .weather
{ .time {
float:left; font-size: 24px;
margin-left: 10px; color: #4bb5ff;
font-size: 25px; font-family: 'Arial', sans-serif;
line-height: 30px; letter-spacing: 1px;
padding-top:5px;
} }
.open-modal-button {
float: right; .date {
margin-right: 20px;
padding: 10px 20px;
font-size: 16px; font-size: 16px;
background-color: #007bff; color: #4bb5ff;
text-align: left;
line-height: 1.2;
}
.open-modal-button {
background-color: #0066ff;
color: white; color: white;
border: none; border: none;
border-radius: 5px;
cursor: pointer; cursor: pointer;
padding: 6px 20px;
height: 36px;
font-size: 16px;
border-radius: 4px;
transition: all 0.3s ease;
display: flex;
align-items: center;
justify-content: center;
margin-right: 40px;
} }
.open-modal-button:hover { .open-modal-button:hover {
background-color: #0056b3; background-color: #0052cc;
}
.open-modal-button:active {
background-color: #004080;
transform: scale(0.98);
} }
</style> </style>

View File

@ -3,6 +3,10 @@ import Vue from 'vue'
import App from './App.vue' import App from './App.vue'
import webrtc from './webrtc' import webrtc from './webrtc'
import * as echarts from 'echarts' import * as echarts from 'echarts'
import 'element-ui/lib/theme-chalk/index.css'
import { DatePicker } from 'element-ui'
Vue.use(DatePicker)
Vue.prototype.webrtc = webrtc.webrtc Vue.prototype.webrtc = webrtc.webrtc
Vue.prototype.echarts = echarts Vue.prototype.echarts = echarts
Vue.config.productionTip = false Vue.config.productionTip = false

View File

@ -485,7 +485,7 @@ function addResponseEventListener(name, listener) {
} }
function removeResponseEventListener(name) { function removeResponseEventListener(name) {
responseEventListeners.remove(name); responseEventListeners.delete(name);
} }
// Must be kept in sync with PixelStreamingProtocol::EToPlayerMsg C++ enum. // Must be kept in sync with PixelStreamingProtocol::EToPlayerMsg C++ enum.
@ -1865,7 +1865,7 @@ function connect() {
} }
// ws = new WebSocket("ws://localhost/"); // ws = new WebSocket("ws://localhost/");
// ws = new WebSocket(window.location.href.replace('http://', 'ws://').replace('https://', 'wss://')); // ws = new WebSocket(window.location.href.replace('http://', 'ws://').replace('https://', 'wss://'));
let connectionUrl = window.location.href.replace('http://', 'ws://').replace('https://', 'wss://').replace(/:\d+/, ':8000'); let connectionUrl = window.location.href.replace('http://', 'ws://').replace('https://', 'wss://').replace(/:\d+/, '');
console.log(`Creating a websocket connection to: ${connectionUrl}`); console.log(`Creating a websocket connection to: ${connectionUrl}`);
ws = new WebSocket(connectionUrl); ws = new WebSocket(connectionUrl);
ws.attemptStreamReconnection = true; ws.attemptStreamReconnection = true;
@ -1942,7 +1942,9 @@ let webrtc =
playVideo: playVideoStream, playVideo: playVideoStream,
resizePlayer: resizePlayerStyle, resizePlayer: resizePlayerStyle,
emitUIInter: emitUIInteraction, emitUIInter: emitUIInteraction,
emitCommand: emitCommand emitCommand: emitCommand,
addResponseEventListener: addResponseEventListener,
removeResponseEventListener: removeResponseEventListener
} }
export default export default