无人机管理后台前端(已迁走)
chenyao
2025-07-21 33cfed5a732ae6eb75ec82eb163557e112beb44a
Merge branch 'dev' of http://139.196.74.78:10010/r/drone/drone-web-manage into dev
6 files modified
2 files added
162 ■■■■■ changed files
src/assets/images/dataCenter/positionicon.png patch | view | raw | blame | history
src/assets/images/dataCenter/videoplay.png patch | view | raw | blame | history
src/page/index/top/index.vue 2 ●●●●● patch | view | raw | blame | history
src/store/modules/user.js 20 ●●●●● patch | view | raw | blame | history
src/views/dataCenter/components/searchData.vue 7 ●●●● patch | view | raw | blame | history
src/views/dataCenter/dataCenter.vue 73 ●●●●● patch | view | raw | blame | history
src/views/wel/components/backlog.vue 55 ●●●●● patch | view | raw | blame | history
src/views/wel/components/flightStatistics.vue 5 ●●●●● patch | view | raw | blame | history
src/assets/images/dataCenter/positionicon.png
src/assets/images/dataCenter/videoplay.png
src/page/index/top/index.vue
@@ -103,10 +103,8 @@
      }).then(() => {
        this.$store.dispatch('LogOut').then(() => {
        const env = import.meta.env.VITE_APP_ENV
          console.log(env);
          const adminUrl = import.meta.env.VITE_APP_DASHBOARD_URL
           env === 'development' ? this.$router.push({ path: '/login' }):window.location.replace(`${adminUrl}#/login`)
        })
      })
    },
src/store/modules/user.js
@@ -27,6 +27,7 @@
import { encrypt } from '@/utils/sm2';
import md5 from 'js-md5';
const user = {
  state: {
    tenantId: getStore({ name: 'tenantId' }) || '',
@@ -269,16 +270,31 @@
      });
    },
    GetMenu({ commit, dispatch }, tenantId) {
      const errLogOut = () => {
        dispatch('LogOut').then(()=>{
          const env = import.meta.env.VITE_APP_ENV
          const adminUrl = import.meta.env.VITE_APP_DASHBOARD_URL
          env === 'development'
            ? window.location.href = "/manage/login"
            : window.location.replace(`${adminUrl}#/login`)
        })
      }
      return new Promise(resolve => {
        getRoutes(tenantId).then(res => {
          const data = res.data.data;
          let menu = deepClone(data);
          menu?.forEach(ele => formatPath(ele, true));
          if (!res.data?.data?.length){
            errLogOut()
            return
          }
          menu.forEach(ele => formatPath(ele, true));
          commit('SET_MENU', menu);
          commit('SET_MENU_ALL', menu);
          dispatch('GetButtons');
          resolve(menu);
        });
        }).catch(err =>{
          errLogOut()
        })
      });
    },
    GetButtons({ commit }) {
src/views/dataCenter/components/searchData.vue
@@ -79,6 +79,7 @@
            v-model="searchForm.photoType"
            placeholder="请选择"
            clearable
            @clear="changePhotoType"
          >
            <el-option
              v-for="item in CategoryOption"
@@ -193,7 +194,11 @@
  },
  { deep: true }
);
const changePhotoType =(val)=>{
if(val === undefined){
  searchForm.photoType = ''
}
}
// 部门
let deptTreeData = ref([]);
// 机巢
src/views/dataCenter/dataCenter.vue
@@ -13,7 +13,6 @@
        <el-table
          v-loading="loadings"
          element-loading-text="加载中"
          stripe
          :data="tableData"
          class="custom-header"
          @selection-change="handleSelectionChange"
@@ -45,13 +44,21 @@
                :src="scope.row?.smallUrl"
                alt=""
              />
              <img
                v-else-if="scope.row?.resultType === 1"
                :src="convertVideoUrlToThumbnail(scope.row?.link)"
                alt=""
                class="imageBox"
                @click="enterFullScreen(scope.row)"
              />
              <!-- 视频 -->
              <div v-else-if="scope.row?.resultType === 1" class="videoItem1">
                <img
                  :src="convertVideoUrlToThumbnail(scope.row?.link)"
                  alt=""
                  class="imageBox"
                  @click="enterFullScreen(scope.row)"
                />
                <img
                  class="playBox"
                  @click="enterFullScreen(scope.row)"
                  src="@/assets/images/dataCenter/videoplay.png"
                  alt=""
                />
              </div>
              <!-- 正射 -->
              <el-image
                v-else-if="scope.row?.resultType === 4"
@@ -71,7 +78,7 @@
          </el-table-column>
          <el-table-column prop="jobTime" label="任务时间" />
          <el-table-column property="photoType" label="文件类别">
            <template #default="scope">
            <template #default="scope">
              <span>{{
                photoTypeMap[scope.row.photoType] ? photoTypeMap[scope.row.photoType] : '--'
              }}</span>
@@ -82,21 +89,24 @@
              <span>{{ resultTypeMap[row?.resultType] }}</span>
            </template>
          </el-table-column>
          <el-table-column label="操作" width="150" align="center">
          <el-table-column label="操作" width="200" align="center">
            <template #default="scope">
              <span class="look" @click="lookDetail(scope.row)">查看</span>
              <span
                class="delete"
                @click="deleteDetail(scope.row)"
                v-if="scope.row.resultType !== 2"
                >删除</span
              <el-button icon="el-icon-view" type="text" @click="lookDetail(scope.row)"
                >查看</el-button
              >
              <span
                class="location"
                @click="positionDetail(scope.row)"
              <el-button
                v-if="scope.row.resultType !== 2"
                icon="el-icon-delete"
                type="text"
                @click="deleteDetail(scope.row)"
                >删除</el-button
              >
              <el-button
                v-if="shouldShowLocation(scope.row)"
                >定位</span
                type="text"
                @click="positionDetail(scope.row)"
              >
                <img :src="positionicon" class="custom-icon" />定位</el-button
              >
            </template>
          </el-table-column>
@@ -258,6 +268,8 @@
</template>
<script setup>
import videoplay from '@/assets/images/dataCenter/videoplay.png';
import positionicon from '@/assets/images/dataCenter/positionicon.png';
import { useStore } from 'vuex';
import { PublicCesium } from '@/utils/cesium/publicCesium';
import { Cartesian3 } from 'cesium';
@@ -730,7 +742,12 @@
      cursor: pointer;
      margin-right: 10px;
    }
    .custom-icon {
      width: 14px;
      height: 14px;
      margin-right: 5px;
      vertical-align: middle;
    }
    .delete {
      color: #ff241c;
      margin-right: 10px;
@@ -756,7 +773,17 @@
    width: 76px;
    height: 72px;
  }
  .videoItem1 {
    .playBox {
      width: 20px;
      height: 20px;
      position: absolute;
      top: 46%;
      left: 43%;
      transform: translate(-50%, -50%);
      cursor: pointer;
    }
  }
  .videoDialog :deep(.el-dialog) {
    height: 600px;
    width: 54%;
src/views/wel/components/backlog.vue
@@ -9,13 +9,13 @@
            <div>
              {{ item.name }}
              <div class="dots">{{ item.number >= 100 ? '99+' : item.number }}</div>
              <!-- <div class="dots">99+</div> -->
            </div>
          </div>
        </div>
      </div>
      <div class="todo-items" v-if="todos.length > 0" v-loading="loading">
      <div class="todo-items" v-if="todos.length > 0" v-loading="loading" element-loading-background="rgba(255, 255, 255, 0.5)">
        <div v-for="(item, index) in todos" :key="index" class="todo-item" :style="getStatusStyle(item.status)"
          @click="jumporder(item)">
          <div class="status-indicator"><img :src="getStatus(item.status)" alt=""></div>
@@ -65,6 +65,10 @@
const store = useStore()
const permission = computed(() => store.getters.permission)
const checked = ref('事件工单')
const todosCache = reactive({
  '事件工单': [],
  '智飞工单': []
})
const titleList = ref([
  {
    label: 'event_order_count',
@@ -77,11 +81,11 @@
    number: 0,
  },
])
const titleClick = (item, index) => {
  checked.value = item.name
  getListMatter()
}
const titleClick = async (item, index) => {
  checked.value = item.name
  await getListMatter()
}
const userInfo = computed(() => store.getters.userInfo)
const todos = ref([])
const loading = ref(false)
@@ -203,24 +207,25 @@
  })
}
// 获取事件工单或者智飞工单的信息
const getListMatter = async () => {
  if (checked.value === '事件工单') {
    loading.value = true
    const type = 1
  loading.value = true
  const type = checked.value === '事件工单' ? 1 : 2
  // 使用缓存数据
  if (todosCache[checked.value].length > 0) {
    todos.value = todosCache[checked.value]
  }
  try {
    const res = await getOrderOrEventApi(type, userInfo.value.detail.areaCode)
    todos.value = res.data.data || []
    const data = res.data.data || []
    todos.value = data
    todosCache[checked.value] = data
  } finally {
    loading.value = false
      //  console.log('事件工单', todos.value);
  } else if (checked.value === '智飞工单') {
    loading.value = true
    const type = 2
    const res = await getOrderOrEventApi(type, userInfo.value.detail.areaCode)
    todos.value = res.data.data || []
    loading.value = false
      //  console.log('智飞工单', todos.value);
  }
}
onMounted(() => {
  getListMatter()
  getOrderCount()
@@ -313,12 +318,19 @@
    .todo-items {
      margin-top: 10px;
      // height: 250px;
  transition: opacity 0.3s ease;
      height: pxToVh(250);
      overflow-y: scroll;
       &:empty {
    display: none;
  }
    }
    .todo-item {
      transition:
    transform 0.2s ease,
    box-shadow 0.2s ease,
    opacity 0.3s ease;
      margin: 6px 0;
      display: flex;
      align-items: center;
@@ -415,5 +427,8 @@
    font-size: 14px;
    color: #7c8091;
  }
  .el-empty {
  transition: opacity 0.3s ease;
}
}
</style>
src/views/wel/components/flightStatistics.vue
@@ -89,8 +89,7 @@
const getFlyTimeList = () => {
  getFlyTime(params.value).then(res => {
    const resList = res?.data?.data || [];
    console.log('飞行',resList);
    lineCharts(resList);
  });
};
@@ -177,7 +176,7 @@
        },
      },
      axisLabel: {
        interval: 0,
        // interval: 0,
        color: '#383838',
      },
    },