本功能目的是将学生扫码选座功能做为一个单独的功能实现,教师不用登录就能够实现查看学生选定座位状况,教师又能够登录绑定课程,统计学生本课程签到次数。老师不须要繁琐的注册登录就能够实现部分功能,也可使用本产品创建课程进行绑定,从而利用产品统计学生签到次数。这将大大增长老师对本产品的体验,有效增长用户总数。
本文章具体讲学生扫码功能实现,其余再也不具体讲述。session
1.首先将每一个教室的每一小节创建一个表,这里称做classroom_time
,这些数据应该在增长教室字段时自动生成,以天天11个小节为例,每一个教室生成11个classroom_time字段,如图。this
2.每一个座位应该也要存入一个字段用于保存它的行列数,学生id和所对应的classroom_time_id用于保存它是哪一个教室的哪一个小节的座位。咱们在这里称之为seattable,初始为0条数据。
3.再创建一个网页用于显示一个classroom_time的座位表
4.每一个座位应该对应一个二维码,url传值这个教室id,行列数,同时查看座位表应该有一个单独的二维码,不用登陆直接显示学生选座状况。
咱们学生扫码功能主要是对seattable表数据进行操做。url
1.经过url获取这个座位的基本信息
经过扫码所传入的url,获取这个座位的行列号,classroom_id,也要经过静态方法获取student_id和第几小节数,小节数这里称为time。同时经过第几小节和教室id查询惟一一个classroom_time.spa
public function entercourse() { $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(); return ; }
这里获取第几小节的同时判断一下,若是超出十一小节,说明上课时间已结束,返回到学生主页。
2.经过classroom_time的id和学生id在seattable表里找有没有这个字段,在这里定义为$seattable
,咱们要经过有无$seattable
进行if语句。ssr
$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'));~~~~
这里举个例子,学生进入教室就会有一条数据,他选择座位就会将行列数填入,别人抢了他的位置,将他的行列数清空,至关于他没作座位,可是还在教室里,学生id数据存在,这样有利于老师绑定课程时签到数加一。
我原来写的思路是新建数据定死行列数清空学生id,这样会致使别人抢了他的位置他再次扫码时没法判断这是二次扫码仍是第一第扫码,从而没法正确统计学生签到总数。
确立定死student_id改变行列值的思路是实现这个功能的关键。
3.若是这个学生签过到
两种状况,这个座位原来有人,这个座位原来没人
有人的话先看这我的是否是他本身,是的话直接提示并返回学生主页,不是的话获得这个座位原来学生的一条数据,通知原来的人有人占了座位了,将原来的人的行列数据清除,并将这个学生行列数填上。
没人直接将行列数填上。code
$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')); }
举例:本身(我叫张三)原来扫过码而且扫码的座位上有人。
扫码前
扫码后blog
由于后续会用到对行列排序,为了让清空的行列数不显示名字,咱们这里将行列重置为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)->find(); // 若是这个座位原来有学生 if ($primaryStudent) { // 通知他 // 他行列信息清空 $primaryStudent->row = 100; $primaryStudent->column = 100; if (!$primaryStudent->save()) { return $this->error('信息保存异常,请从新扫码', url('/index/student/page')); } } // 建立一条新数据 $seattable = new Seattable; $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的状态为1,签到次数加一 if ($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 = new Score; $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')); } }
你们看看思路就好,完整代码仅供参考产品
// 学生扫码选座位(新中新) public function entercourse() { $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)->find(); // 若是这个座位原来有学生 if ($primaryStudent) { // 通知他 // 他行列信息清空 $primaryStudent->row = 100; $primaryStudent->column = 100; if (!$primaryStudent->save()) { return $this->error('信息保存异常,请从新扫码', url('/index/student/page')); } } // 建立一条新数据 $seattable = new Seattable; $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的状态为1,签到次数加一 if ($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 = new Score; $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')); } } } return $this->success('选座成功', url('/index/student/page')); }
这个功能还须要天天定时清除数据,包括所有清除seattable表里的数据和classroom_time表里全部status归0,courseinfo变为null。it
写功能前肯定好思路很重要,否则可能会测出漏洞从新写。