继上篇博文,这篇写下签到实现的逻辑。

一、实现逻辑

发起签到

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中,只有教师用户才能看到并对本次签到结束,结束后学生将不能再签到,后面在设计“我的”模块时实现。

友情链接
ioDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信