From f6ca44fd34e71b9d5ae9a52ac6b7781a13b8ed7b Mon Sep 17 00:00:00 2001
From: guoshilong <123456>
Date: Tue, 14 Feb 2023 11:00:57 +0800
Subject: [PATCH] 安保管理地图选点
---
vue.config.js | 14
src/api/security/security.js | 42 +
src/views/security/security.vue | 882 ++++++++++++-----------
src/components/map/searchMap.vue | 89 ++
src/components/map/searchMapBox.vue | 350 +++++++++
src/components/map/mapBox.vue | 847 +++++++++++-----------
6 files changed, 1,376 insertions(+), 848 deletions(-)
diff --git a/src/api/security/security.js b/src/api/security/security.js
index 7e6cbf7..44d9025 100644
--- a/src/api/security/security.js
+++ b/src/api/security/security.js
@@ -67,3 +67,45 @@
})
}
+//http://192.168.0.112:18080/sf3d/area/getAoiByPt?lng=117.9471794&lat=28.4474852&height=0&tolerance=10&adcode=361102
+export const getAoiByPt = (row) =>{
+ return request({
+ url:'http://192.168.0.112:18080/sf3d/area/getAoiByPt',
+ method:'get',
+ data:row
+ })
+}
+
+//192.168.0.112:9091/zhs/bs/search?ak=ebf48ecaa1fd436fa3d40c4600aa051f®ion=361100&query=公安局&ids=61743e28bbf11700e9fc4ef03dd8bea9
+export const searchByQuery = (ak, region, query, ids) => {
+ return request({
+ url: '/bsapi/zhs/bs/search',
+ method: 'get',
+ params: {
+ ak,
+ region,
+ query,
+ ids
+ }
+ })
+}
+
+//http://{IP}:{PORT}/zhs/bs/search?ak=***&query= 万 达 商 场
+// ®ion=440300®ion_type=circle&page_size=3&page_num=1&infos=1&radius=500&location=113.841901,22.628249
+export const searchByLonLat = (ak, query,region,region_type,page_size,page_num,infos,radius,location) => {
+ return request({
+ url: '/bsapi/zhs/bs/search',
+ method: 'get',
+ params: {
+ ak,
+ query,
+ region,
+ region_type,
+ page_size,
+ page_num,
+ infos,
+ radius,
+ location
+ }
+ })
+}
diff --git a/src/components/map/mapBox.vue b/src/components/map/mapBox.vue
index e2d53b9..67a5ce4 100644
--- a/src/components/map/mapBox.vue
+++ b/src/components/map/mapBox.vue
@@ -1,448 +1,449 @@
<template>
- <div>
- <div id='map' :style="{ height: isDetail ? '90vh' : '40vh', width: '100%' }" ref="MapContent">
- <div style="position: absolute;right:40%;top:-1%;z-index: 999999">
- <p style="margin-top: 10px" v-if="!isDetail">
- <el-button type="primary" size="small" @click="point()">绘制区域</el-button>
- <el-button size="small" @click="clearDraw()">重置</el-button>
- </p>
- </div>
- <!--画线后的提示-->
- <div class="mapTip" v-if="showTip" :style="{ top: tipPosition.h + 'px', left: tipPosition.w + 'px' }">
- {{ tipTitle }}
- </div>
- </div>
+ <div>
+ <div id='map' :style="{ height: isDetail ? '90vh' : '40vh', width: '100%' }" ref="MapContent">
+ <div style="position: absolute;right:40%;top:-1%;z-index: 999999">
+ <p style="margin-top: 10px" v-if="!isDetail">
+ <el-button type="primary" size="small" @click="point()">绘制区域</el-button>
+ <el-button size="small" @click="clearDraw()">重置</el-button>
+ </p>
+ </div>
+ <!--画线后的提示-->
+ <div class="mapTip" v-if="showTip" :style="{ top: tipPosition.h + 'px', left: tipPosition.w + 'px' }">
+ {{ tipTitle }}
+ </div>
</div>
+ </div>
</template>
<script>
import 'ol/ol.css'
-import { Map, View, Feature } from 'ol'
+import {Map, View, Feature} from 'ol'
import VectorSource from 'ol/source/Vector'
import Cluster from 'ol/source/Cluster'
-import { Vector as VectorLayer, Tile as TileLayer } from 'ol/layer'
+import {Vector as VectorLayer, Tile as TileLayer} from 'ol/layer'
import LineString from "ol/geom/LineString"
import Point from 'ol/geom/Point'
import Icon from 'ol/style/Icon'
-import { Style, Fill as StyleFill, Stroke as StyleStroke, Text as StyleText, Circle as StyleCircle } from 'ol/style'
-import { Circle as GeomCircle, Point as GeomPoint, LineString as GeomLineString, Polygon as GeomPolygon } from 'ol/geom'
+import {Style, Fill as StyleFill, Stroke as StyleStroke, Text as StyleText, Circle as StyleCircle} from 'ol/style'
+import {Circle as GeomCircle, Point as GeomPoint, LineString as GeomLineString, Polygon as GeomPolygon} from 'ol/geom'
import Draw from 'ol/interaction/Draw'
import XYZ from "ol/source/XYZ"
import 'ol/ol.css'
export default {
- name: 'mapBox',
- props: ['routeRange', 'isDetail'],
- data () {
- return {
- map: null,
- points: [],
- // 线条点数组
- linePoints: [],
- // 多边形数组
- polygonPoints: [],
- draw: null,
- drawLayer: null,
- lineVector: null,
- pointVector: null,
- polygonVector:null,
- coordinates: [],// 保存绘画坐标地址 [[115.90490549080435, 28.746101718722358],[115.93151300423209, 28.741123538790717]]
- toData: null,// 保存数据库格式坐标地址
- showTip: false,
- tipPosition: {//提示的位置
- w: 200,
- h: 10,
- },
- tipTitle: null
- }
- },
- methods: {
-
- createMap () {
- let _this = this
-
- _this.map = new Map({
- target: 'map',
- layers: [
- new TileLayer({
- source: new XYZ({
- url: "https://webmap-tile.sf-express.com/MapTileService/rt?fetchtype=static&x={x}&y={y}&z={z}&project=sfmap&pic_size=256&pic_type=png8&data_name=361100&data_format=merged-dat&data_type=normal", // 行政区划
- })
- }),
-
- ],
- view: new View({
- // 设置中心点,默认南昌,用于规划南昌市的路线
- center: [115.9032747077233, 28.67433116990186],
- projection: 'EPSG:4326',
- // 设置缩放倍数
- zoom: 13,
- minZoom: 8,
- maxZoom: 19
- })
- })
- _this.lineVector = new VectorLayer({
- //layer所对应的source
- source: new VectorSource({
- wrapX: false // 禁止横向无限重复(底图渲染的时候会横向无限重复),设置了这个属性,可以让绘制的图形不跟随底图横向无限重复
- }),
- })
- _this.pointVector = new VectorLayer({
- //layer所对应的source
- source: new VectorSource({
- wrapX: false // 禁止横向无限重复(底图渲染的时候会横向无限重复),设置了这个属性,可以让绘制的图形不跟随底图横向无限重复
- }),
- })
- _this.polygonVector = new VectorLayer({
- //layer所对应的source
- source: new VectorSource({
- wrapX: false // 禁止横向无限重复(底图渲染的时候会横向无限重复),设置了这个属性,可以让绘制的图形不跟随底图横向无限重复
- }),
- })
- _this.map.addLayer(_this.lineVector)
- _this.map.addLayer(_this.pointVector)
- _this.map.addLayer(_this.polygonVector)
- //在地图上回显线或点
- _this.startAdd(_this.routeRange)
- },
- // 绘画之后的样式
- styleFunction () {
- // 绘画之后的样式
- let styles = [
- new Style({
- fill: new StyleFill({ color: "rgba(255, 255, 255, 0.2)" }),
- stroke: new StyleStroke({
- color: 'rgb(252, 94, 32)',
- width: 5
- })
- })
- ]
- return styles
- },
- // 添加线路
- addLineDraw (toData) {
- // toData = 'LINESTRING(115.90505364627936 28.740342332731327,115.9119724729309 28.74040302419318,115.90766337913915 28.73566909016844)'
- if (toData) {
- // 将数据库点坐标数据转换
- let entityData = ""
- let entityArr = []
- entityData = toData.match(/\(([^)]*)\)/)
- if (entityData && entityData != "") {
- entityData = entityData[1].split(",")
- for (let j = 0; j < entityData.length; j++) {
- entityArr.push([
- Number(entityData[j].split(" ")[0]),
- Number(entityData[j].split(" ")[1]),
- ])
- }
- }
- // let lineCoords = [[115.90490549080435, 28.746101718722358],[115.93151300423209, 28.741123538790717],[115.90696542732779, 28.73408542233564],[115.90696542732779, 28.73408542233564]]
- let lineCoords = entityArr
- let view = this.map.getView()
- view.setCenter([
- lineCoords[Math.ceil(lineCoords.length / 2)][0],
- lineCoords[Math.ceil(lineCoords.length / 2)][1],
- ])
- view.setZoom(14.5)
-
- let feature_LineString = new Feature({
- geometry: new LineString(lineCoords),
- })
- feature_LineString.setStyle(this.styleFunction())// 设置样式
- this.lineVector.getSource().addFeature(feature_LineString)
- }
- },
- // 添加点
- addPoint (pointLonLat) {
- // pointLonLat = POINT(115.87531914674 28.8603307485585)
- if (pointLonLat) {
- let pointData = ""
- let pointArray = []
- pointData = pointLonLat.match(/\(([^)]*)\)/)
- pointArray = pointData[1].split(" ")
- //设置点
- let feature_Point = new Feature({
- geometry: new Point([Number(pointArray[0]), Number(pointArray[1])])
- })
- //点样式
- let style = new Style({
- image: new Icon({
- src: "/img/dwicon.jpeg",
- anchor: [0.48, 0.52],
- // imgSize: [250,320],
- scale: 0.2
- }),
- })
- feature_Point.setStyle(style)
- this.pointVector.getSource().addFeature(feature_Point)
- let center = [Number(pointArray[0]), Number(pointArray[1])]
- let view = this.map.getView()
- view.setZoom(16)
- view.animate({
- center: center,
- duration: 5,
- })
- }
- },
- //回显多边形区域
- addPolygon(area){
-
- },
- // 将点坐标集合转换为数据库数据
- doData (val) {
- let str = "LINESTRING("
- for (let k = 0; k < val.length; k++) {
- str += `${val[k][0]} ${val[k][1]}`
- if (k != val.length - 1) {
- str += ","
- }
- }
- str =str +","+ `${val[0][0]} ${val[0][1]}`
- str += ")"
- // console.log(str)
- return '\'' + str + '\''
- },
- // 开始绘制
- point () {
- let _this = this
- _this.coordinates = []
- _this.map.removeInteraction(_this.draw)
- _this.polygonVector.getSource().clear()
- //提示
- if (!_this.showTip) {
- _this.showTip = true
- }
- _this.tipTitle = "单击左键或者右键开始绘画"
- //提示器
- function mapMousemove (e) {
- _this.setTipPosition(e.offsetX, e.offsetY, 5, 5)
- }
- this.$refs.MapContent.addEventListener('mousemove', mapMousemove)
- // this.$refs.MapContent.removeEventListener('mousemove', mapMousemove)
-
- function mapMousedown () {
- _this.tipTitle = "可继续,或选择最终位置双击结束绘画"
- }
- this.$refs.MapContent.addEventListener('mousedown', mapMousedown)
- // this.$refs.MapContent.removeEventListener('mousedown', mapMousedown)
-
- _this.draw = new Draw({
- source: _this.polygonVector.getSource(),
- type: 'Polygon',
- style: new Style({
- stroke: new StyleStroke({
- color: "red",
- width: 3,
- })
- }),
- })
- _this.map.addInteraction(_this.draw)
- // 点击事件
- _this.map.on('click', function (e) {
- // 将点坐标保存集合
- _this.coordinates.push(e.coordinate)
- })
- // 结束事件
- _this.draw.on('drawend', function () {
-
- _this.map.removeInteraction(_this.draw)
- _this.polygonVector.setStyle(_this.styleFunction())// 路线画好之后的样式
- // 将点坐标集合转换为数据库数据
- let toData = _this.doData(_this.coordinates)
- // 传值给父组件
- _this.$emit('toData', toData)
- //隐藏提示
- _this.tipTitle = null
- _this.showTip = false
- })
-
- },
- // 设置统一控制点击事件,需要画图方式在此处切换
- handleClick (point) {
- // 绘制连线
- this.drawLineString(point)
- // 绘制点
- // this.drawPoint(point)
- // 绘制圆形
- // this.drawCircle(point)
- // 绘制多边形
- // this.drawPolygon(point)
- },
- // 绘制点位
- drawPoint (center) {
- let vectorLayer = this.getLayer()
-
- let point = new GeomPoint(center)
- let feature = new Feature(point)
- vectorLayer.getSource().addFeature(feature)
- this.map.addLayer(vectorLayer)
- },
- // 绘制连线
- drawLineString (point) {
- this.linePoints.push(point)
- let featureLine = new Feature({
- geometry: new GeomLineString(this.linePoints),
- })
-
- // 添加线的样式
- let lineStyle = new Style({
- fill: new StyleFill({
- color: 'rgba(1, 210, 241, 0.1)'
- }),
- stroke: new StyleStroke({
- color: 'rgba(255, 0, 0)',
- width: 4,
- }),
- })
- featureLine.setStyle(lineStyle)
-
- let source = new VectorSource()
- source.addFeature(featureLine)
- let layer = new VectorLayer()
- layer.setSource(source)
- this.map.addLayer(layer)
- },
- // 绘制区域圆形
- drawCircle (center) {
- let vectorLayer = this.getLayer()
-
- // 设置半径
- let circle = new GeomCircle(center, 0.003)// 新建圆对象
- let feature = new Feature(circle)// 新建Feature对象 并将circle传入
- vectorLayer.getSource().addFeature(feature)// 将Feature对象填入图层源
- this.map.addLayer(vectorLayer) // 将图层添至地图对象
- },
- // 画多边形
- drawPolygon (point) {
- this.polygonPoints.push(point)
- let feature = new Feature({
- geometry: new GeomPolygon([this.polygonPoints]),
- attributes: null
- })
- // 添加线的样式
- let lineStyle = new Style({
- fill: new StyleFill({
- color: 'rgba(1, 210, 241, 0.1)'
- }),
- stroke: new StyleStroke({
- color: 'rgba(255, 0, 0)',
- width: 4,
- }),
- })
- feature.setStyle(lineStyle)
- let source = new VectorSource()
- source.addFeature(feature)
- let vectorLayer = new VectorLayer({
- source: source
- })
- this.map.addLayer(vectorLayer)
- },
- // 设置聚合点
- addMarker () {
- let source = new VectorSource()
- // 随机创建200个要素,后台点位取出后按此格式处理
- for (let i = 1; i <= 200; i++) {
- let coordinates = [115.90 + Math.random() * 0.05, 28.64 + Math.random() * 0.05]
- let feature = new Feature(new GeomPoint(coordinates))
- source.addFeature(feature)
- }
-
- // 聚合
- let clusterSource = new Cluster({
- source: source,
- distance: 50
- })
-
- let clusters = new VectorLayer({
- source: clusterSource,
- style: function (feature) {
- let size = feature.get('features').length
- let style = new Style({
- image: new StyleCircle({
- radius: 20,
- stroke: new StyleStroke({
- color: 'white'
- }),
- fill: new StyleFill({
- color: '#AAD3DF'
- })
- }),
- text: new StyleText({
- text: size.toString(),
- fill: new StyleFill({
- color: 'black'
- })
- })
- })
- return style
- }
- })
-
- this.map.addLayer(clusters)
- },
- // 重置图层
- clearDraw () {
- let _this = this
- _this.coordinates = []
- _this.map.removeInteraction(_this.draw)
- _this.lineVector.getSource().clear()
- _this.showTip = false
- _this.tipTitle = null
-
- // 传值给父组件
- _this.$emit('toData', "")
- },
- // 获取新的 layer 图层对象
- getLayer () {
- return new VectorLayer({
- source: new VectorSource({
- features: ''
- }),
- // 设置样式,但不完全兼容
- // style: function (feature) {
- // let style = new Style({
- // stroke: new StyleStroke({
- // color: '#E80000',
- // width: 2
- // }),
- // fill: new StyleFill({
- // color: 'rgba(0,0,0,0)'
- // })
- // })
- // return style
- // }
- })
- },
- // 设置提示位置
- setTipPosition (x, y, n, m) {
- let _this = this
- _this.tipPosition.w = x + n
- _this.tipPosition.h = y + m
- },
- startAdd (routeRange) {
- if (routeRange.startsWith("LINESTRING")) {
- this.addLineDraw(routeRange)
- } else if (routeRange.startsWith("POINT")) {
- this.addPoint(routeRange)
- } else if (routeRange.startsWith("POLYGON")){
- this.addPolygon(routeRange)
- }
- }
- },
- mounted () {
- this.createMap()
+ name: 'mapBox',
+ props: ['routeRange', 'isDetail', "searchMap"],
+ data() {
+ return {
+ map: null,
+ points: [],
+ // 线条点数组
+ linePoints: [],
+ // 多边形数组
+ polygonPoints: [],
+ draw: null,
+ drawLayer: null,
+ lineVector: null,
+ pointVector: null,
+ polygonVector: null,
+ coordinates: [],// 保存绘画坐标地址 [[115.90490549080435, 28.746101718722358],[115.93151300423209, 28.741123538790717]]
+ toData: null,// 保存数据库格式坐标地址
+ showTip: false,
+ tipPosition: {//提示的位置
+ w: 200,
+ h: 10,
+ },
+ tipTitle: null
}
+ },
+ methods: {
+
+ createMap() {
+ let _this = this
+
+ _this.map = new Map({
+ target: 'map',
+ layers: [
+ new TileLayer({
+ source: new XYZ({
+ url: "https://webmap-tile.sf-express.com/MapTileService/rt?fetchtype=static&x={x}&y={y}&z={z}&project=sfmap&pic_size=256&pic_type=png8&data_name=361100&data_format=merged-dat&data_type=normal", // 行政区划
+ })
+ }),
+
+ ],
+ view: new View({
+ // 设置中心点,默认南昌,用于规划南昌市的路线
+ center: [117.951478782, 28.447896798],
+ projection: 'EPSG:4326',
+ // 设置缩放倍数
+ zoom: 13,
+ minZoom: 8,
+ maxZoom: 19
+ })
+ })
+
+ _this.lineVector = new VectorLayer({
+ //layer所对应的source
+ source: new VectorSource({
+ wrapX: false // 禁止横向无限重复(底图渲染的时候会横向无限重复),设置了这个属性,可以让绘制的图形不跟随底图横向无限重复
+ }),
+ })
+ _this.pointVector = new VectorLayer({
+ //layer所对应的source
+ source: new VectorSource({
+ wrapX: false // 禁止横向无限重复(底图渲染的时候会横向无限重复),设置了这个属性,可以让绘制的图形不跟随底图横向无限重复
+ }),
+ })
+ _this.polygonVector = new VectorLayer({
+ //layer所对应的source
+ source: new VectorSource({
+ wrapX: false // 禁止横向无限重复(底图渲染的时候会横向无限重复),设置了这个属性,可以让绘制的图形不跟随底图横向无限重复
+ }),
+ })
+ _this.map.addLayer(_this.lineVector)
+ _this.map.addLayer(_this.pointVector)
+ _this.map.addLayer(_this.polygonVector)
+ //在地图上回显线或点
+ _this.startAdd(_this.routeRange)
+ },
+ // 绘画之后的样式
+ styleFunction() {
+ // 绘画之后的样式
+ let styles = [
+ new Style({
+ fill: new StyleFill({color: "rgba(255, 255, 255, 0.2)"}),
+ stroke: new StyleStroke({
+ color: 'rgb(252, 94, 32)',
+ width: 5
+ })
+ })
+ ]
+ return styles
+ },
+ // 添加线路
+ addLineDraw(toData) {
+ // toData = 'LINESTRING(115.90505364627936 28.740342332731327,115.9119724729309 28.74040302419318,115.90766337913915 28.73566909016844)'
+ if (toData) {
+ // 将数据库点坐标数据转换
+ let entityData = ""
+ let entityArr = []
+ entityData = toData.match(/\(([^)]*)\)/)
+ if (entityData && entityData != "") {
+ entityData = entityData[1].split(",")
+ for (let j = 0; j < entityData.length; j++) {
+ entityArr.push([
+ Number(entityData[j].split(" ")[0]),
+ Number(entityData[j].split(" ")[1]),
+ ])
+ }
+ }
+ // let lineCoords = [[115.90490549080435, 28.746101718722358],[115.93151300423209, 28.741123538790717],[115.90696542732779, 28.73408542233564],[115.90696542732779, 28.73408542233564]]
+ let lineCoords = entityArr
+ let view = this.map.getView()
+ view.setCenter([
+ lineCoords[Math.ceil(lineCoords.length / 2)][0],
+ lineCoords[Math.ceil(lineCoords.length / 2)][1],
+ ])
+ view.setZoom(14.5)
+
+ let feature_LineString = new Feature({
+ geometry: new LineString(lineCoords),
+ })
+ feature_LineString.setStyle(this.styleFunction())// 设置样式
+ this.lineVector.getSource().addFeature(feature_LineString)
+ }
+ },
+ // 添加点
+ addPoint(pointLonLat) {
+ // pointLonLat = POINT(115.87531914674 28.8603307485585)
+ if (pointLonLat) {
+ let pointData = ""
+ let pointArray = []
+ pointData = pointLonLat.match(/\(([^)]*)\)/)
+ pointArray = pointData[1].split(" ")
+ //设置点
+ let feature_Point = new Feature({
+ geometry: new Point([Number(pointArray[0]), Number(pointArray[1])])
+ })
+ //点样式
+ let style = new Style({
+ image: new Icon({
+ src: "/img/dwicon.jpeg",
+ anchor: [0.48, 0.52],
+ // imgSize: [250,320],
+ scale: 0.2
+ }),
+ })
+ feature_Point.setStyle(style)
+ this.pointVector.getSource().addFeature(feature_Point)
+ let center = [Number(pointArray[0]), Number(pointArray[1])]
+ let view = this.map.getView()
+ view.setZoom(16)
+ view.animate({
+ center: center,
+ duration: 5,
+ })
+ }
+ },
+ // 将点坐标集合转换为数据库数据
+ doData(val) {
+ let str = "LINESTRING("
+ for (let k = 0; k < val.length; k++) {
+ str += `${val[k][0]} ${val[k][1]}`
+ if (k != val.length - 1) {
+ str += ","
+ }
+ }
+ str = str + "," + `${val[0][0]} ${val[0][1]}`
+ str += ")"
+ // console.log(str)
+ return '\'' + str + '\''
+ },
+ // 开始绘制
+ point() {
+ let _this = this
+ _this.coordinates = []
+ _this.map.removeInteraction(_this.draw)
+ _this.polygonVector.getSource().clear()
+ //提示
+ if (!_this.showTip) {
+ _this.showTip = true
+ }
+ _this.tipTitle = "单击左键或者右键开始绘画"
+
+ //提示器
+ function mapMousemove(e) {
+ _this.setTipPosition(e.offsetX, e.offsetY, 5, 5)
+ }
+
+ this.$refs.MapContent.addEventListener('mousemove', mapMousemove)
+
+ // this.$refs.MapContent.removeEventListener('mousemove', mapMousemove)
+
+ function mapMousedown() {
+ _this.tipTitle = "可继续,或选择最终位置双击结束绘画"
+ }
+
+ this.$refs.MapContent.addEventListener('mousedown', mapMousedown)
+ // this.$refs.MapContent.removeEventListener('mousedown', mapMousedown)
+
+ _this.draw = new Draw({
+ source: _this.polygonVector.getSource(),
+ type: 'Polygon',
+ style: new Style({
+ stroke: new StyleStroke({
+ color: "red",
+ width: 3,
+ })
+ }),
+ })
+ _this.map.addInteraction(_this.draw)
+ // 点击事件
+ _this.map.on('click', function (e) {
+ // 将点坐标保存集合
+ _this.coordinates.push(e.coordinate)
+ })
+ // 结束事件
+ _this.draw.on('drawend', function () {
+
+ _this.map.removeInteraction(_this.draw)
+ _this.polygonVector.setStyle(_this.styleFunction())// 路线画好之后的样式
+ // 将点坐标集合转换为数据库数据
+ let toData = _this.doData(_this.coordinates)
+ // 传值给父组件
+ _this.$emit('toData', toData)
+ //隐藏提示
+ _this.tipTitle = null
+ _this.showTip = false
+ })
+
+ },
+ // 设置统一控制点击事件,需要画图方式在此处切换
+ handleClick(point) {
+ // 绘制连线
+ this.drawLineString(point)
+ // 绘制点
+ // this.drawPoint(point)
+ // 绘制圆形
+ // this.drawCircle(point)
+ // 绘制多边形
+ // this.drawPolygon(point)
+ },
+ // 绘制点位
+ drawPoint(center) {
+ let vectorLayer = this.getLayer()
+
+ let point = new GeomPoint(center)
+ let feature = new Feature(point)
+ vectorLayer.getSource().addFeature(feature)
+ this.map.addLayer(vectorLayer)
+ },
+ // 绘制连线
+ drawLineString(point) {
+ this.linePoints.push(point)
+ let featureLine = new Feature({
+ geometry: new GeomLineString(this.linePoints),
+ })
+
+ // 添加线的样式
+ let lineStyle = new Style({
+ fill: new StyleFill({
+ color: 'rgba(1, 210, 241, 0.1)'
+ }),
+ stroke: new StyleStroke({
+ color: 'rgba(255, 0, 0)',
+ width: 4,
+ }),
+ })
+ featureLine.setStyle(lineStyle)
+
+ let source = new VectorSource()
+ source.addFeature(featureLine)
+ let layer = new VectorLayer()
+ layer.setSource(source)
+ this.map.addLayer(layer)
+ },
+ // 绘制区域圆形
+ drawCircle(center) {
+ let vectorLayer = this.getLayer()
+
+ // 设置半径
+ let circle = new GeomCircle(center, 0.003)// 新建圆对象
+ let feature = new Feature(circle)// 新建Feature对象 并将circle传入
+ vectorLayer.getSource().addFeature(feature)// 将Feature对象填入图层源
+ this.map.addLayer(vectorLayer) // 将图层添至地图对象
+ },
+ // 画多边形
+ drawPolygon(point) {
+ this.polygonPoints.push(point)
+ let feature = new Feature({
+ geometry: new GeomPolygon([this.polygonPoints]),
+ attributes: null
+ })
+ // 添加线的样式
+ let lineStyle = new Style({
+ fill: new StyleFill({
+ color: 'rgba(1, 210, 241, 0.1)'
+ }),
+ stroke: new StyleStroke({
+ color: 'rgba(255, 0, 0)',
+ width: 4,
+ }),
+ })
+ feature.setStyle(lineStyle)
+ let source = new VectorSource()
+ source.addFeature(feature)
+ let vectorLayer = new VectorLayer({
+ source: source
+ })
+ this.map.addLayer(vectorLayer)
+ },
+ // 设置聚合点
+ addMarker() {
+ let source = new VectorSource()
+ // 随机创建200个要素,后台点位取出后按此格式处理
+ for (let i = 1; i <= 200; i++) {
+ let coordinates = [115.90 + Math.random() * 0.05, 28.64 + Math.random() * 0.05]
+ let feature = new Feature(new GeomPoint(coordinates))
+ source.addFeature(feature)
+ }
+
+ // 聚合
+ let clusterSource = new Cluster({
+ source: source,
+ distance: 50
+ })
+
+ let clusters = new VectorLayer({
+ source: clusterSource,
+ style: function (feature) {
+ let size = feature.get('features').length
+ let style = new Style({
+ image: new StyleCircle({
+ radius: 20,
+ stroke: new StyleStroke({
+ color: 'white'
+ }),
+ fill: new StyleFill({
+ color: '#AAD3DF'
+ })
+ }),
+ text: new StyleText({
+ text: size.toString(),
+ fill: new StyleFill({
+ color: 'black'
+ })
+ })
+ })
+ return style
+ }
+ })
+
+ this.map.addLayer(clusters)
+ },
+ // 重置图层
+ clearDraw() {
+ let _this = this
+ _this.coordinates = []
+ _this.map.removeInteraction(_this.draw)
+ _this.lineVector.getSource().clear()
+ _this.showTip = false
+ _this.tipTitle = null
+
+ // 传值给父组件
+ _this.$emit('toData', "")
+ },
+ // 获取新的 layer 图层对象
+ getLayer() {
+ return new VectorLayer({
+ source: new VectorSource({
+ features: ''
+ }),
+ // 设置样式,但不完全兼容
+ // style: function (feature) {
+ // let style = new Style({
+ // stroke: new StyleStroke({
+ // color: '#E80000',
+ // width: 2
+ // }),
+ // fill: new StyleFill({
+ // color: 'rgba(0,0,0,0)'
+ // })
+ // })
+ // return style
+ // }
+ })
+ },
+ // 设置提示位置
+ setTipPosition(x, y, n, m) {
+ let _this = this
+ _this.tipPosition.w = x + n
+ _this.tipPosition.h = y + m
+ },
+ startAdd(routeRange) {
+ if (routeRange) {
+ if (routeRange.startsWith("LINESTRING")) {
+ this.addLineDraw(routeRange)
+ } else if (routeRange.startsWith("POINT")) {
+ this.addPoint(routeRange)
+ }
+ }
+ }
+ },
+ mounted() {
+ this.createMap()
+ }
}
</script>
<style>
.mapTip {
- background-color: rgb(168, 168, 168);
- padding: 5px;
- border: 1px solid #000;
- position: absolute;
- z-index: 10 !important;
- border-radius: 5px;
+ background-color: rgb(168, 168, 168);
+ padding: 5px;
+ border: 1px solid #000;
+ position: absolute;
+ z-index: 10 !important;
+ border-radius: 5px;
}
</style>
diff --git a/src/components/map/searchMap.vue b/src/components/map/searchMap.vue
new file mode 100644
index 0000000..dd391d3
--- /dev/null
+++ b/src/components/map/searchMap.vue
@@ -0,0 +1,89 @@
+<template>
+ <div class="basic-container">
+ <div class="search-line">
+ <el-input class="search-input" v-model="queryString" placeholder="请输入内容"></el-input>
+ <el-button class="search-button" @click="getAddressByQuery">查询</el-button>
+ </div>
+ <search-map-box ref="OpenLayersMap" @getMapData="getMapData" :route-range="point"
+ :is-detail="true"></search-map-box>
+ </div>
+</template>
+
+<script>
+import SearchMapBox from "@/components/map/searchMapBox";
+import {getAoiByPt, search, searchByLonLat, searchByQuery} from "@/api/security/security";
+
+export default {
+ name: "searchMap",
+ components: {SearchMapBox},
+ props: ['pointLonLat'],
+ data() {
+ return {
+ ak:"ebf48ecaa1fd436fa3d40c4600aa051f",
+ region:"361100",
+ longitude: "",
+ latitude: "",
+ queryString: "",
+ point: "",
+ }
+ },
+ watch:{
+ longitude:{
+ handler(newVal){
+ if (newVal){
+ this.getAddressByLonLat()
+ }
+ }
+ }
+ },
+ created() {
+ this.point = this.pointLonLat
+ },
+ methods: {
+ getMapData(data) {
+ this.longitude = data[0][0]
+ this.latitude = data[0][1]
+ this.$emit("getLonLat", data[0])
+ },
+ getAddressByQuery() {
+ let ak = this.ak
+ let region = this.region
+ let query = this.queryString
+ let ids = "61743e28bbf11700e9fc4ef03dd8bea9"
+ searchByQuery(ak,region,query,ids).then(res => {
+ console.log(res)
+ })
+ },
+ getAddressByLonLat(){
+ let ak = this.ak
+ let query = ""
+ let region = this.region
+ let region_type = "circle"
+ let page_size = "3"
+ let page_num = "1"
+ let infos = 1
+ let radius = 10
+ let location = this.longitude+" "+this.latitude
+
+ searchByLonLat(ak,query,region,region_type,page_size,page_num,infos,radius,location).then(res=>{
+ console.log(res)
+ })
+ }
+ }
+}
+</script>
+
+<style scoped>
+.search-line {
+ display: flex;
+}
+
+.search-input {
+ margin-bottom: 2%;
+}
+
+.search-button {
+ height: 10%;
+}
+
+</style>
diff --git a/src/components/map/searchMapBox.vue b/src/components/map/searchMapBox.vue
new file mode 100644
index 0000000..85db7ef
--- /dev/null
+++ b/src/components/map/searchMapBox.vue
@@ -0,0 +1,350 @@
+<template>
+ <div>
+ <div id='searchMap' style="height: 50vh; width: 100%" ref="MapContent">
+ </div>
+ </div>
+</template>
+
+<script>
+import {Feature, Map, View} from "ol";
+import {Tile as TileLayer, Vector as VectorLayer} from "ol/layer";
+import XYZ from "ol/source/XYZ";
+import VectorSource from "ol/source/Vector";
+import {Circle as StyleCircle, Fill as StyleFill, Stroke as StyleStroke, Style, Text as StyleText} from "ol/style";
+import Point from "ol/geom/Point";
+import Icon from "ol/style/Icon";
+import Draw from "ol/interaction/Draw";
+import {Circle as GeomCircle, LineString as GeomLineString, Point as GeomPoint, Polygon as GeomPolygon} from "ol/geom";
+import Cluster from "ol/source/Cluster";
+
+export default {
+ name: "searchMapBox",
+ props: ['routeRange'],
+ data() {
+ return {
+ map: null,
+ points: [],
+ featurePoint:null,
+ // 线条点数组
+ linePoints: [],
+ // 多边形数组
+ polygonPoints: [],
+ draw: null,
+ drawLayer: null,
+ pointVector: null,
+ coordinates: [],// 保存绘画坐标地址 [[115.90490549080435, 28.746101718722358],[115.93151300423209, 28.741123538790717]]
+ toData: null,// 保存数据库格式坐标地址
+ showTip: false,
+ tipTitle: null
+ }
+ },
+ methods: {
+
+ createMap() {
+ let _this = this
+ //初始化地图
+ _this.map = new Map({
+ target: 'searchMap',
+ layers: [
+ new TileLayer({
+ source: new XYZ({
+ url: "https://webmap-tile.sf-express.com/MapTileService/rt?fetchtype=static&x={x}&y={y}&z={z}&project=sfmap&pic_size=256&pic_type=png8&data_name=361100&data_format=merged-dat&data_type=normal", // 行政区划
+ })
+ }),
+
+ ],
+ view: new View({
+ // 设置中心点
+ //117.951478782, 28.447896798, 5000
+ center: [117.951478782, 28.447896798],
+ projection: 'EPSG:4326',
+ // 设置缩放倍数
+ zoom: 13,
+ minZoom: 8,
+ maxZoom: 19
+ })
+ })
+
+ _this.pointVector = new VectorLayer({
+ //layer所对应的source
+ source: new VectorSource({
+ wrapX: false // 禁止横向无限重复(底图渲染的时候会横向无限重复),设置了这个属性,可以让绘制的图形不跟随底图横向无限重复
+ }),
+ style: new Style({
+ image: new Icon({
+ src: "/img/dwicon.jpeg",
+ anchor: [0.48, 1],
+ // imgSize: [250,320],
+ scale: 0.13
+ }),
+ })
+ })
+ _this.map.addLayer(_this.pointVector)
+ // 在地图上回显线或点
+ if (this.routeRange) {
+ _this.startAdd(_this.routeRange)
+ }
+ this.point()
+ },
+ // 绘画之后的样式
+ styleFunction() {
+ // 绘画之后的样式
+ let styles = [
+ new Style({
+ fill: new StyleFill({color: "rgba(255, 255, 255, 0.2)"}),
+ stroke: new StyleStroke({
+ color: 'rgb(252, 94, 32)',
+ width: 5
+ })
+ })
+ ]
+ return styles
+ },
+ // 添加点
+ addPoint(pointLonLat) {
+ // pointLonLat = POINT(115.87531914674 28.8603307485585)
+ if (pointLonLat) {
+ let pointData = ""
+ let pointArray = []
+ pointData = pointLonLat.match(/\(([^)]*)\)/)
+ pointArray = pointData[1].split(" ")
+ //设置点
+ let feature_Point = new Feature({
+ geometry: new Point([Number(pointArray[0]), Number(pointArray[1])])
+ })
+ //点样式
+ let style = new Style({
+ image: new Icon({
+ src: "/img/dwicon.jpeg",
+ anchor: [0.48, 1],
+ // imgSize: [250,320],
+ scale: 0.13
+ }),
+ })
+ this.featurePoint = feature_Point
+ feature_Point.setStyle(style)
+ this.pointVector.getSource().addFeature(feature_Point)
+ let center = [Number(pointArray[0]), Number(pointArray[1])]
+ let view = this.map.getView()
+ view.setZoom(16)
+ view.animate({
+ center: center,
+ duration: 5,
+ })
+ }
+ },
+ // 将点坐标集合转换为数据库数据
+ doData(val) {
+ let str = "LINESTRING("
+ for (let k = 0; k < val.length; k++) {
+ str += `${val[k][0]} ${val[k][1]}`
+ if (k != val.length - 1) {
+ str += ","
+ }
+ }
+ str = str + "," + `${val[0][0]} ${val[0][1]}`
+ str += ")"
+ // console.log(str)
+ return '\'' + str + '\''
+ },
+ // 开始绘制
+ point() {
+ let _this = this
+ _this.coordinates = []
+ _this.map.removeInteraction(_this.draw)
+ // _this.pointVector.getSource().clear()
+
+ _this.draw = new Draw({
+ source: _this.pointVector.getSource(),
+ type: 'Point',
+ })
+ _this.map.addInteraction(_this.draw)
+ // 点击事件
+ _this.map.on('click', function (e) {
+ if (_this.featurePoint != null){
+ _this.pointVector.getSource().removeFeature(_this.featurePoint)
+ }
+
+ if (_this.coordinates.length > 0) {
+ let featureArray = _this.pointVector.getSource().getFeatures()
+ for (let i = 0; i < featureArray.length -1; i++) {
+ _this.pointVector.getSource().removeFeature(featureArray[i])
+ }
+ _this.coordinates = []
+ }
+ // 将点坐标保存集合
+ _this.coordinates.push(e.coordinate)
+ _this.$emit("getMapData", _this.coordinates)
+ })
+
+ },
+ // 设置统一控制点击事件,需要画图方式在此处切换
+ handleClick(point) {
+ // 绘制连线
+ this.drawLineString(point)
+ // 绘制点
+ // this.drawPoint(point)
+ // 绘制圆形
+ // this.drawCircle(point)
+ // 绘制多边形
+ // this.drawPolygon(point)
+ },
+ // 绘制点位
+ drawPoint(center) {
+ let vectorLayer = this.getLayer()
+
+ let point = new GeomPoint(center)
+ let feature = new Feature(point)
+ vectorLayer.getSource().addFeature(feature)
+ this.map.addLayer(vectorLayer)
+ },
+ // 绘制连线
+ drawLineString(point) {
+ this.linePoints.push(point)
+ let featureLine = new Feature({
+ geometry: new GeomLineString(this.linePoints),
+ })
+
+ // 添加线的样式
+ let lineStyle = new Style({
+ fill: new StyleFill({
+ color: 'rgba(1, 210, 241, 0.1)'
+ }),
+ stroke: new StyleStroke({
+ color: 'rgba(255, 0, 0)',
+ width: 4,
+ }),
+ })
+ featureLine.setStyle(lineStyle)
+
+ let source = new VectorSource()
+ source.addFeature(featureLine)
+ let layer = new VectorLayer()
+ layer.setSource(source)
+ this.map.addLayer(layer)
+ },
+ // 绘制区域圆形
+ drawCircle(center) {
+ let vectorLayer = this.getLayer()
+
+ // 设置半径
+ let circle = new GeomCircle(center, 0.003)// 新建圆对象
+ let feature = new Feature(circle)// 新建Feature对象 并将circle传入
+ vectorLayer.getSource().addFeature(feature)// 将Feature对象填入图层源
+ this.map.addLayer(vectorLayer) // 将图层添至地图对象
+ },
+ // 画多边形
+ drawPolygon(point) {
+ this.polygonPoints.push(point)
+ let feature = new Feature({
+ geometry: new GeomPolygon([this.polygonPoints]),
+ attributes: null
+ })
+ // 添加线的样式
+ let lineStyle = new Style({
+ fill: new StyleFill({
+ color: 'rgba(1, 210, 241, 0.1)'
+ }),
+ stroke: new StyleStroke({
+ color: 'rgba(255, 0, 0)',
+ width: 4,
+ }),
+ })
+ feature.setStyle(lineStyle)
+ let source = new VectorSource()
+ source.addFeature(feature)
+ let vectorLayer = new VectorLayer({
+ source: source
+ })
+ this.map.addLayer(vectorLayer)
+ },
+ // 设置聚合点
+ addMarker() {
+ let source = new VectorSource()
+ // 随机创建200个要素,后台点位取出后按此格式处理
+ for (let i = 1; i <= 200; i++) {
+ let coordinates = [115.90 + Math.random() * 0.05, 28.64 + Math.random() * 0.05]
+ let feature = new Feature(new GeomPoint(coordinates))
+ source.addFeature(feature)
+ }
+
+ // 聚合
+ let clusterSource = new Cluster({
+ source: source,
+ distance: 50
+ })
+
+ let clusters = new VectorLayer({
+ source: clusterSource,
+ style: function (feature) {
+ let size = feature.get('features').length
+ let style = new Style({
+ image: new StyleCircle({
+ radius: 20,
+ stroke: new StyleStroke({
+ color: 'white'
+ }),
+ fill: new StyleFill({
+ color: '#AAD3DF'
+ })
+ }),
+ text: new StyleText({
+ text: size.toString(),
+ fill: new StyleFill({
+ color: 'black'
+ })
+ })
+ })
+ return style
+ }
+ })
+
+ this.map.addLayer(clusters)
+ },
+ // 重置图层
+ clearDraw() {
+ let _this = this
+ _this.coordinates = []
+ _this.map.removeInteraction(_this.draw)
+ _this.pointVector.getSource().clear()
+
+ // 传值给父组件
+ _this.$emit('toData', "")
+ },
+ // 获取新的 layer 图层对象
+ getLayer() {
+ return new VectorLayer({
+ source: new VectorSource({
+ features: ''
+ }),
+ // 设置样式,但不完全兼容
+ // style: function (feature) {
+ // let style = new Style({
+ // stroke: new StyleStroke({
+ // color: '#E80000',
+ // width: 2
+ // }),
+ // fill: new StyleFill({
+ // color: 'rgba(0,0,0,0)'
+ // })
+ // })
+ // return style
+ // }
+ })
+ },
+
+ startAdd(routeRange) {
+ if (routeRange.startsWith("POINT")) {
+ this.addPoint(routeRange)
+ }
+ }
+ },
+ mounted() {
+ this.createMap()
+ }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/src/views/security/security.vue b/src/views/security/security.vue
index 8950505..839d6a8 100644
--- a/src/views/security/security.vue
+++ b/src/views/security/security.vue
@@ -1,440 +1,480 @@
<template>
- <basic-container>
- <avue-crud :option="option" :table-loading="loading" :data="data" :page.sync="page" :permission="permissionList"
- :before-open="beforeOpen" v-model="form" ref="crud" @row-update="rowUpdate" @row-save="rowSave"
- @row-del="rowDel" @search-change="searchChange" @search-reset="searchReset"
- @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
- @refresh-change="refreshChange" @on-load="onLoad">
- <template slot="menuLeft">
- <el-button size="small" icon="el-icon-delete" plain v-if="permission.security_delete"
- @click="handleDelete">删 除
- </el-button>
- </template>
- <template slot-scope="{type,size,row,index}" slot="menu">
- <el-button icon="el-icon-coordinate" :size="size" :type="type"
- @click="handlePersonList(row)">活动人员</el-button>
- <el-button icon="el-icon-data-line" :size="size" :type="type"
- @click="handleCarList(row)">活动车辆</el-button>
- </template>
- <template slot="activityAreaForm">
- <map-box ref="OpenLayersMap" @toData="toData" :routeRange="form.activityArea"></map-box>
- </template>
+ <basic-container>
+ <avue-crud :option="option" :table-loading="loading" :data="data" :page.sync="page" :permission="permissionList"
+ :before-open="beforeOpen" v-model="form" ref="crud" @row-update="rowUpdate" @row-save="rowSave"
+ @row-del="rowDel" @search-change="searchChange" @search-reset="searchReset"
+ @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
+ @refresh-change="refreshChange" @on-load="onLoad">
+ <template slot="menuLeft">
+ <el-button size="small" icon="el-icon-delete" plain v-if="permission.security_delete"
+ @click="handleDelete">删 除
+ </el-button>
+ </template>
+ <template slot-scope="{type,size,row,index}" slot="menu">
+ <el-button icon="el-icon-coordinate" :size="size" :type="type"
+ @click="handlePersonList(row)">活动人员
+ </el-button>
+ <el-button icon="el-icon-data-line" :size="size" :type="type"
+ @click="handleCarList(row)">活动车辆
+ </el-button>
+ </template>
+ <template slot="activityAreaForm">
+ <map-box ref="OpenLayersMap" @toData="toData" :routeRange="form.activityArea"></map-box>
+ </template>
- </avue-crud>
+ </avue-crud>
- <el-drawer title="活动人员区域" :visible.sync="personBox" :append-to-body="true" size="50%" :destroy-on-close="true">
- <securityManage ref="securityManage" :securityId="securityId" />
- </el-drawer>
+ <el-drawer title="活动人员区域" :visible.sync="personBox" :append-to-body="true" size="50%" :destroy-on-close="true">
+ <securityManage ref="securityManage" :securityId="securityId"/>
+ </el-drawer>
- <el-drawer title="活动车辆区域" :visible.sync="carBox" :append-to-body="true" size="50%" :destroy-on-close="true">
- <securityManageCar ref="car" :securityId="securityId" />
- </el-drawer>
- </basic-container>
+ <el-drawer title="活动车辆区域" :visible.sync="carBox" :append-to-body="true" size="50%" :destroy-on-close="true">
+ <securityManageCar ref="car" :securityId="securityId"/>
+ </el-drawer>
+
+ <el-dialog
+ title="提示"
+ :visible.sync="placeBox"
+ append-to-body
+ destroy-on-close
+ width="70%">
+ <search-map @getLonLat="getLonLat" :point-lon-lat="point"></search-map>
+ <span slot="footer" class="dialog-footer">
+ <el-button type="primary" @click="confirmLonLat">确 定</el-button>
+ </span>
+ </el-dialog>
+ </basic-container>
</template>
<script>
-import { getPage, getDetail, add, update, remove } from "@/api/security/security"
-import { getUserInfos } from "@/api/system/user"
+import {getPage, getDetail, add, update, remove} from "@/api/security/security"
+import {getUserInfos} from "@/api/system/user"
// import AvueMap from 'avue-plugin-map';
-import { mapGetters } from "vuex"
+import {mapGetters} from "vuex"
import securityManage from "@/views/securityManage/securityManage"
import securityManageCar from "@/views/securityManageCar/securityManageCar"
import MapBox from "@/components/map/mapBox";
+import SearchMap from "@/components/map/searchMap";
export default {
- components: {
- MapBox,
- securityManage,
- securityManageCar
- },
- data () {
- return {
- securityId: "",
- carBox: false,
- personBox: false,
- form: {},
- query: {},
- loading: true,
- page: {
- pageSize: 10,
- currentPage: 1,
- total: 0
+ components: {
+ SearchMap,
+ MapBox,
+ securityManage,
+ securityManageCar
+ },
+ data() {
+ return {
+ securityId: "",
+ carBox: false,
+ personBox: false,
+ placeBox: false,
+ point:"",
+ chosePoint:{},
+ form: {},
+ query: {},
+ loading: true,
+ page: {
+ pageSize: 10,
+ currentPage: 1,
+ total: 0
+ },
+ selectionList: [],
+ option: {
+ height: 'auto',
+ calcHeight: 30,
+ labelWidth: "100",
+ dialogWidth: 950,
+ tip: false,
+ searchShow: true,
+ searchMenuSpan: 6,
+ border: true,
+ index: true,
+ viewBtn: true,
+ selection: true,
+ excelBtn: true,
+ dialogClickModal: false,
+ menuWidth: 370,
+ column: [
+ {
+ label: "活动名称",
+ prop: "name",
+ search: true,
+ searchSpan: 4,
+ rules: [{
+ required: true,
+ message: "请输入活动名称",
+ trigger: "blur"
+ }],
+ },
+ {
+ label: "负责单位",
+ prop: "company",
+ },
+ {
+ label: "负责人",
+ prop: "person",
+ width: 80,
+ rules: [{
+ required: true,
+ message: "请输入负责人",
+ trigger: "blur"
+ }],
+ },
+ {
+ label: "联系方式",
+ prop: "contact",
+ width: 100,
+ rules: [{
+ required: true,
+ message: "请输入联系方式",
+ trigger: "blur"
+ }],
+ },
+ {
+ label: "活动地点",
+ prop: "place",
+ span: 24,
+ click: () => {
+ this.placeBox = !this.placeBox
},
- selectionList: [],
- option: {
- height: 'auto',
- calcHeight: 30,
- labelWidth: "100",
- dialogWidth: 950,
- tip: false,
- searchShow: true,
- searchMenuSpan: 6,
- border: true,
- index: true,
- viewBtn: true,
- selection: true,
- excelBtn: true,
- dialogClickModal: false,
- menuWidth: 370,
- column: [
- {
- label: "活动名称",
- prop: "name",
- search: true,
- searchSpan: 4,
- rules: [{
- required: true,
- message: "请输入活动名称",
- trigger: "blur"
- }],
- },
- {
- label: "负责单位",
- prop: "company",
- },
- {
- label: "负责人",
- prop: "person",
- width: 80,
- rules: [{
- required: true,
- message: "请输入负责人",
- trigger: "blur"
- }],
- },
- {
- label: "联系方式",
- prop: "contact",
- width: 100,
- rules: [{
- required: true,
- message: "请输入联系方式",
- trigger: "blur"
- }],
- },
- {
- label: "活动地点",
- prop: "place",
- span: 24
- // addDisplay: false,
- // editDisplay: false,
- // viewDisplay: false,
- },
- {
- label: "经度",
- prop: "longitude",
- span: 12,
- hide: true,
- rules: [{
- required: true,
- message: "请输入纬度",
- trigger: "blur"
- }],
- },
- {
- label: "纬度",
- prop: "latitude",
- span: 12,
- hide: true,
- rules: [{
- required: true,
- message: "请输入纬度",
- trigger: "blur"
- }],
- },
- {
- label: "活动区域",
- prop: "activityArea",
- type: "input",
- hide: true,
- span: 24,
- display: true,
- addDisplay: true
- },
- {
- label: "所属辖区",
- prop: "deptId",
- type: "tree",
- dicUrl: "api/blade-system/dept/lazy-list",
- props: {
- label: 'deptName',
- value: 'id',
- children: 'children'
- },
- search: true,
- searchSpan: 4,
- span: 24,
- width: 110,
- rules: [{
- required: true,
- message: "请选择所属辖区",
- trigger: "blur"
- }]
- },
- // {
- // label: "地址",
- // prop: "avueMap",
- // type: "map",
- // },
- {
- label: "开始时间",
- prop: "startTime",
- type: "datetime",
- defaultTime: '00:00:00',
- format: "yyyy-MM-dd HH:mm",
- valueFormat: "yyyy-MM-dd HH:mm:ss",
- rules: [{
- required: true,
- message: "请输入开始时间",
- trigger: "blur"
- }],
- width: 120,
- },
- {
- label: "结束时间",
- prop: "endTime",
- type: "datetime",
- defaultTime: '23:59:59',
- format: "yyyy-MM-dd HH:mm",
- valueFormat: "yyyy-MM-dd HH:mm",
- rules: [{
- required: true,
- message: "请输入结束时间",
- trigger: "blur"
- }],
- width: 120,
- },
- // {
- // label: "",
- // prop: "map",
- // labelWidth: 10,
- // searchSpan: 0,
- // // maxlength: 5,
- // hide: true,
- // span: 3,
- // // display:false,
- // component: "AvueMap",
- // },
- {
- label: "活动类型",
- prop: "type",
- type: "select",
- dicUrl: "/api/blade-system/dict-biz/dictionary?code=securityType",
- props: {
- label: "dictValue",
- value: "dictKey"
- },
- rules: [{
- required: true,
- message: "请选择活动类型",
- trigger: "blur"
- }],
- width: 90,
- },
- {
- label: "人数",
- prop: "number",
- width: 60,
- },
- {
- label: "活动内容",
- prop: "content",
- type: "textarea",
- span: 24
- },
- ]
+ // addDisplay: false,
+ // editDisplay: false,
+ // viewDisplay: false,
+ },
+ {
+ label: "经度",
+ prop: "longitude",
+ span: 12,
+ hide: true,
+ disabled:true,
+ rules: [{
+ required: true,
+ message: "请输入纬度",
+ trigger: "blur"
+ }],
+ },
+ {
+ label: "纬度",
+ prop: "latitude",
+ span: 12,
+ hide: true,
+ disabled: true,
+ rules: [{
+ required: true,
+ message: "请输入纬度",
+ trigger: "blur"
+ }],
+ },
+ {
+ label: "活动区域",
+ prop: "activityArea",
+ type: "input",
+ hide: true,
+ span: 24,
+ display: true,
+ addDisplay: true
+ },
+ {
+ label: "所属辖区",
+ prop: "deptId",
+ type: "tree",
+ dicUrl: "api/blade-system/dept/lazy-list",
+ props: {
+ label: 'deptName',
+ value: 'id',
+ children: 'children'
},
- data: []
- }
- },
- // watch: {
- // //latitude longitude formattedAddress
- // "form.avueMap":{
- // handler (newObj) {
- // if (newObj.length>0) {
- // this.form.place = newObj[2]
- // this.form.position = newObj[0]+","+newObj[1]
- // }
- // }
- // }
- // },
- computed: {
- ...mapGetters(["userInfo", "permission"]),
- permissionList () {
- return {
- addBtn: this.vaildData(this.permission.security_add, false),
- viewBtn: this.vaildData(this.permission.security_view, false),
- delBtn: this.vaildData(this.permission.security_delete, false),
- editBtn: this.vaildData(this.permission.security_edit, false)
- }
- },
- ids () {
- let ids = []
- this.selectionList.forEach(ele => {
- ids.push(ele.id)
- })
- return ids.join(",")
- }
- },
- created () {
- const tokenLength = window.location.href.indexOf('=')
- if (tokenLength > 0) {
- //取“=”之后的token
- this.getUserInfo()
- }
- },
- methods: {
- getUserInfo () {
- getUserInfos().then(res => {
- const data = res.data
- this.$store.commit('SET_TOKEN', data.access_token)
- this.$store.commit('SET_REFRESH_TOKEN', data.refresh_token)
- this.$store.commit('SET_TENANT_ID', data.tenant_id)
- this.$store.commit('SET_USER_INFO', data)
- this.$store.commit('DEL_ALL_TAG')
- this.$store.commit('CLEAR_LOCK')
- })
- },
- rowSave (row, done, loading) {
- row.position = row.longitude + " " + row.latitude
- add(row).then(() => {
- this.onLoad(this.page)
- this.$message({
- type: "success",
- message: "操作成功!"
- })
- done()
- }, error => {
- loading()
- window.console.log(error)
- })
- },
- rowUpdate (row, index, done, loading) {
- if (!row.activityArea){
- this.$message.warning("请绘制活动区域")
- loading()
- return
- }
-
- row.position = row.longitude + " " + row.latitude
- update(row).then(() => {
- this.onLoad(this.page)
- this.$message({
- type: "success",
- message: "操作成功!"
- })
- done()
- }, error => {
- loading()
- console.log(error)
- })
- },
- rowDel (row) {
- this.$confirm("确定将选择数据删除?", {
- confirmButtonText: "确定",
- cancelButtonText: "取消",
- type: "warning"
- })
- .then(() => {
- return remove(row.id)
- })
- .then(() => {
- this.onLoad(this.page)
- this.$message({
- type: "success",
- message: "操作成功!"
- })
- })
- },
- handleDelete () {
- if (this.selectionList.length === 0) {
- this.$message.warning("请选择至少一条数据")
- return
- }
- this.$confirm("确定将选择数据删除?", {
- confirmButtonText: "确定",
- cancelButtonText: "取消",
- type: "warning"
- })
- .then(() => {
- return remove(this.ids)
- })
- .then(() => {
- this.onLoad(this.page)
- this.$message({
- type: "success",
- message: "操作成功!"
- })
- this.$refs.crud.toggleSelection()
- })
- },
- beforeOpen (done, type) {
- if (["edit", "view"].includes(type)) {
- getDetail(this.form.id).then(res => {
- var data = res.data.data
- this.form = data
- this.form['longitude'] = data.position.split(" ")[0]
- this.form['latitude'] = data.position.split(" ")[1]
- })
- }
- done()
- },
- searchReset () {
- this.query = {}
- this.onLoad(this.page)
- },
- searchChange (params, done) {
- this.query = params
- this.page.currentPage = 1
- this.onLoad(this.page, params)
- done()
- },
- selectionChange (list) {
- this.selectionList = list
- },
- selectionClear () {
- this.selectionList = []
- this.$refs.crud.toggleSelection()
- },
- currentChange (currentPage) {
- this.page.currentPage = currentPage
- },
- sizeChange (pageSize) {
- this.page.pageSize = pageSize
- },
- refreshChange () {
- this.onLoad(this.page, this.query)
- },
- onLoad (page, params = {}) {
- this.loading = true
-
- if (this.userInfo.role_name != "admin" && this.userInfo.role_name != "administrator") {
- params["jurisdiction"] = this.userInfo.dept_id
- }
-
- getPage(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
- const data = res.data.data
- this.page.total = data.total
- this.data = data.records
- this.loading = false
- this.selectionClear()
- })
- },
- //活动人员区域点击按钮事件
- handlePersonList (row) {
- this.personBox = true
- this.securityId = row.id
- },
- //活动车辆区域点击按钮事件
- handleCarList (row) {
- this.carBox = true
- this.securityId = row.id
- },
- //地图传回的polygon坐标
- toData(data){
- this.form.activityArea = data
- }
+ search: true,
+ searchSpan: 4,
+ span: 24,
+ width: 110,
+ rules: [{
+ required: true,
+ message: "请选择所属辖区",
+ trigger: "blur"
+ }]
+ },
+ // {
+ // label: "地址",
+ // prop: "avueMap",
+ // type: "map",
+ // },
+ {
+ label: "开始时间",
+ prop: "startTime",
+ type: "datetime",
+ defaultTime: '00:00:00',
+ format: "yyyy-MM-dd HH:mm",
+ valueFormat: "yyyy-MM-dd HH:mm:ss",
+ rules: [{
+ required: true,
+ message: "请输入开始时间",
+ trigger: "blur"
+ }],
+ width: 120,
+ },
+ {
+ label: "结束时间",
+ prop: "endTime",
+ type: "datetime",
+ defaultTime: '23:59:59',
+ format: "yyyy-MM-dd HH:mm",
+ valueFormat: "yyyy-MM-dd HH:mm",
+ rules: [{
+ required: true,
+ message: "请输入结束时间",
+ trigger: "blur"
+ }],
+ width: 120,
+ },
+ // {
+ // label: "",
+ // prop: "map",
+ // labelWidth: 10,
+ // searchSpan: 0,
+ // // maxlength: 5,
+ // hide: true,
+ // span: 3,
+ // // display:false,
+ // component: "AvueMap",
+ // },
+ {
+ label: "活动类型",
+ prop: "type",
+ type: "select",
+ dicUrl: "/api/blade-system/dict-biz/dictionary?code=securityType",
+ props: {
+ label: "dictValue",
+ value: "dictKey"
+ },
+ rules: [{
+ required: true,
+ message: "请选择活动类型",
+ trigger: "blur"
+ }],
+ width: 90,
+ },
+ {
+ label: "人数",
+ prop: "number",
+ width: 60,
+ },
+ {
+ label: "活动内容",
+ prop: "content",
+ type: "textarea",
+ span: 24
+ },
+ ]
+ },
+ data: []
}
+ },
+ // watch: {
+ // //latitude longitude formattedAddress
+ // "form.avueMap":{
+ // handler (newObj) {
+ // if (newObj.length>0) {
+ // this.form.place = newObj[2]
+ // this.form.position = newObj[0]+","+newObj[1]
+ // }
+ // }
+ // }
+ // },
+ computed: {
+ ...mapGetters(["userInfo", "permission"]),
+ permissionList() {
+ return {
+ addBtn: this.vaildData(this.permission.security_add, false),
+ viewBtn: this.vaildData(this.permission.security_view, false),
+ delBtn: this.vaildData(this.permission.security_delete, false),
+ editBtn: this.vaildData(this.permission.security_edit, false)
+ }
+ },
+ ids() {
+ let ids = []
+ this.selectionList.forEach(ele => {
+ ids.push(ele.id)
+ })
+ return ids.join(",")
+ }
+ },
+ created() {
+ const tokenLength = window.location.href.indexOf('=')
+ if (tokenLength > 0) {
+ //取“=”之后的token
+ this.getUserInfo()
+ }
+ },
+ methods: {
+ getUserInfo() {
+ getUserInfos().then(res => {
+ const data = res.data
+ this.$store.commit('SET_TOKEN', data.access_token)
+ this.$store.commit('SET_REFRESH_TOKEN', data.refresh_token)
+ this.$store.commit('SET_TENANT_ID', data.tenant_id)
+ this.$store.commit('SET_USER_INFO', data)
+ this.$store.commit('DEL_ALL_TAG')
+ this.$store.commit('CLEAR_LOCK')
+ })
+ },
+ rowSave(row, done, loading) {
+ row.position = row.longitude + " " + row.latitude
+ add(row).then(() => {
+ this.onLoad(this.page)
+ this.$message({
+ type: "success",
+ message: "操作成功!"
+ })
+ done()
+ }, error => {
+ loading()
+ window.console.log(error)
+ })
+ },
+ rowUpdate(row, index, done, loading) {
+ if (!row.activityArea) {
+ this.$message.warning("请绘制活动区域")
+ loading()
+ return
+ }
+
+ if (row.activityArea.startsWith("LINESTRING")){
+
+ }else {
+ row.activityArea = "'LINESTRING("+row.activityArea+")'"
+ }
+ row.position = row.longitude + " " + row.latitude
+ update(row).then(() => {
+ this.onLoad(this.page)
+ this.$message({
+ type: "success",
+ message: "操作成功!"
+ })
+ done()
+ }, error => {
+ loading()
+ console.log(error)
+ })
+ },
+ rowDel(row) {
+ this.$confirm("确定将选择数据删除?", {
+ confirmButtonText: "确定",
+ cancelButtonText: "取消",
+ type: "warning"
+ })
+ .then(() => {
+ return remove(row.id)
+ })
+ .then(() => {
+ this.onLoad(this.page)
+ this.$message({
+ type: "success",
+ message: "操作成功!"
+ })
+ })
+ },
+ handleDelete() {
+ if (this.selectionList.length === 0) {
+ this.$message.warning("请选择至少一条数据")
+ return
+ }
+ this.$confirm("确定将选择数据删除?", {
+ confirmButtonText: "确定",
+ cancelButtonText: "取消",
+ type: "warning"
+ })
+ .then(() => {
+ return remove(this.ids)
+ })
+ .then(() => {
+ this.onLoad(this.page)
+ this.$message({
+ type: "success",
+ message: "操作成功!"
+ })
+ this.$refs.crud.toggleSelection()
+ })
+ },
+ beforeOpen(done, type) {
+ if (["edit", "view"].includes(type)) {
+ getDetail(this.form.id).then(res => {
+ var data = res.data.data
+ this.form = data
+ this.form['longitude'] = data.position.split(" ")[0]
+ this.form['latitude'] = data.position.split(" ")[1]
+ this.point = "POINT("+this.form.longitude +" "+this.form.latitude+")"
+ })
+ }
+ done()
+ },
+ searchReset() {
+ this.query = {}
+ this.onLoad(this.page)
+ },
+ searchChange(params, done) {
+ this.query = params
+ this.page.currentPage = 1
+ this.onLoad(this.page, params)
+ done()
+ },
+ selectionChange(list) {
+ this.selectionList = list
+ },
+ selectionClear() {
+ this.selectionList = []
+ this.$refs.crud.toggleSelection()
+ },
+ currentChange(currentPage) {
+ this.page.currentPage = currentPage
+ },
+ sizeChange(pageSize) {
+ this.page.pageSize = pageSize
+ },
+ refreshChange() {
+ this.onLoad(this.page, this.query)
+ },
+ onLoad(page, params = {}) {
+ this.loading = true
+
+ if (this.userInfo.role_name != "admin" && this.userInfo.role_name != "administrator") {
+ params["jurisdiction"] = this.userInfo.dept_id
+ }
+
+ getPage(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+ const data = res.data.data
+ this.page.total = data.total
+ this.data = data.records
+ this.loading = false
+ this.selectionClear()
+ })
+ },
+ //活动人员区域点击按钮事件
+ handlePersonList(row) {
+ this.personBox = true
+ this.securityId = row.id
+ },
+ //活动车辆区域点击按钮事件
+ handleCarList(row) {
+ this.carBox = true
+ this.securityId = row.id
+ },
+ //地图传回的polygon坐标
+ toData(data) {
+ this.form.activityArea = data
+ },
+ getLonLat(data){
+ this.chosePoint.longitude = data[0]
+ this.chosePoint.latitude = data[1]
+ },
+ confirmLonLat(){
+ this.form.longitude = this.chosePoint.longitude
+ this.form.latitude = this.chosePoint.latitude
+ this.point = "POINT("+this.form.longitude +" "+this.form.latitude+")"
+ this.placeBox = false
+ }
+ }
}
</script>
diff --git a/vue.config.js b/vue.config.js
index 2ed9c80..2877fee 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -4,9 +4,9 @@
* @LastEditors: shuishen 1109946754@qq.com
* @LastEditTime: 2023-02-09 15:16:33
* @FilePath: \srs-police-web\vue.config.js
- * @Description:
- *
- * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved.
+ * @Description:
+ *
+ * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved.
*/
module.exports = {
//路径前缀
@@ -43,7 +43,13 @@
pathRewrite: {
'^/api': '/'
}
- }
+ },
+ 'bsapi': {
+ target: 'http://192.168.0.112:9091',
+ pathRewrite: {
+ '^/bsapi': '/'
+ }
+ }
}
}
}
--
Gitblit v1.9.3