ThinkPHP 验证


本篇我们将运用商城实例讲解一下如何运用ThinkPHP做一个登录验证

我们的框架目录结构如下图所示:

其中 app  文件夹就是我们的应用文件夹  它的目录结构如下所示

其中 Admin 就是我们商城后台登录模板的平台了

在这之前我们需要在Conf文件夹里的confg.php文件里配置一下我们平台的路径常量,方便我们在视图里引用CSS样式以及图片

confg.php文件里的代码如下:

 <?php
return array(
//'配置项'=>'配置值'
SHOW_PAGE_TRACE => 0,
'TMPL_PARSE_STRING' =>array(
'__CSS__' => __ROOT__.'/app/Admin/Public/css/',// 设置css样式文件地址
'__IMG__' => __ROOT__.'/app/Admin/Public/img/'// 设置图片地址
), );

基于框架的MVC思路,

我们的视图文件夹详情 如下图所示

视图文件的代码如下:

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta content="MSHTML 6.00.6000.16674" name="GENERATOR" /> <title>用户登录</title>
<link rel="stylesheet" type="text/css" href="__CSS__User_Login.css"/>
</head><body id="userlogin_body">
<div></div>
<div id="user_login">
<dl>
<dd id="user_top">
<ul>
<li class="user_top_l"></li>
<li class="user_top_c"></li>
<li class="user_top_r"></li></ul>
</dd><dd id="user_main">
<form action="__URL__/check" method="post">
<ul>
<li class="user_main_l"></li>
<li class="user_main_c">
<div class="user_main_box">
<ul>
<li class="user_main_text">用户名: </li>
<li class="user_main_input">
<input class="TxtUserNameCssClass" id="admin_user" maxlength="20" name="admin_user"> </li></ul>
<ul>
<li class="user_main_text">密&nbsp;&nbsp;&nbsp;&nbsp;码: </li>
<li class="user_main_input">
<input class="TxtPasswordCssClass" id="admin_psd" name="admin_psd" type="password">
</li>
</ul>
<ul>
<li class="user_main_text">验证码: </li>
<li class="user_main_input">
<input class="TxtValidateCodeCssClass" id="captcha" name="captcha" type="text">
<img src="__URL__/check_num" onClick="this.src='__URL__/check_num/'+Math.random()" /> <--这里的点击事件是重新请求一遍验证码,拼接 Match.random()是为了确保浏览器每次都刷新-->
</li>
</ul>
</div>
</li>
<li class="user_main_r"> <input style="border: medium none; background: url('__IMG__user_botton.gif') repeat-x scroll left top transparent; height: 122px; width: 111px; display: block; cursor: pointer;" value="" type="submit">
</li>
</ul>
</form>
</dd><dd id="user_bottom">
<ul>
<li class="user_bottom_l"></li>
<li class="user_bottom_c"><span style="margin-top: 40px;"></span> </li>
<li class="user_bottom_r"></li></ul></dd></dl>
<input type="hidden" value="__APP__" >
</div><span id="ValrUserName" style="display: none; color: red;"></span><span id="ValrPassword" style="display: none; color: red;"></span><span id="ValrValidateCode" style="display: none; color: red;"></span>
<div id="ValidationSummary1" style="display: none; color: red;"></div>
</body>
</html>

我们的登录控制器是这样的:

代码和注释如下:

<?php
//声明命名空间
namespace Admin\Controller;
use Think\Controller;//启用基础控制器类
use Think\Verify;//启用验证码类
/*Admin模块的login控制器*/
class LoginController extends Controller{
public function login(){
$this->display();//调用模板显示登录界面
} //登录验证的方法
public function check(){
$uid = $_POST['admin_user'];//接收前台的uid
$pwd = $_POST['admin_psd'];//接收用户的密码
$check_num = $_POST['captcha'];//接收验证码
//验证码的验证
$check_num_obj=new Verify();//实例化验证码类
if(!$check_num_obj->check($check_num)){//实例调用验证码类本身的检查方法检验用户输入的验证码是否和生成的匹配
$this->error("验证失败",U("login"),3);//如果不匹配提示验证失败,跳转到登录界面
} $data = M('users')->select($uid);//实例化User表,根据用户的uid返回该用户的信息(这里是一个二维数组)
//var_dump($data);
if($pwd == $data[0]["password"] && $pwd !=""){//如果密码正确且不为空
$this->redirect('Manager/index',array(),2,'<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />登录成功!');//提示登陆成功跳转到管理界面(这里的array()可用于传参数)
}else{
$this->redirect('Login/login',array(),2,'<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />登录失败!');//提示登录失败 再次返回到登录界面
} } function check_num(){//产生登录验证码的方法
$config = array(//配置信息的关联数组
'useImgBg' => false, // 使用背景图片
'fontSize' => 15, // 验证码字体大小(px)
'useCurve' => true, // 是否画混淆曲线
'useNoise' => true, // 是否添加杂点
'imageH' => 30, // 验证码图片高度
'imageW' => 120, // 验证码图片宽度
'length' => 5, // 验证码位数
'fontttf' => '1.ttf', // 验证码字体,不设置随机获取
'bg' => array(243, 251, 254), // 背景颜色
'reset' => true // 验证成功后是否重置
);
$check_num_obj=new Verify($config);//实例化生成验证码的类
$check_num_obj->entry();//调用该类显示验证码的方法
     //输出验证码并把验证码的值保存的session中
     //验证码保存到session的格式为: array('verify_code' => '验证码值', 'verify_time' => '验证码创建时间');
    }
    

好了,到现在基本的设置已经完成了

让我们试一试吧

先打开登录界面

输入用户名和密码和验证码    点击登录

OK 我们的登录验证完成啦

后续功能我们逐步完善

对于不理解的代码,欢迎随时来骚扰我们一起探讨!!!

ThinkPHP实例—实现登录验证的更多相关文章

  1. Shiro安全框架入门篇(登录验证实例详解与源码)

    转载自http://blog.csdn.net/u013142781 一.Shiro框架简单介绍 Apache Shiro是Java的一个安全框架,旨在简化身份验证和授权.Shiro在JavaSE和J ...

  2. ThinkPHP之登录验证

    验证方面写的不是很完整,正在完善当中 <?php /** * Created by dreamcms. * User: Administrator * Date: 2016/9/5 * Time ...

  3. express+nodecoffee写passport登录验证实例(一)

    项目中要用到passport登录验证,环境如标题样:express框架,coffee模版引擎,node后台 一:建项目 直接用express命令建,虽然默认模版为jade,可以手动换成coffee哦. ...

  4. 自定义Django中间件(登录验证中间件实例)

    前戏 我们在前面的课程中已经学会了给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面.我们通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可能也需要加上装饰 ...

  5. Django框架登录验证及产生随机验证码的实例

    1:views视图代码 # 登录验证 def login(request): # 使用ajax请求可以使用判断 # if request.is_ajax(): if request.method == ...

  6. ASP.NET MVC 登录验证

     好久没写随笔了,这段时间没 什么事情,领导 一直没安排任务,索性 一直在研究代码,说实在的,这个登录都 搞得我云里雾里的,所以这次我可能也讲得不是 特别清楚,但是 我尽力把我知道的讲出来,顺便也对自 ...

  7. nodeJS---express4+passport实现用户注册登录验证

    网上有很多关于passport模块使用方法的介绍,不过基本上都是基于express3的,本文介绍在express4框架中使用passport模块. 前言 passport是一个功能单一,但非常强大的一 ...

  8. C# mvc中为Controller或Action添加定制特性实现登录验证

    在本文开始前,先简单讲两个知识点: 1.每个action执行前都会先执行OnActionExecuting方法: 2.FCL提供了多种方式来检测特性的存在,比如IsDefined.GetCustomA ...

  9. 如何使用新浪微博账户进行应用登录验证(基于Windows Azure Mobile Service 集成登录验证)

    使用三方账号登录应用应该对大家来说已经不是什么新鲜事儿了,但是今天为什么还要在这里跟大家聊这个话题呢,原因很简单 Windows Azure Mobiles Service Authenticatio ...

随机推荐

  1. react 问题

    安装依赖报错问题                                           可能需要按顺序安装,  不能cnpm npm 混合安装, 参考react项目入门 react an ...

  2. event.preventDefault() 解决按钮多次点击 导致页面变大

    event.preventDefault() 解决按钮多次点击 导致页面变大

  3. python常用模块之shelve模块

    python常用模块之shelve模块 shelve模块是一个简单的k,v将内存中的数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据类型 我们在上面讲json.pickle ...

  4. Ethernet、VLAN、QinQ

    以太网帧格式: 各字段解释: DMAC:目的MAC地址,该字段确定帧的接收者. SMAC:源MAC地址,该字段标识发送帧的工作站. Type:上层协议类型(0x0800:IP;0x0808:ARP;0 ...

  5. del语句的总结

    删除属性 del 语句 可以删除对象(实例)的属性 语法: del 对象.实例变量名 del 语句 del 变量名 删除变量 del name del 列表[整数表达式] 删除列表中的元素 del L ...

  6. ffpmeg下rtmp踩坑记录

    1. flash端发布直播流 2.在 ffplay 命令行中 播放rtmp 直播流 ffplay "rtmp://127.0.0.1:80/live/ss live=1"  一直出 ...

  7. hihocoder1618 单词接龙

    #1618 : 单词接龙 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个单词字典和一个起始字母.小Hi需要从起始字母开始,每次再加上一个字母,生成长度为2.3. ...

  8. Luogu 4149 Race

    Luogu 4149 Race 用点分治解决. 点分治在计算路径贡献时,为了不统计在一颗子树中的路径,解决方法一种是容斥,但在这种求最值问题中不便用容斥来撤销. 另一种则是,处理一颗子树时,只考虑前面 ...

  9. CF1117A Best Subsegment

    CF1117A Best Subsegment 乍一看好像很难,仔细想一下发现就是弱智题... 任意一段平均数显然不会超过最大的数,若只取最大数即可达到平均数为最大数. 于是只用取最长的一段连续的最大 ...

  10. python嵌入c++

    1.去主页下载源代码项目 2.编译下载下来的项目 3.新建项目填入下面代码 // pythonIncludeTest.cpp : 定义控制台应用程序的入口点. // #include "st ...