做个用户管理系统(21)——用户登录状态(一)实体的应用【20201208】

发表于 2020-12-08 11:44:13
阅读 56

介绍

介绍

今天福哥要带着大家做一些系统级别的调整,我们带着一个问题去了解这个系统级别的调整需要做哪些事情,今天的课程有一定难度,大家要仔细听了~~

首先,我们需要在每个用户网页上面判断当前浏览器有没有用户已经登录过了,如果有登录则显示登录才能看到的内容,否则就要显示未登录状态的信息。那么如果判断登录这个逻辑在每个页面都写一遍的话,想一想都比较恐怖,而且如果要改的话需要在每个用户网页控制器里都改一遍,简直要疯了。

为了解决这个问题,福哥需要在TFPHP框架里面的控制器基础对象和TFUMS系统的应用控制器之间插入一个中间层控制器,在这个层里面处理每个网页都需要处理的逻辑。

其次,我们通过中间层控制器解决了公共逻辑的问题会发现另外一个问题。虽然使用TFDO将数据表user的全部字段查询出来可以作为登录状态的信息使用,但是有些字段是不合适展示出来的(比如:密码字段),为了解决这个问题,需要建立一个用于存储数据的结构对象,将从数据表里查询出来的字段有用的部分存放进这个结构对象里面。

这个结构对象我们称之为实体对象,它可以存储数据表里的数据,编写代码的时候还可以又自动补全,是非常方便的。

中间层SystemPageController

福哥建立了一个页面控制器的中间层,这个中间层作为TFUMS系统的所有网页的基础对象,程序文件存放在WEB-INF/Classes/SystemPageController.inc.php。

class SystemPageController extends TFController{
    protected array $loginStatus;

    protected function process(){
        $cookie = $this->tfphp->getRequest()->cookie;
        $user = new user($this->tfphp);
        $this->loginStatus = array();
        $id = $cookie->get("tfums_id");
        $token = $cookie->get("tfums_token");
        $idInToken = $user->getIDByToken($token);
        if($id == $idInToken){
            $loginStatus = new loginStatus();
            $user->fillEntityByTable($loginStatus, "user", array($id));
            $this->loginStatus = $loginStatus->toArray();
        }

        // user process
        $this->user_process();
    }

    protected function user_process(){

    }
}

中间层SystemAPIController

福哥还建立了一个接口控制器的中间层,这个中间层作为TFUMS系统的所有接口的基础对象,程序文件存放在WEB-INF/Classes/SystemAPIController.inc.php。

class SystemAPIController extends TFController{
    protected array $loginStatus;

    protected function process(){
        $cookie = $this->tfphp->getRequest()->cookie;
        $user = new user($this->tfphp);
        $this->loginStatus = array();
        $id = $cookie->get("tfums_id");
        $token = $cookie->get("tfums_token");
        $idInToken = $user->getIDByToken($token);
        if($id == $idInToken){
            $loginStatus = new loginStatus();
            $user->fillEntityByTable($loginStatus, "user", array($id));
            $this->loginStatus = $loginStatus->toArray();
        }

        // user process
        $this->user_process();
    }

    protected function user_process(){

    }
}

实体对象

loginStatus

class loginStatus extends TFEntity{
    public int $userID;
    public string $userName;
    public string $createDT;
    public ?string $lastLoginDT;
}

user

class user extends TFEntity{
    public int $userID;
    public string $passwd;
    public string $createDT;
    public ?string $lastLoginDT;
    public int $userFlag;
    public int $userState;
    public ?string $userEmail;
    public string $userName;
}

控制器

status

class APIController extends SystemAPIController{
    protected function user_process(){

        return $this->tfphp->getResponse()->responseJSON(200, $this->loginStatus);
    }
}

讲解

中间层SystemPageController

对象继承自TFController,自然也就和普通控制器一样只有一个process方法。我们这个中间层控制器是给其他普通控制器继承使用的,既然process方法被占用了,就定义一个user_process方法给其他普通控制器继承使用。

中间层SystemAPIController

对象继承自TFController,自然也就和普通控制器一样只有一个process方法。我们这个中间层控制器是给其他普通控制器继承使用的,既然process方法被占用了,就定义一个user_process方法给其他普通控制器继承使用。

实体对象

实体对象是用来将数据库里存放的数据取出来一部分拼凑成一个新的只有属性的结构对象,这个对象的作用单纯的就是用来存储数据的。

loginStatus

登录状态实体存放在WEB-INF/Entity/loginStatus.inc.php里面。

这个登录状态的数据只包括基本用户信息。

user

用户实体存放在WEB-INF/Entity/user.inc.php里面。

这是全部数据表user的字段数据,一般情况下,只在内部使用。

控制器

status

登录状态控制器存放在WEB-INF/Controller/api/member/status.inc.php里面。

因为在中间层控制器里面已经将登录状态的信息取出来了,我们只需要在这个接口控制器里面把这个数组显示出来即可。

f86f966332fef0e1.jpg

总结

福哥今天带着童鞋们完成了用户登录状态的接口部分的功能。为了解决每个控制器里面都会去检查用户登录状态这个操作的问题,我们建立了中间层控制器,在中间层控制器里面处理公共的逻辑。为了解决应用控制器的数据和数据表的数据的对应问题,我们建立了实体结构对象,避免了敏感字段泄漏出去的问题。

下一课,福哥将继续完成用户登录状态的前端展示的功能,这时候会用到AJAX技术向用户展示登录状态。