0

0

Thinkphp5.1趣味实现学生扫码选座功能

藏色散人

藏色散人

发布时间:2021-09-24 15:46:53

|

2494人浏览过

|

来源于segmentfault

转载

前言

本功能目的是将学生扫码选座功能作为一个单独的功能实现,教师不用登陆就可以实现查看学生选定座位情况,教师又可以登陆绑定课程,统计学生本课程签到次数。老师不需要繁琐的注册登陆就可以实现部分功能,也可以使用本产品建立课程进行绑定,从而利用产品统计学生签到次数。这将大大增加老师对本产品的体验,有效增加用户总数。
本文章具体讲学生扫码功能实现,其他不再具体讲述。

前期准备

1.首先将每个教室的每一小节建立一个表,这里称作classroom_time,这些数据应该在增加教室字段时自动生成,以每天11个小节为例,每个教室生成11个classroom_time字段,如图。
b7a30b57e6660a01d12343d4c7e2ca5.png

2.每个座位应该也要存入一个字段用于保存它的行列数,学生id和所对应的classroom_time_id用于保存它是哪个教室的哪个小节的座位。我们在这里称之为seattable,初始为0条数据。
d5a6bb3a43474f3af58937a1f016a8c.png

3.再建立一个网页用于显示一个classroom_time的座位表
120d06fb20d46730c6cf5032f4fe3eb.png

4.每个座位应该对应一个二维码,url传值这个教室id,行列数,同时查看座位表应该有一个单独的二维码,不用登录直接显示学生选座情况。
d26a4b4fe0b362939fe88b3dd495a9f.png

立即学习PHP免费学习笔记(深入)”;

我们学生扫码功能主要是对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 ($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语句。

Veggie AI
Veggie AI

Veggie AI 是一款利用AI技术生成可控视频的在线工具

下载
$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'));
    }

举例:自己(我叫张三)原来扫过码并且扫码的座位上有人。
扫码前
5fbddef38f8ca049f6c5468ea283072.png
扫码后
c35a6beebcd1fb037b6080893f7c5fa.png

因为后续会用到对行列排序,为了让清空的行列数不显示名字,我们这里将行列重置为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。

总结

写功能前确定好思路很重要,不然可能会测出漏洞重新写。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

0

2026.01.20

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

20

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

62

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

87

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

19

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

160

2026.01.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 8.5万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号