tp5.1扫描二维码选座作为单独功能实现登录绑定课程,统计学生登录本课程的次数。教师无需繁琐的注册登录即可实现部分功能,也可以使用本产品创建绑定课程,使用本产品统计学生签到人数。这将大大增加教师使用该产品的体验,有效增加用户总数。本篇专门讲学生扫码功能的实现,其他的就不详细说了。前期准备1.首先为每个教室的每个section创建一个表,这里叫做classroom_time。这些数据应该在添加教室字段时自动生成。以每天11节课为例,每个班级生成11个classroom_time字段。如图所示。2、每个座位也要存储一个字段,保存它的行数和列数,用studentid和对应的classroom_time_id保存它属于哪个教室的哪个section。我们在这里称它为seattable,最初是0数据。3.创建另一个网页来显示classroom_time座位表。4.每个座位要对应一个二维码,url要传教室id的值,行数和列数。同时,应该有一个单独的二维码可以查看座位表。登录直接显示学生选座状态。我们同学的扫码功能主要是对seattable里面的数据进行操作。学生扫码功能的实现1.通过url获取该座位的基本信息。扫码传入的url用于获取该座位的rank和列号、classroom_id,同时通过静态方法获取student_id和section数。节数在这里称为时间。同时查询唯一一个classroom_time.publicfunctionentercourse(){$id=$this->request->param('id');$classroom_id=substr($id,0,4)*1通过section和classroomid;$row=substr($id,4,2)*1;$column=substr($id,6,2)*1;$time=Term::littleClass();if($time<=0||$time>11){return$this->error('上课时间结束',url('/index/student/page'));}$student_id=session('studentId');$classroom_time=Classroom_time::where('classroom_id',$classroom_id)->where('littleclass',$time)->find();$seattable=Seattable::where('student_id',$student_id)->where('classroom_time_id',$classroom_time->id)->find();返回;}获取第一节,同时进行判断。如果超过十一节,则表示上课时间结束,返回学生主页。2、通过classroom_time的id和studentid查找seattable表中是否有这个字段,这里定义为$seattable,根据是否有$seattable需要进行if语句。$seattable=Seattable::where('student_id',$student_id)->where('classroom_time_id',$classroom_time->id)->find();//如果学生签到if($seattable){}else{//如果学生之前从未选择过座位}return$this->success('成功选择座位',url('/index/student/page'));~~~~这里举个例子,student一进教室,就会有一条数据。当他选择座位时,他会填写行数和列数。别人抢了他的位置,清了他的行数和列数。相当于他没有让座,但他还在教室里,有利于老师绑定课程时,签到次数加一。本来我写的思路是新建一个数据集,清空行数和列数,清空studentid,这样会导致别人代替他的位置。再次扫码时,他无法判断是第二次扫码还是第一次扫码,所以无法正确统计学生人数。签到总数。实现这个功能的关键是建立改变student_id的行列值的思路。3.如果学生有两种情况签到,原位被占和未被占,则先查看此人是否本人,如果是则直接提示并返回学生主页,如果不是则获取原件student'sseat一条数据通知原人有人占了座位,清空原人的行列数据,填入学生的行列号。没有人直接填写行数和列数。$primaryStudent=Seattable::where('row',$row)->where('column',$column)->where('classroom_time_id',$classroom_time->id)->find();//如果这个座位原来有学生if($primaryStudent){//如果学生是自己if($primaryStudent->student_id==$student_id){return$this->error('你扫码成功了选座请不要重复扫码',url('/index/student/page'));}//通知他//清除他的行列信息$primaryStudent->row=100;$primaryStudent->column=100;if(!$primaryStudent->save()){return$this->error('信息保存异常,请重新扫码',url('/index/student/page'));}}//将新的行数和列数保存到student那条数据中,$seattable->row=$row;$seattable->column=$column;if(!$seattable->save()){return$this->error('信息保存异常,请重新扫码',url('/index/student/page'));}例子:我(我叫张三)本来是扫二维码的,扫二维码的座位上有人。扫码前扫码后,因为后面会对行列进行排序,为了让行列数清零不显示姓名,我们将行列重新设置为100,100(行和列的最大值柱子)。4.如果学生还没有签到,也需要先判断座位是否被占用。如果有,先通知他,把行数和列数清零。如果没有登录seattable,则不会有对应的student_id和classroom_time_id数据。这时候新建一个$seattable,填上student_id,行号和列号。如果$seattable对应的classroom_time->status为1(status为1表示已绑定课程,status为0表示未绑定课程),则签到总数+1。//如果学生在$primaryStudent=Seattable::where('row',$row)->where('column',$column)->where('classroom_time_id',$classroom_time->id)->查找();//如果这个座位有学生if($primaryStudent){//通知他//清除其他行列信息$primaryStudent->row=100;$primaryStudent->column=100;if(!$primaryStudent->save()){return$this->error('信息保存异常,请重新扫码',url('/index/student/page'));}}//创建一条新数据$seattable=newSeattable;$seattable->classroom_time_id=$classroom_time->id;$seattable->row=$row;$seattable->column=$column;$seattable->student_id=$student_id;$seattable->role=0;if(!$seattable->save()){return$this->error('信息保存异常,请重新扫码',url('/index/student/page'));}//如果这个classroom_time的status为1,签到次数会加1if($classroom_time->status){$score=Score::where('student_id',$student_id)->where('course_id',$classroom_time->courseinfo->course_id)->find();if($score){//如果学生有这门课的数据,签到次数+1$score->arrivals++;}else{//如果没有,创建一个新的$score=newScore;$score->student_id=$student_id;$score->course_id=$classroom_time->courseinfo->course_id;$score->usual_score=0;$score->exam_score=0;$score->total_score=0;$score->arrivals=0;$score->respond=0;$score->arrivals++;}if(!$score->save()){return$this->error('信息保存异常,请重新扫码',url('/index/student/page'));}}看看思路,完整代码仅供参考//同学们扫码选座(newinnew)publicfunctionentertainment(){$id=$this->request->param('ID');$classroom_id=substr($id,0,4)*1;$row=substr($id,4,2)*1;$column=substr($id,6,2)*1;$time=Term::littleClass();if($time<=0||$time>11){return$this->error('上课时间结束',url('/index/student/page'));}$student_id=session('studentId');$classroom_time=Classroom_time::where('classroom_id',$classroom_id)->where('littleclass',$time)->find();$seattable=Seattable::where('student_id',$student_id)->where('classroom_time_id',$classroom_time->id)->find();//如果学生之前签到过if($seattable){$primaryStudent=Seattable::where('row',$row)->where('column',$column)->where('classroom_time_id',$classroom_time->id)->find();//如果这个座位上有学生if($primaryStudent){//如果学生是自己if($primaryStudent->student_id==$student_id){return$this->error('你扫码成功选择该座位,请勿再次扫码',url('/index/student/page'));}//通知他//清除他的行列信息$primaryStudent->row=100;$primaryStudent->column=100;if(!$primaryStudent->save()){return$this->error('信息保存异常,请重新扫码',url('/index/student/page'));}}//将新的行数和列数保存到学生的数据中$seattable->row=$row;$seattable->column=$column;if(!$seattable->save()){return$this->error('信息保存异常,请重新扫码',url('/index/student/page'));}}else{//如果学生从未选择过座位$primaryStudent=Seattable::where('row',$row)->where('column',$column)->where('classroom_time_id',$classroom_time->id)->查找();//如果这个座位有学生if($primaryStudent){//通知他//清除他的行列信息$primaryStudent->row=100;$primaryStudent->column=100;if(!$primaryStudent->save()){return$this->error('信息保存异常,请重新扫码',url('/index/student/page'));}}//创建新数据$seattable=newSeattable;$seattable->classroom_time_id=$classroom_time->id;$seattable->row=$row;$seattable->column=$column;$seattable->student_id=$student_id;$seattable->role=0;if(!$seattable->save()){return$this->error('信息保存异常,请重新扫码',url('/index/student/page'));}//如果这个classroom_time的status为1,签到次数加1if($classroom_time->status){$score=Score::where('student_id',$student_id)->where('course_id',$classroom_time->courseinfo->course_id)->find();if($score){//如果学生有这门课的一条数据,签到数+1$score->arrivals++;}else{//如果没有,创建一个新的$score=newScore;$score->student_id=$student_id;$score->course_id=$classroom_time->courseinfo->course_id;$score->usual_score=0;$score->exam_score=0;$score->total_score=0;$score->ar竞争对手=0;$score->respond=0;$score->arrivals++;}if(!$score->save()){return$this->error('信息保存异常,请重新扫码',url('/index/student/page'));}}}return$this->success('成功选座',url('/index/student/page'));}这个函数还需要每天定时清空数据,包括清空seattable表中的所有数据,将classroom_time表中的status全部清0,将courseinfo改成null。在写函数之前确定思路很重要,否则可能会检测到漏洞而重写。
