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

一、实现逻辑

发起签到

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

微信小程序(看文档写实例六)微信小程序课堂宝APP实现签到逻辑相关推荐

  1. 微信小程序(看文档写实例三)微信小程序课堂宝APP实现整体界面框架及首页布局

    一.首页布局简单思路 回顾上一篇博文,首页的内容主要有轮播图,横向滑动菜单以及菜单对应的view,横向滑动菜单有签到.课堂测试.模拟测试.课堂提问.答问记录五个选项,当点击选项时更新显示view.由于 ...

  2. 微信小程序(看文档写实例二)微信小程序课堂宝APP

    全程记录APP的开发过程,项目完结公上传Github. 一.需求 由于老板让做一个课堂信息化APP,想想在移动端开发,小程序不分Android和IOS,所以就选择了微信小程序,软件的需求不多,但整体内 ...

  3. 微信小程序(看文档写实例十)微信小程序课堂宝APP实现我的模块相关界面及逻辑

    继上篇博文,这篇完成最后一个模块,即我的模块. 一.页面效果 这个模块是和用户类型相关的,因此老师账号和学生账号能看的功能不一样,老师端效果如下: 点击头像到达个人信息如下: 点击后可以做相应的修改. ...

  4. 微信小程序(看文档写实例十一)微信小程序课堂宝APP完结总结及github地址

    一.总结 国庆假期偷懒了几天,从接到任务到分析到实现总共花了20天左右,终于完成了,点名功能由于要实时监听需要收费,所以没有给出代码,需要完成的可以自己动手实现.用一张导图来结束: 二.源码地址 所有 ...

  5. 微信小程序(看文档写实例八)微信小程序课堂宝APP实现练习模块前台

    接上篇博文,这篇主要描述练习模块的前台显示,其中包括test页面,答题detail页面以及提交答题后答卷answer页面. 一.练习模块test页面 练习页面主要展示的是当前用户的头像,昵称以及学校信 ...

  6. 微信小程序(看文档写实例四)微信小程序课堂宝APP实现签到子页面布局及课程视频播放页面

    一.签到子页面布局 子页面主要是一个签到按钮,然后下方是签到记录列表. 1.签到按钮 布局代码: <button class='sign-button' bindtap='sign'>签到 ...

  7. 微信小程序(看文档写实例五)微信小程序课堂宝APP实现获取签到列表

    根据上篇博文,这篇主要实现获取签到列表逻辑. 获得签到列表主要有以下步骤: (1)查询老师的ID (2)查询老师的签到记录 (3)如果当前用户是老师,直接显示所有记录,因为签到记录都是老师发起的,肯定 ...

  8. 微信小程序(看文档写实例九)微信小程序课堂宝APP实现练习模块逻辑代码

    接上篇博文,这篇主要描述练习模块的代码逻辑,其中包括test页面,答题detail页面以及提交答题后答卷answer页面. 一.test页面 test页面其实就是从服务器获得章节练习题的内容,然后统计 ...

  9. python使用微信设置-微信 python 接口 -- itchat 文档

    itchat 一. 安装 $ pip install itchat 特殊的字典使用方式 通过打印 itchat 的用户以及注册消息的参数, 可以发现这些值都是字典. 但实际上 itchat 精心构造了 ...

最新文章

  1. pytorch之Tensor与Variable的区别
  2. python装饰器作用-python装饰器有什么用
  3. python程序员发展-Python程序员的进化史
  4. 使用js实现放大镜效果
  5. zpl代码可以编译的特殊字符_国际C语言混乱代码大赛(IOCCC)代码解析
  6. IP通信基础 4月1日
  7. java高分面试指南:java单例模式双重检查
  8. 拥抱创新二十载,微软“创新杯”持续孵化中国青年开发者智慧创意
  9. Hyperledger Fabric介绍
  10. Float浮点内存存储方式 转
  11. rs(0)与rs(字段名)的区别
  12. 基于系统的流量控制(Qos)
  13. java核心技术卷1基础知识整理
  14. 数据库系统和文件系统的区别
  15. 基于LPC2148的音频分析仪设计
  16. 学计算机要选什么科目,实行新高考后 想学计算机专业怎么选科
  17. 树莓派4B:连接windows远程桌面
  18. matlab中options,[转载]Matlab优化函数中options选项的修改
  19. 都说谷歌浏览器翻译插件好用,这些必不可少
  20. 【快代理API】获取隧道代理IP

热门文章

  1. ios苹果手机下载《圣安地列斯》手机版ios版下载
  2. 模拟QQ聊天——采用TCP协议的C/S架构实现
  3. JVM内存分析工具之jmap
  4. Xilinx FPGA在线加载远程更新多重加载 QSPI加载方式 可通过PCIe/网口/串口等接口加载
  5. 【论文阅读】Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs
  6. 123012016068-吴雨晴-android博客,Flutter全方位深入探索
  7. thymeleaf中的/*[[@{})}]]*/语法
  8. 6轴并联机器人开发--简介
  9. 小程序上的防疫保卫战 | 钛媒体深度
  10. ubuntu20.04开机进入emergency mode解决办法