1. 程式人生 > >微信小程式(看文件寫例項六)微信小程式課堂寶APP實現簽到邏輯

微信小程式(看文件寫例項六)微信小程式課堂寶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中,只有教師使用者才能看到並對本次簽到結束,結束後學生將不能再簽到,後面在設計“我的”模組時實現。