序文
この機能の目的は、生徒がコードをスキャンすることです。別機能として座席を選択する 別機能を実装しました 教師はログインせずに生徒の選択した座席を確認できます 教師はログインしてコースをバインドし、このコースの生徒のチェックイン数をカウントすることもできます教師は面倒な登録やログインを行わずにいくつかの機能を実装したり、本製品を使用してコースを作成してバインドし、生徒のサインイン数をカウントすることもできます。これにより、この製品に対する教師のエクスペリエンスが大幅に向上し、ユーザーの総数が効果的に増加します。
この記事では、学生コード スキャン機能の実装について具体的に説明します。その他の詳細については詳しく説明しません。
事前準備
1. まず、各教室の各セクションのテーブル (ここでは classroom_time
と呼ばれます) を作成します。これらのデータは、教室のフィールドを追加するときに自動的に生成されます。11 かかります。例として 1 日あたりのセクション数を増やすと、図に示すように、各教室で 11 個の Classroom_time フィールドが生成されます。
2. 各座席は、行番号と列番号を保存するフィールドにも保存する必要があり、学生 ID と対応するclassroom_time_id は、どの教室とセクションに属しているかを保存するために使用されます。シート。ここではこれをseattableと呼びますが、最初はデータが0個です。
3. 教室時間の座席表を表示する Web ページを作成します。
4. 各座席は QR コードに対応する必要があり、URL が渡されます。教室IDと列数、座席表を表示する際には別途QRコードが必要です、ログインせずに生徒の座席選択を直接表示することができます。
学生コード スキャン機能は、主に着席テーブルのデータを操作するために使用されます。
学生コードスキャン機能の実装
1. URL からこの座席の基本情報を取得します
渡された URL からこの座席の行番号、classroom_id、および行番号を取得しますQR コードをスキャンして、静的メソッドで 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 ; }
ここでセクションを取得し、同時に判断します。11番目のセクションを超えている場合は、授業時間が残っていることを意味します終了し、学生ホームページに戻ります。
2. 教室時間 ID と学生 ID を使用して、着席テーブルにこのフィールドがあるかどうかを確認します。ここでは $seattable
として定義されています。# があるかどうかを確認する必要があります。 ##$seattableif ステートメントを実行します。
$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 データが存在し、教師がサインイン番号に 1 を追加するのに役立ちます。コースを縛るとき。
最初に書いたアイデアは、新しいデータを作成し、行数と列数を設定し、学生証をクリアするというものでした。これにより、他の人に自分の地位を奪われてしまいます。再度コードをスキャンしても、コードが正しいかどうか判断できません。 2 回目のスキャンまたは最初のスキャンであるため、生徒のサインインの総数を正確に数えることができません。3. この学生がサインインしている場合は、
student_id の行と列の値を変更するというアイデアを確立することが、この機能を実現するための鍵です。
状況が 2 つあります。この席は元々占有されている、この席は元々空いています
誰かがいる場合は、まずその人が本人であるかどうかを確認します。したがって、直接プロンプトを表示して学生のホームページに戻ります。そうでない場合は、この席の元の学生に関するデータを取得し、誰かがその席を占有していることを元の人物に通知し、元の人の行データをクリアして、学生の行データを記入します。行番号。
行数と列数を直接入力する人はいません。
$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')); }例: 私 (私の名前は Zhang San) が最初にコードをスキャンしましたが、コードをスキャンした席には誰かが座っていました。
QR コードをスキャンする前に
QR コードをスキャンした後
// 如果这个学生原来没选过座位 $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。
总结
写功能前确定好思路很重要,不然可能会测出漏洞重新写。