Vue-fours-Car/src/views/system/fence/index.vue

519 lines
13 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<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第三方插件jsjson文件图片文件等等,
//例如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>