使用TPP做一个简单的登录系统


#PHP#


2013-12-13

TPP是我最近写的一个简单的PHP框架,本文使用TPP做一个简单的登录系统。 TPP框架项目地址:https://github.com/letiantian/TPP

在mysql5中的test库下建立表users

CREATE  TABLE `test`.`users` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(45) NOT NULL ,
  `email` VARCHAR(45) NOT NULL ,
  `passwd` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `name_UNIQUE` (`name` ASC) )
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;

主键是id字段,name字段内容具有唯一性约束。

添加一组数据,用户名为a,email为aaa@163.com,密码aaa。图个方便,密码明文存储。

将TPP放在/var/www中,TPP的配置不变。

创建文件./Userlib/userstate.php:

<?php

class userstate extends TPP{

    public function is_login() {
        if (isset($_SESSION['user_name'])) {
            return true;
        }
        else {
            return false;
        }
    }

    public function login($user_name, $user_passwd) {
        $db = $this->tpp_loader()->load_core_class('Medoo');
        $db->connect([
            'database_type' => 'mysql',
            'database_name' => 'test',
            'server' => 'localhost',
            'username' => 'root',
            'password' => '123']);
        $sql = "select * from users where name =".$db->quote($user_name)." and passwd=".$db->quote($user_passwd).";";
        //$datas = $db->select("users","*");
        $datas = $db->query($sql)->fetchAll();
       if(count($datas) >= 1) {
           $_SESSION['user_name'] = $user_name;
           return true;
       }
        else {
            return false;
        }
    }

    public function logout() {
        unset($_SESSION['user_name']);
        return true;
    }

    public function  get_user_name() {
        return $_SESSION['user_name'];
    }
}

session会在控制器文件中启动,所以该文件中也就没有session_start()。SESSION只存储用户名user_nameis_login()函数判断是否已经登录。login($user_name, $user_passwd)函数提供登录功能,登录成功则返回true,否则false。logout()函数提供退出功能。get_user_name()函数获取登录用户的名字。

创建文件./Controller/usermanager.php:

<?php

class usermanage extends TPP {

    public function __construct() {
        session_start();  
        $this->userstate = $this->tpp_loader()->load_user_class('userstate');
    }

    public function index() {
        if($this->userstate->is_login()) {
            header("Location: /usermanage/show");
        }
        else {
            header("Location: /usermanage/login");
        }
    }

    public function login() {
        if($this->userstate->is_login()) {
            $this->show();
            return;
        }
        if(isset($_POST['user_name']) && isset($_POST['user_passwd'])) {
            if ($this->userstate->login($_POST['user_name'], $_POST['user_passwd'])) {
                $this->show();
                return ;
            }
        }

        $render = $this->tpp_loader()->load_core_class('Render');
        $render->render('usermanage/header',['title'=>'登录']);
        $render->render('usermanage/login_body',['welcome'=>'登录']);
        $render->render('usermanage/footer', null);
        $render->show();

    }

    public function logout() {
        $this->userstate->logout();
        header("Location: /usermanage/index"); 
        exit;
    }

    public function show() {
        if($this->userstate->is_login() === false) {
            header("Location: /usermanage/login");
            return;
        }
        $render = $this->tpp_loader()->load_core_class('Render');
        $render->render('usermanage/header',['title'=>'主页']);
        $render->render('usermanage/show_body',['user_name'=>$this->userstate->get_user_name()]);
        $render->render('usermanage/footer', null);
        $render->show();
    }
} 

在构造函数中启动了session,同时生成./Userlib/userstate.php中userstate类的实例$this->userstate。login()函数为用户展示登录页。在登录成功后,跳转到show()生成的页面中。函数logout()提供退出功能。index()函数根据用户是否登录选择跳转到login()或者show()。

下面建立视图文件:

./Template/usermanager/header.php文件内容如下:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <title><?=$title;?></title>

    <script src="<?=$tpp_base_url();?>static/jquery-1.10.2.min.js" type="text/javascript"></script>
    <script src="<?=$tpp_base_url();?>static/bootstrap3/js/bootstrap.min.js" type="text/javascript"></script>
    <link href="<?=$tpp_base_url();?>static/bootstrap3/css/bootstrap.min.css" rel="stylesheet">

    <style>
        .user_margin {
            height: 20px;
            width: 100%;
        }
    </style>
</head>
<body>

由于TPP配置不变,$tpp_base_url()的结果是'/'。

./Template/usermanager/login_body.php文件内容如下:

<div class="row">
    <div class="col-md-4"></div>
    <div class="col-md-4 ">
        <div class="user_margin"></div>

        <h2><?=$welcome;?></h2>

        <div class="user_margin"></div>
        <form role="form" method="POST" action="/usermanage/login">
            <div class="form-group">
                <label>用户名</label>
                <input type="text" class="form-control"  placeholder="Enter name" name="user_name">
            </div>
            <div class="form-group">
                <label>密码</label>
                <input type="password" class="form-control" placeholder="Password" name="user_passwd">
            </div>
            <button type="submit" class="btn btn-default">登录</button>
        </form>
        <div class="user_margin"></div>
    </div>
    <div class="col-md-4"></div>
</div>

./Template/usermanager/show_body.php文件内容如下:

<div class="row">
    <div class="col-md-4"></div>
    <div class="col-md-4 ">
        <div class="user_margin"></div>

        <h2>你好,<?=$user_name;?></h2>

        <a class="btn" href="/usermanage/logout">注销</a>

    </div>
    <div class="col-md-4"></div>
</div>

./Template/usermanager/footer.php文件内容如下:

</body>
</html>

效果图

输入http://127.0.0.1/usermanage/,则跳转到登录页面http://127.0.0.1/usermanage/login,如下:

填写用户名a和密码aaa,进入show页面:


( 本文完 )