# (3)MVC架构 #### 1. 命名空间 在序言中就已经提到MVC架构,<http://www.kancloud.cn/manual/thinkphp5/122950> 官方是这么解释的,但是这一切都必须建立在命名空间的基础之上,这是官方解释的命名空间http://www.kancloud.cn/manual/thinkphp5/118014 ,点到为止,不清楚可以自行脑补。 #### 2. 新建控制器接收数据 在上一节中已经新建好了两个控制器,Admin.php跟Login.php,这里就继续在上面扩展: 下面是Login.php代码: ``` <?php namespace app\index\controller; use think\Input; use think\Controller; use Captcha; use think\View; class Login extends Controller { public function login(){ return $this->fetch(); } public function logining() { $name = input('request.name'); $password = input('request.password'); $data = input('request.captcha'); // dump($data); if(!captcha_check($data)){ //验证失败 return $this->error("验证码错误","Login/login"); }; // $check=\app\index\model\Admin::login($name, $password); // if ($check) { header(strtolower("location:". config("web") . "index/admin/admin")); exit(); // }else{ // return $this->error("用户名或密码错误","Login/login"); //} } } ``` 这个是我提前写好一次性复制上来的,看到这个config("web"),所以还需要在配置文件中新增一条: ``` return [ "web_root" => "/tp5/public/static/", "web" => "/tp5/public/index.php/", ]; ``` #### 3. 新建模型处理数据并返回 上面的代码我是把入库验证部分注释掉了,直接进入后台。 接下来就是MVC下面的M模型部分了, - 在index模块下面新建一个model文件夹,再在model下面新建一个Admin.php文件(注意的是先有这个然后才有前面的代码 $check=\\app\\index\\model\\Admin::login($name, $password);不然就会报错),代码: ``` <?php namespace app\index\model; use think\Input; class Admin extends \think\Model { /*登录验证*/ public static function login($name, $password) { $where['admin_name'] = $name; $where['admin_password'] = md5($password); $user=Admin::where($where)->find(); if ($user) { unset($user["password"]); session("ext_user", $user); return true; }else{ return false; } } } ``` 将上面的Login.php控制器里面的代码更新如下(就可以真正进入后台了): ``` <?php namespace app\index\controller; use think\Input; use think\Controller; use Captcha; use think\View; class Login extends Controller { public function login(){ return $this->fetch(); } public function logining() { $name = input('request.name'); $password = input('request.password'); $data = input('request.captcha'); // trace("########################################"); // trace($name); // trace($password); // trace($data); // trace("########################################"); if(!captcha_check($data)){ //验证失败 return $this->error("验证码错误","Login/login"); }; $check=\app\index\model\Admin::login($name, $password); if ($check) { header(strtolower("location:". config("web") . "index/admin/index")); exit(); }else{ return $this->error("用户名或密码错误","Login/login"); } } } ``` 上面的那个trace注释部分可以自行删除,主要是想提一下这种调试: 相比dump,这种调试更直观,直接在runtime/log日志文件里面就可以看到调试的结果。加那么多#号是为了在日志文件中更明显。特别是在一个弹出框里面输入内容的时候,你用dump根本看不到输入的内容,但是用trace接收输入值,就能在日志中看到。 下面是我在登录界面随便输入的用户名验证码跟密码三个变量,由于错误的话会立马跳转,用dump看不到刚刚输入了什么,trace也能看到。 ``` [ info ] [ LOG ] INIT File [ log ] ######################################## [ log ] 121212 [ log ] 122121212 [ log ] 12121212 [ log ] ######################################## ``` 还有一个退出登录,一个session管理,一个修改密码,需要做,今晚更新上来,包括后台的页面样式。做好过后,将登陆部分全部开放,源码托管到github。 #### 4. 退出登录。 - 在controller/Admin.php中新增代码: ``` /*退出登录*/ public function logout(){ \app\index\model\Admin::logout(); if (!session('?ext_user')) { header(strtolower("location: /login")); exit(); } return NULL; } ``` - \\app\\index\\model\\Admin::logout();看到这段代码,很自然的就应该去\\app\\index\\model\\Admin.php里面加一个logout方法来清空session记录, ``` /*退出登录*/ public static function logout(){ session("ext_user", NULL); return ; } ``` 到这里,只是清空了session,阻止未登录就访问到后台,你还要修改一下admin方法如下: ``` public function admin() { if (!session('?ext_user')) { header(strtolower("location: /login")); exit(); } return $this->fetch(); } ``` 这样你再访问http://thinkphp.com/admin 就会自动跳转到登录页面,由于配置文件config.php里面设置了session: ``` 'session' => [ 'auto_start' => true, 'name' => 'login@', 'expire' => 1800, /*时间长度*/ ], ``` (所以你不退出,等半个小时,也会自动退出的,时间可以自行设定,别忘了修改时间的时候也去admin.html页面去修改一下,这两个时间是相对应的,作用就是session到期,页面自动刷新一次,退出登录) #### 5.修改密码 - 修改密码页面也不能在未登录的情况下访问,所以,改: ``` /*修改密码页面*/ public function changepsw() { if (!session('?ext_user')) { header(strtolower("location: /login")); exit(); } return $this->fetch(); } ``` - 由于修改密码页面本质是一个表单提交,提交的时候出发一个事件changepassword(); controller/Admin.php新增 ``` /*修改密码*/ public function changepassword(){ $oldpassword = md5(input('request.oldpassword')); $newpassword = input('request.newpassword'); $newpassword1 = input('request.newpassword1'); $name=session('ext_user')['admin_name']; $changepsw=\app\index\model\Admin::search($name); // dump($changepsw['admin_password']); $password=$changepsw['admin_password']; if ($password==$oldpassword ) { if ($newpassword==$newpassword1) { $updatepassword=\app\index\model\Admin::updatepassword($name,$newpassword); if ($updatepassword) { session("ext_user", NULL); return $this->success('修改成功,请重新登录', ''.config("web_root").'/index/login/login'); }else{ return $this->error("修改密码失败"); } }else{ return $this->error("两次输入密码不一致"); } }else{ return $this->error("原密码输入错误"); } } ``` 这里是不是新增了一个方法,我又去配置里加一条路由。 ``` "changepassword"=>"index/admin/changepassword", //修改密码 ``` 代码是一行一行敲出来的,希望新码萌的你也能细心看完,最好跟着练习。 - 看到上面的 \\app\\index\\model\\Admin::search($name); \\app\\index\\model\\Admin::updatepassword($name,$newpassword); 这里要在\\app\\index\\model\\Admin.php下面新增两个方法:search跟updatepassword,注意,这里是模型里面: ``` /*查询一条数据*/ public static function search($name){ $where['admin_name'] = $name; $user=Admin::where($where)->find(); return $user; } /*更改用户密码*/ public static function updatepassword($name,$newpassword){ $where['admin_name'] = $name; $user=Admin::where($where)->update(['admin_password' => md5($newpassword)]); if ($user) { return true; }else{ return false; } } ``` 到这里,基本的功能就算完成了!接下来就是无脑的后台页面的设计,我写的静态页面,也可以看一下,css部分每一行都是用心敲出来的,