3.3 数据库登录和json规范返回

第 23 节 / 共 46 节 课程:ThinkPHP
首先登陆的数据库表是user,它的结构是:
username是主键,也是登陆用的用户名
password是密码
role是角色,0是普通学生,9是管理员,4是教师
nickname是昵称,可以重复
create_date是用户注册的日期
is_valid用户是否有效,1为有效,0无效

首先是use的模型,找到app/model,新建User.php,最好是用以前Users.php修改:
<?php
namespace app\model;
use think\Model;
// 模型类必须继承think\Model类
class User extends Model {
    // 如果主键名不为id,则必须手工指定主键名称
    protected $pk = 'username';
    // 为当前模型指定表名称,如果类名与表名一致,则可以不用指定
    protected $name = 'user';
   
    // 再定义一个查询所有用户表数据的方法,返回所有必须使用select方法
    public function findAll() {
        $users = $this->select();
        return $users;
    }
    public function findPwdByUsername($username) {
        // where条件查询,find()获取单条数据
        $user = $this->where('username', $username)->find();
        
        // 如果查到用户,返回密码,否则返回null
        return $user ? $user->password : null;
    }
    public function findByUsername($username) {
        $user = $this->where('username', $username)->find();
        return $user;   // 直接以关联数组返回一行数据
    }
}

然后是app/controller/Demo.php的login函数(原来的logi函数需要改名):
   public function login(){
        //取出post请求发过来的数据
        $data = input('post.');
        //新建一个user对象,用于数据库操作
        $user = new \app\model\User();
        //根据发过来的用户名查询数据库
        $user=$user->findByUsername($data['username']);
        //如果用户不存
        if($user==null){
            return  json([
                "code" => "400",
                "info" => "用户名不存在",
                "data" => null
            ]); 
           
        }
        //用户发过来的密码不等于数据库查出来的密码
        if($data['password'] != $user['password']){
              return  json([
                "code" => "401",
                "info" => "密码错误",
                "data" => null
            ]); 
        }
        //把密码改成空,防止发过去浏览器泄露密码
        $user['password']='';
        return json([
            "code" => "200",
            "info" => "",
            "data" => [
                "course" => "1",
                "user" => $user,
                "url" => "main"
            ]
        ]); 
    }


由于整个学习平台的后台返回形式都是code、info以及data的json格式,在ThinkPHP8中直接在控制器中返回一个关联数组即可,无需封装单独的类:
// ThinkPHP8控制器返回数组自动转为json
return json([
    "code" => "200",
    "info" => "",
    "data" => $data
]);
在ThinkPHP8控制器中,直接返回数组即可自动转为json,不必手动构建复杂json结构:
// Route::get('test', 'demo/test');
public function test()
{
    return json([
        "code" => "200",
        "info" => "测试",
        "data" => [
            "nickname" => "PHP",
            "username" => "username"
        ]
    ]);
}
使用PHP数组和json函数,重写上一节的登录。