This commit is contained in:
liaoboping 2025-10-20 16:45:08 +08:00
commit 1cdeb42c17
10 changed files with 272 additions and 14 deletions

View File

@ -1,6 +1,6 @@
NODE_ENV=development
VUE_APP_PREVIEW=true
VUE_APP_API_BASE_URL=/api
VUE_APP_API_URL=http://192.168.0.53:8099
VUE_APP_API_URL=http://192.168.0.225:8099
VUE_APP_MAP_BASE_URL=/map
VUE_APP_MAP_URL=http://192.168.0.53:8090
VUE_APP_MAP_URL=http://192.168.0.225:8090

View File

@ -1,4 +1,4 @@
NODE_ENV=production
VUE_APP_PREVIEW=true
VUE_APP_API_BASE_URL=/api
VUE_APP_API_URL=http://192.168.0.53:8099
VUE_APP_API_URL=http://192.168.0.225:8099

4
public/config.js vendored
View File

@ -19,7 +19,7 @@ window._CONFIG = {
evaluationSrc: 'http://192.168.0.53:8088/thirdLogin/thirdLoginPage?username=admin',
// 服务端地址
VUE_APP_API_URL: 'http://192.168.0.53:8099',
VUE_APP_API_URL: 'http://192.168.0.225:8099',
// websocket服务地址
VUE_APP_WEBSOCKET_URL: 'ws://192.168.0.53:8099',
VUE_APP_WEBSOCKET_URL: 'ws://192.168.0.225:8099',
}

2
public/index.html vendored
View File

@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>App.ico">
<title>基于大数据的智能化后装保障链仿真分析方法工具</title>
<title>中印边境自卫作战联合反击后装保障效能全业务全链路仿真系统</title>
<style>.first-loading-wrp{display:flex;justify-content:center;align-items:center;flex-direction:column;min-height:420px;height:100%}.first-loading-wrp>h1{font-size:128px}.first-loading-wrp .loading-wrp{padding:98px;display:flex;justify-content:center;align-items:center}.dot{animation:antRotate 1.2s infinite linear;transform:rotate(45deg);position:relative;display:inline-block;font-size:32px;width:32px;height:32px;box-sizing:border-box}.dot i{width:14px;height:14px;position:absolute;display:block;background-color:#1890ff;border-radius:100%;transform:scale(.75);transform-origin:50% 50%;opacity:.3;animation:antSpinMove 1s infinite linear alternate}.dot i:nth-child(1){top:0;left:0}.dot i:nth-child(2){top:0;right:0;-webkit-animation-delay:.4s;animation-delay:.4s}.dot i:nth-child(3){right:0;bottom:0;-webkit-animation-delay:.8s;animation-delay:.8s}.dot i:nth-child(4){bottom:0;left:0;-webkit-animation-delay:1.2s;animation-delay:1.2s}@keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@-webkit-keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@keyframes antSpinMove{to{opacity:1}}@-webkit-keyframes antSpinMove{to{opacity:1}}</style>
<script src="/jquery.min.js"></script>
<!-- <script src="https://files.worldwind.arc.nasa.gov/artifactory/web/0.9.0/worldwind.min.js"></script> -->

View File

@ -23,7 +23,7 @@ export default {
menu: {
locale: true
},
title: '基于大数据的智能化后装保障链仿真分析方法工具',
title: '中印边境自卫作战联合反击后装保障效能全业务全链路仿真系统',
pwa: false,
iconfontUrl: '',
production: process.env.NODE_ENV === 'production' && process.env.VUE_APP_PREVIEW !== 'true'

View File

@ -18,7 +18,7 @@ export const constantRouterMap = [
path: '/',
name: 'index',
component: RouteView,
meta: { title: '基于大数据的智能化后装保障链仿真分析方法工具' },
meta: { title: '中印边境自卫作战联合反击后装保障效能全业务全链路仿真系统' },
redirect: '/user/welcome',
},
{

View File

@ -58,12 +58,12 @@
</div>
</ModuleWrapper>
<ModuleWrapper height="55%" title="保障需求清单">
<!-- <template #title>
&lt;!&ndash; <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> -->
</template> &ndash;&gt;
<div class="normal" style="padding: 5px; overflow-y: auto">
<a-table
class="simulation-table-plain"
@ -292,6 +292,51 @@ export default {
})
},
methods: {
handleChange(value, key, column) {
const newData = [...this.data];
const target = newData.find(item => key === item.key);
if (target) {
target[column] = value;
this.data = newData;
}
},
edit(key) {
const newData = [...this.data];
const target = newData.find(item => key === item.key);
if (target) {
target.editable = true;
this.data = newData;
}
},
save(key) {
const newData = [...this.data];
const target = newData.find(item => key === item.key);
if (target) {
delete target.editable;
this.data = newData;
}
},
cancel(key) {
const newData = [...this.data];
const target = newData.find(item => key === item.key);
if (target) {
Object.assign(target, this.cacheData.find(item => key === item.key));
delete target.editable;
this.data = newData;
}
},
handleDelete(key) {
this.data = this.data.filter(item => item.key !== key);
},
handleAdd() {
this.data.push({
key: Date.now(),
name: '',
age: null,
address: '',
editable: true
});
},
getTree(target, treeData, showKeys) {
treeData.forEach((item) => {
const newChildren = []

View File

@ -56,7 +56,45 @@
</a-tree>
</div>
</ModuleWrapper>
<ModuleWrapper height="55%" title="保障需求清单">
<ModuleWrapper title="天气预设" height="25%">
<div>
<a-button type="primary" @click="handleAdd" icon="plus">新增</a-button>
<a-table
:columns="columns"
:dataSource="data"
:pagination="false"
bordered
rowKey="key"
>
<template v-for="col in ['name', 'age', 'address']" :slot="col" slot-scope="text, record">
<div :key="col">
<a-input
v-if="record.editable"
:value="text"
@change="e => handleChange(e.target.value, record.key, col)"
/>
<template v-else>{{ text }}</template>
</div>
</template>
<template slot="operation" slot-scope="text, record">
<template v-if="record.editable">
<a @click="save(record.key)">保存</a>
<a-divider type="vertical" />
<a @click="cancel(record.key)">取消</a>
</template>
<template v-else>
<a @click="edit(record.key)">编辑</a>
<a-divider type="vertical" />
<a-popconfirm title="确认删除?" @confirm="() => handleDelete(record.key)">
<a>删除</a>
</a-popconfirm>
</template>
</template>
</a-table>
</div>
</ModuleWrapper>
<ModuleWrapper height="30%" title="保障需求清单">
<div class="normal" style="padding: 5px; overflow-y: auto">
<a-table
class="simulation-table-plain"
@ -144,6 +182,18 @@ export default {
return {
initial: false,
ws: null,
data: [],
columns: [
{ dataIndex: 'serial' },
{ title: '天气类型', dataIndex: 'weatherType' },
{ title: '持续开始时间', dataIndex: 'lastBegTime' },
{ title: '持续结束时间', dataIndex: 'lastEndTime' },
{
title: '操作',
dataIndex: 'operation',
scopedSlots: { customRender: 'operation' }
}
],
roomInfo: {
mag: '',
status: '',
@ -261,6 +311,7 @@ export default {
this.scenarioId = this.$route.params.scenarioId
this.scenarioName = this.$route.params.scenarioName
this.getBlbzTreeData()
this.getWeathers()
window.addEventListener('beforeunload', (e) => {
this.childWindow && this.childWindow.close()
return true // returnValue
@ -276,6 +327,60 @@ export default {
})
},
methods: {
getWeathers(){
this.$http({
url: `/baseData/weatherResource/list`,
method: 'get',
params: { scenarioId: this.scenarioId},
}).then(res => {
this.data = res.data
})
},
handleChange(value, key, column) {
const newData = [...this.data];
const target = newData.find(item => key === item.key);
if (target) {
target[column] = value;
this.data = newData;
}
},
edit(key) {
const newData = [...this.data];
const target = newData.find(item => key === item.key);
if (target) {
target.editable = true;
this.data = newData;
}
},
save(key) {
const newData = [...this.data];
const target = newData.find(item => key === item.key);
if (target) {
delete target.editable;
this.data = newData;
}
},
cancel(key) {
const newData = [...this.data];
const target = newData.find(item => key === item.key);
if (target) {
// Object.assign(target, this.newData.find(item => key === item.key));
delete target.editable;
this.data = newData;
}
},
handleDelete(key) {
this.data = this.data.filter(item => item.key !== key);
},
handleAdd() {
this.data.push({
key: Date.now(),
name: '',
age: null,
address: '',
editable: true
});
},
getTree(target, treeData, showKeys) {
treeData.forEach((item) => {
const newChildren = []

View File

@ -131,7 +131,45 @@
</a-tree>
</div>
</ModuleWrapper>
<ModuleWrapper height="55%">
<ModuleWrapper title="天气预设" height="25%">
<div>
<a-button type="primary" @click="handleAdd" icon="plus">新增</a-button>
<a-table
:columns="columns"
:dataSource="this.weatherData"
:pagination="false"
bordered
rowKey="key"
>
<!-- <template v-for="col in columns" :slot="col" slot-scope="text, record">-->
<!-- <div :key="col">-->
<!-- <a-input-->
<!-- v-if="record.editable"-->
<!-- :value="text"-->
<!-- @change="e => handleChange(e.target.value, record.key, col)"-->
<!-- />-->
<!-- <template v-else>{{ text }}</template>-->
<!-- </div>-->
<!-- </template>-->
<!-- <template slot="operation" slot-scope="text, record">-->
<!-- <template v-if="record.editable">-->
<!-- <a @click="save(record.key)">保存</a>-->
<!-- <a-divider type="vertical" />-->
<!-- <a @click="cancel(record.key)">取消</a>-->
<!-- </template>-->
<!-- <template v-else>-->
<!-- <a @click="edit(record.key)">编辑</a>-->
<!-- <a-divider type="vertical" />-->
<!-- <a-popconfirm title="确认删除?" @confirm="() => handleDelete(record.key)">-->
<!-- <a>删除</a>-->
<!-- </a-popconfirm>-->
<!-- </template>-->
<!-- </template>-->
</a-table>
</div>
</ModuleWrapper>
<ModuleWrapper height="30%">
<template #title>
<a-radio-group v-model="fd.type" button-style="solid" @change="getFdListData">
<a-radio-button :value="5">作战分队</a-radio-button>
@ -235,7 +273,6 @@ import Zoom from './components/Zoom.vue'
import BlbzModal from './components/BlbzModal.vue'
import Jcsx from './components/Jcsx.vue'
import Zzxd from './components/Zzxd.vue'
export default {
name: 'SubsystemScenePresetting',
components: {
@ -250,6 +287,20 @@ export default {
scenarioName: '',
cesium: null,
scenarioDetail: null,
weatherData:[
{ key: '1', weatherType: '张三', lastBegTime: 32, editable: false },
{ key: '2', weatherType: '李四', lastBegTime: 42, editable: false }
],
columns: [
{ title: '天气类型', dataIndex: 'weatherType',key: 'weatherType' },
{ title: '持续开始时间', dataIndex: 'lastBegTime',key: 'lastBegTime' },
{ title: '持续结束时间', dataIndex: 'lastEndTime',key: 'lastEndTime' },
{
title: '操作',
dataIndex: 'operation',
scopedSlots: { customRender: 'operation' }
}
],
zzbzll: {
loading: false,
treeData: [],
@ -374,7 +425,9 @@ export default {
},
created() {
this.scenarioId = this.$route.params.scenarioId
console.log("============="+this.$route.params.scenarioId)
this.scenarioName = this.$route.params.scenarioName
this.getWeathers()
window.addEventListener('beforeunload', (e) => {
this.childWindow && this.childWindow.close()
return true // returnValue
@ -387,6 +440,61 @@ export default {
this.getFdListData()
},
methods: {
getWeathers(){
this.$http({
url: `/baseData/weatherResource/list`,
method: 'get',
params: { scenarioId: this.scenarioId},
}).then(res => {
this.weatherData = res.data
console.log("================="+JSON.stringify(this.weatherData))
})
},
handleChange(value, key, column) {
const newData = [...this.data];
const target = newData.find(item => key === item.key);
if (target) {
target[column] = value;
this.data = newData;
}
},
edit(key) {
const newData = [...this.data];
const target = newData.find(item => key === item.key);
if (target) {
target.editable = true;
this.data = newData;
}
},
save(key) {
const newData = [...this.data];
const target = newData.find(item => key === item.key);
if (target) {
delete target.editable;
this.data = newData;
}
},
cancel(key) {
const newData = [...this.data];
const target = newData.find(item => key === item.key);
if (target) {
// Object.assign(target, this.newData.find(item => key === item.key));
delete target.editable;
this.data = newData;
}
},
handleDelete(key) {
this.data = this.data.filter(item => item.key !== key);
},
handleAdd() {
this.data.push({
key: Date.now(),
name: '',
age: null,
address: '',
editable: true
});
},
getTree(target, treeData, showKeys) {
treeData.forEach((item) => {
const newChildren = []

View File

@ -1,6 +1,6 @@
<template>
<Flex class="user-login-page" fd="co" ai="c" jc="c" style="height: 100%">
<div class="user-login-title">基于大数据的智能化后装保障链仿真分析方法工具</div>
<div class="user-login-title">中印边境自卫作战联合反击后装保障效能全业务全链路仿真系统</div>
<Grid style="width: 917px; height: 445px" :columns="['524px', '329px', '0px']" gap="32px">
<div class="oh" style="grid-area: 1 / 1 / 2 / 4">
<img class="user-login-bg" :src="bgLogin" alt="" />