From 85b9a8ff18d730693483e3cc76aa90f8c04ceac8 Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Wed, 11 Feb 2026 18:45:02 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 uniapps/work-wx/src/pages/equipmentManagement/index.vue                          |    6 
 applications/drone-command/src/assets/images/active-menu-item.png                |    0 
 uniapps/work-wx/src/static/images/lbt.png                                        |    0 
 applications/drone-command/src/page/index/top/index.vue                          |  340 ++++++++++++++++++++++++++++++++----------------
 uniapps/work-wx/src/static/images/user/password.png                              |    0 
 uniapps/work-wx/src/static/images/user/rightBtn.png                              |    0 
 uniapps/work-wx/src/static/images/lb_bottom.png                                  |    0 
 uniapps/work-wx/src/static/images/user/department.png                            |    0 
 applications/drone-command/src/assets/images/menu-item.png                       |    0 
 uniapps/work-wx/src/subPackages/flightApplication/index.vue                      |    9 +
 applications/drone-command/src/views/dataCockpit/index.vue                       |    2 
 applications/drone-command/src/components/map-container/device-map-container.vue |   19 +-
 uniapps/work-wx/src/static/images/logo1.png                                      |    0 
 uniapps/work-wx/src/static/images/user/info.png                                  |    0 
 uniapps/work-wx/src/pages/page/index.vue                                         |    4 
 15 files changed, 252 insertions(+), 128 deletions(-)

diff --git a/applications/drone-command/src/assets/images/active-menu-item.png b/applications/drone-command/src/assets/images/active-menu-item.png
new file mode 100644
index 0000000..39fd486
--- /dev/null
+++ b/applications/drone-command/src/assets/images/active-menu-item.png
Binary files differ
diff --git a/applications/drone-command/src/assets/images/menu-item.png b/applications/drone-command/src/assets/images/menu-item.png
new file mode 100644
index 0000000..3b24a46
--- /dev/null
+++ b/applications/drone-command/src/assets/images/menu-item.png
Binary files differ
diff --git a/applications/drone-command/src/components/map-container/device-map-container.vue b/applications/drone-command/src/components/map-container/device-map-container.vue
index cb4e5a2..5555f05 100644
--- a/applications/drone-command/src/components/map-container/device-map-container.vue
+++ b/applications/drone-command/src/components/map-container/device-map-container.vue
@@ -5,7 +5,7 @@
 			:show-admin-boundary="true" :zoom-to-boundary="true" :enable-stage-emit="true"
 			:cluster-height="CLUSTER_HEIGHT" :detail-height="DETAIL_HEIGHT" @ready="handleMapReady"
 			@stage-change="handleStageChange" />
-		<div v-if="props.showLayerControl" class="layer-control-root" :class="{ collapsed: props.leftCollapsed }">
+		<div v-if="props.showLayerControl" class="layer-control-root" :class="{ collapsed: props.rightCollapsed }">
 			<div class="layer-control-wrap" ref="layerWrapRef">
 				<div class="layer-control" @click="toggleLayerPanel">
 					<img :src="layerControlIcon" alt="图层控制" />
@@ -88,7 +88,7 @@
 		type: Array,
 		default: () => [],
 	},
-	leftCollapsed: {
+	rightCollapsed: {
 		type: Boolean,
 		default: false,
 	},
@@ -1290,7 +1290,7 @@
 )
 
 watch(
-	() => props.leftCollapsed,
+	() => props.rightCollapsed,
 	isCollapsed => {
 		if (isCollapsed) showLayerPanel.value = false
 	}
@@ -1415,14 +1415,14 @@
 
 .layer-control-root {
 	position: absolute;
-	left: 337px;
-	bottom: 22px;
-	z-index: 9;
+	right: 337px;
+	top: 95px;
+	z-index: 11;
 	transition: transform 0.3s ease-in-out;
 	pointer-events: none;
 
 	&.collapsed {
-		transform: translateX(-317px);
+		transform: translateX(317px);
 	}
 }
 
@@ -1449,12 +1449,13 @@
 	display: flex;
 	flex-direction: column;
 	position: absolute;
-	left: 66px;
-	bottom: 0;
+	right: 66px;
+	top: 0;
 	width: 160px;
 	max-height: 442px;
 	background: #191932;
 	border-radius: 8px 8px 8px 8px;
+	z-index: 99;
 
 	.panel-title {
 		padding: 0 16px;
diff --git a/applications/drone-command/src/page/index/top/index.vue b/applications/drone-command/src/page/index/top/index.vue
index e7f7b93..d090627 100644
--- a/applications/drone-command/src/page/index/top/index.vue
+++ b/applications/drone-command/src/page/index/top/index.vue
@@ -1,38 +1,49 @@
 <template>
-  <div class="avue-top">
-    <div class="top-bar__title">
-      <img :src="logoUrl" alt="">
-      <span>低空飞行监管子系统</span>
-    </div>
+  <header class="header-container">
+    <div class="content-wrap">
+      <div class="logo-title-wrap">
+        <img :src="logoUrl" alt="Logo"></img>
+        <p class="title">低空飞行监管子系统</p>
+      </div>
 
-    <div class="top-bar__right">
-      <div class="top-user">
-        <div class="icon-box">
-         <img class="gateway" @click="jumpMH" src="@/assets/images/mh.png" alt="进入门户" title="进入门户">
-        </div>
+      <div class="header-right">
+        <nav class="nav-menu">
+          <div v-for="(item, index) in topMenus" :key="index" class="nav-item"
+            :class="{ active: item.active }" @click="handleMenuClick(item)">
+            <span>{{ item.label }}</span>
+          </div>
+        </nav>
 
-        <el-dropdown popper-class="command-custom-dropdown">
-          <span class="el-dropdown-link">
-            <img class="top-bar__img" :src="userInfo.avatar" alt="" />
-          </span>
+        <div class="icon-group">
+          <div class="top-user">
+            <div class="icon-box">
+              <img class="gateway" @click="jumpMH" src="@/assets/images/mh.png" alt="进入门户" title="进入门户">
+            </div>
 
-          <template #dropdown>
-            <el-dropdown-menu>
-              <!--              <el-dropdown-item>
+            <el-dropdown popper-class="command-custom-dropdown">
+              <span class="el-dropdown-link">
+                <img class="top-bar__img" :src="userInfo.avatar" alt="" />
+              </span>
+
+              <template #dropdown>
+                <el-dropdown-menu>
+                  <!--              <el-dropdown-item>
                 <router-link to="/">{{ $t('navbar.dashboard') }}</router-link>
               </el-dropdown-item>-->
-              <!-- <el-dropdown-item>
+                  <!-- <el-dropdown-item>
                 <router-link to="/info/index">{{ $t('navbar.userinfo') }}</router-link>
               </el-dropdown-item> -->
-              <el-dropdown-item @click="logout" divided>{{ $t('navbar.logOut') }}
-              </el-dropdown-item>
-            </el-dropdown-menu>
-          </template>
-        </el-dropdown>
-        <top-setting></top-setting>
+                  <el-dropdown-item @click="logout" divided>{{ $t('navbar.logOut') }}
+                  </el-dropdown-item>
+                </el-dropdown-menu>
+              </template>
+            </el-dropdown>
+            <top-setting></top-setting>
+          </div>
+        </div>
       </div>
     </div>
-  </div>
+  </header>
 </template>
 
 <script>
@@ -69,6 +80,35 @@
   data () {
     return {
       logoUrl: logo,
+      activeMenu: 'drone-control',
+      topMenus: [
+        {
+          key: 'twin-supervision',
+          label: '孪生监管',
+          path: '/flight-supervision/#/brain',
+        },
+        {
+          key: 'airspace-collaboration',
+          label: '空域协同',
+          path: '/flight-supervision/#/space',
+        },
+        {
+          key: 'air-traffic',
+          label: '空中交通',
+          path: '/flight-supervision/#/activity',
+        },
+        {
+          key: 'information-service',
+          label: '信息服务',
+          path: '/flight-supervision/#/infoService',
+        },
+        {
+          key: 'drone-control',
+          label: '无人机管控',
+          path: '',
+          active: true,
+        },
+      ],
     }
   },
   filters: {},
@@ -93,115 +133,189 @@
         cancelButtonClass: 'command-message-box-cancel',
       }).then(() => {
         this.$store.dispatch('LogOut').then(() => {
-					const {VITE_APP_PARENT_SYSTEM,VITE_APP_ENV} = import.meta.env
-					const isDev = VITE_APP_ENV === 'development'
-					isDev
-						? this.$router.push({ path: '/login' })
-						: window.location.replace(`${VITE_APP_PARENT_SYSTEM}/#/login`)
+          const { VITE_APP_PARENT_SYSTEM, VITE_APP_ENV } = import.meta.env
+          const isDev = VITE_APP_ENV === 'development'
+          isDev
+            ? this.$router.push({ path: '/login' })
+            : window.location.replace(`${VITE_APP_PARENT_SYSTEM}/#/login`)
         })
       })
     },
     jumpMH () {
-
+      window.open(`${window.location.origin}/droneWeb/#/gateway`, '_blank')
+    },
+    handleMenuClick (item) {
+      this.activeMenu = item.key
+      if (!item.path) return
+      window.open(`${window.location.origin}${item.path}`, '_blank')
     },
   },
 }
 </script>
 
 <style lang="scss" scoped>
-.avue-top {
-  display: flex;
-  justify-content: space-between;
-  height: 100%;
+.header-container {
+  position: relative;
+  height: 110px;
   background: url('@/assets/images/topContainer/top-bg.png') center / 100% 100% no-repeat !important;
+  background-repeat: no-repeat;
+  background-size: cover;
   pointer-events: none;
-}
+  z-index: 2;
 
-.top-bar__left {
-  flex: 0 0 auto;
-}
-
-.top-bar__title {
-  margin-top: 16px;
-  margin-left: 30px;
-  flex: 1;
-  display: flex;
-  align-items: center;
-  height: pxToVh(48);
-
-  img {
-    margin-right: 17px;
-    width: 50px;
-    height: 50px;
+  .bg {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    pointer-events: none;
   }
 
-  span {
-    width: 353px;
-    height: 43px;
-    font-family: PangMen;
-    font-weight: 400;
-    font-size: 36px;
-    color: #FFFFFF;
-    letter-spacing: 3px;
-    text-shadow: 3px 3px 0px rgba(0, 13, 42, 0.27);
-    text-align: left;
-    font-style: normal;
-    text-transform: none;
-  }
-}
-
-.top-bar__right {
-  margin-right: 28px;
-  padding-top: 16px;
-  flex: 0 0 auto;
-  display: flex !important;
-  align-items: flex-start;
-  height: 100%;
-  pointer-events: auto;
-  box-sizing: border-box;
-
-  .icon-box {
-    margin-top: 6px;
-    margin-right: 30px;
+  .content-wrap {
+    position: absolute;
+    inset: 0;
     display: flex;
     align-items: center;
-    gap: 0 20px;
+    z-index: 1;
+    padding: 0 40px;
 
-    .gateway {
-      width: 21px;
-      height: 18px;
+    .logo-title-wrap {
+      display: flex;
+      align-items: center;
+      transform: translateY(-10px);
+
+      img {
+        width: 70px;
+        height: 63px;
+        vertical-align: middle;
+      }
+
+      .title {
+        margin-left: 16px;
+        margin-top: 0;
+        margin-bottom: 0;
+
+        width: 353px;
+        height: 43px;
+        font-family: PangMen;
+        font-weight: 400;
+        font-size: 36px;
+        color: #FFFFFF;
+        letter-spacing: 3px;
+        text-shadow: 3px 3px 0px rgba(0, 13, 42, 0.27);
+        text-align: left;
+        font-style: normal;
+        text-transform: none;
+      }
     }
 
-    >* {
-      cursor: pointer;
+    .header-right {
+      display: flex;
+      align-items: center;
+      margin-left: auto;
+      margin-top: -25px;
+      pointer-events: auto;
+
+      .nav-menu {
+        display: flex;
+        margin-right: 30px;
+        gap: 0px;
+
+        .nav-item {
+          width: 136px;
+          height: 34px;
+          box-sizing: border-box;
+          text-align: center;
+          color: #afafe0;
+          text-decoration: none;
+          font-size: 20px;
+          transition: color 0.3s;
+          padding: 0;
+          background: url('@/assets/images/menu-item.png') no-repeat center / 136px 34px;
+          cursor: pointer;
+          margin: 0 10px;
+
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          padding-bottom: 10px;
+          line-height: 1;
+
+          font-family: YouSheBiaoTiHei;
+
+          &:hover {
+            color: #fff;
+          }
+
+          &.active {
+            color: #fff;
+            background: url('@/assets/images/active-menu-item.png') no-repeat center / 136px 34px;
+
+            span {
+              background: linear-gradient(180deg,
+                  #fff 22.11%,
+                  #ffffff 86.69%);
+              background-size: contain;
+              background-clip: text;
+              -webkit-text-fill-color: transparent;
+              text-shadow: 0px 0px 13px 0px #5da6ef73;
+            }
+          }
+        }
+      }
+
+      .icon-group {
+        display: flex;
+        align-items: center;
+        margin-right: 20px;
+        gap: 15px;
+
+
+        .icon-box {
+          margin-top: 6px;
+          margin-right: 30px;
+          display: flex;
+          align-items: center;
+          gap: 0 20px;
+
+          .gateway {
+            width: 21px;
+            height: 18px;
+          }
+
+          >* {
+            cursor: pointer;
+          }
+        }
+      }
+
+      .top-bar__item {
+        margin-right: 15px;
+        display: inline-block !important;
+      }
+
+      .top-user {
+        display: flex;
+        align-items: center;
+      }
+
+      .top-bar__img {
+        margin-top: 5px;
+        width: 20px;
+        height: 20px;
+        border: 2px solid #383874;
+        border-radius: 50%;
+      }
+
+      .el-dropdown-link {
+        cursor: pointer;
+        color: #606266;
+      }
+
+      .el-dropdown-link:hover {
+        color: #409EFF;
+      }
     }
   }
-}
-
-.top-bar__item {
-  margin-right: 15px;
-  display: inline-block !important;
-}
-
-.top-user {
-  display: flex;
-  align-items: center;
-}
-
-.top-bar__img {
-  margin-top: 5px;
-  width: 20px;
-  height: 20px;
-  border: 2px solid #383874;
-  border-radius: 50%;
-}
-
-.el-dropdown-link {
-  cursor: pointer;
-  color: #606266;
-}
-
-.el-dropdown-link:hover {
-  color: #409EFF;
 }
 </style>
diff --git a/applications/drone-command/src/views/dataCockpit/index.vue b/applications/drone-command/src/views/dataCockpit/index.vue
index d9399c1..71073a9 100644
--- a/applications/drone-command/src/views/dataCockpit/index.vue
+++ b/applications/drone-command/src/views/dataCockpit/index.vue
@@ -11,7 +11,7 @@
 <template>
   <div class="page-container">
     <DeviceMapContainer ref="deviceMapRef" :all-devices="allDevices" :alarm-drones="realWarningData"
-      :left-collapsed="leftCollapsed" container-id="data-cockpit-map"
+      :right-collapsed="rightCollapsed" container-id="data-cockpit-map"
       @drone-signal="handleAlarmAction('signal', $event)" @drone-counter="handleAlarmAction('counter', $event)"
       @drone-favorite="handleAlarmFavorite" />
     <LeftContainer class="left-container" v-model:activeId="leftActiveId" v-model:collapsed="leftCollapsed"
diff --git a/uniapps/work-wx/src/pages/equipmentManagement/index.vue b/uniapps/work-wx/src/pages/equipmentManagement/index.vue
index 4c0b578..5e6e9df 100644
--- a/uniapps/work-wx/src/pages/equipmentManagement/index.vue
+++ b/uniapps/work-wx/src/pages/equipmentManagement/index.vue
@@ -4,7 +4,11 @@
     <view class="content">
       <view class="title">飞行设备</view>
       <u-list :style="{ height: 'calc(100vh - 160rpx)' }" @scrolltolower="scrolltolower" :lower-threshold="50">
-        <view class="card" v-for="(item, index) in equipmentList" :key="index" @click="handleClick(item)">
+        <u-empty v-if="equipmentList.length === 0"
+                 text="暂无数据"
+                 icon="http://cdn.uviewui.com/uview/empty/car.png">
+        </u-empty>
+        <view v-else class="card" v-for="(item, index) in equipmentList" :key="index" @click="handleClick(item)">
           <view class="left">
             <u-image :src="droneSvg" mode="aspectFill" :width="70" :height="90"></u-image>
           </view>
diff --git a/uniapps/work-wx/src/pages/page/index.vue b/uniapps/work-wx/src/pages/page/index.vue
index 64ec0ea..e6e31ca 100644
--- a/uniapps/work-wx/src/pages/page/index.vue
+++ b/uniapps/work-wx/src/pages/page/index.vue
@@ -147,8 +147,8 @@
 // 获取轮播图
   async function getLBListTest() {
     const res = await getLBList({})
-    console.log(res, '8898')
-    lbList.value = res.data.data.map(item => ({
+    // 排除annexUrl为空的项
+    lbList.value = res.data.data.filter(item => item.annexUrl).map(item => ({
       ...item,
       image: item.annexUrl,
       title: item.bannerTitle,
diff --git a/uniapps/work-wx/src/static/images/lb_bottom.png b/uniapps/work-wx/src/static/images/lb_bottom.png
new file mode 100644
index 0000000..8775fa3
--- /dev/null
+++ b/uniapps/work-wx/src/static/images/lb_bottom.png
Binary files differ
diff --git a/uniapps/work-wx/src/static/images/lbt.png b/uniapps/work-wx/src/static/images/lbt.png
new file mode 100644
index 0000000..eebf8d6
--- /dev/null
+++ b/uniapps/work-wx/src/static/images/lbt.png
Binary files differ
diff --git a/uniapps/work-wx/src/static/images/logo1.png b/uniapps/work-wx/src/static/images/logo1.png
new file mode 100644
index 0000000..fad3549
--- /dev/null
+++ b/uniapps/work-wx/src/static/images/logo1.png
Binary files differ
diff --git a/uniapps/work-wx/src/static/images/user/department.png b/uniapps/work-wx/src/static/images/user/department.png
new file mode 100644
index 0000000..8ea0456
--- /dev/null
+++ b/uniapps/work-wx/src/static/images/user/department.png
Binary files differ
diff --git a/uniapps/work-wx/src/static/images/user/info.png b/uniapps/work-wx/src/static/images/user/info.png
new file mode 100644
index 0000000..18ab1f7
--- /dev/null
+++ b/uniapps/work-wx/src/static/images/user/info.png
Binary files differ
diff --git a/uniapps/work-wx/src/static/images/user/password.png b/uniapps/work-wx/src/static/images/user/password.png
new file mode 100644
index 0000000..eb63256
--- /dev/null
+++ b/uniapps/work-wx/src/static/images/user/password.png
Binary files differ
diff --git a/uniapps/work-wx/src/static/images/user/rightBtn.png b/uniapps/work-wx/src/static/images/user/rightBtn.png
new file mode 100644
index 0000000..db90c73
--- /dev/null
+++ b/uniapps/work-wx/src/static/images/user/rightBtn.png
Binary files differ
diff --git a/uniapps/work-wx/src/subPackages/flightApplication/index.vue b/uniapps/work-wx/src/subPackages/flightApplication/index.vue
index 89584d5..d80c0be 100644
--- a/uniapps/work-wx/src/subPackages/flightApplication/index.vue
+++ b/uniapps/work-wx/src/subPackages/flightApplication/index.vue
@@ -18,8 +18,13 @@
             <view class="sp-title">
                 审批记录
             </view>
+
             <u-list :style="{ height: 'calc(100vh - 240rpx)' }" @scrolltolower="scrolltolower" :lower-threshold="50">
-                <view class="approvalRecord" v-for="(approvalRecord,approvalRecordIndex) in approvalRecords" :key="approvalRecordIndex" @click="handleClick(approvalRecord)">
+              <u-empty v-if="approvalRecords.length === 0"
+                       text="暂无数据"
+                       icon="http://cdn.uviewui.com/uview/empty/car.png">
+              </u-empty>
+                <view v-else class="approvalRecord" v-for="(approvalRecord,approvalRecordIndex) in approvalRecords" :key="approvalRecordIndex" @click="handleClick(approvalRecord)">
                     <view class="name-status">
                         <view class="name-image">
                             <u-image :src="spSvg" class="icon" width="16" height="16"></u-image>
@@ -297,7 +302,7 @@
             color: #FFFFFF;
             padding: 0 6rpx;
 
-            
+
         }
 
     }

--
Gitblit v1.9.3