当前位置: 首页 > news >正文

首页查询功能的一次实现过程

本次的目的是完成学生选课系统的首页查询功能的实现,

具体要求:

1.在首页显示当前周的课表。
2.显示所有的学生每节课的有无情况。

效果图如下

clipboard.png

初始思路:

1.查询当前学期的所有课程
2.查询本周,周几,第几节课的课程id
3.通过课程id查询有那些学生选择了该课程
4.将查询到的学生id设为有课,其余为无课,并将数据传输到V层

依照以上方法,实现的时候才发现很复杂,而且由于多层查询需要用循环套循环的方法,
所以最后代码不但很长,而且出了一点错误就很难改过来,把自己绕了进去

   // 获取数据库信息,并传到V层显示。
    public function index() {

        // 查询当前学期
        $term = Term::where('state',1)->find();
        // var_dump($term->id);
        
        // 获取当前学期的所有课程
        $courseId = Course::where('term_id',$term->id)->column('id');
        // var_dump($courseId);
        
        // 获取本周的课程
        $classTime = ClassTime::where(['course_id' => $courseId])->select();
        // var_dump($classTime);
        // var_dump(strtotime(date('Y-m-d')));
        // var_dump(strtotime($term[0]['start_time']));
        $week = intval((strtotime(date('Y-m-d')) - strtotime($term->start_time))/7/86400);
        // var_dump($week);
        $classTime = $classTime->where('week',$week);
        // var_dump($classTime);
        
        $studentName = Student::where('state',1)->column('name'); 

        // var_dump($studentName);
        

        for ($j=0; $j < 7; $j++) { 
            for ($i=0; $i < 5; $i++) {

                $num = count($studentName);
                // var_dump($studentName[0]);
                for ($k=0; $k < $num; $k++) { 
                        $home = new Home;
                        $home->day = $j+1;
                        $home->period = $i+1;
                        $home->name = $studentName[$k];
                        $home->state = 0;
                        
                    if (!is_null($classTime)) {

                        $classTime = $classTime->where('day',$j+1);
                        $classTime = $classTime->where('period',$i+1);
                        // var_dump($classTime);
                         
                        // 获取学生Id
                        $stuCoursId = StudentCourses::where(['courses_id' => $classTime->column('course_id')])->column('student_id');

                        $stuState = Student::where(['id' => $stuCoursId])->column('state');
                            // var_dump($home);
                            // var_dump($stuState[0]);
                            if (!is_null($stuCoursId) && in_array(1, $stuState)) {
                                $stuName = Student::where(['id' => $stuCoursId],['state',1])->column('name');
                                // var_dump($stuName);
                                // $home->save();
                                if (!is_null($home->where(['name' => $stuName])->find())) {
                                    $home->where(['name' => $stuName])->find()->state = 1;
                                }
                                
                            }

                    }

                    $lists[$j][$i][$k] = $home;

                }
                // var_dump($home);

            }
            
           // var_dump($home);
        }
        $week = ['周一','周二','周三','周四','周五','周六','周日'];
        var_dump($lists[0][0][0]);
        // var_dump($list);
        $this->assign('week',$week);
        $this->assign('lists',$lists);
        return $this->fetch();
    }

这部分代码虽然实现了功能,但是明显不是老师要得效果,主要是没有面向对象的思想,
因此,后面老师讲了一种面向对象的思想

老师讲的思路:

1.首先设立三个数组:周几,第几节,学生。这三个数组分别有一个name一个id属性
2.将数组数据传输到V层,并显示
3.利用这三项数据,调用一个getHasCourse的方法,直接查询学生是否有课,并返回true或faluse

按照以上思路,发现事情变得很简单。

首先,C层的查询并建立两个关于周次和节次的数组

    public function index() {
        // 先查询非冻结状态的学生
        $student = Student::where('state',1)->select();
        $this->assign('students',$student);
        // 设置循环显示的周次
        $day = array(array('id'=>'1','name'=>'周一'),
                    array('id'=>'2','name'=>'周二'),
                    array('id'=>'3','name'=>'周三'),
                    array('id'=>'4','name'=>'周四'),
                    array('id'=>'5','name'=>'周五'),
                    array('id'=>'6','name'=>'周六'),
                    array('id'=>'7','name'=>'周日')
                );
        // 设置节次,并设置好id,方便与数据库中的数据对接
        $period = array(array('id'=>'1','name'=>'第一节'),
                    array('id'=>'2','name'=>'第二节'),
                    array('id'=>'3','name'=>'第三节'),
                    array('id'=>'4','name'=>'第四节'),
                    array('id'=>'5','name'=>'第五节')
                );
        $this->assign('days',$day);
        $this->assign('periods',$period);
        return $this->fetch();
    }

然后,V层显示数据

{extend name="index" /}
{block name="content"}
  <div class="row">
    <div class="col-md-offset-1 col-md-10">
      <table class="table table-bordered">
        <tr class="info">
          <td>周次</td>
          {volist name="periods" id="period"}
          <td>{$period.name}</td>
          {/volist}
        </tr>
        {volist name="days" id="day"}
        <tr>
          <td class="info">{$day.name}</td>
          {volist name="periods" id="period"}
          <td>
            {volist name="students" id="student"}
            {$student.name}&nbsp{eq name="$student->getHasCourse($student.id,$day.id,$period.id)" value="true"}<label style="color: red;">有课</label>{else /}<lable>无课{/eq}</label>
            <br />
            {/volist}
          </td>
          {/volist}
        </tr>
        {/volist}
      </table>
    </div>
  </div>
{/block}

其中的eq里面就是调用的getHasCourse方法,该方法写在M层里面,传入的参数为学生id,周次id,节次id

最后,M层的方法:

    public function getHasCourse($studentId,$dayId,$periodId) {

        // 查询当前学期,找到开始时间
        $term = Term::where('state',1)->find();
        // 计算现在是第几周
        $week = intval((strtotime(date('Y-m-d')) - strtotime($term->start_time))/7/24/60/60)+1;
        // 查询本周的课程
        $courseId = ClassTime::where('day',$dayId)->where('period',$periodId)->where('week',$week)->column('course_id');
        // 查询当前学生在当前周次,节次是否有课。
        $count = count(StudentCourses::where(['courses_id'=>$courseId])->where('student_id',$studentId)->find());
        // 有课则大于0;
        if ($count > 0) {
            return 'true';
        } else {
            return 'faluse';
        }

    }

经过这么写,发现思路很清晰,每层的功能也能很明白的了解到,而且代码也并不复杂,甚至一个for循环都没有用到。

总结

这次的首页查询功能,让我更多的了解到了面向对象的思想,但是老师讲出来之后明白了和自己本身就有的还是不一样的。
思想转变不是那么的容易,还需要多加练习。

相关文章:

  • 关于LightMapping和NavMesh烘焙的动态载入
  • struts2之example
  • 前嗅ForeSpider教程:采集58同城
  • 配置与管理Apache服务器
  • Go标准容器之List
  • 关于RFC
  • MongoDB官方C#驱动中查询条件Query用法
  • 分享我在学习web前端路上踩过的一些坑
  • MyEclipse10安装PyDev插件
  • Python3获取新浪微博内容乱码问题
  • boost::thread类
  • 一种基于WebRTC与UDP组播的一对多远程控制桌面的实现思路
  • rational clearcase 提交活动注意
  • ELK批量删除索引
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • $translatePartialLoader加载失败及解决方式
  • 【技术性】Search知识
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • exports和module.exports
  • Yii源码解读-服务定位器(Service Locator)
  • 写给高年级小学生看的《Bash 指南》
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​马来语翻译中文去哪比较好?
  • ​批处理文件中的errorlevel用法
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (7)STL算法之交换赋值
  • (C++17) std算法之执行策略 execution
  • (C++20) consteval立即函数
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (二)WCF的Binding模型
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (三)模仿学习-Action数据的模仿
  • (转载)hibernate缓存
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Framework 4.6.2改进了WPF和安全性
  • .net反编译工具
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [383] 赎金信 js
  • [Android 13]Input系列--获取触摸窗口
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)
  • [hdu 3746] Cyclic Nacklace [kmp]
  • [LeetCode]-Pascal's Triangle III 杨辉三角问题
  • [MySQL]视图索引以及连接查询案列
  • [NOI2005]月下柠檬树[计算几何(simpson)]
  • [Power Query] 分组依据
  • [Redis]Redis的数据类型
  • [Ruby on Rails系列]4、专题:Rails应用的国际化[i18n]