刘妍 2025-06-12 17:36:14 +08:00
commit a219da084e
24 changed files with 1873 additions and 386 deletions

View File

@ -91,6 +91,7 @@
"bpmn-js-properties-panel": "^5.13.0",
"bpmn-js-token-simulation": "^0.33.1",
"ceel-json-editor": "^0.0.3",
"cesium": "^1.130.0",
"codemirror": "^5.65.16",
"cropperjs": "^1.6.1",
"crypto-js": "^4.2.0",
@ -99,11 +100,13 @@
"driver.js": "^1.3.1",
"echarts": "^5.4.3",
"element-plus": "^2.6.0",
"esbuild": "^0.19.12",
"exceljs": "^4.4.0",
"fabric": "^4.6.0",
"highlight.js": "^11.9.0",
"js-base64": "3.7.7",
"js-md5": "^0.8.3",
"jsencrypt": "^3.3.2",
"jszip": "^3.10.1",
"kml-geojson": "^1.2.2",
"localforage": "^1.10.0",
@ -138,6 +141,7 @@
"uuid": "^9.0.1",
"vditor": "^3.9.8",
"video.js": "^8.6.1",
"vite-plugin-cesium": "^1.2.23",
"vue": "3.3.4",
"vue-color-kit": "^1.0.6",
"vue-i18n": "^9.8.0",

View File

@ -1,5 +1,5 @@
export enum MapboxConfig {
ACCESS_TOKEN = 'pk.eyJ1IjoiemhhbmcxMjM4ODk5OSIsImEiOiJja3N5Ync1cXcyMTR2Mm9xempmbGE4MnBtIn0.R-j78CRvbs6JZG-MDSoh8Q',
ACCESS_TOKEN = 'pk.eyJ1IjoiY3VybXVkZ2VvbnBoZCIsImEiOiJjbHAxZXU2dmwwajV6MmxwZzRpdXhobjB2In0.uIuuAtk1EtV7HSbjpUfeOw',
// ACCESS_TOKEN = "1234",
TDT_TOKEN = 'b6585bc41ee16251dbe6b1af64f375d9',
// add more config options here

View File

@ -59,6 +59,15 @@
@ok="handleOk"
>
<Preview
v-if="nowPreviewRecord.type == 'img' || nowPreviewRecord.type == 'video'"
:nowPreviewRecord="nowPreviewRecord"
:previewRecordList="previewRecordList"
@chooseNowPreviewRecord="chooseNowPreviewRecord"
@closeModal="closeModal"
@reloadTable="reload"
/>
<ModelModal
v-if="nowPreviewRecord.type.includes('model')"
:nowPreviewRecord="nowPreviewRecord"
:previewRecordList="previewRecordList"
@chooseNowPreviewRecord="chooseNowPreviewRecord"
@ -93,6 +102,7 @@
import { CompressFileModal } from './modal/modal';
import { RenameModal } from './modal/modal';
import Preview from './preview/preview.vue';
import ModelModal from './priview2D3D/modelModal.vue';
import { PermissionBtn } from '@/components/PermissionBtn/index';
import { columns, searchFormSchema } from './modal.data';
import dayjs from 'dayjs';
@ -142,117 +152,125 @@
],
},
{
id: '1-2',
name: '南山风景照.jpg',
createTime: '2020-10-22 17:33:22',
type: 'img',
url: 'https://cdn.colorhub.me/QgpUMkZxNhU/rs:auto:0:500:0/g:ce/fn:colorhub/bG9jYWw6Ly8vZmIvNmYvMjlkMTE1NjRkNmI5ZmRhOTczYmU3ZmUyNmMyMDkwM2MwZjU5ZmI2Zi5qcGVn.webp',
imgtype: '原片',
taskname: '佛山大火救援项目',
airlineName: '火灾救援勘查航线',
width: 889,
height: 500,
size: '6.2M',
photographFeiji: '救援机1007',
photographNumber: 'GD610',
photographMan: 'zachzhou',
photographTime: '2020-10-22 00:00:00',
label: ['人', '车'],
lat: 35.362625,
lng: 118.033886,
canvasJson:
'{"version":"4.6.0","objects":[{"type":"path","version":"4.6.0","originX":"left","originY":"top","left":520.5,"top":634,"width":0,"height":0,"fill":null,"stroke":"#ffffff","strokeWidth":1,"strokeDashArray":null,"strokeLineCap":"round","strokeDashOffset":0,"strokeLineJoin":"round","strokeUniform":false,"strokeMiterLimit":10,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"shadow":null,"visible":true,"backgroundColor":"","fillRule":"nonzero","paintFirst":"fill","globalCompositeOperation":"source-over","skewX":0,"skewY":0,"path":[["M",520.999,634.5],["L",521.001,634.5]]},{"type":"rect","version":"4.6.0","originX":"left","originY":"top","left":523,"top":352.5,"width":100,"height":100,"fill":"#ffffff00","stroke":"#ffffff","strokeWidth":1,"strokeDashArray":null,"strokeLineCap":"butt","strokeDashOffset":0,"strokeLineJoin":"miter","strokeUniform":false,"strokeMiterLimit":4,"scaleX":0.73,"scaleY":0.73,"angle":0,"flipX":false,"flipY":false,"opacity":1,"shadow":null,"visible":true,"backgroundColor":"","fillRule":"nonzero","paintFirst":"fill","globalCompositeOperation":"source-over","skewX":0,"skewY":0,"rx":0,"ry":0},{"type":"textbox","version":"4.6.0","originX":"left","originY":"top","left":523,"top":426.5,"width":200,"height":22.6,"fill":"#ffffff","stroke":null,"strokeWidth":1,"strokeDashArray":null,"strokeLineCap":"butt","strokeDashOffset":0,"strokeLineJoin":"miter","strokeUniform":false,"strokeMiterLimit":4,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"shadow":null,"visible":true,"backgroundColor":"","fillRule":"nonzero","paintFirst":"fill","globalCompositeOperation":"source-over","skewX":0,"skewY":0,"fontFamily":"Times New Roman","fontWeight":"normal","fontSize":20,"text":"太阳","underline":false,"overline":false,"linethrough":false,"textAlign":"left","fontStyle":"normal","lineHeight":1.16,"textBackgroundColor":"","charSpacing":0,"styles":{},"direction":"ltr","path":null,"pathStartOffset":0,"pathSide":"left","minWidth":20,"splitByGrapheme":false},{"type":"path","version":"4.6.0","originX":"left","originY":"top","left":784,"top":436.5,"width":190.01,"height":85.01,"fill":null,"stroke":"#ffffff","strokeWidth":4,"strokeDashArray":null,"strokeLineCap":"round","strokeDashOffset":0,"strokeLineJoin":"round","strokeUniform":false,"strokeMiterLimit":10,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"shadow":null,"visible":true,"backgroundColor":"","fillRule":"nonzero","paintFirst":"fill","globalCompositeOperation":"source-over","skewX":0,"skewY":0,"path":[["M",785.996,438.496],["Q",786,438.5,786.5,438.5],["Q",787,438.5,790.5,440],["Q",794,441.5,798.5,443.5],["Q",803,445.5,808,448],["Q",813,450.5,820,453.5],["Q",827,456.5,880,480.5],["Q",933,504.5,940,508],["Q",947,511.5,952.5,514],["Q",958,516.5,962.5,518],["Q",967,519.5,970,521],["Q",973,522.5,974.5,523],["L",976.004,523.504]]},{"type":"path","version":"4.6.0","originX":"left","originY":"top","left":808,"top":417.5,"width":123.01,"height":124.01,"fill":null,"stroke":"#ffffff","strokeWidth":4,"strokeDashArray":null,"strokeLineCap":"round","strokeDashOffset":0,"strokeLineJoin":"round","strokeUniform":false,"strokeMiterLimit":10,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"shadow":null,"visible":true,"backgroundColor":"","fillRule":"nonzero","paintFirst":"fill","globalCompositeOperation":"source-over","skewX":0,"skewY":0,"path":[["M",933.004,419.496],["Q",933,419.5,931.5,420.5],["Q",930,421.5,928,425],["Q",926,428.5,921.5,433],["Q",917,437.5,914,441.5],["Q",911,445.5,905.5,450.5],["Q",900,455.5,894,462],["Q",888,468.5,883,473.5],["Q",878,478.5,872,484.5],["Q",866,490.5,861.5,495],["Q",857,499.5,851,504.5],["Q",845,509.5,841.5,513],["Q",838,516.5,833.5,520],["Q",829,523.5,826,526.5],["Q",823,529.5,820,533],["Q",817,536.5,815,538],["Q",813,539.5,812.5,540.5],["Q",812,541.5,811,542.5],["L",809.996,543.504]]}],"backgroundImage":{"type":"image","version":"4.6.0","originX":"left","originY":"top","left":0,"top":0,"width":889,"height":500,"fill":"rgb(0,0,0)","stroke":null,"strokeWidth":0,"strokeDashArray":null,"strokeLineCap":"butt","strokeDashOffset":0,"strokeLineJoin":"miter","strokeUniform":false,"strokeMiterLimit":4,"scaleX":1.46,"scaleY":1.6,"angle":0,"flipX":false,"flipY":false,"opacity":1,"shadow":null,"visible":true,"backgroundColor":"","fillRule":"nonzero","paintFirst":"fill","globalCompositeOperation":"source-over","skewX":0,"skewY":0,"cropX":0,"cropY":0,"src":"https://cdn.colorhub.me/QgpUMkZxNhU/rs:auto:0:500:0/g:ce/fn:colorhub/bG9jYWw6Ly8vZmIvNmYvMjlkMTE1NjRkNmI5ZmRhOTczYmU3ZmUyNmMyMDkwM2MwZjU5ZmI2Zi5qcGVn.webp","crossOrigin":null,"filters":[]}}',
id: '2',
name: '图片',
createtime: '2025-03-24 18:13:17',
type: 'folder',
children: [
{
id: '1-2',
name: '南山风景照.jpg',
createTime: '2020-10-22 17:33:22',
type: 'img',
url: 'https://cdn.colorhub.me/QgpUMkZxNhU/rs:auto:0:500:0/g:ce/fn:colorhub/bG9jYWw6Ly8vZmIvNmYvMjlkMTE1NjRkNmI5ZmRhOTczYmU3ZmUyNmMyMDkwM2MwZjU5ZmI2Zi5qcGVn.webp',
imgtype: '原片',
taskname: '佛山大火救援项目',
airlineName: '火灾救援勘查航线',
width: 889,
height: 500,
size: '6.2M',
photographFeiji: '救援机1007',
photographNumber: 'GD610',
photographMan: 'zachzhou',
photographTime: '2020-10-22 00:00:00',
label: ['人', '车'],
lat: 35.362625,
lng: 118.033886,
canvasJson:
'{"version":"4.6.0","objects":[{"type":"path","version":"4.6.0","originX":"left","originY":"top","left":520.5,"top":634,"width":0,"height":0,"fill":null,"stroke":"#ffffff","strokeWidth":1,"strokeDashArray":null,"strokeLineCap":"round","strokeDashOffset":0,"strokeLineJoin":"round","strokeUniform":false,"strokeMiterLimit":10,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"shadow":null,"visible":true,"backgroundColor":"","fillRule":"nonzero","paintFirst":"fill","globalCompositeOperation":"source-over","skewX":0,"skewY":0,"path":[["M",520.999,634.5],["L",521.001,634.5]]},{"type":"rect","version":"4.6.0","originX":"left","originY":"top","left":523,"top":352.5,"width":100,"height":100,"fill":"#ffffff00","stroke":"#ffffff","strokeWidth":1,"strokeDashArray":null,"strokeLineCap":"butt","strokeDashOffset":0,"strokeLineJoin":"miter","strokeUniform":false,"strokeMiterLimit":4,"scaleX":0.73,"scaleY":0.73,"angle":0,"flipX":false,"flipY":false,"opacity":1,"shadow":null,"visible":true,"backgroundColor":"","fillRule":"nonzero","paintFirst":"fill","globalCompositeOperation":"source-over","skewX":0,"skewY":0,"rx":0,"ry":0},{"type":"textbox","version":"4.6.0","originX":"left","originY":"top","left":523,"top":426.5,"width":200,"height":22.6,"fill":"#ffffff","stroke":null,"strokeWidth":1,"strokeDashArray":null,"strokeLineCap":"butt","strokeDashOffset":0,"strokeLineJoin":"miter","strokeUniform":false,"strokeMiterLimit":4,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"shadow":null,"visible":true,"backgroundColor":"","fillRule":"nonzero","paintFirst":"fill","globalCompositeOperation":"source-over","skewX":0,"skewY":0,"fontFamily":"Times New Roman","fontWeight":"normal","fontSize":20,"text":"太阳","underline":false,"overline":false,"linethrough":false,"textAlign":"left","fontStyle":"normal","lineHeight":1.16,"textBackgroundColor":"","charSpacing":0,"styles":{},"direction":"ltr","path":null,"pathStartOffset":0,"pathSide":"left","minWidth":20,"splitByGrapheme":false},{"type":"path","version":"4.6.0","originX":"left","originY":"top","left":784,"top":436.5,"width":190.01,"height":85.01,"fill":null,"stroke":"#ffffff","strokeWidth":4,"strokeDashArray":null,"strokeLineCap":"round","strokeDashOffset":0,"strokeLineJoin":"round","strokeUniform":false,"strokeMiterLimit":10,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"shadow":null,"visible":true,"backgroundColor":"","fillRule":"nonzero","paintFirst":"fill","globalCompositeOperation":"source-over","skewX":0,"skewY":0,"path":[["M",785.996,438.496],["Q",786,438.5,786.5,438.5],["Q",787,438.5,790.5,440],["Q",794,441.5,798.5,443.5],["Q",803,445.5,808,448],["Q",813,450.5,820,453.5],["Q",827,456.5,880,480.5],["Q",933,504.5,940,508],["Q",947,511.5,952.5,514],["Q",958,516.5,962.5,518],["Q",967,519.5,970,521],["Q",973,522.5,974.5,523],["L",976.004,523.504]]},{"type":"path","version":"4.6.0","originX":"left","originY":"top","left":808,"top":417.5,"width":123.01,"height":124.01,"fill":null,"stroke":"#ffffff","strokeWidth":4,"strokeDashArray":null,"strokeLineCap":"round","strokeDashOffset":0,"strokeLineJoin":"round","strokeUniform":false,"strokeMiterLimit":10,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"shadow":null,"visible":true,"backgroundColor":"","fillRule":"nonzero","paintFirst":"fill","globalCompositeOperation":"source-over","skewX":0,"skewY":0,"path":[["M",933.004,419.496],["Q",933,419.5,931.5,420.5],["Q",930,421.5,928,425],["Q",926,428.5,921.5,433],["Q",917,437.5,914,441.5],["Q",911,445.5,905.5,450.5],["Q",900,455.5,894,462],["Q",888,468.5,883,473.5],["Q",878,478.5,872,484.5],["Q",866,490.5,861.5,495],["Q",857,499.5,851,504.5],["Q",845,509.5,841.5,513],["Q",838,516.5,833.5,520],["Q",829,523.5,826,526.5],["Q",823,529.5,820,533],["Q",817,536.5,815,538],["Q",813,539.5,812.5,540.5],["Q",812,541.5,811,542.5],["L",809.996,543.504]]}],"backgroundImage":{"type":"image","version":"4.6.0","originX":"left","originY":"top","left":0,"top":0,"width":889,"height":500,"fill":"rgb(0,0,0)","stroke":null,"strokeWidth":0,"strokeDashArray":null,"strokeLineCap":"butt","strokeDashOffset":0,"strokeLineJoin":"miter","strokeUniform":false,"strokeMiterLimit":4,"scaleX":1.46,"scaleY":1.6,"angle":0,"flipX":false,"flipY":false,"opacity":1,"shadow":null,"visible":true,"backgroundColor":"","fillRule":"nonzero","paintFirst":"fill","globalCompositeOperation":"source-over","skewX":0,"skewY":0,"cropX":0,"cropY":0,"src":"https://cdn.colorhub.me/QgpUMkZxNhU/rs:auto:0:500:0/g:ce/fn:colorhub/bG9jYWw6Ly8vZmIvNmYvMjlkMTE1NjRkNmI5ZmRhOTczYmU3ZmUyNmMyMDkwM2MwZjU5ZmI2Zi5qcGVn.webp","crossOrigin":null,"filters":[]}}',
},
{
id: '1-3',
name: '风景图.jpg',
createTime: '2020-10-22 17:33:22',
type: 'img',
url: 'https://m.tuniucdn.com/fb2/t1/G5/M00/44/52/Cii-s1soezyIF2UxABn76u-yKl8AAIwBgB34jAAGfwC3020871',
imgtype: '原片2',
taskname: '佛山大火救援项目2',
airlineName: '火灾救援勘查航线2',
width: 2000,
height: 1334,
size: '1.63M',
photographFeiji: '救援机1008',
photographNumber: 'GD610',
photographMan: 'zachzhou',
photographTime: '2020-10-22 00:00:00',
label: ['人', '车'],
lat: 35.362625,
lng: 118.033886,
canvasJson:
'{"version":"4.6.0","objects":[],"backgroundImage":{"type":"image","version":"4.6.0","originX":"left","originY":"top","left":0,"top":0,"width":2000,"height":1334,"fill":"rgb(0,0,0)","stroke":null,"strokeWidth":0,"strokeDashArray":null,"strokeLineCap":"butt","strokeDashOffset":0,"strokeLineJoin":"miter","strokeUniform":false,"strokeMiterLimit":4,"scaleX":0.65,"scaleY":0.6,"angle":0,"flipX":false,"flipY":false,"opacity":1,"shadow":null,"visible":true,"backgroundColor":"","fillRule":"nonzero","paintFirst":"fill","globalCompositeOperation":"source-over","skewX":0,"skewY":0,"cropX":0,"cropY":0,"src":"https://m.tuniucdn.com/fb2/t1/G5/M00/44/52/Cii-s1soezyIF2UxABn76u-yKl8AAIwBgB34jAAGfwC3020871","crossOrigin":null,"filters":[]}}',
},
{
id: '1-4',
name: '红外照片.jpg',
createTime: '2020-10-22 17:33:22',
type: 'img',
url: 'https://pic.rmb.bdstatic.com/bjh/gallery/8c885a0e3cf0647b60548535e2e9ca39.jpeg',
imgtype: '红外照片',
taskname: '佛山大火救援项目-红外照片',
airlineName: '火灾救援勘查航线',
width: 640,
height: 480,
size: '6.2M',
photographFeiji: '救援机1007',
photographNumber: 'GD610',
photographMan: 'zachzhou',
photographTime: '2020-10-22 00:00:00',
label: ['人', '车'],
lat: 35.362625,
lng: 118.033886,
},
{
id: '1-5',
name: '广角照片.jpg',
createTime: '2020-10-22 17:33:22',
type: 'img',
url: 'https://img2.baidu.com/it/u=2490853491,3226002419&fm=253&fmt=auto&app=138&f=JPEG?w=749&h=500',
imgtype: '广角照片',
taskname: '佛山大火救援项目-广角照片',
airlineName: '火灾救援勘查航线',
width: 749,
height: 500,
size: '6.2M',
photographFeiji: '救援机1007',
photographNumber: 'GD610',
photographMan: 'zachzhou',
photographTime: '2020-10-22 00:00:00',
label: ['人', '车'],
lat: 35.362625,
lng: 118.033886,
},
{
id: '1-6',
name: '变焦照片.jpg',
createTime: '2020-10-22 17:33:22',
type: 'img',
url: 'https://img2.baidu.com/it/u=3778652155,475195343&fm=253&fmt=auto&app=138&f=PNG?w=500&h=518',
imgtype: '变焦照片',
taskname: '佛山大火救援项目-变焦照片',
airlineName: '火灾救援勘查航线',
width: 500,
height: 518,
size: '6.2M',
photographFeiji: '救援机1007',
photographNumber: 'GD610',
photographMan: 'zachzhou',
photographTime: '2020-10-22 00:00:00',
label: ['人', '车'],
lat: 35.362625,
lng: 118.033886,
},
],
},
{
id: '1-3',
name: '风景图.jpg',
createTime: '2020-10-22 17:33:22',
type: 'img',
url: 'https://m.tuniucdn.com/fb2/t1/G5/M00/44/52/Cii-s1soezyIF2UxABn76u-yKl8AAIwBgB34jAAGfwC3020871',
imgtype: '原片2',
taskname: '佛山大火救援项目2',
airlineName: '火灾救援勘查航线2',
width: 2000,
height: 1334,
size: '1.63M',
photographFeiji: '救援机1008',
photographNumber: 'GD610',
photographMan: 'zachzhou',
photographTime: '2020-10-22 00:00:00',
label: ['人', '车'],
lat: 35.362625,
lng: 118.033886,
canvasJson:
'{"version":"4.6.0","objects":[],"backgroundImage":{"type":"image","version":"4.6.0","originX":"left","originY":"top","left":0,"top":0,"width":2000,"height":1334,"fill":"rgb(0,0,0)","stroke":null,"strokeWidth":0,"strokeDashArray":null,"strokeLineCap":"butt","strokeDashOffset":0,"strokeLineJoin":"miter","strokeUniform":false,"strokeMiterLimit":4,"scaleX":0.65,"scaleY":0.6,"angle":0,"flipX":false,"flipY":false,"opacity":1,"shadow":null,"visible":true,"backgroundColor":"","fillRule":"nonzero","paintFirst":"fill","globalCompositeOperation":"source-over","skewX":0,"skewY":0,"cropX":0,"cropY":0,"src":"https://m.tuniucdn.com/fb2/t1/G5/M00/44/52/Cii-s1soezyIF2UxABn76u-yKl8AAIwBgB34jAAGfwC3020871","crossOrigin":null,"filters":[]}}',
},
{
id: '1-4',
name: '红外照片.jpg',
createTime: '2020-10-22 17:33:22',
type: 'img',
url: 'https://pic.rmb.bdstatic.com/bjh/gallery/8c885a0e3cf0647b60548535e2e9ca39.jpeg',
imgtype: '红外照片',
taskname: '佛山大火救援项目-红外照片',
airlineName: '火灾救援勘查航线',
width: 640,
height: 480,
size: '6.2M',
photographFeiji: '救援机1007',
photographNumber: 'GD610',
photographMan: 'zachzhou',
photographTime: '2020-10-22 00:00:00',
label: ['人', '车'],
lat: 35.362625,
lng: 118.033886,
},
{
id: '1-5',
name: '广角照片.jpg',
createTime: '2020-10-22 17:33:22',
type: 'img',
url: 'https://img2.baidu.com/it/u=2490853491,3226002419&fm=253&fmt=auto&app=138&f=JPEG?w=749&h=500',
imgtype: '广角照片',
taskname: '佛山大火救援项目-广角照片',
airlineName: '火灾救援勘查航线',
width: 749,
height: 500,
size: '6.2M',
photographFeiji: '救援机1007',
photographNumber: 'GD610',
photographMan: 'zachzhou',
photographTime: '2020-10-22 00:00:00',
label: ['人', '车'],
lat: 35.362625,
lng: 118.033886,
},
{
id: '1-6',
name: '变焦照片.jpg',
createTime: '2020-10-22 17:33:22',
type: 'img',
url: 'https://img2.baidu.com/it/u=3778652155,475195343&fm=253&fmt=auto&app=138&f=PNG?w=500&h=518',
imgtype: '变焦照片',
taskname: '佛山大火救援项目-变焦照片',
airlineName: '火灾救援勘查航线',
width: 500,
height: 518,
size: '6.2M',
photographFeiji: '救援机1007',
photographNumber: 'GD610',
photographMan: 'zachzhou',
photographTime: '2020-10-22 00:00:00',
label: ['人', '车'],
lat: 35.362625,
lng: 118.033886,
},
{
id: '41',
id: '3',
name: '视频',
createtime: '2025-03-24 18:13:17',
type: 'folder',
children: [
{
id: '4-4',
id: '3-4',
name: 'XZD153狼窝沟西南',
createTime: '',
type: 'video',
@ -260,7 +278,7 @@
manufacturer: '海康',
},
{
id: '4-5',
id: '3-5',
name: '费县马庄镇陈家鱼后村南斜坡后村',
createTime: '',
type: 'video',
@ -268,7 +286,7 @@
manufacturer: '腾讯',
},
{
id: '4-6',
id: '3-6',
name: '可落',
createTime: '',
type: 'video',
@ -276,7 +294,7 @@
manufacturer: '乐橙',
},
{
id: '4-7',
id: '3-7',
name: '费县薛庄镇东张林村村南可见光',
createTime: '',
type: 'video',
@ -285,6 +303,44 @@
},
],
},
{
id: '4',
name: '模型',
createtime: '2025-03-24 18:13:17',
type: 'folder',
children: [
{
id: '4-1',
name: '天空之城 二维模型',
createtime: '2025-03-24 18:13:17',
type: 'model2D',
url: 'https://m.tuniucdn.com/fb2/t1/G5/M00/44/52/Cii-s1soezyIF2UxABn76u-yKl8AAIwBgB34jAAGfwC3020871',
boundary: {
end_lat: 22.57965964566081,
end_lng: 113.93899440765381,
max_level: 23,
min_level: 12,
start_lat: 22.578193485606185,
start_lng: 113.93697738647461,
},
},
{
id: '4-2',
name: '天空之城 三维模型',
createtime: '2025-03-24 18:13:17',
type: 'model3D',
url: 'https://m.tuniucdn.com/fb2/t1/G5/M00/44/52/Cii-s1soezyIF2UxABn76u-yKl8AAIwBgB34jAAGfwC3020871',
boundary: {
end_lat: 22.57965964566081,
end_lng: 113.93899440765381,
max_level: 23,
min_level: 12,
start_lat: 22.578193485606185,
start_lng: 113.93697738647461,
},
},
],
},
]);
const tableType = ref('table');
@ -301,15 +357,6 @@
},
rowSelection: {
type: 'checkbox',
// onChange: (selectedRowKeys, selectedRows) => {
// console.log(selectedRowKeys, selectedRows);
// },
// onSelect: (record, selected, selectedRows) => {
// console.log(record, selected, selectedRows);
// },
// onSelectAll: (selected, selectedRows, changeRows) => {
// console.log(selected, selectedRows, changeRows);
// },
},
striped: false,
bordered: false,

View File

@ -1,261 +1,97 @@
<template>
<div
style="position: relative; height: 100%"
ref="vChartRef"
:id="'mars3d-container-' + name"
></div>
<div :id="mapId" class="map"> </div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import * as mars3d from 'mars3d';
import { useModal } from '@/components/Modal';
import { EventBus } from '@/utils/eventBus';
import { defineProps, ref, onMounted, onUnmounted, defineEmits, computed } from 'vue';
import { v4 as uuidv4 } from 'uuid';
import mapboxgl, { Map } from 'mapbox-gl';
import { MapboxConfig, MapboxDefaultStyle } from '@/components/MapboxMaps/src/config';
import axios from 'axios';
import {
ExpandOutlined,
CompressOutlined,
PlusOutlined,
MinusOutlined,
HeatMapOutlined,
} from '@ant-design/icons-vue';
const [editModal, { openModal: openEidtModal }] = useModal();
let map: mars3d.Map; //
let mapIns: any = null;
let markers: any = [];
let AMapIns: any = null;
const vChartRef = ref<HTMLElement>();
const props = defineProps(['nowPreviewRecord']);
const emits = defineEmits(['getMap']);
const mapId = `modal-map-${uuidv4()}`;
const networkType = ref('WAN');
let map: Map;
const initMap = () => {
let mapDataSources: any = {
'raster-tiles': {
type: 'raster',
tiles: [
`http://t0.tianditu.gov.cn/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=${MapboxConfig.TDT_TOKEN}`,
],
tileSize: 256,
minzoom: 1,
maxzoom: 17,
},
'raster-tiles-font': {
type: 'raster',
tiles: [
`https://t0.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=${MapboxConfig.TDT_TOKEN}`,
],
tileSize: 256,
},
};
let mapDataLayers: any = [
{
id: 'tdt-vec-tiles',
type: 'raster',
source: 'raster-tiles-font',
},
{
id: 'tdt-img-tiles',
type: 'raster',
source: 'raster-tiles',
},
];
return new mapboxgl.Map({
container: mapId,
language: 'zh-cmn',
projection: 'equirectangular', // wgs84
style: {
glyphs: 'mapbox://fonts/mapbox/{fontstack}/{range}.pbf',
version: 8,
sources: mapDataSources,
layers: mapDataLayers,
},
maxZoom: 22,
minZoom: 8,
pitch: 0,
zoom: 14,
center: [117.984425, 35.270654],
});
};
onMounted(() => {
let options = {
scene: {
center: {
lat: props.nowPreviewRecord.lat,
lng: props.nowPreviewRecord.lng,
alt: 8306.3,
heading: 360,
pitch: -45,
},
scene3DOnly: false,
shadows: false,
removeDblClick: true,
sceneMode: 3,
showSun: true,
showMoon: true,
showSkyBox: true,
showSkyAtmosphere: true,
fog: true,
fxaa: true,
requestRenderMode: true,
contextOptions: {
requestWebgl1: false,
webgl: {
preserveDrawingBuffer: true,
alpha: false,
stencil: true,
powerPreference: 'high-performance',
},
},
globe: {
depthTestAgainstTerrain: false,
baseColor: '#546a53',
showGroundAtmosphere: true,
enableLighting: false,
},
cameraController: {
zoomFactor: 3,
minimumZoomDistance: 1,
maximumZoomDistance: 50000000,
enableRotate: true,
enableTranslate: true,
enableTilt: true,
enableZoom: true,
enableCollisionDetection: true,
minimumCollisionTerrainHeight: 15000,
},
},
control: {
homeButton: false,
baseLayerPicker: false,
sceneModePicker: false,
vrButton: false,
fullscreenButton: false,
navigationHelpButton: false,
animation: false,
timeline: false,
infoBox: false,
geocoder: false,
selectionIndicator: false,
showRenderLoopErrors: true,
contextmenu: {
hasDefault: true,
},
mouseDownView: true,
zoom: {
insertIndex: 1,
},
},
method: {
templateValues: {
dataServer: '//data.mars3d.cn',
gltfServerUrl: '//data.mars3d.cn/gltf',
},
},
terrain: {
url: '//data.mars3d.cn/terrain',
show: true,
clip: true,
},
basemaps: [
{
id: 10,
name: '地图底图',
type: 'group',
opacity: 1,
},
{
id: 2021,
pid: 10,
name: '天地图影像',
icon: 'https://data.mars3d.cn/img/thumbnail/basemap/tdt_img.png',
type: 'group',
layers: [
{
name: '底图',
type: 'tdt',
layer: 'img_d',
eventParent: {
id: 2021,
pid: 10,
name: '天地图影像',
icon: 'https://data.mars3d.cn/img/thumbnail/basemap/tdt_img.png',
type: 'group',
layers: [
{
name: '底图',
type: 'tdt',
layer: 'img_d',
show: true,
},
{
name: '注记',
type: 'tdt',
layer: 'img_z',
show: true,
},
],
show: true,
},
private: false,
id: 'm-a57ecb7d-ba05-47a3-b1be-2e28411a5954',
opacity: 1,
pid: 2021,
parent: {
id: 2021,
pid: 10,
name: '天地图影像',
icon: 'https://data.mars3d.cn/img/thumbnail/basemap/tdt_img.png',
type: 'group',
layers: [
{
name: '底图',
type: 'tdt',
layer: 'img_d',
show: true,
},
{
name: '注记',
type: 'tdt',
layer: 'img_z',
show: true,
},
],
show: true,
},
zIndex: 1,
},
{
name: '注记',
type: 'tdt',
layer: 'img_z',
eventParent: {
id: 2021,
pid: 10,
name: '天地图影像',
icon: 'https://data.mars3d.cn/img/thumbnail/basemap/tdt_img.png',
type: 'group',
layers: [
{
name: '底图',
type: 'tdt',
layer: 'img_d',
show: true,
},
{
name: '注记',
type: 'tdt',
layer: 'img_z',
show: true,
},
],
show: true,
},
private: false,
id: 'm-671f9d42-dda7-45ec-9d0f-4259c915b2cb',
opacity: 1,
pid: 2021,
parent: {
id: 2021,
pid: 10,
name: '天地图影像',
icon: 'https://data.mars3d.cn/img/thumbnail/basemap/tdt_img.png',
type: 'group',
layers: [
{
name: '底图',
type: 'tdt',
layer: 'img_d',
show: true,
},
{
name: '注记',
type: 'tdt',
layer: 'img_z',
show: true,
},
],
show: true,
},
zIndex: 2,
},
],
show: true,
opacity: 1,
},
],
layers: [],
};
initMap(options);
mapboxgl.accessToken = MapboxConfig.ACCESS_TOKEN;
//
map = initMap();
});
const isFirstLoad = ref(true);
const initMap = (newData: any) => {
//
if (isFirstLoad.value) {
map = new mars3d.Map(vChartRef.value, newData);
} else {
//
map.setSceneOptions(newData.scene);
}
isFirstLoad.value = false;
};
function flyToPoint(data) {
map.flyToPoint(data, {
radius: 5000, //
duration: 4,
});
}
defineExpose({
flyToPoint,
onUnmounted(() => {
map && map.remove();
});
</script>
<style lang="less" scoped></style>
<style lang="scss" scoped>
.map {
position: relative;
width: 100%;
height: 100%;
}
::v-deep .mapboxgl-ctrl {
display: none !important;
}
</style>

View File

@ -59,6 +59,8 @@
const props = defineProps(['nowPreviewRecord', 'previewRecordList']);
const emit = defineEmits(['closeModal', 'chooseNowPreviewRecord', 'reloadTable']);
console.log(props.nowPreviewRecord);
//
function chooseNowPreviewRecord(value) {
emit('chooseNowPreviewRecord', value);
@ -75,7 +77,7 @@
<style lang="less">
.modal {
width: 100%;
height: 920px;
height: 1020px;
//
-webkit-user-select: none; /* Safari */
@ -107,7 +109,7 @@
}
.mainBody {
width: 100%;
height: 100%;
height: 1020px;
display: flex;
position: absolute;
top: 0px;
@ -115,7 +117,7 @@
.imgOrVideo {
width: 80%;
height: 920px;
height: 1020px;
background: #101010;
.image {

View File

@ -1,6 +1,6 @@
<template>
<div class="image">
<div class="canvas">
<div class="canvas" @mouseleave="document.body.style.cursor = 'auto'">
<div
ref="mouseCanvasRef"
@mousedown="onMouseDown"
@ -757,7 +757,7 @@
align-items: center;
justify-content: center;
width: 100%;
height: 820px;
height: 920px;
}
.bottom {

View File

@ -265,7 +265,7 @@
.map {
width: 100%;
height: 200px;
height: 300px;
margin-left: 10px;
}
</style>

View File

@ -41,5 +41,6 @@
import { MonitorQX } from './preview';
const props = defineProps(['nowPreviewRecord']);
console.log(props.nowPreviewRecord);
</script>
<style lang="less"></style>

View File

@ -0,0 +1,428 @@
<template>
<div class="model2D">
<div :id="mapId" class="map">
<!-- 全屏 -->
<div class="expandButton" @click="clickExpandButton">
<ExpandOutlined v-if="!fullscreenFlag" style="color: #3c3c3c; font-size: 25px" />
<CompressOutlined v-if="fullscreenFlag" style="color: #3c3c3c; font-size: 25px" />
</div>
<div class="angleViewButton">
<div class="button_child" @click="lookTopView">
<span style="color: #3c3c3c; font-size: 16px">顶视</span>
</div>
<div class="button_child" @click="lookDownView">
<span style="color: #3c3c3c; font-size: 16px">俯视</span>
</div>
</div>
<div class="plusAndMinusButton">
<div class="button_child" @click="clickPlusButton">
<PlusOutlined style="color: #3c3c3c; font-size: 25px" />
</div>
<div class="button_child" @click="clickMinusButton">
<MinusOutlined style="color: #3c3c3c; font-size: 25px" />
</div>
</div>
</div>
<div class="info">
<div class="left">键盘</div>
<div class="right4">123</div>
<div class="right3"> ASL: {{ asl }}m</div>
<div class="right2"> HAE: {{ hae }}m</div>
<div class="right1">
<HeatMapOutlined style="margin-right: 15px; font-size: 20px" />
WGS 84
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { defineProps, ref, onMounted, onUnmounted, defineEmits, computed } from 'vue';
import { v4 as uuidv4 } from 'uuid';
import mapboxgl, { Map } from 'mapbox-gl';
import { MapboxConfig, MapboxDefaultStyle } from '@/components/MapboxMaps/src/config';
import axios from 'axios';
import {
ExpandOutlined,
CompressOutlined,
PlusOutlined,
MinusOutlined,
HeatMapOutlined,
} from '@ant-design/icons-vue';
const props = defineProps(['nowPreviewRecord']);
const emits = defineEmits(['getMap']);
const mapId = `modal-map-${uuidv4()}`;
const networkType = ref('WAN');
let map: Map;
const initMap = () => {
// let mapDataSources: any = {
// 'raster-tiles': {
// type: 'raster',
// tiles: [
// `http://t0.tianditu.gov.cn/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=${MapboxConfig.TDT_TOKEN}`,
// ],
// tileSize: 256,
// minzoom: 1,
// maxzoom: 17,
// },
// 'raster-tiles-font': {
// type: 'raster',
// tiles: [
// `https://t0.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=${MapboxConfig.TDT_TOKEN}`,
// ],
// tileSize: 256,
// },
// };
// let mapDataLayers: any = [
// {
// id: 'tdt-vec-tiles',
// type: 'raster',
// source: 'raster-tiles-font',
// },
// {
// id: 'tdt-img-tiles',
// type: 'raster',
// source: 'raster-tiles',
// },
// ];
return new mapboxgl.Map({
container: mapId,
language: 'zh-cmn',
projection: 'equirectangular', // wgs84
// style: {
// glyphs: 'mapbox://fonts/mapbox/{fontstack}/{range}.pbf',
// version: 8,
// sources: mapDataSources,
// layers: mapDataLayers,
// },
style: {
version: 8,
sources: {},
layers: [
{
id: 'background',
type: 'background',
paint: {
'background-color': '#000', //
},
},
],
},
maxZoom: 22,
minZoom: 8,
pitch: 0,
zoom: 18,
center: props.nowPreviewRecord.boundary
? [
(props.nowPreviewRecord.boundary.start_lng + props.nowPreviewRecord.boundary.end_lng) /
2,
(props.nowPreviewRecord.boundary.start_lat + props.nowPreviewRecord.boundary.end_lat) /
2,
]
: [117.984425, 35.270654],
});
};
// 线 GeoJSON
function createGridFeatures() {
const features: any = [];
const gridSize = 10; // 10 线
for (let lat = -90; lat <= 90; lat += gridSize) {
features.push({
type: 'Feature',
geometry: {
type: 'LineString',
coordinates: [
[-180, lat],
[180, lat],
],
},
});
}
for (let lng = -180; lng <= 180; lng += gridSize) {
features.push({
type: 'Feature',
geometry: {
type: 'LineString',
coordinates: [
[lng, -90],
[lng, 90],
],
},
});
}
return { type: 'FeatureCollection', features: features };
}
onMounted(() => {
mapboxgl.accessToken = MapboxConfig.ACCESS_TOKEN;
//
// loadMapInfo();
map = initMap();
map.on('load', () => {
setImage(props.nowPreviewRecord.boundary);
move();
emits('getMap', map);
});
});
function setImage(boundary) {
let fourpoint: any = [
[parseFloat(boundary.start_lng), parseFloat(boundary.end_lat)],
[parseFloat(boundary.end_lng), parseFloat(boundary.end_lat)],
[parseFloat(boundary.end_lng), parseFloat(boundary.start_lat)],
[parseFloat(boundary.start_lng), parseFloat(boundary.start_lat)],
];
//
let image = new Image();
image.crossOrigin = 'anonymous';
image.src = props.nowPreviewRecord.url;
image.onload = () => {
// Canvas
const canvas = document.createElement('canvas');
canvas.width = image.width;
canvas.height = image.height;
// Canvas
const ctx = canvas.getContext('2d');
// Canvas
ctx.drawImage(image, 0, 0, image.width, image.height);
// CanvasURL
const dataURL = canvas.toDataURL('image/png');
//
if (map) {
if (map.getLayer('radar-layer')) {
map.removeLayer('radar-layer');
}
if (map.getSource('radar')) {
map.removeSource('radar');
}
}
//
map.addSource('radar', {
type: 'image',
url: dataURL,
coordinates: fourpoint,
});
map.addLayer({
id: 'radar-layer',
type: 'raster',
source: 'radar',
});
};
}
//
const fullscreenFlag = ref(false);
function clickExpandButton() {
const mapContainer = document.getElementById(mapId);
if (mapContainer) {
if (!document.fullscreenElement) {
mapContainer.requestFullscreen();
fullscreenFlag.value = true;
} else {
document.exitFullscreen();
fullscreenFlag.value = false;
}
}
}
//
function lookTopView() {
map.setPitch(0);
map.setBearing(0);
map.setZoom(18);
map.setCenter([
(parseFloat(props.nowPreviewRecord.boundary.start_lng) +
parseFloat(props.nowPreviewRecord.boundary.end_lng)) /
2,
(parseFloat(props.nowPreviewRecord.boundary.start_lat) +
parseFloat(props.nowPreviewRecord.boundary.end_lat)) /
2,
]);
}
//
function lookDownView() {
map.setPitch(60);
map.setBearing(0);
map.setZoom(18);
map.setCenter([
(parseFloat(props.nowPreviewRecord.boundary.start_lng) +
parseFloat(props.nowPreviewRecord.boundary.end_lng)) /
2,
(parseFloat(props.nowPreviewRecord.boundary.start_lat) +
parseFloat(props.nowPreviewRecord.boundary.end_lat)) /
2,
]);
}
//
function clickPlusButton() {
map.setZoom(map.getZoom() + 0.2);
}
//
function clickMinusButton() {
map.setZoom(map.getZoom() - 0.2);
}
const asl = ref(0);
const hae = ref(0);
function move() {
map.on('mousemove', (e) => {
const lngLat = e.lngLat;
asl.value = map.queryTerrainElevation(lngLat, { exaggerated: false }) || 0;
const geoidSeparation = 3.5;
hae.value = asl.value ? asl.value + geoidSeparation : 0;
});
}
onUnmounted(() => {
map && map.remove();
});
</script>
<style lang="scss" scoped>
.model2D {
position: relative;
width: 100%;
height: 100%;
.map {
position: relative;
width: 100%;
height: 100%;
//
.expandButton {
position: absolute;
right: 20px;
bottom: 29%;
z-index: 500;
background: #ffffff;
border-radius: 5px;
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
}
//
.angleViewButton {
z-index: 500;
position: absolute;
right: 20px;
bottom: 18%;
background: #ffffff;
border-radius: 5px;
width: 40px;
height: 80px;
display: block;
align-items: center;
justify-content: center;
}
//
.plusAndMinusButton {
z-index: 500;
position: absolute;
right: 20px;
bottom: 7%;
background: #ffffff;
border-radius: 5px;
width: 40px;
height: 80px;
display: block;
align-items: center;
justify-content: center;
}
}
.info {
//
-webkit-user-select: none; /* Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* IE/Edge */
user-select: none;
position: absolute;
width: 100%;
height: 4%;
bottom: 0px;
left: 0px;
display: flex;
.left {
position: absolute;
top: 0px;
left: 0px;
width: 150px;
color: #ffffff;
display: flex;
align-items: center;
justify-content: center;
}
.right4 {
position: absolute;
top: 0px;
right: 360px;
width: 120px;
color: #ffffff;
display: flex;
align-items: center;
justify-content: center;
}
.right3 {
position: absolute;
top: 0px;
right: 240px;
width: 120px;
color: #ffffff;
display: flex;
align-items: center;
justify-content: center;
}
.right2 {
position: absolute;
top: 0px;
right: 120px;
width: 120px;
color: #ffffff;
display: flex;
align-items: center;
justify-content: center;
}
.right1 {
position: absolute;
top: 0px;
right: 0px;
width: 120px;
color: #ffffff;
display: flex;
align-items: center;
justify-content: center;
}
}
}
.button_child {
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
}
::v-deep .mapboxgl-ctrl {
display: none !important;
}
</style>

View File

@ -0,0 +1,126 @@
<template>
<div id="mapContainer" class="map_container"></div>
</template>
<script setup lang="ts">
import { onMounted } from 'vue';
import * as Cesium from 'cesium';
//
window.CESIUM_BASE_URL = '/node_modules/cesium/Build/Cesium/';
const props = defineProps(['nowPreviewRecord']);
//
let originalModelMatrix: any = null;
// Cesium Viewer
let viewer,
tileset: Cesium.Viewer | null = null;
const initMap = async () => {
const container = document.getElementById('mapContainer');
if (!container) {
console.error('地图容器未找到');
return;
}
viewer = new Cesium.Viewer(container, {
//
animation: false, //
baseLayerPicker: false, //
fullscreenButton: false, //
vrButton: false, // VR
geocoder: false, //
homeButton: false, //
infoBox: false, // -
sceneModePicker: false, //
selectionIndicator: false, //
timeline: false, //
navigationHelpButton: false, //
navigationInstructionsInitiallyVisible: false, //
scene3DOnly: false, // 3D
});
// logo
viewer.cesiumWidget.creditContainer.style.display = 'none';
viewer.scene.globe.enableLighting = true;
//
// viewer.scene.skyBox.show = false;
//
viewer.scene.skyAtmosphere.show = false;
// viewer.scene.sun.show = false;
// viewer.scene.moon.show = false;
//
// viewer.scene.backgroundColor = Cesium.Color.BLACK;
//
// viewer.scene.globe.baseColor = Cesium.Color.BLACK; //
viewer.scene.globe.baseColor = new Cesium.Color(0.0, 0.1, 0.2, 1.0); //
// 齿
viewer.scene.postProcessStages.fxaa.enabled = true;
//
viewer.imageryLayers.remove(viewer.imageryLayers.get(0));
// -
viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(104.0, 30.0, 1000.0), //
orientation: {
heading: 0.0,
pitch: -Cesium.Math.PI_OVER_TWO,
roll: 0.0,
},
});
//
viewer.scene.globe.depthTestAgainstTerrain = true;
// //
const terrainProvider = await Cesium.CesiumTerrainProvider.fromIonAssetId(3956);
viewer.terrainProvider = terrainProvider;
//
viewer.scene.debugShowFramesPerSecond = false;
//
viewer.imageryLayers.addImageryProvider(
new Cesium.GridImageryProvider({
color: Cesium.Color.WHITE,
tileWidth: 1024,
tileHeight: 1024,
}),
);
try {
const token: any =
'MTc0NzAzNTY0MXxqTllDaTdBbWZ3V2xfeDVpdG9zeXBkMHhTdzFwTW52NVRVN1d0SlUzc0NtNEtoWjhvWHZoemZHMTdMSjNzV21oR2N2eG1DWTB0cWRNT0pHalVwZU44dDR2THQ0ZUoxNmdUNTYzanJHY0xDc1pHU21VaTRHaVRqSmRfTXRNWWpoUFZhSWlmM1ZxSF9mbmxpS0hnX01oM1AwNURXSW42bEF4ejhJakJHY0JrMVU3SW9DeUJjdjVPRjFSM2RXVWJxUGhxSG1zdmdzNGJkRUlqazg5RHR2ZU1ReUJoR2s1QUlza1ZsOHU3X09uZ0JXZ0JlRllGcGhYTm5GYVJHQ2xsSHFkUlNtT0ZIS0o5WVhUNXd4a2lRU2l3bEFBZy1lN2xQV1B6NDREVEw4VXUzbGhyTURZemhwdzBTWkx4VE4teUticnZ3Z1I2NDNTa2RPOXdJN2otTkl1d3Z6NW1WZUhBV2EtTEtkVTlNNUgwZlo2VWhmVHhpTTM5ZHhuSUpVcVdrZ25EbFJwX3hObVJDdXNjZV9YblZTMlIzQmJqVGVxeXBLTTZ0VjNiLUxSZTZlTDJwRGY3c2tzWkhDNnFYbjY4alF6ZWhWTGl2NVcxQ2puMmdZZnNLaWRpeEFFM1Bwc29fSHpnSG1JZlZJN1lpNHpySUkxQzJzQlpJblBxZUl1SWo1QnNYdFQzZz09fF0gZYXPxsQ97VL9k-DRWUeNh3Prfq8ceE2jnmaNJjuq';
const resource = new Cesium.Resource({
url: '/public/Project1 2/B3DM/Model_0/tileset.json',
// url: 'https://file-storage.djicdn.com/model/19ba187f-7675-49de-b576-b00ffffba78d/dafdb629-18bf-4eb5-b33f-55fa27f1483d/dd091ab4-d8c9-4e14-9c05-bce61e8a0338/%E5%A4%A7%E7%96%86%E5%A4%A9%E7%A9%BA%E4%B9%8B%E5%9F%8E_%E4%B8%89%E7%BB%B4%E6%A8%A1%E5%9E%8B%20%281%29/Project1%202/B3DM/ktx2_b3dms/BlockA/tileset-with-auth-key.json?auth_key=1746638980-0-0-4a3cf9893bb2e579e00633c51677db98&response-content-disposition=attachment&filename=%22tileset.json%22&filename*=utf-8%27%27tileset.json',
// headers: {
// 'x-auth-token': token,
// },
});
const tileset = await Cesium.Cesium3DTileset.fromUrl(resource);
console.log(tileset);
// 3DTilesID
tileset.style = new Cesium.Cesium3DTileStyle({
// 使
color: "color('white')",
});
//
originalModelMatrix = Cesium.Matrix4.clone(tileset.modelMatrix);
//
//
tileset.clampToGround = true;
viewer.scene.primitives.add(tileset);
viewer.zoomTo(tileset);
} catch (error) {
console.error('加载3D Tiles数据集失败:', error);
}
};
onMounted(() => {
initMap();
});
</script>
<style scoped>
.map_container {
width: 100%;
height: 100%;
}
::v-deep .cesium-widget-credits {
display: none !important;
}
</style>

View File

@ -0,0 +1,264 @@
<template>
<div class="modelDiv">
<div class="title">
<div class="title-1">{{ props.nowPreviewRecord.name }}</div>
<div class="title-2">
{{ props.nowPreviewRecord.createTime }}
</div>
</div>
<div class="closeButton">
<CloseOutlined @click="closeModal" style="font-size: 25px; color: white" />
</div>
<div class="modelDiv_2D3D">
<Model2D
v-if="props.nowPreviewRecord.type.includes('2D')"
:nowPreviewRecord="nowPreviewRecord"
/>
<Model3D
v-if="props.nowPreviewRecord.type.includes('3D')"
:nowPreviewRecord="nowPreviewRecord"
/>
</div>
<div class="modelDiv_bottom">
<div class="buttonList">
<!-- 下载 -->
<div class="button">
<DownloadOutlined @click="fetchAndDownloadImage(props.nowPreviewRecord.url)" />
</div>
<!-- 删除 -->
<div class="button"> <DeleteOutlined @click="deleteCanvas" /> </div>
</div>
<div class="imageList">
<div v-for="li in props.previewRecordList" :key="li.id" @click="chooseNowPreviewRecord(li)">
<div
v-if="li.type.includes('model')"
:class="li.id == props.nowPreviewRecord.id ? 'bottom_div_choose' : 'bottom_div'"
>
<FileOutlined style="font-size: 60px; color: white" />
<div
v-if="li.type.includes('2D')"
style="
position: absolute;
top: 20px;
left: 35px;
font-size: 25px;
color: #ffffff;
pointer-events: none;
"
>
2D
</div>
<div
v-if="li.type.includes('3D')"
style="
position: absolute;
top: 20px;
left: 35px;
justify-content: center;
font-size: 25px;
color: #ffffff;
pointer-events: none;
"
>
3D
</div>
</div>
</div>
</div>
</div>
<!-- 上一张下一张图片 -->
<div class="leftButton" @click="clickLeftOrRightButton('left')">
<LeftOutlined style="color: #ffffff; font-size: 30px" />
</div>
<div class="rightButton" @click="clickLeftOrRightButton('right')">
<RightOutlined style="color: #ffffff; font-size: 30px" />
</div>
</div>
</template>
<script lang="ts" setup>
import { ref, onMounted, watch, computed } from 'vue';
import {
CloseOutlined,
RightOutlined,
LeftOutlined,
DownloadOutlined,
DeleteOutlined,
FileOutlined,
} from '@ant-design/icons-vue';
import Model2D from './model2D.vue';
import Model3D from './model3D.vue';
const props = defineProps(['nowPreviewRecord', 'previewRecordList']);
const emit = defineEmits(['closeModal', 'chooseNowPreviewRecord', 'reloadTable']);
//
function clickLeftOrRightButton(direction) {
const list = props.previewRecordList.filter((item) => item.type.includes('model'));
for (let index = 0; index < list.length; index++) {
if (list[index].id == props.nowPreviewRecord.id) {
if (direction == 'left') {
if (index == 0) {
chooseNowPreviewRecord(list[list.length - 1]);
} else {
chooseNowPreviewRecord(list[index - 1]);
}
}
if (direction == 'right') {
if (index == list.length - 1) {
chooseNowPreviewRecord(list[0]);
} else {
chooseNowPreviewRecord(list[index + 1]);
}
}
}
}
}
//
function chooseNowPreviewRecord(value) {
emit('chooseNowPreviewRecord', value);
}
//
function closeModal() {
emit('closeModal');
}
</script>
<style lang="less" scoped>
.modelDiv {
position: relative;
width: 100%;
height: 1020px;
display: block;
}
.title {
pointer-events: none;
position: absolute;
top: 10px;
left: 15px;
z-index: 100;
.title-1 {
font-size: 20px;
color: #ffffff;
}
.title-2 {
font-size: 16px;
color: #f0f3f3;
}
}
.closeButton {
position: absolute;
top: 10px;
right: 15px;
z-index: 50;
}
.modelDiv_2D3D {
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 890px;
background: #000000;
}
.modelDiv_bottom {
//
-webkit-user-select: none; /* Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* IE/Edge */
user-select: none;
position: absolute;
bottom: 0px;
left: 0px;
width: 100%;
height: 130px;
background: #1c1c1c;
display: block;
.buttonList {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
width: 100%;
height: 50px;
.button {
position: relative;
padding-left: 10px;
padding-right: 10px;
color: #ffffff;
font-size: 22px;
}
}
.imageList {
display: inline-flex;
align-items: center;
justify-content: center;
width: 100%;
height: 60px;
.bottom_div {
position: relative;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 20px;
padding-right: 20px;
margin-left: 5px;
margin-right: 5px;
border-radius: 10px;
background: #282828;
}
.bottom_div_choose {
position: relative;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 20px;
padding-right: 20px;
outline: 3px solid #1088f2;
margin-left: 5px;
margin-right: 5px;
border-radius: 10px;
background: #282828;
}
}
}
//
.leftButton {
position: absolute;
left: 40px;
top: 40%;
z-index: 200;
background: #9c9c9c;
border-radius: 80px;
width: 80px;
height: 80px;
display: flex;
align-items: center;
justify-content: center;
}
.rightButton {
position: absolute;
right: 40px;
top: 40%;
z-index: 200;
background: #9c9c9c;
border-radius: 80px;
width: 80px;
height: 80px;
display: flex;
align-items: center;
justify-content: center;
}
</style>

View File

@ -1,10 +0,0 @@
// export { default as PreviewImage } from './previewImage.vue';
// export { default as PreviewCanvas } from './previewCanvas.vue';
// export { default as PreviewVideo } from './previewVideo.vue';
// export { default as PreviewInformation } from './previewInformation.vue';
// export { default as MonitorHK } from './video/monitorHK.vue';
// export { default as MonitorLC } from './video/monitorLC.vue';
// export { default as MonitorQX } from './video/monitorQX.vue';
// export { default as MonitorTX } from './video/monitorTX.vue';
// export { default as PanoViewer } from './PanoViewer.vue';
// export { default as Map } from './Map.vue';

View File

@ -1,5 +0,0 @@
<template>
<div> </div>
</template>
<script lang="ts" setup></script>
<style lang="less"></style>

View File

@ -0,0 +1,72 @@
<template>
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #toolbar>
<a-button type="primary">导出飞行器信息</a-button>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
icon: 'ant-design:edit-outlined',
onClick: () => {
},
},
{
color: 'error',
icon: 'ant-design:delete-outlined',
onClick: () => {
},
},
]"
/>
</template>
</template>
</BasicTable>
</template>
<script setup lang="ts">
import { h, } from "vue"
import { EditOutlined } from '@ant-design/icons-vue'
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { columns, dataSource, searchFormSchema } from './utils'
const [registerTable, { reload, expandAll, getForm}] = useTable({
title: '飞行器',
// api: (params) => LoadCaseInfoLists(type,params),
dataSource,
columns,
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
striped: false,
//
showIndexColumn: false,
// 使
useSearchForm: true,
//
showTableSetting: true,
bordered: true,
beforeFetch(data) {
let params = {...data}
if(!params.nowStatus){
params.nowStatus = '复提待审核'
}
return params
},
afterFetch(data) {
console.log('afterFetch', data);
},
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
},
handleSearchInfoFn(info) {
return info;
},
});
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,93 @@
import { BasicColumn, FormSchema } from '@/components/Table';
export const columns = [
{
title: '设备型号',
dataIndex: 'model',
},
{
title: '设备SN',
dataIndex: 'sn',
},
{
title: '设备名称',
dataIndex: 'name',
},
{
title: '固件版本',
dataIndex: 'version',
},
{
title: '在线状态',
dataIndex: 'status',
},
{
title: '所属项目',
dataIndex: 'project',
},
{
title: '加入组织时间',
dataIndex: 'join_time',
},
{
title: '在线时间',
dataIndex: 'online_time',
},
];
export const dataSource = [
{ model: 111, sn:222, name: 333, version: 444, status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, status: 555, project: 666, join_time: 777, online_time: 888 },
]
export const searchFormSchema: FormSchema[] = [
{
field: 'project',
label: '项目',
component: 'Select',
componentProps: {
options: [
],
},
colProps: { span: 4 },
},
{
field: 'status',
label: '当前状态',
component: 'Select',
componentProps: {
options: [
{ label: '在线', value: '在线' },
{ label: '离线', value: '离线' },
],
},
colProps: { span: 4 },
},
{
field: 'model',
label: '设备型号',
component: 'Select',
componentProps: {
options: [
],
},
colProps: { span: 4 },
},
{
field: 'sn',
label: '设备SN',
component: 'Input',
colProps: { span: 6 },
},
];

View File

@ -0,0 +1,40 @@
<template>
<div class="device-bind-content">
<p class="item-value">
请通过手机大疆行业 APP 或遥控器 DJI Pilot 2 的机场部署流程-云服务配置以组织ID和设备绑定码来绑定机场
</p>
<div class="show-item">
<div class="item-label">组织名称</div>
<div class="item-value">TEST</div>
</div>
<div class="show-item">
<div class="item-label">组织 ID</div>
<div class="item-value">XDX9VU</div>
</div>
<div class="show-item">
<div class="item-label">设备绑定码</div>
<div class="item-value">6473D312</div>
</div>
</div>
</template>
<script setup lang="ts">
import {} from "vue"
</script>
<style lang="scss" scoped>
.device-bind-content{
padding: 20px;
.item-value{
opacity: 0.7;
}
.show-item{
display: flex;
margin-bottom: 15px;
.item-label{
width: 150px;
text-align: left;
}
}
}
</style>

View File

@ -0,0 +1,67 @@
<template>
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
icon: 'ant-design:file-search-outlined',
onClick: () => {
},
},
{
icon: 'carbon:calendar-tools',
onClick: () => {
},
},
]"
/>
</template>
</template>
</BasicTable>
</template>
<script setup lang="ts">
import {} from "vue"
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { columns, dataSource, searchFormSchema } from './utils'
const [registerTable, { reload, expandAll, getForm}] = useTable({
title: '设备定损',
// api: (params) => LoadCaseInfoLists(type,params),
dataSource,
columns,
rowKey: 'id',
formConfig: {
labelWidth: 100,
schemas: searchFormSchema,
},
striped: false,
//
showIndexColumn: false,
// 使
useSearchForm: true,
//
showTableSetting: true,
bordered: true,
beforeFetch(data) {
let params = {...data}
if(!params.nowStatus){
params.nowStatus = '复提待审核'
}
return params
},
afterFetch(data) {
console.log('afterFetch', data);
},
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
},
handleSearchInfoFn(info) {
return info;
},
});
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,95 @@
import { BasicColumn, FormSchema } from '@/components/Table';
export const columns = [
{
title: '操作时间',
dataIndex: 'operate_time',
},
{
title: '定损类型',
dataIndex: 'problem_type',
},
{
title: '操作人',
dataIndex: 'user',
},
{
title: '设备型号',
dataIndex: 'model',
},
{
title: '设备SN',
dataIndex: 'sn',
},
{
title: '设备名称',
dataIndex: 'name',
},
{
title: '状态',
dataIndex: 'status',
},
];
export const dataSource = [
{ operate_time: 111, problem_type:222, user: 333, model: 444, sn:'1.0.0', name:'test', status: 555},
{ operate_time: 111, problem_type:222, user: 333, model: 444, sn:'1.0.0', name:'test', status: 555},
{ operate_time: 111, problem_type:222, user: 333, model: 444, sn:'1.0.0', name:'test', status: 555},
{ operate_time: 111, problem_type:222, user: 333, model: 444, sn:'1.0.0', name:'test', status: 555},
{ operate_time: 111, problem_type:222, user: 333, model: 444, sn:'1.0.0', name:'test', status: 555},
{ operate_time: 111, problem_type:222, user: 333, model: 444, sn:'1.0.0', name:'test', status: 555},
{ operate_time: 111, problem_type:222, user: 333, model: 444, sn:'1.0.0', name:'test', status: 555},
{ operate_time: 111, problem_type:222, user: 333, model: 444, sn:'1.0.0', name:'test', status: 555},
]
export const searchFormSchema: FormSchema[] = [
{
field: 'time',
component: 'RangePicker',
colProps: { span: 4 },
},
{
field: 'type',
label: '定损类型',
component: 'Select',
componentProps: {
options: [
{ label: '整机定损', value: '整机定损' },
{ label: '空调制冷模块定损', value: '空调制冷模块定损' },
{ label: '空调制热模块定损', value: '空调制热模块定损' },
{ label: '快速定损', value: '快速定损' },
],
},
colProps: { span: 4 },
},
{
field: 'user',
label: '操作员',
component: 'Select',
componentProps: {
options: [
],
},
colProps: { span: 4 },
},
{
field: 'status',
label: '状态',
component: 'Select',
componentProps: {
options: [
{ label: '待上传', value: '待上传' },
{ label: '数据处理', value: '数据处理' },
{ label: '上传中', value: '上传中' },
{ label: '上传完成', value: '上传完成' },
{ label: '上传失败', value: '上传失败' },
{ label: '已暂停', value: '已暂停' },
{ label: '已取消', value: '已取消' },
],
},
colProps: { span: 4 },
},
{
field: 'sn',
label: '设备SN',
component: 'Input',
colProps: { span: 6 },
},
];

View File

@ -0,0 +1,67 @@
<template>
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
icon: 'ant-design:file-search-outlined',
onClick: () => {
},
},
{
icon: 'carbon:calendar-tools',
onClick: () => {
},
},
]"
/>
</template>
</template>
</BasicTable>
</template>
<script setup lang="ts">
import {} from "vue"
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { columns, dataSource, searchFormSchema } from './utils'
const [registerTable, { reload, expandAll, getForm}] = useTable({
title: '日志反馈',
// api: (params) => LoadCaseInfoLists(type,params),
dataSource,
columns,
rowKey: 'id',
formConfig: {
labelWidth: 100,
schemas: searchFormSchema,
},
striped: false,
//
showIndexColumn: false,
// 使
useSearchForm: true,
//
showTableSetting: true,
bordered: true,
beforeFetch(data) {
let params = {...data}
if(!params.nowStatus){
params.nowStatus = '复提待审核'
}
return params
},
afterFetch(data) {
console.log('afterFetch', data);
},
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
},
handleSearchInfoFn(info) {
return info;
},
});
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,90 @@
import { BasicColumn, FormSchema } from '@/components/Table';
export const columns = [
{
title: '反馈时间',
dataIndex: 'feedback_time',
},
{
title: '反馈人',
dataIndex: 'feedback_user',
},
{
title: '设备型号',
dataIndex: 'model',
},
{
title: '设备SN',
dataIndex: 'sn',
},
{
title: '设备名称',
dataIndex: 'name',
},
{
title: '设备异常描述',
dataIndex: 'description',
},
{
title: '上传状态',
dataIndex: 'status',
},
];
export const dataSource = [
{ feedback_time: 111, feedback_user:222, model: 333, sn: 444, name:'1.0.0', description:'test', status: 555},
{ feedback_time: 111, feedback_user:222, model: 333, sn: 444, name:'1.0.0', description:'test', status: 555},
{ feedback_time: 111, feedback_user:222, model: 333, sn: 444, name:'1.0.0', description:'test', status: 555},
{ feedback_time: 111, feedback_user:222, model: 333, sn: 444, name:'1.0.0', description:'test', status: 555},
{ feedback_time: 111, feedback_user:222, model: 333, sn: 444, name:'1.0.0', description:'test', status: 555},
{ feedback_time: 111, feedback_user:222, model: 333, sn: 444, name:'1.0.0', description:'test', status: 555},
{ feedback_time: 111, feedback_user:222, model: 333, sn: 444, name:'1.0.0', description:'test', status: 555},
{ feedback_time: 111, feedback_user:222, model: 333, sn: 444, name:'1.0.0', description:'test', status: 555},
{ feedback_time: 111, feedback_user:222, model: 333, sn: 444, name:'1.0.0', description:'test', status: 555},
{ feedback_time: 111, feedback_user:222, model: 333, sn: 444, name:'1.0.0', description:'test', status: 555},
]
export const searchFormSchema: FormSchema[] = [
{
field: 'time',
component: 'RangePicker',
// componentProps: {
// options: [
// { label: '固件待升级', value: '固件待升级' },
// { label: '固件一致性升级', value: '固件一致性升级' },
// { label: '飞行安全数据库待升级', value: '飞行安全数据库待升级' },
// ],
// },
colProps: { span: 4 },
},
{
field: 'feedback_user',
label: '反馈人',
component: 'Select',
componentProps: {
options: [
],
},
colProps: { span: 4 },
},
{
field: 'status',
label: '状态',
component: 'Select',
componentProps: {
options: [
{ label: '待上传', value: '待上传' },
{ label: '数据处理', value: '数据处理' },
{ label: '上传中', value: '上传中' },
{ label: '上传完成', value: '上传完成' },
{ label: '上传失败', value: '上传失败' },
{ label: '已暂停', value: '已暂停' },
{ label: '已取消', value: '已取消' },
],
},
colProps: { span: 4 },
},
{
field: 'sn',
label: '设备SN',
component: 'Input',
colProps: { span: 6 },
},
];

View File

@ -0,0 +1,20 @@
<template>
<a-tabs v-model:activeKey="activeKey" class="device-tabs">
<a-tab-pane key="log" tab="日志反馈">
<LogFeedback />
</a-tab-pane>
<a-tab-pane key="equipment" tab="设备定损">
<Equipment />
</a-tab-pane>
</a-tabs>
</template>
<script setup lang="ts">
import { ref } from "vue"
import LogFeedback from './LogFeedback/index.vue'
import Equipment from './Equipment/index.vue'
const activeKey = ref('log')
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,101 @@
<template>
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #toolbar>
<a-button type="primary" @click="openFeedbackDrawer"></a-button>
<a-button type="primary" @click="openDeviceBindingModal"></a-button>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
icon: 'ant-design:file-search-outlined',
onClick: () => {
},
},
{
icon: 'carbon:calendar-tools',
onClick: () => {
},
},
]"
/>
</template>
</template>
</BasicTable>
<a-drawer class="feedback-drawer" v-model:open="feedbackDrawer" width="80%" :closable="false">
<FeedbackDrawer />
</a-drawer>
<a-modal v-model:open="deviceBindingModal" title="设备绑定码" @ok="handleOk">
<DeviceBindModal />
</a-modal>
</template>
<script setup lang="ts">
import { ref } from "vue"
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { columns, dataSource, searchFormSchema } from './utils'
import FeedbackDrawer from './FeedbackDrawer/index.vue'
import DeviceBindModal from './DeviceBindModal/index.vue'
const feedbackDrawer = ref(false)
const deviceBindingModal = ref(false)
const [registerTable, { reload, expandAll, getForm}] = useTable({
title: '机场',
// api: (params) => LoadCaseInfoLists(type,params),
dataSource,
columns,
rowKey: 'id',
formConfig: {
labelWidth: 100,
schemas: searchFormSchema,
},
striped: false,
//
showIndexColumn: false,
// 使
useSearchForm: true,
//
showTableSetting: true,
bordered: true,
beforeFetch(data) {
let params = {...data}
if(!params.nowStatus){
params.nowStatus = '复提待审核'
}
return params
},
afterFetch(data) {
console.log('afterFetch', data);
},
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
},
handleSearchInfoFn(info) {
return info;
},
});
const openFeedbackDrawer = () => {
feedbackDrawer.value = true
}
const openDeviceBindingModal = () => {
deviceBindingModal.value = true
}
</script>
<style lang="scss" scoped>
// .feedback-drawer{
// :deep(.ant-drawer-body){
// padding: 0px;
// }
// }
// </style>
// <style lang="scss">
// .feedback-drawer{
// .ant-drawer-body{
// padding: 0px;
// }
// }
</style>

View File

@ -0,0 +1,119 @@
import { BasicColumn, FormSchema } from '@/components/Table';
export const columns = [
{
title: '设备型号',
dataIndex: 'model',
},
{
title: '设备SN',
dataIndex: 'sn',
},
{
title: '设备名称',
dataIndex: 'name',
},
{
title: '固件版本',
dataIndex: 'version',
},
{
title: '固件升级',
dataIndex: 'upgrade',
},
{
title: '飞行安全数据库',
dataIndex: 'database',
},
{
title: '工作状态',
dataIndex: 'status',
},
{
title: '所属项目',
dataIndex: 'project',
},
{
title: '加入组织时间',
dataIndex: 'join_time',
},
{
title: '在线时间',
dataIndex: 'online_time',
},
];
export const dataSource = [
{ model: 111, sn:222, name: 333, version: 444, upgrade:'1.0.0', database:'test', status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, upgrade:'1.0.0', database:'test', status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, upgrade:'1.0.0', database:'test', status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, upgrade:'1.0.0', database:'test', status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, upgrade:'1.0.0', database:'test', status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, upgrade:'1.0.0', database:'test', status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, upgrade:'1.0.0', database:'test', status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, upgrade:'1.0.0', database:'test', status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, upgrade:'1.0.0', database:'test', status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, upgrade:'1.0.0', database:'test', status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, upgrade:'1.0.0', database:'test', status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, upgrade:'1.0.0', database:'test', status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, upgrade:'1.0.0', database:'test', status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, upgrade:'1.0.0', database:'test', status: 555, project: 666, join_time: 777, online_time: 888 },
{ model: 111, sn:222, name: 333, version: 444, upgrade:'1.0.0', database:'test', status: 555, project: 666, join_time: 777, online_time: 888 },
]
export const searchFormSchema: FormSchema[] = [
{
field: 'upgrade_status',
label: '升级状态',
component: 'Select',
componentProps: {
options: [
{ label: '固件待升级', value: '固件待升级' },
{ label: '固件一致性升级', value: '固件一致性升级' },
{ label: '飞行安全数据库待升级', value: '飞行安全数据库待升级' },
],
},
colProps: { span: 4 },
},
{
field: 'work_status',
label: '工作状态',
component: 'Select',
componentProps: {
options: [
{ label: '全部工作状态', value: '全部工作状态' },
{ label: '设备空闲中', value: '设备空闲中' },
{ label: '现场调试中', value: '现场调试中' },
{ label: '远程调试中', value: '远程调试中' },
{ label: '设备作业中', value: '设备作业中' },
{ label: '设备升级中', value: '设备升级中' },
{ label: '设备已离线', value: '设备已离线' },
{ label: '未标定', value: '未标定' },
],
},
colProps: { span: 4 },
},
{
field: 'project',
label: '项目',
component: 'Select',
componentProps: {
options: [
],
},
colProps: { span: 4 },
},
{
field: 'model',
label: '设备型号',
component: 'Select',
componentProps: {
options: [
],
},
colProps: { span: 4 },
},
{
field: 'sn',
label: '设备SN',
component: 'Input',
colProps: { span: 6 },
},
];

View File

@ -0,0 +1,30 @@
<template>
<div class="device-page">
<a-tabs v-model:activeKey="activeKey" class="device-tabs">
<a-tab-pane key="airport" tab="机场">
<Airport />
</a-tab-pane>
<a-tab-pane key="aerocraft" tab="飞行器">
<Aerocraft />
</a-tab-pane>
</a-tabs>
</div>
</template>
<script setup lang="ts">
import { ref } from "vue"
import Airport from './Airport/index.vue'
import Aerocraft from './Aerocraft/index.vue'
const activeKey = ref('airport')
</script>
<style lang="scss" scoped>
.device-page{
.device-tabs{
:deep(.ant-tabs-nav-wrap){
padding-left: 20px;
}
}
}
</style>