无人机管理后台前端(已迁走)
chenyao
2025-08-28 e2314a9f039534b8aeae4b050a69425398bd542d
feat:更新设备管理和注册管理
2 files modified
524 ■■■■■ changed files
src/views/device/addDevice.vue 44 ●●●● patch | view | raw | blame | history
src/views/device/airport.vue 480 ●●●●● patch | view | raw | blame | history
src/views/device/addDevice.vue
@@ -81,7 +81,7 @@
                calcHeight: 20,
                column: [
                    {
                        label: '工作空间名称',
                        label: '设备名称',// '工作空间名称',
                        prop: 'workspace_name',
                        editDisabled: true,
                        searchLabelWidth: 130,
@@ -91,40 +91,24 @@
                        rules: [
                            {
                                required: true,
                                message: '请输入工作空间名称',
                                message: '请输入设备名称',
                                trigger: 'blur',
                            },
                        ],
                    },
                    {
                        label: '工作空间描述',
                        prop: 'workspace_desc',
                        labelWidth: 130,
                        // search: true,
                        searchSpan: 4,
                        // editDisabled: true,
                        rules: [
                            {
                                required: true,
                                message: '请输入工作空间描述',
                                trigger: 'blur',
                            },
                        ],
                    },
                    {
                        label: '平台名称',
                        label: '系统名称',// '平台名称',
                        prop: 'platform_name',
                        labelWidth: 130,
                        editDisabled: true,
                        rules: [
                            {
                                required: false,
                                message: '请输入平台名称',
                                message: '请输入系统名称',
                                trigger: 'blur',
                            },
                        ],
                    },
                    {
                        label: '所属单位',
                        prop: 'dept_id',
@@ -182,6 +166,22 @@
                        ],
                    },
                    {
                        label: '设备描述',// '工作空间描述',
                        prop: 'workspace_desc',
                        labelWidth: 130,
                        // search: true,
                        searchSpan: 4,
                        // editDisabled: true,
                        rules: [
                            {
                                required: true,
                                message: '请输入设备描述',
                                trigger: 'blur',
                            },
                        ],
                    },
                    {
                        label: '创建时间',
                        prop: 'create_time',
                        addDisplay: false,
@@ -193,7 +193,7 @@
                    },
                    {
                        label: '行政区划',
                        label: '设备位置',// '行政区划',
                        prop: 'area_code',
                        type: 'cascader',
                        labelWidth: 130,
@@ -212,7 +212,7 @@
                        rules: [
                        {
                            required: true,
                            message: '请选择行政区划',
                            message: '请选择设备位置',
                            trigger: 'change',
                        },
                        ],
src/views/device/airport.vue
@@ -51,27 +51,39 @@
        </span>
      </template>
      <template #menu="scope">
        <el-button type="primary" text icon="el-icon-paperclip" v-if="permission.oss_set"
          @click.stop="handleOpenOssSet(scope.row, scope.index)">存储配置
        </el-button>
        <el-button type="primary" text icon="el-icon-share" v-if="permission.per_share && scope.row.domain == 3"
          @click.stop="handleOpenDevicePerShare(scope.row, scope.index)">机场授权
        </el-button>
        <el-button type="primary" text icon="el-icon-position" :disabled="!scope.row.status"
          v-if="permission.rang_con && scope.row.domain == 3"
          @click.stop="handleOpenRemoteDebugging(scope.row, scope.index)">远程调试
        </el-button>
        <el-button type="primary" text icon="el-icon-setting" v-if="permission.fly_device_offline"
          @click.stop="handleDeviceOffline(scope.row)">设备下线
        </el-button>
         <div class="more-container">
            <el-button type="primary" text icon="el-icon-paperclip" v-if="permission.oss_set" @click.stop="moreClick(scope, permission, $event)">更 多</el-button>
        </div>
      </template>
      <!-- 添加行政区划显示模板 -->
      <template #area_code="{ row }">
        <span>{{ row.area_name }}</span>
      </template>
    </avue-crud>
    <div v-show="moreDialogVisible" class="show-more-do" :style="{ top: `${popupPosition.top}px`}">
      <el-button type="primary" text icon="el-icon-paperclip" v-if="permission.oss_set"
        @click.stop="handleOpenOssSet(moreDialogData.row, moreDialogData.index)">存储配置
      </el-button>
      <el-button type="primary" text icon="el-icon-share" v-if="morePermission.per_share && moreDialogData.row.domain == 3"
        @click.stop="handleOpenDevicePerShare(moreDialogData.row, moreDialogData.index)">机场授权
      </el-button>
      <el-button type="primary" text icon="el-icon-position" :disabled="!moreDialogData.row.status"
        v-if="morePermission.rang_con && moreDialogData.row.domain == 3"
        @click.stop="handleOpenRemoteDebugging(moreDialogData.row, moreDialogData.index)">远程调试
      </el-button>
      <!-- <el-button type="primary" text icon="el-icon-setting" v-if="morePermission.fly_device_offline"
        @click.stop="handleDeviceOffline(moreDialogData.row)">设备下线
      </el-button> -->
      <el-button type="primary" text icon="el-icon-setting" v-if="morePermission.fly_device_offline"
        @click.stop="rollFirmware(moreDialogData.row)">固件版本管理
      </el-button>
      <el-button type="primary" text icon="el-icon-setting" v-if="morePermission.fly_device_offline"
        @click.stop="handleDeviceOffline(moreDialogData.row)">注销
      </el-button>
    </div>
    <el-dialog title="固件升级" append-to-body v-model="firmwareBox" width="455px">
      <div>升级固件版本:{{ firmwareVersion }}</div>
@@ -164,6 +176,10 @@
  },
  data () {
    return {
      moreDialogVisible: false,
      popupPosition: { top: 0 }, // 弹出框位置
      moreDialogData: [],
      morePermission: {},
      bindOssId: null,
      deviceSn: '',
      ossSetBox: false,
@@ -207,6 +223,7 @@
        border: true,
        index: true,
        viewBtn: true,
        delBtn: false,
        selection: true,
        excelBtn: false,
        addBtn: false,
@@ -221,159 +238,82 @@
            label: '设备型号',
            prop: 'device_name',
            editDisabled: true,
            viewDisplay: true, //查看显示
            search: true,
            searchSpan: 4,
            labelWidth: 130,
            rules: [
              {
                required: true,
                message: '请输入设备型号',
                trigger: 'blur',
              },
            ],
            width: 120,
            // rules: [
            //   {
            //     required: true,
            //     message: '请输入设备型号',
            //     trigger: 'blur',
            //   },
            // ],
          },
          {
            label: '设备SN',
            prop: 'device_sn',
            labelWidth: 130,
            width: 120,
            overHidden: true,
            search: true,
            searchSpan: 4,
            editDisabled: true,
            rules: [
              {
                required: true,
                message: '请输入设备SN',
                trigger: 'blur',
              },
            ],
            // rules: [
            //   {
            //     required: true,
            //     message: '请输入设备SN',
            //     trigger: 'blur',
            //   },
            // ],
          },
          // {
          //   label: '机巢编号',
          //   prop: 'machine_nest_sn',
          //   labelWidth: 130,
          //   editDisabled: true,
          //   rules: [
          //     {
          //       required: false,
          //       message: '请输入机巢编号',
          //       trigger: 'blur',
          //     },
          //   ],
          // },
          {
            label: '机巢编号',
            prop: 'machine_nest_sn',
            labelWidth: 130,
            editDisabled: true,
            rules: [
              {
                required: false,
                message: '请输入机巢编号',
                trigger: 'blur',
              },
            ],
          },
          {
            label: '设备组织名称',
            label: '设备名称',
            prop: 'nickname',
            labelWidth: 130,
            rules: [
              {
                required: true,
                message: '请输入设备组织名称',
                trigger: 'blur',
              },
            ],
          },
          {
            label: '固件版本',
            prop: 'firmware_version',
            labelWidth: 130,
            width: 100,
            editDisabled: true,
            overHidden: true,
            editDisplay: true, //编辑显示
            rules: [
              {
                required: true,
                message: '请输入固件版本',
                message: '请输入设备名称',
                trigger: 'blur',
              },
            ],
          },
          {
            label: '固件升级',
            prop: 'firmware_status',
            labelWidth: 130,
            width: 100,
            viewDisabled: true,
            addDisabled: true,
            editDisabled: true,
            addDisplay: false,
            editDisplay: false,
            viewDisplay: false,
            rules: [
              {
                required: true,
                message: '请输入固件升级',
                trigger: 'blur',
              },
            ],
          },
          {
            label: '所属单位',
            prop: 'dept_name',
            addDisplay: false,
            editDisplay: false,
            viewDisplay: false,
            labelWidth: 130,
            rules: [
              {
                required: true,
                message: '请输入所属单位',
                trigger: 'blur',
              },
            ],
          },
          {
            label: '所属单位',
            prop: 'dept_id',
            hide: true,
            type: 'tree',
            defaultExpandAll: true,
            labelWidth: 130,
            dicUrl: '/blade-system/dept/getTree',
            props: {
              label: 'name',
              value: 'id',
            },
            rules: [
              {
                required: true,
                message: '请输入所属单位',
                trigger: 'blur',
              },
            ],
          },
          {
            label: '加入组织时间',
            prop: 'bound_time',
            addDisplay: false,
            editDisplay: false,
            type: 'date',
            labelWidth: 130,
            width: 160,
            format: 'YYYY-MM-DD HH:mm:ss',
            // valueFormat: 'YYYY-MM-DD HH:mm:ss',
            rules: [
              {
                required: true,
                message: '请输入在线状态',
                trigger: 'blur',
              },
            ],
          },
          {
            label: '行政区划',
            label: '设备位置',// '行政区划',
            prop: 'area_name',
            hide: true,
            // hide: true,
            overHidden: true,
            editDisplay: false, //编辑显示
            viewDisplay: true, //查看显示
            viewDisplay: false, //查看显示
            labelWidth: 130,
          },
          {
            label: '行政区划',
            label: '设备位置',
            prop: 'area_code',
            type: 'cascader',
            labelWidth: 130,
            hide: true,
            // overHidden: true,
            editDisplay: true,
            viewDisplay: false,
            viewDisplay: true,
            props: {
              label: 'title',
              value: 'value',
@@ -386,7 +326,7 @@
            rules: [
              {
                required: true,
                message: '请选择行政区划',
                message: '请选择设备位置',
                trigger: 'change',
              },
            ],
@@ -424,6 +364,167 @@
              }
            },
          },
          // {
          //   label: '设备位置',
          //   prop: 'address',
          //   labelWidth: 130,
          //   width: 100,
          //   overHidden: true,
          //   rules: [
          //     {
          //       required: true,
          //       message: '请输入设备位置',
          //       trigger: 'blur',
          //     },
          //   ],
          // },
          {
            label: '负载设备',
            prop: 'payload_str',
            labelWidth: 130,
            width: 100,
            editDisabled: true,
            // rules: [
            //   {
            //     required: true,
            //     message: '请输入负载设备',
            //     trigger: 'blur',
            //   },
            // ],
          },
          // {
          //   label: '保险有效期',
          //   prop: 'insureExpiredTime',
          //   labelWidth: 130,
          //   width: 110,
          //   rules: [
          //     {
          //       required: true,
          //       message: '请输入保险有效期',
          //       trigger: 'blur',
          //     },
          //   ],
          // },
          {
            label: '流量剩余',
            prop: 'traffic_remaining',
            labelWidth: 130,
            width: 100,
            editDisabled: true,
            // rules: [
            //   {
            //     required: true,
            //     message: '请输入流量剩余',
            //     trigger: 'blur',
            //   },
            // ],
          },
          {
            label: '流量到期时间',
            prop: 'traffic_expire_time"',
            labelWidth: 130,
            width: 120,
            type: 'date',
            format: 'YYYY-MM-DD',
            editDisabled: true,
            // rules: [
            //   {
            //     required: true,
            //     message: '请输入流量到期时间',
            //     trigger: 'blur',
            //   },
            // ],
          },
          {
            label: '固件版本',
            prop: 'firmware_version',
            labelWidth: 130,
            width: 110,
            editDisabled: true,
            // rules: [
            //   {
            //     required: true,
            //     message: '请输入固件版本',
            //     trigger: 'blur',
            //   },
            // ],
          },
          {
            label: '固件升级',
            prop: 'firmware_status',
            labelWidth: 130,
            width: 100,
            hide: true,
            viewDisabled: true,
            addDisabled: true,
            editDisabled: true,
            addDisplay: false,
            editDisplay: false,
            viewDisplay: false,
            // rules: [
            //   {
            //     required: true,
            //     message: '请输入固件升级',
            //     trigger: 'blur',
            //   },
            // ],
          },
          {
            label: '所属单位',
            prop: 'dept_name',
            addDisplay: false,
            editDisplay: false,
            viewDisplay: false,
            labelWidth: 130,
            width: 180,
            rules: [
              {
                required: true,
                message: '请输入所属单位',
                trigger: 'blur',
              },
            ],
          },
          {
            label: '所属单位',
            prop: 'dept_id',
            hide: true,
            type: 'tree',
            defaultExpandAll: true,
            labelWidth: 130,
            dicUrl: '/blade-system/dept/getTree',
            props: {
              label: 'name',
              value: 'id',
            },
            rules: [
              {
                required: true,
                message: '请输入所属单位',
                trigger: 'blur',
              },
            ],
          },
          // {
          //   label: '加入组织时间',
          //   prop: 'bound_time',
          //   addDisplay: false,
          //   editDisplay: false,
          //   type: 'date',
          //   labelWidth: 130,
          //   width: 160,
          //   format: 'YYYY-MM-DD HH:mm:ss',
          //   // valueFormat: 'YYYY-MM-DD HH:mm:ss',
          //   rules: [
          //     {
          //       required: true,
          //       message: '请输入在线状态',
          //       trigger: 'blur',
          //     },
          //   ],
          // },
          {
            hide: true,
@@ -448,23 +549,46 @@
            label: '在线时间',
            prop: 'login_time',
            type: 'date',
            addDisplay: false,
            editDisplay: false,
            editDisplay: true, //编辑显示
            editDisabled: true,
            viewDisplay: true, //查看显示
            addDisplay: true,
            labelWidth: 130,
            width: 160,
            format: 'YYYY-MM-DD HH:mm:ss',
            // valueFormat: 'YYYY-MM-DD HH:mm:ss',
            startPlaceholder: '任务开始时间',
            rules: [
              {
                required: true,
                message: '请输入在线时间',
                trigger: 'blur',
              },
            ],
            // rules: [
            //   {
            //     required: true,
            //     message: '请输入在线时间',
            //     trigger: 'blur',
            //   },
            // ],
          },
          {
            label: '在线状态',
            label: '注册时间',
            prop: 'create_time',
            type: 'date',
            editDisplay: true, //编辑显示
            editDisabled: true,
            viewDisplay: true, //查看显示
            addDisplay: true,
            labelWidth: 130,
            width: 160,
            format: 'YYYY-MM-DD HH:mm:ss',
            // valueFormat: 'YYYY-MM-DD HH:mm:ss',
            startPlaceholder: '创建时间',
            // rules: [
            //   {
            //     required: true,
            //     message: '请输入创建时间',
            //     trigger: 'blur',
            //   },
            // ],
          },
          {
            label: '设备状态',
            prop: 'cnstatus',
            hide: true,
            addDisplay: false,
@@ -473,7 +597,7 @@
            labelWidth: 130,
          },
          {
            label: '在线状态',
            label: '设备状态',
            prop: 'status',
            addDisplay: false,
            editDisplay: false,
@@ -498,17 +622,17 @@
            editDisplay: false,
            viewDisplay: true,
            labelWidth: 130,
            width: 110,
          },
          {
            label: '机场状态',
            prop: 'mode_code',
            addDisplay: false,
            editDisplay: false,
            viewDisplay: false,
            labelWidth: 130,
            slot: true,
            width: 100,
            width: 110,
            rules: [
              {
@@ -561,6 +685,12 @@
        this.webSocketIdSet.delete(k)
      }
    })
  },
  mounted() {
    document.addEventListener("click", this.handleClickOutside);
  },
  beforeDestroy() {
    document.removeEventListener("click", this.handleClickOutside);
  },
  methods: {
    getDockModeText (value) {
@@ -629,6 +759,7 @@
    },
    // 打开权限分享页面
    handleOpenDevicePerShare (row) {
      this.moreDialogVisible = false
      var that = this
      this.devicePerShareVisible = true
      this.$nextTick(() => {
@@ -637,6 +768,7 @@
    },
    // 打开远程调试
    handleOpenRemoteDebugging (row) {
      this.moreDialogVisible = false
      this.curDeviceInfo = row
      this.remoteDebuggingShow = true
      this.operateTitle = row.nickname + ' - ' + row.device_sn
@@ -644,7 +776,8 @@
    // 设备下线
    handleDeviceOffline (row) {
      ElMessageBox.confirm('确定下线该设备吗?', '提示', {
      this.moreDialogVisible = false
      ElMessageBox.confirm('确定注销该设备吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
@@ -652,19 +785,44 @@
        .then(() => {
          deviceOffline(row.device_sn)
            .then(res => {
              ElMessage.success('下线成功')
              ElMessage.success('注销成功')
              this.init()
            })
            .catch(error => {
              ElMessage.error('下线失败')
              ElMessage.error('注销失败')
            })
        })
        .catch(() => { })
    },
    // 点击更多
    moreClick(value, permission, event) {
      this.moreDialogData = value
      this.morePermission = permission
      this.moreDialogVisible = true
      console.log('4444', this.moreDialogVisible)
      // 获取按钮位置
      const rect = event.target.getBoundingClientRect();
      console.log(event)
      this.popupPosition = {
        top: rect.bottom - 150, // 按钮底部位置
      };
    },
    handleClickOutside(event) {
      // 检查点击是否发生在 .more-container 内
      const moreContainer = document.querySelector('.more-container');
      if (moreContainer && moreContainer.contains(event.target)) {
        return; // 如果点击在容器内,什么都不做
      }
      this.moreDialogVisible = false; // 否则关闭下拉菜单
    },
    // 打开存储对象配置页面
    handleOpenOssSet (row) {
      this.moreDialogVisible = false
      var that = this
      this.deviceSn = row.device_sn
      this.ossSetBox = true
@@ -1189,4 +1347,24 @@
    border-color: #409eff;
  }
}
:deep(.avue-crud__menu) {
  display: flex;
}
.more-container {
  position: relative;
}
.show-more-do {
  position: absolute;
  background-color: #ffffff;
  // border: 1px solid #409eff;
  z-index: 9999;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
  width: 140px;
  font-size: 12px;
  // height: 140px;
  height: 190px;
  right: 0;
}
</style>