فهرست منبع

物联感知数据更新逻辑

tianyabing 2 سال پیش
والد
کامیت
33de8d7236

+ 1 - 4
public/config.js

@@ -1,6 +1,4 @@
 var systemConfig = {
-    // oauth服务地址
-    oauthUrl: 'http://122.228.28.40:10096/oauth',
     // dtb ID配置 与数据库对应 若数据库无修改以下内容不动
     serviceId: '9', // 对接oauth服务id
     authType: '90', // 菜单权限在oauth中类型id
@@ -18,6 +16,5 @@ var systemConfig = {
 var SkySceneryConfig = {
     userName: "user001",
     password: "1234567890",
-    // oauth服务地址
-    authUrl: 'http://122.228.28.40:10096',
+    authUrl: '',// 留空则使用与dtb相同oauth登录系统
 }

+ 1 - 0
public/index.html

@@ -15,6 +15,7 @@
     <script src="./pluginFiles/plugins/water.js" type="text/javascript"></script>
     <script src="./pluginFiles/plugins/singleModelBindClick.js" type="text/javascript"></script>
     <script src="./pluginFiles/plugins/loadModelBindClick.js" type="text/javascript"></script>
+    <script src="./pluginFiles/plugins/addTree.js" type="text/javascript"></script>
 </head>
 <body>
 <noscript>

+ 2 - 2
src/components/dataManage/dataDetail/BusinessDataDetail.vue

@@ -47,7 +47,7 @@
           <el-input v-model="formData.address" placeholder="请输入地名地址库名称" :disabled="formData.isDataView" />
         </el-form-item>
       </el-form>
-      <HighOptionData :init-data="[]" :call-back="setProperties"></HighOptionData>
+      <HighOptionData :init-data="formData.properties" :call-back="setProperties"></HighOptionData>
     </div>
     <template #footer>
       <el-button type="primary" @click="submit" v-show="!formData.isDataView">保存</el-button>
@@ -76,7 +76,7 @@ import OlMap from "@/components/map/OlMap";
 import JsonDataView from "@/components/json/JsonDataView";
 import api from "@/api/data/BusinessData";
 import menuApi from "@/api/data/MenuData";
-import HighOptionData from "@/components/dataManage/dataDetail/HighOptionData";
+import HighOptionData from "@/components/dataManage/dataDetail/components/HighOptionData.vue";
 
 export default {
   data() {

+ 125 - 92
src/components/dataManage/dataDetail/IotDataDetail.vue

@@ -6,74 +6,84 @@
              :close-on-click-modal="false"
              :before-close="handleClose"
   >
-    <div id="addData">
-      <el-form ref="form" :inline="true" :model="formData" :rules="formDataRules" style="margin: 0 15px"
-               :label-width="110">
-        <el-form-item label="ID:" v-show="false">
-          <el-input v-model="formData.id"/>
-        </el-form-item>
-        <el-form-item label="标题:" prop="title" style="width: 100%">
-          <el-input v-model="formData.title" placeholder="请输入标题" :disabled="formData.isDataView"/>
-        </el-form-item>
-        <el-form-item label="描述:" prop="content" style="width: 100%">
-          <el-input v-model="formData.content" placeholder="请输入描述" :disabled="formData.isDataView"/>
-        </el-form-item>
-        <el-form-item label="媒体类型:" prop="modelType" style="width: 100%">
-          <el-input v-model="formData.modelType" placeholder="请输入类型" :disabled="formData.isDataView">
-          </el-input>
-        </el-form-item>
-        <el-form-item label="媒体地址:" prop="url" style="width: 100%">
-          <el-input v-model="formData.url" placeholder="请输入媒体地址" :disabled="formData.isDataView">
-            <template #append>
-              <el-button @click="handleMapShow(true)" class="inputButtonStyle">
-                预览
-              </el-button>
-            </template>
-          </el-input>
-        </el-form-item>
-        <el-form-item label="类别:" prop="menuId">
-          <el-select v-model="formData.menuId" placeholder="请选择类别" @change="handleMenuIdSelect" :disabled="true">
-            <el-option
-                v-for="item in category"
-                :key="item.id"
-                :label="item.title"
-                :value="item.id"
-            />
-          </el-select>
-        </el-form-item>
-        <br/>
-        <el-form-item label="经度:" style="width: 40%" prop="lon">
-          <el-input :model-value="formData.lon" placeholder="经度" :disabled="formData.isDataView">
-          </el-input>
-        </el-form-item>
-        <el-form-item label="纬度:" style="width: 35%" :label-width="70" prop="lat">
-          <el-input :model-value="formData.lat" placeholder="纬度" :disabled="formData.isDataView">
-          </el-input>
-        </el-form-item>
-        <el-form-item>
-          <el-button style="font-size: 18px" @click="handleLonlatSelect" >
-            <el-icon><ElIconLocation/></el-icon>
-          </el-button>
-        </el-form-item>
-        <br/>
-        <el-form-item label="高程:" prop="elevation">
-          <el-input :model-value="formData.elevation" placeholder="高程" :disabled="formData.isDataView">
-          </el-input>
-        </el-form-item>
-        <el-form-item label="俯仰角:" prop="angleOfPitch">
-          <el-input :model-value="formData.angleOfPitch" placeholder="俯仰角" :disabled="formData.isDataView">
-          </el-input>
-        </el-form-item>
-        <el-form-item label="方位角:" prop="azimuth">
-          <el-input :model-value="formData.azimuth" placeholder="方位角" :disabled="formData.isDataView">
-          </el-input>
-        </el-form-item>
-        <el-form-item label="地名地址库:" prop="address" style="width: 100%">
-          <el-input v-model="formData.address" placeholder="请输入地名地址库名称" :disabled="formData.isDataView"/>
-        </el-form-item>
-      </el-form>
-      <HighOptionData :init-data="[]" :call-back="setProperties"></HighOptionData>
-    </div>
+    <el-scrollbar :max-height="460">
+      <div id="addData">
+        <el-form ref="form" :inline="true" :model="formData" :rules="formDataRules" style="margin: 0 15px"
+                 :label-width="110">
+          <el-form-item label="ID:" v-show="false">
+            <el-input v-model="formData.id"/>
+          </el-form-item>
+          <el-form-item label="标题:" prop="title" style="width: 100%">
+            <el-input v-model="formData.title" placeholder="请输入标题" :disabled="formData.isDataView"/>
+          </el-form-item>
+          <el-form-item label="描述:" prop="content" style="width: 100%">
+            <el-input v-model="formData.content" placeholder="请输入描述" :disabled="formData.isDataView"/>
+          </el-form-item>
+          <el-form-item label="媒体类型:" prop="mediaType" style="width: 100%">
+            <el-input v-model="formData.mediaType" placeholder="请输入类型" :disabled="formData.isDataView">
+            </el-input>
+          </el-form-item>
+          <el-form-item label="媒体地址:" prop="url" style="width: 100%">
+            <el-input v-model="formData.url" placeholder="请输入媒体地址" :disabled="formData.isDataView">
+            </el-input>
+          </el-form-item>
+          <el-form-item label="类别:" prop="menuId">
+            <el-select v-model="formData.menuId" placeholder="请选择类别" @change="handleMenuIdSelect" :disabled="true">
+              <el-option
+                  v-for="item in category"
+                  :key="item.id"
+                  :label="item.title"
+                  :value="item.id"
+              />
+            </el-select>
+          </el-form-item>
+          <br/>
+          <el-form-item label="模型类型:" prop="modelType" >
+            <el-select v-model="formData.modelType" placeholder="请选择模型类型" clearable :disabled="formData.isDataView">
+              <el-option v-for="(item,key) in modelType" :key="key" :label="key" :value="item"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-button plain style="display: inline-block;vertical-align: top" @click="handleMapShow">预览</el-button>
+          <br/>
+          <el-form-item label="模型地址:" prop="modelUrls" style="width: 100%" v-if="[1,2,4,5].indexOf(formData.modelType)>-1">
+            <TableInput :type="1" v-model:urls="formData.modelUrls" :is-view="formData.isDataView"></TableInput>
+          </el-form-item>
+          <el-form-item label="数据地址:" prop="modelData" style="width: 100%" v-if="[3,4,5].indexOf(formData.modelType)>-1">
+            <TableInput  v-model:urls="formData.modelData" :is-view="formData.isDataView"></TableInput>
+          </el-form-item>
+          <el-form-item label="经度:" style="width: 40%" prop="lon">
+            <el-input v-model="formData.lon" placeholder="经度" :disabled="formData.isDataView">
+            </el-input>
+          </el-form-item>
+          <el-form-item label="纬度:" style="width: 35%" :label-width="70" prop="lat">
+            <el-input v-model="formData.lat" placeholder="纬度" :disabled="formData.isDataView">
+            </el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-button style="font-size: 18px" @click="handleLonlatSelect" >
+              <el-icon><ElIconLocation/></el-icon>
+            </el-button>
+          </el-form-item>
+          <br/>
+          <el-form-item label="高程:" prop="elevation" style="width: 30%">
+            <el-input v-model="formData.elevation" placeholder="高程" :disabled="formData.isDataView">
+            </el-input>
+          </el-form-item>
+          <el-form-item label="俯仰角:" prop="angleOfPitch" style="width: 25%" label-width="100">
+            <el-input v-model="formData.angleOfPitch" placeholder="俯仰角" :disabled="formData.isDataView">
+            </el-input>
+          </el-form-item>
+          <el-form-item label="方位角:" prop="azimuth" style="width: 25%" label-width="100">
+            <el-input v-model="formData.azimuth" placeholder="方位角" :disabled="formData.isDataView">
+            </el-input>
+          </el-form-item>
+          <el-form-item label="地名地址库:" prop="address" style="width: 100%">
+            <el-input v-model="formData.address" placeholder="请输入地名地址库名称" :disabled="formData.isDataView"/>
+          </el-form-item>
+        </el-form>
+        <HighOptionData :init-data="formData.properties" :call-back="setProperties"></HighOptionData>
+      </div>
+    </el-scrollbar>
     <template #footer>
       <el-button type="primary" @click="submit" v-show="!formData.isDataView">保存</el-button>
     </template>
@@ -90,9 +100,10 @@
 
   <CesiumMap v-if="isMapShow"
              :is-show="isMapShow"
-             :item="mapUrl"
+             :type="formData.modelType"
+             :model-urls="formData.modelUrls"
+             :model-data="formData.modelData"
              :extra-params="extraParams"
-             :type="mapType"
              :close="()=>{this.isMapShow=false}">
   </CesiumMap>
 </template>
@@ -100,17 +111,19 @@
 <script>
 import CesiumMap from "@/components/map/CesiumMap";
 import OlMap from "@/components/map/OlMap";
-import api from "@/api/data/ModelData";
+import api from "@/api/data/IotData";
 import menuApi from "@/api/data/MenuData";
-import HighOptionData from "@/components/dataManage/dataDetail/HighOptionData";
+import HighOptionData from "@/components/dataManage/dataDetail/components/HighOptionData.vue";
+import TableInput from "@/components/dataManage/dataDetail/components/TableInput.vue";
+import ModelType from "@/static/datas/ModelType.json";
 
 export default {
   data() {
     return {
       isMapShow: false,
-      mapType: 3,
-      mapUrl: '',
       extraParams: {},
+
+      modelType: {},
       formData: {},
       oriFormData: {},
       formDataRules: {
@@ -133,10 +146,10 @@ export default {
         geometryStr: [
           {required: true, message: '请输入Geojson数据', trigger: 'blur'},
         ],
-        url: [
-          {required: true, message: '该字段不能为空', trigger: 'blur'},
-          {required: true, message: '该字段不能为空', trigger: 'change'},
-        ],
+        // url: [
+        //   {required: true, message: '该字段不能为空', trigger: 'blur'},
+        //   {required: true, message: '该字段不能为空', trigger: 'change'},
+        // ],
         lon: [
           {required: true, message: '该字段不能为空', trigger: 'blur'},
           {required: true, message: '该字段不能为空', trigger: 'change'},
@@ -162,33 +175,51 @@ export default {
     close: Function
   },
   watch: {
-
+    "formData.modelType":function (newVal, oldVal) {
+      if (oldVal) {
+        this.formData.modelUrls = [];
+        this.formData.modelData = [];
+      }
+    }
+  },
+  created() {
+    this.modelType = ModelType;
+    console.log(this.modelType);
+    for (const modelTypeKey in this.modelType) {
+      console.log(modelTypeKey)
+    }
   },
   mounted() {
     this.getMenuData();
     this.formData = this.item;
+    if (this.formData.modelType && this.formData.modelType!='') {
+      this.formData.modelType = Number(this.formData.modelType)
+    }
+    if (this.formData.modelUrls && this.formData.modelUrls!='') {
+      this.formData.modelUrls = JSON.parse(this.formData.modelUrls)
+    }
     this.oriFormData = JSON.parse(JSON.stringify(this.formData))
   },
   components: {
     CesiumMap,
     OlMap,
     HighOptionData,
+    TableInput,
   },
   methods: {
     setProperties(item) {
       this.formData['properties'] = item;
     },
-    handleMapShow(flag) {
-      this.extraParams = {};
-      this.extraParams.lon = this.formData.lon
-      this.extraParams.lat = this.formData.lat
-      this.extraParams.elevation = this.formData.elevation
-      this.extraParams.heading = this.formData.azimuth
-      this.extraParams.pitch = this.formData.angleOfPitch
-      this.extraParams.roll = 0
-      this.extraParams.title = this.formData.title
-      this.mapUrl = this.formData.url+this.$store.state.token;
-      this.mapType = 3
+    handleMapShow() {
+      this.extraParams = {
+        lon: this.formData.lon,
+        lat: this.formData.lat,
+        elevation: this.formData.elevation,
+        heading: this.formData.azimuth,
+        pitch: this.formData.angleOfPitch,
+        roll: 0,
+        title: this.formData.title
+      };
       this.isMapShow = true;
     },
     handleLonlatSelect(flag) {
@@ -256,8 +287,10 @@ export default {
     addData() {
       let app = this;
       let params = JSON.parse(JSON.stringify(app.formData));
-      params['menuNameOne'] = '模型数据'
+      params['menuNameOne'] = '物联感知数据'
       params['userName'] = app.$store.state.userInfo.username;
+      params['modelUrls'] = JSON.stringify(app.formData.modelUrls)
+      params['modelData'] = JSON.stringify(app.formData.modelData)
       api.addData(params).then(res => {
         if (res.code === 200) {
           app.$message({message: '录入成功', type: 'success'})
@@ -294,7 +327,7 @@ export default {
 
 <style>
 #addData {
-  width: 100%;
+  width: 95%;
   height: 100%;
 }
 </style>

+ 7 - 4
src/components/dataManage/dataDetail/MetaDataDetail.vue

@@ -53,7 +53,7 @@
           <el-input v-model="formData.address" placeholder="请输入地名地址库名称" :disabled="formData.isDataView"/>
         </el-form-item>
       </el-form>
-      <HighOptionData :init-data="[]" :call-back="setProperties"></HighOptionData>
+      <HighOptionData :init-data="formData.properties" :call-back="setProperties"></HighOptionData>
     </div>
     <template #footer>
       <el-button type="primary" @click="submit" v-show="!formData.isDataView">保存</el-button>
@@ -65,7 +65,7 @@
 <script>
 import api from "@/api/data/MetaData";
 import menuApi from "@/api/data/MenuData";
-import HighOptionData from "@/components/dataManage/dataDetail/HighOptionData";
+import HighOptionData from "@/components/dataManage/dataDetail/components/HighOptionData.vue";
 
 export default {
   data() {
@@ -132,13 +132,16 @@ export default {
     close: Function
   },
   watch: {
-    "formData.dataType": function () {
-      this.formData.dataId = '';
+    "formData.dataType": function (newVal, oldVal) {
+      if (oldVal) {
+        this.formData.dataId = '';
+      }
     }
   },
   mounted() {
     this.getMenuData()
     this.formData = this.item;
+    this.formData.dataId = this.item.dataId
     this.oriFormData = JSON.parse(JSON.stringify(this.formData))
   },
   components: {

+ 2 - 2
src/components/dataManage/dataDetail/ModelDataDetail.vue

@@ -59,7 +59,7 @@
           <el-input v-model="formData.address" placeholder="请输入地名地址库名称" :disabled="formData.isDataView"/>
         </el-form-item>
       </el-form>
-      <HighOptionData :init-data="[]" :call-back="setProperties"></HighOptionData>
+      <HighOptionData :init-data="formData.properties" :call-back="setProperties"></HighOptionData>
     </div>
     <template #footer>
       <el-button type="primary" @click="submit" v-show="!formData.isDataView">保存</el-button>
@@ -96,7 +96,7 @@ import OlMap from "@/components/map/OlMap";
 import JsonDataView from "@/components/json/JsonDataView";
 import api from "@/api/data/ModelData";
 import menuApi from "@/api/data/MenuData";
-import HighOptionData from "@/components/dataManage/dataDetail/HighOptionData"
+import HighOptionData from "@/components/dataManage/dataDetail/components/HighOptionData.vue"
 
 export default {
   data() {

+ 1 - 1
src/components/dataManage/dataDetail/ThreeDimensionalDataDetail.vue

@@ -108,7 +108,7 @@ import OlMap from "@/components/map/OlMap";
 import JsonDataView from "@/components/json/JsonDataView";
 import api from "@/api/data/ThreeDimensionalData";
 import menuApi from "@/api/data/MenuData";
-import HighOptionData from "@/components/dataManage/dataDetail/HighOptionData";
+import HighOptionData from "@/components/dataManage/dataDetail/components/HighOptionData.vue";
 
 export default {
   data() {

+ 1 - 1
src/components/dataManage/dataDetail/TwoDimensionalDataDetail.vue

@@ -72,7 +72,7 @@
 </template>
 
 <script>
-import HighOptionData from "@/components/dataManage/dataDetail/HighOptionData"
+import HighOptionData from "@/components/dataManage/dataDetail/components/HighOptionData.vue"
 import OlMap from "@/components/map/OlMap";
 import JsonDataView from "@/components/json/JsonDataView";
 import api from "@/api/data/TwoDimensionalData";

+ 0 - 0
src/components/dataManage/dataDetail/HighOptionData.vue → src/components/dataManage/dataDetail/components/HighOptionData.vue


+ 105 - 0
src/components/dataManage/dataDetail/components/TableInput.vue

@@ -0,0 +1,105 @@
+<template>
+  <div class="TableInput">
+    <el-table :data="tableData" stripe :show-header="false">
+      <el-table-column prop="url" min-width="150">
+        <template #default="scope">
+          <el-input @input="updateTableUrls" v-model="scope.row.url" placeholder="请输入url地址" :disabled="isView"></el-input>
+        </template>
+      </el-table-column>
+      <el-table-column prop="operation" min-width="75" v-if="!isView">
+        <template #default="scope" >
+          <el-button circle title="连通性测试" v-show="false">
+            <el-icon><IconPark-link-three /></el-icon>
+          </el-button>
+          <el-button title="添加新行" @click="addItem" circle v-if="scope.$index===tableData.length-1">
+            <el-icon><ElIconPlus /></el-icon>
+          </el-button>
+          <el-button title="删除当前行" @click="minusItem(scope.$index)" circle v-if="tableData.length>1">
+            <el-icon><ElIconMinus /></el-icon>
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+
+
+</template>
+
+<script>
+import CesiumMap from "@/components/map/CesiumMap";
+import qs from "qs";
+
+export default {
+  data() {
+    return {
+      tableData: [],
+
+      isMapShow: false,
+      mapType: 2,
+      mapUrl: '',
+      extraParams: {},
+    }
+  },
+  props: {
+    urls: Object,
+    isView: Boolean,
+  },
+  components: {
+    CesiumMap
+  },
+  emits: ['update:urls'],
+  setup(props, context) {
+    const methods = {
+      updateUrls(urls) {
+        context.emit('update:urls', urls);
+      },
+    }
+    return methods;
+  },
+  watch: {
+    "urls": function (val) {
+      this.initData()
+    },
+  },
+  created() {
+  },
+  mounted() {
+    this.initData();
+  },
+  methods: {
+    initData() {
+      if (this.urls) {
+        this.tableData = this.urls.map(item=>{return {url: item}})
+      }
+      if (this.tableData.length<1) {
+        this.addItem();
+      }
+    },
+    addItem() {
+      this.tableData.push({url:''})
+    },
+    minusItem(index) {
+      if (index<this.tableData.length) {
+        this.tableData.splice(index,1);
+        this.updateTableUrls()
+      }
+    },
+    updateTableUrls() {
+      let urls = [];
+      this.tableData.forEach(i=>{
+        if (i.url && i.url!=='') {
+          urls.push(i.url);
+        }
+      });
+      this.updateUrls(urls);
+    },
+  },
+}
+</script>
+
+<style scoped>
+.TableInput {
+  width: 100%;
+  height: 100%;
+}
+</style>

+ 14 - 3
src/components/dataManage/dataShow/IotData.vue

@@ -44,6 +44,15 @@
         <el-table-column prop="menuNameTwo" label="类别" width="80"/>
         <el-table-column prop="mediaType" label="媒体类型" width="120"/>
         <el-table-column prop="url" label="媒体路径" width="230"/>
+        <el-table-column prop="modelType" label="模型类型" width="120">
+          <template #default="scope">
+            <template v-for="(item,key) in modelType" :key="item">
+              <span v-if="scope.row.modelType==item">{{ key }}</span>
+            </template>
+          </template>
+        </el-table-column>
+        <el-table-column prop="modelUrls" label="模型地址" width="230"></el-table-column>
+        <el-table-column prop="modelData" label="模型数据" width="230"></el-table-column>
         <el-table-column prop="lon" label="位置" width="180">
           <template #default="scope">
             [
@@ -110,7 +119,7 @@
              :is-show="isMapShow"
              :item="mapUrl"
              :extra-params="extraParams"
-             :type="mapType"
+             :type="21"
              :close="()=>{this.isMapShow=false}">
   </CesiumMap>
 </template>
@@ -120,10 +129,12 @@ import api from '@/api/data/IotData'
 import IotDataDetail from "@/components/dataManage/dataDetail/IotDataDetail";
 import CategoryMenu from "@/components/dataManage/CategoryMenu";
 import CesiumMap from "@/components/map/CesiumMap.vue";
+import ModelType from "@/static/datas/ModelType.json";
 
 export default {
   data() {
     return {
+      modelType: ModelType,
       dialogTitle: '',
       auth: false,
       loading: false,
@@ -146,8 +157,7 @@ export default {
       isAllView: false,
       isMapShow: false,
       mapUrl: '',
-      extraParams: {},
-      mapType: 33,
+      extraParams: {}
     }
   },
   components: {
@@ -220,6 +230,7 @@ export default {
           app.tableData = res.content
           app.isAllView = res.total>0 && res.content[0].menuNameTwo==='视频点位';
         }
+        this.$refs['dataTable'].doLayout();
         app.handleLoading(false)
       }).catch(err => {
         app.handleLoading(false)

+ 184 - 106
src/components/map/CesiumMap.vue

@@ -26,7 +26,7 @@
 
 <script>
 
-import axios from "axios";
+import qs from "qs";
 
 let viewer = null;
 export default {
@@ -73,9 +73,11 @@ export default {
   },
   props: {
     isShow: Boolean,
-    item: String,
-    extraParams: Object,
-    type: Number, // 1-GeoJson、2-3DTiles、3-Gltf、33-Gltf、4-水面
+    type: Number, // 0-GeoJson、1-3DTiles、2-gltf/glb、21-批量加载摄像头、3-水面、4-点位(3DTiles)、5-点位(gltf/glb)
+    item: Object,
+    modelData: Object, // 点位数据 json数组
+    modelUrls: Object, // 模型地址 json数组
+    extraParams: Object, // 参数
     close: Function
   },
   watch: {
@@ -101,40 +103,41 @@ export default {
       )
       window.viewer = viewer
       // 加载模型
-      let type = app.type;
-      if (app.item) {
-        let url = app.item.split('?');
-        if (url[0].indexOf('.gltf')===(url[0].length-5)) {
-          type = 3;
-        }
-      }
-      app.loadingEntities(type);
+      app.loadingEntities(app.type);
     },
     loadingEntities(type) {
       let app = this;
-      if (!type || type === '' || !app.item || app.item === '') {
+      if (!type || type === '') {
         return;
       }
       // 加载GeoJson
-      if (type === 1) {
+      if (type === 0) {
         let obj = {"type": "Feature", "geometry": JSON.parse(app.item), "properties": {}}
         this.addGeoJson(obj);
       }
       // 加载3DTiles
-      if (type === 2) {
-        app.add3DTiles(app.item)
+      else if (type === 1) {
+        app.add3DTiles(app.modelUrls)
       }
-      // 加载gltf
-      if (type === 3) {
-        app.addGltf(app.item)
+      // 加载gltf/glb
+      else if (type === 2) {
+        app.addGltf(app.modelUrls)
       }
-      // 批量加载gltf
-      if (type === 33) {
-        app.addGltfs(app.item)
+      // 批量加载摄像头
+      else if (type === 21) {
+        app.addGltfSxt(app.item)
       }
       // 加载水面
-      if (type === 4) {
-        app.addWater(app.item)
+      else if (type === 3) {
+        app.addWater(app.modelData)
+      }
+      // 加载点位(3DTiles)
+      else if (type === 4) {
+        app.addPositionTiles();
+      }
+      // 加载点位(gltf/glb)
+      else if (type === 5) {
+        app.addPositionGltf();
       }
     },
     // 加载GeoJson
@@ -155,15 +158,24 @@ export default {
       })
     },
     // 添加模型
-    add3DTiles(url) {
+    add3DTiles(urls) {
       let app = this;
-      let tileset = SkyScenery.add3DTilesData(url, viewer);
-      tileset.tileFailed.addEventListener(function (err) {
-        app.$message({message: '模型加载失败', type: 'error'});
+      let tile = undefined;
+      if (!urls || urls.length<1) {
+        app.$message.warning('请检查模型地址');
         app.handleClose()
-      })
-      tileset.readyPromise.then(function () {
-        viewer.zoomTo(tileset, {
+        return;
+      }
+      for (let i = 0; i < urls.length; i++) {
+        let url = this.addTokenToUrl(urls[i])
+        tile = SkyScenery.add3DTilesData(url, viewer);
+        tile.tileFailed.addEventListener(function (err) {
+          app.$message({message: '模型加载失败', type: 'error'});
+          app.handleClose()
+        })
+      }
+      tile.readyPromise.then(function () {
+        viewer.zoomTo(tile, {
           heading: 2.718565,
           pitch: -0.415366,
           roll: 0.0,
@@ -176,73 +188,106 @@ export default {
         });
         app.handleClose()
       });
-      return tileset;
+      return tile;
     },
-    // 添加gltf
-    addGltf(url) {
-      let app= this;
-      let height = 1;
-      let lon = 120.90685004033816;
-      let lat = 27.918254593203912;
-      let heading = 0;
-      let pitch = 0;
-      let roll = 0;
-      let title = 'gltf';
-      if (this.extraParams && this.extraParams.elevation && this.extraParams.elevation!=='') {
-        height = Number(this.extraParams.elevation)
+    // 设置 gltf 参数
+    getGltfParams(params) {
+      let obj = {
+        lon: 120.90685004033816,
+        lat: 27.918254593203912,
+        height: 1,
+        heading: 0,
+        pitch: 0,
+        roll: 0,
+        title: '',
       }
-      if (this.extraParams && this.extraParams.lon && this.extraParams.lon!=='') {
-        lon = Number(this.extraParams.lon)
+      if (!params) {
+        return obj;
       }
-      if (this.extraParams && this.extraParams.lat && this.extraParams.lat!=='') {
-        lat = Number(this.extraParams.lat)
+      if (params.lon && params.lon!=='') {
+        obj.lon = Number(params.lon)
       }
-      if (this.extraParams && this.extraParams.heading && this.extraParams.heading!=='') {
-        heading = Number(this.extraParams.heading)
+      if (params.lat && params.lat!=='') {
+        obj.lat = Number(params.lat)
       }
-      if (this.extraParams && this.extraParams.pitch && this.extraParams.pitch!=='') {
-        pitch = Number(this.extraParams.pitch)
+      if (params.elevation && params.elevation!=='') {
+        obj.height = Number(params.elevation)
       }
-      if (this.extraParams && this.extraParams.roll && this.extraParams.roll!=='') {
-        roll = Number(this.extraParams.roll)
+      if (params.heading && params.heading!=='') {
+        obj.heading = Number(params.heading)
       }
-      if (this.extraParams && this.extraParams.title && this.extraParams.title!=='') {
-        title = this.extraParams.title;
+      if (params.pitch && params.pitch!=='') {
+        obj.pitch = Number(params.pitch)
       }
-
-      var modelObj = new SkyScenery.singleModelBindClick(viewer, {
-        url: url,
-        lon: lon,
-        lat: lat,
-        height: height,
-        heading: heading,
-        pitch: pitch,
-        roll: roll,
-        info: {
-          log: lon,
-          lat: lat,
-          elevation: height,
-          heading: heading,
-          pitch: pitch,
-          roll: roll,
-          title: title
-        }
-      })
-      let origin = SkyScenery.Cartesian3.fromDegrees(lon, lat, 2);
+      if (params.roll && params.roll!=='') {
+        obj.roll = Number(params.roll)
+      }
+      if (params.title && params.title!=='') {
+        obj.title = params.title;
+      }
+      return obj;
+    },
+    // 添加gltf
+    addGltf(urls) {
+      let app = this;
+      let obj = this.getGltfParams(this.extraParams);
+      for (let i = 0; i < urls.length; i++) {
+        let url = this.addTokenToUrl(urls[i]);
+        let modelObj = new SkyScenery.singleModelBindClick(viewer, {
+          url: url,
+          lon: obj.lon,
+          lat: obj.lat,
+          height: obj.height,
+          heading: obj.heading,
+          pitch: obj.pitch,
+          roll: obj.roll,
+          info: obj
+        })
+        modelObj.openClick(info => {
+          app.msgInfo = info
+          app.isMessageShow = true
+        })
+      }
+      let origin = SkyScenery.Cartesian3.fromDegrees(obj.lon, obj.lat, 10);
       viewer.camera.flyTo({
         destination: origin,
         orientation: {
-          heading: SkyScenery.Math.toRadians(-30), // 方向
-          pitch: SkyScenery.Math.toRadians(-10), // 倾斜角度
+          heading: SkyScenery.Math.toRadians(0), // 方向
+          pitch: SkyScenery.Math.toRadians(-90), // 倾斜角度
           roll: SkyScenery.Math.toRadians(0),
         },
       });
-      modelObj.openClick(info => {
-        app.msgInfo = info
-        app.isMessageShow = true
+    },
+    // 添加点位(3DTiles)
+    addPositionTiles() {
+
+    },
+    // 添加点位(Gltf/glb)
+    addPositionGltf(jsonUrls, gltfUrls) {
+      let pos = {}
+      for (let i = 0; i < gltfUrls.length; i++) {
+        for (let j = 0; j < jsonUrls.length; j++) {
+          SkyScenery.addTree(jsonUrls[j],gltfUrls[i]).then((treeArr) => {
+            treeArr.map(function (item) {
+              viewer.scene.primitives.add(item);
+              pos.east = item.geometryInstances.geometry.rectangle.east;
+              pos.north = item.geometryInstances.geometry.rectangle.north;
+            })
+          })
+        }
+      }
+      viewer.camera.flyTo({
+        destination: SkyScenery.Cartesian3.fromDegrees(SkyScenery.Math.toDegrees(east),SkyScenery.Math.toDegrees(north), 300),
+        orientation: {
+          heading: SkyScenery.Math.toRadians(0),
+          pitch: SkyScenery.Math.toRadians(-90),
+          roll: 0,
+        }
       })
+
     },
-    addGltfs(url) {
+    // 添加全部摄像头
+    addGltfSxt(url) {
       let app = this;
       let modelObj = new SkyScenery.loadModelBindClick(viewer, {
         url: url,
@@ -263,33 +308,66 @@ export default {
       })
     },
     // 添加水面
-    addWater(url) {
-      let water = SkyScenery.WaterFromRequest(url, {
-        frequency: 20.0, // 控制波数的数字。
-        animationSpeed: 0.01, // 控制水的动画速度的数字。
-        amplitude: 50.0, // 控制水波振幅的数字。
-        specularIntensity: 0.8, // 控制镜面反射强度的数字。
-        baseWaterColor: "#006ab4", // rgba颜色对象基础颜色的水。#00ffff,#00baff,#006ab4
-        blendColor: "#006ab4", // 从水中混合到非水域时使用的rgba颜色对象。
-        height: 0.2, // 水体下表面与地表之间的高度
-        diffHeight: 1,// 水体高度
-        clampToGround: false, //是否贴地
-        opacity: 0.7, //透明度
-      });
-      water.then((waterObj) => {
-        viewer.scene.primitives.add(waterObj);
-        let east = waterObj.geometryInstances.geometry.rectangle.east;
-        let north = waterObj.geometryInstances.geometry.rectangle.north;
-        viewer.camera.flyTo({
-          destination: SkyScenery.Cartesian3.fromDegrees(SkyScenery.Math.toDegrees(east),SkyScenery.Math.toDegrees(north), 338.8293456247198),
-          orientation: {
-            heading: SkyScenery.Math.toRadians(0),
-            pitch: SkyScenery.Math.toRadians(-90),
-            roll: 0,
+    addWater(urls) {
+      let app = this;
+      for (let i = 0; i < urls.length; i++) {
+        let url = this.addTokenToUrl(urls[i])
+        let water = SkyScenery.WaterFromRequest(url, {
+          frequency: 20.0, // 控制波数的数字。
+          animationSpeed: 0.01, // 控制水的动画速度的数字。
+          amplitude: 50.0, // 控制水波振幅的数字。
+          specularIntensity: 0.8, // 控制镜面反射强度的数字。
+          baseWaterColor: "#006ab4", // rgba颜色对象基础颜色的水。#00ffff,#00baff,#006ab4
+          blendColor: "#006ab4", // 从水中混合到非水域时使用的rgba颜色对象。
+          height: 0.2, // 水体下表面与地表之间的高度
+          diffHeight: 1,// 水体高度
+          clampToGround: false, //是否贴地
+          opacity: 0.7, //透明度
+        });
+        water.then((waterObj) => {
+          viewer.scene.primitives.add(waterObj);
+          if (i===0) {
+            app.flyToPrimitive(waterObj)
           }
         })
+      }
+    },
+    addTokenToUrl(url) {
+      try {
+        let obj = new URL(url);
+        let searchStr = obj.search;
+        if (searchStr.indexOf('?')===0) {
+          searchStr = searchStr.substring(1)
+        }
+        let params = qs.parse(searchStr)
+        if (!params['token'] || params['token']==='') {
+          params['token'] = this.$store.state.token;
+        }
+        let pathname = obj.pathname;
+        if(pathname==='/') {
+          pathname = '';
+        }
+        url = obj.origin + pathname + '?' + qs.stringify(params)
+      } catch (e) {
+        return '';
+      }
+      return url;
+    },
+    flyToPrimitive(obj) {
+      let east = obj.geometryInstances.geometry.rectangle.east;
+      let north = obj.geometryInstances.geometry.rectangle.north;
+      let west = obj.geometryInstances.geometry.rectangle.west;
+      let south = obj.geometryInstances.geometry.rectangle.south;
+      let lon = (east+west)/2;
+      let lat = (north+south)/2;
+      viewer.camera.flyTo({
+        destination: SkyScenery.Cartesian3.fromDegrees(SkyScenery.Math.toDegrees(lon),SkyScenery.Math.toDegrees(lat), 338.8293456247198),
+        orientation: {
+          heading: SkyScenery.Math.toRadians(0),
+          pitch: SkyScenery.Math.toRadians(-90),
+          roll: 0,
+        }
       })
-
     },
     handleClose() {
       this.close(false)

+ 7 - 0
src/static/datas/ModelType.json

@@ -0,0 +1,7 @@
+{
+  "3DTiles": 1,
+  "Gltf/Glb": 2,
+  "水面": 3,
+  "点位-3DTiles": 4,
+  "点位-Gltf/Glb": 5
+}

+ 1 - 1
src/utils/constant.js

@@ -4,6 +4,6 @@ export default {
     serviceId: systemConfig.serviceId, // 对接oauth服务id
     authType: systemConfig.authType, // 菜单权限在oauth中类型id
     menuIds: systemConfig.menuIds,
-    oauthProxy: systemConfig.oauthUrl, // oauth 地址
+    oauthProxy: '/oauth', // oauth 地址
     dtbserverProxy: '/proxy_dtbserver' // dtbserver 地址
 }

+ 2 - 0
src/utils/request.js

@@ -56,6 +56,7 @@ function req(method, url, params) {
         }).then(response => {
             resolve(response.data)
         }).catch(err => {
+            context.config.globalProperties.$message({ message: err.message, type: 'error' })
             reject(err)
         })
     })
@@ -74,6 +75,7 @@ function formReq(method, url, params) {
         }).then(response => {
             resolve(response.data)
         }).catch(err => {
+            context.config.globalProperties.$message({ message: err.message, type: 'error' })
             reject(err)
         })
     })

+ 3 - 2
src/views/HomeView.vue

@@ -8,10 +8,10 @@
       </div>
       <div class="loginForm" v-else>
         <span class="formLabel">用户名:</span>
-        <el-input class="formInput" :input-style="{'letter-spacing':'2px'}" size="small" type="text" v-model="loginForm.userName" placeholder="请输入用户名"/>
+        <el-input class="formInput" :input-style="{'letter-spacing':'2px'}" size="small" type="text" @keyup.enter="login" v-model="loginForm.userName" placeholder="请输入用户名"/>
         &nbsp;&nbsp;
         <span class="formLabel">密&nbsp;&nbsp;码:</span>
-        <el-input class="formInput" :input-style="{'letter-spacing':'2px'}" size="small" type="password" v-model="loginForm.password" placeholder="请输入密码" show-password/>
+        <el-input class="formInput" :input-style="{'letter-spacing':'2px'}" size="small" type="password" @keyup.enter="login" v-model="loginForm.password" placeholder="请输入密码" show-password/>
         &nbsp;&nbsp;
         <el-button type="warning" @click="login" size="small">登录</el-button>
       </div>
@@ -88,6 +88,7 @@ export default {
   },
   created() {
     this.$root.$.appContext.config.globalProperties.judgeLogin = this.judgeLogin;
+    document.body.parentNode.style.overflow = 'hidden';
   },
   mounted() {
     let app = this;

+ 8 - 1
vue.config.js

@@ -23,12 +23,19 @@ module.exports = defineConfig({
         port: 8080,
         proxy: {
             '/proxy_dtbserver/': {
-                target: 'http://122.228.28.40:10091/dtb',
+                target: 'http://121.43.55.7:10091/dtb',
                 changeOrigin: true,
                 pathRewrite: {
                     '^/proxy_dtbserver': ''
                 }
             },
+            '/oauth/': {
+                target: 'http://121.43.55.7:10086/oauth',
+                changeOrigin: true,
+                pathRewrite: {
+                    '^/oauth': ''
+                }
+            },
         }
     }
 })