Merge branch 'demo' of http://s16s652780.51mypc.cn:49896/r/yskj/iot_drone_web into demo
| | |
| | | <template> |
| | | <div class="demo-app"> |
| | | <!-- <a-local-provider :locale="zhCN">--> |
| | | <router-view /> |
| | | <!-- </a-local-provider>--> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | // import zhCN from 'ant-design-vue/es/locale/zh_CN' |
| | | // import moment from 'moment' |
| | | // import 'moment/dist/locale/zh-cn' |
| | | // moment.locale('zh-cn') |
| | | </script> |
| | | <style lang="scss" scoped> |
| | | .demo-app { |
| | |
| | | <!--搜索栏--> |
| | | <div class="search-panel-wrapper"> |
| | | <div class="search-part"> |
| | | <a-range-picker :size="searchPanelOptions.size" :format="searchPanelOptions.dateFormat" :valueFormat="searchPanelOptions.valueFormat" v-model:value="timeRangeArr.data" @change="dateChange" style="width: 300px" /> |
| | | <a-range-picker :size="searchPanelOptions.size" :format="searchPanelOptions.dateFormat" |
| | | :valueFormat="searchPanelOptions.valueFormat" v-model:value="timeRangeArr.data" |
| | | @change="dateChange" style="width: 300px"/> |
| | | </div> |
| | | |
| | | <div class="search-part"> |
| | | <a-select v-model:value="subFileTypeArr" allowClear @change="subFileTypeChange" :options="subFileTypeOptions" :maxTagCount="searchPanelOptions.maxTagCount" mode="multiple" |
| | | <a-select v-model:value="subFileTypeArr" allowClear @change="subFileTypeChange" :options="subFileTypeOptions" |
| | | :maxTagCount="searchPanelOptions.maxTagCount" mode="multiple" |
| | | :size="searchPanelOptions.size" placeholder="所有类型" style="width: 300px"> |
| | | </a-select> |
| | | </div> |
| | | |
| | | <div class="search-part"> |
| | | <a-select v-model:value="payloadArr" allowClear @change="payloadChange" :options="payloadOptions" :maxTagCount="searchPanelOptions.maxTagCount" mode="multiple" |
| | | <a-select v-model:value="payloadArr" allowClear @change="payloadChange" :options="payloadOptions" |
| | | :maxTagCount="searchPanelOptions.maxTagCount" mode="multiple" |
| | | :size="searchPanelOptions.size" placeholder="所有负载" style="width: 300px"> |
| | | </a-select> |
| | | </div> |
| | | |
| | | <div class="search-part"> |
| | | <a-input-search :size="searchPanelOptions.size" v-model:value="searchQuery.name" @change="inputChange" placeholder="按文件名称搜索" style="width: 300px"/> |
| | | <a-input-search :size="searchPanelOptions.size" v-model:value="searchQuery.name" @change="inputChange" |
| | | placeholder="按文件名称搜索" style="width: 300px"/> |
| | | </div> |
| | | |
| | | </div> |
| | |
| | | </template> |
| | | <template #action="{ record }"> |
| | | <a-tooltip title="download"> |
| | | <a class="fz18" @click="downloadMedia(record)"><DownloadOutlined /></a> |
| | | <a class="fz18" @click="downloadMedia(record)"> |
| | | <DownloadOutlined/> |
| | | </a> |
| | | </a-tooltip> |
| | | </template> |
| | | </a-table> |
| | |
| | | { value: 1, label: '全景图' }, |
| | | ] |
| | | |
| | | const payloadOptions = [ |
| | | ] |
| | | const payloadOptions = [] |
| | | |
| | | const timeRangeArr = reactive({ |
| | | data: [] as string[] |
| | | }) |
| | | const searchQuery = reactive<MediaQueryParam>({ |
| | | }) |
| | | const searchQuery = reactive<MediaQueryParam>({}) |
| | | const subFileTypeArr = reactive([]) |
| | | const payloadArr = reactive([]) |
| | | |
| | |
| | | .media-panel-wrapper { |
| | | width: 100%; |
| | | padding: 16px; |
| | | |
| | | .media-table { |
| | | background: #fff; |
| | | margin-top: 10px; |
| | | } |
| | | |
| | | .action-area { |
| | | color: $primary; |
| | | cursor: pointer; |
| | | } |
| | | } |
| | | |
| | | .header { |
| | | width: 100%; |
| | | height: 60px; |
| | |
| | | <template> |
| | | <!-- <div class="header">计划库</div>--> |
| | | <!--搜索栏--> |
| | | |
| | | <div class="search-panel-wrapper"> |
| | | <div class="search-part"> |
| | | <a-range-picker :size="searchPanelOptions.size" :format="searchPanelOptions.dateFormat" :valueFormat="searchPanelOptions.valueFormat" v-model:value="timeRangeArr.data" @change="dateChange" style="width: 300px" /> |
| | | <a-range-picker :size="searchPanelOptions.size" :format="searchPanelOptions.dateFormat" |
| | | :valueFormat="searchPanelOptions.valueFormat" v-model:value="timeRangeArr.data" |
| | | @change="dateChange" style="width: 300px"/> |
| | | </div> |
| | | |
| | | <div class="search-part"> |
| | | <a-select :size="searchPanelOptions.size" @change="selectChange" ref="select" v-model:value="searchQuery.taskType" style="width: 300px"> |
| | | <a-select :size="searchPanelOptions.size" @change="selectChange" ref="select" |
| | | v-model:value="searchQuery.taskType" style="width: 300px"> |
| | | <a-select-option value="">所有类型</a-select-option> |
| | | <a-select-option :value="item.value" v-for="(item) in TaskTypeOptions" :key="item.value">{{ item.label }} |
| | | </a-select-option> |
| | |
| | | </div> |
| | | |
| | | <div class="search-part"> |
| | | <a-select v-model:value="statusArr" allowClear @change="selectMultipleChange" :options="TaskStatusOptions" :maxTagCount="searchPanelOptions.maxTagCount" mode="multiple" |
| | | <a-select v-model:value="statusArr" allowClear @change="selectMultipleChange" :options="TaskStatusOptions" |
| | | :maxTagCount="searchPanelOptions.maxTagCount" mode="multiple" |
| | | :size="searchPanelOptions.size" placeholder="全部状态" style="width: 300px"> |
| | | </a-select> |
| | | </div> |
| | | |
| | | <div class="search-part"> |
| | | <a-input-search :size="searchPanelOptions.size" v-model:value="searchQuery.name" @change="inputChange" placeholder="按航线或计划名搜索" style="width: 300px"/> |
| | | <a-input-search :size="searchPanelOptions.size" v-model:value="searchQuery.name" @change="inputChange" |
| | | placeholder="按航线或计划名搜索" style="width: 300px"/> |
| | | </div> |
| | | |
| | | </div> |
| | | |
| | | <!--表格--> |
| | | <div class="plan-panel-wrapper"> |
| | | <a-table :loading="tableLoading" class="plan-table" :columns="columns" :data-source="plansData.data" row-key="job_id" |
| | | <a-table :loading="tableLoading" class="plan-table" :columns="columns" :data-source="plansData.data" |
| | | row-key="job_id" |
| | | :pagination="paginationProp" :scroll="{ x: '100%', y: 600 }" @change="refreshData"> |
| | | <!-- 执行时间 --> |
| | | <template #duration="{ record }"> |
| | |
| | | </template> |
| | | </a-table> |
| | | </div> |
| | | |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | |
| | | import { TableState } from 'ant-design-vue/lib/table/interface' |
| | | import { computed, onMounted } from 'vue' |
| | | import { IPage } from '/@/api/http/type' |
| | | import 'moment/dist/locale/zh-cn' |
| | | import { |
| | | deleteTask, |
| | | updateTaskStatus, |
| | |
| | | const workspaceId = localStorage.getItem(ELocalStorageKey.WorkspaceId)! |
| | | |
| | | const dockSns = computed(() => store.state.common.dockSns) |
| | | |
| | | // 监听设备选择 |
| | | watch( |
| | | () => dockSns.value, |
| | |
| | | <template> |
| | | <a-config-provider :locale="zhCN"> |
| | | |
| | | <a-layout class="width-100 flex-display" style="height: 100vh"> |
| | | <a-layout-header class="header" v-show="$route.meta.header!=false"> |
| | | <Topbar /> |
| | |
| | | </a-layout-content> |
| | | |
| | | </a-layout> |
| | | </a-config-provider> |
| | | |
| | | </template> |
| | | |
| | | <script lang="ts" setup> |
| | | import zhCN from 'ant-design-vue/es/locale/zh_CN' |
| | | import Topbar from '/@/components/common/topbar.vue' |
| | | import { onMounted, reactive, ref, UnwrapRef, watch } from 'vue' |
| | | import { getRoot } from '/@/root' |
| | |
| | | user: string |
| | | password: string |
| | | } |
| | | |
| | | const route = useRoute() |
| | | const root = getRoot() |
| | | |
| | |
| | | |
| | | <template> |
| | | <a-menu v-model:selectedKeys="current" mode="horizontal" @select="select"> |
| | | <a-menu-item :key="EDeviceTypeName.Aircraft" class="ml20"> |
| | |
| | | 机场 |
| | | </a-menu-item> |
| | | </a-menu> |
| | | |
| | | <div class="device-table-wrap table flex-display flex-column"> |
| | | <a-table :columns="columns" :data-source="data.device" :pagination="paginationProp" @change="refreshData" row-key="device_sn" :expandedRowKeys="expandRows" |
| | | <a-table :columns="columns" :data-source="data.device" :pagination="paginationProp" @change="refreshData" |
| | | row-key="device_sn" :expandedRowKeys="expandRows" |
| | | :row-selection="rowSelection" :rowClassName="rowClassName" :scroll="{ x: '100%', y: 600 }" |
| | | :expandIcon="expandIcon" :loading="loading"> |
| | | <template v-for="col in ['nickname']" #[col]="{ text, record }" :key="col"> |
| | |
| | | </template> |
| | | |
| | | </a-table> |
| | | <a-modal v-model:visible="deleteTip" width="450px" :closable="false" centered :okButtonProps="{ danger: true }" @ok="unbind"> |
| | | <a-modal v-model:visible="deleteTip" width="450px" :closable="false" centered :okButtonProps="{ danger: true }" |
| | | @ok="unbind"> |
| | | <p class="pt10 pl20" style="height: 50px;">确定从项目中删除该设备吗?</p> |
| | | <template #title> |
| | | <div class="flex-row flex-justify-center"> |
| | |
| | | import { IPage } from '/@/api/http/type' |
| | | import { BindBody, bindDevice, getBindingDevices, unbindDevice, updateDevice } from '/@/api/manage' |
| | | import { EDeviceTypeName, ELocalStorageKey } from '/@/types' |
| | | import { EditOutlined, CheckOutlined, CloseOutlined, DeleteOutlined, FileSearchOutlined, CloudServerOutlined } from '@ant-design/icons-vue' |
| | | import { |
| | | EditOutlined, |
| | | CheckOutlined, |
| | | CloseOutlined, |
| | | DeleteOutlined, |
| | | FileSearchOutlined, |
| | | CloudServerOutlined |
| | | } from '@ant-design/icons-vue' |
| | | import { Device, DeviceFirmwareStatusEnum } from '/@/types/device' |
| | | import DeviceFirmwareUpgrade from '/@/components/devices/device-upgrade/DeviceFirmwareUpgrade.vue' |
| | | import DeviceFirmwareUpgradeModal from '/@/components/devices/device-upgrade/DeviceFirmwareUpgradeModal.vue' |
| | |
| | | import DeviceHmsDrawer from '/@/components/devices/device-hms/DeviceHmsDrawer.vue' |
| | | import { message, notification } from 'ant-design-vue' |
| | | import { useMyStore } from '/@/store' |
| | | |
| | | interface DeviceData { |
| | | device: Device[] |
| | | } |
| | | |
| | | const store = useMyStore() |
| | | const loading = ref(false) |
| | | const deleteTip = ref<boolean>(false) |
| | | const deleteSn = ref<string>() |
| | | const columns: ColumnProps[] = [ |
| | | { title: '设备型号', dataIndex: 'device_name', width: 100, className: 'titleStyle' }, |
| | | { title: '设备SN', dataIndex: 'device_sn', width: 100, className: 'titleStyle', ellipsis: true, slots: { customRender: 'sn' } }, |
| | | { |
| | | title: '设备SN', |
| | | dataIndex: 'device_sn', |
| | | width: 100, |
| | | className: 'titleStyle', |
| | | ellipsis: true, |
| | | slots: { customRender: 'sn' } |
| | | }, |
| | | { |
| | | title: '设备组织名称', |
| | | dataIndex: 'nickname', |
| | |
| | | ellipsis: true, |
| | | slots: { customRender: 'nickname' } |
| | | }, |
| | | { title: '固件版本', dataIndex: 'firmware_version', width: 150, className: 'titleStyle', slots: { customRender: 'firmware_version' } }, |
| | | { |
| | | title: '固件版本', |
| | | dataIndex: 'firmware_version', |
| | | width: 150, |
| | | className: 'titleStyle', |
| | | slots: { customRender: 'firmware_version' } |
| | | }, |
| | | { title: '在线状态', dataIndex: 'status', width: 100, className: 'titleStyle', slots: { customRender: 'status' } }, |
| | | { |
| | | title: '所属项目', |
| | |
| | | return obj |
| | | } |
| | | }, |
| | | { title: '加入组织时间', dataIndex: 'bound_time', width: 150, sorter: (a: Device, b: Device) => a.bound_time.localeCompare(b.bound_time), className: 'titleStyle' }, |
| | | { title: '在线时间', dataIndex: 'login_time', width: 150, sorter: (a: Device, b: Device) => a.login_time.localeCompare(b.login_time), className: 'titleStyle' }, |
| | | { |
| | | title: '加入组织时间', |
| | | dataIndex: 'bound_time', |
| | | width: 150, |
| | | sorter: (a: Device, b: Device) => a.bound_time.localeCompare(b.bound_time), |
| | | className: 'titleStyle' |
| | | }, |
| | | { |
| | | title: '在线时间', |
| | | dataIndex: 'login_time', |
| | | width: 150, |
| | | sorter: (a: Device, b: Device) => a.login_time.localeCompare(b.login_time), |
| | | className: 'titleStyle' |
| | | }, |
| | | { |
| | | title: '操作', |
| | | dataIndex: 'actions', |
| | |
| | | const currentDevice = ref({} as Device) |
| | | // 设备日志 |
| | | const deviceLogUploadRecordVisible = ref(false) |
| | | |
| | | function showDeviceLogUploadRecord (dock: Device) { |
| | | deviceLogUploadRecordVisible.value = true |
| | | currentDevice.value = dock |
| | |
| | | padding: 20px; |
| | | height: 88vh; |
| | | } |
| | | |
| | | .table-striped { |
| | | background-color: #f7f9fa; |
| | | } |
| | | |
| | | .ant-table { |
| | | border-top: 1px solid rgb(0,0,0,0.06); |
| | | border-bottom: 1px solid rgb(0,0,0,0.06); |
| | | } |
| | | |
| | | .ant-table-tbody tr td { |
| | | border: 0; |
| | | } |
| | | |
| | | .ant-table td { |
| | | white-space: nowrap; |
| | | } |
| | | |
| | | .ant-table-thead tr th { |
| | | background: white !important; |
| | | border: 0; |
| | | } |
| | | |
| | | th.ant-table-selection-column { |
| | | background-color: white !important; |
| | | } |
| | | |
| | | .ant-table-header { |
| | | background-color: white !important; |
| | | } |
| | | |
| | | .child-row { |
| | | height: 70px; |
| | | } |
| | | |
| | | .notice { |
| | | background: $success; |
| | | overflow: hidden; |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .caution { |
| | | background: orange; |
| | | cursor: pointer; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .warn { |
| | | background: red; |
| | | cursor: pointer; |