微信小程序(看文档写实例六)微信小程序课堂宝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中,只有教师用户才能看到并对本次签到结束,结束后学生将不能再签到,后面在设计“我的”模块时实现。
微信小程序(看文档写实例六)微信小程序课堂宝APP实现签到逻辑相关推荐
- 微信小程序(看文档写实例三)微信小程序课堂宝APP实现整体界面框架及首页布局
一.首页布局简单思路 回顾上一篇博文,首页的内容主要有轮播图,横向滑动菜单以及菜单对应的view,横向滑动菜单有签到.课堂测试.模拟测试.课堂提问.答问记录五个选项,当点击选项时更新显示view.由于 ...
- 微信小程序(看文档写实例二)微信小程序课堂宝APP
全程记录APP的开发过程,项目完结公上传Github. 一.需求 由于老板让做一个课堂信息化APP,想想在移动端开发,小程序不分Android和IOS,所以就选择了微信小程序,软件的需求不多,但整体内 ...
- 微信小程序(看文档写实例十)微信小程序课堂宝APP实现我的模块相关界面及逻辑
继上篇博文,这篇完成最后一个模块,即我的模块. 一.页面效果 这个模块是和用户类型相关的,因此老师账号和学生账号能看的功能不一样,老师端效果如下: 点击头像到达个人信息如下: 点击后可以做相应的修改. ...
- 微信小程序(看文档写实例十一)微信小程序课堂宝APP完结总结及github地址
一.总结 国庆假期偷懒了几天,从接到任务到分析到实现总共花了20天左右,终于完成了,点名功能由于要实时监听需要收费,所以没有给出代码,需要完成的可以自己动手实现.用一张导图来结束: 二.源码地址 所有 ...
- 微信小程序(看文档写实例八)微信小程序课堂宝APP实现练习模块前台
接上篇博文,这篇主要描述练习模块的前台显示,其中包括test页面,答题detail页面以及提交答题后答卷answer页面. 一.练习模块test页面 练习页面主要展示的是当前用户的头像,昵称以及学校信 ...
- 微信小程序(看文档写实例四)微信小程序课堂宝APP实现签到子页面布局及课程视频播放页面
一.签到子页面布局 子页面主要是一个签到按钮,然后下方是签到记录列表. 1.签到按钮 布局代码: <button class='sign-button' bindtap='sign'>签到 ...
- 微信小程序(看文档写实例五)微信小程序课堂宝APP实现获取签到列表
根据上篇博文,这篇主要实现获取签到列表逻辑. 获得签到列表主要有以下步骤: (1)查询老师的ID (2)查询老师的签到记录 (3)如果当前用户是老师,直接显示所有记录,因为签到记录都是老师发起的,肯定 ...
- 微信小程序(看文档写实例九)微信小程序课堂宝APP实现练习模块逻辑代码
接上篇博文,这篇主要描述练习模块的代码逻辑,其中包括test页面,答题detail页面以及提交答题后答卷answer页面. 一.test页面 test页面其实就是从服务器获得章节练习题的内容,然后统计 ...
- python使用微信设置-微信 python 接口 -- itchat 文档
itchat 一. 安装 $ pip install itchat 特殊的字典使用方式 通过打印 itchat 的用户以及注册消息的参数, 可以发现这些值都是字典. 但实际上 itchat 精心构造了 ...
最新文章
- pytorch之Tensor与Variable的区别
- python装饰器作用-python装饰器有什么用
- python程序员发展-Python程序员的进化史
- 使用js实现放大镜效果
- zpl代码可以编译的特殊字符_国际C语言混乱代码大赛(IOCCC)代码解析
- IP通信基础 4月1日
- java高分面试指南:java单例模式双重检查
- 拥抱创新二十载,微软“创新杯”持续孵化中国青年开发者智慧创意
- Hyperledger Fabric介绍
- Float浮点内存存储方式 转
- rs(0)与rs(字段名)的区别
- 基于系统的流量控制(Qos)
- java核心技术卷1基础知识整理
- 数据库系统和文件系统的区别
- 基于LPC2148的音频分析仪设计
- 学计算机要选什么科目,实行新高考后 想学计算机专业怎么选科
- 树莓派4B:连接windows远程桌面
- matlab中options,[转载]Matlab优化函数中options选项的修改
- 都说谷歌浏览器翻译插件好用,这些必不可少
- 【快代理API】获取隧道代理IP
热门文章
- ios苹果手机下载《圣安地列斯》手机版ios版下载
- 模拟QQ聊天——采用TCP协议的C/S架构实现
- JVM内存分析工具之jmap
- Xilinx FPGA在线加载远程更新多重加载 QSPI加载方式 可通过PCIe/网口/串口等接口加载
- 【论文阅读】Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs
- 123012016068-吴雨晴-android博客,Flutter全方位深入探索
- thymeleaf中的/*[[@{})}]]*/语法
- 6轴并联机器人开发--简介
- 小程序上的防疫保卫战 | 钛媒体深度
- ubuntu20.04开机进入emergency mode解决办法