Merge branch 'feature/v7.0/7.0.1' of http://139.196.74.78:10010/r/drone/drone-web-manage into feature/v7.0/7.0.1
27 files modified
1 files added
| | |
| | | method: 'get', |
| | | }); |
| | | |
| | | export const getRoutes = topMenuId => |
| | | export const getRoutes = params => |
| | | request({ |
| | | url: '/blade-system/menu/routes', |
| | | method: 'get', |
| | | params: { |
| | | topMenuId, |
| | | }, |
| | | params |
| | | }); |
| | |
| | | }); |
| | | }; |
| | | |
| | | export const grantTree = () => { |
| | | export const grantTree = (params) => { |
| | | return request({ |
| | | url: '/blade-system/menu/grant-tree', |
| | | method: 'get', |
| | | params |
| | | }); |
| | | }; |
| | | |
| | |
| | | }, |
| | | }); |
| | | |
| | | export const getButtons = () => |
| | | export const getButtons = (params) => |
| | | request({ |
| | | url: '/blade-system/menu/buttons', |
| | | method: 'get', |
| | | params |
| | | }); |
| | | |
| | | export const getCaptcha = () => |
| New file |
| | |
| | | <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg"> |
| | | <g id="Frame" clip-path="url(#clip0_2023_1729)"> |
| | | <path id="Vector" d="M10.9609 1.95508C5.96561 1.95508 1.91602 6.00424 1.91602 11C1.91602 15.9958 5.96561 20.0449 10.9609 20.0449C15.9563 20.0449 20.0059 15.9949 20.0059 11C20.0059 6.0051 15.9563 1.95508 10.9609 1.95508ZM10.9609 15.843C10.7528 15.8426 10.5495 15.7805 10.3767 15.6645C10.2038 15.5486 10.0692 15.3841 9.98987 15.1917C9.91052 14.9993 9.88998 14.7877 9.93084 14.5836C9.9717 14.3795 10.0721 14.1921 10.2194 14.0451C10.3668 13.8981 10.5543 13.7981 10.7585 13.7576C10.9626 13.7172 11.1742 13.7381 11.3664 13.8179C11.5587 13.8976 11.723 14.0326 11.8386 14.2056C11.9541 14.3787 12.0158 14.5822 12.0158 14.7903C12.0158 14.9287 11.9885 15.0658 11.9355 15.1936C11.8824 15.3215 11.8047 15.4376 11.7067 15.5354C11.6087 15.6332 11.4924 15.7107 11.3645 15.7635C11.2365 15.8163 11.0994 15.8433 10.9609 15.843ZM12.0158 11.2836C12.0119 11.5607 11.899 11.8252 11.7016 12.0198C11.5042 12.2143 11.2382 12.3234 10.961 12.3234C10.6839 12.3234 10.4179 12.2143 10.2205 12.0198C10.0231 11.8252 9.91022 11.5607 9.90627 11.2836V6.37313C9.91022 6.09599 10.0231 5.83154 10.2205 5.63696C10.4179 5.44238 10.6839 5.3333 10.961 5.3333C11.2382 5.3333 11.5042 5.44238 11.7016 5.63696C11.899 5.83154 12.0119 6.09599 12.0158 6.37313V11.2836Z" fill="#FF0000"/> |
| | | </g> |
| | | <defs> |
| | | <clipPath id="clip0_2023_1729"> |
| | | <rect width="22" height="22" fill="white"/> |
| | | </clipPath> |
| | | </defs> |
| | | </svg> |
| | |
| | | qrCodeInstance = new QRCode(myQrCode.value, { |
| | | width: 130, |
| | | height: 130, |
| | | text: `https://uri.amap.com/marker?position=${transformed}&name=%E4%BA%8B%E4%BB%B6%E7%82%B9`, |
| | | text: `https://uri.amap.com/marker?position=${transformed}&name=%E4%BA%8B%E4%BB%B6%E7%82%B9&from='ztzf'`, |
| | | }) |
| | | if (myQrCode.value.hasAttribute('title')) { |
| | | myQrCode.value.removeAttribute('title') |
| | |
| | | label: '封存', |
| | | prop: 'isSealed', |
| | | type: 'switch', |
| | | align: 'center', |
| | | // align: 'center', |
| | | width: 100, |
| | | dicData: [ |
| | | { |
| | |
| | | }) |
| | | } |
| | | return new Promise(resolve => { |
| | | getRoutes(tenantId).then(res => { |
| | | getRoutes({tenantId,sysType: 1}).then(res => { |
| | | const data = res.data.data; |
| | | let menu = deepClone(data); |
| | | if (!res.data?.data?.length){ |
| | |
| | | }, |
| | | GetButtons({ commit }) { |
| | | return new Promise(resolve => { |
| | | getButtons().then(res => { |
| | | getButtons({sysType: 1}).then(res => { |
| | | const data = res.data.data; |
| | | commit('SET_PERMISSION', data); |
| | | resolve(); |
| | |
| | | .el-dialog__headerbtn { |
| | | position: absolute; |
| | | left: 0; |
| | | top: 14px; |
| | | //top: 14px; |
| | | |
| | | .el-dialog__close { |
| | | color: #fff; |
| | |
| | | } |
| | | |
| | | .ztzf-drawer-body-basic-container { |
| | | .el-drawer__header { |
| | | margin-bottom: 0; |
| | | } |
| | | .el-drawer__body { |
| | | display: flex; |
| | | flex-direction: column; |
| | | |
| | | |
| | | } |
| | | |
| | | } |
| | |
| | | .ztzf-form-mange { |
| | | .el-form-item { |
| | | width: 300px; |
| | | .el-form-item__content { |
| | | width: 100%; |
| | | } |
| | | .el-form-item__label { |
| | | width: 120px; |
| | | } |
| | |
| | | box-sizing: border-box; |
| | | background: #fafafa; |
| | | } |
| | | } |
| | | } |
| | |
| | | </div> |
| | | </div> |
| | | <div class="search-btn"> |
| | | |
| | | <el-button type="primary" icon="el-icon-search" @click="handleSearch">搜索</el-button> |
| | | <el-button icon="el-icon-delete" @click="handleReset">清空</el-button> |
| | | <el-button type="primary" icon="el-icon-back" @click="goback">返回</el-button> |
| | |
| | | } |
| | | .search { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | } |
| | | .searchBox { |
| | | display: flex; |
| | |
| | | .item { |
| | | display: flex; |
| | | align-items: center; |
| | | margin-right: 49px; |
| | | margin-right: 40px; |
| | | } |
| | | } |
| | | .search-btn { |
| | |
| | | </avue-crud> |
| | | <el-dialog title="角色权限配置" append-to-body v-model="box" width="345px"> |
| | | <el-tabs type="border-card"> |
| | | <el-tab-pane label="菜单权限"> |
| | | <el-tab-pane label="后台管理"> |
| | | <el-tree :data="menuGrantList" show-checkbox node-key="id" ref="treeMenu" :default-checked-keys="menuTreeObj" |
| | | :props="props"> |
| | | </el-tree> |
| | | </el-tab-pane> |
| | | <el-tab-pane label="移动app"> |
| | | <el-tree :data="menuGrantListApp" show-checkbox node-key="id" ref="treeMenuApp" :default-checked-keys="menuTreeObjApp" |
| | | :props="props"> |
| | | </el-tree> |
| | | </el-tab-pane> |
| | | <!-- <el-tab-pane label="数据权限"> |
| | |
| | | value: 'key', |
| | | }, |
| | | menuGrantList: [], |
| | | menuGrantListApp: [], |
| | | dataScopeGrantList: [], |
| | | apiScopeGrantList: [], |
| | | apiGrantList: [], |
| | | menuTreeObj: [], |
| | | menuTreeObjApp: [], |
| | | dataScopeTreeObj: [], |
| | | apiScopeTreeObj: [], |
| | | selectionList: [], |
| | |
| | | }, |
| | | submit () { |
| | | const menuList = this.$refs.treeMenu.getCheckedKeys() |
| | | const menuListApp = this.$refs.treeMenuApp.getCheckedKeys() |
| | | // const dataScopeList = this.$refs.treeDataScope.getCheckedKeys(); |
| | | const dataScopeList = [] |
| | | // const apiScopeList = this.$refs.treeApiScope.getCheckedKeys(); |
| | | const apiScopeList = [] |
| | | grant(this.idsArray, menuList, dataScopeList, apiScopeList).then(() => { |
| | | grant(this.idsArray, [...menuList,...menuListApp], dataScopeList, apiScopeList).then(() => { |
| | | this.box = false |
| | | this.$message({ |
| | | type: 'success', |
| | |
| | | this.menuTreeObj = [] |
| | | this.dataScopeTreeObj = [] |
| | | this.apiScopeTreeObj = [] |
| | | grantTree().then(res => { |
| | | grantTree({sysType: 1}).then(res => { |
| | | this.menuGrantList = res.data.data.menu |
| | | this.dataScopeGrantList = res.data.data.dataScope |
| | | this.apiScopeGrantList = res.data.data.apiScope |
| | |
| | | this.menuTreeObj = res.data.data.menu |
| | | this.dataScopeTreeObj = res.data.data.dataScope |
| | | this.apiScopeTreeObj = res.data.data.apiScope |
| | | this.box = true |
| | | }) |
| | | }) |
| | | grantTree({sysType: 3}).then(res => { |
| | | this.menuGrantListApp = res.data.data.menu |
| | | getRole(this.ids).then(res => { |
| | | this.menuTreeObjApp = res.data.data.menu |
| | | this.box = true |
| | | }) |
| | | }) |
| | |
| | | }, |
| | | } |
| | | </script> |
| | | <style scoped lang="scss"></style> |
| | | <style scoped lang="scss"></style> |
| | |
| | | function cancelDownload() { |
| | | cancelDownloadApi({ type:'htsjzx' }).then(res =>{ |
| | | ElMessage.success('取消成功') |
| | | }).catch(e =>{ |
| | | EventBus.emit('useGlobalWS-messageHandler', {biz_code: 'DOWNLOAD_PROGRESS',data:{status: 'CANCELLED',type:'htsjzx'}}) |
| | | }) |
| | | } |
| | | // 切换文件夹 |
| | |
| | | @click.stop="copyInfo(scope.row, scope.index)" v-if="userInfo.role_name.includes('admin')">复制 |
| | | </el-button> |
| | | </template> |
| | | </avue-crud>F |
| | | </avue-crud> |
| | | </basic-container> |
| | | </template> |
| | | |
| | |
| | | prop: 'area_code', |
| | | // type: 'cascader', |
| | | type: 'tree', |
| | | labelWidth: 145, |
| | | labelWidth: 130, |
| | | searchSpan: 4, |
| | | hide: true, |
| | | search: true, |
| | |
| | | <el-input v-model="operate_password" disabled></el-input> |
| | | </el-dialog> |
| | | |
| | | <el-dialog title="注销" class="zx-cancel" append-to-body v-model="cancenOperate" width="460px"> |
| | | <div style="display: flex;justify-content: center;margin-bottom: 10px;">注销 |
| | | <span style="color:cornflowerblue;font-weight: bolder;margin: 0px 4px;"> |
| | | <el-dialog title="注销" class="ztzf-dialog-mange zx-cancel" append-to-body v-model="cancenOperate" width="560px"> |
| | | <div class="txt-contain"> |
| | | <img :src="warnSvg" />注销 |
| | | <span class="name"> |
| | | {{ cancelSNName }} |
| | | </span> 设备可能会影响相关数据,确认注销吗? |
| | | </div> |
| | | <div style="display: flex;justify-content: center;color:red;font-size: 12px;">*删除相关图片、视频、事件</div> |
| | | <div class="delete-txt">*删除相关图片、视频、事件</div> |
| | | <template #footer> |
| | | <span class="dialog-footer" style="display: flex;justify-content: center;"> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="cancenOperate = false">取 消</el-button> |
| | | <el-button type="primary" @click="cancenOperateDo">确 定</el-button> |
| | | </span> |
| | |
| | | import FirmwareManage from './components/firmwareManage.vue' |
| | | import DevicePerShare from './components/devicePerShare.vue' |
| | | import DockControlPanel from './components/DockControlPanel.vue' |
| | | import { getWebsocketUrl } from '@/utils/websocket/config' |
| | | import ConnectWebSocket from '@/utils/websocket' |
| | | import { getWebsocketUrl } from '@/utils/websocket/config'; |
| | | import ConnectWebSocket from '@/utils/websocket'; |
| | | import warnSvg from '@/assets/images/warn.svg' |
| | | |
| | | export default { |
| | | components: { |
| | | FirmwareManage, |
| | |
| | | password: [{ required: true, validator: validatePass, trigger: 'blur' }], |
| | | password2: [{ required: true, validator: validatePass2, trigger: 'blur' }], |
| | | }, |
| | | warnSvg: warnSvg, |
| | | cancelSNName: '', |
| | | cancenOperate: false, |
| | | cancenOperateRow: {}, |
| | |
| | | height: 190px; |
| | | right: 0; |
| | | } |
| | | |
| | | :deep(.avue-crud__pagination) { |
| | | position: fixed; |
| | | bottom: 10px; |
| | | right: 30px; |
| | | } |
| | | |
| | | .force-center-dialog .el-dialog { |
| | | |
| | | } |
| | | .zx-cancel { |
| | | .txt-contain { |
| | | display: flex; |
| | | justify-content: center; |
| | | margin-bottom: 20px; |
| | | font-family: Source Han Sans CN, Source Han Sans CN; |
| | | font-weight: 400; |
| | | font-size: 14px; |
| | | img { |
| | | width: 20px; |
| | | height: 20px; |
| | | } |
| | | .name { |
| | | color: #0E8BFF; |
| | | margin-left: 6px; |
| | | margin-right: 6px; |
| | | } |
| | | |
| | | } |
| | | .delete-txt { |
| | | font-family: Source Han Sans CN, Source Han Sans CN; |
| | | font-weight: 400; |
| | | display: flex; |
| | | justify-content: center; |
| | | color: #FF0000; |
| | | font-size: 12px; |
| | | margin-bottom: 20px; |
| | | } |
| | | } |
| | | |
| | | </style> |
| | |
| | | index: true, |
| | | viewBtn: true, |
| | | addBtn: true, |
| | | editBtn: false, |
| | | selection: true, |
| | | excelBtn: false, |
| | | dialogClickModal: false, |
| | |
| | | editDisplay: false, |
| | | span: 24, |
| | | row: true, |
| | | width: 160, |
| | | width: 200, |
| | | format: 'YYYY-MM-DD HH:mm:ss', |
| | | }, |
| | | ], |
| | |
| | | addBtn: this.validData(this.permission.airport_add, true), |
| | | viewBtn: this.validData(this.permission.airport_view, true), |
| | | delBtn: this.validData(this.permission.airport_delete, true), |
| | | editBtn: this.validData(this.permission.airport_edit, true), |
| | | editBtn: this.validData(this.permission.airport_edit, false), |
| | | } |
| | | }, |
| | | ids () { |
| | |
| | | /* color: aqua; */ |
| | | } |
| | | </style> |
| | | <style scoped lang="scss"></style> |
| | | <style scoped lang="scss"> |
| | | .upload-demo { |
| | | height: 30px; |
| | | } |
| | | </style> |
| | |
| | | }, |
| | | { |
| | | label: '绑定菜单', |
| | | searchSpan: 5, |
| | | span: 24, |
| | | prop: 'menu_id', |
| | | type: 'tree', |
| | | dicUrl: '/blade-system/menu/deviceButtons', |
| | |
| | | import { droneEventList } from '../const/drc' |
| | | import { ElMessage,ElLoading } from 'element-plus' |
| | | import { useStore } from 'vuex'; |
| | | import EventBus from '@/utils/eventBus'; |
| | | const store = useStore(); |
| | | const htlsrwxq = computed(() => store.state.common.downloadProgress?.htlsrwxq || 100) |
| | | const isShow = defineModel('show') |
| | |
| | | function cancelDownload() { |
| | | cancelDownloadApi({ type:'htlsrwxq' }).then(res =>{ |
| | | ElMessage.success('取消成功') |
| | | }) |
| | | }).catch(e =>{ |
| | | EventBus.emit('useGlobalWS-messageHandler', {biz_code: 'DOWNLOAD_PROGRESS',data:{status: 'CANCELLED',type:'htlsrwxq'}}) |
| | | }) |
| | | } |
| | | onMounted(() => { |
| | | getDetails() |
| | |
| | | check-strictly |
| | | node-key="id" |
| | | :props="treeProps" |
| | | @node-click="handleNodeClick" |
| | | clearable |
| | | @change="handleNodeClick" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="所属机巢:"> |
| | |
| | | <div class="more" v-if="isExpand" @click="toggleExpand">收起</div> |
| | | <div class="more" v-else @click="toggleExpand">更多</div> |
| | | <div class="search-btn" :style="{ bottom: isExpand ? '5px' : '-3px' }"> |
| | | |
| | | |
| | | <el-button type="primary" icon="el-icon-search" @click="handleSearch">搜索</el-button> |
| | | <el-button icon="el-icon-refresh" @click="handleReset">清空</el-button> |
| | | </div> |
| | |
| | | collapse-tags |
| | | collapse-tags-tooltip |
| | | clearable |
| | | @node-click="handleNodeClick" |
| | | @check="handleCheck" |
| | | @clear="handleClear" |
| | | /> |
| | |
| | | </el-tooltip-copy> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="name" label="任务编号" width="160"> |
| | | <el-table-column prop="name" label="任务名称" width="160"> |
| | | <template #default="scope"> |
| | | <el-tooltip-copy :content="scope.row.name" :showCopyText="true"> |
| | | {{scope.row.name}} |
| | |
| | | import * as Cesium from 'cesium'; |
| | | import { PublicCesium } from '@/utils/cesium/publicCesium'; |
| | | import { ref, watch, onBeforeUnmount, onMounted } from 'vue'; |
| | | // 标记地图是否初始化完成 |
| | | const isMapReady = ref(false); |
| | | const uploadPatchDialog = defineModel('show'); |
| | | const props = defineProps(['title', 'detailid', 'detailList', 'spotTypeOption', 'regionalData']); |
| | | const polygonTableEle = ref(null); |
| | |
| | | |
| | | // 地图 |
| | | const initMap = () => { |
| | | if (!document.getElementById('spotMap')) { |
| | | return; |
| | | } |
| | | if (!document.getElementById('spotMap') || isMapReady.value) return; |
| | | |
| | | publicCesiumInstance = new PublicCesium({ |
| | | dom: 'spotMap', |
| | | flatMode: false, |
| | |
| | | layerMode: 4, |
| | | contour: false, |
| | | }); |
| | | |
| | | homeViewer.value = publicCesiumInstance.getViewer(); |
| | | viewer = publicCesiumInstance.getViewer(); |
| | | viewInstance.value = publicCesiumInstance; |
| | | viewInstance.value = publicCesiumInstance; |
| | | viewer.scene.globe.depthTestAgainstTerrain = true; |
| | | viewInstance.value.switchContour(true); |
| | | |
| | | // 确保 readyPromise 存在 |
| | | if (viewer.readyPromise) { |
| | | viewer.readyPromise.then(() => { |
| | | isMapReady.value = true; |
| | | getTableList(); |
| | | }).catch((error) => { |
| | | console.error('地图加载失败:', error); |
| | | ElMessage.error('地图加载失败,请刷新重试'); |
| | | }); |
| | | } else { |
| | | |
| | | // 如果没有 readyPromise |
| | | setTimeout(() => { |
| | | isMapReady.value = true; |
| | | getTableList(); |
| | | }, 1000); |
| | | } |
| | | }; |
| | | |
| | | |
| | | // 仅弹框初始化时执行的定位逻辑 |
| | | const initMapLocation = () => { |
| | | if (tbJwdList.length === 0 || !homeViewer.value) return; |
| | |
| | | }; |
| | | // 初始化所有图斑 |
| | | const entitiesAddSpot = () => { |
| | | if (!isMapReady.value || !viewer) return; |
| | | viewer?.entities.removeAll(); |
| | | tbJwdList = []; // 重置经纬度列表 |
| | | |
| | |
| | | |
| | | watch(uploadPatchDialog, newVal => { |
| | | if (newVal) { |
| | | |
| | | isInit.value = true; |
| | | isMapReady.value = false; |
| | | setTimeout(() => { |
| | | initMap(); |
| | | getTableList(); |
| | | getspotManagementTableApi(); |
| | | getspotManagementTableApi(); |
| | | }, 0); |
| | | } else { |
| | | tableData.value = []; |
| | | |
| | | tableData.value = []; |
| | | isEditing.value = false; |
| | | handleUpDateDrawState(false); |
| | | destroyMap(); |
| | | isInit.value = false; |
| | | clearSelect(); |
| | | isMapReady.value = false; |
| | | } |
| | | refreshonload(); |
| | | }); |
| | |
| | | searchMenuSpan: 4, |
| | | border: true, |
| | | index: true, |
| | | selection: true, |
| | | // selection: true, |
| | | dialogClickModal: false, |
| | | menu: false, // 禁用默认操作列 |
| | | |
| | |
| | | import { getLazyTree } from '@/api/base/region' |
| | | import { mapGetters } from 'vuex' |
| | | import website from '@/config/website' |
| | | import { getList } from '@/api/device/device'; |
| | | |
| | | export default { |
| | | data () { |
| | | return { |
| | | treeResolveMap: new Map(), |
| | | form: {}, |
| | | selectionList: [], |
| | | query: {}, |
| | |
| | | type: 'success', |
| | | message: '操作成功!', |
| | | }) |
| | | this.parentId = '' |
| | | const resolve = this.treeResolveMap.get(row.parentId) |
| | | if (resolve) { |
| | | // 重新加载子节点数据 |
| | | getChildLazyTree({ parentId: row.parentId }).then(res => { |
| | | resolve(res.data.data) |
| | | }) |
| | | } |
| | | this.onLoad(this.page) |
| | | done(row) |
| | | }, |
| | |
| | | loading() |
| | | return |
| | | } |
| | | console.log('--- Start rowUpdate ---') |
| | | // console.log('--- Start rowUpdate ---') |
| | | |
| | | // 提交时只使用县级代码 |
| | | const submitData = { |
| | |
| | | areaCode: row.areaCode.split(',').pop(), // 取最后一个代码(县级) |
| | | } |
| | | |
| | | console.log('Row data before submit:', row) |
| | | console.log('编辑', row) |
| | | |
| | | update(submitData) |
| | | .then( |
| | | res => { |
| | | console.log('Update response:', res.data) |
| | | const resolve = this.treeResolveMap.get(row.parentId) |
| | | if (resolve) { |
| | | // 重新加载子节点数据 |
| | | getChildLazyTree({ parentId: row.parentId }).then(res => { |
| | | resolve(res.data.data) |
| | | }) |
| | | } |
| | | this.onLoad(this.page) |
| | | this.$message({ |
| | | type: 'success', |
| | | message: '操作成功!', |
| | | }) |
| | | this.onLoad(this.page) |
| | | done(row) |
| | | }, |
| | | error => { |
| | | console.log('Update error:', error) |
| | | // console.log('Update error:', error) |
| | | this.loading = false |
| | | loading() |
| | | } |
| | | ) |
| | | .catch(error => { |
| | | console.log('Update promise rejected:', error) |
| | | // console.log('Update promise rejected:', error) |
| | | this.loading = false |
| | | }) |
| | | }, |
| | |
| | | return remove(row.id) |
| | | }) |
| | | .then(() => { |
| | | const resolve = this.treeResolveMap.get(row.parentId) |
| | | if (resolve) { |
| | | // 重新加载子节点数据 |
| | | getChildLazyTree({ parentId: row.parentId }).then(res => { |
| | | resolve(res.data.data) |
| | | }) |
| | | } |
| | | this.onLoad(this.page) |
| | | this.$message({ |
| | | type: 'success', |
| | | message: '操作成功!', |
| | | }) |
| | | this.onLoad(this.page) |
| | | done(row) |
| | | }) |
| | | }, |
| | |
| | | }, |
| | | onLoad (page, params = {}) { |
| | | this.loading = true |
| | | console.log('onLoad triggered with page:', page, 'params:', params) |
| | | console.log('Current parentId:', this.parentId, 'query:', this.query) |
| | | // console.log('onLoad triggered with page:', page, 'params:', params) |
| | | // console.log('Current parentId:', this.parentId, 'query:', this.query) |
| | | getLazyList(this.parentId, Object.assign(params, this.query)) |
| | | .then(res => { |
| | | console.log('onLoad response:', res.data) |
| | | // console.log('onLoad response:', res.data) |
| | | // 处理 areaCode,确保是单一字符串 |
| | | const data = (res.data.data || []).map(item => { |
| | | const fullAreaCode = this.getFullAreaCode(item.areaCode) |
| | |
| | | this.data = data |
| | | this.loading = false |
| | | this.selectionClear() |
| | | console.log('Table data after onLoad:', this.data) |
| | | // console.log('Table data after onLoad:', this.data) |
| | | }) |
| | | .catch(error => { |
| | | console.log('onLoad error:', error) |
| | | // console.log('onLoad error:', error) |
| | | this.loading = false |
| | | this.data = this.data // 保留当前数据 |
| | | console.log('Table data after onLoad error:', this.data) |
| | | // console.log('Table data after onLoad error:', this.data) |
| | | }) |
| | | }, |
| | | treeLoad (tree, treeNode, resolve) { |
| | | this.treeResolveMap.set(tree.id, resolve) |
| | | getChildLazyTree({ parentId: tree.id }).then(res => { |
| | | resolve(res.data.data) |
| | | }) |
| | |
| | | <el-table-column prop="levelTwoType" label="二级类别" /> |
| | | <el-table-column prop="uploadUser" label="上传者" /> |
| | | <el-table-column prop="createTime" label="上传时间" /> |
| | | <el-table-column label="操作" width="150" align="center"> |
| | | <template #default="scope"> |
| | | <span class="look" @click="clickDetail(scope.row)" v-if="permission.helpCenterLook" |
| | | >查看</span |
| | | > |
| | | <el-upload |
| | | style="display: inline-block" |
| | | :show-file-list="false" |
| | | :before-upload="file => onUploadFileBefore(file, scope.row)" |
| | | :limit="1" |
| | | accept=".pdf" |
| | | > |
| | | <span class="uploads" v-if="permission.helpCenterUpload">上传</span> |
| | | </el-upload> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" width="200" align="center"> |
| | | <template #default="scope"> |
| | | <div class="actionBar" > |
| | | <el-button |
| | | class="look" |
| | | icon="el-icon-view" |
| | | type="text" |
| | | @click="clickDetail(scope.row)" |
| | | v-if="permission.helpCenterLook" |
| | | > |
| | | 查看 |
| | | </el-button> |
| | | <el-upload |
| | | style="display: inline-block" |
| | | :show-file-list="false" |
| | | :before-upload="file => onUploadFileBefore(file, scope.row)" |
| | | :limit="1" |
| | | accept=".pdf" |
| | | > |
| | | <el-button |
| | | class="uploads" |
| | | icon="el-icon-upload" |
| | | type="text" |
| | | v-if="permission.helpCenterUpload" |
| | | > |
| | | 上传 |
| | | </el-button> |
| | | </el-upload> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | </basic-container> |
| | |
| | | .helpContainer { |
| | | height: 100%; |
| | | .look { |
| | | font-family: Source Han Sans CN, Source Han Sans CN; |
| | | color: #1c5cff; |
| | | // font-family: Source Han Sans CN, Source Han Sans CN; |
| | | // color: #1c5cff; |
| | | cursor: pointer; |
| | | margin-right: 15px; |
| | | font-size: 14px; |
| | | // font-size: 14px; |
| | | } |
| | | .uploads { |
| | | font-family: Source Han Sans CN, Source Han Sans CN; |
| | | font-weight: 400; |
| | | font-size: 14px; |
| | | color: #19876d; |
| | | // font-family: Source Han Sans CN, Source Han Sans CN; |
| | | // font-weight: 400; |
| | | // font-size: 14px; |
| | | // color: #19876d; |
| | | cursor: pointer; |
| | | |
| | | } |
| | | .actionBar { |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | gap: 8px; |
| | | } |
| | | :deep(.custom-header th.el-table__cell) { |
| | | color: rgba(0, 0, 0, 0.85); |
| | |
| | | data () { |
| | | return { |
| | | form: {}, |
| | | query: {}, |
| | | query: { |
| | | }, |
| | | loading: true, |
| | | selectionList: [], |
| | | parentId: 0, |
| | |
| | | prop: 'sysType', |
| | | type: 'radio', |
| | | value: 1, |
| | | search: true, |
| | | searchSpan: 4, |
| | | dicData: [ |
| | | { |
| | | label: '后台管理', |
| | |
| | | { |
| | | label: '大屏', |
| | | value: 2, |
| | | }, |
| | | { |
| | | label: '移动app', |
| | | value: 3, |
| | | }, |
| | | ], |
| | | hide: true, |
| | |
| | | .namei { |
| | | margin-right: 5px; |
| | | } |
| | | </style> |
| | | </style> |
| | |
| | | column: [ |
| | | { |
| | | label: '到期时间', |
| | | labelWidth: 110, |
| | | prop: 'expireTime', |
| | | type: 'datetime', |
| | | format: 'YYYY-MM-DD HH:mm:ss', |
| | |
| | | }, |
| | | { |
| | | label: '次数限制', |
| | | labelWidth: 110, |
| | | prop: 'maxLoginNum', |
| | | type: 'input', |
| | | }, |
| | | |
| | | { |
| | | label: '飞行开始时间', |
| | | labelWidth: 110, |
| | | prop: 'flightStartTime', |
| | | type: 'time', |
| | | format: 'HH:mm', |
| | |
| | | }, |
| | | { |
| | | label: '飞行结束时间', |
| | | labelWidth: 110, |
| | | prop: 'flightEndTime', |
| | | type: 'time', |
| | | format: 'HH:mm', |
| | |
| | | |
| | | <el-col :span="3"> |
| | | <el-time-picker |
| | | style="width: 100px" |
| | | class="timeStyle" |
| | | :style="{width:pxToRem(140)}" |
| | | v-model="form.deal_time" |
| | | prop="deal_time" |
| | | value-format="HH:mm" |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | import { pxToRem, pxToRemNum } from '@/utils/rem' |
| | | import { calculateDefaultRange } from '@/utils/util'; |
| | | import { |
| | | getList, |
| | |
| | | :src="getThumbUrl(currentDetail.mediaUrl)" |
| | | :preview-src-list="[getPreviewUrl(currentDetail.mediaUrl)]" |
| | | fit="contain" |
| | | style="pxToRemNum(width: 700px); pxToRemNum(height: 520px); cursor: pointer" |
| | | style=" cursor: pointer" |
| | | > |
| | | <template #placeholder> |
| | | <div class="image-placeholder"> |
| | |
| | | import { onMounted } from 'vue' |
| | | import { useRouter } from 'vue-router' |
| | | import { useStore } from 'vuex' |
| | | |
| | | const userInfo = computed(() => store.getters.userInfo) |
| | | const todos = ref([]) |
| | | const loading = ref(false) |
| | | const router = useRouter() |
| | | const store = useStore() |
| | | const permission = computed(() => store.getters.permission) |
| | |
| | | ]) |
| | | |
| | | const titleClick = async (item, index) => { |
| | | todos.value =[] |
| | | checked.value = item.name |
| | | await getListMatter() |
| | | } |
| | | const userInfo = computed(() => store.getters.userInfo) |
| | | const todos = ref([]) |
| | | const loading = ref(false) |
| | | |
| | | // * 事件工单中2=待审核,0=待处理,3=处理中 |
| | | // * 智飞工单中1: 待审核,2=已驳回,3=已通过 |
| | | const statusMap = { |