# (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部分每一行都是用心敲出来的,
- 序言
- API开发实例
- 群文件,给萌码新的福利
- 一、登录(新增视频演示:第五节)
- (1)新建数据库
- (2)模板制作
- (3)MVC架构
- (4)config配置
- (5)功能实现及源码
- (6)URL优化
- (7)快速布置源码在电脑上
- 二、留言板
- (1)新建数据库
- (2)前端制作
- (3)MVC处理数据
- (4)功能实现及源码
- 三、API接口的调用
- (1)自制109新闻API
- (2)聊天机器人API
- (3)curl原理
- 四、文件上传
- (1)官网例子讲解
- (2)上传显示进度条
- 五、分页
- (1)简单分页
- (2)细说分页
- 六、增删改查(软删除)
- (1)单张表CURD
- (2)关联CURD
- (一)一对一关联CURD
- (二)一对多关联CURD
- (三)多对多关联CURD
- 七、二维码生成
- 八、Ajax调用
- 九、ico
- 十一、ckeditor富文本编辑器
- 十二、3分钟搭建服务器
- 十三、微信公众号开发
- (1)填写服务器配置
- 十四、自定义标签alert
- 十五、遍历二级菜单
- 十六、权限管理
- 十七、Thinkcmf分页样式优化
- 番外篇、红烧鲫鱼
- 第二期更新公告