@@ -6,20 +6,12 @@ | |||||
async onLaunch(param) { | async onLaunch(param) { | ||||
// 版本更新 | // 版本更新 | ||||
var newVer = '1.0.2'; | |||||
var newVer = '1.1.2'; | |||||
var oldVer = localStorage.getItem('version'); | var oldVer = localStorage.getItem('version'); | ||||
if (newVer != oldVer) { | if (newVer != oldVer) { | ||||
localStorage.setItem('version', newVer); | localStorage.setItem('version', newVer); | ||||
this.JUMP_TO("/") | this.JUMP_TO("/") | ||||
} | } | ||||
// 加载百度地图资源 | |||||
let ak = this.GET_AK() | |||||
var script = document.createElement('script'); | |||||
script.type = 'text/javascript'; | |||||
script.src = | |||||
'https://api.map.baidu.com/api?v=1.0&type=webgl&ak=' + ak + | |||||
'&callback=' + 'initMap'; | |||||
document.head.appendChild(script); | |||||
// 在App.vue文件中获取到页面到URL (初始化WXsdj) | // 在App.vue文件中获取到页面到URL (初始化WXsdj) | ||||
window.localStorage.setItem('scanUrl',location.href.split('#')[0]) | window.localStorage.setItem('scanUrl',location.href.split('#')[0]) | ||||
@@ -1,12 +1,10 @@ | |||||
window.wx = null | |||||
window.wxInit = false | |||||
import wx from '@/common/js/weixin-js-sdk.js'; | import wx from '@/common/js/weixin-js-sdk.js'; | ||||
window.wx = wx | |||||
// 参考文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html | // 参考文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html | ||||
export default { | export default { | ||||
methods: { | methods: { | ||||
data(){ | |||||
return { | |||||
wxInit:false | |||||
} | |||||
}, | |||||
// 初始化wx | // 初始化wx | ||||
initWx(arr = ["getLocation"]) { | initWx(arr = ["getLocation"]) { | ||||
const promise = new Promise((resolve, reject) => { | const promise = new Promise((resolve, reject) => { | ||||
@@ -28,15 +26,28 @@ export default { | |||||
signature: success.certificate, // 必填,签名 | signature: success.certificate, // 必填,签名 | ||||
jsApiList: arr // 必填,需要使用的JS接口列表 | jsApiList: arr // 必填,需要使用的JS接口列表 | ||||
}); | }); | ||||
// 公众平台测试账号本地调试使用 | |||||
// console.log({nonceStr: success.noncestr,timestamp: success.timestamp,url}) | |||||
// wx.config({ | |||||
// debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 | |||||
// appId: 'wx2aa8dcf3603f77b5', // 必填,公众号的唯一标识 | |||||
// timestamp: '1719897639109', // 必填,生成签名的时间戳 | |||||
// nonceStr: "202407011704072775", // 必填,生成签名的随机串 | |||||
// signature: "af7666f9ed1355756b80561cf7b358fb603f7963", // 必填,签名 | |||||
// jsApiList: arr // 必填,需要使用的JS接口列表 | |||||
// }); | |||||
wx.ready(() => { | wx.ready(() => { | ||||
this.wxInit = true | |||||
// this.TOAST("wx初始化成功") | |||||
window.wxInit = true | |||||
resolve(true) | resolve(true) | ||||
}) | }) | ||||
wx.error(() => { | |||||
wx.error((error) => { | |||||
// alert(JSON.stringify(error)) | |||||
this.TOAST("wx初始化失败") | this.TOAST("wx初始化失败") | ||||
resolve(false) | resolve(false) | ||||
}) | }) | ||||
setTimeout(()=>{ | |||||
resolve("wx初始化超时") | |||||
},5000) | |||||
}) | }) | ||||
}) | }) | ||||
return promise | return promise | ||||
@@ -44,9 +55,10 @@ export default { | |||||
// 获取定位 | // 获取定位 | ||||
async getLocation() { | async getLocation() { | ||||
return new Promise(async (resolve) => { | return new Promise(async (resolve) => { | ||||
if (!this.wxInit) { | |||||
if (!window.wxInit) { | |||||
let res = await this.initWx(["getLocation"]) | let res = await this.initWx(["getLocation"]) | ||||
if(!res){ | |||||
if(!res||res=='wx初始化超时'){ | |||||
res&&this.TOAST(res) | |||||
resolve(false) | resolve(false) | ||||
return | return | ||||
} | } | ||||
@@ -54,6 +66,7 @@ export default { | |||||
if(!wx.getLocation){ | if(!wx.getLocation){ | ||||
this.TOAST("获取定位失败") | this.TOAST("获取定位失败") | ||||
resolve(false) | resolve(false) | ||||
return | |||||
} | } | ||||
wx.getLocation({ | wx.getLocation({ | ||||
type: "gcj02", // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02' | type: "gcj02", // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02' | ||||
@@ -68,6 +81,7 @@ export default { | |||||
}) | }) | ||||
}, | }, | ||||
fail: (error) => { | fail: (error) => { | ||||
// alert(JSON.stringify(error)) | |||||
this.TOAST("获取定位失败!") | this.TOAST("获取定位失败!") | ||||
resolve(false) | resolve(false) | ||||
} | } | ||||
@@ -77,7 +91,7 @@ export default { | |||||
// 拍照 | // 拍照 | ||||
async chooseImage() { | async chooseImage() { | ||||
return new Promise(async (resolve) => { | return new Promise(async (resolve) => { | ||||
if (!this.wxInit) { | |||||
if (!window.wxInit) { | |||||
let res = await this.initWx(["chooseImage"]) | let res = await this.initWx(["chooseImage"]) | ||||
if(!res){ | if(!res){ | ||||
resolve(false) | resolve(false) | ||||
@@ -106,7 +120,7 @@ export default { | |||||
// 预览图片 | // 预览图片 | ||||
async previewImage(url,urlArr) { | async previewImage(url,urlArr) { | ||||
return new Promise(async (resolve) => { | return new Promise(async (resolve) => { | ||||
if (!this.wxInit) { | |||||
if (!window.wxInit) { | |||||
let res = await this.initWx(["previewImage"]) | let res = await this.initWx(["previewImage"]) | ||||
if(!res){ | if(!res){ | ||||
resolve(false) | resolve(false) | ||||
@@ -2,7 +2,7 @@ export default { | |||||
// 登录页显示的公司名称 | // 登录页显示的公司名称 | ||||
"company": "数字化智慧校园", | "company": "数字化智慧校园", | ||||
// App 版本号 | // App 版本号 | ||||
"appVersion": "1.0.0", | |||||
"appVersion": "1.1.2", | |||||
// 是否允许用户注册 | // 是否允许用户注册 | ||||
"enableSignUp": true, | "enableSignUp": true, | ||||
//请求数据的接口地址;可以配置多个,开发环境下登录页会出现选择菜单供您选择 | //请求数据的接口地址;可以配置多个,开发环境下登录页会出现选择菜单供您选择 | ||||
@@ -165,16 +165,24 @@ | |||||
} | } | ||||
}, | }, | ||||
"h5" : { | "h5" : { | ||||
// "devServer": { | |||||
// "proxy" : { | |||||
// "/api" : { | |||||
// "target" : "http://192.168.10.58:8011/", //自己项目接口域名 | |||||
// "changeOrigin" : true, //是否跨域 | |||||
// // "secure" : true, // 设置支持https协议的代理 | |||||
// "pathRewrite": {"^/api":""} //api路径重定向,根据具体情况调整,也可不写 | |||||
// } | |||||
// } | |||||
// }, | |||||
"devServer" : { | |||||
"proxy" : { | |||||
// "/api" : { | |||||
// "target" : "http://192.168.10.58:8011/", //自己项目接口域名 | |||||
// "changeOrigin" : true, //是否跨域 | |||||
// // "secure" : true, // 设置支持https协议的代理 | |||||
// "pathRewrite": {"^/api":""} //api路径重定向,根据具体情况调整,也可不写 | |||||
// }, | |||||
"/baiduapi" : { | |||||
"target" : "https://api.map.baidu.com/", | |||||
"changeOrigin" : true, | |||||
"secure" : true, // 设置支持https协议的代理 | |||||
"pathRewrite" : { | |||||
"^/baiduapi" : "" | |||||
} //api路径重定向,根据具体情况调整,也可不写 | |||||
} | |||||
} | |||||
}, | |||||
"uniStatistics" : { | "uniStatistics" : { | ||||
"enable" : false | "enable" : false | ||||
}, | }, | ||||
@@ -40,7 +40,6 @@ | |||||
<img src="../../common/images/2.png" alt="" width="100%"> | <img src="../../common/images/2.png" alt="" width="100%"> | ||||
</view> | </view> | ||||
</view> | </view> | ||||
<view id='container'></view> | |||||
<!-- 弹层 --> | <!-- 弹层 --> | ||||
<!-- <l-modal v-model="modal" title="选择打卡类型"> | <!-- <l-modal v-model="modal" title="选择打卡类型"> | ||||
<l-button @click="toAttendanceCardTeacher" color="blue" class="block" block>授课打卡</l-button> | <l-button @click="toAttendanceCardTeacher" color="blue" class="block" block>授课打卡</l-button> | ||||
@@ -98,6 +97,7 @@ | |||||
// modal:false, | // modal:false, | ||||
isInternalNet:false, | isInternalNet:false, | ||||
baiduAK:'', | |||||
} | } | ||||
}, | }, | ||||
@@ -108,22 +108,24 @@ | |||||
methods: { | methods: { | ||||
// 页面初始化 | // 页面初始化 | ||||
async init() { | async init() { | ||||
await this.isInternalNetwork(false) | |||||
this.LOADING('加载数据中...') | |||||
// 获取随机ak | |||||
this.baiduAK = this.GET_AK() | |||||
// 开发环境使用 | |||||
// this.baiduAK = '7SGoYuwTC1UjJWZ6kVuo46RJL0wdvIkF' | |||||
// 判断是否校园网 | |||||
this.isInternalNetwork(false) | |||||
// 实时显示时间 | |||||
this.now = this.getCurrentTime() | this.now = this.getCurrentTime() | ||||
this.timer = setInterval(this.getCurrentTime, 1000) | this.timer = setInterval(this.getCurrentTime, 1000) | ||||
//判断教师是否授课,显示弹层 | //判断教师是否授课,显示弹层 | ||||
// let hasLesson = await this.judgeTeacherIsHasLesson() | // let hasLesson = await this.judgeTeacherIsHasLesson() | ||||
// this.modal = hasLesson | // this.modal = hasLesson | ||||
let res = await this.judgeIsDK() | |||||
// 获取打卡信息 | |||||
this.LOADING('加载数据中...') | |||||
let res = await this.getPageInfo() | |||||
this.ready = res ? true : false | this.ready = res ? true : false | ||||
this.HIDE_LOADING() | this.HIDE_LOADING() | ||||
}, | }, | ||||
// 点击 「打卡」按钮 | // 点击 「打卡」按钮 | ||||
async action(type) { | async action(type) { | ||||
switch (type) { | switch (type) { | ||||
@@ -140,79 +142,49 @@ | |||||
return | return | ||||
} | } | ||||
this.NAV_TO(`./single_zc`, this.postData,true) | this.NAV_TO(`./single_zc`, this.postData,true) | ||||
// this.LOADING() | |||||
// this.HTTP_POST('learun/adms/attendance/clockin', {}, '打卡失败').then(success => { | |||||
// this.HIDE_LOADING() | |||||
// if (!success) { | |||||
// this.TOAST('打卡失败') | |||||
// return | |||||
// } | |||||
// this.TOAST('打卡成功', 'success') | |||||
// setTimeout(this.back, 500) | |||||
// }) | |||||
return | |||||
default: | default: | ||||
break | break | ||||
} | } | ||||
}, | }, | ||||
//获取打卡信息 | |||||
async judgeIsDK() { | |||||
//获取打卡页面信息 | |||||
async getPageInfo() { | |||||
// 获取打卡时间范围等信息 | |||||
// 签到状态(1正常打卡,2迟到打卡,3早退打卡,4外勤打卡,5不在考勤时间范围) | |||||
let success = await this.HTTP_GET('learun/adms/attendance/IsAttendance', {}, '判断当前时间是否可以打卡失败') | let success = await this.HTTP_GET('learun/adms/attendance/IsAttendance', {}, '判断当前时间是否可以打卡失败') | ||||
if (!success) { | if (!success) { | ||||
return false | return false | ||||
} | } | ||||
this.info = success.data | this.info = success.data | ||||
this.imgsrc = dk; | this.imgsrc = dk; | ||||
// if ([1].includes(this.info.AttendanceType)) { | |||||
// this.imgsrc=dk; | |||||
// } else if ([2,3].includes(this.info.AttendanceType)) { | |||||
// this.imgsrc=dkyellow; | |||||
// }else { | |||||
// this.imgsrc=dkred; | |||||
// } | |||||
// 保存原打卡状态 | // 保存原打卡状态 | ||||
this.resInfo = { | this.resInfo = { | ||||
AttendanceType:this.info.AttendanceType, | AttendanceType:this.info.AttendanceType, | ||||
AttendanceTypeString:this.info.AttendanceTypeString, | AttendanceTypeString:this.info.AttendanceTypeString, | ||||
} | } | ||||
// 不在打卡时间范围 停止定位加载 | |||||
if ([5].includes(this.info.AttendanceType)) return true | if ([5].includes(this.info.AttendanceType)) return true | ||||
// 获取到定位前默认为外勤打卡 | |||||
this.$set(this.info, 'AttendanceType', 4) | this.$set(this.info, 'AttendanceType', 4) | ||||
this.$set(this.info, 'AttendanceTypeString', '外勤打卡') | this.$set(this.info, 'AttendanceTypeString', '外勤打卡') | ||||
this.$set(this.postData, 'AIsOut', 1) | this.$set(this.postData, 'AIsOut', 1) | ||||
// 获取定位,不是外勤时候改变状态 | |||||
// if (!window.BMapGL) await this.loadJScript() | |||||
if(!window.BMapGL || !BMapGL.Map){ | |||||
this.TOAST('获取定位资源失败!') | |||||
return false | |||||
} | |||||
this.map = new BMapGL.Map('container'); | |||||
await this.isFieldPersonnel() | |||||
// 更新定位信息 | |||||
await this.updatePageInfo() | |||||
// 获取定位信息失败,终止定时 | |||||
if(!this.postData.ClockPlace){ | if(!this.postData.ClockPlace){ | ||||
return true | return true | ||||
} | } | ||||
// 获取定位信息成功,开始定时 | |||||
this.timer1 = setInterval(async ()=>{ | this.timer1 = setInterval(async ()=>{ | ||||
if(this.isGetingLocal)return | if(this.isGetingLocal)return | ||||
if(!this.postData.ClockPlace){ | if(!this.postData.ClockPlace){ | ||||
clearInterval(this.timer1) | clearInterval(this.timer1) | ||||
} | } | ||||
this.isGetingLocal = true | this.isGetingLocal = true | ||||
await this.isFieldPersonnel() | |||||
// console.log(this.postData) | |||||
await this.updatePageInfo() | |||||
this.isGetingLocal = false | this.isGetingLocal = false | ||||
},3000) | },3000) | ||||
return true | return true | ||||
}, | }, | ||||
//返回 | |||||
back() { | |||||
this.NAV_BACK() | |||||
}, | |||||
//获取当前时间 | //获取当前时间 | ||||
getCurrentTime() { | getCurrentTime() { | ||||
let nowDate = new Date(); | let nowDate = new Date(); | ||||
@@ -221,46 +193,20 @@ | |||||
let ss = nowDate.getSeconds() < 10 ? '0' + nowDate.getSeconds() : nowDate.getSeconds(); | let ss = nowDate.getSeconds() < 10 ? '0' + nowDate.getSeconds() : nowDate.getSeconds(); | ||||
this.now = hh + ':' + mf + ':' + ss; | this.now = hh + ':' + mf + ':' + ss; | ||||
}, | }, | ||||
// 判断是否外勤打卡 | |||||
async isFieldPersonnel() { | |||||
let point = new BMapGL.Point(this.info.GPSLon, this.info.GPSLat) | |||||
await this.getDistance(point) | |||||
}, | |||||
//异步加载地图 | |||||
loadJScript() { | |||||
return new Promise((resolve, reject) => { | |||||
let ak = this.GET_AK() | |||||
window.initMap = function() { | |||||
resolve() | |||||
} | |||||
setTimeout(()=>{ | |||||
resolve() | |||||
},8000) | |||||
var script = document.createElement('script'); | |||||
script.type = 'text/javascript'; | |||||
script.src = | |||||
'https://api.map.baidu.com/api?v=1.0&type=webgl&ak=' + ak + | |||||
'&callback=' + 'initMap'; | |||||
script.onerror = reject; | |||||
script.id = 'baiduScript' | |||||
document.head.appendChild(script); | |||||
}) | |||||
}, | |||||
// 计算距离打卡点的距离 | |||||
// 签到状态(1正常打卡,2迟到打卡,3早退打卡,4外勤打卡,5不在考勤时间范围) | |||||
async getDistance(myP1) { | |||||
// new BMapGL.Point(116.404, 39.915) | |||||
// 更新定位信息 | |||||
async updatePageInfo() { | |||||
// 学校打卡范围中心坐标 | |||||
let myP1 = {lat:this.info.GPSLat,lng:this.info.GPSLon} | |||||
// 获取当前定位 | |||||
let myP2 = await this.local(); | let myP2 = await this.local(); | ||||
if (!myP2) { | if (!myP2) { | ||||
// this.TOAST('获取定位失败!') | |||||
this.$set(this.info, 'AttendanceType', 4) | this.$set(this.info, 'AttendanceType', 4) | ||||
this.$set(this.info, 'AttendanceTypeString', '外勤打卡') | this.$set(this.info, 'AttendanceTypeString', '外勤打卡') | ||||
this.$set(this.postData, 'AIsOut', 1) | this.$set(this.postData, 'AIsOut', 1) | ||||
return | return | ||||
} | } | ||||
let distance = this.map.getDistance(myP1, myP2).toFixed(2) | |||||
// alert('距离'+ distance) | |||||
// console.log('距离', distance, '打卡坐标:', myP1, '当前坐标:', myP2) | |||||
// 计算距离更新状态 | |||||
let distance = this.calculateDistance(myP1.lat,myP1.lng,myP2.lat,myP2.lng)*1000 | |||||
if (Number(distance) > Number(this.info.GPSRange)) { | if (Number(distance) > Number(this.info.GPSRange)) { | ||||
this.$set(this.info, 'AttendanceType', 4) | this.$set(this.info, 'AttendanceType', 4) | ||||
this.$set(this.info, 'AttendanceTypeString', '外勤打卡') | this.$set(this.info, 'AttendanceTypeString', '外勤打卡') | ||||
@@ -271,46 +217,73 @@ | |||||
this.$set(this.postData, 'AIsOut', 0) | this.$set(this.postData, 'AIsOut', 0) | ||||
} | } | ||||
}, | }, | ||||
// 计算距离 | |||||
calculateDistance(lat1, lng1, lat2, lng2) { | |||||
// 地球半径 | |||||
var R = 6371; // 单位为公里 | |||||
// 将角度转为弧度 | |||||
lat1 = lat1 * Math.PI / 180; | |||||
lng1 = lng1 * Math.PI / 180; | |||||
lat2 = lat2 * Math.PI / 180; | |||||
lng2 = lng2 * Math.PI / 180; | |||||
// 经纬度差值 | |||||
var dLat = lat2 - lat1; | |||||
var dLng = lng2 - lng1; | |||||
// Haversine公式 | |||||
var a = Math.pow(Math.sin(dLat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(dLng / 2), 2); | |||||
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); | |||||
var distance = R * c; | |||||
return distance; | |||||
}, | |||||
// 获取当前位置 | // 获取当前位置 | ||||
local() { | local() { | ||||
return new Promise(async (resolve) => { | return new Promise(async (resolve) => { | ||||
let res = await this.getLocation() | let res = await this.getLocation() | ||||
// 开发环境使用 | |||||
// let res = { | // let res = { | ||||
// lng: 112.57205562051, | |||||
// lat: 37.742374280962 | |||||
// lng: 112.55343965851368, | |||||
// lat: 37.80263075215858 | |||||
// } | // } | ||||
// let res = { | |||||
// lng: 112.55983599999995, | |||||
// lat: 37.80894902218693 | |||||
// } | |||||
// 瑞鼎国际中心: | |||||
// 腾讯系/国测局/火星/gcj02:37.80263075215858,112.55343965851368 | |||||
// 百度系/bd09ll:37.80894902218693,112.55983599999995 | |||||
if (!res) { | if (!res) { | ||||
this.$set(this.postData, 'ALon', '') | this.$set(this.postData, 'ALon', '') | ||||
this.$set(this.postData, 'ALat', '') | this.$set(this.postData, 'ALat', '') | ||||
this.$set(this.postData, 'ClockPlace', '') | this.$set(this.postData, 'ClockPlace', '') | ||||
resolve(false) | resolve(false) | ||||
return | |||||
} | } | ||||
new BMapGL.Convertor().translate([res], 3, 5, data => { | |||||
if (data&&data.status == 0) { | |||||
// alert(data.points[0].lng + '' + data.points[0].lat) | |||||
this.$set(this.postData, 'ALon', data.points[0].lng) | |||||
this.$set(this.postData, 'ALat', data.points[0].lat) | |||||
let geoc = new BMapGL.Geocoder(); | |||||
geoc.getLocation(data.points[0], (rs) => { | |||||
let addComp = rs.addressComponents; | |||||
let address = | |||||
addComp.province + | |||||
addComp.city + | |||||
addComp.district + | |||||
addComp.street + | |||||
addComp.streetNumber | |||||
this.$set(this.postData, 'ClockPlace', address) | |||||
resolve(data.points[0]) | |||||
}); | |||||
} else { | |||||
this.$set(this.postData, 'ALon', '') | |||||
this.$set(this.postData, 'ALat', '') | |||||
this.$set(this.postData, 'ClockPlace', '') | |||||
this.TOAST('定位获取失败!') | |||||
resolve(false) | |||||
} | |||||
let host = location.origin | |||||
let data = await uni.request({ | |||||
url: host+"/baiduapi/reverse_geocoding/v3/?ak=" | |||||
+this.baiduAK | |||||
+"&output=json&coordtype=gcj02ll" | |||||
+"&location=" + res.lat+ "," + res.lng | |||||
+"&ret_coordtype=bd09ll", | |||||
}) | }) | ||||
if(data&&data[1]&&data[1].data&&data[1].data.status == 0){ | |||||
let result = data[1].data.result | |||||
this.$set(this.postData, 'ALon', result.location.lng) | |||||
this.$set(this.postData, 'ALat', result.location.lat) | |||||
let address = result.formatted_address | |||||
this.$set(this.postData, 'ClockPlace', address) | |||||
resolve(result.location) | |||||
}else { | |||||
this.$set(this.postData, 'ALon', '') | |||||
this.$set(this.postData, 'ALat', '') | |||||
this.$set(this.postData, 'ClockPlace', '') | |||||
// this.TOAST('定位获取失败!') | |||||
resolve(false) | |||||
} | |||||
}); | }); | ||||
}, | }, | ||||
//判断教师是否授课 | //判断教师是否授课 | ||||
@@ -319,14 +292,14 @@ | |||||
return success.data; | return success.data; | ||||
}, | }, | ||||
//跳转进入教师授课打卡页面 | //跳转进入教师授课打卡页面 | ||||
toAttendanceCardTeacher() { | |||||
this.JUMP_TO('/pages/AttendanceCardTeacher/list', {},true) | |||||
}, | |||||
// toAttendanceCardTeacher() { | |||||
// this.JUMP_TO('/pages/AttendanceCardTeacher/list', {},true) | |||||
// }, | |||||
// 判断是否学校网络 | // 判断是否学校网络 | ||||
isInternalNetwork(TOAST=true){ | isInternalNetwork(TOAST=true){ | ||||
this.LOADING('加载数据中...') | |||||
TOAST&&this.LOADING('加载数据中...') | |||||
return this.requestBase("https://mp.weixin.qq.com/intp/getuserclientip").then(res=>{ | return this.requestBase("https://mp.weixin.qq.com/intp/getuserclientip").then(res=>{ | ||||
this.HIDE_LOADING() | |||||
TOAST&&this.HIDE_LOADING() | |||||
let res_ = res[1] | let res_ = res[1] | ||||
let client_ip_start = '1.190.222.' | let client_ip_start = '1.190.222.' | ||||
let arr = [] | let arr = [] | ||||
@@ -344,19 +317,6 @@ | |||||
}, | }, | ||||
}, | }, | ||||
destroyed() { | destroyed() { | ||||
// let scirpt = document.getElementById('baiduScript') | |||||
// if(scirpt){ | |||||
// scirpt.remove() | |||||
// } | |||||
// let scirpt1 = document.querySelectorAll('body script') | |||||
// if(scirpt1){ | |||||
// scirpt1.forEach(e=>{ | |||||
// if(e.src.includes('https://api.map.baidu.com')){ | |||||
// e.remove() | |||||
// } | |||||
// }) | |||||
// } | |||||
// window.BMapGL = null | |||||
clearInterval(this.timer) | clearInterval(this.timer) | ||||
clearInterval(this.timer1) | clearInterval(this.timer1) | ||||
} | } | ||||
@@ -50,7 +50,6 @@ | |||||
<img src="../../common/images/2.png" alt="" width="100%"> | <img src="../../common/images/2.png" alt="" width="100%"> | ||||
</view> | </view> | ||||
</view> | </view> | ||||
<view id='container'></view> | |||||
</view> | </view> | ||||
</template> | </template> | ||||
@@ -102,6 +101,7 @@ | |||||
isGetingLocal:false, | isGetingLocal:false, | ||||
isInternalNet:false, | isInternalNet:false, | ||||
baiduAK:'', | |||||
} | } | ||||
}, | }, | ||||
@@ -112,17 +112,21 @@ | |||||
methods: { | methods: { | ||||
// 页面初始化 | // 页面初始化 | ||||
async init() { | async init() { | ||||
// 获取随机ak | |||||
this.baiduAK = this.GET_AK() | |||||
// 开发环境使用 | |||||
// this.baiduAK = '7SGoYuwTC1UjJWZ6kVuo46RJL0wdvIkF' | |||||
// 判断是否校园网 | |||||
this.isInternalNetwork(false) | this.isInternalNetwork(false) | ||||
this.LOADING('加载数据中...') | |||||
// 实时显示时间 | |||||
this.now = this.getCurrentTime() | this.now = this.getCurrentTime() | ||||
this.timer = setInterval(this.getCurrentTime, 1000) | this.timer = setInterval(this.getCurrentTime, 1000) | ||||
let res = await this.judgeIsDK() | |||||
// 获取打卡信息 | |||||
this.LOADING('加载数据中...') | |||||
let res = await this.getPageInfo() | |||||
this.ready = res ? true : false | this.ready = res ? true : false | ||||
this.HIDE_LOADING() | this.HIDE_LOADING() | ||||
}, | }, | ||||
// 点击 「打卡」按钮 | // 点击 「打卡」按钮 | ||||
async action(type) { | async action(type) { | ||||
switch (type) { | switch (type) { | ||||
@@ -143,26 +147,14 @@ | |||||
return | return | ||||
} | } | ||||
this.NAV_TO(`./single_zc`, this.postData,true) | this.NAV_TO(`./single_zc`, this.postData,true) | ||||
// this.LOADING() | |||||
// this.HTTP_POST('learun/adms/attendance/clockinTeacher', {}, '打卡失败').then(success => { | |||||
// this.HIDE_LOADING() | |||||
// if (!success) { | |||||
// this.TOAST('打卡失败') | |||||
// return | |||||
// } | |||||
// this.TOAST('打卡成功', 'success') | |||||
// setTimeout(this.back, 500) | |||||
// }) | |||||
return | |||||
default: | default: | ||||
break | break | ||||
} | } | ||||
}, | }, | ||||
//获取打卡信息 | |||||
async judgeIsDK() { | |||||
//获取打卡页面信息 | |||||
async getPageInfo() { | |||||
// 获取打卡时间范围等信息 | |||||
// 签到状态(1正常打卡,2迟到打卡,3早退打卡,4外勤打卡,5不在考勤时间范围) | |||||
let success = await this.HTTP_GET('learun/adms/attendance/IsAttendanceTeacher', {}, '判断当前时间是否可以打卡失败') | let success = await this.HTTP_GET('learun/adms/attendance/IsAttendanceTeacher', {}, '判断当前时间是否可以打卡失败') | ||||
if (!success) { | if (!success) { | ||||
return false | return false | ||||
@@ -174,47 +166,35 @@ | |||||
ALTId:this.info.ALTId||undefined, | ALTId:this.info.ALTId||undefined, | ||||
ALTOEId:this.info.ALTOEId||undefined | ALTOEId:this.info.ALTOEId||undefined | ||||
} | } | ||||
// if ([1].includes(this.info.AttendanceType)) { | |||||
// this.imgsrc=dk; | |||||
// } else if ([2,3].includes(this.info.AttendanceType)) { | |||||
// this.imgsrc=dkyellow; | |||||
// }else { | |||||
// this.imgsrc=dkred; | |||||
// } | |||||
// 保存原打卡状态 | // 保存原打卡状态 | ||||
this.resInfo = { | this.resInfo = { | ||||
AttendanceType:this.info.AttendanceType, | AttendanceType:this.info.AttendanceType, | ||||
AttendanceTypeString:this.info.AttendanceTypeString, | AttendanceTypeString:this.info.AttendanceTypeString, | ||||
} | } | ||||
if (![5].includes(this.info.AttendanceType)) { | |||||
this.$set(this.info, 'AttendanceType', 4) | |||||
this.$set(this.info, 'AttendanceTypeString', '外勤打卡') | |||||
this.$set(this.postData, 'AIsOut', 1) | |||||
// 获取定位,不是外勤时候改变状态 | |||||
if (!window.BMapGL) await this.loadJScript() | |||||
this.map = new BMapGL.Map('container'); | |||||
await this.isFieldPersonnel() | |||||
// 不在打卡时间范围 停止定位加载 | |||||
if ([5].includes(this.info.AttendanceType)) return true | |||||
// 获取到定位前默认为外勤打卡 | |||||
this.$set(this.info, 'AttendanceType', 4) | |||||
this.$set(this.info, 'AttendanceTypeString', '外勤打卡') | |||||
this.$set(this.postData, 'AIsOut', 1) | |||||
// 更新定位信息 | |||||
await this.updatePageInfo() | |||||
// 获取定位信息失败,终止定时 | |||||
if(!this.postData.ClockPlace){ | |||||
return true | |||||
} | |||||
// 获取定位信息成功,开始定时 | |||||
this.timer1 = setInterval(async ()=>{ | |||||
if(this.isGetingLocal)return | |||||
if(!this.postData.ClockPlace){ | if(!this.postData.ClockPlace){ | ||||
return true | |||||
clearInterval(this.timer1) | |||||
} | } | ||||
this.timer1 = setInterval(async ()=>{ | |||||
if(this.isGetingLocal)return | |||||
if(!this.postData.ClockPlace){ | |||||
clearInterval(this.timer1) | |||||
} | |||||
this.isGetingLocal = true | |||||
await this.isFieldPersonnel() | |||||
// console.log(this.postData) | |||||
this.isGetingLocal = false | |||||
},3000) | |||||
} | |||||
this.isGetingLocal = true | |||||
await this.updatePageInfo() | |||||
this.isGetingLocal = false | |||||
},3000) | |||||
return true | return true | ||||
}, | }, | ||||
//返回 | |||||
back() { | |||||
this.NAV_BACK() | |||||
}, | |||||
//获取当前时间 | //获取当前时间 | ||||
getCurrentTime() { | getCurrentTime() { | ||||
let nowDate = new Date(); | let nowDate = new Date(); | ||||
@@ -223,46 +203,20 @@ | |||||
let ss = nowDate.getSeconds() < 10 ? '0' + nowDate.getSeconds() : nowDate.getSeconds(); | let ss = nowDate.getSeconds() < 10 ? '0' + nowDate.getSeconds() : nowDate.getSeconds(); | ||||
this.now = hh + ':' + mf + ':' + ss; | this.now = hh + ':' + mf + ':' + ss; | ||||
}, | }, | ||||
// 判断是否外勤打卡 | |||||
async isFieldPersonnel() { | |||||
let point = new BMapGL.Point(this.info.GPSLon, this.info.GPSLat) | |||||
await this.getDistance(point) | |||||
}, | |||||
//异步加载地图 | |||||
loadJScript() { | |||||
return new Promise((resolve, reject) => { | |||||
let ak = this.GET_AK() | |||||
window.initMap = function() { | |||||
resolve(BMapGL) | |||||
} | |||||
setTimeout(()=>{ | |||||
resolve() | |||||
},8000) | |||||
var script = document.createElement('script'); | |||||
script.type = 'text/javascript'; | |||||
script.src = | |||||
'https://api.map.baidu.com/api?v=1.0&type=webgl&ak=' + ak + | |||||
'&callback=' + 'initMap'; | |||||
script.onerror = reject; | |||||
script.id = 'baiduScript' | |||||
document.head.appendChild(script); | |||||
}) | |||||
}, | |||||
// 计算距离打卡点的距离 | |||||
// 签到状态(1正常打卡,2迟到打卡,3早退打卡,4外勤打卡,5不在考勤时间范围) | |||||
async getDistance(myP1) { | |||||
// new BMapGL.Point(116.404, 39.915) | |||||
// 更新定位信息 | |||||
async updatePageInfo() { | |||||
// 学校打卡范围中心坐标 | |||||
let myP1 = {lat:this.info.GPSLat,lng:this.info.GPSLon} | |||||
// 获取当前定位 | |||||
let myP2 = await this.local(); | let myP2 = await this.local(); | ||||
if (!myP2) { | if (!myP2) { | ||||
// this.TOAST('获取定位失败!') | |||||
this.$set(this.info, 'AttendanceType', 4) | this.$set(this.info, 'AttendanceType', 4) | ||||
this.$set(this.info, 'AttendanceTypeString', '外勤打卡') | this.$set(this.info, 'AttendanceTypeString', '外勤打卡') | ||||
this.$set(this.postData, 'AIsOut', 1) | this.$set(this.postData, 'AIsOut', 1) | ||||
return | return | ||||
} | } | ||||
let distance = this.map.getDistance(myP1, myP2).toFixed(2) | |||||
// alert('距离'+ distance) | |||||
// console.log('距离', distance, '打卡坐标:', myP1, '当前坐标:', myP2) | |||||
// 计算距离更新状态 | |||||
let distance = this.calculateDistance(myP1.lat,myP1.lng,myP2.lat,myP2.lng)*1000 | |||||
if (Number(distance) > Number(this.info.GPSRange)) { | if (Number(distance) > Number(this.info.GPSRange)) { | ||||
this.$set(this.info, 'AttendanceType', 4) | this.$set(this.info, 'AttendanceType', 4) | ||||
this.$set(this.info, 'AttendanceTypeString', '外勤打卡') | this.$set(this.info, 'AttendanceTypeString', '外勤打卡') | ||||
@@ -273,57 +227,80 @@ | |||||
this.$set(this.postData, 'AIsOut', 0) | this.$set(this.postData, 'AIsOut', 0) | ||||
} | } | ||||
}, | }, | ||||
// 计算距离 | |||||
calculateDistance(lat1, lng1, lat2, lng2) { | |||||
// 地球半径 | |||||
var R = 6371; // 单位为公里 | |||||
// 将角度转为弧度 | |||||
lat1 = lat1 * Math.PI / 180; | |||||
lng1 = lng1 * Math.PI / 180; | |||||
lat2 = lat2 * Math.PI / 180; | |||||
lng2 = lng2 * Math.PI / 180; | |||||
// 经纬度差值 | |||||
var dLat = lat2 - lat1; | |||||
var dLng = lng2 - lng1; | |||||
// Haversine公式 | |||||
var a = Math.pow(Math.sin(dLat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(dLng / 2), 2); | |||||
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); | |||||
var distance = R * c; | |||||
return distance; | |||||
}, | |||||
// 获取当前位置 | // 获取当前位置 | ||||
local() { | local() { | ||||
return new Promise(async (resolve) => { | return new Promise(async (resolve) => { | ||||
let res = await this.getLocation() | |||||
let res = await this.getLocation() | |||||
// 开发环境使用 | |||||
// let res = { | // let res = { | ||||
// lng: 112.57205562051, | |||||
// lat: 37.742374280962 | |||||
// lng: 112.55343965851368, | |||||
// lat: 37.80263075215858 | |||||
// } | // } | ||||
// let res = { | |||||
// lng: 112.55981419, | |||||
// lat: 37.80890166 | |||||
// let res = { | |||||
// lng: 112.55983599999995, | |||||
// lat: 37.80894902218693 | |||||
// } | // } | ||||
// 瑞鼎国际中心: | |||||
// 腾讯系/国测局/火星/gcj02:37.80263075215858,112.55343965851368 | |||||
// 百度系/bd09ll:37.80894902218693,112.55983599999995 | |||||
if (!res) { | if (!res) { | ||||
this.$set(this.postData, 'ALon', '') | this.$set(this.postData, 'ALon', '') | ||||
this.$set(this.postData, 'ALat', '') | this.$set(this.postData, 'ALat', '') | ||||
this.$set(this.postData, 'ClockPlace', '') | this.$set(this.postData, 'ClockPlace', '') | ||||
resolve(false) | resolve(false) | ||||
return | |||||
} | } | ||||
new BMapGL.Convertor().translate([res], 3, 5, data => { | |||||
if (data.status == 0) { | |||||
// alert(data.points[0].lng + '' + data.points[0].lat) | |||||
this.$set(this.postData, 'ALon', data.points[0].lng) | |||||
this.$set(this.postData, 'ALat', data.points[0].lat) | |||||
let geoc = new BMapGL.Geocoder(); | |||||
geoc.getLocation(data.points[0], (rs) => { | |||||
let addComp = rs.addressComponents; | |||||
let address = | |||||
addComp.province + | |||||
addComp.city + | |||||
addComp.district + | |||||
addComp.street + | |||||
addComp.streetNumber | |||||
this.$set(this.postData, 'ClockPlace', address) | |||||
resolve(data.points[0]) | |||||
}); | |||||
} else { | |||||
this.$set(this.postData, 'ALon', '') | |||||
this.$set(this.postData, 'ALat', '') | |||||
this.$set(this.postData, 'ClockPlace', '') | |||||
this.TOAST('获取定位失败!') | |||||
resolve(false) | |||||
} | |||||
let host = location.origin | |||||
let data = await uni.request({ | |||||
url: host+"/baiduapi/reverse_geocoding/v3/?ak=" | |||||
+this.baiduAK | |||||
+"&output=json&coordtype=gcj02ll" | |||||
+"&location=" + res.lat+ "," + res.lng | |||||
+"&ret_coordtype=bd09ll", | |||||
}) | }) | ||||
if(data&&data[1]&&data[1].data&&data[1].data.status == 0){ | |||||
let result = data[1].data.result | |||||
this.$set(this.postData, 'ALon', result.location.lng) | |||||
this.$set(this.postData, 'ALat', result.location.lat) | |||||
let address = result.formatted_address | |||||
this.$set(this.postData, 'ClockPlace', address) | |||||
resolve(result.location) | |||||
}else { | |||||
this.$set(this.postData, 'ALon', '') | |||||
this.$set(this.postData, 'ALat', '') | |||||
this.$set(this.postData, 'ClockPlace', '') | |||||
this.TOAST('定位获取失败!') | |||||
resolve(false) | |||||
} | |||||
}); | }); | ||||
}, | }, | ||||
// 判断是否学校网络 | // 判断是否学校网络 | ||||
isInternalNetwork(TOAST=true){ | isInternalNetwork(TOAST=true){ | ||||
this.LOADING() | |||||
this.requestBase("https://mp.weixin.qq.com/intp/getuserclientip").then(res=>{ | |||||
this.HIDE_LOADING() | |||||
TOAST&&this.LOADING('加载数据中...') | |||||
return this.requestBase("https://mp.weixin.qq.com/intp/getuserclientip").then(res=>{ | |||||
TOAST&&this.HIDE_LOADING() | |||||
let res_ = res[1] | let res_ = res[1] | ||||
let client_ip_start = '1.190.222.' | let client_ip_start = '1.190.222.' | ||||
let arr = [] | let arr = [] | ||||
@@ -341,19 +318,6 @@ | |||||
}, | }, | ||||
}, | }, | ||||
destroyed() { | destroyed() { | ||||
let scirpt = document.getElementById('baiduScript') | |||||
if(scirpt){ | |||||
scirpt.remove() | |||||
} | |||||
let scirpt1 = document.querySelectorAll('body script') | |||||
if(scirpt1){ | |||||
scirpt1.forEach(e=>{ | |||||
if(e.src.includes('https://api.map.baidu.com')){ | |||||
e.remove() | |||||
} | |||||
}) | |||||
} | |||||
window.BMapGL = null | |||||
clearInterval(this.timer) | clearInterval(this.timer) | ||||
clearInterval(this.timer1) | clearInterval(this.timer1) | ||||
} | } | ||||
@@ -14,7 +14,7 @@ module.exports = { | |||||
disableHostCheck: true | disableHostCheck: true | ||||
}, | }, | ||||
output: { // 输出重构 打包编译后的 文件目录 文件名称 【模块名称.时间戳】 | output: { // 输出重构 打包编译后的 文件目录 文件名称 【模块名称.时间戳】 | ||||
filename: `${filePath}[name]${Timestamp}.js?v=1.0.2`, | |||||
filename: `${filePath}[name]${Timestamp}.js?v=1.1.2`, | |||||
chunkFilename: `${filePath}[name]${Timestamp}.js` | chunkFilename: `${filePath}[name]${Timestamp}.js` | ||||
}, | }, | ||||
} | } | ||||