仿真模型子系统,场景编辑子系统

This commit is contained in:
liaoboping 2025-08-11 10:58:43 +08:00
parent 4d52b072c9
commit f7945e711a
18 changed files with 466 additions and 140 deletions

View File

@ -13,7 +13,7 @@ plugins.push(['import', {
'libraryName': 'ant-design-vue', 'libraryName': 'ant-design-vue',
'libraryDirectory': 'es', 'libraryDirectory': 'es',
'style': true // `style: true` 会加载 less 文件 'style': true // `style: true` 会加载 less 文件
}]) }, 'ant-design-vue'])
module.exports = { module.exports = {
presets: [ presets: [

View File

@ -1,5 +1,5 @@
{ {
"name": "vue-antd-pro", "name": "jsse-front",
"version": "3.0.2", "version": "3.0.2",
"private": true, "private": true,
"scripts": { "scripts": {
@ -18,6 +18,8 @@
"@antv/data-set": "^0.10.2", "@antv/data-set": "^0.10.2",
"ant-design-vue": "^1.7.8", "ant-design-vue": "^1.7.8",
"axios": "^0.26.1", "axios": "^0.26.1",
"cesium": "1.101.0",
"cesium-navigation-es6": "3.0.9",
"core-js": "^3.21.1", "core-js": "^3.21.1",
"echarts": "^5.3.3", "echarts": "^5.3.3",
"enquire.js": "^2.1.6", "enquire.js": "^2.1.6",

2
public/index.html vendored
View File

@ -22,7 +22,7 @@
</head> </head>
<body> <body>
<noscript> <noscript>
<strong>We're sorry but vue-antd-pro doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> <strong>We're sorry but jsse-front doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript> </noscript>
<div id="app"> <div id="app">
<div class="first-loading-wrp"> <div class="first-loading-wrp">

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

View File

@ -0,0 +1 @@
export default class MyCesium {}

View File

@ -1,9 +1,11 @@
<template> <template>
<div class="module-wrapper" :style="wrapperStyle"> <div class="module-wrapper" :style="wrapperStyle">
<div class="module-wrapper-header"> <div class="module-wrapper-header">
<div class="module-wrapper-title">{{ title }}</div> <slot name="title">
<div class="module-wrapper-title">{{ title }}</div>
</slot>
<slot name="title-extra"></slot> <slot name="title-extra"></slot>
<div style="flex: 1;"></div> <div style="flex: 1"></div>
<slot name="extra"></slot> <slot name="extra"></slot>
</div> </div>
<div class="module-wrapper-main"> <div class="module-wrapper-main">

View File

@ -3,11 +3,15 @@ import ModuleWrapper from './Layout/ModuleWrapper.vue'
import GridBox from './Directives/GridBox' import GridBox from './Directives/GridBox'
import Flex from './Directives/Flex' import Flex from './Directives/Flex'
import MyCesium from './Cesium/index'
export default { export default {
install(Vue) { install(Vue) {
Vue.component('ModuleWrapper', ModuleWrapper) Vue.component('ModuleWrapper', ModuleWrapper)
Vue.directive('grid-box', GridBox) Vue.directive('grid-box', GridBox)
Vue.directive('flex', Flex) Vue.directive('flex', Flex)
window.MyCesium = MyCesium
}, },
} }

View File

@ -242,7 +242,7 @@ export const constantRouterMap = [
{ {
path: '/simulationScene/sceneEditing', path: '/simulationScene/sceneEditing',
name: 'SimulationSceneSceneEditing', name: 'SimulationSceneSceneEditing',
component: () => import(/* webpackChunkName: "fail" */ '@/views/simulationScene/database/index.vue'), component: () => import(/* webpackChunkName: "fail" */ '@/views/simulationScene/sceneEditing/index.vue'),
meta: { allow: true, title: '场景编辑子系统' }, meta: { allow: true, title: '场景编辑子系统' },
}, },
{ {

View File

@ -22,7 +22,6 @@ import './permission' // permission control
import './utils/filter' // global filter import './utils/filter' // global filter
import './global.less' // global style import './global.less' // global style
import * as echarts from 'echarts' import * as echarts from 'echarts'
console.log(echarts,'echarts')
import CommonRegister from './components/Common/register' import CommonRegister from './components/Common/register'
@ -54,5 +53,5 @@ new Vue({
i18n, i18n,
// init localstorage, vuex, Logo message // init localstorage, vuex, Logo message
created: bootstrap, created: bootstrap,
render: h => h(App) render: (h) => h(App),
}).$mount('#app') }).$mount('#app')

View File

@ -1,37 +1,34 @@
import request from '@/utils/request'
export default { export default {
namespace: true, namespace: true,
state: { state: {
systemModules: [ systemModules: [
{ {
title: '数据库子系统', moduleName: '数据库子系统',
icon: require('@/assets/images/simulation-scene/system-icon/database.png'), moduleStatus: '0',
statusKey: 'database', moduleCode: 'db_system',
path: '/simulationScene/database',
}, },
{ {
title: '仿真模型子系统', moduleName: '仿真模型子系统',
icon: require('@/assets/images/simulation-scene/system-icon/model.png'), moduleStatus: '0',
statusKey: 'model', moduleCode: 'simulation_system',
path: '/simulationScene/simulationModel',
}, },
{ {
title: '场景编辑子系统', moduleName: '场景编辑子系统',
icon: require('@/assets/images/simulation-scene/system-icon/editing.png'), moduleStatus: '0',
statusKey: 'editing', moduleCode: 'scenario_system',
path: '/simulationScene/sceneEditing',
}, },
{ {
title: '显示子系统', moduleName: '显示子系统',
icon: require('@/assets/images/simulation-scene/system-icon/display.png'), moduleStatus: '0',
statusKey: 'display', moduleCode: 'display_system',
path: '/simulationScene/display',
}, },
{ {
title: '评估子系统', moduleName: '评估子系统',
icon: require('@/assets/images/simulation-scene/system-icon/evaluation.png'), moduleStatus: '0',
statusKey: 'evaluation', moduleCode: 'evaluation_system',
path: '/simulationScene/evaluation',
}, },
], ],
systemStatusMap: { systemStatusMap: {
@ -42,14 +39,43 @@ export default {
evaluation: 'running', evaluation: 'running',
}, },
systemStatusDesc: { systemStatusDesc: {
unstart: '未启动', 0: '未启动',
running: '运行中', 1: '运行中',
},
systemIconMap: {
db_system: require('@/assets/images/simulation-scene/system-icon/database.png'),
simulation_system: require('@/assets/images/simulation-scene/system-icon/model.png'),
scenario_system: require('@/assets/images/simulation-scene/system-icon/editing.png'),
display_system: require('@/assets/images/simulation-scene/system-icon/display.png'),
evaluation_system: require('@/assets/images/simulation-scene/system-icon/evaluation.png'),
},
systemPathMap: {
db_system: '/simulationScene/database',
simulation_system: '/simulationScene/simulationModel',
scenario_system: '/simulationScene/sceneEditing',
display_system: '/simulationScene/display',
evaluation_system: '/simulationScene/evaluation',
}, },
}, },
getters: {}, getters: {
systemIconMap() {},
},
mutations: {}, mutations: {
setSystemModules(state, payload) {
state.systemModules = payload
},
},
actions: {}, actions: {
async getSystemModules({ commit }, payload) {
try {
const res = await request({ url: '/baseData/moduleStatus/list' })
commit('setSystemModules', res.data.data)
} catch (error) {
console.log(error)
}
},
},
} }

View File

@ -3,15 +3,15 @@
<ModuleWrapper title="系统模块" style="grid-column: 1 / 3"> <ModuleWrapper title="系统模块" style="grid-column: 1 / 3">
<div class="normal" v-grid-box="{ columns: [1, 1, 1, 1, 1] }"> <div class="normal" v-grid-box="{ columns: [1, 1, 1, 1, 1] }">
<div <div
v-for="(block, index) in systemModules" v-for="block in systemModules"
:key="index" :key="block.moduleCode"
:class="['system-block', `system-${systemStatusMap[block.statusKey]}`]" :class="['system-block', `system-${block.moduleStatus}`]"
v-flex.v="['c', 'sb']" v-flex.v="['c', 'sb']"
> >
<img class="icon" :src="block.icon" alt="" /> <img class="icon" :src="systemIconMap[block.moduleCode]" alt="" />
<div class="title">{{ block.title }}</div> <div class="title">{{ block.moduleName }}</div>
<div :class="['status', `status-${systemStatusMap[block.statusKey]}`]"> <div :class="['status', `status-${block.moduleStatus}`]">
{{ systemStatusDesc[systemStatusMap[block.statusKey]] }} {{ systemStatusDesc[block.moduleStatus] }}
</div> </div>
</div> </div>
</div> </div>
@ -155,6 +155,8 @@ export default {
systemModules: (state) => state.simulation.systemModules, systemModules: (state) => state.simulation.systemModules,
systemStatusMap: (state) => state.simulation.systemStatusMap, systemStatusMap: (state) => state.simulation.systemStatusMap,
systemStatusDesc: (state) => state.simulation.systemStatusDesc, systemStatusDesc: (state) => state.simulation.systemStatusDesc,
systemIconMap: (state) => state.simulation.systemIconMap,
systemPathMap: (state) => state.simulation.systemPathMap,
}), }),
}, },
watch: {}, watch: {},
@ -188,17 +190,17 @@ export default {
line-height: 1; line-height: 1;
color: #ffffff; color: #ffffff;
} }
.status-running { .status-1 {
background-color: #11b740; background-color: #11b740;
} }
.status-unstart { .status-0 {
background-color: #9d9d9d; background-color: #9d9d9d;
} }
} }
.system-unstart { .system-0 {
cursor: not-allowed; cursor: not-allowed;
} }
.system-running:hover { .system-1:hover {
border-color: #00f2fe; border-color: #00f2fe;
} }

View File

@ -21,63 +21,6 @@ export default {
} }
}, },
}, },
mounted() {
this.$http({
url: '/baseData/moduleStatus/list',
}).then((res) => {
console.log('----res----', res)
const data = {
code: 200,
message: 'ok',
data: {
code: 200,
message: 'ok',
data: [
{
id: 1,
moduleName: '数据库子系统',
moduleUrl: '/',
sortOrder: 1,
moduleStatus: '0',
moduleCode: 'db_system',
},
{
id: 2,
moduleName: '仿真模型子系统',
moduleUrl: '/',
sortOrder: 2,
moduleStatus: '0',
moduleCode: 'simulation_system',
},
{
id: 3,
moduleName: '场景编辑子系统',
moduleUrl: '/',
sortOrder: 3,
moduleStatus: '0',
moduleCode: 'scenario_system',
},
{
id: 4,
moduleName: '显示子系统',
moduleUrl: '/',
sortOrder: 4,
moduleStatus: '0',
moduleCode: 'display_system',
},
{
id: 5,
moduleName: '评估子系统',
moduleUrl: '/',
sortOrder: 5,
moduleStatus: '0',
moduleCode: 'evaluation_system',
},
],
},
}
})
},
} }
</script> </script>

View File

@ -1,11 +1,203 @@
<template> <template>
<div>SimulationSceneSceneEditing</div> <div class="scene-editing-page" v-grid-box="{ columns: ['320px', 1, '320px'], rows: [45, 30, 25], gap: '0px' }">
<ModuleWrapper title="作战/保障力量" style="grid-column: 1 / 2; grid-row: 1 / 2">
<div class="normal" style="padding: 5px">
<a-tree :treeData="zb.zbTreeData"></a-tree>
</div>
</ModuleWrapper>
<ModuleWrapper title="装备元素" style="grid-column: 1 / 2; grid-row: 2 / 4">
<div class="normal" style="padding: 5px" v-flex.v>
<a-input-search v-model="ys.keyword" placeholder="输入关键词搜索..." @search="onSearch" />
<div style="height: 0; flex: 1; overflow-y: auto">
<a-row>
<template v-for="item in ys.ysList">
<a-col :key="item.id" :span="24">{{ item.title }}</a-col>
<a-col v-for="it in item.children" :key="it.id" :span="12" v-flex.v="['c']">
<img class="ys-image" :src="it.image" alt="" />
<span>{{ it.title }}</span>
</a-col>
</template>
</a-row>
</div>
</div>
</ModuleWrapper>
<div
class="cesium-container"
id="cesium-container"
style="grid-column: 2 / 3; grid-row: 1 / 7; overflow: hidden"
></div>
<ModuleWrapper title="作战单元状态" style="grid-column: 3 / 4; grid-row: 1 / 3">
<div class="normal" style="padding: 15px 0">
<div style="height: 100%; padding: 0 15px; overflow-y: auto">
<img class="image" :src="zt.image" />
<div class="name">{{ zt.name }}</div>
<div v-for="item in zt.ztList" :key="item.label" class="zt-item">
<span>{{ item.label }}</span>
<img :src="item.icon" alt="" />
<span>{{ item.text }}</span>
</div>
</div>
</div>
</ModuleWrapper>
<ModuleWrapper title="作战单元武器" style="grid-column: 3 / 4; grid-row: 3 / 4">
<div class="normal" style="padding: 15px 0">
<div style="height: 100%; padding: 0 15px; overflow-y: auto">
<div v-for="(item, index) in zzdywq.wqList" :key="index" class="wq-item" v-flex>
<span>{{ item.title }}</span>
</div>
</div>
</div>
</ModuleWrapper>
</div>
</template> </template>
<script> <script>
export default { export default {
name: 'SimulationSceneSceneEditing', name: 'SimulationSceneSceneEditing',
data() {
return {
cesium: null,
zb: {
zbTreeData: [
{
key: '1',
title: '红方',
children: [
{
key: '1-1',
title: '作战力量',
children: [
{ key: '1-1-1', title: '左翼夺控群火力分队' },
{ key: '1-1-2', title: '左翼攻击分队' },
{ key: '1-1-3', title: '右翼攻击分队' },
{ key: '1-1-4', title: '右翼夺控群反装甲分队' },
{ key: '1-1-5', title: '防空火力队' },
{ key: '1-1-6', title: '左翼牵制群右翼攻击分队' },
{ key: '1-1-7', title: '电子对抗兵队超短波干扰分队' },
{ key: '1-1-8', title: '纵深夺控群火力分队' },
],
},
{
key: '1-2',
title: '保障力量',
},
],
},
{
key: '2',
title: '蓝方',
children: [
{ key: '1-1', title: '作战力量' },
{ key: '1-2', title: '保障力量' },
],
},
],
},
ys: {
keyword: '',
ysList: [
{
id: '1',
title: '红方',
children: [
{ id: '1-1', title: '反坦克导弹', image: '/mockData/fe6ad2d8-da11-04d8-f447-0d8175826e28.png' },
{ id: '1-2', title: '红箭10反坦克导弹', image: '/mockData/fe6ad2d8-da11-04d8-f447-0d8175826e28.png' },
{ id: '1-3', title: '装甲突击车', image: '/mockData/fe6ad2d8-da11-04d8-f447-0d8175826e28.png' },
{ id: '1-4', title: 'VT5坦克', image: '/mockData/fe6ad2d8-da11-04d8-f447-0d8175826e28.png' },
{ id: '1-5', title: '餐饮车', image: '/mockData/fe6ad2d8-da11-04d8-f447-0d8175826e28.png' },
{ id: '1-6', title: '物资运输车', image: '/mockData/fe6ad2d8-da11-04d8-f447-0d8175826e28.png' },
{ id: '1-7', title: '油罐车', image: '/mockData/fe6ad2d8-da11-04d8-f447-0d8175826e28.png' },
{ id: '1-8', title: '雷达车', image: '/mockData/fe6ad2d8-da11-04d8-f447-0d8175826e28.png' },
],
},
{
id: '2',
title: '蓝方',
children: [
{ id: '2-1', title: '反坦克导弹', image: '/mockData/fe6ad2d8-da11-04d8-f447-0d8175826e28.png' },
{ id: '2-2', title: '红箭10反坦克导弹', image: '/mockData/fe6ad2d8-da11-04d8-f447-0d8175826e28.png' },
{ id: '2-3', title: '装甲突击车', image: '/mockData/fe6ad2d8-da11-04d8-f447-0d8175826e28.png' },
{ id: '2-4', title: 'VT5坦克', image: '/mockData/fe6ad2d8-da11-04d8-f447-0d8175826e28.png' },
{ id: '2-5', title: '餐饮车', image: '/mockData/fe6ad2d8-da11-04d8-f447-0d8175826e28.png' },
{ id: '2-6', title: '物资运输车', image: '/mockData/fe6ad2d8-da11-04d8-f447-0d8175826e28.png' },
{ id: '2-7', title: '油罐车', image: '/mockData/fe6ad2d8-da11-04d8-f447-0d8175826e28.png' },
{ id: '2-8', title: '雷达车', image: '/mockData/fe6ad2d8-da11-04d8-f447-0d8175826e28.png' },
],
},
],
},
zt: {
image: '/mockData/fe6ad2d8-da11-04d8-f447-0d8175826e28.png',
name: '轮式装甲突击车',
ztList: [
{ label: '推演方', text: `红方` },
{ label: '航向', text: `0度` },
{ label: '航速', text: `0.00公里/小时(停车)` },
{ label: '经度', text: `东经120°53'56″` },
{ label: '纬度', text: `北纬24°34'17″` },
{ label: '高度/深度', text: `0.00米` },
{ label: '毁伤', icon: '/mockData/9d47c8c8-30d8-3e78-944f-d48ca8084c58.png' },
{ label: '系统', progress: 100 },
{ label: '电量', progress: 90 },
{ label: '失火', progress: 0 },
{ label: '状态', text: `未分配任务` },
],
},
zzdywq: {
placeholder: '&emsp;'.repeat(100),
wqList: [
{ title: '240×7.62毫米高射机炮[20发备弹]' },
{ title: '16×AT-14型“短号”反坦克导弹' },
{ title: '6×巡飞弹' },
{ title: '4×无人侦察机' },
],
},
}
},
mounted() {
this.cesium = new window.MyCesium('cesium-container')
},
methods: {
onSearch(e) {
console.log('----', e, e.target.value)
},
},
} }
</script> </script>
<style lang="less" scoped></style> <style lang="less" scoped>
.scene-editing-page {
padding-top: 20px;
}
.ys-image {
width: 74px;
height: 62px;
object-fit: cover;
margin: 16px 0 8px;
}
.image {
width: 100%;
padding: 20px;
background-color: #0c3040;
}
.name {
color: #00baff;
text-decoration: underline;
font-size: 16px;
line-height: 26px;
margin: 10px 0;
}
.zt-item {
font-size: 16px;
line-height: 30px;
letter-spacing: 2px;
color: #bbdded;
}
.wq-item {
text-decoration: underline;
font-size: 16px;
line-height: 26px;
letter-spacing: 0px;
color: #00baff;
}
</style>

View File

@ -1,14 +1,137 @@
<template> <template>
<div class="simulation-model-page" v-flex.v> <div class="simulation-model-page" v-grid-box="{ columns: ['320px', 1, '320px'], rows: [1, 1], gap: '0px' }">
<div style="flex: 1"> <ModuleWrapper title="作战/保障力量" style="grid-column: 1 / 2; grid-row: 1 / 2">
<div class="normal" style="padding: 5px">
</div> <a-tree :treeData="zb.zbTreeData"> </a-tree>
</div>
</ModuleWrapper>
<ModuleWrapper style="grid-column: 1 / 2; grid-row: 2 / 3">
<template #title>
<a-radio-group v-model="qd.qdlx" button-style="solid">
<a-radio-button value="xqqd">需求清单</a-radio-button>
<a-radio-button value="bzqd">保障清单</a-radio-button>
</a-radio-group>
</template>
<div class="normal" style="padding: 5px">
<a-table rowKey="id" :columns="qd.qdColumns" :dataSource="qd.qdList" :pagination="false" bordered></a-table>
</div>
</ModuleWrapper>
<div
class="cesium-container"
id="cesium-container"
style="grid-column: 2 / 3; grid-row: 1 / 3; overflow: hidden"
></div>
<ModuleWrapper title="保障实体属性" style="grid-column: 3 / 4; grid-row: 1 / 2">
<div class="normal" style="padding: 15px 0">
<div style="height: 100%; padding: 0 15px; overflow-y: auto">
<img class="image" :src="sx.image" />
<div class="name">{{ sx.name }}</div>
<div v-for="item in sx.sxList" :key="item.label" class="sx-item">
<span>{{ item.label }}</span>
<img :src="item.icon" alt="" />
<span>{{ item.text }}</span>
</div>
</div>
</div>
</ModuleWrapper>
<ModuleWrapper title="资源" style="grid-column: 3 / 4; grid-row: 2 / 3">
<div class="normal" style="padding: 15px 0">
<div style="height: 100%; padding: 0 15px; overflow-y: auto">
<div v-for="item in zy.zyList" :key="item.label" class="zy-item" v-flex>
<span>{{ item.label }}</span>
<span style="flex: 1; white-space: nowrap; overflow: hidden" v-html="zy.placeholder"></span>
<span>{{ item.text }}</span>
</div>
</div>
</div>
</ModuleWrapper>
</div> </div>
</template> </template>
<script> <script>
export default { export default {
name: 'SimulationSceneSimulationModel', name: 'SimulationSceneSimulationModel',
data() {
return {
cesium: null,
zb: {
zbTreeData: [
{
key: '1',
title: '红方',
children: [
{
key: '1-1',
title: '作战力量',
children: [
{ key: '1-1-1', title: '左翼夺控群火力分队' },
{ key: '1-1-2', title: '左翼攻击分队' },
{ key: '1-1-3', title: '右翼攻击分队' },
{ key: '1-1-4', title: '右翼夺控群反装甲分队' },
{ key: '1-1-5', title: '防空火力队' },
{ key: '1-1-6', title: '左翼牵制群右翼攻击分队' },
{ key: '1-1-7', title: '电子对抗兵队超短波干扰分队' },
{ key: '1-1-8', title: '纵深夺控群火力分队' },
],
},
{
key: '1-2',
title: '保障力量',
},
],
},
{
key: '2',
title: '蓝方',
children: [
{ key: '1-1', title: '作战力量' },
{ key: '1-2', title: '保障力量' },
],
},
],
},
qd: {
qdlx: 'xqqd',
qdColumns: [
{ dataIndex: 'dj', title: '等级', width: '62px', align: 'center' },
{ dataIndex: 'bzxq', title: '保障需求' },
],
qdList: [
{ id: '1', dj: '紧急', bzxq: '500枚防空导弹、6辆装甲车' },
{ id: '2', dj: '加急', bzxq: '5吨汽油、100套军装' },
{ id: '3', dj: '一般', bzxq: '15箱消炎药、6箱葡萄糖滴' },
{ id: '4', dj: '一般', bzxq: '一吨饮用水' },
{ id: '5', dj: '一般', bzxq: '1吨燃油、厨房抽烟机设备一' },
],
},
sx: {
image: '/mockData/cb8917d8-6658-cf7f-dd4e-ea2e670edea8.png',
name: '医院',
sxList: [
{ label: '推演方', text: `红方` },
{ label: '经度', text: `东经120°12'03″` },
{ label: '纬度', text: `北纬24°51'09″` },
{ label: '高度/深度', text: `326米` },
{ label: '图标', icon: '/mockData/9d47c8c8-30d8-3e78-944f-d48ca8084c58.png' },
{ label: '医师', text: `36人` },
{ label: '护士', text: `100人` },
],
},
zy: {
placeholder: '&emsp;'.repeat(100),
zyList: [
{ label: '血液', text: `100L` },
{ label: '药材', text: `1.5吨` },
{ label: '氧气', text: `100m3` },
{ label: '床位', text: `56个` },
{ label: '手术台', text: `10台` },
],
},
}
},
mounted() {
this.cesium = new window.MyCesium('cesium-container')
},
} }
</script> </script>
@ -16,4 +139,29 @@ export default {
.simulation-model-page { .simulation-model-page {
padding-top: 20px; padding-top: 20px;
} }
.image {
width: 100%;
padding: 20px;
background-color: #0c3040;
}
.name {
color: #00baff;
text-decoration: underline;
font-size: 16px;
line-height: 26px;
margin: 10px 0;
}
.sx-item {
font-size: 16px;
line-height: 30px;
letter-spacing: 2px;
color: #bbdded;
}
.zy-item {
text-decoration: underline;
font-size: 16px;
line-height: 26px;
letter-spacing: 0px;
color: #00baff;
}
</style> </style>

View File

@ -2,23 +2,23 @@
<div class="system-select-page" v-grid-box="{ columns: [1, 1, 1, 1, 1, 1], rows: [1, 1], gap: '40px' }"> <div class="system-select-page" v-grid-box="{ columns: [1, 1, 1, 1, 1, 1], rows: [1, 1], gap: '40px' }">
<div <div
v-for="(block, index) in systemModules" v-for="(block, index) in systemModules"
:key="index" :key="block.moduleCode"
:class="['system-block', `system-${systemStatusMap[block.statusKey]}`]" :class="['system-block', `system-${block.moduleStatus}`]"
:style="blockStyleMap[index]" :style="blockStyleMap[index]"
v-flex.v="['c', 'sb']" v-flex.v="['c', 'sb']"
@click="handleClick(block)" @click="handleClick(block)"
> >
<img class="icon" :src="block.icon" alt="" /> <img class="icon" :src="systemIconMap[block.moduleCode]" alt="" />
<div class="title">{{ block.title }}</div> <div class="title">{{ block.moduleName }}</div>
<div :class="['status', `status-${systemStatusMap[block.statusKey]}`]"> <div :class="['status', `status-${block.moduleStatus}`]">
{{ systemStatusDesc[systemStatusMap[block.statusKey]] }} {{ systemStatusDesc[block.moduleStatus] }}
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { mapState } from 'vuex' import { mapActions, mapState } from 'vuex'
export default { export default {
name: 'SimulationSceneSystemSelect', name: 'SimulationSceneSystemSelect',
@ -38,12 +38,18 @@ export default {
systemModules: (state) => state.simulation.systemModules, systemModules: (state) => state.simulation.systemModules,
systemStatusMap: (state) => state.simulation.systemStatusMap, systemStatusMap: (state) => state.simulation.systemStatusMap,
systemStatusDesc: (state) => state.simulation.systemStatusDesc, systemStatusDesc: (state) => state.simulation.systemStatusDesc,
systemIconMap: (state) => state.simulation.systemIconMap,
systemPathMap: (state) => state.simulation.systemPathMap,
}), }),
}, },
mounted() {
this.getSystemModules()
},
methods: { methods: {
...mapActions(['getSystemModules']),
handleClick(block) { handleClick(block) {
if (this.systemStatusMap[block.statusKey] === 'unstart') return if (block.moduleStatus === '0') return
this.$router.push(block.path) this.$router.push(this.systemPathMap[block.moduleCode])
}, },
}, },
} }
@ -75,17 +81,17 @@ export default {
line-height: 1; line-height: 1;
color: #ffffff; color: #ffffff;
} }
.status-running { .status-1 {
background-color: #11b740; background-color: #11b740;
} }
.status-unstart { .status-0 {
background-color: #9d9d9d; background-color: #9d9d9d;
} }
} }
.system-unstart { .system-0 {
cursor: not-allowed; cursor: not-allowed;
} }
.system-running:hover { .system-1:hover {
border-color: #00f2fe; border-color: #00f2fe;
} }
} }

View File

@ -5,12 +5,12 @@ const GitRevision = new GitRevisionPlugin()
const buildDate = JSON.stringify(new Date().toLocaleString()) const buildDate = JSON.stringify(new Date().toLocaleString())
const createThemeColorReplacerPlugin = require('./config/plugin.config') const createThemeColorReplacerPlugin = require('./config/plugin.config')
function resolve (dir) { function resolve(dir) {
return path.join(__dirname, dir) return path.join(__dirname, dir)
} }
// check Git // check Git
function getGitHash () { function getGitHash() {
try { try {
return GitRevision.version() return GitRevision.version()
} catch (e) {} } catch (e) {}
@ -25,7 +25,7 @@ const assetsCDN = {
vue: 'Vue', vue: 'Vue',
'vue-router': 'VueRouter', 'vue-router': 'VueRouter',
vuex: 'Vuex', vuex: 'Vuex',
axios: 'axios' axios: 'axios',
}, },
css: [], css: [],
// https://unpkg.com/browse/vue@2.6.10/ // https://unpkg.com/browse/vue@2.6.10/
@ -33,14 +33,14 @@ const assetsCDN = {
'//cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.min.js', '//cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.min.js',
'//cdn.jsdelivr.net/npm/vue-router@3.5.1/dist/vue-router.min.js', '//cdn.jsdelivr.net/npm/vue-router@3.5.1/dist/vue-router.min.js',
'//cdn.jsdelivr.net/npm/vuex@3.1.1/dist/vuex.min.js', '//cdn.jsdelivr.net/npm/vuex@3.1.1/dist/vuex.min.js',
'//cdn.jsdelivr.net/npm/axios@0.21.1/dist/axios.min.js' '//cdn.jsdelivr.net/npm/axios@0.21.1/dist/axios.min.js',
] ],
} }
// vue.config.js // vue.config.js
const vueConfig = { const vueConfig = {
lintOnSave: false, lintOnSave: false,
configureWebpack: { configureWebpack: {
// webpack plugins // webpack plugins
plugins: [ plugins: [
@ -49,15 +49,16 @@ const vueConfig = {
new webpack.DefinePlugin({ new webpack.DefinePlugin({
APP_VERSION: `"${require('./package.json').version}"`, APP_VERSION: `"${require('./package.json').version}"`,
GIT_HASH: JSON.stringify(getGitHash()), GIT_HASH: JSON.stringify(getGitHash()),
BUILD_DATE: buildDate BUILD_DATE: buildDate,
}) CESIUM_BASE_URL: JSON.stringify('./'),
] }),
],
// en_US: `if prod, add externals` // en_US: `if prod, add externals`
// zh_CN: `这里是用来控制编译忽略外部依赖的,与 config.plugin('html') 配合可以编译时引入外部CDN文件依赖` // zh_CN: `这里是用来控制编译忽略外部依赖的,与 config.plugin('html') 配合可以编译时引入外部CDN文件依赖`
// externals: isProd ? assetsCDN.externals : {} // externals: isProd ? assetsCDN.externals : {}
}, },
chainWebpack: config => { chainWebpack: (config) => {
config.resolve.alias.set('@$', resolve('src')) config.resolve.alias.set('@$', resolve('src'))
const svgRule = config.module.rule('svg') const svgRule = config.module.rule('svg')
@ -74,7 +75,7 @@ const vueConfig = {
.loader('file-loader') .loader('file-loader')
.options({ .options({
name: 'assets/[name].[hash:8].[ext]', name: 'assets/[name].[hash:8].[ext]',
esModule: false esModule: false,
}) })
// en_US: If prod is on assets require on cdn // en_US: If prod is on assets require on cdn
@ -96,12 +97,12 @@ const vueConfig = {
// 'primary-color': '#F5222D', // 'primary-color': '#F5222D',
// 'link-color': '#F5222D', // 'link-color': '#F5222D',
'border-radius-base': '2px' 'border-radius-base': '2px',
}, },
// DO NOT REMOVE THIS LINE // DO NOT REMOVE THIS LINE
javascriptEnabled: true javascriptEnabled: true,
} },
} },
}, },
devServer: { devServer: {
@ -114,10 +115,10 @@ const vueConfig = {
ws: false, ws: false,
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
'^/api': '' '^/api': '',
} },
} },
} },
}, },
publicPath: '/', publicPath: '/',
@ -125,7 +126,7 @@ const vueConfig = {
productionSourceMap: false, productionSourceMap: false,
lintOnSave: undefined, lintOnSave: undefined,
// babel-loader no-ignore node_modules/* // babel-loader no-ignore node_modules/*
transpileDependencies: [] transpileDependencies: ['@cesium/widgets', '@cesium/engine'],
} }
// preview.pro.loacg.com only do not use in your production; // preview.pro.loacg.com only do not use in your production;