微信小程式(看文件寫例項六)微信小程式課堂寶APP實現簽到邏輯
繼上篇博文,這篇寫下籤到實現的邏輯。
一、實現邏輯
發起簽到
1、先上傳當前自己的定位經緯度
2、學生查詢老師的最後一次簽到記錄,如果發現簽到記錄signComplete為false說明有新的簽到
3、得到簽到的第幾次課
4、系統獲得學生的定位經緯度
5、判斷兩點經緯度轉換成距離是否在100米以內,如果是則可以簽到否則不能簽到
簽到完成
1、老師端選擇結束簽到
2、老師更新最後一次簽到signComplete為true
二、伺服器簽到表
伺服器簽到表在上篇獲取簽到列表已經給出,主要就是一個簽到次數和簽到是是否完成及使用者的資訊。
三、程式碼實現
由於前端在前面已經提到,因此現在直接寫上程式碼,有詳細註釋。
// 簽到 sign:function(){ wx.showToast({ title: '正在獲取位置資訊..', icon:'loading', duration:10000 }); // 1、獲取位置 wx.getLocation({ type: 'wgs84', success: function (resLocation) { // 2、設定當前使用者的經緯度資訊 var queryUser = Bmob.Query('_User'); queryUser.get(app.globalData.currentUser.objectId).then(resUser => { var point = Bmob.GeoPoint({ latitude: resLocation.latitude, longitude: resLocation.longitude }) resUser.set('location', point); resUser.save(); //3、查詢簽到表老師最近一次簽到 var queryTeacher = Bmob.Query('_User'); queryTeacher.equalTo("userType", '==', 1); queryTeacher.find().then(resTeacher => { var teacher = resTeacher[0]; var teacherPointer = Bmob.Pointer('_User') var teacherPoiID = teacherPointer.set(teacher.objectId) var teacherQuerySign = Bmob.Query('sign_record'); //userId 欄位名稱關聯使用者表 ,型別Pointer teacherQuerySign.equalTo("userId", "==", teacherPoiID); teacherQuerySign.order("-numberNo"); teacherQuerySign.limit(1); teacherQuerySign.find().then(resTeacherSign => { wx.hideToast(); // 如果沒有記錄,說明學生當前不用簽到,老師可以發起簽到 if (resTeacherSign.length==0){ // 如果當前使用者是老師 if(app.globalData.currentUser.userType==1){ wx.showModal({ title: '提示', content: '您確定發起簽到嗎', success: function (resModal) { if (resModal.confirm) { wx.showToast({ title: '發起中..', icon: 'loading', duration: 10000 }); teacherQuerySign.set('numberNo',1); teacherQuerySign.set('signComplete', false); teacherQuerySign.save().then(resTeacherSignSave => { teacherQuerySign.get(resTeacherSignSave.objectId).then(resSignSaveUser => { var userIdPointer = Bmob.Pointer('_User'); var pointerUserId = userIdPointer.set(app.globalData.currentUser.objectId); resSignSaveUser.set('userId', pointerUserId); resSignSaveUser.save(); // 簽到結束重新整理簽到記錄 that.getSignRecord(); wx.hideToast(); }); }).catch(err => { console.log(err) }); } } }); } // 如果是學生 else{ wx.showToast({ title: '當前無需簽到~', duration:2500 }); return; } } //有簽到記錄 else{ var teacherSignRecordItem = resTeacherSign[0]; if (app.globalData.currentUser.userType == 1) { wx.hideToast(); wx.showModal({ title: '提示', content: '您確定發起簽到嗎', success: function (resModal) { if (resModal.confirm) { wx.showToast({ title: '發起中..', icon: 'loading', duration: 10000 }); teacherQuerySign.set('numberNo', teacherSignRecordItem.numberNo + 1); teacherQuerySign.set('signComplete', false); teacherQuerySign.save().then(resTeacherSignSave => { teacherQuerySign.get(resTeacherSignSave.objectId).then(resSignSaveUser => { var userIdPointer = Bmob.Pointer('_User'); var pointerUserId = userIdPointer.set(app.globalData.currentUser.objectId); resSignSaveUser.set('userId', pointerUserId); resSignSaveUser.save(); // 簽到結束重新整理簽到記錄 that.getSignRecord(); wx.hideToast(); }); }).catch(err => { console.log(err) }); } } }) } // 如果是學生 else { // 如果最後一次簽到已經結束則提示最近一次簽到結束 if (teacherSignRecordItem.signComplete == true){ wx.showToast({ title: '最新簽到已結束~', duration: 2500 }); return; } else{ wx.showToast({ title: '查詢是否簽到中..', icon: 'loading', duration: 10000 }); // 查詢是不是已經簽到過了 var queryHaveSign = Bmob.Query('sign_record'); var pointerHaveSign = Bmob.Pointer('_User') var poiIDHaveSign = pointerHaveSign.set(app.globalData.currentUser.objectId); queryHaveSign.equalTo("userId", '==', poiIDHaveSign); queryHaveSign.equalTo("numberNo", '==', teacherSignRecordItem.numberNo); queryHaveSign.find().then(resHaveSign => { wx.hideToast(); // 如果最新一次課已經簽到 if (resHaveSign.length>0){ wx.showToast({ title: '您已簽到過了~', duration: 2500 }); return; } // 如果最新一次課沒有簽到 else{ wx.showToast({ title: '獲取老師位置中..', icon: 'loading', duration: 10000 }); // 判斷和老師端的距離,小於100米才能簽到 var teacherLocation = teacher.location; var distance = Util.getDistance(resLocation.latitude, resLocation.longitude, teacherLocation.latitude, teacherLocation.longitude); //距離老師簽到點100米內可以簽到否則不能 if (distance < 100) { teacherQuerySign.set('numberNo', teacherSignRecordItem.numberNo); teacherQuerySign.set('signComplete', false); teacherQuerySign.save().then(resTeacherSignSave => { teacherQuerySign.get(resTeacherSignSave.objectId).then(resSignSaveUser => { var userIdPointer = Bmob.Pointer('_User'); var pointerUserId = userIdPointer.set(app.globalData.currentUser.objectId); resSignSaveUser.set('userId', pointerUserId); resSignSaveUser.save(); // 簽到結束重新整理簽到記錄 that.getSignRecord(); wx.hideToast(); wx.showToast({ title: '恭喜你完成簽到啦~', duration: 2500 }); }); }).catch(err => { console.log(err) }); } else { wx.hideToast(); wx.showToast({ title: '您距離老師太遠啦~', duration: 2500 }); return; } } }).catch(err=>{}); } } } }).catch(err => { }); }).catch(err=>{}); }); } }); }, |
簽到完成功能在“我的”tab中,只有教師使用者才能看到並對本次簽到結束,結束後學生將不能再簽到,後面在設計“我的”模組時實現。