suerprisePlus
2024-06-25 c93d4b3af5739f786cfdf20b16b28ec60403f709
前端对接 seb实体库,rag基本服务
已添加1个文件
已修改10个文件
1106 ■■■■■ 文件已修改
src/api/modelBase.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/map/mapConfig.js 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/map/mapJsonLayer.js 387 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/map/mapServer.js 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/map/mapView.js 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/map/modelLayer.js 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/msg/msgData.js 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Chat/chatList.vue 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/index.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/modelGeo.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/chartView/index.vue 123 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/modelBase.js
@@ -15,4 +15,22 @@
  return modelGeo.post("/entitydb/list/canview", params);
}
// export function getListCanview(params) {
//   return modelGeo.post("/entitydb/list/canview", params);
// }
export function getmapConfig(params) {
  return modelGeo.post("/entitydb/map/config", params);
}
export function getQueryEentity(params) {
  return modelGeo.post("/entitydbdata/query/entity", params);
}
export function getSettingPublickey(params) {
  return modelGeo.get("/setting/publickey", params);
}
export function getQueryEentity2() {
  return modelGeo.post("/entitydbdata/query/entity?layerid=432a7d4f-b136-4649-91a3-52709db9c3ef&dbid=a02c1f922bd64a0ea5979dbebc60d337&geometry=%7B%22type%22%3A%22Polygon%22%2C%22coordinates%22%3A%5B%5B%5B120.26718884999998%2C14.807266503837244%5D%2C%5B120.26172124567293%2C14.805548890345191%5D%2C%5B120.2583422638269%2C14.80105218429488%5D%2C%5B120.25834249053803%2C14.795494078804275%5D%2C%5B120.26172161249924%2C14.790997581217345%5D%2C%5B120.26718884999998%2C14.789280096562752%5D%2C%5B120.2726560875007%2C14.790997581217345%5D%2C%5B120.27603520946194%2C14.795494078804275%5D%2C%5B120.27603543617307%2C14.80105218429488%5D%2C%5B120.27265645432705%2C14.805548890345191%5D%2C%5B120.26718884999998%2C14.807266503837244%5D%5D%5D%7D&returnCountOnly=true&token=15e972cfc0e24bf490ac57f9847cb3c2");
}
// /entitydbdata/query/entity
src/assets/js/map/mapConfig.js
@@ -4,9 +4,19 @@
    earthCtrl.userScene.flyTo(res);
  },
  setPointToCrical(lon, lat, distance) {
    const radius = distance ? distance : 100;
    var point = turf.point([lon, lat]);
    var buffered = turf.buffer(point, radius, { units: "miles", steps: 64 });
    var buffered = turf.circle([lon, lat], distance, {
      units: "kilometers",
      steps: 10,
      properties: { foo: "bar" }
    });
    console.log(buffered);
    const coord = buffered.geometry.coordinates[0];
    const std = coord.map((item) => {
      const rs = turf.toMercator(turf.point(item));
      return rs.geometry.coordinates
    });
    buffered.geometry.coordinates[0] =std
    return buffered;
  }
};
src/assets/js/map/mapJsonLayer.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,387 @@
import axios from "axios";
import mapConfig from "./mapConfig";
import * as turf from "@turf/turf";
import mapServer from "./mapServer";
import { getToken } from "../../../utils/auth";
import modelLayer from "./modelLayer";
import {
  getPublickey,
  getQueryEentity,
  getSettingPublickey,
  getQueryEentity2
} from "../../../api/modelBase.js";
import { nextTick } from "vue";
import JSEncrypt from "jsencrypt";
const layerJson = {
  layerData: null,
  url: null,
  coord: null,
  rectangularSensor: null,
  init(url) {
    this.url = url;
    this.getJsonLayer();
  },
  getJsonLayer() {
    const that = this;
    Cesium.GeoJsonDataSource.load(this.url, {
      stroke: Cesium.Color.fromCssColorString("#FFFFFF"), //多边形或线的颜色
      fill: Cesium.Color.fromCssColorString("#FFFFFF"), //多边形或线的颜色
      strokeWidth: 1, //多边形或线 å®½åº¦
      clampToGround: true //多边形或线 å›ºå®šåœ¨åœ°é¢ä¸Štrue/false
    }).then((dataSource) => {
      const entities = dataSource.entities.values;
      that.layerData = dataSource;
      entities.map((item) => {
        item.polygon.heightReference =
          Cesium.HeightReference.RELATIVE_TO_GROUND; // è´´åœ°
        item.polygon.height = 0; // è·åœ°é«˜åº¦0ç±³
        item.polygon.extrudedHeightReference =
          Cesium.HeightReference.RELATIVE_TO_GROUND; //拉伸
        item.polygon.extrudedHeight = item.properties["ELEVATION"]; // æ‹‰ä¼¸é«˜åº¦
        var polyPositions = item.polygon.hierarchy.getValue().positions;
        var polyCenter = Cesium.BoundingSphere.fromPoints(polyPositions).center; //中心点
        polyCenter = Cesium.Ellipsoid.WGS84.scaleToGeodeticSurface(polyCenter);
        item.position = polyCenter;
        if (item.id == "965") {
          that.coord = {
            lon: item.properties["lon"]._value,
            lat: item.properties["lat"]._value
          };
        }
        item.label = {
          text: "",
          font: "500 20px Helvetica",
          scale: 1,
          style: Cesium.LabelStyle.FILL,
          fillColor: Cesium.Color.WHITE,
          eyeOffset: new Cesium.Cartesian3(
            0.0,
            item.polygon.extrudedHeight + 1,
            -(item.polygon.extrudedHeight + 1)
          ),
          verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
          showBackground: true,
          distanceDisplayCondition: new Cesium.DistanceDisplayCondition(
            50.0,
            500.0
          ),
          backgroundColor: new Cesium.Color(26 / 255, 196 / 255, 228 / 255, 1.0) //背景顔色
        };
      });
      Viewer.dataSources.add(dataSource);
    });
  },
  setQyeryData(res) {
    this.setTitleSetRest();
    if (res.indexOf("海军陆战队") > -1) {
      this.setQueryExtent2();
    } else if (res.indexOf("军事目标") > -1) {
      this.setQueryByFiled("军事目标", "#409EFF", false);
    } else if (res.indexOf("民宅") > -1) {
      this.setQueryByFiled("民宅", "#808080", false);
    } else if (res.indexOf("经济目标") > -1) {
      this.setQueryByFiled("经济目标", "#FFFF00", true);
    } else if (res.indexOf("堤丰") > -1) {
      // this.setQueryTF("SubicBayWeapon_wfs", "weapons", "堤丰系统");
      this.setQueryTF2("堤丰系统");
    }
  },
  getPublickey(res) {
    const encrypt = new JSEncrypt();
    encrypt.setPublicKey(modelLayer.publickey + "");
    return encrypt.encrypt(res);
  },
  setQueryTF2(name) {
    const obj = "weaponname = '" + name + "'" + "";
    const filed = this.getPublickey(obj);
    const layer = modelLayer.layers.filter((item) => {
      if (item.name == "武器点") {
        return item;
      }
    });
    if (layer.length <= 0) return;
    getQueryEentity({
      token: getToken(),
      start: 1,
      count: 0,
      containCount: true,
      layerid: layer[0].id,
      dbid: modelLayer.dbid,
      where: filed
    }).then((response) => {
      if (response.code != 200) return;
      const geom = response.data.items[0];
      const position = [geom._x, geom._y, 0];
      const cylinder = {
        radius: 1000, //半径
        angle: 30, //扫描角度(可选)
        speed: 5, //倍速(可选)
        stackPartitions: 80, //横向网格数(可选)
        slicePartitions: 80, //纵向网格数(可选)
        wallColor: "rgba(255,255,255,0)" //扫描墙颜色(可选)
      };
      this.rectangularSensor = earthCtrl.factory.createRectangularSensor(
        position,
        cylinder
      );
      Viewer.zoomTo(this.rectangularSensor.item);
    });
  },
  setQueryByFiled(name, color, label) {
    const obj = "targettype = '" + name + "'" + "";
    const filed = this.getPublickey(obj);
    var objItem = mapServer.listData.filter((item) => {
      if (item.type === "Tileset") {
        return item;
      }
    });
    if (objItem.length <= 0) return;
    var tileset = objItem[0];
    getQueryEentity({
      token: getToken(),
      start: 1,
      count: 0,
      containCount: true,
      layerid: tileset.layerId,
      dbid: modelLayer.dbid,
      where: filed
    }).then((response) => {
      if (response.code != 200) return;
      var std = [];
      const items = response.data.items;
      items.map((item) => {
        if (item.targettype == name) {
          std.push(item.seid);
        }
      });
      nextTick(() => {
        if (std.length <= 0) return;
        this.setTilesetColorChange(tileset, std, color);
      });
    });
  },
  setTitleSetRest() {
    if (this.rectangularSensor) {
      this.rectangularSensor.wall.forEach((wall) => {
        Viewer.entities.remove(wall);
      });
      Viewer.entities.remove(this.rectangularSensor.item);
      this.rectangularSensor = null;
    }
    var objItem = mapServer.listData.filter((item) => {
      if (item.type === "Tileset") {
        return item;
      }
    });
    if (objItem.length <= 0) return;
    var tileset = objItem[0].layer;
    tileset.style = new Cesium.Cesium3DTileStyle({
      color: {
        evaluateColor: (feature) => {
          return new Cesium.Color.fromCssColorString("#FFFFFF");
        }
      }
    });
  },
  setTilesetColorChange(model, ids, color) {
    var tileset = model.layer;
    tileset.style = new Cesium.Cesium3DTileStyle({
      color: {
        evaluateColor: (feature) => {
          const id = feature.getProperty("id");
          if (ids.indexOf(id) > -1) {
            return new SmartEarth.Cesium.Color.fromCssColorString(color);
          } else {
            return new SmartEarth.Cesium.Color.fromCssColorString("#FFFFFF");
          }
        }
      }
    });
  },
  getTileSet() {
    var objItem = mapServer.listData.filter((item) => {
      if (item.type === "Tileset") {
        return item;
      }
    });
    if (objItem.length <= 0) {
      return null;
    }
    return objItem[0];
  },
  setQueryExtent2() {
    const tileset = this.getTileSet();
    if (!tileset) {
      return;
    }
    const obj = "ejfl like '%空军基地%'";
    const filed = this.getPublickey(obj);
    getQueryEentity({
      token: getToken(),
      start: 1,
      count: 0,
      containCount: true,
      layerid: tileset.layerId,
      dbid: modelLayer.dbid,
      where: filed
    }).then((response) => {
      if (response.code != 200) return;
      const items = response.data.items[0];
      this.getQueryGeomExtent(items, tileset.layerId);
    });
  },
  getQueryGeomExtent(items, layerid) {
    var geom = mapConfig.setPointToCrical(items.lon, items.lat, 1);
    const token = getToken();
    const url =
      config.modelBase.url +
      config.modelBase.geo +
      "/entitydbdata/query/entity";
    axios
      .post(
        url,
        {
          layerid: layerid,
          dbid: modelLayer.dbid,
          geometry: JSON.stringify(geom.geometry),
          returnCountOnly: true,
          token: token
        },
        {
          headers: {
            Authorization: token,
            "Content-Type": "application/x-www-form-urlencoded"
            // 'Cookie': "token=" + token,
            // 'Token': token
          }
        }
      )
      .then((response) => {
        this.getLayerModelList(url, response.data.data, geom.geometry, layerid);
      });
  },
  getLayerModelList(url, count, geom, layerid) {
    const token = getToken();
    axios
      .post(
        url,
        {
          token: token,
          dbid: modelLayer.dbid,
          layerid: layerid,
          start: 1,
          count: count,
          containCount: true,
          geometry: JSON.stringify(geom)
        },
        {
          headers: {
            Authorization: token,
            "Content-Type": "application/x-www-form-urlencoded"
          }
        }
      )
      .then((response) => {
        var std = [];
        const items = response.data.data.items;
        items.map((val) => {
          std.push(val.seid);
        });
        nextTick(() => {
          var objItem = mapServer.listData.filter((item) => {
            if (item.type === "Tileset") {
              return item;
            }
          });
          if (objItem.length <= 0) return;
          var tileset = objItem[0];
          if (std.length <= 0) return;
          this.setTilesetColorChange(tileset, std, "#FF0000");
        });
      });
  },
  setQueryExtent(res) {
    const geom = mapConfig.setPointToCrical(res.lon, res.lat, 5000);
    var arr = [];
    const coord = geom.geometry.coordinates[0];
    coord.map((item) => {
      if (arr.length == 0) {
        arr = item;
      } else {
        arr = [...arr, ...item];
      }
    });
    arr = arr.toString().replaceAll(",", " ");
    this.getQuery(this.url, arr, this.layerData);
  },
  getQuery(url, area, layer) {
    const entity = layer.entities.values;
    entity.filter((rs) => {
      rs.polygon.material = new Cesium.Color.fromCssColorString("#FFFFFF");
    });
    axios
      .get(url, {
        params: {
          version: "1.3.0",
          request: "GetFeature",
          typename: "GeoEntity",
          propertyname: "*",
          format: "json",
          filter: `<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc"><ogc:Intersects><ogc:PropertyName /><gml:Polygon xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4326"><gml:exterior><gml:LinearRing><gml:posList>${area}</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></ogc:Intersects></ogc:Filter>`
        }
      })
      .then((res) => {
        const obj = res.data.features;
        obj.filter((item) => {
          entity.filter((rs) => {
            if (item.id == rs.id) {
              rs.polygon.material = Cesium.Color.RED;
            }
          });
        });
      });
  },
  setQueryTF(content, layer, name) {
    const url = this.getQueryUrl(content, layer);
    axios.get(url).then((res) => {
      const data = res.data.features;
      const obj = data.filter((item) => {
        if (item.properties.weaponname == name) {
          return item;
        }
      });
      if (obj.length <= 0) return;
      var centroid = turf.centroid(obj[0]);
      const geom = centroid.geometry.coordinates;
      const position = [geom[0], geom[1], 0];
      const cylinder = {
        radius: 1000, //半径
        angle: 30, //扫描角度(可选)
        speed: 5, //倍速(可选)
        stackPartitions: 80, //横向网格数(可选)
        slicePartitions: 80, //纵向网格数(可选)
        wallColor: "rgba(255,255,255,0)" //扫描墙颜色(可选)
      };
      const item = earthCtrl.factory.createRectangularSensor(
        position,
        cylinder
      );
      Viewer.zoomTo(item.item);
    });
  },
  getQueryUrl(content, layer) {
    return (
      "https://cim.smartearth.cn/SEserver/wfsserver/" +
      content +
      "?version=1.1.0&request=GetFeature&format=json&typename=" +
      layer
    );
  }
};
export default layerJson;
src/assets/js/map/mapServer.js
@@ -37,26 +37,25 @@
    }
  },
  addTileSetLayer(res) {
    //   const model =  earthCtrl.factory.create3DTilesets({
    //     url: res.url
    // });
    // var model = Viewer.scene.primitives.add(
    //   new Cesium.Cesium3DTileset({
    //     // url: res.url
    //     url:'https://cim.smartearth.cn/SEServer/c3dserver/WhiteBox/tileset.json'
    //   })
    // );
    const tileset = new Cesium.Cesium3DTileset({
      url: res.url
    });
    earthCtrl.primitives.add(tileset);
    Viewer.scene.primitives.add(tileset);
    // const that = this;
    // tileset.readyPromise.then((tileObj) => {
    //   tileObj.tileVisible.addEventListener((tile) => {
    //     if (Cesium.defined(tile.content)) {
    //               var featuresLength = tile.content.featuresLength;
    //               for (var i = 0; i < featuresLength; i++) {
    //                 var feature = tile.content.getFeature(i);
    //                 // console.log(feature.getProperty("id"));
    //               }
    //     }
    //   });
    // });
    this.listData.push({
      layer: tileset,
      type: this.sourceType
      type: this.sourceType,
      layerId: res.id
    });
  },
  traverseVisibleTiles() {
src/assets/js/map/mapView.js
@@ -4,6 +4,7 @@
import modelLayer from "./modelLayer";
import wfsConfig from "./wfsConfig";
import mapInfo from "./mapInfo";
import layerJson from "./mapJsonLayer";
const mapViewer = {
  configTooles: null,
@@ -25,160 +26,14 @@
      sourceType: "arcgis",
      url: "https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer"
    });
    // earthCtrl.factory.createTerrainLayer({
    //   sourceType: "ctb",
    //   url: "https://tiles1.geovisearth.com/base/v1/terrain?token=486dac3bec56d7d7c2a581c150be2bd937462f1e8f3bc9c78b5658b396122405"
    // });
    mapServer.addServer({
      sourceType: "tms",
      url: "http://192.168.11.41:9001/gisserver/tmsserver/SubicBayArea"
    });
    modelLayer.init();
    mapInfo.setEntityQueryInput();
    const url =
      "http://103.135.160.14:9038/gisserver/wfsserver/SubicBayAreaVector_wfs?version=1.1.0&request=GetFeature&format=json&typename=GeoEntity";
    const areaBox =
      "120.28915940000012 14.809144082000034 120.28915940000012 14.837205054000039 120.31165600000003 14.837205054000039 120.31165600000003 14.809144082000034 120.28915940000012 14.809144082000034";
    Cesium.GeoJsonDataSource.load(url, {
      stroke: Cesium.Color.fromCssColorString("#FFF0F5"), //多边形或线的颜色
      fill: Cesium.Color.fromCssColorString("#FFF0F5"), //多边形或线的颜色
      strokeWidth: 1, //多边形或线 å®½åº¦
      clampToGround: true //多边形或线 å›ºå®šåœ¨åœ°é¢ä¸Štrue/false
    }).then((dataSource) => {
      const entities = dataSource.entities.values;
      entities.map((item) => {
        item.polygon.heightReference =
          Cesium.HeightReference.RELATIVE_TO_GROUND; // è´´åœ°
        item.polygon.height = 0; // è·åœ°é«˜åº¦0ç±³
        item.polygon.extrudedHeightReference =
          Cesium.HeightReference.RELATIVE_TO_GROUND; //拉伸
        item.polygon.extrudedHeight = item.properties["ELEVATION"]; // æ‹‰ä¼¸é«˜åº¦
        var polyPositions = item.polygon.hierarchy.getValue().positions;
        var polyCenter = Cesium.BoundingSphere.fromPoints(polyPositions).center; //中心点
        polyCenter = Cesium.Ellipsoid.WGS84.scaleToGeodeticSurface(polyCenter);
        item.position = polyCenter;
        item.label = {
          //文字标签
          text: "",
          font: "500 20px Helvetica", // 15pt monospace
          scale: 1,
          style: Cesium.LabelStyle.FILL,
          fillColor: Cesium.Color.WHITE,
          eyeOffset: new Cesium.Cartesian3(
            0.0,
            item.polygon.extrudedHeight + 1,
            -(item.polygon.extrudedHeight + 1)
          ),
          verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
          showBackground: true,
          distanceDisplayCondition: new Cesium.DistanceDisplayCondition(50.0, 500.0),
          // heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
          // disableDepthTestDistance: Number.POSITIVE_INFINITY,
         backgroundColor: new Cesium.Color(26 / 255, 196 / 255, 228 / 255, 1.0)   //背景顔色
        };
      });
      Viewer.dataSources.add(dataSource);
      this.setQueryProperty(dataSource, "军事目标");
      this.getQuery(url, areaBox, dataSource);
    });
  },
  setQueryProperty(layer, property) {
    const entity = layer.entities.values;
    entity.filter((rs) => {
      if (rs.properties["TargetType"]._value == property) {
        rs.polygon.material = Cesium.Color.RED;
        // æ˜¾ç¤ºæ–‡å­—标签
        rs.label.text = rs.properties["TYPE"];
      }
    });
  },
  getQuery(url, area, layer) {
    axios
      .get(url, {
        params: {
          version: "1.3.0",
          request: "GetFeature",
          typename: "GeoEntity",
          propertyname: "*",
          format: "json",
          filter: `<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc"><ogc:Intersects><ogc:PropertyName /><gml:Polygon xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4326"><gml:exterior><gml:LinearRing><gml:posList>${area}</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></ogc:Intersects></ogc:Filter>`
        }
      })
      .then((res) => {
        const obj = res.data.features;
        // const dataSource = Viewer.dataSources._dataSources.filter((item) => {
        //   if (item.name == layer) {
        //     return item;
        //   }
        // });
        const entity = layer.entities.values;
        // const entity = dataSource[0].entities.values;
        obj.filter((item) => {
          entity.filter((rs) => {
            if (item.id == rs.id) {
              rs.polygon.material = Cesium.Color.CORNFLOWERBLUE;
            }
          });
        });
      });
  },
  getLayerModelCount(res) {
    axios
      .post(
        res.url,
        {
          dbid: res.dbid,
          geometry: res.geometry,
          layerid: res.layerid,
          returnCountOnly: res.containCount,
          token: res.token
        },
        {
          headers: {
            Authorization: res.token,
            "Content-Type": res.contentType
          }
        }
      )
      .then((response) => {
        if (response.status === 200) {
          this.getLayerModelList(res, response.data.data);
        } else {
          this.getLayerModelList(res, 200);
        }
      });
  },
  getLayerModelList(res, count) {
    axios
      .post(
        res.url,
        {
          dbid: res.dbid,
          geometry: res.geometry,
          layerid: res.layerid,
          containCount: res.containCount,
          token: res.token,
          count: count,
          start: 1,
          outfields: res.outfields
        },
        {
          headers: {
            Authorization: res.token,
            "Content-Type": res.contentType
          }
        }
      )
      .then((response) => {
        console.log("List", response);
      });
    // const url = layerJson.getQueryUrl("SubicBayAreaVector_wfs", "GeoEntity");
    // layerJson.init(url);
  }
};
export default mapViewer;
src/assets/js/map/modelLayer.js
@@ -1,7 +1,10 @@
import {
  getPublickey,
  getSecurityLogin,
  getListCanview
  getListCanview,
  getmapConfig,
  getQueryEentity,
  getSettingPublickey
} from "../../../api/modelBase.js";
import JSEncrypt from "jsencrypt";
import store from "../../../store/index.js";
@@ -14,35 +17,43 @@
  modelBase: null,
  dbid: null,
  geom: null,
  // èŽ·å–Publickey
  layers: null,
  publickey: null,
  init() {
    this.modelBase = config.modelBase;
    getPublickey().then((response) => {
      const password = this.modelBase.password;
      const userId = this.modelBase.userId;
      const publickey = response.data;
      const encrypt = new JSEncrypt();
      encrypt.setPublicKey(publickey);
      let encrypted = encrypt.encrypt(password.substring(0, 50)) + "";
      let submit = {
        userid: userId,
        password: encrypted
      };
      this.setLoginsubmit(submit);
    this.getSettingPublicKey();
    const token = getToken();
    console.log("token", token);
    if (token) {
      this.getModelLayerList();
    } else {
      getPublickey().then((response) => {
        const password = this.modelBase.password;
        const userId = this.modelBase.userId;
        const publickey = response.data;
        const encrypt = new JSEncrypt();
        encrypt.setPublicKey(publickey);
        let encrypted = encrypt.encrypt(password.substring(0, 50)) + "";
        let submit = {
          userid: userId,
          password: encrypted
        };
        this.setLoginsubmit(submit);
      });
    }
  },
  getSettingPublicKey() {
    getSettingPublickey().then((response) => {
      this.publickey = response.data;
    });
  },
  // èŽ·å–Token
  setLoginsubmit(res) {
    // const token = getToken();
    // if (token) {
    getSecurityLogin(res).then((response) => {
      const val = response.data.token;
      setToken(val);
      this.getModelLayerList();
    });
    // } else {
    //   this.getModelLayerList( );
    // }
  },
  // èŽ·å–åˆ—è¡¨
  getModelLayerList() {
@@ -56,19 +67,40 @@
      });
      if (obj.length > 0) {
        this.dbid = obj[0].dbid;
        this.getmapConfig();
      }
    });
    this.setLayerQuery();
  },
  getmapConfig() {
    getmapConfig({
      dbid: this.dbid,
      token: getToken()
    }).then((response) => {
      if (response.code != 200) return;
      const layers = response.data.layers;
      this.layers = layers;
      for (var i in layers) {
        if (layers[i].name == "建筑") {
          const url = layers[i].lod_url["3d"][""];
          mapServer.addServer({
            sourceType: "Tileset",
            url: url,
            id: layers[i].id
          });
        }
      }
    });
  },
  setLayerQuery() {
    const token = getToken();
    this.geom = mapConfig.setPointToCrical(120.27, 14.79, null);
    const obj = {
      type: "FeatureCollection",
      totalFeatures: 1086,
      features: [this.geom]
    };
    // const obj = {
    //   type: "FeatureCollection",
    //   totalFeatures: 1086,
    //   features: [this.geom]
    // };
    // earthCtrl.factory.createFeatureLayer({
    //   sourceType: "geojson",
    //   url: obj,
@@ -168,11 +200,11 @@
    //
    a.push([
      // "${id} == '1_b092c0c26de646b984801e29fba37f82'",
      '${id} == 1_b092c0c26de646b984801e29fba37f82',
       'color("purple", 0.5)'
      "${id} == 1_b092c0c26de646b984801e29fba37f82",
      'color("purple", 0.5)'
    ]);
    a.push(["true", "color('#E8F1F2', 0.5)"]);
    console.log(   tileset);
    console.log(tileset);
    tileset.style = new Cesium.Cesium3DTileStyle({
      // color: "vec4(1.0,1.0,1.0, 1.0)", // çº¢è‰²
      color: {
@@ -180,7 +212,7 @@
          [
            // "${id} == '1_b092c0c26de646b984801e29fba37f82'",
            '${targettype} == "军事目标"',
             'color("purple", 0.5)'
            'color("purple", 0.5)'
          ]
        ]
      }
src/assets/js/msg/msgData.js
@@ -1,33 +1,68 @@
import store from "../../../store";
const msgData = {
  mine: null,
  imgurl: null,
  getRole(type, msg) {
    if (type == "markDown") {
      return {
        msg: {
          date: this.getDate(),
          text: { text: msg },
          mine: false,
          name: "[GeoAgent]",
          img: this.getImgUrl("ai"),
          file: null,
          fileList: [],
          markDown: true
        }
      };
    }
    const imgurl = this.getImgUrl(type);
    var roleMsg = this.getTest(msg);
    this.imgurl = this.getImgUrl(type);
    this.mine = this.getMine(type);
    return {
      msg: this.getMsg(imgurl, roleMsg[0])
    };
    var roleMsg = this.getTest(msg);
    const obj = {
      msg: this.getMsg(this.imgurl,roleMsg)
    }
    return obj ;
  },
  getLoader() {
    this.mine = true;
    var url = config.imgUrl + aiData.aiRole_img;
    const showload =
      " <div class='parentBox'>  <div class='loadBox'> <div class='loaderContantBox'></div> </div>  </div>";
    return this.getMsg(url, [
      {
        type: "loader",
        val: showload
      }
    ]);
  },
  getRagData(res, more, msg) {
    return [
      {
        type: "rag",
        acction: res.a,
        question: res.q,
        more: more,
        msg: msg,
        source: res.sourceName
      }
    ];
  },
  getImgUrl(type) {
    var url = config.imgUrl;
    if (type == "ai") {
      url = url + aiData.aiRole_img;
    } else if (type == "role") {
      url = url + aiData.role_img;
    }
    return url;
  },
  getMine(type) {
    if (type == "ai") {
      return true;
    } else if (type == "role") {
      return false;
    }
  },
  getTest(res) {
    var flag = aiData.aiMsg.indexOf(res);
    var data = aiData.msg[flag];
    return [{ text: res }, data];
    return [
      {
        type: "text",
        val: res
      }
    ];
  },
  setShowMsg(res) {
    var obj = { text: this.getAiToRoleMsg(res) };
@@ -85,23 +120,7 @@
    }
    return val;
  },
  getImgUrl(type) {
    var url = config.imgUrl;
    if (type == "ai") {
      url = url + aiData.aiRole_img;
    } else if (type == "role") {
      url = url + aiData.role_img;
    }
    return url;
  },
  getMine(type) {
    if (type == "ai") {
      return true;
    } else if (type == "role") {
      return false;
    }
  },
  setmsgtab(tab) {
    var url = config.imgUrl + aiData.aiRole_img;
    var thead = tab[0];
@@ -180,54 +199,14 @@
      }
    }, 150);
  },
  getLoader() {
    this.mine = true;
    var url = config.imgUrl + aiData.aiRole_img;
    var msg = {
      // text: "<div class='loading'></div>"
      text: " <div class='parentBox'>  <div class='loadBox'> <div class='loaderContantBox'></div> </div>  </div>"
    };
    return this.getMsg(url, msg);
  },
  getMsg(imgurl, msg) {
    // const fileContent = [];
    // const fileMile = null;
    // if (msg.text.indexOf("苏比克湾") > -1) {
    //   fileContent = [
    //     {
    //       name: "已找到2份相关文档",
    //       url: "testUrl"
    //     },
    //     {
    //       name: "Markdown.md",
    //       url: "http://192.168.11.66:12316/Markdown.md"
    //     },
    //     {
    //       name: "Markdown.md",
    //       url: "http://192.168.11.66:12316/Markdown1.md"
    //     }
    //   ];
    //   fileMile = fileContent[0].url;
    //   return {
    //     date: this.getDate(),
    //     text: msg,
    //     mine: false,
    //     name: this.mine ? "[GeoAgent]" : "[您]",
    //     img: imgurl,
    //     file: fileMile,
    //     fileList: fileConten,
    //     markDown: false
    //   };
    // }
    return {
      date: this.getDate(),
      text: msg,
      list: msg,
      mine: false,
      name: this.mine ? "[GeoAgent]" : "[您]",
      img: imgurl,
      markDown: false
      img: imgurl
    };
  },
  getDate() {
src/components/Chat/chatList.vue
@@ -2,12 +2,9 @@
  <div class="body">
    <div :style="pageConfig.width | setWidth">
      <div class="web__main" ref="main">
        <div
          class="web__main-item"
          v-for="(item, index) in list"
          :key="loding(index)"
          :class="{ 'web__main-item--mine': item.mine }"
        >
        <div class="web__main-item" v-for="(item, index) in list" :key="loding(index)"
          :class="{ 'web__main-item--mine': item.mine }">
          <div class="web__main_content">
            <div>
              <img :src="item.img" />
@@ -18,7 +15,7 @@
                  <div style="display: flex">
                    {{ item.name }}
                    <div style="margin-left: 10px" v-show="item.file">
                    <!-- <div style="margin-left: 10px" v-show="item.file">
                      <el-select
                        @change="(val) => setFileChange(val)"
                        v-model="item.file"
@@ -32,7 +29,7 @@
                        >
                        </el-option>
                      </el-select>
                    </div>
                    </div> -->
                  </div>
                  <div>
@@ -40,53 +37,39 @@
                  </div>
                </cite>
              </div>
              <div v-show="item.markDown == true" class="web__main-text">
                <VueMarkdown
                  class="web_Main_markDown"
                  :source="item.text.text"
                ></VueMarkdown>
              <div class="web__main-text">
                <div v-for="(res, key) in item.list" :key="key">
                  <div v-if="res.type === 'text'">
                    {{ res.val }}
                  </div>
                  <div v-else-if="res.type == 'loader'">
                    <span v-html="handleDetail(res.val)" ref="content"></span>
                  </div>
                  <div style="margin-bottom:10px" v-else-if="res.type == 'rag'">
                    <div v-show="res.acction">
                      {{ res.acction }}
                    </div>
                    <div> {{ res.question }} </div>
                    <div style="display: flex;">
                      æ¥æº: {{ res.source }}
                      <div @click.stop="setRagMoreList(res.msg)" class="setRagMore" v-show="res.more">
                        ...更多
                      </div>
                    </div>
                  </div>
                </div>
              </div>
              <div v-show="item.markDown == false" class="web__main-text">
                <div class="web__main-arrow"></div>
                <span
                  v-html="handleDetail(item.text.text)"
                  ref="content"
                ></span>
                <ul class="web__main-list" v-if="item.text.list">
                  <li
                    @click="handleItemMsg(citem)"
                    v-for="(citem, cindex) in item.text.list"
                    :key="cindex"
                  >
                    {{ citem.text }}
                  </li>
                </ul>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
    <el-dialog
      :visible.sync="show"
      width="40%"
      append-to-body
      :before-close="handleClose"
      class="web__dialog"
    >
    <el-dialog :visible.sync="show" width="40%" append-to-body :before-close="handleClose" class="web__dialog">
      <img :src="imgSrc" v-if="imgSrc" style="width: 100%; object-fit: cover" />
      <video
        :src="videoSrc"
        v-if="videoSrc"
        style="width: 100%; object-fit: cover"
        controls="controls"
      ></video>
      <audio
        :src="audioSrc"
        v-if="audioSrc"
        style="width: 100%; object-fit: cover"
        controls="controls"
      ></audio>
      <video :src="videoSrc" v-if="videoSrc" style="width: 100%; object-fit: cover" controls="controls"></video>
      <audio :src="audioSrc" v-if="audioSrc" style="width: 100%; object-fit: cover" controls="controls"></audio>
    </el-dialog>
  </div>
</template>
@@ -108,9 +91,9 @@
    setWidth(value) {
      let width = value;
      if (`${value}`.match(/^\d+$/)) {
        width = value-30 + "px";
        width = value - 30 + "px";
      }
      if(width=="100vh"){
      if (width == "100vh") {
        return "99vh"
      }
      return width;
@@ -134,7 +117,8 @@
      show: false,
      imgSrc: "",
      videoSrc: "",
      audioSrc: ""
      audioSrc: "",
      isDisabled: true,
    };
  },
  watch: {
@@ -148,6 +132,18 @@
    }
  },
  methods: {
    setRagMoreList(res) {
      if (this.isDisabled) {
        this.isDisabled = false;
        setTimeout(() => {
          bus.$emit("setRagMoreListAll", res);
        }, 500);
        setTimeout(() => {
          this.isDisabled = false;
        }, 3000)
      }
    },
    setFileChange(res) {
      if (res == "testUrl") return;
      axios.get(res).then((response) => {
@@ -264,6 +260,7 @@
  cursor: pointer;
  display: block;
}
.web__msg--img[data-class="iconBox"] {
  max-width: 24px;
  min-width: unset;
@@ -292,8 +289,8 @@
  font-size: 20px;
  background: #555555;
  padding: 10px !important;
  border-radius:10px !important;
  margin-top:10px ;
  border-radius: 10px !important;
  margin-top: 10px;
}
@@ -329,11 +326,13 @@
  padding-left: 0px;
  font-style: normal;
}
.citeTitle {
  width: 100%;
  display: flex;
  justify-content: space-between;
}
.web__main-text {
  /* max-width: 40%; */
  width: 100%;
@@ -349,15 +348,18 @@
  font-size: 16px;
  word-break: break-all;
}
.web__main_content {
  width:  calc(100% - 50px);
  width: calc(100% - 50px);
  padding: 10px 0px;
  display: flex;
}
.web__main_Date {
  flex: 1;
  padding: 0px 15px;
}
.web__main_Date cite {
  line-height: 24px;
  font-size: 14px;
@@ -369,6 +371,7 @@
  display: flex;
  justify-content: space-between;
}
.web__main-arrow {
  top: 6px;
  left: -8px;
@@ -459,8 +462,19 @@
  font-size: 16px;
  color: #f2f2f2;
}
.web__main-text img {
  max-width: 200px;
}
.setRagMore {
  margin-left: 10px;
}
.setRagMore:hover {
  color: #409EFF;
}
</style>
<style>
@@ -469,6 +483,7 @@
  /* background: rgb(31, 31, 31); */
  padding: 20px;
}
.loadBox .loaderContantBox {
  color: white;
  font-size: 40px;
@@ -520,44 +535,51 @@
@keyframes round {
  0% {
    transform: rotate(0deg); /* å¼€å§‹æ—‹è½¬ div å…ƒç´  */
    transform: rotate(0deg);
    /* å¼€å§‹æ—‹è½¬ div å…ƒç´  */
  }
  100% {
    transform: rotate(360deg); /* ç»“束旋转 div å…ƒç´  */
    transform: rotate(360deg);
    /* ç»“束旋转 div å…ƒç´  */
  }
}
</style>
<style >
 .web_Main_markDown h1 {
<style>
.web_Main_markDown h1 {
  line-height: 30px !important;
  font-size: 20px !important;
}
.web_Main_markDown h2  {
.web_Main_markDown h2 {
  line-height: 25px !important;
  font-size: 18px !important;
  margin-left: 10px;
}
.web_Main_markDown h3 {
  line-height: 25px !important;
  font-size: 18px !important;
  margin-left: 10px;
}
.web_Main_markDown li {
  line-height: 20px !important;
  font-size: 16px !important;
  margin-left: 20px;
}
.web_Main_markDown p {
  line-height: 20px !important;
  font-size: 16px !important;
  margin-left: 20px;
}
.web_Main_markDown   {
   background: #555555;
   padding: 10px;
   border-radius: 10px;
.web_Main_markDown {
  background: #555555;
  padding: 10px;
  border-radius: 10px;
}
</style>
src/store/index.js
@@ -7,9 +7,10 @@
  state: {
    setMenuFlag: false,
    setMsgData: null,
    setScreenFlag: true,
    setScreenFlag: false,
    erroInfoMessage: null,
    token: null
    token: null,
    ragList: []
  },
  mutations: {},
  actions: {},
src/utils/modelGeo.js
@@ -16,7 +16,7 @@
  (config) => {
    // å¯ä»¥åœ¨è¿™é‡Œæ·»åŠ è¯·æ±‚å¤´ç­‰ä¿¡æ¯
    let token = getToken();
    console.log("213",token);
    if (token) {
      config.headers["Authorization"] = token;
    }
src/views/chartView/index.vue
@@ -15,6 +15,8 @@
import { getAIMessage, getV1Fastgpt } from "../../api/api.js";
import mapInfo from "../../assets/js/map/mapInfo.js";
import axios from "axios";
import layerJson from "../../assets/js/map/mapJsonLayer.js";
import { factors } from "@turf/turf";
export default {
  name: "jwChat",
@@ -70,12 +72,17 @@
    }, config.loadTime);
    bus.$on("mapInfo", (res) => {
      if (res) {
        this.setMapInfo(res);
        // this.setMapInfo(res);
      }
    });
    bus.$on("setInsertMarkDown", (res) => {
      if (res) {
        this.setMarkDownInfo(res);
      }
    });
    bus.$on("setRagMoreListAll", res => {
      if (res) {
        this.setRagMoreList(res);
      }
    });
    // axios.get("http://192.168.11.89:12315/Markdown.md").then((response) => {
@@ -88,20 +95,41 @@
  methods: {
    bindEnter() {
      const msg = this.inputMsg;
      if (!msg) return;
      this.getMsg("role", msg);
      this.setLoading();
      setTimeout(() => {
        this.setMsgStart(msg);
      }, 200);
    },
    async setMsgStart(res) {
      if (res == "三维实景") {
      if (res.indexOf("军事目标") > -1 || res.indexOf("民宅") > -1 || res.indexOf("经济目标") > -1 || res.indexOf("海军陆战队") > -1 || res.indexOf("堤丰") > -1) {
        this.$store.state.setScreenFlag = true;
        this.list.splice(-1, 1);
        this.loading = false;
        layerJson.setQyeryData(res);
      }
      // else if(res.indexOf("苏比克湾") > -1){
      //   this.$store.state.setScreenFlag = true;
      //   this.list.splice(-1, 1);
      //   this.loading = false;
      //   this.$nextTick(() => {
      //         setTimeout(() => {
      //           mapInfo.setEntityQueryInput();
      //         }, 1000);
      //       });
      // }
      else if (res == "三维实景") {
        layerJson.setTitleSetRest();
        this.setV1Fastgpt(res)
      } else {
        const data = await getAIMessage(res);
        if (data.status == 200) {
        if (data.code == 200) {
          if (data.content) {
            this.getMsg("ai", data.content);
          } else {
@@ -118,36 +146,69 @@
        }
      }
    },
    async setV1Fastgpt(res) {
      const data = await getV1Fastgpt(res);
      const obj = data.split(/[\n]/)
      const list_a = [];
      obj.filter(item => {
        if (item.indexOf("data: ") > -1) {
          if (item.indexOf('nodeId') > -1) {
          } else  if(item.indexOf("content")>-1){
            const a = JSON.parse(item.split('data: '))
            console.log(a);
            // if (a.choices[0].content) {
            //   console.log(a.choices[0].content);
            // }
    setRagMoreList(res) {
      const obj = this.$store.state.ragList
      const val_data = obj.filter(item => {
        if (item.quest === res) {
          return item;
        }
      });
      if (val_data.length <= 0) return
      this.$store.state.ragList = obj;
      const val_obj = val_data[0]
      const key = val_obj.index;
      const val = val_obj.val;
      this.list[key].list[0].more = false;
      var flag = 1;
      var intValTime = setInterval(() => {
        if (flag >= val.length) {
          const obj = JSON.parse(JSON.stringify(this.list))
          this.list = obj
          for (var i in obj) {
            if (obj[i].quest === res) {
              obj.splice(i, 1)
            }
          }
          clearInterval(intValTime)
          return
        }
        const valitem = val[flag];
        const roleMsg = msgData.getRagData(valitem, false, "");
        this.list[key].list.push(roleMsg[0])
        flag++
      }, 1000);
    },
    setRagInterval(flag, index, res) {
      if (flag < res.length) {
        const obj = res[flag]
        this.list[index].list.push(roleMsg[0])
        setTimeout(() => {
          flag++;
          this.setRagInterval(flag, index, res)
        }, 1000);
      } else {
        return
      }
    },
    async setV1Fastgpt(res) {
      const data = await getV1Fastgpt(res);
      const length = this.list.length - 1;
      const obj = data[0].quoteList
      this.$store.state.ragList.push({
        quest: res,
        index: length,
        val: obj
      })
      // console.log(list_a)
      // const a = val_data[0].split('data: ');
      // const b = JSON.parse(a[1]);
      // console.log(b)
      // const c = b[1].historyPreview.length - 1;
      // const d = b[1].historyPreview[c].value
      // this.getMsg("ai", d);
      var roleMsg = msgData.getRagData(obj[0], true, res);
      this.list[length].list = roleMsg
      this.loading = false;
    },
    setMarkDownInfo(res) {
      var roleMsg = msgData.getRole("markDown", res);
      this.list.push(roleMsg.msg);
      // 
@@ -162,10 +223,14 @@
    },
    getMsg(type, msg) {
      var roleMsg = msgData.getRole(type, msg);
      if (this.loading) {
        this.loading = false;
        const length = this.list.length - 1;
        this.list[length].text = roleMsg.msg.text;
        this.list[this.list.length - 1].list = roleMsg.msg.list;
      } else {
        this.list.push(roleMsg.msg);
      }