项目需求:
本项目分为学员端和导师端
学员端功能:注册、登录、提交周报、请假、取消请假
导师端功能:登录、管理员创建导师帐号、查看周报、考勤汇总、清人汇总、学员检索
项目难点:
1,使用原生php实现MVC框架,并使用这个框架编写项目代码
2,如何使用php根据不同设备提供不同页面
3,兼容上个版本的数据库数据
4,导师端的三个汇总功能的数据库事务逻辑
5,如何得到'未提交'的状态,此状态在正常情况下不会存在于数据库中
解决方案:
1:主要使用require、spl_autoloadregister()、REQUEST_URI、cal_use_func_array()、sql_autoload_register()五个方法实现MVC框架。
1)在项目根目录中的index.php中设置字符格式、时区、启用session,并require_once在system/core/ 目录中的CallFunction.php
2)在CallFunction.php中,使用$_SERVER['REQUEST_URI']获取到URI字符串,通过explode()将字符串分割成数组,根据规定的格式,取出其中代表类名、方法和参数的值
3)使用sql_autoload_register()自动加载 /application/controller/ 目录下的class文件
4)使用call_user_func_array()执行对应的方法
5)自定义框架自带方法,通过 ob_end_clean() 和 require_once 加载 /application/view/ 目录下的html文件。
2:在框架中定义父类,controller中的所有类都必须继承该父类,在父类中定义构造方法,通过
HTTP_USER_AGENT来判断设备类型,并赋值给父类的$terminal属性。然后再父类中定义view($view)方法,通
过
require_once "./application/views/$this->class/$this->terminal/" . $view . '.php';
加载视图
3:简单粗暴,去查看了上个版本的代码,上个版本怎么往数据库存的,这个版本还怎么存。顺便吐槽一句,上个版本是连着html标签和部分无用信息一起存进去的,搞的现在取出来之后还得再切割字符串...
4:前期没能足够重视,基本就是纯靠想所有情况,然后一边测一边改SQL语句
5:在Admin类中定义attend()方法,使用for循环遍历从项目开始至今的所有周数,取出改周所有没提交周报的用户,然后编写SQL语句将其'未提交'的状态INSERT到周报表中。每次管理员通过Admin::login()登录成功后,都会在Admin::login()中调用attend()方法。
总结:
这次项目可以说是第一次自己一个人完成一个项目的后台,并且第一次尝试搭建MVC框架,在部署上也顺带学
习到了部分nginx配置知识,可以说是受益颇多。
同时也充分认识到自己在架构能力上的不足:
首先是框架,一开始只是完成了一个通过URL调用方法的MVC的雏形,后面是根据功能的需求和测试结果,逐
步添加和完善功能的,部分导致部分代码需要重构。但是这个过程也加深了自己对框架功能的理解。
再就是在数据库方面,拿到需求后,没有先理清各部分功能之间的关系和影响,而是直接一个一个的写功能,导
致各功能之间对数据库的读取和写入存在冲突,功能做出来了,但是却花费了大量时间去测试和改SQL。