358 lines
9.7 KiB
Vue
358 lines
9.7 KiB
Vue
<template>
|
||
<view class="map">
|
||
<view class="page-body">
|
||
<view class="page-section page-section-gap">
|
||
<map id="map" style="width: 100%; height: 300px;" show-scale="true" show-location="true"
|
||
:circles="circleArray" @regionchange="onRegionchange" scale='14' :latitude="latitude"
|
||
:longitude="longitude" :markers="markers">
|
||
</map>
|
||
<cover-image class="img-map2" src="../../static/campus/orientation.png" @click="clickcontrol"></cover-image>
|
||
</view>
|
||
|
||
</view>
|
||
<view>
|
||
<uni-card title="当前位置实时信息">
|
||
<view style="color: #000;font-weight: bold;">经纬度:<text style="color: #6A6A6A;">{{ `(${latitude},${longitude})` }}</text></view>
|
||
<view style="color: #000;font-weight: bold;">详细地址:<text style="color: #6A6A6A;">{{ address }}</text></view>
|
||
<view style="height: 100px;display: flex;">
|
||
<u-upload width="80px" height="80px" :fileList="fileList3" @afterRead="afterRead" @delete="deletePic"
|
||
@clickPreview="clickPreview" name="3" multiple :maxCount="1" ></u-upload>
|
||
</view>
|
||
</uni-card>
|
||
</view>
|
||
<view style="text-align: center;">
|
||
<!-- <view v-if="distance > 500 || distance === ''" class="punchabsent">未在范围内</view> -->
|
||
<view class="punch" @click="tapScan">打卡</view>
|
||
<view style="color: red">{{ codeText }}</view>
|
||
<view style="color: red">{{ codeTime }}</view>
|
||
</view>
|
||
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
// let QQMapWX = require("../utils/qqmap-wx-jssdk.min.js")
|
||
// import QQMapWX from "../utils/qqmap-wx-jssdk.js"
|
||
const QQMapWX = require('@/utils/qqmap-wx-jssdk.js')
|
||
import {
|
||
postIotserver
|
||
} from '@/api/login';
|
||
import {
|
||
mapGetters
|
||
} from 'vuex';
|
||
import {
|
||
timestampFormatTime
|
||
} from '@/utils/index.js';
|
||
export default {
|
||
data() {
|
||
return {
|
||
fileList3: [],
|
||
baseURl: 'https://www.lonsungsh.com:8083',
|
||
imageID: [], //上传图片的id集合
|
||
imageUrlsDate: [],
|
||
id: 0, // 使用 marker点击事件 需要填写id
|
||
title: 'map',
|
||
latitude: 0, //纬度
|
||
longitude: 0, //经度
|
||
markers: [{
|
||
id: 0,
|
||
latitude: 0,
|
||
longitude: 0,
|
||
width: 15,
|
||
height: 20,
|
||
callout: {
|
||
content: '已进入打卡范围',
|
||
color: '#FFFFFF',
|
||
fontSize: 12,
|
||
borderColor: '#69BFBE',
|
||
bgColor: '#69BFBE',
|
||
padding: 5,
|
||
borderRadius: 3,
|
||
display: 'ALWAYS',
|
||
textAlign: 'center',
|
||
}
|
||
}],
|
||
address: '',
|
||
// 圆圈的范围
|
||
circleArray: [],
|
||
codeText: '',
|
||
codeTime: '',
|
||
distance: undefined,
|
||
qqmapsdk: null
|
||
}
|
||
},
|
||
onLoad() {
|
||
this.qqmapsdk = new QQMapWX({
|
||
key: 'IBCBZ-W5C3W-X32R4-35XWR-SK5E2-BIFDO'
|
||
})
|
||
|
||
},
|
||
computed: {
|
||
// 拿取vuex数据
|
||
...mapGetters({
|
||
userInfo: 'users/getLoginInfo',
|
||
schoolInfo: 'users/getschoolList',
|
||
})
|
||
},
|
||
created(){
|
||
// uni.chooseLocation({
|
||
// success(res) {
|
||
// console.log(res);
|
||
// }
|
||
// })
|
||
var obj = {
|
||
// 模拟环创企业广场
|
||
// latitude: 28.36121,
|
||
// longitude: 112.8179,
|
||
// 模拟荣盛花语
|
||
// latitude: 28.228445,
|
||
// longitude: 112.877754,
|
||
latitude: this.schoolInfo.latitude?this.schoolInfo.latitude:'',
|
||
longitude: this.schoolInfo.longitude?this.schoolInfo.longitude:'',
|
||
radius: 500,
|
||
fillColor: '#69BFBE6A',
|
||
color: '#acb0b7',
|
||
strokeWidth: 2
|
||
}
|
||
this.circleArray.push(obj)
|
||
console.log(this.circleArray);
|
||
uni.authorize({
|
||
scope: "scope.userLocation",
|
||
success: (res) => {
|
||
wx.getLocation({
|
||
isHighAccuracy: true, // 开启地图精准定位
|
||
altitude: true,
|
||
type: 'gcj02', // 地图类型写这个
|
||
success: (res) => {
|
||
uni.showLoading({
|
||
title: '定位中...',
|
||
mask: true,
|
||
})
|
||
console.log(res);
|
||
setTimeout(() => {
|
||
this.latitude = Number(res.latitude.toFixed(6)),
|
||
this.longitude =Number( res.longitude.toFixed(6))
|
||
this.qqmapsdk.reverseGeocoder({
|
||
location:{
|
||
latitude:res.latitude,
|
||
longitude:res.longitude
|
||
},
|
||
success:(data)=>{
|
||
this.address = data.result.formatted_addresses.recommend;
|
||
// this.latitude = data.location.lat,
|
||
// this.longitude = data.location.lng
|
||
}
|
||
})
|
||
uni.hideLoading()
|
||
const distance = this.getDistance(this.circleArray[0]
|
||
.latitude, this
|
||
.circleArray[0].longitude, this.latitude, this.longitude)
|
||
console.log(distance.m);
|
||
this.distance = distance.m
|
||
}, 1000)
|
||
},
|
||
|
||
});
|
||
}
|
||
})
|
||
},
|
||
onShow() {},
|
||
methods: {
|
||
onRegionchange(e) {},
|
||
clickcontrol: function() {
|
||
uni.createMapContext("map").moveToLocation({ //moveToLocation将地图中心移动到当前定位点,需要配合map组件的show-location使用
|
||
latitude: this.latitude,
|
||
longitude: this.longitude,
|
||
});
|
||
},
|
||
deletePic(event) {
|
||
const keyDelete = event.index
|
||
let UrlsDateLIst = this.imageUrlsDate.filter((value, index, arr) => index !== keyDelete);
|
||
this.imageUrlsDate = UrlsDateLIst;
|
||
this[`fileList${event.name}`].splice(event.index, 1)
|
||
},
|
||
clickPreview(event) {
|
||
// console.log(111);
|
||
const {index} = event.currentTarget.dataset
|
||
console.log(index);
|
||
uni.previewImage({
|
||
urls: this.imageUrlsDate,
|
||
current: this.imageUrlsDate
|
||
})
|
||
|
||
},
|
||
async afterRead(event) {
|
||
// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
|
||
let lists = [].concat(event.file)
|
||
let fileListLen = this[`fileList${event.name}`].length
|
||
lists.map((item) => {
|
||
this[`fileList${event.name}`].push({
|
||
...item,
|
||
status: 'uploading',
|
||
message: '上传中'
|
||
})
|
||
})
|
||
for (let i = 0; i < lists.length; i++) {
|
||
const result = await this.uploadFilePromise(lists[i].url)
|
||
let item = this[`fileList${event.name}`][fileListLen]
|
||
this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
|
||
status: 'success',
|
||
message: '',
|
||
url: result
|
||
}))
|
||
fileListLen++
|
||
}
|
||
},
|
||
uploadFilePromise(url) {
|
||
var that = this;
|
||
const picUploadData = {
|
||
creator: that.userInfo.name,
|
||
business: 'school.revise',
|
||
type: 'image',
|
||
deviceid: that.userInfo.id,
|
||
createtime: timestampFormatTime(),
|
||
description: '',
|
||
comment: ''
|
||
};
|
||
return new Promise((resolve, reject) => {
|
||
let a = uni.uploadFile({
|
||
url: that.baseURl + '/mdev/picture/upload',
|
||
filePath: url,
|
||
name: 'file',
|
||
header: {
|
||
'Content-Type': 'multipart/form-data;charset=utf-8'
|
||
},
|
||
formData: {
|
||
jsondata: JSON.stringify(picUploadData),
|
||
},
|
||
success: (res) => {
|
||
setTimeout(() => {
|
||
const resImage = JSON.parse(res.data)?.data;
|
||
console.log(resImage);
|
||
if (!that.imageUrlsDate.includes(resImage.uri)) {
|
||
that.imageUrlsDate.push(resImage.uri);
|
||
}
|
||
if (!that.imageID.includes(resImage.id)) {
|
||
that.imageID.push(resImage.id);
|
||
}
|
||
|
||
resolve(that.imageUrlsDate,that.imageID)
|
||
}, 1000)
|
||
|
||
}
|
||
});
|
||
})
|
||
},
|
||
tapScan() {
|
||
let _this = this;
|
||
if(this.fileList3.length > 0){
|
||
wx.scanCode({
|
||
success: function(res) {
|
||
if (res.result) {
|
||
const datalist = {
|
||
tagId: res.result,
|
||
personId: _this.userInfo.id ? _this.userInfo.id : Math.round(Math.random() * 1000000),
|
||
personName: _this.userInfo.name,
|
||
personType: _this.userInfo.personType,
|
||
longitude: _this.longitude,
|
||
latitude: _this.latitude,
|
||
address:_this.address,
|
||
images: JSON.stringify(_this.imageID),
|
||
imageUrls: JSON.stringify(_this.imageUrlsDate),
|
||
};
|
||
if (_this.userInfo.name) {
|
||
postIotserver(datalist)
|
||
.then((res) => {
|
||
console.log(res.data.station, '222');
|
||
const innerAudioContext = uni.createInnerAudioContext();
|
||
innerAudioContext.autoplay = true;
|
||
innerAudioContext.src = require('@/static/video/video.wav'); //音频地址
|
||
innerAudioContext.onPlay(() => {
|
||
console.log('开始播放');
|
||
});
|
||
_this.codeText = res.data.station + '---打卡成功'
|
||
_this.codeTime = '当前时间:' + timestampFormatTime()
|
||
})
|
||
.catch((err) => {
|
||
console.log(err, '5555');
|
||
uni.showToast({
|
||
title: err.msg + '请不要重复打卡'
|
||
});
|
||
});
|
||
} else {
|
||
uni.showToast({
|
||
title: '请登录账户'
|
||
});
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}else{
|
||
uni.showToast({
|
||
title: '请先上传照片'
|
||
});
|
||
}
|
||
},
|
||
getDistance(la1, lo1, la2, lo2) {
|
||
console.log(la1, lo1, la2, lo2);
|
||
let La1 = la1 * Math.PI / 180.0;
|
||
let La2 = la2 * Math.PI / 180.0;
|
||
let La3 = La1 - La2;
|
||
console.log(La3);
|
||
let Lb3 = lo1 * Math.PI / 180.0 - lo2 * Math.PI / 180.0;
|
||
let s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(La3 / 2), 2) + Math.cos(La1) * Math.cos(La2) * Math.pow(
|
||
Math.sin(
|
||
Lb3 / 2), 2)));
|
||
|
||
s = s * 6378.137;
|
||
s = Math.round(s * 10000) / 10000;
|
||
console.log(s, Math.round(s * 1000));
|
||
return {
|
||
km: s,
|
||
m: Math.round(s * 1000)
|
||
};
|
||
}
|
||
},
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss">
|
||
.map {
|
||
position: relative;
|
||
|
||
.img-map2 {
|
||
width: 60rpx;
|
||
height: 60rpx;
|
||
position: fixed;
|
||
top: 0;
|
||
right: 1vh;
|
||
background-color: #FFFFFF;
|
||
border-radius: 5px;
|
||
}
|
||
.punchabsent {
|
||
text-align: center;
|
||
width: 100px;
|
||
height: 100px;
|
||
border: 4px solid #ff0000;
|
||
border-radius: 50%;
|
||
line-height: 100px;
|
||
position: absolute;
|
||
left: 50%;
|
||
margin-left: -53px;
|
||
margin-top: 50px;
|
||
}
|
||
|
||
.punch {
|
||
text-align: center;
|
||
width: 100px;
|
||
height: 100px;
|
||
border: 4px solid #cfb56a;
|
||
border-radius: 50%;
|
||
line-height: 100px;
|
||
position: absolute;
|
||
left: 50%;
|
||
margin-left: -53px;
|
||
margin-top: 50px;
|
||
}
|
||
}
|
||
</style> |