From f76b96c26b878840ecc80b79d1e28e477d5573e6 Mon Sep 17 00:00:00 2001
From: suerprisePlus <15810472099@163.com>
Date: 星期一, 01 七月 2024 18:10:25 +0800
Subject: [PATCH] 模型发布管理 添加

---
 src/views/iot/modelserver/index.vue      |  381 +++++++++++++++++++++++++++++
 src/views/visual/mapView/location.vue    |   79 +++++
 public/index.html                        |   12 
 src/views/iot/modelLibrary/index.vue     |   61 ++++
 src/utils/mapServer/mapServer.js         |    9 
 src/views/visual/atlas/index.vue         |    4 
 src/api/iot/modelServer.js               |    9 
 .env.development                         |    9 
 src/views/visual/mapView/index.vue       |   11 
 src/api/mapView/map.js                   |    6 
 public/config/config.js                  |    9 
 src/api/iot/modelLibrary.js              |   46 +++
 src/assets/js/mapSdk/menuManager.js      |   77 +++++
 src/views/visual/mapView/lineRoaming.vue |   61 ++++
 14 files changed, 742 insertions(+), 32 deletions(-)

diff --git a/.env.development b/.env.development
index 4b6b3bd..028b314 100644
--- a/.env.development
+++ b/.env.development
@@ -5,14 +5,17 @@
 ENV = 'development'
 
 # 寮�鍙戠幆澧�
-# VUE_APP_BASE_API = 'http://192.168.11.203/prod-api'
-# VUE_APP_BASE_API = '/dev-api/'
+
+# www api
+# VUE_APP_BASE_API = '/dev-api'
 VUE_APP_BASE_API = 'http://192.168.11.203:80/prod-api/'
 # 璺敱鎳掑姞杞�
 VUE_CLI_BABEL_TRANSPILE_MODULES = true
 
 # 鍚庣鎺ュ彛鍦板潃
-# VUE_APP_SERVER_API_URL = 'http://192.168.11.51:8080'
+# www api
+# VUE_APP_SERVER_API_URL = 'http://192.168.11.58:8080'
+
 VUE_APP_SERVER_API_URL = 'http://192.168.11.203:80'
 
 # Mqtt娑堟伅鏈嶅姟鍣ㄨ繛鎺ュ湴鍧�
diff --git a/public/config/config.js b/public/config/config.js
index a46bb66..e917262 100644
--- a/public/config/config.js
+++ b/public/config/config.js
@@ -1 +1,8 @@
-console.log(location)
\ No newline at end of file
+console.log(location);
+const host = location.origin;
+
+const config = {
+  apiServices: "http://192.168.11.24:12316/server/",
+  imageUrl: "",
+  sdkImg: host+"/visual/CimSDK/"
+};
diff --git a/public/index.html b/public/index.html
index b5c8c29..7080a55 100644
--- a/public/index.html
+++ b/public/index.html
@@ -8,12 +8,12 @@
   <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
   <link rel="icon" href="<%= BASE_URL %>logo.png">
 
-  <script src="CimSDK/Workers/jquery-3.5.0.min.js"></script>
-  <script src="CimSDK/Workers/layui/layui.js"></script>
-  <script src="CimSDK/CimSDK.min.js"></script>
-  <link rel="stylesheet" href="CimSDK/Workers/layui/css/layui.css">
-  <link rel="stylesheet" href="CimSDK/CimSDK.min.css">
-  <script src="./config/config.js"></script>
+  <script src="/visual/CimSDK/Workers/jquery-3.5.0.min.js"></script>
+  <script src="/visual/CimSDK/Workers/layui/layui.js"></script>
+  <script src="/visual/CimSDK/CimSDK.min.js"></script>
+  <link rel="stylesheet" href="/visual/CimSDK/Workers/layui/css/layui.css">
+  <link rel="stylesheet" href="/visual/CimSDK/CimSDK.min.css">
+  <script src="/config/config.js"></script>
   <title>
     <%= webpackConfig.name %>
   </title>
diff --git a/src/api/iot/modelLibrary.js b/src/api/iot/modelLibrary.js
index 2d62c5d..faa5085 100644
--- a/src/api/iot/modelLibrary.js
+++ b/src/api/iot/modelLibrary.js
@@ -52,10 +52,44 @@
         params: query,
     });
 }
-export function modelDownloadFile(query) {
-  return request({
-      url: 'model/downloadFile',
-      method: 'get',
-      params: query,
-  });
+export function modelDownloadFile(params) {
+    request.post('model/downloadFile', params, { responseType: 'blob' }).then((res) => {
+        const { data, headers } = res;
+        console.log(headers);
+        const fileName = headers['Content-Disposition'].replace(/\w+;filename=(.*)/, '$1');
+        const blob = new Blob([data], { type: headers['Content-Type'] });
+        let dom = document.createElement('a');
+        let url = window.URL.createObjectURL(blob);
+        dom.href = url;
+        dom.download = decodeURI(fileName);
+        dom.style.display = 'none';
+        document.body.appendChild(dom);
+        dom.click();
+        dom.parentNode.removeChild(dom);
+        window.URL.revokeObjectURL(url);
+    });
+    // return request({
+    //     url: 'model/downloadFile?guid=' + query,
+    //     responseType: 'blob',
+    // }).then((res) => {
+    //     const { data, headers } = res;
+    //     const fileName = headers['Content-Disposition'].replace(/\w+;filename=(.*)/, '$1');
+    //     const blob = new Blob([data], { type: headers['Content-Type'] });
+    //     let dom = document.createElement('a');
+    //     let url = window.URL.createObjectURL(blob);
+    //     dom.href = url;
+    //     dom.download = decodeURI(fileName);
+    //     dom.style.display = 'none';
+    //     document.body.appendChild(dom);
+    //     dom.click();
+    //     dom.parentNode.removeChild(dom);
+    //     window.URL.revokeObjectURL(url);
+    // });
+}
+export function modelDownloadetaReq(query) {
+    return request({
+        url: 'model/downloadMetaReq',
+        method: 'post',
+        data: query,
+    });
 }
diff --git a/src/api/iot/modelServer.js b/src/api/iot/modelServer.js
new file mode 100644
index 0000000..db372e3
--- /dev/null
+++ b/src/api/iot/modelServer.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request';
+
+export function modelSelectMetasByPage(query) {
+    return request({
+        url: 'model/selectMetasByPage',
+        method: 'get',
+        params: query,
+    });
+}
diff --git a/src/api/mapView/map.js b/src/api/mapView/map.js
new file mode 100644
index 0000000..72b9793
--- /dev/null
+++ b/src/api/mapView/map.js
@@ -0,0 +1,6 @@
+import mapServer from '../../utils/mapServer/mapServer';
+
+//閰嶇綉鎺ュ彛 => 鏌ヨ鎵�鏈�
+export function zhangzitou_selectAllLine(params) {
+    return mapServer.get('/zhangzitou/selectAllLine', { params: params });
+}
diff --git a/src/assets/js/mapSdk/menuManager.js b/src/assets/js/mapSdk/menuManager.js
index 523bcab..caf3ce7 100644
--- a/src/assets/js/mapSdk/menuManager.js
+++ b/src/assets/js/mapSdk/menuManager.js
@@ -1,5 +1,11 @@
 const menuManager = {
     pid: null,
+    pointFly: null,
+    colorAll: {
+        point: SmartEarth.Cesium.Color.fromCssColorString('#ff0000'),
+        polyline: SmartEarth.Cesium.Color.fromCssColorString('#ffff0050'),
+        polygon: SmartEarth.Cesium.Color.fromCssColorString('#ffff0050'),
+    },
     init(res) {
         switch (res.pid) {
             case 's1': //閰嶇綉宸℃
@@ -80,12 +86,30 @@
     setMenuS5(res) {
         switch (res.id) {
             case 'a1':
-            case 'a3':
+                if (this.pointFly) {
+                    this.pointFly.removeFromMap();
+                } else {
+                    earthCtrl.factory.createSimpleGraphic('billboard', {}, (entity) => {
+                        const position = entity.position.getValue();
+                        const coordinate = earthCtrl.core.toDegrees(position);
+                        this.pointFly = earthCtrl.camera.rotateCamera({
+                            lon: coordinate.lon,
+                            lat: coordinate.lat,
+                            distance: 1000,
+                            pitch: -30,
+                        });
+                    });
+                }
                 return null;
                 break;
             case 'a2':
                 return res.name;
                 break;
+            case 'a3':
+                earthCtrl.analysis.createIndoormode({ showHelp: true });
+                return null;
+                break;
+
             default:
                 return null;
                 break;
@@ -104,11 +128,60 @@
     },
     // 鏍囩粯
     setMenuS7(res) {
+        switch (res.id) {
+            case 'a1':
+                earthCtrl.factory.createSimpleGraphic('point', {}, (entity) => {});
+                break;
+            case 'a2':
+                earthCtrl.factory.createSimpleGraphic('label', {}, (entity) => {});
+                break;
+            case 'a3':
+                earthCtrl.factory.createSimpleGraphic('polyline', { showSize: false }, (entity) => {});
+                break;
+            case 'a4':
+                earthCtrl.factory.createSimpleGraphic('rectangle', { showSize: false }, (entity) => {});
+                break;
+            case 'a5':
+                earthCtrl.factory.createSimpleGraphic('polygon', { showSize: false }, (entity) => {});
+                break;
+            case 'a6':
+                earthCtrl.factory.SimpleGraphic.clear();
+                break;
+            default:
+                break;
+        }
         return null;
     },
     // 娴嬮噺
     setMenuS8(res) {
-        return null;
+        const colorAll = this.colorAll;
+        switch (res.id) {
+            case 'a1':
+                earthCtrl.measure.clampLineDistance(colorAll, (e) => {});
+                break;
+            case 'a2':
+                earthCtrl.measure.altitude(colorAll, (e) => {});
+                break;
+            case 'a3':
+                earthCtrl.measure.surfaceArea(
+                    {
+                        ...colorAll,
+                        tin: true, // 鏄惁鏄剧ずtin涓夎缃�
+                        onlyTerrain: false, // 鏄惁鍙祴閲忕簿缁嗗湴褰�
+                    },
+                    (e) => {}
+                );
+                break;
+            case 'a4':
+                earthCtrl.measure.planeArea(colorAll, (e) => {});
+                break;
+            case 'a5':
+                earthCtrl.measure.horizontalDistance(colorAll, (e) => {});
+                break;
+            case 'a6':
+                earthCtrl.measure.clearResult();
+                break;
+        }
     },
     // 鐗规晥
     setMenuS9(res) {
diff --git a/src/utils/mapServer/mapServer.js b/src/utils/mapServer/mapServer.js
new file mode 100644
index 0000000..85a9fa5
--- /dev/null
+++ b/src/utils/mapServer/mapServer.js
@@ -0,0 +1,9 @@
+import axios from "axios";
+const mapServer = axios.create({
+    // axios涓姹傞厤缃湁baseURL閫夐」锛岃〃绀鸿姹俇RL鍏叡閮ㄥ垎
+    baseURL: config.apiServices,
+    // 瓒呮椂
+    timeout: -1
+  });
+  export default mapServer;
+  
\ No newline at end of file
diff --git a/src/views/iot/modelLibrary/index.vue b/src/views/iot/modelLibrary/index.vue
index c657efc..a8e4aec 100644
--- a/src/views/iot/modelLibrary/index.vue
+++ b/src/views/iot/modelLibrary/index.vue
@@ -43,7 +43,8 @@
                                 v-hasPermi="['iot:modelLibrary:add']">淇敼</el-button> -->
                             <!-- <el-button size="small" type="danger" style="padding: 5px" icon="el-icon-delete"
                                 v-hasPermi="['iot:modelLibrary:remove']">鍒犻櫎</el-button> -->
-                            <el-button size="small" @click="setModelLibraryExport(scope.row)" type="warning" style="padding: 5px" icon="el-icon-download"
+                            <el-button size="small" @click="setModelLibraryExport(scope.row)" type="warning"
+                                style="padding: 5px" icon="el-icon-download"
                                 v-hasPermi="['iot:modelLibrary:export']">涓嬭浇</el-button>
                             <!-- <el-button size="small" type="success" style="padding: 5px"
                                 icon="el-icon-monitor">棰勮</el-button> -->
@@ -91,6 +92,8 @@
                 <el-button>鍙� 娑�</el-button>
             </div>
         </el-dialog>
+        <iframe id="downFrame" ref="myIfream" src=""
+            style="display: none; border: 0; padding: 0; height: 0; width: 0"></iframe>
     </div>
 </template>
 
@@ -103,9 +106,15 @@
     modelSelectMappers,
     modelInsertFiles,
     modelDeleteMetas,
-    modelDownloadFile
+    modelDownloadFile,
+    modelDownloadetaReq,
 } from '@/api/iot/modelLibrary';
+import { saveAs } from 'file-saver'
 import configTools from '../../../assets/js/configTools';
+import { getToken } from "@/utils/auth";
+import $ from 'jquery'
+import axios from 'axios';
+import request from '@/utils/request';
 export default {
     name: 'modelLibirary',
     dicts: ['iot_model_library_type'],
@@ -149,7 +158,8 @@
                 type: [{ required: true, message: '璇烽�夋嫨妯″瀷绫诲埆', trigger: 'change' }],
                 path: [{ required: true, message: '璇烽�夋嫨闇�瑕佷笂浼犵殑妯″瀷鏂囦欢', trigger: 'change' }],
             },
-            multipleSelection: []
+            multipleSelection: [],
+            headers: { Authorization: "Bearer " + getToken() },
         };
     },
     created() {
@@ -225,10 +235,43 @@
                 }
             })
         },
-        setModelLibraryExport(row){
-           modelDownloadFile({guid:row.guid}).then((response)=>{
-
-           })
+        setModelLibraryExport(row) {
+            modelDownloadetaReq({ ids: [row.id] }).then((response) => {
+                if (response.code == 200) {
+                    this.setModelDownloadFile(response.msg)
+                } else {
+                    this.$message(response.msg);
+                }
+            })
+        },
+        setModelDownloadFile(res) {
+            const url = process.env.VUE_APP_BASE_API + "model/downloadFile?&guid=" + res
+            axios.get(url, {
+                headers: {
+                    "Authorization": "Bearer " + getToken(),
+                    "Content-Type": "application/x-www-form-urlencoded",
+                },
+                responseType: "blob",
+            }).then(response => {
+                if (!response.headers) return
+                var elink = document.createElement('a');
+                //  浣跨敤鍚庣鎻愪緵鐨勬枃浠跺悕  鍛藉悕
+                const fileName = response.headers['content-disposition'].split("''")[1];
+                console.log(fileName);
+                elink.style.display = 'none';
+                // 鏂囦欢涓嬭浇鍦板潃璧嬪��
+                elink.href = window.URL.createObjectURL(response.data);
+                let str = fileName;
+                if (fileName.indexOf("UTF-8''") > -1) {
+                    str = fileName.replace("UTF-8''", '')
+                }
+                elink.download = str;
+                elink.click();
+                this.$message({
+                    message: '鏂囦欢瀵煎嚭鎴愬姛',
+                    type: 'success'
+                });
+            })
         },
         // 娣诲姞涓夌淮妯″瀷
         setModelLibraryAdd() {
@@ -241,8 +284,12 @@
             this.title = '';
             this.setFromRest();
             document.getElementById('fileInput').value = "";
+            this.selectMappers = null;
         },
         setSsubmitForm(formName) {
+            if (!this.selectMappers) {
+                this.$message('涓夌淮妯″瀷鏈笂浼犳棤娉曟柊澧�');
+            }
             this.$refs[formName].validate((valid) => {
                 if (valid) {
                     this.setModelInsertFiles(this.selectMappers)
diff --git a/src/views/iot/modelserver/index.vue b/src/views/iot/modelserver/index.vue
new file mode 100644
index 0000000..05fb740
--- /dev/null
+++ b/src/views/iot/modelserver/index.vue
@@ -0,0 +1,381 @@
+<template>
+    <div v-loading="loading" class="modelLibiraryBox">
+        <el-card>
+            <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px"
+                style="margin-bottom: -20px">
+                <el-form-item label="鏈嶅姟鍚嶇О" prop="name">
+                    <el-input v-model="queryParams.name" placeholder="璇疯緭鍏ユā鍨嬪悕绉�" clearable size="small"
+                        @keyup.enter.native="setQueryParamsQuery" />
+                </el-form-item>
+                <el-form-item label="鏈嶅姟绫诲埆" prop="type">
+
+                </el-form-item>
+                <el-form-item>
+                    <el-button type="primary" icon="el-icon-search" size="mini"
+                        @click="setQueryParamsQuery">鎼滅储</el-button>
+                    <el-button icon="el-icon-refresh" size="mini" @click="setQueryParamsRest">閲嶇疆</el-button>
+                </el-form-item>
+            </el-form>
+        </el-card>
+        <el-card class="modelLibiraryContent">
+            <div class="modelLibiraryTable">
+                <el-table :data="templateList" border @selection-change="handleSelectionChange">
+                    <el-table-column type="selection" width="55" />
+                    <el-table-column label="妯″瀷鍚嶇О" align="center" prop="name" />
+                    <el-table-column label="妯″瀷绫诲瀷" align="center" prop="type" />
+                    <el-table-column label="妯″瀷澶у皬" align="center" prop="sizes" :formatter="formatterSize" />
+                    <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" :formatter="formatterTime" />
+                    <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width" width="240">
+                        <template slot-scope="scope">
+
+                            <el-button v-show="!scope.row.url" size="small" @click="setModelLibraryExport(scope.row)"
+                                type="success" style="padding: 5px" icon="el-icon-position"
+                                v-hasPermi="['iot:modelLibrary:export']">鍙戝竷</el-button>
+
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </div>
+        </el-card>
+        <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body :close-on-click-modal="false">
+            <el-form ref="modelFrom" :model="modelFrom" :rules="rules" label-width="80px">
+                <!-- <el-form-item label="妯″瀷鍚嶇О" prop="name">
+                    <el-input v-model="modelFrom.name"></el-input>
+                </el-form-item> -->
+                <!-- <el-form-item label="妯″瀷绫诲埆" prop="type">
+                    <el-select v-model="modelFrom.type" style="width: 100%" placeholder="璇烽�夋嫨妯″瀷绫诲埆" clearable
+                        size="small">
+                        <el-option v-for="dict in dict.type.iot_model_library_type" :key="dict.value"
+                            :label="dict.label" :value="dict.value" />
+                    </el-select>
+                </el-form-item> -->
+                <el-form-item label="妯″瀷鍦板潃" prop="path">
+                    <div style="display: flex">
+                        <div style="flex: 1">
+                            <input style="display: none" @change="setFileChange" id="fileInput" type="file"
+                                accept=".zip"></input>
+                            <el-input disabled v-model="modelFrom.path" />
+                        </div>
+                        <div style="margin-left: 10px">
+                            <el-link style="margin: 0px 10px" title="閫夋嫨" :underline="false" icon="el-icon-plus"
+                                @click="setFileCheck"></el-link>
+                            <el-link style="margin: 0px 10px" title="涓婁紶" :underline="false" icon="el-icon-upload2"
+                                @click="setFileInset"></el-link>
+                        </div>
+                    </div>
+                </el-form-item>
+                <!-- <el-form-item label="鎻忚堪">
+                    <el-input v-model="modelFrom.bak"></el-input>
+                </el-form-item> -->
+            </el-form>
+            <div slot="footer" class="dialog-footer">
+                <!-- <el-button type="primary" v-show="modelFrom.ids">淇� 鏀�</el-button> -->
+                <el-button type="primary" @click="setSsubmitForm('modelFrom')">鏂� 澧�</el-button>
+                <el-button>鍙� 娑�</el-button>
+            </div>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+
+import configTools from '../../../assets/js/configTools';
+import { getToken } from "@/utils/auth";
+import {
+    modelSelectMetasByPage
+} from '@/api/iot/modelServer';
+
+export default {
+    name: 'modelserver',
+
+    data() {
+        return {
+            loading: false,
+            queryParams: {
+                pageIndex: 1,
+                pageSize: 10,
+                name: null,
+                type: null,
+            },
+            // 鏄惁涓虹鎴�
+            isTenant: false,
+            templateList: [
+
+            ],
+            // 鎬绘潯鏁�
+            total: 0,
+            title: '',
+            // 鏄惁鏄剧ず寮瑰嚭灞�
+            open: false,
+            modelFrom: {
+                name: '',
+                type: '',
+                path: '',
+                bak: '',
+                ids: '',
+            },
+            selectPath: null,
+            selectMappers: null,
+            //琛ㄥ崟楠岃瘉
+            rules: {
+                name: [
+                    {
+                        required: true,
+                        message: '妯″瀷鍚嶇О涓嶈兘涓虹┖',
+                        trigger: 'blur',
+                    },
+                ],
+                type: [{ required: true, message: '璇烽�夋嫨妯″瀷绫诲埆', trigger: 'change' }],
+                path: [{ required: true, message: '璇烽�夋嫨闇�瑕佷笂浼犵殑妯″瀷鏂囦欢', trigger: 'change' }],
+            },
+            multipleSelection: [],
+            headers: { Authorization: "Bearer " + getToken() },
+        };
+    },
+    created() {
+        this.init();
+    },
+    methods: {
+        init() {
+            if (this.$store.state.user.roles.indexOf('tenant') !== -1) {
+                this.isTenant = true;
+            }
+
+            this.getList();
+        },
+        getSelectPath() {
+            modelSelectPath().then((response) => {
+                if (response.code == 200 && response.msg) {
+                    this.selectPath = response.msg;
+                } else {
+                    this.$message('妯″瀷涓婁紶璺緞鑾峰彇澶辫触: ' + response.msg);
+                }
+            });
+        },
+        handleSelectionChange(val) {
+            this.multipleSelection = val;
+        },
+        //鏌ヨ
+        setQueryParamsQuery() {
+            this.queryParams.pageIndex = 1;
+            this.getList();
+        },
+        // 閲嶇疆
+        setQueryParamsRest() {
+            this.queryParams = {
+                pageIndex: 1,
+                pageSize: 10,
+                name: null,
+                type: null,
+            }
+            this.getList();
+        },
+        // 鎼滅储
+        getList() {
+            modelSelectMetasByPage(this.queryParams).then((response) => {
+                if (response.code == 200) {
+
+                    this.total = response.data.length;
+                    this.templateList = response.data;
+                } else {
+                    this.$message('妯″瀷鏁版嵁鍒楄〃鑾峰彇澶辫触銆�');
+                }
+            })
+        },
+        setModelLibraryRemove() {
+            if (this.multipleSelection.length <= 0) {
+                return this.$message('璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁');
+            }
+            const std = [];
+            this.multipleSelection.filter((response) => {
+                std.push(response.id);
+            })
+            modelDeleteMetas({ ids: std.toString() }).then((response) => {
+                if (response.code == 200) {
+                    this.$message({
+                        message: '涓夌淮妯″瀷鍒犻櫎鎴愬姛',
+                        type: 'success'
+                    });
+                    this.setQueryParamsQuery();
+                } else {
+                    this.$message('涓夌淮妯″瀷鍒犻櫎澶辫触');
+                }
+            })
+        },
+        setModelLibraryExport(row) {
+            modelDownloadetaReq({ ids: [row.id] }).then((response) => {
+                if (response.code == 200) {
+                    this.setModelDownloadFile(response.msg)
+                } else {
+                    this.$message(response.msg);
+                }
+            })
+        },
+        setModelDownloadFile(res) {
+            axios.get(process.env.VUE_APP_BASE_API + "model/downloadFile?guid=" + res, {
+                responseType: 'blob',
+                headers: this.headers
+            }).then((response) => {
+                if (response.status === 200) {
+                    var elink = document.createElement('a');
+                    console.log(response.headers['content-disposition']);
+                    debugger
+                    // 浣跨敤鍚庣鎻愪緵鐨勬枃浠跺悕  鍛藉悕
+                    // const fileName = response.headers['content-disposition'].split('=')[1];
+                    // elink.style.display = 'none';
+                    // // 鏂囦欢涓嬭浇鍦板潃璧嬪��
+                    // elink.href = window.URL.createObjectURL(response.data);
+                    // let str = fileName;
+                    // if (fileName.indexOf("UTF-8''") > -1) {
+                    //     str = fileName.replace("UTF-8''", '')
+                    // }
+                    // elink.download = str;
+                    // elink.click();
+                    // this.$message({
+                    //     message: '鏂囦欢瀵煎嚭鎴愬姛',
+                    //     type: 'success'
+                    // });
+                }
+            })
+        },
+        // 娣诲姞涓夌淮妯″瀷
+        setModelLibraryAdd() {
+            this.setFromRest();
+            this.open = true;
+            this.title = '娣诲姞涓夌淮妯″瀷';
+        },
+        setModelLibraryCannel() {
+            this.open = false;
+            this.title = '';
+            this.setFromRest();
+            document.getElementById('fileInput').value = "";
+            this.selectMappers = null;
+        },
+        setSsubmitForm(formName) {
+            if (!this.selectMappers) {
+                this.$message('涓夌淮妯″瀷鏈笂浼犳棤娉曟柊澧�');
+            }
+            this.$refs[formName].validate((valid) => {
+                if (valid) {
+                    this.setModelInsertFiles(this.selectMappers)
+                } else {
+                    console.log('error submit!!');
+                    return false;
+                }
+            });
+        },
+        setModelInsertFiles(res) {
+            modelInsertFiles(JSON.stringify(res)).then((response) => {
+                if (response.code == 200) {
+                    this.$message({
+                        message: '涓夌淮妯″瀷娣诲姞鎴愬姛',
+                        type: 'success'
+                    });
+                    this.setModelLibraryCannel();
+                    this.setQueryParamsQuery();
+                } else {
+                    this.$message('涓夌淮妯″瀷娣诲姞澶辫触');
+                }
+            })
+        },
+        // 鏂囦欢閫夋嫨
+        setFileCheck() {
+            document.getElementById('fileInput').click();
+        },
+
+        setFileChange() {
+            const inputFile = document.getElementById('fileInput').files;
+            if (inputFile.length > 0) {
+                this.modelFrom.path = inputFile[0].name;
+            } else {
+                this.$message('鑾峰彇涓婁紶鏂囦欢淇℃伅澶辫触锛岃閲嶆柊灏濊瘯');
+            }
+        },
+        // 鏂囦欢涓婁紶
+        setFileInset() {
+            if (!this.selectPath) {
+                this.getSelectPath();
+            }
+            var formData = new FormData();
+            const fs = document.getElementById('fileInput').files;
+            for (var i = 0, c = fs.length; i < c; i++) {
+                formData.append(fs[i].name, fs[i]); // fs.files[i].name,file
+            }
+            modelUploadFiles(this.selectPath, formData).then((response) => {
+                if (response.code == 200) {
+                    this.$message({
+                        message: '鏁版嵁涓婁紶鎴愬姛',
+                        type: 'success'
+                    });
+                    this.setModelSelectMappers()
+                } else {
+                    this.$message('鏁版嵁涓婁紶澶辫触');
+                }
+            })
+        },
+        setModelSelectMappers() {
+            if (!this.selectPath) {
+                this.getSelectPath();
+            }
+            this.selectMappers = null;
+            modelSelectMappers({ path: this.selectPath }).then((response) => {
+                if (response.code == 200) {
+                    this.selectMappers = response.data;
+                } else {
+                    this.$message('鏁版嵁鏄犲皠鏌ヨ澶辫触');
+                }
+            })
+        },
+        // 琛ㄥ崟閲嶇疆
+        setFromRest() {
+            this.modelFrom = {
+                name: '',
+                type: '',
+                path: '',
+                bak: '',
+                ids: '',
+            };
+        },
+        formatterSize(row, column, cellValue, index) {
+            return configTools.formatterSize(cellValue);
+        },
+        formatterTime(row, column, cellValue, index) {
+            if (cellValue) {
+                return configTools.formatterTime(cellValue);
+            } else {
+                return null
+            }
+
+        }
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+.modelLibiraryBox {
+    padding: 6px;
+    width: 100%;
+    height: 100%;
+    position: absolute;
+    display: flex;
+    flex-direction: column;
+
+    .modelLibiraryContent {
+        margin: 6px 0px;
+        flex: 1;
+        position: relative;
+
+        ::v-deep .el-card__body {
+            padding: 15px !important;
+        }
+
+        .modelLibiraryTable {
+            width: calc(100% - 30px);
+            height: calc(100% - 36px);
+            position: absolute;
+            display: flex;
+            flex-direction: column;
+        }
+    }
+}
+</style>
diff --git a/src/views/visual/atlas/index.vue b/src/views/visual/atlas/index.vue
index 090b4a0..a0e89d6 100644
--- a/src/views/visual/atlas/index.vue
+++ b/src/views/visual/atlas/index.vue
@@ -3,7 +3,9 @@
 </template>
 
 <script>
-export default {};
+export default {
+    
+};
 </script>
 
 <style lang="scss" scoped>
diff --git a/src/views/visual/mapView/index.vue b/src/views/visual/mapView/index.vue
index dcc3b89..a1378c1 100644
--- a/src/views/visual/mapView/index.vue
+++ b/src/views/visual/mapView/index.vue
@@ -31,6 +31,7 @@
             <layer-manager ref="layerManager"></layer-manager>
             <location ref="location"></location>
             <knowledge ref="knowledge"></knowledge>
+            <lineRoaming ref="lineRoaming"></lineRoaming>
         </div>
     </div>
 </template>
@@ -42,10 +43,11 @@
 import menuManager from '@/assets/js/mapSdk/menuManager.js';
 import location from './location.vue';
 import knowledge from './knowledge.vue';
+import lineRoaming from './lineRoaming.vue';
 
 export default {
     name: 'mapView',
-    components: { layerManager, location, knowledge },
+    components: { layerManager, location, knowledge, lineRoaming },
     data() {
         return {
             menuIsShow: false,
@@ -75,9 +77,7 @@
             this.setPopCloseAll();
             const obj = menuManager.init(command);
             if (obj) {
-                
                 this.setPopShow(obj);
-               
             }
         },
         setPopCloseAll() {
@@ -95,6 +95,9 @@
                     break;
                 case '鐭ヨ瘑鍥捐氨':
                     this.$refs && this.$refs.knowledge && this.$refs.knowledge.open();
+                    break;
+                case '绾胯矾婕父':
+                    this.$refs && this.$refs.lineRoaming && this.$refs.lineRoaming.open();
                     break;
                 default:
                     break;
@@ -114,7 +117,7 @@
 
     .menuBox {
         position: absolute;
-        z-index: 99999;
+        z-index: 40;
         top: 20px;
         right: 2px;
         border-radius: 0 6px 6px 0;
diff --git a/src/views/visual/mapView/lineRoaming.vue b/src/views/visual/mapView/lineRoaming.vue
new file mode 100644
index 0000000..8ba57cd
--- /dev/null
+++ b/src/views/visual/mapView/lineRoaming.vue
@@ -0,0 +1,61 @@
+<template>
+    <Popup ref="pop" top="20px" left="calc(100% - 600px)" :title="title" @close="close(true)" width="300px" :maxHeight="'700px'" @cancel="close(false)">
+         <div class="menuBox">
+            <el-form ref="form"   label-width="80px">
+              <el-form-item label="绾胯矾:">
+               
+              </el-form-item>
+              <el-form-item label="绾胯矾:">
+          
+              </el-form-item>
+              <el-form-item>
+                <el-button size="mini" >寮�濮嬫极娓�</el-button>
+                <el-button size="mini" >缁撴潫婕父</el-button>
+              </el-form-item>
+            </el-form>
+         </div>
+    </Popup>
+</template>
+
+<script>
+import Popup from '@/components/Tool/Popup.vue';
+import {
+    zhangzitou_selectAllLine
+} from '@/api/mapView/map.js'
+export default {
+    name: 'location',
+    components: { Popup },
+    data() {
+        return {
+            title: '绾胯矾婕父',
+        };
+    },
+   
+ 
+    methods: {
+        // 鍏抽棴寮圭獥
+        close(isCloseBtn, removeLayer = true) {
+            //   removeLayer && this.removeImageLayer();
+            // 閲嶇疆data鍊�
+            Object.assign(this.$data, this.$options.data());
+            !isCloseBtn && this.$refs.pop.close();
+        },
+        // 鎵撳紑寮圭獥
+        open() {
+            this.close(true);
+            this.$refs.pop.open();
+            this.romaLineStart();
+        },
+        romaLineStart(){
+            zhangzitou_selectAllLine({  
+                limit: 100000,
+                page: 1
+            }).then((response)=>{
+                console.log(response);
+            })
+        },
+    },
+};
+</script>
+
+<style></style>
diff --git a/src/views/visual/mapView/location.vue b/src/views/visual/mapView/location.vue
index 831f58f..85f2da4 100644
--- a/src/views/visual/mapView/location.vue
+++ b/src/views/visual/mapView/location.vue
@@ -1,6 +1,21 @@
 <template>
-    <Popup ref="pop" top="20px" left="calc(100% - 600px)"    :title="title" @close="close(true)" width="300px" @cancel="close(false)">
-        <el-tree></el-tree>
+    <Popup ref="pop" top="20px" left="calc(100% - 600px)" :maxHeight="'700px'" :title="title" @close="close(true)" width="300px" @cancel="close(false)">
+        <div>
+            <el-form label-width="60px" ref="modelFrom" :model="modelFrom" :rules="rules" append-to-body :close-on-click-modal="false">
+                <el-form-item label="缁忓害" prop="lon">
+                    <el-input v-model="modelFrom.lon"></el-input>
+                </el-form-item>
+                <el-form-item label="绾害" prop="lat">
+                    <el-input v-model="modelFrom.lat"></el-input>
+                </el-form-item>
+                <el-form-item label="楂樺害" prop="alt">
+                    <el-input v-model="modelFrom.alt"></el-input>
+                </el-form-item>
+            </el-form>
+            <div slot="footer" style="float: right; margin-right: 10px; margin-bottom: 10px" class="dialog-footer">
+                <el-button type="primary" @click="setSsubmitForm('modelFrom')">瀹� 浣�</el-button>
+            </div>
+        </div>
     </Popup>
 </template>
 
@@ -12,6 +27,36 @@
     data() {
         return {
             title: '鍧愭爣瀹氫綅',
+            billboard: null,
+
+            modelFrom: {
+                lon: '',
+                lat: '',
+                alt: '',
+            },
+            rules: {
+                lon: [
+                    {
+                        required: true,
+                        message: '缁忓害涓嶈兘涓虹┖',
+                        trigger: 'blur',
+                    },
+                ],
+                lat: [
+                    {
+                        required: true,
+                        message: '绾害涓嶈兘涓虹┖',
+                        trigger: 'blur',
+                    },
+                ],
+                alt: [
+                    {
+                        required: true,
+                        message: '楂樺害涓嶈兘涓虹┖',
+                        trigger: 'blur',
+                    },
+                ],
+            },
         };
     },
     methods: {
@@ -19,14 +64,44 @@
         close(isCloseBtn, removeLayer = true) {
             //   removeLayer && this.removeImageLayer();
             // 閲嶇疆data鍊�
+            this.setRemoveBillboard();
             Object.assign(this.$data, this.$options.data());
             !isCloseBtn && this.$refs.pop.close();
+           
         },
         // 鎵撳紑寮圭獥
         open() {
             this.close(true);
             this.$refs.pop.open();
         },
+        setRemoveBillboard() {
+            if (this.billboard) {
+                Viewer.entities.remove(this.billboard);
+                this.billboard = null;
+            }
+        },
+        setSsubmitForm(formName) {
+            this.$refs[formName].validate((valid) => {
+                if (valid) {
+                    this.setRemoveBillboard();
+
+                    const url = config.sdkImg + 'Workers/image/mark.png';
+                    console.log(url);
+                    this.billboard = Viewer.entities.add({
+                        position: Cesium.Cartesian3.fromDegrees(this.modelFrom.lon, this.modelFrom.lat), // 璁剧疆瀹炰綋鍦ㄥ湴鐞冧笂鐨勪綅缃�
+                        billboard: {
+                            image: url, // 璁剧疆浣犳兂鏄剧ず鐨勫浘鐗�
+                            verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 璁剧疆鍥剧墖鍦ㄥ疄浣撲腑鐨勪綅缃�
+                            disableDepthTestDistance: Number.POSITIVE_INFINITY, // 绂佺敤娣卞害娴嬭瘯锛岀‘淇濅笉琚湴褰㈤伄鎸�
+                        },
+                    });
+                    earthCtrl.userScene.flyTo(this.billboard);
+                } else {
+                    console.log('error submit!!');
+                    return false;
+                }
+            });
+        },
     },
 };
 </script>

--
Gitblit v1.9.3