使用thinkphp实现用户注册登录功能

使用最新的thinkphp3.2.3版本,需要注意命名空间的使用。

均为后台验证,前台ajax验证未做处理。后续加上。。。

登录时,更新用户数据,登录ip和登录时间,以及登录次数+1,此实现方便不知是否合适,待验证。

源码地址:https://github.com/grh0812/thinkphp-login-register

创建数据库:

/*

Navicat MySQL Data Transfer

 

Source Server         : 本地连接

Source Server Version : 50617

Source Host           : localhost:3306

Source Database       : crm

 

Target Server Type    : MYSQL

Target Server Version : 50617

File Encoding         : 65001

 

Date: 2015-06-29 23:55:28

*/

 

SETFOREIGN_KEY_CHECKS=0;

 

-- ----------------------------

-- Table structure for think_users

-- ----------------------------

DROPTABLEIF EXISTS`think_users`;

CREATETABLE`think_users`(

  `userid`mediumint(8)unsignedNOT NULLAUTO_INCREMENTCOMMENT'用户id',

  `companyid`mediumint(8)unsignedNOT NULLCOMMENT'公司id',

  `pid`mediumint(8)NOT NULLCOMMENT'父id',

  `username`char(20)NOT NULLDEFAULT''COMMENT'用户名',

  `password`char(32)NOT NULLDEFAULT''COMMENT'密码',

  `nickname`char(20)NOT NULLDEFAULT''COMMENT'昵称',

  `regdate`int(10)unsignedNOT NULLCOMMENT'注册时间',

  `lastdate`int(10)unsignedNOT NULLCOMMENT'最后一次登录时间',

  `regip`char(15)NOT NULLDEFAULT''COMMENT'注册ip',

  `lastip`char(15)NOT NULLDEFAULT''COMMENT'最后一次登录ip',

  `loginnum`smallint(5)unsignedNOT NULLDEFAULT'0'COMMENT'登录次数',

  `email`char(32)NOT NULLDEFAULT''COMMENT'邮箱',

  `mobile`char(11)NOT NULLDEFAULT''COMMENT'手机号码',

  `islock`tinyint(1)unsignedNOT NULLDEFAULT'0'COMMENT'是否锁定',

  `vip`tinyint(1)unsignedNOT NULLDEFAULT'0'COMMENT'是否会员',

  `overduedate`int(10)unsignedNOT NULLCOMMENT'账户过期时间',

  `status`tinyint(1)unsignedNOT NULLDEFAULT'0'COMMENT'状态-用于软删除',

  PRIMARY KEY(`userid`),

  UNIQUEKEY`username`(`username`)USINGBTREE,

  KEY`email`(`email`)USINGBTREE

)ENGINE=MyISAMAUTO_INCREMENT=5DEFAULTCHARSET=utf8;

创建模型(自动验证,自动完成):

namespaceHomeModel;

useThinkModel;

 

classUsersModelextendsModel{

    /**

     * 自动验证

     * self::EXISTS_VALIDATE 或者0 存在字段就验证(默认)

     * self::MUST_VALIDATE 或者1 必须验证

     * self::VALUE_VALIDATE或者2 值不为空的时候验证

     */

    protected$_validate=array(

        array('nickname','require','昵称不能为空!'),//默认情况下用正则进行验证

        array('username','用户名不能为空!'),'','该用户名已被注册!','unique',1),// 在新增的时候验证name字段是否唯一

        array('email','该邮箱已被占用',// 新增的时候email字段是否唯一

        array('mobile','该手机号码已被占用',// 新增的时候mobile字段是否唯一

        // 正则验证密码 [需包含字母数字以及@*#中的一种,长度为6-22位]

        array('password','/^([a-zA-Z0-9@*#]{6,22})$/','密码格式不正确,请重新输入!',0),

        array('repassword','password','确认密码不正确','confirm'),// 验证确认密码是否和密码一致

        array('email','email','邮箱格式不正确'),// 内置正则验证邮箱格式

        array('mobile','/^1[34578]d{9}$/','手机号码格式不正确',// 正则表达式验证手机号码

        array('verify','verify_check','验证码错误','function'),// 判断验证码是否正确

        //array('agree','is_agree','请先同意网站安全协议!',1,'callback'),// 判断是否勾选网站安全协议

        array('agree',// 判断是否勾选网站安全协议

    );

 

    /**

     * 自动完成

     */

    protected$_auto=array(

        array('password','md5',3,// 对password字段在新增和编辑的时候使md5函数处理

        array('regdate','time',// 对regdate字段在新增的时候写入当前时间戳

        array('regip','get_client_ip',// 对regip字段在新增的时候写入当前注册ip地址

    );

 

    /**

     * 判断是否同意网站安全管理协议

     * @return bool

     */

    protectedfunctionis_agree()

    {

        // 获取POST数据

        $agree=I('post.agree','intval');

 

        // 验证

        if($agree){

            returntrue;

        }else{

            returnfalse;

        }

    }

登录、注册:

namespaceHomeController;

useThinkController;

 

/**

* Class LoginController

* @package HomeController

*/

classLoginControllerextendsController{

    /**

     * 用户登录

     */

    publicfunctionlogin()

    {

        // 判断提交方式

        if(IS_POST){

            // 实例化Login对象

            $login=D('login');

 

            // 自动验证 创建数据集

            if(!$data=$login->create()){

                // 防止输出中文乱码

                header("Content-type: text/html; charset=utf-8");

                exit($login->getError());

            }

 

            // 组合查询条件

            $where=array();

            $where['username']=$data['username'];

            $result=$login->where($where)->field('userid,password')->find();

 

            // 验证用户名 对比 密码

            if($result&&$result['password']==$result['password']){

                // 存储session

                session('uid',$result['userid']);

 

                // 更新用户登录信息

                $where['userid']=session('uid');

                M('users')->where($where)->setInc('loginnum');   // 登录次数加 1

                M('users')->where($where)->save($data);   // 更新登录时间和登录ip

 

                $this->success('登录成功,正跳转至系统首页...',U('Index/index'));

            }else{

                $this->error('登录失败,用户名或密码不正确!');

            }

        }else{

            $this->display();

        }

    }

 

    /**

     * 用户注册

     */

    publicfunctionregister()

    {

        // 判断提交方式 做不同处理

        if(IS_POST){

            // 实例化User对象

            $user=D('users');

 

            // 自动验证 创建数据集

            if(!$data=$user->create()){

                // 防止输出中文乱码

                header("Content-type: text/html; charset=utf-8");

                exit($user->getError());

            }

 

            //插入数据库

            if($id=$user->add($data)){

                /* 直接注册用户为超级管理员,子用户采用邀请注册的模式,

                   遂设置公司id等于注册用户id,便于管理公司用户*/

                $user->where("userid = $id")->setField('companyid',$id);

                $this->success('注册成功',U('Index/index'),2);

            }else{

                $this->error('注册失败');

            }

        }else{

            $this->display();

        }

    }

 

    /**

     * 用户注销

     */

    publicfunctionlogout()

    {

 

    }

 

    /**

     * 验证码

     */

    publicfunctionverify()

    {

        // 实例化Verify对象

        $verify=newThinkVerify();

 

        // 配置验证码参数

        $verify->fontSize=14;     // 验证码字体大小

        $verify->length=4;        // 验证码位数

        $verify->imageH=34;       // 验证码高度

        $verify->useImgBg=true;   // 开启验证码背景

        $verify->useNoise=false;  // 关闭验证码干扰杂点

        $verify->entry();

    }

模版文件login.html 、register.html

<form action="__SELF__"method="post">

    <div class="form-group has-feedback">

        <input type="text"name="username"class="form-control"placeholder="用户名" />

        <span class="glyphicon glyphicon-user form-control-feedback"></span>

    </div>

    <div class="form-group has-feedback">

        <input type="password"name="password"class="form-control"placeholder="密码" />

        <span class="glyphicon glyphicon-lock form-control-feedback"></span>

    </div>

    <div class="form-group has-feedback">

        <input type="text"name="verify"class="form-control"placeholder="验证码"width:200px;" />

        <span class="glyphicon glyphicon-qrcode form-control-feedback"right:120px;"></span>

        <img class="verify"src="{:U(verify)}"alt="验证码"onClick="this.src=this.src+'?'+Math.random()" />

    </div>

    <div class="row">

        <div class="col-xs-8">

            <div class="checkbox icheck">

                <label>

                    <input type="checkbox"name="remember"value="1"> 记住我

                </label>

            </div>

        </div><!-- /.col -->

        <div class="col-xs-4">

            <button type="submit"class="btn btn-primary btn-block btn-flat">登录</button>

        </div><!-- /.col -->

    </div>

</form>

注册模版 register.html

<div class="register-box-body">

    <p class="login-box-msg">注册一个新用户</p>

    <form action="__SELF__"method="post">

        <div class="form-group has-feedback">

            <input type="text"name="nickname"class="form-control"placeholder="昵称" />

            <span class="glyphicon glyphicon-leaf form-control-feedback"></span>

        </div>

        <div class="form-group has-feedback">

            <input type="text"name="username"class="form-control"placeholder="用户名" />

            <span class="glyphicon glyphicon-user form-control-feedback"></span>

        </div>

        <div class="form-group has-feedback">

            <input type="password"name="password"class="form-control"placeholder="密码" />

            <span class="glyphicon glyphicon-credit-card form-control-feedback"></span>

        </div>

        <div class="form-group has-feedback">

            <input type="password"name="repassword"class="form-control"placeholder="确认密码" />

            <span class="glyphicon glyphicon-check form-control-feedback"></span>

        </div>

        <div class="form-group has-feedback">

            <input type="email"name="email"class="form-control"placeholder="邮箱" />

            <span class="glyphicon glyphicon-envelope form-control-feedback"></span>

        </div>

        <div class="form-group has-feedback">

            <input type="text"name="mobile"class="form-control"placeholder="手机号码" />

            <span class="glyphicon glyphicon-phone form-control-feedback"></span>

        </div>

        <div class="form-group has-feedback">

            <input type="text"name="verify"class="form-control"placeholder="验证码"width:200px;" />

            <span class="glyphicon glyphicon-qrcode form-control-feedback"right:120px;"></span>

            <img class="verify"src="{:U(verify)}"alt="验证码"onClick="this.src=this.src+'?'+Math.random()" />

        </div>

        <div class="row">

            <div class="col-xs-8">

                <div class="checkbox icheck">

                    <label>

                        <input type="checkbox"name="agree"value="1"> 我同意 <a href="#">网站安全协议</a>

                    </label>

                </div>

            </div><!-- /.col -->

            <div class="col-xs-4">

                <button type="submit"class="btn btn-primary btn-block btn-flat">点击注册</button>

            </div><!-- /.col -->

        </div>

    </form>

    <a href="login.html"class="text-center">我已经注册了账户</a>

</div><!-- /.form-box -->

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


(1)创建数据表: CREATE TABLE IF NOT EXISTS `think_form` (   `id` smallint(4) unsigned NOT NULL AUTO_INCREMENT,
组合查询的主体还是采用数组方式查询,只是加入了一些特殊的查询支持,包括字符串模式查询(_string)、复合查询(_complex)、请求字符串查询(_query),混合查询中的特殊查询每次查询只能定义一个,由于采用数组的
(1)创建模版:/App/Home/View/Form/edit.html   <FORM method=\"post\" action=\"__URL__/update\">
自定义配置文件user.php: <?php return array(    \'sex\'=>\'man\', ); config.php: <?php return array(
在一些成熟的CMS系统中,后台一般都包含一个配置中心(如织梦后台中系统设置),以方便站长在后台修改配置文件;那么这个功能是如果实现的呢?在ThinkPHP中有没有捷径可走呢?答案肯定是有的。下面大概说一下这个功能
废话不多说先上图预览下,即本博客的分页; 这个分页类是在thinkphp框架内置的分页类的基础上修改而来,原分页类的一些设计,在实际运用中感觉不是很方便;
在php中截取字符串的函数有很多,而在thinkphp中也可以直接使用php的函数,本文给大家简单的介绍thinkPHP模板中截取字符串的具体用法,希望能对各位有所帮助。
thinkphp开发图片上传,图片异步上传是目前比较方便的功能,这里我就不写css文件了,将代码写出来。
配置数据库:/app/Common/Conf/config.php 方法一: // 添加数据库配置信息 \'DB_TYPE\'   => \'mysql\',// 数据库类型
/app/Home/Controller/IndexController.class.php
(1)创建数据表: CREATE TABLE IF NOT EXISTS `think_data` (   `id` int(8) unsigned NOT NULL AUTO_INCREMENT,
(1)控制器设置:/app/Home/Controller/IndexController.class.php <?php namespace HomeController; use ThinkController;
(1)普通模式 http://localhost/index.php?m=module&a=action&var=value m参数表示模块,a操作表示操作(模块和操作的URL参数名称是可以配置的),后面的表示其他GET参数。
入库的时候用htmlspecialchars()处理含有html代码的内容 输出的时候用htmlspecialchars_decode()处理含有html代码的内容
<?php define(\'APP_NAME\',\'app\'); define(\'APP_PATH\',\'./app/\'); define(\'APP_DEBUG\',TRUE); // 开启调试模式
(1)创建控制器中定义read方法:/App/Home/Controller/FormController.class.php public function read($id=0){
一、实现不同字段相同的查询条件 $User = M(\"User\"); // 实例化User对象 $map[\'name|title\'] = \'thinkphp\';
如果你的数据完全是内部操作写入而不是通过表单的话(也就是说可以充分信任数据的安全),那么可以直接使用add方法,如:
查询表达式的使用格式: $map[\'字段名\'] = array(\'表达式\',\'查询条件\'); 表达式不分大小写,支持的查询表达式有下面几种,分别表示的含义是:
一、使用字符串作为查询条件 $User = M(\"User\"); // 实例化User对象 $User->where(\'type=1 AND status=1\')->select();