519 lines
13 KiB
Vue
519 lines
13 KiB
Vue
<template>
|
||
<div>
|
||
|
||
|
||
<div v-if="showMapp">
|
||
<el-form :inline="true" :model="fence" class="demo-form-inline">
|
||
|
||
<el-form-item label="围栏名称">
|
||
<el-input v-model="fence.fenceName" placeholder="模糊查询围栏名称"></el-input>
|
||
</el-form-item>
|
||
|
||
|
||
<el-form-item label="围栏类型">
|
||
<el-select v-model="fence.fenceType" placeholder="请选择围栏类型">
|
||
<el-option label="驶出" value="1">驶出</el-option>
|
||
<el-option label="驶入" value="2">驶入</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
|
||
<el-form-item label="围栏状态">
|
||
<el-select v-model="fence.fenceState" placeholder="请选择围栏状态">
|
||
<el-option label="正常" value="1">正常</el-option>
|
||
<el-option label="停用" value="2">停用</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
|
||
<el-form-item>
|
||
<el-button type="primary" @click="onSubmit" icon="el-icon-search">搜索</el-button>
|
||
</el-form-item>
|
||
</el-form>
|
||
|
||
|
||
|
||
<el-button type="primary" plain icon="el-icon-plus" @click="fencadd">新增</el-button>
|
||
|
||
|
||
|
||
<el-table :data="tableData" style="width: 100%" ref="multipleTable" @selection-change="handleSelectionChange">
|
||
|
||
|
||
<el-table-column
|
||
type="selection"
|
||
width="55">
|
||
</el-table-column>
|
||
|
||
<el-table-column
|
||
label="围栏ID"
|
||
width="180">
|
||
<template slot-scope="scope">
|
||
<span style="margin-left: 10px">{{ scope.row.fenceId }}</span>
|
||
</template>
|
||
</el-table-column>
|
||
|
||
<el-table-column
|
||
label="围栏名称"
|
||
width="180">
|
||
<template slot-scope="scope">
|
||
<span style="margin-left: 10px">{{ scope.row.fenceName }}</span>
|
||
</template>
|
||
</el-table-column>
|
||
|
||
<el-table-column
|
||
label="围栏类型"
|
||
width="180">
|
||
<template slot-scope="scope">
|
||
<span style="margin-left: 10px" v-if="scope.row.fenceType==1">驶出</span>
|
||
<span style="margin-left: 10px" v-if="scope.row.fenceType==2">驶入</span>
|
||
</template>
|
||
</el-table-column>
|
||
|
||
<el-table-column
|
||
label="围栏状态"
|
||
width="180">
|
||
<template slot-scope="scope">
|
||
<span style="margin-left: 10px" v-if="scope.row.fenceState==1"><el-tag>正常</el-tag></span>
|
||
<span style="margin-left: 10px" v-if="scope.row.fenceState==2"><el-tag>停用</el-tag></span>
|
||
</template>
|
||
</el-table-column>
|
||
|
||
<el-table-column
|
||
label="经纬度信息"
|
||
width="180">
|
||
<template slot-scope="scope">
|
||
<span style="margin-left: 10px">{{ scope.row.fenceMessage }}</span>
|
||
</template>
|
||
</el-table-column>
|
||
|
||
|
||
<el-table-column label="操作">
|
||
<template slot-scope="scope">
|
||
<el-link type="primary" icon="el-icon-map-location" @click="handleWdit(scope.row)">编辑围栏</el-link>
|
||
|
||
<el-link type="primary" icon="el-icon-edit" @click="handleEdit(scope.row)">编辑</el-link>
|
||
|
||
<el-link type="primary" icon="el-icon-delete" @click="handleDelete(scope.row.fenceId)">删除</el-link>
|
||
</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
|
||
|
||
|
||
<el-pagination
|
||
@size-change="handleSizeChange"
|
||
@current-change="handleCurrentChange"
|
||
:current-page="fence.pageNum"
|
||
:page-sizes="[1, 3, 5, 10]"
|
||
:page-size="fence.pageSize"
|
||
layout="total, sizes, prev, pager, next, jumper"
|
||
:total="total">
|
||
</el-pagination>
|
||
|
||
|
||
|
||
|
||
<!-- 围栏添加-->
|
||
<el-dialog :title="title" :visible.sync="dialogFormVisible">
|
||
|
||
<el-form :model="fencesw">
|
||
|
||
<el-form-item label="围栏名称" :label-width="formLabelWidth">
|
||
<el-input v-model="fencesw.fenceName" autocomplete="off"></el-input>
|
||
</el-form-item>
|
||
|
||
|
||
<el-form-item label="围栏类型" :label-width="formLabelWidth">
|
||
<el-select v-model="fencesw.fenceType" placeholder="请选择活动区域">
|
||
<el-option label="驶出" value="1">驶出</el-option>
|
||
<el-option label="驶入" value="2">驶入</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
|
||
<el-form-item label="围栏状态" :label-width="formLabelWidth">
|
||
<template>
|
||
<el-radio v-model="fencesw.fenceState" label="1">正常</el-radio>
|
||
<el-radio v-model="fencesw.fenceState" label="2">停用</el-radio>
|
||
</template>
|
||
</el-form-item>
|
||
|
||
<el-form-item label="标识名称" :label-width="formLabelWidth">
|
||
<el-checkbox-group v-model="fencesw.identificationId">
|
||
<el-checkbox
|
||
v-for="item in ident"
|
||
:key="item.identificationId"
|
||
:label="item.identificationId"
|
||
:value="item.identificationId">
|
||
{{ item.identificationLog }}
|
||
</el-checkbox>
|
||
</el-checkbox-group>
|
||
</el-form-item>
|
||
</el-form>
|
||
|
||
|
||
<div slot="footer" class="dialog-footer">
|
||
<el-button @click="dialogFormVisible = false">取 消</el-button>
|
||
<el-button type="primary" @click="addAll">新增</el-button>
|
||
</div>
|
||
</el-dialog>
|
||
|
||
|
||
<!-- 修改电子围栏-->
|
||
<el-dialog :title="title" :visible.sync="dialogFormVisible1">
|
||
|
||
<el-form :model="fences">
|
||
|
||
<el-form-item label="围栏ID" :label-width="formLabelWidth1">
|
||
<el-input v-model="fences.fenceId" autocomplete="off"></el-input>
|
||
</el-form-item>
|
||
|
||
<el-form-item label="围栏名称" :label-width="formLabelWidth1">
|
||
<el-input v-model="fences.fenceName" autocomplete="off"></el-input>
|
||
</el-form-item>
|
||
|
||
|
||
<el-form-item label="围栏类型" :label-width="formLabelWidth1">
|
||
<el-select v-model="fences.fenceType" placeholder="请选择活动区域">
|
||
<el-option label="驶出" value="1">驶出</el-option>
|
||
<el-option label="驶入" value="2">驶入</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
|
||
|
||
<el-form-item label="围栏状态">
|
||
<el-radio-group v-model="fences.fenceState" :label-width="formLabelWidth1">
|
||
<el-radio :label="1">正常</el-radio>
|
||
<el-radio :label="2">停用</el-radio>
|
||
</el-radio-group>
|
||
</el-form-item>
|
||
|
||
|
||
|
||
</el-form>
|
||
|
||
|
||
<div slot="footer" class="dialog-footer">
|
||
<el-button @click="dialogFormVisible = false">取 消</el-button>
|
||
<el-button type="primary" @click="updateAll">修 改</el-button>
|
||
</div>
|
||
</el-dialog>
|
||
|
||
</div>
|
||
|
||
|
||
<el-button @click="drawPolygon">绘制围栏</el-button>
|
||
<el-button @click="saveFenceData">保存围栏</el-button>
|
||
<el-button @click="cleanFence">清除围栏</el-button>
|
||
<div id="container" v-if="showMap">
|
||
|
||
</div>
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</template>
|
||
|
||
<script>
|
||
import AMapLoader from '@amap/amap-jsapi-loader';
|
||
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等),
|
||
//例如:import 《组件名称》 from '《组件路径》,
|
||
import {fenceAdd, fenceDelete, fenceList, fenceUpdate, identificationList, saveFence} from "@/api/system/fence";
|
||
import mouseTool from "quill";
|
||
export default {
|
||
name: "map-view",
|
||
//生命周期 - 挂载完成(可以访问DOM元素)",
|
||
mounted() {
|
||
this.initAMap();
|
||
isMapPage:false
|
||
},
|
||
//import引入的组件需要注入到对象中才能使用"
|
||
components: {},
|
||
props: {},
|
||
data() {
|
||
//这里存放数据"
|
||
|
||
return {
|
||
tableData:[],
|
||
fence:{
|
||
pageNum:1,
|
||
pageSize:3,
|
||
fenceName:'',
|
||
},
|
||
total:0,
|
||
dialogFormVisible:false,
|
||
formLabelWidth:'120px',
|
||
fencesw:{
|
||
fenceName:'',
|
||
fenceType:'',
|
||
fenceState:'',
|
||
identificationId:[]
|
||
},
|
||
fences:{
|
||
fenceId:'',
|
||
fenceName:'',
|
||
fenceType:'',
|
||
fenceState:'',
|
||
identificationId:[],
|
||
},
|
||
title:'',
|
||
dialogFormVisible1:false,
|
||
formLabelWidth1:'120px',
|
||
mouseTool:null,
|
||
map:null,
|
||
Amap:null,
|
||
|
||
//跳转地图页面
|
||
showMap:false,
|
||
showMapp:true,
|
||
|
||
|
||
//保存围栏
|
||
mapRequest:{
|
||
fenceId:0,
|
||
jwd: []
|
||
},
|
||
|
||
//标识表
|
||
ident:[],
|
||
|
||
|
||
|
||
|
||
|
||
};
|
||
},
|
||
//计算属性 类似于data概念",
|
||
computed: {},
|
||
//监控data中的数据变化",
|
||
watch: {},
|
||
|
||
unmounted(){
|
||
this.map?.destroy()
|
||
},
|
||
//方法集合",
|
||
methods: {
|
||
|
||
//围栏列表
|
||
list() {
|
||
fenceList(this.fence).then(
|
||
res => {
|
||
this.tableData = res.data.list
|
||
this.total = res.data.total
|
||
console.log(this.tableData);
|
||
console.log(res)
|
||
}
|
||
)
|
||
},
|
||
|
||
// //复选框
|
||
handleSelectionChange(val) {
|
||
this.multipleSelection = val;
|
||
},
|
||
|
||
|
||
// 搜索框
|
||
onSubmit() {
|
||
this.list()
|
||
},
|
||
|
||
//分页查询
|
||
handleSizeChange(val) {
|
||
this.fence.pageSize = val
|
||
this.list()
|
||
},
|
||
|
||
//分页查询
|
||
handleCurrentChange(val) {
|
||
this.fence.pageNum = val
|
||
this.list()
|
||
},
|
||
|
||
|
||
//新增
|
||
fencadd() {
|
||
this.fences = {}
|
||
this.dialogFormVisible = true
|
||
this.title = '新增页面'
|
||
},
|
||
|
||
|
||
addAll() {
|
||
fenceAdd(this.fencesw).then(
|
||
res => {
|
||
this.$message.success(res.msg)
|
||
this.list()
|
||
}
|
||
)
|
||
this.dialogFormVisible = false
|
||
},
|
||
|
||
|
||
//删除电子围栏
|
||
handleDelete(fenceId){
|
||
fenceDelete(fenceId,'deleted').then(
|
||
res=>{
|
||
this.$message.success(res.msg)
|
||
this.list()
|
||
}
|
||
).catch(error=>{
|
||
console.error("逻辑删除失败",error);
|
||
this.$message.success("逻辑删除失败,请重试")
|
||
})
|
||
},
|
||
|
||
//修改电子围栏
|
||
handleEdit(obj) {
|
||
this.dialogFormVisible1 = true
|
||
this.fences = obj
|
||
this.title = '修改电子围栏'
|
||
},
|
||
|
||
|
||
updateAll() {
|
||
fenceUpdate(this.fences).then(
|
||
res => {
|
||
this.$message.success(res.msg)
|
||
this.list()
|
||
}
|
||
)
|
||
this.dialogFormVisible1=false;
|
||
},
|
||
|
||
|
||
|
||
//编辑围栏
|
||
handleWdit(ojb) {
|
||
this.showMap=true
|
||
this.showMapp=false
|
||
this.mapRequest.fenceId=ojb.fenceId
|
||
this.initAMap();
|
||
},
|
||
|
||
|
||
//初始化地图
|
||
initAMap(){
|
||
|
||
|
||
AMapLoader.load({
|
||
|
||
key:"fcd296bbfa904e3bf49d7316882a11bf",
|
||
version:"2.0",
|
||
plugins:["AMap.Scale","AMap.MouseTool"],
|
||
})
|
||
.then((AMap)=>{
|
||
this._Amap=AMap;
|
||
this.map=new AMap.Map("container",{
|
||
//设置地图容器ID
|
||
viewMode:"3D",
|
||
zoom:11,
|
||
center: [116.397428, 39.90923],
|
||
});
|
||
this.mouseTool=new AMap.MouseTool(this.map);
|
||
this.mouseTool.on('draw', this.drawReady)
|
||
})
|
||
.catch((e)=>{
|
||
console.log(e);
|
||
});
|
||
},
|
||
|
||
drawPolygon () {
|
||
this.mouseTool.polygon({
|
||
strokeColor: "#FF33FF",
|
||
strokeOpacity: 1,
|
||
strokeWeight: 6,
|
||
strokeOpacity: 0.2,
|
||
fillColor: '#1791fc',
|
||
fillOpacity: 0.4,
|
||
// 线样式还支持 'dashed'
|
||
strokeStyle: "solid",
|
||
// strokeStyle是dashed时有效
|
||
strokeDasharray: [30,10],
|
||
})
|
||
},
|
||
|
||
// 在 drawReady 方法中获取绘制的围栏的经纬度信息
|
||
drawReady(event){
|
||
console.log(event)
|
||
console.log(event.obj.getPath())
|
||
this.mapRequest.jwd=event.obj.getPath();
|
||
console.info('覆盖物对象绘制完成')
|
||
// 获取绘制的围栏经纬度信息
|
||
const path =event.obj.getPath()
|
||
// 将经纬度信息保存到 scope.row.fenceMessage 中
|
||
this.tableData.forEach(item=>{
|
||
if(item.fenceId === event.obj.fenceId){ // 假设 fenceId 是围栏的唯一标识符
|
||
item.fenceMessage = path.toString(); // 这里使用 toString() 方法将路径转换为字符串形式
|
||
}
|
||
})
|
||
},
|
||
|
||
|
||
//清除围栏
|
||
cleanFence(){
|
||
this.mouseTool.close(true)
|
||
},
|
||
|
||
//保存围栏
|
||
saveFenceData(){
|
||
console.log(this.mapRequest.jwd)
|
||
saveFence(this.mapRequest).then(response=>{
|
||
this.$modal.msgSuccess("保存成功")
|
||
})
|
||
this.showMap=false
|
||
this.showMapp=true
|
||
},
|
||
|
||
|
||
//标识列表
|
||
identificationList(){
|
||
identificationList().then(res=>{
|
||
this.ident=res
|
||
console.log(this.ident)
|
||
})
|
||
},
|
||
|
||
|
||
|
||
|
||
},
|
||
|
||
//生命周期 - 创建完成(可以访问当前this实例)",
|
||
created() {
|
||
this.list()
|
||
this.identificationList();
|
||
},
|
||
beforeCreate() {
|
||
}, //生命周期 - 创建之前",
|
||
beforeMount() {
|
||
}, //生命周期 - 挂载之前",
|
||
beforeUpdate() {
|
||
}, //生命周期 - 更新之前",
|
||
updated() {
|
||
}, //生命周期 - 更新之后",
|
||
beforeDestroy() {
|
||
}, //生命周期 - 销毁之前",
|
||
destroyed() {
|
||
}, //生命周期 - 销毁完成",
|
||
activated() {
|
||
} //如果页面有keep-alive缓存功能,这个函数会触发",
|
||
};
|
||
</script>
|
||
<style lang="scss" scoped>
|
||
.dashboard{
|
||
&-container{
|
||
margin: 30px;
|
||
}
|
||
&-text{
|
||
font-size:30px;
|
||
line-height:46px;
|
||
}
|
||
}
|
||
#container{
|
||
|
||
padding:0px;
|
||
margin:0px;
|
||
width:100%;
|
||
height:800px;
|
||
}
|
||
</style>
|