#前言
本功能目的是將學生掃碼選座功能作為一個單獨的功能實現,教師不用登陸就可以實現查看學生選定座位情況,教師又可以登陸綁定課程,統計學生本課程簽到次數。老師不需要繁瑣的註冊登陸就可以實現部分功能,也可以使用本產品建立課程進行綁定,從而利用產品統計學生簽到次數。這將大大增加老師對本產品的體驗,有效增加使用者總數。
本文章具體講學生掃碼功能實現,其他不再具體敘述。
前期準備
1.首先將每個教室的每一小節建立一個表,這裡稱作classroom_time
,這些資料應該在增加教室欄位時自動生成,以每天11個小節為例,每個教室產生11個classroom_time字段,如圖。
2.每個座位應該也要存入一個字段用於保存它的行列數,學生id和所對應的classroom_time_id用於保存它是哪個教室的哪個小節的座位。我們在這裡稱之為seattable,初始為0條資料。
3.再建立一個網頁用來顯示一個classroom_time的座位表
4.每個座位應該對應一個二維碼, url傳值這個教室id,行列數,同時查看座位表應該有一個單獨的二維碼,不用登入直接顯示學生選座情況。
我們學生掃碼功能主要是對seattable表資料進行操作。
學生掃碼功能實現
1.透過url取得這個座位的基本資訊
透過掃碼所傳入的url,取得這個座位的行列號,classroom_id,也要透過靜態方法取得student_id和第幾小節數,小節數這裡稱為time。同時透過第幾小節和教室id查詢唯一一個classroom_time.
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 ($time11) { 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語句。
$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.如果這個學生簽過到
兩種情況,這個座位原來有人,這個座位原來沒人
有人的話先看這個人是不是他自己,是的話直接提示並返回學生主頁,不是的話得到這個座位原來學生的一條數據,通知原來的人有人佔了座位了,將原來的人的行列數據清除,並將這個學生行列數填上。
沒人直接將行列數填上。
$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')); }
舉例:自己(我叫張三)原來掃過碼並且掃碼的座位上有人。
掃碼前
掃碼後
因為後續會用到對行列排序,為了讓清空的行列數不顯示名字,我們這裡將行列重置為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 ($time11) { 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。
总结
写功能前确定好思路很重要,不然可能会测出漏洞重新写。