大屏第一版

dhy
吕天方 2 years ago
parent e67aa4af5e
commit 93b6c5a0b5

@ -48,7 +48,12 @@
"js-beautify": "1.13.0",
"js-cookie": "3.0.1",
"jsencrypt": "3.0.0-rc.1",
"leaflet": "^1.5.1",
"moment": "^2.29.1",
"nprogress": "0.2.0",
"postcss-px2rem": "^0.3.0",
"proj4": "^2.8.0",
"proj4leaflet": "^1.0.2",
"quill": "1.3.7",
"screenfull": "5.0.2",
"sortablejs": "1.10.2",

Binary file not shown.

@ -0,0 +1,28 @@
@font-face {
font-family: 'YouSheBiaoTiHei';
src: url('http://www.jichuanglanhai.com/demo/font-file/YouSheBiaoTiHei-2.ttf');
}
@font-face {
font-family: 'Medium';
src: url('http://www.jichuanglanhai.com/demo/font-file/Alibaba-PuHuiTi-Medium.otf');
}
@font-face {
font-family: 'DIN';
src: url('http://www.jichuanglanhai.com/demo/font-file/din-bold-2.ttf');
}
@font-face {
font-family: 'Regular';
src: url('http://www.jichuanglanhai.com/demo/font-file/Alibaba-PuHuiTi-Regular.otf');
}
@font-face {
font-family: 'siyuan-Regular';
src: url('./siyuan-Regular.otf');
}
@font-face {
font-family: 'Source Han Sans CN--Bold';
src: url('./SourceHanSansCN-Bold.otf');
}
@font-face {
font-family: 'D-DIN';
src: url('./D-DIN.otf');
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 455 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 447 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 915 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 827 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 859 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 720 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 942 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 624 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 557 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 389 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 904 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

@ -4,6 +4,7 @@
@import './element-ui.scss';
@import './sidebar.scss';
@import './btn.scss';
@import '../font/font.css';
body {
height: 100%;
@ -180,3 +181,8 @@ aside {
margin-bottom: 10px;
}
}
//
::-webkit-scrollbar {
width: 0 !important;
height: 0;
}

@ -0,0 +1,11 @@
/**
稿19201080
*/
@function vw($px) {
@return $px/1920*100vw;
}
@function vh($px) {
@return $px/1080*100vh;
}

@ -1,3 +1,11 @@
/*
* @Descripttion:
* @version:
* @Author: JC9527
* @Date: 2023-08-14 13:58:57
* @LastEditors: JC9527
* @LastEditTime: 2023-08-17 11:05:58
*/
import Vue from 'vue'
import Cookies from 'js-cookie'
@ -13,9 +21,15 @@ import router from './router'
import directive from './directive' // directive
import plugins from './plugins' // plugins
import { download } from '@/utils/request'
import "@/utils/rem.js"; //计算rem基准
import './assets/icons' // icon
import './permission' // permission control
import 'leaflet/dist/leaflet.css'
import moment from 'moment'
Vue.prototype.$moment = moment
import { getDicts } from "@/api/system/dict/data";
import { getConfigKey } from "@/api/system/config";
import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree } from "@/utils/ruoyi";

@ -8,7 +8,7 @@ import { isRelogin } from '@/utils/request'
NProgress.configure({ showSpinner: false })
const whiteList = ['/login', '/register']
const whiteList = ['/login', '/register', '/bigScreen']
router.beforeEach((to, from, next) => {
NProgress.start()

@ -61,18 +61,23 @@ export const constantRoutes = [
component: () => import('@/views/error/401'),
hidden: true
},
// {
// path: '',
// component: Layout,
// redirect: 'index',
// children: [
// {
// path: 'index',
// component: () => import('@/views/index'),
// name: 'Index',
// meta: { title: '首页', icon: 'dashboard', affix: true }
// }
// ]
// },
{
path: '',
component: Layout,
redirect: 'index',
children: [
{
path: 'index',
component: () => import('@/views/index'),
name: 'Index',
meta: { title: '首页', icon: 'dashboard', affix: true }
}
]
path:'/bigScreen',
component: () => import('@/views/bigScreen'),
name:'江宁开发区城市综合指挥调度大屏'
},
{
path: '/user',
@ -177,7 +182,7 @@ Router.prototype.replace = function push(location) {
}
export default new Router({
mode: 'history', // 去掉url中的#
// mode: 'history', // 去掉url中的#
scrollBehavior: () => ({ y: 0 }),
routes: constantRoutes
})

@ -0,0 +1,232 @@
/* eslint-disable */
// this L.CRS.Baidu from https://github.com/muyao1987/leaflet-tileLayer-baidugaode/blob/master/src/tileLayer.baidu.js
if (L.Proj) {
L.CRS.Baidu = new L.Proj.CRS(
'EPSG:900913',
'+proj=merc +a=6378206 +b=6356584.314245179 +lat_ts=0.0 +lon_0=0.0 +x_0=0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs',
{
resolutions: (function() {
const level = 24
var res = []
res[0] = Math.pow(2, 18)
for (var i = 1; i < level; i++) {
res[i] = Math.pow(2, 18 - i)
}
return res
})(),
origin: [0, 0],
bounds: L.bounds([20037508.342789244, 0], [0, 20037508.342789244])
}
)
}
L.tileLayer.baidu = function(option) {
option = option || {}
var layer
var subdomains = '0123456789'
switch (option.layer) {
//单图层
case 'vec':
default:
// http://maponline{s}.bdimg.com/tile/?qt=vtile&x={x}&y={y}&z={z}&styles=pl&scaler=2
//'http://online{s}.map.bdimg.com/tile/?qt=tile&x={x}&y={y}&z={z}&styles=pl&b=0&limit=60&scaler=1&udt=20170525'
layer = L.tileLayer(
'http://online{s}.map.bdimg.com/onlinelabel/?qt=tile&x={x}&y={y}&z={z}&styles=' +
(option.bigfont ? 'ph' : 'pl') +
'&scaler=2&p=1',
{
name: option.name,
subdomains: subdomains,
tms: true
}
)
break
case 'img_d':
layer = L.tileLayer(
'http://shangetu{s}.map.bdimg.com/it/u=x={x};y={y};z={z};v=009;type=sate&fm=46&scaler=2&p=1',
{
name: option.name,
subdomains: subdomains,
tms: true
}
)
break
case 'img_z':
layer = L.tileLayer(
'http://online{s}.map.bdimg.com/tile/?qt=tile&x={x}&y={y}&z={z}&styles=' +
(option.bigfont ? 'sh' : 'sl') +
'&v=020&scaler=2&p=1',
{
name: option.name,
subdomains: subdomains,
tms: true
}
)
break
case 'custom': //Custom 各种自定义样式
//可选值dark,midnight,grayscale,hardedge,light,redalert,googlelite,grassgreen,pink,darkgreen,bluish
option.customid = option.customid || 'midnight'
layer = L.tileLayer(
'http://api{s}.map.bdimg.com/customimage/tile?&x={x}&y={y}&z={z}&scale=1&customid=' +
option.customid,
{
name: option.name,
subdomains: '012',
tms: true
}
)
break
case 'time': //实时路况
var time = new Date().getTime()
layer = L.tileLayer(
'http://its.map.baidu.com:8002/traffic/TrafficTileService?x={x}&y={y}&level={z}&time=' +
time +
'&label=web2D&v=017',
{
name: option.name,
subdomains: subdomains,
tms: true
}
)
break
//合并
case 'img':
layer = L.layerGroup([
L.tileLayer.baidu({
name: '底图',
layer: 'img_d',
bigfont: option.bigfont
}),
L.tileLayer.baidu({
name: '注记',
layer: 'img_z',
bigfont: option.bigfont
})
])
break
}
return layer
}
L.TileLayer.ChinaProvider = L.TileLayer.extend({
initialize: function(type, options) {
// (type, Object)
var providers = L.TileLayer.ChinaProvider.providers
options = options || {}
var parts = type.split('.')
var providerName = parts[0]
var mapName = parts[1]
var mapType = parts[2]
var url = providers[providerName][mapName][mapType]
options.subdomains = providers[providerName].Subdomains
options.key = options.key || providers[providerName].key
if ('tms' in providers[providerName]) {
options.tms = providers[providerName]['tms']
}
L.TileLayer.prototype.initialize.call(this, url, options)
}
})
L.TileLayer.ChinaProvider.providers = {
TianDiTu: {
Normal: {
Map:
'//t{s}.tianditu.gov.cn/DataServer?T=vec_w&X={x}&Y={y}&L={z}&tk={key}',
Annotion:
'//t{s}.tianditu.gov.cn/DataServer?T=cva_w&X={x}&Y={y}&L={z}&tk={key}'
},
Satellite: {
Map:
'//t{s}.tianditu.gov.cn/DataServer?T=img_w&X={x}&Y={y}&L={z}&tk={key}',
Annotion:
'//t{s}.tianditu.gov.cn/DataServer?T=cia_w&X={x}&Y={y}&L={z}&tk={key}'
},
Terrain: {
Map:
'//t{s}.tianditu.gov.cn/DataServer?T=ter_w&X={x}&Y={y}&L={z}&tk={key}',
Annotion:
'//t{s}.tianditu.gov.cn/DataServer?T=cta_w&X={x}&Y={y}&L={z}&tk={key}'
},
Subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
key: '174705aebfe31b79b3587279e211cb9a'
},
GaoDe: {
Normal: {
Map:
'//webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}'
},
Satellite: {
Map: '//webst0{s}.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}',
Annotion:
'//webst0{s}.is.autonavi.com/appmaptile?style=8&x={x}&y={y}&z={z}'
},
Subdomains: ['1', '2', '3', '4']
},
Google: {
Normal: {
Map: '//www.google.cn/maps/vt?lyrs=m@189&gl=cn&x={x}&y={y}&z={z}'
},
Satellite: {
Map: '//www.google.cn/maps/vt?lyrs=s@189&gl=cn&x={x}&y={y}&z={z}',
Annotion: '//www.google.cn/maps/vt?lyrs=y@189&gl=cn&x={x}&y={y}&z={z}'
},
Subdomains: []
},
Geoq: {
Normal: {
Map:
'//map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer/tile/{z}/{y}/{x}',
PurplishBlue:
'//map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}',
Gray:
'//map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetGray/MapServer/tile/{z}/{y}/{x}',
Warm:
'//map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetWarm/MapServer/tile/{z}/{y}/{x}'
},
Theme: {
Hydro:
'//thematic.geoq.cn/arcgis/rest/services/ThematicMaps/WorldHydroMap/MapServer/tile/{z}/{y}/{x}'
},
Subdomains: []
},
OSM: {
Normal: {
Map: '//{s}.tile.osm.org/{z}/{x}/{y}.png'
},
Subdomains: ['a', 'b', 'c']
},
Baidu: {
Normal: {
Map:
'//maponline{s}.bdimg.com/tile/?qt=vtile&x={x}&y={y}&z={z}&styles=pl&scaler=2'
},
Satellite: {
Map:
'//shangetu{s}.map.bdimg.com/it/u=x={x};y={y};z={z};v=009;type=sate&fm=46',
Annotion:
'//shangetu{s}.map.bdimg.com/tile/?qt=tile&x={x}&y={y}&z={z}&styles=sl&v=020&scaler=2'
},
Subdomains: ['0', '1', '2'],
tms: true
}
}
L.tileLayer.chinaProvider = function(type, options) {
return new L.TileLayer.ChinaProvider(type, options)
}

@ -0,0 +1,143 @@
/* eslint-disable */
L.CoordConver = function () {
function a(b, c) {
var d =
-100 +
2 * b +
3 * c +
0.2 * c * c +
0.1 * b * c +
0.2 * Math.sqrt(Math.abs(b)),
d = d + (2 * (20 * Math.sin(6 * b * e) + 20 * Math.sin(2 * b * e))) / 3,
d = d + (2 * (20 * Math.sin(c * e) + 40 * Math.sin((c / 3) * e))) / 3
return (d +=
(2 * (160 * Math.sin((c / 12) * e) + 320 * Math.sin((c * e) / 30))) / 3)
}
function f(b, c) {
var d =
300 +
b +
2 * c +
0.1 * b * b +
0.1 * b * c +
0.1 * Math.sqrt(Math.abs(b)),
d = d + (2 * (20 * Math.sin(6 * b * e) + 20 * Math.sin(2 * b * e))) / 3,
d = d + (2 * (20 * Math.sin(b * e) + 40 * Math.sin((b / 3) * e))) / 3
return (d +=
(2 * (150 * Math.sin((b / 12) * e) + 300 * Math.sin((b / 30) * e))) / 3)
}
this.getCorrdType = function (b) {
var c = 'wgs84'
switch (b.split('.')[0]) {
case 'Geoq':
case 'GaoDe':
case 'Google':
c = 'gcj02'
break
case 'Baidu':
c = 'bd09'
break
case 'OSM':
case 'TianDiTu':
c = 'wgs84'
}
return c
}
this.bd09_To_gps84 = function (b, c) {
var d = this.bd09_To_gcj02(b, c)
return this.gcj02_To_gps84(d.lng, d.lat)
}
this.gps84_To_bd09 = function (b, c) {
var d = this.gps84_To_gcj02(b, c)
return this.gcj02_To_bd09(d.lng, d.lat)
}
this.gps84_To_gcj02 = function (b, c) {
var d = a(b - 105, c - 35),
k = f(b - 105, c - 35),
l = (c / 180) * e,
g = Math.sin(l),
g = 1 - n * g * g,
m = Math.sqrt(g),
d = (180 * d) / (((h * (1 - n)) / (g * m)) * e),
k = (180 * k) / ((h / m) * Math.cos(l) * e)
return { lng: b + k, lat: c + d }
}
this.gcj02_To_gps84 = function (b, c) {
var d = a(b - 105, c - 35),
k = f(b - 105, c - 35),
l = (c / 180) * e,
g = Math.sin(l),
g = 1 - n * g * g,
m = Math.sqrt(g),
d = (180 * d) / (((h * (1 - n)) / (g * m)) * e),
k = (180 * k) / ((h / m) * Math.cos(l) * e)
return { lng: 2 * b - (b + k), lat: 2 * c - (c + d) }
}
this.gcj02_To_bd09 = function (b, c) {
var d = Math.sqrt(b * b + c * c) + 2e-5 * Math.sin(c * p),
a = Math.atan2(c, b) + 3e-6 * Math.cos(b * p)
return { lng: d * Math.cos(a) + 0.0065, lat: d * Math.sin(a) + 0.006 }
}
this.bd09_To_gcj02 = function (b, c) {
var d = b - 0.0065,
a = c - 0.006,
e = Math.sqrt(d * d + a * a) - 2e-5 * Math.sin(a * p),
d = Math.atan2(a, d) - 3e-6 * Math.cos(d * p)
return { lng: e * Math.cos(d), lat: e * Math.sin(d) }
}
var e = 3.141592653589793,
h = 6378245,
n = 0.006693421622965943,
p = (3e3 * e) / 180
}
L.coordConver = function () {
return new L.CoordConver()
}
L.TileLayer.ChinaProvider.include({
addTo: function (a) {
a.options.corrdType || (a.options.corrdType = this.options.corrdType)
a.addLayer(this)
return this
},
})
L.tileLayer.chinaProvider = function (a, f) {
f = f || {}
f.corrdType = L.coordConver().getCorrdType(a)
return new L.TileLayer.ChinaProvider(a, f)
}
L.GridLayer.include({
_setZoomTransform: function (a, f, e) {
var h = f
void 0 != h &&
this.options &&
('gcj02' == this.options.corrdType
? (h = L.coordConver().gps84_To_gcj02(f.lng, f.lat))
: 'bd09' == this.options.corrdType &&
(h = L.coordConver().gps84_To_bd09(f.lng, f.lat)))
f = this._map.getZoomScale(e, a.zoom)
e = a.origin
.multiplyBy(f)
.subtract(this._map._getNewPixelOrigin(h, e))
.round()
L.Browser.any3d
? L.DomUtil.setTransform(a.el, e, f)
: L.DomUtil.setPosition(a.el, e)
},
_getTiledPixelBounds: function (a) {
var f = a
void 0 != f &&
this.options &&
('gcj02' == this.options.corrdType
? (f = L.coordConver().gps84_To_gcj02(a.lng, a.lat))
: 'bd09' == this.options.corrdType &&
(f = L.coordConver().gps84_To_bd09(a.lng, a.lat)))
a = this._map
var e = a._animatingZoom
? Math.max(a._animateToZoom, a.getZoom())
: a.getZoom(),
e = a.getZoomScale(e, this._tileZoom),
f = a.project(f, this._tileZoom).floor()
a = a.getSize().divideBy(2 * e)
return new L.Bounds(f.subtract(a), f.add(a))
},
})

@ -0,0 +1,335 @@
/* eslint-disable */
(function (factory, window) {
// define an AMD module that relies on 'leaflet'
if (typeof define === 'function' && define.amd) {
define(['leaflet'], factory);
// define a Common JS module that relies on 'leaflet'
} else if (typeof exports === 'object') {
module.exports = factory(require('leaflet'));
}
// attach your plugin to the global 'L' letiable
if (typeof window !== 'undefined' && window.L) {
window.L.ArrowPath = factory(L);
}
}(function (L) {
L.SVG.include({
_updateStyle: function (layer) {
let path = layer._path,
options = layer.options;
if (!path) {
return;
}
if (options.stroke) {
path.setAttribute('stroke', options.color);
path.setAttribute('stroke-opacity', options.opacity);
path.setAttribute('stroke-width', options.weight);
path.setAttribute('stroke-linecap', options.lineCap);
path.setAttribute('stroke-linejoin', options.lineJoin);
if (options.dashArray) {
path.setAttribute('stroke-dasharray', options.dashArray);
} else {
path.removeAttribute('stroke-dasharray');
}
if (options.dashOffset) {
path.setAttribute('stroke-dashoffset', options.dashOffset);
} else {
path.removeAttribute('stroke-dashoffset');
}
} else {
path.setAttribute('stroke', 'none');
}
if (options.fill) {
this._polyFill(layer, path, options);
path.setAttribute('fill-opacity', options.fillOpacity);
path.setAttribute('fill-rule', options.fillRule || 'evenodd');
} else {
path.setAttribute('fill', 'none');
}
},
_polyFill(layer, path, options) {
let fillColor = options.fillColor;
let isLinearGradient = fillColor.match(/^linearGradient\(/);
let isRadialGradient = fillColor.match(/^radialGradient\(/);
if (fillColor.match(/^#/)) {
path.setAttribute('fill', fillColor || options.color);
} else if (isLinearGradient || isRadialGradient) {
let gradientOpt = this._addGradient(fillColor);
if (isLinearGradient) {
this._addLinearGradient(layer, gradientOpt);
} else {
this._addRadialGradient(layer, gradientOpt);
}
} else if (fillColor.match(/^url\(/)) {
this._fillByImage(layer);
}
},
_addLinearGradient: function (layer, gradientOpt) {
let path = layer._path;
let colorStr = layer.options.fillColor;
let gradientId = 'gradient' + gradientOpt.index;
this._addDefs();
if (!gradientOpt.exist) {
let gradient = L.SVG.create('linearGradient');
gradient.setAttribute('id', gradientId);
let arrMap = this._getLinearProperties(colorStr, ['linearGradient(', ')']);
this._addStops(gradient, arrMap);
this._addAngle(gradient, arrMap.angle);
this._defs.appendChild(gradient);
}
path.setAttribute('fill', 'url(#' + gradientId + ')');
},
_addRadialGradient: function (layer, gradientOpt) {
let path = layer._path;
let colorStr = layer.options.fillColor;
let gradientId = 'gradient' + gradientOpt.index;
this._addDefs();
if (!gradientOpt.exist) {
let gradient = L.SVG.create('radialGradient');
gradient.setAttribute('id', gradientId);
let arrMap = this._getRadialProperties(colorStr, ['radialGradient(', ')']);
this._addStops(gradient, arrMap);
this._addAttribute(gradient, arrMap);
//
this._defs.appendChild(gradient);
}
path.setAttribute('fill', 'url(#' + gradientId + ')');
},
_addAttribute(gradient, arr) {
gradient.setAttribute('cx', arr.cx);
gradient.setAttribute('cy', arr.cy);
gradient.setAttribute('r', arr.r);
gradient.setAttribute('fx', arr.fx);
gradient.setAttribute('fy', arr.fy);
},
_getRadialProperties(colorStr, replaceArr) {
let string = colorStr;
for (let i = 0, l = replaceArr.length; i < l; i++) {
let str = replaceArr[i];
string = string.replace(str, '');
}
let arrays = string.split(/[\,]+/);
let colorArr = arrays.slice(5);
let resColors = [];
let resOffsets = [];
let offsetNum = 0;
for (let i = 0, l = colorArr.length; i < l; i++) {
let str = colorArr[i];
let opts = str.trim().split(/\s+/);
resColors.push(opts[0]);
if (opts.length > 1 || i === l - 1) {
let offset;
if (opts.length > 1) {
offset = parseFloat(opts[1]);
} else {
offset = 100;
}
let len = resOffsets.length;
if (offsetNum > 0) {
let startNum = len - offsetNum - 1;
let startVal = parseFloat(resOffsets[startNum]);
let step = (offset - startVal) / (offsetNum + 1);
for (let j = 1; j <= offsetNum; j++) {
resOffsets[startNum + j] = startVal + step * j + '%';
}
offsetNum = 0;
}
resOffsets.push(offset + '%');
} else {
if (i !== 0) {
offsetNum = offsetNum + 1;
resOffsets.push('');
} else {
resOffsets.push('0%');
}
}
}
return {
cx: arrays[0].trim(),
cy: arrays[1].trim(),
r: arrays[2].trim(),
fx: arrays[3].trim(),
fy: arrays[4].trim(),
colors: resColors,
offsets: resOffsets
}
},
_addGradient(gradient) {
if (!this._gradientArray) {
this._gradientArray = [];
}
let gradientStr = gradient.split(/[\s\,\-\(\)]+/).join('');
let index = this._gradientArray.indexOf(gradientStr);
if (index > -1) {
return { index: index, exist: true }
}
this._gradientArray.push(gradientStr);
return { index: this._gradientArray.length - 1, exist: false }
},
_addDefs() {
if (!this._defs) {
this._defs = L.SVG.create('defs');
this._container.appendChild(this._defs);
}
},
_addAngle(gradient, angle) {
gradient.setAttribute('x1', '0');
gradient.setAttribute('y1', '0');
gradient.setAttribute('x2', '1');
gradient.setAttribute('y2', '0');
gradient.setAttribute('gradientTransform', 'rotate(' + angle.replace('deg', '') + ')');
},
_addStops(gradient, options) {
let colors = options.colors;
let offsets = options.offsets;
for (let i = 0, len = colors.length; i < len; i++) {
let stop = L.SVG.create('stop');
stop.setAttribute('offset', offsets[i]);
stop.setAttribute('stop-color', colors[i]);
gradient.appendChild(stop);
}
},
_getLinearProperties(colorStr, replaceArr) {
let string = colorStr;
for (let i = 0, l = replaceArr.length; i < l; i++) {
let str = replaceArr[i];
string = string.replace(str, '');
}
let arrays = string.split(/[\,]+/);
let colorArr = arrays.slice(1);
let resAngle = arrays[0].trim();
let resColors = [];
let resOffsets = [];
let offsetNum = 0;
for (let i = 0, l = colorArr.length; i < l; i++) {
let str = colorArr[i];
let opts = str.trim().split(/\s+/);
resColors.push(opts[0]);
if (opts.length > 1 || i === l - 1) {
let offset;
if (opts.length > 1) {
offset = parseFloat(opts[1]);
} else {
offset = 100;
}
let len = resOffsets.length;
if (offsetNum > 0) {
let startNum = len - offsetNum - 1;
let startVal = parseFloat(resOffsets[startNum]);
let step = (offset - startVal) / (offsetNum + 1);
for (let j = 1; j <= offsetNum; j++) {
resOffsets[startNum + j] = startVal + step * j + '%';
}
offsetNum = 0;
}
resOffsets.push(offset + '%');
} else {
if (i !== 0) {
offsetNum = offsetNum + 1;
resOffsets.push('');
} else {
resOffsets.push('0%');
}
}
}
return {
angle: resAngle,
colors: resColors,
offsets: resOffsets
}
},
//借鉴自插件leaflet-polygon-fillPattern
_fillByImage: function (layer) {
let path = layer._path,
options = layer.options,
fill = options.fillColor;
this._addDefs();
let _img_url = fill.replace(/url\(+/, '').replace(/\)+/, '');/*.substring(4, fill.length - 1)*/
let _refOption = this._addRefId(_img_url);
let _ref_id = _img_url + _refOption.index;
if (!_refOption.exist) {
this._addPattern(_img_url, _ref_id, options);
}
path.setAttribute('fill', "url(#" + _ref_id + ")");
},
_addRefId(url) {
if (!this._imgUrls) {
this._imgUrls = [];
}
let index = this._imgUrls.indexOf(url);
if (index > -1) {
return { index: index, exist: true }
}
this._imgUrls.push(url);
return { index: this._imgUrls.length - 1, exist: false }
},
_addPattern(_img_url, _ref_id, options) {
let _im = new Image();
_im.src = _img_url;
let _p = L.SVG.create('pattern');
_p.setAttribute('id', _ref_id);
_p.setAttribute('x', '0');
_p.setAttribute('y', '0');
_p.setAttribute('patternUnits', 'userSpaceOnUse');
_p.setAttribute('width', '24');
_p.setAttribute('height', '24');
let _rect = L.SVG.create('rect');
_rect.setAttribute('width', 24);
_rect.setAttribute('height', 24);
_rect.setAttribute('x', 0);
_rect.setAttribute('x', 0);
_rect.setAttribute('fill', options.fillColor || options.color);
let _img = L.SVG.create('image');
_img.setAttribute('x', '0');
_img.setAttribute('y', '0');
_img.setAttributeNS('http://www.w3.org/1999/xlink', 'href', _img_url);
_img.setAttribute('width', '24');
_img.setAttribute('height', '24');
_p.appendChild(_rect);
_p.appendChild(_img);
this._defs.appendChild(_p);
_im.onload = function () {
_p.setAttribute('width', _im.width);
_p.setAttribute('height', _im.height);
_img.setAttribute('width', _im.width);
_img.setAttribute('height', _im.height);
};
}
})
}, window));

@ -0,0 +1,123 @@
{
"type": "FeatureCollection",
"name": "1中队",
"crs": {
"type": "name",
"properties": {
"name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
},
"features": [
{
"type": "Feature",
"properties": {"name":"1中队"},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
118.80359831953038,
31.920541474184631
],
[
118.809995613675383,
31.921300571418364
],
[
118.817403518179887,
31.923457398392177
],
[
118.820672260009857,
31.924602706173275
],
[
118.827974531834627,
31.927027952762217
],
[
118.829292266894868,
31.927790606324628
],
[
118.83066298193161,
31.929981679407977
],
[
118.83113779525732,
31.932126055676779
],
[
118.830109301028088,
31.935518887106991
],
[
118.827999390641324,
31.940136960142237
],
[
118.825524663410405,
31.945180448031923
],
[
118.823463948959429,
31.94886941892689
],
[
118.821363113715094,
31.953127462854333
],
[
118.820788814597393,
31.954086611966904
],
[
118.820365727110826,
31.956235317294286
],
[
118.818893532794135,
31.95735984367192
],
[
118.813689762922351,
31.957350326300205
],
[
118.802351626720395,
31.957380778433478
],
[
118.802294703527096,
31.955398230444136
],
[
118.802218418786111,
31.946063970017875
],
[
118.802128741914643,
31.940737611049684
],
[
118.803386994535202,
31.930696400800176
],
[
118.803387563660024,
31.924494008769365
],
[
118.803387563660024,
31.924494008769365
],
[
118.80359831953038,
31.920541474184631
]
]
]
}
}
]
}

@ -0,0 +1,243 @@
{
"type": "FeatureCollection",
"name": "2中队",
"crs": {
"type": "name",
"properties": {
"name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
},
"features": [
{
"type": "Feature",
"properties": {"name":"2中队"},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
118.803474896592405,
31.922639738321898
],
[
118.803415659169403,
31.924023949953117
],
[
118.803385557625091,
31.924519011055132
],
[
118.80338550540823,
31.925088138416832
],
[
118.80338317347298,
31.928664937287238
],
[
118.803385991746822,
31.930706401397895
],
[
118.803302779475828,
31.9313284042771
],
[
118.80289471871879,
31.934617475443002
],
[
118.802723275811957,
31.935980502664833
],
[
118.80258692354306,
31.937069526099854
],
[
118.802328255606298,
31.939143573990314
],
[
118.802250054873085,
31.939760586603036
],
[
118.80213174799637,
31.940731614577921
],
[
118.80217457974905,
31.943427297582843
],
[
118.80221542758045,
31.945907929544191
],
[
118.802217401415177,
31.946233006932257
],
[
118.802237232725915,
31.948471550449295
],
[
118.802277715774963,
31.954923093738675
],
[
118.802300688421141,
31.955683305621456
],
[
118.802348621541924,
31.957376772611138
],
[
118.795537608916945,
31.957266113224765
],
[
118.780942140759066,
31.959006598942217
],
[
118.766215143540848,
31.960821581517681
],
[
118.765202817198059,
31.957511241955608
],
[
118.765070918531421,
31.955553719795233
],
[
118.767707926519364,
31.952424573440474
],
[
118.767510937632096,
31.950802075855798
],
[
118.767511303704467,
31.946832168473637
],
[
118.768104972974783,
31.944147940095036
],
[
118.770214619735086,
31.943814329374597
],
[
118.774963109425499,
31.941636696326722
],
[
118.775952417476717,
31.938337847688473
],
[
118.775358939211245,
31.936938986259165
],
[
118.773578359184796,
31.935204031064259
],
[
118.773315292816122,
31.933246366744783
],
[
118.774700636934199,
31.933079523172474
],
[
118.776349474445951,
31.931346637066547
],
[
118.777667926408682,
31.930956816948655
],
[
118.778987588722657,
31.929000701775063
],
[
118.778724488706928,
31.926818942882932
],
[
118.781296752107167,
31.924472137241949
],
[
118.780175558924327,
31.922681525447633
],
[
118.778262491633313,
31.921113199766264
],
[
118.775823213929712,
31.917363017051272
],
[
118.775888414933064,
31.915907754397999
],
[
118.775757609525229,
31.912327841935934
],
[
118.783211201309285,
31.913286806717171
],
[
118.785784587549202,
31.914017040851945
],
[
118.786397412322756,
31.914346873911789
],
[
118.790008470741171,
31.916801109518921
],
[
118.792031595441017,
31.916926918928198
],
[
118.792224890214499,
31.917049217341436
],
[
118.796655998076304,
31.91917916024158
],
[
118.796655998076304,
31.91917916024158
],
[
118.803474896592405,
31.922639738321898
]
]
]
}
}
]
}

@ -0,0 +1,191 @@
{
"type": "FeatureCollection",
"name": "3中队",
"crs": {
"type": "name",
"properties": {
"name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
},
"features": [
{
"type": "Feature",
"properties": {"name": "3中队"},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
118.810008752170205,
31.876284869189416
],
[
118.809510691110347,
31.877085162032991
],
[
118.808172714084705,
31.880839617139745
],
[
118.806725519689522,
31.884996003230466
],
[
118.805990800480743,
31.888330459257382
],
[
118.80575398496903,
31.892287902298033
],
[
118.804535438673625,
31.9057197596014
],
[
118.804377350613152,
31.914347393214801
],
[
118.804191882868324,
31.915637369637061
],
[
118.803961298342202,
31.917284351412405
],
[
118.803807886026604,
31.918642398539536
],
[
118.803586355754902,
31.919901311767862
],
[
118.803598319346875,
31.920543474630179
],
[
118.804749475126968,
31.920675420618203
],
[
118.809976576010769,
31.921298537515739
],
[
118.813801185022314,
31.92240659825773
],
[
118.815630892217698,
31.922939036220296
],
[
118.816042731484302,
31.923062815556552
],
[
118.817360429810932,
31.923443316006889
],
[
118.819265348320016,
31.924106981382092
],
[
118.825970326276291,
31.926367029978536
],
[
118.828003593146661,
31.927034008871118
],
[
118.829307298873488,
31.92779063464225
],
[
118.830673002126858,
31.929993700965959
],
[
118.831786418944716,
31.929409662877241
],
[
118.832852786132364,
31.928224397928002
],
[
118.833902293498369,
31.925045650591304
],
[
118.834951700659701,
31.922895130080757
],
[
118.838320851350758,
31.921732120154644
],
[
118.841303156344338,
31.919959181891659
],
[
118.843898633545322,
31.917531316769907
],
[
118.846052375726387,
31.912505020561266
],
[
118.846659850668701,
31.909418405908788
],
[
118.845335461949873,
31.906935532847577
],
[
118.845832701011787,
31.904128796578195
],
[
118.848372978258311,
31.900670469570265
],
[
118.840753640498193,
31.891203901997336
],
[
118.836335854564652,
31.887123902499876
],
[
118.831972982863093,
31.88355799429733
],
[
118.824849182232967,
31.879800796300984
],
[
118.815792419212215,
31.87697538357288
],
[
118.810008752170205,
31.876284869189416
]
]
]
}
}
]
}

@ -0,0 +1,259 @@
{
"type": "FeatureCollection",
"name": "4中队",
"crs": {
"type": "name",
"properties": {
"name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
},
"features": [
{
"type": "Feature",
"properties": {"name": "4中队"},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
118.80343082010954,
31.922575651194556
],
[
118.803607439804253,
31.919414238207491
],
[
118.80417086608648,
31.915388279460718
],
[
118.804452498157104,
31.914285504964688
],
[
118.804453242016834,
31.906171721127446
],
[
118.804664863088348,
31.903756547442779
],
[
118.805193396872411,
31.89795517521495
],
[
118.805667762606532,
31.892915890950754
],
[
118.805949618654211,
31.889455628862937
],
[
118.806091061823594,
31.887576469224967
],
[
118.806689467693332,
31.884802900856638
],
[
118.807851001011016,
31.881761254469723
],
[
118.809452561546578,
31.87724409338249
],
[
118.810153060045508,
31.876056075413661
],
[
118.810903640488746,
31.875151212020395
],
[
118.816392743105538,
31.865090039162936
],
[
118.822635858630164,
31.853750344485331
],
[
118.822716065699922,
31.853339413666976
],
[
118.822230375483784,
31.838632664399793
],
[
118.822057431294382,
31.833997470434493
],
[
118.821575450916768,
31.833588493657665
],
[
118.818406739850204,
31.834226725655036
],
[
118.812904494167171,
31.83322751107881
],
[
118.807551170225892,
31.829666432802032
],
[
118.805420278020406,
31.827335373771731
],
[
118.802162499877852,
31.823779327276206
],
[
118.799494928067034,
31.821009557911417
],
[
118.794242752823465,
31.823062961322641
],
[
118.791002449481965,
31.824519636806286
],
[
118.788866535276512,
31.831912114703744
],
[
118.79054770271209,
31.835953121698843
],
[
118.792134769170033,
31.840403157708991
],
[
118.79328795294586,
31.847616178871153
],
[
118.793689845280255,
31.855913384639987
],
[
118.777232951442087,
31.87111043054869
],
[
118.772242862747504,
31.87291938082285
],
[
118.76850735569576,
31.867087431407882
],
[
118.767591485150078,
31.85849609827325
],
[
118.767486584291532,
31.856617657285611
],
[
118.76377929779953,
31.856488523675484
],
[
118.765146635500429,
31.861314207598614
],
[
118.7652862539301,
31.86638431013554
],
[
118.76314454757231,
31.871885328241323
],
[
118.763175305705659,
31.874689922110122
],
[
118.752573072000033,
31.876521314433113
],
[
118.745718313494976,
31.880700515097743
],
[
118.744798490694038,
31.881384838359381
],
[
118.744795459179045,
31.881736912940053
],
[
118.758974965688935,
31.880616470074624
],
[
118.764318240874516,
31.882123044813881
],
[
118.754199413686081,
31.907088033525696
],
[
118.753848133760087,
31.909662550483631
],
[
118.752214769248027,
31.912222951883297
],
[
118.775945489590555,
31.915736769335847
],
[
118.775751613672398,
31.912215811698356
],
[
118.786000877976974,
31.91412533184624
],
[
118.789991442574376,
31.916826092106163
],
[
118.792198859040354,
31.916939156326023
],
[
118.80343082010954,
31.922575651194556
]
]
]
}
}
]
}

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

@ -0,0 +1,177 @@
{
"type": "FeatureCollection",
"name": "点位",
"crs": {
"type": "name",
"properties": {
"name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
},
"features": [
{
"type": "Feature",
"properties": {"name":"执法人员"},
"geometry": {
"coordinates": [
118.75548171596654,
31.89394647316125
],
"type": "Point"
}
},
{
"type": "Feature",
"properties": {"name":"执法人员"},
"geometry": {
"coordinates": [
118.80544753568995,
31.946370280828546
],
"type": "Point"
}
},
{
"type": "Feature",
"properties": {"name":"执法人员"},
"geometry": {
"coordinates": [
118.74576613991007,
31.8391346298732
],
"type": "Point"
}
},
{
"type": "Feature",
"properties": {"name":"执法车辆"},
"geometry": {
"coordinates": [
118.75617568568583,
31.907202504842076
],
"type": "Point"
}
},
{
"type": "Feature",
"properties": {"name":"执法车辆"},
"geometry": {
"coordinates": [
118.71245559342861,
31.80729344525831
],
"type": "Point"
}
},
{
"type": "Feature",
"properties": {"name":"执法车辆"},
"geometry": {
"coordinates": [
118.76797317089773,
31.815844471399032
],
"type": "Point"
}
},
{
"type": "Feature",
"properties": {"name":"普通事件"},
"geometry": {
"coordinates": [
118.78046462582762,
31.937536901411846
],
"type": "Point"
}
},
{
"type": "Feature",
"properties": {"name":"重点事件"},
"geometry": {
"coordinates": [
118.74646010962817,
31.887465051816918
],
"type": "Point"
}
},
{
"type": "Feature",
"properties": {"name":"普通事件"},
"geometry": {
"coordinates": [
118.8234907483668,
31.92870267299449
],
"type": "Point"
}
},
{
"type": "Feature",
"properties": {"name":"重点事件"},
"geometry": {
"coordinates": [
118.73778548814812,
31.83294414851042
],
"type": "Point"
}
},
{
"type": "Feature",
"properties": {"name":"普通事件"},
"geometry": {
"coordinates": [
118.75860457969964,
31.82351023555887
],
"type": "Point"
}
},
{
"type": "Feature",
"properties": {"name":"重点事件"},
"geometry": {
"coordinates": [
118.80857039942185,
31.840608492795567
],
"type": "Point"
}
},
{
"type": "Feature",
"properties": {"name":"监控视频"},
"geometry": {
"coordinates": [
118.79202271621062,
31.894683156925666
],
"type": "Point"
}
},
{
"type": "Feature",
"properties": {"name":"监控视频"},
"geometry": {
"coordinates": [
118.78822314147698,
31.87962764374977
],
"type": "Point"
}
},
{
"type": "Feature",
"properties": {"name":"监控视频"},
"geometry": {
"coordinates": [
118.82115278916302,
31.914036628233447
],
"type": "Point"
}
}
]
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,24 @@
/*
* @Descripttion:
* @version:
* @Author: JC9527
* @Date: 2023-08-14 14:16:12
* @LastEditors: JC9527
* @LastEditTime: 2023-08-14 14:56:29
*/
// rem等比适配配置文件
// 基准大小
const baseSize = 16
// 设置 rem 函数
function setRem() {
// 当前页面宽度相对于 1920宽的缩放比例可根据自己需要修改。
const scale = document.documentElement.clientWidth / 1920
// 设置页面根节点字体大小“Math.min(scale, 2)” 指最高放大比例为2可根据实际业务需求调整
document.documentElement.style.fontSize = baseSize * Math.min(scale, 1) + 'px'
}
// 初始化
setRem()
// 改变浏览器窗口大小时重新设置 rem
window.onresize = function () {
setRem()
}

@ -0,0 +1,307 @@
<!--
* @Descripttion:
* @version:
* @Author: JC9527
* @Date: 2023-08-15 13:08:32
* @LastEditors: JC9527
* @LastEditTime: 2023-08-16 17:04:48
-->
<template>
<div class="map-middle">
<div class="middle-middle">
<img src="@/assets/images/action-left.png" alt="">
<img src="@/assets/images/action-right.png" alt="">
</div>
<div class="middle-top-left">
<div class="input-keyword">
<el-input
placeholder="请输入关键字"
v-model="input">
<i slot="suffix" class="el-icon-search" @click="search"></i>
</el-input>
</div>
<div class="laser-positioning" @click="positioning()">
<span>地图扎点</span>
<img src="@/assets/images/positioning.png" alt="">
</div>
<div class="creation-task" @click="createdTask()">
<span>任务创建</span>
<img src="@/assets/images/createdTask.png" alt="">
</div>
</div>
<div class="middle-bottom-left">
<div class="list" @click="changeMap(1)">
<div class="leftbg" :class="actionMap == 1 ? 'action-map':''">
<img src="@/assets/images/icon1.png" alt="">
</div>
<div class="rightbg" v-show="actionMap == 1">
<span>执法人员</span>
</div>
</div>
<div class="list" @click="changeMap(2)">
<div class="leftbg" :class="actionMap == 2 ? 'action-map':''">
<img src="@/assets/images/icon2.png" alt="">
</div>
<div class="rightbg" v-show="actionMap == 2">
<span>普通事件</span>
</div>
</div>
<div class="list" @click="changeMap(2)">
<div class="leftbg" :class="actionMap == 2 ? 'action-map':''">
<img src="@/assets/images/icon3.png" alt="">
</div>
<div class="rightbg" v-show="actionMap == 2">
<span>重点事件</span>
</div>
</div>
<div class="list" @click="changeMap(3)">
<div class="leftbg" :class="actionMap == 3 ? 'action-map':''">
<img src="@/assets/images/icon4.png" alt="">
</div>
<div class="rightbg" v-show="actionMap == 3">
<span>执法车辆</span>
</div>
</div>
<div class="list" @click="changeMap(4)">
<div class="leftbg" :class="actionMap == 4 ? 'action-map':''">
<img src="@/assets/images/icon5.png" alt="">
</div>
<div class="rightbg" v-show="actionMap == 4">
<span>监控视频</span>
</div>
</div>
</div>
<div class="middle-bottom-right">
<div class="btn-action">
<span :class="action == 1? 'action':''" @click="actionBtn(1)"></span>
<span :class="action == 2? 'action':''" @click="actionBtn(2)"></span>
</div>
</div>
<personage-track ref="personageTrack"></personage-track>
<crew-assign ref="crewAssign"></crew-assign>
<video-wall ref="videoWall"></video-wall>
</div>
</template>
<script>
import personageTrack from "../../components/personagetrack/index.vue"
import crewAssign from "../../components/crewAssign/index.vue"
import videoWall from "../../components/videoWall/index.vue"
export default {
components:{personageTrack,crewAssign,videoWall},
data() {
return {
action:1,
lawExecutor:true, //
generalEvent:false, //
emphasisEvent:false, //
lawCar:false, //
surveillanceVideo:false, //
input:'', //
actionMap:1, //
}
},
methods:{
actionBtn(id){
this.action = id;
console.log(id)
this.$emit('actionBtn',id);
if(id == 1){
this.$refs.personageTrack.open();
} else {
this.$refs.crewAssign.open();
}
},
//
search(){
},
//
createdTask(){
},
//
positioning(){
this.$refs.videoWall.open();
},
//
changeMap(id){
//
// if(id == 1) {
// this.actionMap <= 1 ? this.actionMap = 4 : this.actionMap--
// } else {
// //
// this.actionMap >= 4 ? this.actionMap = 1 : this.actionMap++
// }
this.actionMap = id;
this.$emit('actionMap',this.actionMap);
},
},
}
</script>
<style lang="scss" scoped>
::v-deep .el-dialog:not(.is-fullscreen) {
margin-top: 100px !important;
}
.map-middle {
width: 100%;
height: 100%;
position: relative;
display: flex;
justify-content: flex-end;
align-items: flex-end;
.middle-middle {
position: absolute;
bottom: 50%;
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
img {
width: 40px;
cursor: pointer;
}
}
.middle-top-left {
position: absolute;
left: 0;
top: 0;
display: flex;
.input-keyword {
::v-deep .el-input {
background: rgba(0,60,116,0.2);
box-shadow: inset 0px 0px 6px 0px #00C2FF;
border-radius: 2px;
border: 1px solid rgba(181,207,255,0.5);
.el-input__inner {
background-color: transparent;
width: 222px;
height: 38px;
color: #fff;
border: none;
}
.el-input__inner::placeholder {
/* 在这里添加你想要修改的 placeholder 样式 */
font-size: 14px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #D3EEF2;
line-height: 20px;
}
}
::v-deep .el-input__suffix {
line-height: 44px;
color: #D3EEF2;
right: 10px;
cursor: pointer;
.el-icon-search:before {
font-size: 24px;
color: #D3EEF2;
}
}
}
.laser-positioning,.creation-task {
// height: 38px;
margin-left: 8px;
background: rgba(0,60,116,0.6);
box-shadow: inset 0px 0px 6px 0px #00C2FF;
border-radius: 2px;
border: 1px solid rgba(181,207,255,0.5);
display: flex;
align-items: center;
justify-content: center;
padding: 9px 13px;
cursor: pointer;
span {
font-size: 14px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #D3EEF2;
line-height: 20px;
margin-right: 12px;
}
img {
width: 20px;
}
}
}
.middle-bottom-left {
position: absolute;
left: 0;
bottom: 0;
// width: 200px;
padding: 5px 10px;
display: flex;
flex-direction: column;
.list{
margin-top: 10px;
display: flex;
align-items: center;
.leftbg {
display: flex;
align-items: center;
justify-content: center;
background-image: url('../../../assets/images/iconbg2.png');
background-size: 100% 100%;
width: 36px;
height: 36px;
cursor: pointer;
img {
width: 20px;
}
}
.action-map {
background-image: url('../../../assets/images/iconbg1.png');
}
.rightbg {
padding-left: 6px;
margin-left: 2px;
background-image: url('../../../assets/images/right-icon.png');
width: 115px;
height: 36px;
display: flex;
align-items: center;
span {
font-size: 16px;
font-family: Source Han Sans CN-Bold, Source Han Sans CN;
font-weight: 700;
color: #FFFFFF;
line-height: 26px;
text-shadow: 0px 0px 5px #0077FF;
}
}
}
}
.middle-bottom-right {
.btn-action {
display: flex;
span {
flex: 1;
display: inline-block;
text-align: center;
padding: 10px 33px;
font-size: 16px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #D3EEF2;
cursor: pointer;
background: transparent;
box-shadow: inset 0px 0px 6px 0px #00C2FF;
border-radius: 2px 2px 2px 2px;
opacity: 1;
border: 1px solid rgba(181,207,255,0.5);
&:nth-child(1) {
margin-right: 10px;
}
}
.action {
color: #fff;
background-color: rgba(255,125,64,0.8);
box-shadow: inset 0px 0px 13px 0px #F6B463;
border-radius: 2px 2px 2px 2px;
border: 1px solid rgba(181,207,255,0.5);
}
}
}
}
</style>

@ -0,0 +1,202 @@
<!--
* @Descripttion:
* @version:
* @Author: JC9527
* @Date: 2023-08-15 09:44:13
* @LastEditors: JC9527
* @LastEditTime: 2023-08-16 10:53:31
-->
<template>
<div class="left-box">
<div class="item">
<title-box title="今日事件情况"></title-box>
<div class="item-main">
<div class="lists">
<div class="bgc"></div>
<div class="list-text"> · 上报事件总数</div>
<div class="list-bottom">
<img src="@/assets/images/incident.png" alt="">
<div class="list-num">200</div>
</div>
</div>
<div class="lists">
<div class="bgc"></div>
<div class="list-text"> · 已派发任务</div>
<div class="list-bottom">
<img src="@/assets/images/incident.png" alt="">
<div class="list-num">180</div>
</div>
</div>
<div class="lists">
<div class="bgc"></div>
<div class="list-text"> · 未派发任务</div>
<div class="list-bottom">
<img src="@/assets/images/incident.png" alt="">
<div class="list-num">20</div>
</div>
</div>
</div>
</div>
<div class="item">
<title-box title="今日任务情况"></title-box>
<div class="item-main">
<div class="lists">
<div class="bgc"></div>
<div class="list-text"> · 处理任务总数</div>
<div class="list-bottom">
<img src="@/assets/images/task.png" alt="">
<div class="list-num">200</div>
</div>
</div>
<div class="lists">
<div class="bgc"></div>
<div class="list-text"> · 任务立案数量</div>
<div class="list-bottom">
<img src="@/assets/images/task.png" alt="">
<div class="list-num">180</div>
</div>
</div>
<div class="lists">
<div class="bgc"></div>
<div class="list-text"> · 任务结案数量</div>
<div class="list-bottom">
<img src="@/assets/images/task.png" alt="">
<div class="list-num">20</div>
</div>
</div>
</div>
</div>
<div class="item">
<title-box title="人员在线情况"></title-box>
<map-number title="在线人员总数" :onLine="100" :sum="150" type="人" :numberArray="peopleArray"></map-number>
</div>
<div class="item">
<title-box title="车辆在线情况"></title-box>
<map-number title="在线车辆总数" :onLine="10" :sum="18" type="辆" :numberArray="vehicleArray"></map-number>
</div>
</div>
</template>
<script>
import titleBox from '../../components/title/index.vue'
import mapNumber from '../../components/mapLeftNumber/index.vue'
export default {
name:'mapLeftContent',
components:{titleBox,mapNumber},
data() {
return {
peopleArray:[
{
title:'李飞'
},{
title:'李飞'
},{
title:'李飞'
},{
title:'李飞'
},{
title:'李飞'
},{
title:'李飞'
},{
title:'李飞'
},{
title:'李飞'
},{
title:'李飞'
},{
title:'李飞'
},
],
vehicleArray:[
{
title:'苏A123456'
},{
title:'苏A123456'
},{
title:'苏A123456'
},{
title:'苏A123456'
},{
title:'苏A123456'
},{
title:'苏A123456'
},{
title:'苏A123456'
},{
title:'苏A123456'
},{
title:'苏A123456'
},{
title:'苏A123456'
},
]
}
},
methods:{
},
}
</script>
<style lang="scss" scoped>
.left-box {
display: grid;
grid-column: 1fr;
grid-row-gap: 15px;
.item {
// background: rgba(222, 225, 230, 0.6);
.item-main {
margin-top: 5px;
display: flex;
justify-content: space-between;
padding-left: 17px;
.lists {
// padding: 5px;
width: 141px;
display: flex;
flex-direction: column;
// justify-content: space-between;
position: relative;
.bgc {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
width: 141px;
background: linear-gradient(180deg, #0073FF 0%, rgba(0,71,129,0) 100%);
opacity: 0.5;
}
.list-text {
font-size: 15px;
height: 38px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #D3EEF2;
line-height: 22px;
background-image: url("../../../assets/images/masking.png");
background-size: 100% 100%;
padding: 16px 0 0 8px;
}
.list-bottom {
display: flex;
padding-left: 24px;
margin-top: 11px;
img {
width: 37px;
height: 40px;
margin-right: 14px;
}
.list-num {
font-size: 32px;
font-family: D-DIN-Regular, D-DIN;
font-weight: 400;
color: #D3EEF2;
line-height: 35px;
letter-spacing: 1px
}
}
}
}
}
}
</style>

@ -0,0 +1,109 @@
<!--
* @Descripttion:
* @version:
* @Author: JC9527
* @Date: 2023-08-15 11:09:57
* @LastEditors: JC9527
* @LastEditTime: 2023-08-16 10:49:03
-->
<template>
<div class="right-box">
<div class="item">
<title-box title="区域网格"></title-box>
<map-right :rightArray="griddingArray"></map-right>
</div>
<div class="item">
<title-box title="重点区域"></title-box>
<map-right :rightArray="areaArray"></map-right>
</div>
<div class="item">
<title-box title="考勤围栏"></title-box>
<map-right :rightArray="griddingArray"></map-right>
</div>
<div class="item">
<title-box title="重点路段"></title-box>
<map-right :rightArray="griddingArray"></map-right>
</div>
</div>
</template>
<script>
import titleBox from '../../components/title/index.vue'
import mapRight from '../../components/mapRight/index.vue'
export default {
name:'mapRightContent',
components:{titleBox,mapRight},
data() {
return {
griddingArray:[
{
area:'网格1',
event:60,
resolved:40,
unsolved:20
},{
area:'网格2',
event:60,
resolved:40,
unsolved:20
},{
area:'网格3',
event:60,
resolved:40,
unsolved:20
},{
area:'网格1',
event:60,
resolved:40,
unsolved:20
},{
area:'网格2',
event:60,
resolved:40,
unsolved:20
},
],
areaArray:[
{
area:'网格1',
event:60,
resolved:40,
unsolved:20
},{
area:'网格2',
event:60,
resolved:40,
unsolved:20
},{
area:'网格3',
event:60,
resolved:40,
unsolved:20
},{
area:'网格1',
event:60,
resolved:40,
unsolved:20
},{
area:'网格2',
event:60,
resolved:40,
unsolved:20
},
],
}
},
methods:{
},
}
</script>
<style lang="scss" scoped>
.right-box {
display: grid;
grid-column: 1fr;
grid-row-gap: 15px;
.item {
// background: rgba(222, 225, 230, 0.6);
// height: 161px;
}
}
</style>

@ -0,0 +1,186 @@
<!--
* @Descripttion:
* @version:
* @Author: JC9527
* @Date: 2023-08-14 14:40:02
* @LastEditors: JC9527
* @LastEditTime: 2023-08-16 11:32:02
-->
<template>
<div class="pc-container">
<div class="system-header">
<div class="left-tags">
<div class="new-time">{{ newTime }}</div>
<div>{{ currentWork }}</div>
</div>
<div class="system-title" text="城市精细化管理监测主题">
城市精细化管理监测主题
</div>
<!-- <div class="right-tags">
<el-input
placeholder="请输入设备名称"
v-model="input">
<i slot="suffix" class="el-icon-search" @click="search"></i>
</el-input>
</div> -->
</div>
<div class="child-view">
<!-- <router-view /> -->
<my-map></my-map>
</div>
</div>
</template>
<script>
// import myRouter from '../../router.js'
import myMap from "./map/index.vue"
export default {
data() {
return {
newTime: '',
currentWork:'',
input:'',
}
},
created() {
//
let dayList = {
0: '星期日',
1: '星期一',
2: '星期二',
3: '星期三',
4: '星期四',
5: '星期五',
6: '星期六',
}
this.newTime =
this.$moment(new Date()).add(0, 'year').format('YYYY-MM-DD') +
' '
this.currentWork = dayList[this.$moment().weekday()]
},
methods:{
search(){
}
},
components:{myMap}
// computed: {
// routerList() {
// let staticRouter = myRouter.options.routes.filter(
// (item) => item.show == true
// )[0].children
// return staticRouter
// },
// },
}
</script>
<style lang="scss" scoped>
div {
text-align: left;
}
.pc-container {
overflow: hidden;
height: 100%;
background: url('../../assets/images/zhifa/main-background.jpg') no-repeat
center;
background-size: cover;
position: relative;
.system-header {
position: absolute;
top: 0;
left: 0;
height: 80px;
width: 100%;
background-image: url('../../assets/images/img_title@2x.png');
background-size: 100% 100%;
display: flex;
padding: 0 40px;
.system-title {
padding: 18px 0 0 65px;
font-size: 40px;
font-family: 'YouSheBiaoTiHei';
font-weight: 400;
color: #ffffff;
display: flex;
// justify-content: center;
flex: 1;
text-shadow: 3px 3px 0px #0C1015, 2px 2px 0px #1A3F76;
letter-spacing: 4px;
&::before {
content: attr(text);
position: absolute;
z-index: 10;
color: #ffffff;
//
background: linear-gradient(180deg, #FFFFFF 0%, #4499D6 100%);
-webkit-background-clip: text;
color: transparent;
//
text-shadow: none;
}
}
.left-tags {
display: flex;
width: 630px;
align-items: flex-start;
// flex-direction: row-reverse;
// justify-content: center;
box-sizing: border-box;
padding: 10px 0 0 8px;
.new-time {
padding: 28px 0 0 10px;
font-size: 22px;
font-family: 'YouSheBiaoTiHei';
font-weight: 400;
color: #9ae6ff;
}
}
// .right-tags {
// padding-top: 16px;
// ::v-deep .el-input {
// border: 1px solid #D3EEF2;
// border-radius: 3px;
// .el-input__inner {
// background-color: transparent;
// width: 296px;
// height: 30px;
// color: #fff;
// border: none;
// }
// .el-input__inner::placeholder {
// /* placeholder */
// font-size: 14px;
// font-family: Source Han Sans CN-Regular, Source Han Sans CN;
// font-weight: 400;
// color: #D3EEF2;
// line-height: 20px;
// }
// }
// // ::v-deep .el-icon-search:before {
// // font-size: 20px;
// // }
// // ::v-deep .el-input__icon {
// // line-height: 30px;
// // }
// ::v-deep .el-input__suffix {
// line-height: 35px;
// color: #D3EEF2;
// cursor: pointer;
// .el-icon-search:before {
// font-size: 20px;
// }
// }
// }
}
.child-view {
position: absolute;
top: 80px;
left: 0;
width: 100%;
height: calc(100% - 80px);
}
}
</style>

@ -0,0 +1,767 @@
<!--
* @Descripttion:
* @version:
* @Author: JC9527
* @Date: 2023-08-14 15:46:26
* @LastEditors: JC9527
* @LastEditTime: 2023-08-17 18:16:09
-->
<!--
* @Descripttion:
* @version:
* @Author: JC9527
* @Date: 2023-08-14 15:46:26
* @LastEditors: JC9527
* @LastEditTime: 2023-08-17 16:15:51
-->
<!--
* @Descripttion:
* @version:
* @Author: JC9527
* @Date: 2023-08-14 15:46:26
* @LastEditors: JC9527
* @LastEditTime: 2023-08-17 15:40:05
-->
<template>
<div class="map-main">
<div id="showMap" class="showMap"></div>
<div class="left-bg">
<div class="bgt"></div>
</div>
<div class="map-left">
<map-left></map-left>
</div>
<img src="@/assets/images/action-left.png" alt="" class="left-image">
<img src="@/assets/images/action-right.png" alt="" class="right-image">
<div class="middle-top-left">
<div class="input-keyword">
<el-input
placeholder="请输入关键字"
v-model="input">
<i slot="suffix" class="el-icon-search" @click="search"></i>
</el-input>
</div>
<div class="laser-positioning" @click="positioning()">
<span>地图扎点</span>
<img src="@/assets/images/positioning.png" alt="">
</div>
<div class="creation-task" @click="createdTask()">
<span>任务创建</span>
<img src="@/assets/images/createdTask.png" alt="">
</div>
</div>
<div class="middle-bottom-left">
<div class="list" @click="changeMap(1)">
<div class="leftbg" :class="actionMap == 1 ? 'action-map':''">
<img src="@/assets/images/icon1.png" alt="">
</div>
<div class="rightbg" v-show="actionMap == 1">
<span>执法人员</span>
</div>
</div>
<div class="list" @click="changeMap(2)">
<div class="leftbg" :class="actionMap == 2 ? 'action-map':''">
<img src="@/assets/images/icon2.png" alt="">
</div>
<div class="rightbg" v-show="actionMap == 2">
<span>普通事件</span>
</div>
</div>
<div class="list" @click="changeMap(2)">
<div class="leftbg" :class="actionMap == 2 ? 'action-map':''">
<img src="@/assets/images/icon3.png" alt="">
</div>
<div class="rightbg" v-show="actionMap == 2">
<span>重点事件</span>
</div>
</div>
<div class="list" @click="changeMap(3)">
<div class="leftbg" :class="actionMap == 3 ? 'action-map':''">
<img src="@/assets/images/icon4.png" alt="">
</div>
<div class="rightbg" v-show="actionMap == 3">
<span>执法车辆</span>
</div>
</div>
<div class="list" @click="changeMap(4)">
<div class="leftbg" :class="actionMap == 4 ? 'action-map':''">
<img src="@/assets/images/icon5.png" alt="">
</div>
<div class="rightbg" v-show="actionMap == 4">
<span>监控视频</span>
</div>
</div>
</div>
<div class="middle-bottom-right">
<div class="btn-action">
<span :class="action == 1? 'action':''" @click="actionBtn(1)"></span>
<span :class="action == 2? 'action':''" @click="actionBtn(2)"></span>
</div>
</div>
<div class="map-right">
<map-right></map-right>
</div>
<div class="right-bg">
<div class="bgt"></div>
</div>
<div class="bottom-bg">
<div class="bgt"></div>
</div>
<personage-track ref="personageTrack"></personage-track>
<crew-assign ref="crewAssign"></crew-assign>
<video-wall ref="videoWall"></video-wall>
<person-popup v-if="personPopup" v-on:personClose="personClose" v-on:getRoute="presoninfo"></person-popup>
<event-popup v-if="eventPopup" v-on:eventClose="eventClose" v-on:zhipai="personzhipai"></event-popup>
<car-popup v-if="carPopup" v-on:carClose="carClose" v-on:carinfo="carinfo"></car-popup>
<monitoring-popup v-if="monitoringPopup" v-on:monitoringClose="monitoringClose" v-on:monitoringInfo="monitoringInfo"></monitoring-popup>
</div>
</template>
<script>
import L from 'leaflet'
//
import 'proj4'
import 'proj4leaflet'
//
import '@/utils/lib/leaflet.ChineseTmsProviders.js'
//
import '@/utils/lib/leaflet.mapCorrection.min.js'
// import zhifarenyuan from "@/utils/mapJson/zhifarenyuan.json"
// import shijianfenbu from "@/utils/mapJson/shijianfenbu.json"
// import zhifacheliang from "@/utils/mapJson/zhifacheliang.json"
// import jiankongshipin from "@/utils/mapJson/jiankongshipin.json"
import point from "@/utils/mapJson/point.json"
import jiangninggeo from "@/utils/mapJson/jiangningjingkaiqugeo.json"
import detachment1 from "@/utils/mapJson/detachment1.json"
import detachment2 from "@/utils/mapJson/detachment2.json"
import detachment3 from "@/utils/mapJson/detachment3.json"
import detachment4 from "@/utils/mapJson/detachment4.json"
import mapLeft from "../components/mapLeftContent.vue"
import mapRight from "../components/mapRightContent.vue"
// import mapCentre from "../components/mapCentre.vue"
//
import personageTrack from "../../components/personagetrack/index.vue"
import crewAssign from "../../components/crewAssign/index.vue"
import videoWall from "../../components/videoWall/index.vue"
import personPopup from "../../components/personPopup/index.vue"
import eventPopup from "../../components/eventPopup/index.vue"
import carPopup from "../../components/carPopup/index.vue"
import monitoringPopup from "../../components/monitoringPopup/index.vue"
export default {
name: 'myMap',
components:{mapLeft,mapRight,personageTrack,crewAssign,videoWall,personPopup,eventPopup,carPopup,monitoringPopup},
data() {
return {
globalMap:null,
basemap:null,
townCenter: [31.863971, 118.835418],
myZoom:12,
mapLayers:{
mapLayer1:null,
mapLayer2:null,
mapLayer3:null,
mapLayer4:null,
mapLayer5:null,
},
mapEvent:{
mapEvent1:null,
mapEvent2:null,
mapEvent3:null,
mapEvent4:null,
},
mapLayer1:null,
mapLayer2:null,
mapLayer3:null,
mapLayer4:null,
mapLayer5:null,
input:'', //
actionMap:1, //
action:1, // ///
personPopup:false,
eventPopup:false,
carPopup:false,
monitoringPopup:false
}
},
methods:{
initMap(){
this.globalMap = L.map('showMap', {
center: this.townCenter, // []
zoom: this.myZoom, //
zoomControl: false,
attributionControl: false, // leaflet
doubleClickZoom: false, //
scrollWheelZoom: true, //
dragging: true,
})
// /
this.basemap = L.tileLayer.chinaProvider('Geoq.Normal.PurplishBlue', {
maxZoom: 18,
minZoom: 5,
})
this.globalMap.addLayer(this.basemap);
this.globalMap.createPane('mapLayer1')
this.globalMap.getPane('mapLayer1').style.zIndex = 501
this.globalMap.getPane('mapLayer1').style.pointerEvents = 'none'
this.globalMap.createPane('mapLayer2')
this.globalMap.getPane('mapLayer2').style.zIndex = 502
this.globalMap.getPane('mapLayer2').style.pointerEvents = 'none'
this.globalMap.createPane('mapLayer3')
this.globalMap.getPane('mapLayer3').style.zIndex = 502
this.globalMap.getPane('mapLayer3').style.pointerEvents = 'none'
this.globalMap.createPane('mapLayer4')
this.globalMap.getPane('mapLayer4').style.zIndex = 502
this.globalMap.getPane('mapLayer4').style.pointerEvents = 'none'
this.globalMap.createPane('mapLayer5')
this.globalMap.getPane('mapLayer5').style.zIndex = 502
this.globalMap.getPane('mapLayer5').style.pointerEvents = 'none'
this.globalMap.createPane('mapEvent1')
this.globalMap.getPane('mapEvent1').style.zIndex = 503
this.globalMap.getPane('mapEvent1').style.pointerEvents = 'none'
this.mapEvent.mapEvent1 = L.featureGroup().addTo(this.globalMap)
this.mapLayers.mapLayer1 = L.featureGroup().addTo(this.globalMap)
this.mapLayers.mapLayer2 = L.featureGroup().addTo(this.globalMap)
this.mapLayers.mapLayer3 = L.featureGroup().addTo(this.globalMap)
this.mapLayers.mapLayer4 = L.featureGroup().addTo(this.globalMap)
this.mapLayers.mapLayer5 = L.featureGroup().addTo(this.globalMap)
this.globalMap.on('zoomend', e => {
let zoom = this.globalMap.getZoom()
console.log('层级:', zoom)
})
// this.addLayer2();
this.addLayer1();
this.addMark("执法人员");
// this.addLayer2();
// this.addLayer3();
// this.addLayer4();
// this.addLayer5();
},
addLayer1(){
this.mapLayers.mapLayer1.clearLayers()
// this.mapLayers.mapLayer2.clearLayers()
let geojson = L.geoJSON(jiangninggeo,{
pane: 'mapLayer1',
style: function (feature) {
return {
color: '#00C5EC',
weight: 1,
fillColor: 'rgba(64,175,255,0.4)',
fillOpacity: 1,
}
},
},{ className: 'jack-s' }
).addTo(this.mapLayers.mapLayer1)
// this.addMark()
// json
this.mapLayer1 = geojson.getBounds()
// json
this.globalMap.fitBounds(this.mapLayer1)
},
addMark(name){
this.mapEvent.mapEvent1.clearLayers()
let ico1 = L.icon({
iconUrl: require('../../../assets/images/icon/icon1.png'),
iconSize: [52, 81],
})
let ico2 = L.icon({
iconUrl: require('../../../assets/images/icon/icon2.png'),
iconSize: [52, 81],
})
let ico3 = L.icon({
iconUrl: require('../../../assets/images/icon/icon3.png'),
iconSize: [52, 81],
})
let ico4 = L.icon({
iconUrl: require('../../../assets/images/icon/icon4.png'),
iconSize: [52, 81],
})
let ico5 = L.icon({
iconUrl: require('../../../assets/images/icon/icon5.png'),
iconSize: [52, 81],
})
point.features.map((item)=>{
if(this.actionMap == 1) {
if(item.properties.name == "执法人员"){
let marker = L.marker({lng:item.geometry.coordinates[0],lat:item.geometry.coordinates[1]},{icon:ico1})
marker.addTo(this.mapEvent.mapEvent1)
this.markerClick(marker)
}
} else if(this.actionMap == 2) {
let marker
if(item.properties.name == "普通事件") {
marker = L.marker({lng:item.geometry.coordinates[0],lat:item.geometry.coordinates[1]},{icon:ico2})
marker.addTo(this.mapEvent.mapEvent1)
this.markerClick(marker)
} else if(item.properties.name == "重点事件"){
marker = L.marker({lng:item.geometry.coordinates[0],lat:item.geometry.coordinates[1]},{icon:ico3})
marker.addTo(this.mapEvent.mapEvent1)
this.markerClick(marker)
}
} else if(this.actionMap == 3) {
if(item.properties.name == "执法车辆"){
let marker = L.marker({lng:item.geometry.coordinates[0],lat:item.geometry.coordinates[1]},{icon:ico4})
marker.addTo(this.mapEvent.mapEvent1)
this.markerClick(marker)
}
} else if(this.actionMap == 4) {
if(item.properties.name == "监控视频"){
let marker = L.marker({lng:item.geometry.coordinates[0],lat:item.geometry.coordinates[1]},{icon:ico5})
marker.addTo(this.mapEvent.mapEvent1)
this.markerClick(marker)
}
}
})
// let geojson = L.geoJSON(cheshi,{
// onEachFeature: (feature, layer) => {
// console.log(feature)
// console.log(layer)
// let bounds = layer._latlng
// console.log(bounds)
// let marker
// // let center = bounds.getCenter()
// if(feature.properties.name == ""){
// marker = L.marker(bounds,{icon:ico5})
// } else if(feature.properties.name == "") {
// marker = L.marker({lng:118.74576613991007,lat:31.8391346298732},{icon:ico1})
// } else if(feature.properties.name == "") {
// marker = L.marker(bounds,{icon:ico2})
// } else if(feature.properties.name == "") {
// marker = L.marker(bounds,{icon:ico3})
// } else if(feature.properties.name == "") {
// marker = L.marker(bounds,{icon:ico4})
// }
// marker.addTo(this.mapEvent.mapEvent1)
// }
// }).addTo(this.mapEvent.mapEvent1)
},
markerClick(marker){
marker.on('click', e => {
console.log(e);
if(this.actionMap == 1) {
this.personPopup = true;
} else if(this.actionMap == 2) {
this.eventPopup = true;
} else if(this.actionMap == 3) {
this.carPopup = true
} else if(this.actionMap == 4){
this.monitoringPopup = true;
}
})
},
personClose(){
this.personPopup = false;
},
eventClose(){
this.eventPopup = false;
},
carClose(){
this.carPopup = false;
},
monitoringClose(){
this.monitoringPopup = false;
},
personzhipai(){
this.$refs.crewAssign.open();
},
presoninfo(){
this.$refs.personageTrack.open('person');
},
carinfo(){
this.$refs.personageTrack.open('car');
},
monitoringInfo(){
this.$refs.videoWall.open();
},
addLayer2(){
this.mapLayers.mapLayer2.clearLayers()
let geojson = L.geoJSON(detachment1,{
pane: 'mapLayer2',
style: function (feature) {
return {
color: '#00C5EC',
weight: 1,
fillColor: 'rgba(255,0,0,0.38)',
fillOpacity: 1,
}
},
onEachFeature: (feature, layer) => {
console.log(feature.properties.name)
let polygon = L.polygon(layer._latlngs, {
text: feature.properties.name,
textStyle: {
strokeStyle: '#ffffff',//
fillStyle: '#00000',//
// eslint-disable-next-line quotes
font: "18px 'PuHuiTi-Medium'",
lineWidth: 1,//
offsetX: -36,//-*4/2
offsetY: 9,///2
}
})
polygon.addTo(this.mapLayers.mapLayer2)
}
},{ className: 'jack-s2' }
).addTo(this.mapLayers.mapLayer2)
this.mapLayer2 = geojson.getBounds()
},
addLayer3(){
this.mapLayers.mapLayer3.clearLayers()
let geojson = L.geoJSON(detachment2,{
pane: 'mapLayer3',
style: function (feature) {
return {
color: '#00C5EC',
weight: 1,
fillColor: 'rgba(255,0,0,0.38)',
fillOpacity: 1,
}
},
},{ className: 'jack-s3' }
).addTo(this.mapLayers.mapLayer3)
this.mapLayer3 = geojson.getBounds()
},
addLayer4(){
this.mapLayers.mapLayer4.clearLayers()
let geojson = L.geoJSON(detachment3,{
pane: 'mapLayer4',
style: function (feature) {
return {
color: '#00C5EC',
weight: 1,
fillColor: 'rgba(255,0,0,0.38)',
fillOpacity: 1,
}
},
},{ className: 'jack-s4' }
).addTo(this.mapLayers.mapLayer4)
// json
this.mapLayer4 = geojson.getBounds()
},
addLayer5(){
this.mapLayers.mapLayer5.clearLayers()
let geojson = L.geoJSON(detachment4,{
pane: 'mapLayer5',
style: function (feature) {
return {
color: '#00C5EC',
weight: 1,
fillColor: 'rgba(255,0,0,0.38)',
fillOpacity: 1,
}
},
},{ className: 'jack-s5' }
).addTo(this.mapLayers.mapLayer5)
// json
this.mapLayer5 = geojson.getBounds()
},
actionBtn(id){
this.action = id;
console.log(id)
this.$emit('actionBtn',id);
if(id == 1){
this.$refs.personageTrack.open();
} else {
this.$refs.crewAssign.open();
}
},
//
search(){
},
//
createdTask(){
},
//
positioning(){
this.$refs.videoWall.open();
},
//
changeMap(id){
this.actionMap = id;
this.personPopup = false;
this.eventPopup = false;
this.carPopup = false;
this.monitoringPopup = false;
this.addMark()
switch(id){
case 1:
this.addMark("执法人员")
break;
case 2:
this.addMark("普通事件")
break;
case 3:
this.addMark("执法车辆")
break;
case 4:
this.addMark("监控视频")
break;
default:
return;
}
},
},
mounted(){
this.$nextTick(()=>{
this.initMap()
})
}
}
</script>
<style lang="scss" scoped>
.map-main {
width: 100%;
height: 100%;
position: relative;
.left-bg {
position: absolute;
left: 20px;
top: 0;
width: 11px;
height: 95%;
padding: 20px 0 0 0;
z-index: 600;
.bgt {
width: 100%;
height: 100%;
background-image: url('../../../assets/images/broadside-bg.png');
background-size: 100% 100%;
}
}
.right-bg {
position: absolute;
top: 0;
right: 20px;
width: 11px;
height: 95%;
padding: 20px 0;
z-index: 600;
.bgt {
width: 100%;
height: 100%;
background-image: url('../../../assets/images/broadside-bg.png');
background-size: 100% 100%;
}
}
.bottom-bg {
position: absolute;
bottom: 0;
left: 0;
right: 0;
width: 100%;
height: 20px;
z-index: 600;
.bgt {
width: 100%;
height: 100%;
background-image: url('../../../assets/images/bottom-bg.png');
background-size: 100% 100%;
}
}
.map-left {
position: absolute;
left: 47px;
top: 10px;
width: 460px;
height: 95%;
z-index: 600;
box-sizing: border-box;
background: rgba(216,216,216,0.05);
}
.left-image {
z-index: 600;
position: absolute;
left: 527px;
bottom: 50%;
width: 40px;
cursor: pointer;
}
.right-image {
z-index: 600;
position: absolute;
right: 527px;
bottom: 50%;
width: 40px;
cursor: pointer;
}
.map-right {
position: absolute;
right: 47px;
top: 10px;
width: 460px;
z-index: 600;
// margin: 10px 17px 0 10px;
// padding: 20px 0;
box-sizing: border-box;
}
.middle-top-left {
z-index: 600;
position: absolute;
left: 537px;
top: 10px;
display: flex;
.input-keyword {
::v-deep .el-input {
background: rgba(0,60,116,0.2);
box-shadow: inset 0px 0px 6px 0px #00C2FF;
border-radius: 2px;
border: 1px solid rgba(181,207,255,0.5);
.el-input__inner {
background-color: transparent;
width: 222px;
height: 38px;
color: #fff;
border: none;
}
.el-input__inner::placeholder {
/* 在这里添加你想要修改的 placeholder 样式 */
font-size: 14px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #D3EEF2;
line-height: 20px;
}
}
::v-deep .el-input__suffix {
line-height: 44px;
color: #D3EEF2;
right: 10px;
cursor: pointer;
.el-icon-search:before {
font-size: 24px;
color: #D3EEF2;
}
}
}
.laser-positioning,.creation-task {
// height: 38px;
margin-left: 8px;
background: rgba(0,60,116,0.6);
box-shadow: inset 0px 0px 6px 0px #00C2FF;
border-radius: 2px;
border: 1px solid rgba(181,207,255,0.5);
display: flex;
align-items: center;
justify-content: center;
padding: 9px 13px;
cursor: pointer;
span {
font-size: 14px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #D3EEF2;
line-height: 20px;
margin-right: 12px;
}
img {
width: 20px;
}
}
}
.middle-bottom-left {
position: absolute;
left: 537px;
bottom: 40px;
// width: 200px;
z-index: 600;
padding: 5px 10px;
display: flex;
flex-direction: column;
.list{
margin-top: 10px;
display: flex;
align-items: center;
.leftbg {
display: flex;
align-items: center;
justify-content: center;
background-image: url('../../../assets/images/iconbg2.png');
background-size: 100% 100%;
width: 36px;
height: 36px;
cursor: pointer;
img {
width: 20px;
}
}
.action-map {
background-image: url('../../../assets/images/iconbg1.png');
}
.rightbg {
padding-left: 6px;
margin-left: 2px;
background-image: url('../../../assets/images/right-icon.png');
width: 115px;
height: 36px;
display: flex;
align-items: center;
span {
font-size: 16px;
font-family: Source Han Sans CN-Bold, Source Han Sans CN;
font-weight: 700;
color: #FFFFFF;
line-height: 26px;
text-shadow: 0px 0px 5px #0077FF;
}
}
}
}
.middle-bottom-right {
position: absolute;
bottom: 40px;
right: 537px;
z-index: 600;
.btn-action {
display: flex;
span {
flex: 1;
display: inline-block;
text-align: center;
padding: 10px 33px;
font-size: 16px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #D3EEF2;
cursor: pointer;
background: transparent;
box-shadow: inset 0px 0px 6px 0px #00C2FF;
border-radius: 2px 2px 2px 2px;
opacity: 1;
border: 1px solid rgba(181,207,255,0.5);
&:nth-child(1) {
margin-right: 10px;
}
}
.action {
color: #fff;
background-color: rgba(255,125,64,0.8);
box-shadow: inset 0px 0px 13px 0px #F6B463;
border-radius: 2px 2px 2px 2px;
border: 1px solid rgba(181,207,255,0.5);
}
}
}
.showMap {
width: 100%;
height: 100%;
}
}
</style>

@ -0,0 +1,74 @@
<template>
<popup-title :type="3" v-on:personClose="carClose" title="车辆信息">
<div class="car-main">
<div class="car-info">
<div class="dot"></div>
<div class="name">执法一队1号车</div>
<div class="position">苏A568974</div>
</div>
<div class="btn" @click="carinfo"></div>
</div>
</popup-title>
</template>
<script>
import popupTitle from "../popupTitle/index.vue"
export default {
components:{popupTitle},
data() {
return {
}
},
methods:{
carClose(){
this.$emit('carClose')
},
carinfo(){
this.$emit('carinfo')
}
},
}
</script>
<style lang="scss" scoped>
.car-main {
padding: 12px 10px 25px 15px;
display: grid;
grid-column: 1fr;
grid-row-gap: 9px;
.car-info {
display: flex;
align-items: center;
.dot {
width: 4px;
height: 4px;
background: #DAEBFF;
box-shadow: 0px 0px 10px 5px rgba(0,119,255,0.25), 0px 0px 5px 0px rgba(229,241,255,0.25);
border-radius: 20px 20px 20px 20px;
margin-right: 7px;
}
.name,.position {
font-size: 12px;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #E9F4FF;
line-height: 17px;
margin-right: 8px;
}
}
.btn {
margin-top: 19px;
background-image: url('../../../assets/images/popup/icon1btn.png');
background-size: 100% 100%;
width: 100%;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #D3EEF2;
line-height: 20px;
cursor: pointer;
}
}
</style>

@ -0,0 +1,275 @@
<!--
* @Descripttion:
* @version:
* @Author: JC9527
* @Date: 2023-08-17 09:04:40
* @LastEditors: JC9527
* @LastEditTime: 2023-08-17 18:28:30
-->
<template>
<dia-log ref="dialog2" width="475px" title="人员指派">
<div class="crew-assign">
<div class="item">
<div class="ball"></div>
<div class="content">
事件名称<span>xx小区乱堆杂物</span>
</div>
</div>
<div class="item">
<div class="ball"></div>
<div class="content">
事件类别<span>暴露垃圾</span>
</div>
</div>
<div class="item">
<div class="ball"></div>
<div class="content">
事件地址<span>xx街道xx小区</span>
</div>
</div>
<div class="itemtwo">
<div class="left">
<div class="ball"></div>
<div class="content">指派人员</div>
</div>
<div class="right">
<el-select v-model="value" placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</div>
</div>
<div class="itemtwo">
<div class="left">
<div class="ball"></div>
<div class="content">截至时间</div>
</div>
<div class="right">
<el-date-picker
v-model="dateTime"
type="datetime"
placeholder="选择日期时间">
</el-date-picker>
<img class="data_icon" src="@/assets/images/timeIcon.png" alt="">
</div>
</div>
<div class="btns">
<div class="btn" @click="cancel()"></div>
<div class="btn btnTwo" @click="confirm()"></div>
</div>
</div>
</dia-log>
</template>
<script>
import diaLog from "../../components/dialog/index.vue"
export default {
components:{diaLog},
data() {
return {
dateTime:'',
options: [{
value: '选项1',
label: '黄金糕'
}, {
value: '选项2',
label: '双皮奶'
}, {
value: '选项3',
label: '蚵仔煎'
}, {
value: '选项4',
label: '龙须面'
}, {
value: '选项5',
label: '北京烤鸭'
}],
value: ''
}
},
methods:{
open() {
this.$refs.dialog2.open('2');
},
Close() {
this.$refs.dialog2.Close();
},
//
cancel(){
this.$refs.dialog2.Close();
},
confirm(){}
},
}
</script>
<style lang="scss" scoped>
::v-deep .el-dialog__body {
padding: 0 0 60px 40px !important;
}
.crew-assign {
margin-top: 15px;
padding-left: 20px;
display: grid;
grid-column: 1fr;
grid-row-gap: 30px;
.item {
display: flex;
align-items: center;
.ball {
width: 4px;
height: 4px;
background: #DAEBFF;
box-shadow: 0px 0px 10px 5px rgba(0,119,255,0.25), 0px 0px 5px 0px rgba(229,241,255,0.25);
border-radius: 20px 20px 20px 20px;
margin-right: 15px;
}
.content {
font-size: 14px;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #CCCCCC;
line-height: 20px;
span {
font-size: 14px;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #E9F4FF;
line-height: 20px;
}
}
}
.itemtwo {
display: flex;
align-items: center;
.left {
display: flex;
align-items: center;
.ball {
width: 4px;
height: 4px;
background: #DAEBFF;
box-shadow: 0px 0px 10px 5px rgba(0,119,255,0.25), 0px 0px 5px 0px rgba(229,241,255,0.25);
border-radius: 20px 20px 20px 20px;
margin-right: 15px;
}
.content {
font-size: 14px;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #CCCCCC;
line-height: 20px;
}
}
.right {
background-image: url('../../../assets/images/timebg.png');
width: 350px;
height: 35px;
background-size: 100% 100%;
position: relative;
::v-deep .el-input__prefix {
display: none;
}
::v-deep .el-date-editor {
background-color: transparent;
width: 350px;
.el-input__inner {
background-color: transparent;
border: none;
width: 100%;
height: 35px;
font-size: 14px;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #E9F4FF;
padding-left: 12px;
}
.el-input__inner::placeholder {
/* 在这里添加你想要修改的 placeholder 样式 */
font-size: 14px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #D3EEF2;
-webkit-background-clip: text;
-webkit-text-fill-color: rgba(211,238,242,0.2);
}
}
::v-deep .el-select {
background-color: transparent;
width: 350px;
.el-input .el-input__suffix .el-input__suffix-inner .el-icon-arrow-up::before {
content: "";
background: url(../../../assets/images/pull-down.png) center center no-repeat;
background-size: 100% 100%;
position: absolute;
width: 100%;
height: 22px;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.el-input__suffix .el-input__suffix-inner .el-select__caret {
width: 22px;
}
.el-input__suffix {
margin-right: 5px;
}
.el-input__inner {
background-color: transparent;
border: none;
width: 100%;
height: 35px;
font-size: 14px;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #E9F4FF;
}
.el-input__inner::placeholder {
/* 在这里添加你想要修改的 placeholder 样式 */
font-size: 14px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #D3EEF2;
-webkit-background-clip: text;
-webkit-text-fill-color: rgba(211,238,242,0.2);
}
}
.data_icon {
position: absolute;
right: 10px;
top: 8px;
width: 20px;
}
}
}
.btns {
display: flex;
align-items: center;
justify-content: center;
margin-top: 20px;
.btn {
width: 91px;
height: 30px;
background: rgba(0,60,116,0.6);
box-shadow: inset 0px 0px 6px 0px #00C2FF;
border-radius: 2px 2px 2px 2px;
opacity: 1;
border: 1px solid rgba(181,207,255,0.5);
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #D3EEF2;
line-height: 20px;
cursor: pointer;
}
.btnTwo {
margin-left: 15px;
}
}
}
</style>

@ -0,0 +1,160 @@
<!--
* @Descripttion:
* @version:
* @Author: JC9527
* @Date: 2023-08-16 14:19:37
* @LastEditors: JC9527
* @LastEditTime: 2023-08-17 18:34:57
-->
<template>
<el-dialog
:visible.sync="dialogVisible"
:show-close="false"
:destroy-on-close="true"
:close-on-click-modal="false"
:width="width"
:style="heightStyle"
append-to-body
:custom-class="type == 1 ? 'dialog-boxed': type == 2 ? 'dialog-boxed2' : type == 3 ? 'dialog-boxed3' : ''"
>
<template slot="title">
<div class="closeClick">
<div class="headline" text="title123kmalskdnj">
<div class="headlinetitle" :text="title">{{ title }}</div>
</div>
<div class="close" @click="Close"></div>
</div>
</template>
<slot> </slot>
</el-dialog>
</template>
<script>
export default {
data() {
return {
dialogVisible:false,
type:0,
}
},
props:{
title:{
type:String,
default:"测试标题看看是啥样",
},
width:{
type:String,
default:'50%'
},
heightStyle:{
type:Object,
default: function(){
return {}
},
},
},
methods:{
open(id) {
this.type = Number(id);
this.dialogVisible = true
},
Close() {
this.dialogVisible = false
}
},
mounted(){
console.log(this.type)
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-dialog {
// width: vw(878);
// height: 520px;
// border: 1px solid red;
background-image: url('../../../assets/images/dialogbg.png');
background-size: 100% 100%;
.el-dialog__header {
padding: 10px 20px;
.closeClick {
// display: flex;
height: 46px;
// justify-content: space-between;
position: relative;
padding-top: 10px;
.headline {
background-image: url('../../../assets/images/dialogtitlebg.png');
width: 451px;
background-size: 100% 100%;
padding-left: 22px;
height: 38px;
.headlinetitle {
font-size: 20px;
font-family: YouSheBiaoTiHei-Bold, YouSheBiaoTiHei;
font-weight: 400;
// line-height: 26px;
color: #FFFFFF;
display: flex;
flex: 1;
text-shadow: 1px 1px 0px #1A3F76;
&::before {
content: attr(text);
position: absolute;
z-index: 10;
color: #ffffff;
//
background: linear-gradient(180deg, #FFFFFF 0%, #43B4C5 100%);
-webkit-background-clip: text;
color: transparent;
//
text-shadow: none;
}
}
}
.close {
position: absolute;
width: 20px;
height: 20px;
right: 0px;
top: 6px;
cursor: pointer;
}
}
}
.el-dialog__body {
padding: 22px 0 60px 40px;
}
}
::v-deep .dialog-boxed {
background-image: url('../../../assets/images/dialogbg/dialog13.png');
.el-dialog__header {
.closeClick {
.close {
position: absolute;
width: 27px;
height: 23px;
right: 10px;
top: 18px;
cursor: pointer;
}
}
}
}
::v-deep .dialog-boxed2 {
background-image: url('../../../assets/images/dialogbg/dialog2.png');
}
::v-deep .dialog-boxed3 {
background-image: url('../../../assets/images/dialogbg/792@2x.png');
.el-dialog__header {
.closeClick {
.close {
position: absolute;
width: 20px;
height: 18px;
right: 10px;
top: 2px;
cursor: pointer;
}
}
}
}
</style>

@ -0,0 +1,100 @@
<template>
<popup-title :type="2" v-on:personClose="eventClose" title="事件信息">
<div class="event-main">
<div class="event-info">
<div class="dot"></div>
<div class="name">事件名称</div>
<div class="position">XXX小区乱堆杂物</div>
</div>
<div class="event-info">
<div class="dot"></div>
<div class="name">事件类别</div>
<div class="position">暴露垃圾</div>
</div>
<div class="event-info">
<div class="dot"></div>
<div class="name">事件地址</div>
<div class="position">XX街道XX小区</div>
</div>
<div class="event-info">
<div class="dot"></div>
<div class="name">描述</div>
<div class="position">XXXXXXXXXXXXXX</div>
</div>
<div class="btn" @click="zhipai()">
指派
</div>
</div>
</popup-title>
</template>
<script>
import popupTitle from "../popupTitle/index.vue"
export default {
components:{popupTitle},
data() {
return {
mypopupTitle:{
width:'242px',
height:"224px",
}
}
},
methods:{
eventClose(){
this.$emit('eventClose')
},
zhipai(){
this.$emit('zhipai')
}
},
}
</script>
<style lang="scss" scoped>
.event-main {
padding: 12px 18px 25px 18px;
display: grid;
grid-column: 1fr;
grid-row-gap: 9px;
.event-info {
display: flex;
align-items: center;
.dot {
width: 4px;
height: 4px;
background: #DAEBFF;
box-shadow: 0px 0px 10px 5px rgba(0,119,255,0.25), 0px 0px 5px 0px rgba(229,241,255,0.25);
border-radius: 20px 20px 20px 20px;
margin-right: 7px;
}
.name,.position {
font-size: 12px;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #E9F4FF;
line-height: 17px;
}
.position {
width: 120px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
.btn {
margin-top: 19px;
background-image: url('../../../assets/images/popup/icon1btn.png');
background-size: 100% 100%;
width: 100%;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #D3EEF2;
line-height: 20px;
cursor: pointer;
}
}
</style>

@ -0,0 +1,142 @@
<template>
<div class="left-number">
<div class="number-title">
<div>· {{ title }}</div>
<div>{{ onLine }}/{{ sum }}{{ type }}</div>
</div>
<div class="header-title">
<div>姓名</div>
<div class="header-title-right">实时定位/行程轨迹</div>
</div>
<div class="lists">
<div class="main-lists" v-for="(item,index) in numberArray" :key="index" :class="(index+1) % 2 == 0? 'main-lists2':''">
<div class="list-title">
{{ item.title }}
</div>
<div class="list-right">
<div class="real-time-location">
<img src="@/assets/images/location1.png" alt="">
<span>实时定位</span>
</div>
<div class="route-track">
<img src="@/assets/images/track.png" alt="">
<span>形成轨迹</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
}
},
props:{
title:{
type:String,
default:'默认标题',
},
onLine:{
type:Number,
default:0
},
sum:{
type:Number,
default:0,
},
type:{
type:String,
default:'默认类型',
},
numberArray:{
type:Array,
default:[]
}
},
methods:{
},
}
</script>
<style lang="scss" scoped>
.left-number {
// padding: 5px 0;
.number-title {
display: flex;
justify-content: space-between;
align-items: center;
background: rgba(0,0,0,0.1);
height: 35px;
padding: 0 20px;
div {
font-size: 16px;
font-family: Source Han Sans CN-Bold, Source Han Sans CN;
font-weight: 700;
color: #D3EEF2;
line-height: 23px;
}
}
.header-title {
display: flex;
align-items: center;
background: rgba(7,127,255,0.1608);
border: 1px solid #077FFF;
height: 33px;
&>div {
flex: 1;
padding-left: 24px;
font-size: 14px;
font-family: Source Han Sans CN--Bold, Source Han Sans CN-;
font-weight: bold;
color: #D3EEF2;
}
}
.lists {
height: 120px;
overflow-y: scroll;
}
.main-lists {
display: flex;
justify-content: space-between;
background: rgba(216,216,216,0.05);
height: 33px;
align-items: center;
.list-title {
flex: 1;
font-size: 14px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #D3EEF2;
line-height: 20px;
padding-left: 24px;
}
.list-right {
flex: 1;
display: flex;
align-items: center;
font-size: 14px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #52B1FF;
.real-time-location {
margin-right: 22px;
}
.real-time-location,.route-track {
display: flex;
align-items: center;
img {
width: 18px;
margin-right: 5px;
}
}
}
}
.main-lists2 {
background: rgba(187,220,255,0.2);
}
}
</style>

@ -0,0 +1,107 @@
<template>
<div class="right-main">
<div class="header-title">
<div>网格名称</div>
<div>今日事件</div>
<div>已解决</div>
<div>未解决</div>
</div>
<div class="lists-main">
<div class="main" v-for="(item,index) in rightArray" :key="index" :class="(index+1) % 2 == 0 ? 'main1':''">
<div>
<img src="@/assets/images/location1.png" alt="">
{{ item.area }}
</div>
<div>{{ item.event }}</div>
<div>{{ item.resolved }}</div>
<div class="unsolved">{{ item.unsolved }}</div>
</div>
</div>
</div>
</template>
<script>
export default {
name:'mapRight',
data() {
return {
}
},
props:{
rightArray:{
type:Array,
default:[],
}
},
methods:{
},
}
</script>
<style lang="scss" scoped>
.right-main {
padding: 8px 0 0 17px;
.header-title {
padding: 0 24px;
display: flex;
align-items: center;
justify-content: space-between;
background: rgba(7,127,255,0.1608);
border-radius: 0px 0px 0px 0px;
opacity: 1;
border: 1px solid #077FFF;
height: 33px;
div {
font-size: 14px;
font-family: Source Han Sans CN--Bold, Source Han Sans CN-;
font-weight: bold;
color: #D3EEF2;
line-height: 21px;
width: 60px;
}
}
.lists-main {
overflow-y: scroll;
height: 99px;
}
.main {
padding: 0 24px;
display: flex;
justify-content: space-between;
align-items: center;
background: rgba(216,216,216,0.05);
height: 33px;
div {
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
font-family: Source Han Sans CN--Regular, Source Han Sans CN-;
font-weight: 400;
color: #D3EEF2;
line-height: 21px;
min-width: 60px;
&:nth-child(1) {
font-size: 14px;
font-family: Source Han Sans CN--Regular, Source Han Sans CN-;
font-weight: 400;
color: #52B1FF;
line-height: 21px;
}
img {
width: 18px;
margin-right: 8px;
}
}
.unsolved {
color: #FF6C6C;
text-align: center;
}
}
.main1 {
background: rgba(187,220,255,0.16);
}
}
</style>

@ -0,0 +1,68 @@
<template>
<popup-title :type="4" v-on:personClose="monitoringClose" title="监控视频">
<div class="monitoring">
<div class="bg">
<img src="@/assets/images/popup/screenshot20230817.png" alt="">
</div>
<div class="btns">
<div class="btn" @click="monitoringInfo()"></div>
<div class="btn">转发</div>
</div>
</div>
</popup-title>
</template>
<script>
import popupTitle from "../popupTitle/index.vue"
export default {
components:{popupTitle},
data() {
return {
}
},
methods:{
monitoringClose(){
this.$emit('monitoringClose')
},
monitoringInfo(){
this.$emit('monitoringInfo')
}
},
}
</script>
<style lang="scss" scoped>
.monitoring {
padding: 11px 25px 24px 25px;
.bg {
background-image: url("../../../assets//images/popup/video.png");
background-size: 100% 100%;
width: 192px;
height: 108px;
padding: 2px;
img {
width: 100%;
height: 100%;
}
}
.btns {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 16px;
.btn {
background-image: url("../../../assets/images/popup/icon2btn.png");
background-size: 100% 100%;
width: 91px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #D3EEF2;
line-height: 20px;
cursor: pointer;
}
}
}
</style>

@ -0,0 +1,128 @@
<!--
* @Descripttion:
* @version:
* @Author: JC9527
* @Date: 2023-08-17 15:43:51
* @LastEditors: JC9527
* @LastEditTime: 2023-08-17 17:47:57
-->
<template>
<div class="person-popup">
<div class="popup-title">
<div class="title">人员信息</div>
<div class="mask" @click="close()"></div>
</div>
<div class="person-main">
<div class="person-info">
<div class="dot"></div>
<div class="name">李飞</div>
<div class="position">执法1队队员</div>
</div>
<div class="btns">
<div @click="getRoute()"></div>
<div>附近队员</div>
<div>位置分享</div>
<div>任务派发</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
}
},
methods:{
close(){
this.$emit('personClose')
},
getRoute(){
this.$emit('getRoute')
}
},
}
</script>
<style lang="scss" scoped>
.person-popup {
position: absolute;
right: 540px;
top: 20px;
width: 242px;
height: 244px;
background-image: url("../../../assets/images/popup/bg1.png");
background-size: 100% 100%;
z-index: 600;
.popup-title {
padding: 9px 10px 0 16px;
display: flex;
justify-content: space-between;
.title {
font-size: 14px;
font-family: Source Han Sans CN-Bold, Source Han Sans CN;
font-weight: 700;
color: #E9F4FF;
line-height: 19px;
display: flex;
align-items: center;
justify-content: center;
width: 194px;
height: 30px;
background: linear-gradient(270deg, rgba(9,32,53,0) 0%, rgba(8,37,64,0.98) 51%, rgba(9,34,56,0) 100%);
border-radius: 0px 0px 0px 0px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(90deg, rgba(64.00000378489494, 163.00000548362732, 255, 0), rgba(64.00000378489494, 163.00000548362732, 255, 1), rgba(64.00000378489494, 163.00000548362732, 255, 0)) 1 1;
}
.mask {
width: 13px;
height: 13px;
cursor: pointer;
}
}
.person-main {
padding: 12px 32px 25px 30px;
.person-info {
display: flex;
align-items: center;
.dot {
width: 4px;
height: 4px;
background: #DAEBFF;
box-shadow: 0px 0px 10px 5px rgba(0,119,255,0.25), 0px 0px 5px 0px rgba(229,241,255,0.25);
border-radius: 20px 20px 20px 20px;
margin-right: 15px;
}
.name,.position {
font-size: 12px;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #E9F4FF;
line-height: 14px;
margin-right: 9px;
}
}
.btns {
display: grid;
grid-column: 1fr;
grid-row-gap: 6px;
margin-top: 15px;
div {
background-image: url('../../../assets/images/popup/icon1btn.png');
width: 100%;
height: 30px;
background-size: 100% 100%;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #D3EEF2;
line-height: 20px;
cursor: pointer;
}
}
}
}
</style>

@ -0,0 +1,335 @@
<template>
<dia-log ref="dialog" width="675px" :title="title" :type="1">
<div class="personage-track">
<div class="track-title">
<div class="titlebg"></div>
<span class="name">{{ person ? '李飞':'执法一队1号车' }}</span>
<span>{{ person ? '执法1队队员':'苏A568974' }}</span>
</div>
<div class="track-content">
<div class="oneList">
<div class="item" :class="person ? 'item-left':'car-item'">
<div class="ball"></div>
<div class="content">
{{ person ? '人员编号:':'车辆编号:' }}<span>{{ person ? '201128881111100':'201128881111100' }}</span>
</div>
</div>
<div class="item car-item" v-if="!person">
<div class="ball"></div>
<div class="content">
驾驶员姓名<span>张三</span>
</div>
</div>
<div class="item">
<div class="ball"></div>
<div class="content">
当前状态<span>{{ person ? '移动中':'行驶中' }}</span>
</div>
</div>
</div>
<div class="twoList">
<div class="item">
<div class="ball"></div>
<div class="content">
时间范围
<div class="time-query">
<div class="interval-select">
<div class="star-time">
<el-date-picker
v-model="startTime"
type="datetime"
align="right"
:clearable="false"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="开始时间"
>
</el-date-picker>
</div>
<div class="symbol"></div>
<div class="end-time">
<el-date-picker
v-model="endTime"
type="datetime"
align="right"
:clearable="false"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="结束时间"
>
</el-date-picker>
<img class="data_icon" src="@/assets/images/timeIcon.png" alt="">
</div>
</div>
</div>
<div class="btns reset">
<img src="@/assets/images/reset.png" alt="">
<span>重置</span>
</div>
<div class="btns">
<img src="@/assets/images/inquire.png" alt="">
<span>查询</span>
</div>
</div>
</div>
</div>
<div class="threeList">
<div class="item">
<div class="item-top">
<div class="ball"></div>
<div class="contentTitle">轨迹地图</div>
</div>
<div class="contentMap">
<!-- <div id="personageTrackMap">
</div> -->
<img src="@/assets/images/minMap.png" alt="">
</div>
</div>
</div>
</div>
</div>
</dia-log>
</template>
<script>
import diaLog from "../../components/dialog/index.vue"
export default {
components:{diaLog},
data() {
return {
startTime:'',
title:'人员行程轨迹',
person:false,
endTime:'',
heightStyle:{
height:'500px'
}
}
},
methods:{
open(person) {
console.log(person)
if(person == 'person'){
this.title = '人员行程轨迹'
this.person = true;
} else {
this.title = '车辆行程轨迹'
this.person = false;
}
this.$refs.dialog.open('1');
},
Close() {
this.$refs.dialog.Close();
}
},
}
</script>
<style lang="scss" scoped>
.personage-track {
.track-title {
display: flex;
align-items: center;
position: relative;
.titlebg {
position: absolute;
left: -15px;
top: -18px;
width: 50px;
height: 50px;
background-image: url('../../../assets/images/personnel.png');
background-position: center;
background-size: 100% 100%;
}
span {
font-size: 14px;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #E9F4FF;
line-height: 14px;
}
.name {
margin: 0 15px 0 30px;
}
}
.track-content {
margin-top: 15px;
padding-left: 20px;
display: grid;
grid-column: 1fr;
grid-row-gap: 15px;
.oneList {
display: flex;
.item {
display: flex;
align-items: center;
.ball {
width: 4px;
height: 4px;
background: #DAEBFF;
box-shadow: 0px 0px 10px 5px rgba(0,119,255,0.25), 0px 0px 5px 0px rgba(229,241,255,0.25);
border-radius: 20px 20px 20px 20px;
margin-right: 15px;
}
.content {
font-size: 14px;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #CCCCCC;
line-height: 20px;
span {
font-size: 14px;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #E9F4FF;
line-height: 20px;
}
}
}
.item-left {
margin-right: 150px;
}
.car-item {
margin-right: 80px;
}
}
.twoList {
.item {
display: flex;
align-items: center;
.ball {
width: 4px;
height: 4px;
background: #DAEBFF;
box-shadow: 0px 0px 10px 5px rgba(0,119,255,0.25), 0px 0px 5px 0px rgba(229,241,255,0.25);
border-radius: 20px 20px 20px 20px;
margin-right: 15px;
}
.content {
display: flex;
align-items: center;
font-size: 14px;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #CCCCCC;
line-height: 20px;
.time-query {
background-image: url('../../../assets/images/timebg.png');
width: 440px;
height: 35px;
background-size: 100% 100%;
.interval-select {
display: flex;
align-items: center;
::v-deep .el-input__prefix {
display: none;
}
.star-time,.end-time {
position: relative;
.data_icon {
position: absolute;
right: 5px;
top: 8px;
width: 20px;
}
::v-deep .el-date-editor {
background-color: transparent;
width: 210px;
.el-input__inner {
background-color: transparent;
border: none;
width: 100%;
height: 35px;
font-size: 14px;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #E9F4FF;
}
.el-input__inner::placeholder {
/* 在这里添加你想要修改的 placeholder 样式 */
font-size: 14px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #D3EEF2;
-webkit-background-clip: text;
-webkit-text-fill-color: rgba(211,238,242,0.2);
}
}
}
.symbol {
width: 14px;
height: 6px;
background-image: url('../../../assets/images/routeTime.png');
background-size: 100% 100%;
}
}
}
.btns {
width: 92px;
height: 35px;
background-image: url('../../../assets/images/inquirebg.png');
background-size: 100% 100%;
display: flex;
align-items: center;
justify-content: center;
img {
width: 24px;
margin-right: 5px;
}
span {
font-size: 14px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #FFFFFF;
line-height: 20px;
}
}
.reset {
background-image: url('../../../assets/images/resetbg.png');
margin: 0 20px;
}
}
}
}
.threeList {
.item {
display: flex;
flex-direction: column;
.item-top {
display: flex;
align-items: center;
.ball {
width: 4px;
height: 4px;
background: #DAEBFF;
box-shadow: 0px 0px 10px 5px rgba(0,119,255,0.25), 0px 0px 5px 0px rgba(229,241,255,0.25);
border-radius: 20px 20px 20px 20px;
margin-right: 15px;
}
.contentTitle {
font-size: 14px;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #CCCCCC;
line-height: 20px;
}
}
.contentMap {
padding: 15px 74px 0 14px;
width: 100%;
height: 400px;
// #personageTrackMap {
// width: 100%;
// height: 100%;
// background-color: #fff;
// }
img {
width: 100%;
height: 100%;
}
}
}
}
}
}
</style>

@ -0,0 +1,93 @@
<template>
<div class="person-popup" :class="type == 2 ? 'event-popup': type == 3 ? 'car-popup': 'monitoring-popup'">
<div class="popup-title">
<div class="title">{{ title }}</div>
<div class="mask" @click="close()"></div>
</div>
<slot></slot>
</div>
</template>
<script>
export default {
data() {
return {
}
},
props:{
mypopupTitle:{
type:Object,
default: function(){
return {}
}
},
title:{
type:String,
default:""
},
type:{
type:Number,
default:0,
}
},
methods:{
close(){
this.$emit('personClose')
}
},
}
</script>
<style lang="scss" scoped>
.person-popup {
position: absolute;
right: 540px;
top: 20px;
width: 242px;
height: 244px;
background-image: url("../../../assets/images/popup/bg1.png");
background-size: 100% 100%;
z-index: 600;
.popup-title {
padding: 9px 10px 0 16px;
display: flex;
justify-content: space-between;
.title {
font-size: 14px;
font-family: Source Han Sans CN-Bold, Source Han Sans CN;
font-weight: 700;
color: #E9F4FF;
line-height: 19px;
display: flex;
align-items: center;
justify-content: center;
width: 194px;
height: 30px;
background: linear-gradient(270deg, rgba(9,32,53,0) 0%, rgba(8,37,64,0.98) 51%, rgba(9,34,56,0) 100%);
border-radius: 0px 0px 0px 0px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(90deg, rgba(64.00000378489494, 163.00000548362732, 255, 0), rgba(64.00000378489494, 163.00000548362732, 255, 1), rgba(64.00000378489494, 163.00000548362732, 255, 0)) 1 1;
}
.mask {
width: 13px;
height: 13px;
cursor: pointer;
}
}
}
.event-popup {
width: 252px;
height: 224px;
background-image: url("../../../assets/images/popup/bg2.png");
}
.car-popup {
width: 242px;
height: 138px;
background-image: url("../../../assets/images/popup/bg3.png");
}
.monitoring-popup {
width: 242px;
height: 230px;
background-image: url("../../../assets/images/popup/bg4.png");
}
</style>

@ -0,0 +1,68 @@
<!--
* @Descripttion:
* @version:
* @Author: JC9527
* @Date: 2023-08-15 09:52:05
* @LastEditors: JC9527
* @LastEditTime: 2023-08-16 13:13:48
-->
<template>
<div class="mytitle">
<div class="title-text">
{{ title }}
</div>
<!-- <div class="title-num" v-show="numShow > 0">
{{ numShow }} <span></span>
</div> -->
</div>
</template>
<script>
export default {
props: {
title: {
type: String,
default: '默认标题'
},
// numShow: {
// type: Number,
// default: 0
// }
}
}
</script>
<style lang="scss" scoped>
@import '@/assets/styles/utils.scss';
.mytitle {
height: 38px;
line-height: vh(40);
width: 100%;
background-image: url('../../../assets/images/img_titlebg@2x.png');
background-size: 100% 100%;
display: flex;
justify-content: space-between;
.title-text {
font-size: vw(22);
letter-spacing: vw(2);
font-family: 'YouSheBiaoTiHei';
font-weight: 400;
color: #e9eff5;
text-align: left;
padding-left: vw(30);
}
.title-num {
margin-right: vw(15);
font-size: vw(20);
font-family: 'DIN';
font-weight: bold;
color: #32fcc5;
& span {
font-size: vw(14);
font-family: 'Regular';
font-weight: 400;
color: #c7cddb;
}
}
}
</style>

@ -0,0 +1,31 @@
<!--
* @Descripttion:
* @version:
* @Author: JC9527
* @Date: 2023-08-17 10:50:58
* @LastEditors: JC9527
* @LastEditTime: 2023-08-17 11:06:13
-->
<template>
<div class="myvideo">
<video controls>
<source src="@/assets/images/video/big_buck_bunny.mp4" type="video/mp4">
</video>
</div>
</template>
<script>
export default {
data() {
return {
}
},
methods:{
},
}
</script>
<style lang="scss" scoped>
.myvideo {
width: 100%;
height: 100%;
}
</style>

@ -0,0 +1,46 @@
<!--
* @Descripttion:
* @version:
* @Author: JC9527
* @Date: 2023-08-17 10:41:06
* @LastEditors: JC9527
* @LastEditTime: 2023-08-17 18:28:52
-->
<template>
<dia-log ref="dialog3" width="565px" title="视频墙">
<div class="video-main">
<div class="main-item" v-for="(item,index) in 9" :key="index"></div>
</div>
</dia-log>
</template>
<script>
import diaLog from "../../components/dialog/index.vue"
export default {
components:{diaLog},
data() {
return {
}
},
methods:{
open() {
this.$refs.dialog3.open('3');
},
Close() {
this.$refs.dialog3.Close();
}
},
}
</script>
<style lang="scss" scoped>
.video-main {
display: grid;
grid-template-columns: repeat(3, 200px);
grid-column-gap: 10px;
grid-row-gap: 15px;
.main-item {
// width: 248px;
height: 100px;
background-color: #fff;
}
}
</style>

@ -924,7 +924,7 @@
<div slot="header" class="clearfix">
<span>捐赠支持</span>
</div>
<div class="body">
<!-- <div class="body">
<img
src="@/assets/images/pay.png"
alt="donate"
@ -933,7 +933,7 @@
<span style="display: inline-block; height: 30px; line-height: 30px"
>你可以请作者喝杯咖啡表示鼓励</span
>
</div>
</div> -->
</el-card>
</el-col>
</el-row>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save