From c93d4b3af5739f786cfdf20b16b28ec60403f709 Mon Sep 17 00:00:00 2001 From: suerprisePlus <15810472099@163.com> Date: 星期二, 25 六月 2024 19:53:54 +0800 Subject: [PATCH] 前端对接 seb实体库,rag基本服务 --- src/components/Chat/chatList.vue | 148 ++++--- src/assets/js/map/mapServer.js | 27 src/assets/js/map/mapView.js | 153 ------- src/assets/js/msg/msgData.js | 137 +++---- src/store/index.js | 5 src/assets/js/map/mapConfig.js | 16 src/views/chartView/index.vue | 123 ++++- src/api/modelBase.js | 18 src/assets/js/map/modelLayer.js | 90 +++- src/utils/modelGeo.js | 2 src/assets/js/map/mapJsonLayer.js | 387 ++++++++++++++++++++ 11 files changed, 737 insertions(+), 369 deletions(-) diff --git a/src/api/modelBase.js b/src/api/modelBase.js index 793cd10..56de610 100644 --- a/src/api/modelBase.js +++ b/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 diff --git a/src/assets/js/map/mapConfig.js b/src/assets/js/map/mapConfig.js index e878070..00bca62 100644 --- a/src/assets/js/map/mapConfig.js +++ b/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; } }; diff --git a/src/assets/js/map/mapJsonLayer.js b/src/assets/js/map/mapJsonLayer.js new file mode 100644 index 0000000..8e3f97c --- /dev/null +++ b/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; diff --git a/src/assets/js/map/mapServer.js b/src/assets/js/map/mapServer.js index 5f00d01..842ed03 100644 --- a/src/assets/js/map/mapServer.js +++ b/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() { diff --git a/src/assets/js/map/mapView.js b/src/assets/js/map/mapView.js index cb1b052..515ac66 100644 --- a/src/assets/js/map/mapView.js +++ b/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; diff --git a/src/assets/js/map/modelLayer.js b/src/assets/js/map/modelLayer.js index dfd6536..f7063ab 100644 --- a/src/assets/js/map/modelLayer.js +++ b/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)' ] ] } diff --git a/src/assets/js/msg/msgData.js b/src/assets/js/msg/msgData.js index cd40b06..6149c3a 100644 --- a/src/assets/js/msg/msgData.js +++ b/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() { diff --git a/src/components/Chat/chatList.vue b/src/components/Chat/chatList.vue index 22c0501..cd22876 100644 --- a/src/components/Chat/chatList.vue +++ b/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> \ No newline at end of file diff --git a/src/store/index.js b/src/store/index.js index 518455c..a18ed61 100644 --- a/src/store/index.js +++ b/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: {}, diff --git a/src/utils/modelGeo.js b/src/utils/modelGeo.js index 7b0ed02..d4b1ddf 100644 --- a/src/utils/modelGeo.js +++ b/src/utils/modelGeo.js @@ -16,7 +16,7 @@ (config) => { // 鍙互鍦ㄨ繖閲屾坊鍔犺姹傚ご绛変俊鎭� let token = getToken(); - console.log("213",token); + if (token) { config.headers["Authorization"] = token; } diff --git a/src/views/chartView/index.vue b/src/views/chartView/index.vue index 5ccfc60..f1909c2 100644 --- a/src/views/chartView/index.vue +++ b/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); } -- Gitblit v1.9.3