머리말
이 기능의 목적은 학생들이 코드를 스캔하여 좌석을 선택하는 기능을 교사가 볼 수 있는 별도의 기능으로 구현하는 것입니다. 학생은 로그인하지 않고 좌석을 선택했습니다. 이 경우 교사는 해당 코스에 로그인하여 학생이 이 코스에 로그인한 횟수를 계산할 수 있습니다. 교사는 번거로운 등록 및 로그인 없이 일부 기능을 구현할 수도 있습니다. 또한 이 제품을 사용하여 강좌를 생성하고 바인딩하여 학생 로그인 수를 계산할 수도 있습니다. 이는 이 제품에 대한 교사의 경험을 크게 증가시키고 총 사용자 수를 효과적으로 늘릴 것입니다.
이 문서에서는 학생 코드 스캔 기능 구현에 대해 구체적으로 설명하며 기타 세부 사항은 자세히 논의하지 않습니다.
준비
1. 먼저 각 교실의 각 섹션에 대해 classroom_time
이라는 테이블을 만듭니다. 이 데이터는 하루에 11개의 섹션을 기준으로 교실 필드를 추가할 때 자동으로 생성됩니다. 그림에 표시된 것처럼 각 강의실은 11개의 강의실_시간 필드를 생성합니다. 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
2. 각 좌석은 행과 열 번호를 저장하기 위해 필드에 저장되어야 하며, 학생 ID와 해당 강의실_시간_id는 어느 강의실에 속하는지 저장하는 데 사용됩니다. 여기서는 이를 Seattable이라고 부르는데, 처음에는 0개의 데이터입니다.3. 교실_시간 좌석 배치도를 표시하는 다른 웹페이지를 생성하세요
4. 각 좌석은 QR 코드와 일치해야 합니다. URL은 강의실 ID와 행 및 행 수를 전달합니다. 동시에 좌석표를 볼 때 별도의 QR 코드가 있어야 합니다. . 로그인 없이 바로 학생들을 볼 수 있습니다. 좌석 선택.
우리 학생들 코드 스캔 기능은 주로 좌석 테이블 데이터를 조작하는 데 사용됩니다.
학생 코드 스캔 기능 구현
1. URL을 통해 이 좌석의 기본 정보를 얻습니다.
QR 코드를 스캔하여 전달된 URL을 통해 이 좌석의 행 번호와 강의실_ID를 획득하고, Student_id와 섹션 번호도 획득합니다. 정적 방법을 통해 측정 횟수를 여기서는 시간이라고 합니다. 동시에 섹션과 강의실 ID를 통해 유일한 강의실_시간을 쿼리합니다.
$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'));~~~~여기서 섹션을 가져와 동시에 판단하면 11번째 섹션을 초과하면 수업 시간이 종료되어 다시 돌아옵니다. 학생 홈페이지. 2.classroom_time ID와 학생 ID를 사용하여 Seattable 테이블에 이 필드가 있는지 확인합니다. 여기에는
$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')); }다음은 학생이 교실에 들어갈 때 데이터 조각이 있을 것입니다. 그가 자리를 선택할 때 다른 사람이 자리에 앉아 번호를 지우면 그는 행 수를 채울 것입니다. 행과 행의 경우 자리를 마련하지 않은 것과 동일하지만 교실에는 여전히 학생 ID 데이터가 존재하므로 교사가 강좌를 바인딩할 때 로그인 번호에 하나를 추가하는 데 도움이 됩니다. 🎜제가 원래 쓴 아이디어는 새로운 데이터를 생성하고 행과 열의 수를 설정하고 학생 ID를 지우는 것이었습니다. 이렇게 하면 다른 사람이 코드를 다시 스캔할 때 두 번째인지 판단할 수 없습니다. 스캔 또는 첫 번째 스캔으로 인해 총 학생 로그인 수를 정확하게 계산할 수 없습니다. 🎜student_id의 행과 열 값을 변경한다는 아이디어를 확립하는 것이 이 기능을 구현하는 열쇠입니다. 🎜🎜3. 학생이 로그인한 경우🎜 2번의 경우 이 자리가 비어있는 것으로 판명됩니다.🎜누군가가 있으면 먼저 그 사람이 본인인지 확인합니다. 자리에 있던 원래 학생의 데이터 중 누군가가 자리에 앉았음을 원래 사람에게 알리고 원래 사람의 행 데이터를 지우고 학생의 행 데이터를 채웁니다. 행 번호. 🎜 행과 열의 수를 직접 입력하는 사람은 없습니다. 🎜
// 如果这个学生原来没选过座位 $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')); } }🎜예: 나(내 이름은 Zhang San)가 원래 코드를 스캔했는데 내가 코드를 스캔한 자리에 누군가가 있었습니다. 🎜QR코드 스캔 전🎜🎜🎜QR코드 스캔 후🎜🎜🎜🎜나중에 행과 행이 정렬되기 때문에 지워진 행과 행에 이름이 표시되는 것을 방지하기 위해 여기에서 행과 행을 100,100으로 재설정합니다. (행과 행의 최대값) 🎜🎜4. 학생이 로그인하지 않은 경우 좌석이 비어 있는지 먼저 확인합니다. 좌석에 사람이 있으면 먼저 알리고 행 번호를 지웁니다. Seattable에 로그인하지 않은 경우 해당 Student_id 및 Classroom_time_id 데이터가 없습니다. 이때 새로운 $seattable을 직접 생성하고 해당 Classroom->status인 경우 Student_id와 행 및 열 번호를 입력합니다. $seattable은 1입니다(상태 1은 강좌에 바인딩되었음을 의미하고 상태 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。
总结
写功能前确定好思路很重要,不然可能会测出漏洞重新写。