Browse Source

Merge branch 'ctw' of http://124.70.32.114:3100/woka/cesium-map-object into mh

# Conflicts:
#	ruoyi-ui/src/views/childRoom/RightPanel.vue
#	ruoyi-ui/src/views/childRoom/index.vue
master
menghao 2 months ago
parent
commit
a520050992
  1. 2
      ruoyi-admin/src/main/resources/application-druid.yml
  2. 41
      ruoyi-ui/src/views/childRoom/RightPanel.vue
  3. 53
      ruoyi-ui/src/views/childRoom/index.vue
  4. 253
      ruoyi-ui/src/views/dialogs/RouteEditDialog.vue
  5. 92
      ruoyi-ui/src/views/dialogs/WaypointEditDialog.vue
  6. 4
      ruoyi-ui/src/views/login.vue
  7. 2
      ruoyi-ui/src/views/selectRoom/index.vue
  8. 2
      ruoyi-ui/vue.config.js

2
ruoyi-admin/src/main/resources/application-druid.yml

@ -8,7 +8,7 @@ spring:
master:
url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 123456
password: A20040303ctw!
# 从库数据源
slave:
# 从数据源开关/默认关闭

41
ruoyi-ui/src/views/childRoom/RightPanel.vue

@ -18,16 +18,16 @@
<!-- 方案内容 -->
<div v-if="activeTab === 'plan'" class="tab-content plan-content">
<div class="section">
<div class="section-title">
<span>航线列表</span>
<div class="section-header">
<div class="section-title">航线列表</div>
<el-button
type="text"
icon="el-icon-plus"
size="mini"
icon="el-icon-circle-plus-outline"
class="header-action-btn"
@click="handleCreateRoute"
class="create-route-btn"
>
新建航线
新建
</el-button>
</div>
@ -66,7 +66,6 @@
v-for="point in selectedRouteDetails.waypoints"
:key="point.name"
class="waypoint-item"
@click="handleOpenWaypointDialog(point)"
>
<i class="el-icon-location"></i>
<div class="waypoint-info">
@ -272,6 +271,11 @@ export default {
this.$emit('select-route', route)
},
// 线
handleCreateRoute() {
this.$emit('create-route')
},
handleOpenRouteDialog(route) {
this.$emit('open-route-dialog', route)
},
@ -377,13 +381,31 @@ export default {
margin-bottom: 20px;
}
/* 新增:标题栏容器样式 */
.section-header {
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 2px solid rgba(0, 138, 255, 0.2);
margin-bottom: 10px;
padding-bottom: 8px;
}
/* 修改:移除了原有的 border-bottom,改在 section-header 中统一定义 */
.section-title {
font-size: 14px;
font-weight: 600;
color: #008aff;
margin-bottom: 10px;
padding-bottom: 8px;
border-bottom: 2px solid rgba(0, 138, 255, 0.2);
}
/* 新增:头部按钮样式 */
.header-action-btn {
padding: 0;
color: #008aff;
}
.header-action-btn:hover {
color: #0066cc;
}
.route-list {
@ -464,7 +486,6 @@ export default {
padding: 10px;
background: rgba(255, 255, 255, 0.8);
border-radius: 6px;
cursor: pointer;
transition: all 0.3s;
border: 1px solid rgba(0, 138, 255, 0.1);
}

53
ruoyi-ui/src/views/childRoom/index.vue

@ -11,7 +11,6 @@
<p class="text-sm mt-1">支持标绘/航线/空域/实时态势</p>
</div>
<!-- 地图中间的浮动红点触发左侧菜单 -->
<div
class="floating-red-dot left-red-dot"
:class="{ hidden: !isMenuHidden }"
@ -94,6 +93,7 @@
:ground-platforms="groundPlatforms"
@hide="hideRightPanel"
@select-route="selectRoute"
@create-route="createRoute"
@open-route-dialog="openRouteDialog"
@open-waypoint-dialog="openWaypointDialog"
@add-waypoint="addWaypoint"
@ -365,9 +365,25 @@ export default {
this.selectedRoute = route;
this.showRouteDialog = true;
},
// 线
updateRoute(updatedRoute) {
//
this.$message.success('航线更新成功');
const index = this.routes.findIndex(r => r.id === updatedRoute.id);
if (index !== -1) {
// 使 splice
const newRouteData = { ...this.routes[index], ...updatedRoute };
this.routes.splice(index, 1, newRouteData);
// 线
if (this.selectedRouteDetails && this.selectedRouteId === updatedRoute.id) {
this.selectedRouteDetails.name = updatedRoute.name;
}
this.$message.success('航线名称更新成功');
}
},
// 线
createRoute() {
this.$message.info('新建航线功能开发中...');
},
//
openWaypointDialog(waypoint) {
@ -375,8 +391,32 @@ export default {
this.showWaypointDialog = true;
},
updateWaypoint(updatedWaypoint) {
//
this.$message.success('航点更新成功');
// 1. 线
if (this.selectedRouteDetails && this.selectedRouteDetails.waypoints) {
// 2.
const index = this.selectedRouteDetails.waypoints.indexOf(this.selectedWaypoint);
if (index !== -1) {
// 3. 使 splice
this.selectedRouteDetails.waypoints.splice(index, 1, updatedWaypoint);
// 4. 便
this.selectedWaypoint = updatedWaypoint;
this.$message.success('航点更新成功');
} else {
// indexOf
const nameIndex = this.selectedRouteDetails.waypoints.findIndex(p => p.name === this.selectedWaypoint.name);
if (nameIndex !== -1) {
this.selectedRouteDetails.waypoints.splice(nameIndex, 1, updatedWaypoint);
this.selectedWaypoint = updatedWaypoint;
this.$message.success('航点更新成功');
} else {
this.$message.error('更新失败:未找到对应航点');
}
}
}
},
updateTime() {
const now = new Date();
@ -734,8 +774,7 @@ export default {
{ name: 'WP4', altitude: 5800, speed: '830km/h', eta: 'K+01:25:00' },
]
};
// 线
this.openRouteDialog(route);
// this.openRouteDialog(route);
},
addWaypoint() {

253
ruoyi-ui/src/views/dialogs/RouteEditDialog.vue

@ -1,66 +1,30 @@
<template>
<div v-if="value" class="route-edit-dialog">
<!-- 遮罩层 -->
<div class="dialog-overlay" @click="closeDialog"></div>
<!-- 弹窗内容 -->
<div class="dialog-content">
<div class="dialog-header">
<h3>航线编辑</h3>
<div class="close-btn" @click="closeDialog">×</div>
</div>
<div class="dialog-body">
<el-form :model="formData" :rules="rules" ref="formRef" label-width="80px" size="small">
<!-- 基本信息 -->
<el-form-item label="名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入航线名称"></el-input>
</el-form-item>
<el-form-item label="航向" prop="heading">
<el-input-number
v-model="formData.heading"
:min="0"
:max="360"
placeholder="请输入航向"
style="width: 100%;"
suffix="°"
></el-input-number>
</el-form-item>
<el-form-item label="时间" prop="time">
<el-input v-model="formData.time" placeholder="请输入时间(如:K+00:40:00)"></el-input>
</el-form-item>
<el-form-item label="速度" prop="speed">
<el-input v-model="formData.speed" placeholder="请输入速度" suffix="km/h"></el-input>
</el-form-item>
<el-form-item label="距离" prop="distance">
<el-input-number
v-model="formData.distance"
:min="0"
:precision="2"
placeholder="请输入距离"
style="width: 100%;"
suffix="km"
></el-input-number>
</el-form-item>
</el-form>
</div>
<div class="dialog-footer">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="saveRoute">保存</el-button>
</div>
</div>
</div>
<el-dialog
title="编辑航线"
:visible.sync="visible"
width="300px"
:close-on-click-modal="false"
append-to-body
custom-class="blue-dialog"
>
<el-form :model="form" label-width="70px" size="small" @submit.native.prevent>
<el-form-item label="航线名称">
<el-input v-model="form.name" placeholder="请输入航线名称"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button size="mini" @click="visible = false"> </el-button>
<el-button type="primary" size="mini" class="blue-btn" @click="handleSave"> </el-button>
</span>
</el-dialog>
</template>
<script>
export default {
name: 'RouteEditDialog',
props: {
// v-model="showRouteDialog"
value: {
type: Boolean,
default: false
@ -72,158 +36,55 @@ export default {
},
data() {
return {
formData: {
name: '',
heading: 0,
time: '',
speed: '',
distance: 0
form: {
id: '',
name: ''
}
}
},
computed: {
visible: {
get() {
return this.value
},
rules: {
name: [
{ required: true, message: '请输入航线名称', trigger: 'blur' }
],
heading: [
{ type: 'number', message: '航向必须为数字', trigger: 'blur' },
{ min: 0, max: 360, message: '航向必须在0-360度之间', trigger: 'blur' }
],
time: [
{ required: true, message: '请输入时间', trigger: 'blur' }
],
speed: [
{ required: true, message: '请输入速度', trigger: 'blur' },
{ type: 'number', message: '速度必须为数字', trigger: 'blur' }
],
distance: [
{ type: 'number', message: '距离必须为数字', trigger: 'blur' }
]
set(val) {
this.$emit('input', val)
}
};
}
},
watch: {
value(newVal) {
if (newVal && this.route) {
this.initFormData();
}
},
route(newVal) {
if (this.value && newVal) {
this.initFormData();
}
// route form
route: {
handler(val) {
if (val) {
//
this.form = {
id: val.id,
name: val.name
}
}
},
immediate: true,
deep: true
}
},
methods: {
initFormData() {
// 线使使
this.formData = {
name: this.route.name || '',
heading: this.route.heading || 0,
time: this.route.time || '',
speed: this.route.speed || '',
distance: this.route.distance || 0
};
},
closeDialog() {
this.$emit('input', false);
},
saveRoute() {
this.$refs.formRef.validate((valid) => {
if (valid) {
//
this.$emit('save', {
...this.route,
...this.formData
});
this.closeDialog();
}
});
handleSave() {
// form name
this.$emit('save', this.form)
this.visible = false
}
}
};
}
</script>
<style scoped>
.route-edit-dialog {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 1000;
display: flex;
align-items: center;
justify-content: center;
}
.dialog-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
backdrop-filter: blur(2px);
}
.dialog-content {
position: relative;
background: white;
border-radius: 8px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
width: 90%;
max-width: 500px;
max-height: 90vh;
overflow-y: auto;
animation: dialog-fade-in 0.3s ease;
}
@keyframes dialog-fade-in {
from {
opacity: 0;
transform: translateY(-20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.dialog-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 16px 20px;
border-bottom: 1px solid #e8e8e8;
}
.dialog-header h3 {
margin: 0;
font-size: 16px;
font-weight: 600;
color: #333;
}
.close-btn {
font-size: 20px;
color: #999;
cursor: pointer;
transition: color 0.3s;
.blue-btn {
background: #008aff;
border-color: #008aff;
}
.close-btn:hover {
color: #666;
}
.dialog-body {
padding: 20px;
}
.dialog-footer {
display: flex;
align-items: center;
justify-content: flex-end;
padding: 16px 20px;
border-top: 1px solid #e8e8e8;
gap: 10px;
.blue-btn:hover {
background: #0066cc;
border-color: #0066cc;
}
</style>

92
ruoyi-ui/src/views/dialogs/WaypointEditDialog.vue

@ -1,9 +1,7 @@
<template>
<div v-if="value" class="waypoint-edit-dialog">
<!-- 遮罩层 -->
<div class="dialog-overlay" @click="closeDialog"></div>
<!-- 弹窗内容 -->
<div class="dialog-content">
<div class="dialog-header">
<h3>航点编辑</h3>
@ -11,8 +9,7 @@
</div>
<div class="dialog-body">
<el-form :model="formData" :rules="rules" ref="formRef" label-width="80px" size="small">
<!-- 基本信息 -->
<el-form :model="formData" :rules="rules" ref="formRef" label-width="100px" size="small">
<el-form-item label="名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入航点名称"></el-input>
</el-form-item>
@ -21,29 +18,41 @@
<el-input-number
v-model="formData.altitude"
:min="0"
controls-position="right"
placeholder="请输入高度"
style="width: 100%;"
suffix="m"
></el-input-number>
</el-form-item>
<el-form-item label="速度" prop="speed">
<el-input v-model="formData.speed" placeholder="请输入速度" suffix="km/h"></el-input>
</el-form-item>
<el-form-item label="时间" prop="eta">
<el-input v-model="formData.eta" placeholder="请输入到达时间(如:K+00:40:00)"></el-input>
<el-input-number
v-model="formData.speed"
:min="0"
controls-position="right"
placeholder="请输入速度"
style="width: 100%;"
></el-input-number>
</el-form-item>
<el-form-item label="转弯半径" prop="turnRadius">
<el-form-item label="转弯坡度" prop="turnBank">
<el-input-number
v-model="formData.turnRadius"
:min="0"
placeholder="请输入转弯半径"
v-model="formData.turnBank"
controls-position="right"
placeholder="请输入转弯坡度"
style="width: 100%;"
suffix="m"
></el-input-number>
</el-form-item>
<el-form-item label="起始时间" prop="startTime">
<el-time-picker
v-model="formData.startTime"
placeholder="请选择起始时间"
value-format="HH:mm:ss"
style="width: 100%;"
>
</el-time-picker>
</el-form-item>
</el-form>
</div>
@ -69,31 +78,43 @@ export default {
}
},
data() {
// 0
const validateNumber = (rule, value, callback) => {
// value undefined, null
// !value !0 true
if (value === undefined || value === null || value === '') {
callback(new Error(rule.message));
} else {
callback();
}
};
return {
formData: {
name: '',
altitude: 0,
speed: '',
eta: '',
turnRadius: 0
speed: 0,
turnBank: 0,
startTime: ''
},
rules: {
name: [
{ required: true, message: '请输入航点名称', trigger: 'blur' }
],
altitude: [
{ required: true, message: '请输入高度', trigger: 'blur' },
{ type: 'number', message: '高度必须为数字', trigger: 'blur' }
// 使 validator type: 'number' 0
{ required: true, validator: validateNumber, message: '请输入有效高度', trigger: ['blur', 'change'] }
],
speed: [
{ required: true, message: '请输入速度', trigger: 'blur' },
{ type: 'number', message: '速度必须为数字', trigger: 'blur' }
// 使 validator 0
{ required: true, validator: validateNumber, message: '请输入有效速度', trigger: ['blur', 'change'] }
],
eta: [
{ required: true, message: '请输入到达时间', trigger: 'blur' }
turnBank: [
//
{ required: true, validator: validateNumber, message: '请输入有效转弯坡度', trigger: ['blur', 'change'] }
],
turnRadius: [
{ type: 'number', message: '转弯半径必须为数字', trigger: 'blur' }
startTime: [
{ required: true, message: '请选择起始时间', trigger: 'change' }
]
}
};
@ -112,14 +133,22 @@ export default {
},
methods: {
initFormData() {
// 使使
// Number
this.formData = {
name: this.waypoint.name || '',
altitude: this.waypoint.altitude || 0,
speed: this.waypoint.speed || '',
eta: this.waypoint.eta || '',
turnRadius: this.waypoint.turnRadius || 0
//
altitude: this.waypoint.altitude !== undefined && this.waypoint.altitude !== null ? Number(this.waypoint.altitude) : 0,
speed: this.waypoint.speed !== undefined && this.waypoint.speed !== null ? Number(this.waypoint.speed) : 0,
turnBank: this.waypoint.turnBank !== undefined && this.waypoint.turnBank !== null ? Number(this.waypoint.turnBank) : 0,
startTime: this.waypoint.startTime || ''
};
//
this.$nextTick(() => {
if (this.$refs.formRef) {
this.$refs.formRef.clearValidate();
}
});
},
closeDialog() {
this.$emit('input', false);
@ -127,7 +156,6 @@ export default {
saveWaypoint() {
this.$refs.formRef.validate((valid) => {
if (valid) {
//
this.$emit('save', {
...this.waypoint,
...this.formData

4
ruoyi-ui/src/views/login.vue

@ -8,7 +8,7 @@
<div class="logo-box">
<i class="el-icon-location logo-icon"></i>
</div>
<h1 class="system-title">多人联网演示系统</h1>
<h1 class="system-title">网络化任务规划系统</h1>
</div>
<!-- 登录卡片 -->
@ -174,7 +174,7 @@
<!-- 底部版权/提示 -->
<div class="copyright">
<p>© 2026 多人联网演示系统 | 支持Windows/国产化系统互通</p>
<p>© 2026 网络化任务规划系统 | 支持Windows/国产化系统互通</p>
</div>
</div>
</div>

2
ruoyi-ui/src/views/selectRoom/index.vue

@ -99,7 +99,7 @@
</div>
<div class="footer-info">
<p>© 2026 多人联网演示系统 | 支持Windows/国产化系统互通</p>
<p>© 2026 网络化任务规划系统 | 支持Windows/国产化系统互通</p>
</div>
</div>

2
ruoyi-ui/vue.config.js

@ -10,7 +10,7 @@ const CompressionPlugin = require('compression-webpack-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const name = process.env.VUE_APP_TITLE || '若依管理系统' // 网页标题
const baseUrl = 'http://127.0.0.1:8080' // 后端接口
const baseUrl = 'http://192.168.50.30:8080' // 后端接口
const port = process.env.port || process.env.npm_config_port || 80 // 端口
// 定义 Cesium 源码路径

Loading…
Cancel
Save