微博项目_注册登录功能(2).md

在上一节中,对于一个简单的登录注册流程进行了整理,而该小节主要对其补充几个附加功能,使其更加完善。

验证码检验

利用TP框架附带的Verify类方法,实现验证码功能。

1
2
3
4
5
6
7
8
9
10
11
<!-- register.html -->

<script type="text/javascript">
var checkVerify = "{:U('checkVerify')}";
</script>

<p>
<label for="verify">验证码:</label>
<input type="text" name="verify" id="verify" />
<img src="{:U('verify')}" width="80" height="25" id="verify-img" />
</p>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/* register.js */

//点击刷新验证码
var verifyUrl = $('#verify-img').attr('src');
$('#verify-img').click(function () {
$(this).attr('src',verifyUrl + '/' +Math.random());
});
$('form[name=register]').validate({
errorElement : 'span',
success : function(label) {
label.addClass('success');
},
rules : {
verify : {
required : true,
remote : {
url : checkVerify,
type : 'post',
dataType : 'json',
data : {
verify : function() {
return $('#verify').val();
}
}
}
}
},
messages : {
verify : {
required : '请填写验证码',
remote : '验证码不正确'
}
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/* loginController.class.php */

//获取验证码
public function verify() {
//配置验证码的一些参数
$config = array(
'fontsize' => 30, //验证码字体大小
'length' => 4, //验证码位数
'useNoise' => false, //关闭验证码杂点
);
$verify = new \Think\Verify($config);
$verify->entry();
}
//异步验证验证码
public function checkVerify() {
if (!IS_AJAX) {
E('页面不存在');
}
$verify = new \Think\Verify(); //调用TP框架中的Verify类
$verify->reset = false; //验证码检验后不被重置

if ($verify->check($_POST['verify'])) { //check函数是TP框架封装好的检验验证码的一个方法
echo 'true';
} else {
echo 'false';
}
}

自动登录功能


如上图所示,当用户登录时,其中有一项下次自动登录,当用户选中时,我们需要进行一些处理,使得相同的用户下一次访问页面时,可以跳过登录页,自动登录进入首页。

1
2
3
4
5
6
<!-- login.html -->

<p>
<input type="checkbox" name="auto" checked="1" id="auto">
<label for="auto">下次自动登录</label>
</p>
1
2
3
4
5
6
7
8
9
10
/* LoginController.class.php */

//处理下一次自动登录
if (isset($_POST['auto'])) {
$account = $user['account']; //$user是当前登录用户,结合之前登录部分的代码,已经从数据库中查出
$ip = get_client_ip(); //获取当前登录IP
$value = $account . '|' . $ip;
$value = encryption($value); //将需要保存的COOKIE值进行加密处理
cookie('login',$value,3600);
}

在处理自动登录时,我们自定义了一个加密函数encryption,该函数可以放在公共函数文件中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* /practice/Common/Common/function.php */

<?php
/**
* 异位或加密字符串
* @param [String] $value [需要加密的字符串]
* @param [integer] $type [加密解密(0:加密,1:解密)]
* @return [String] [加密或解密后的字符串]
*/
function encryption($value,$type=0) {
$key = md5('goodgoodstudydaydayup'); //用于加密的一个key值

//加密
if (!$type) {
return base64_encode($value ^ $key);
}
//解密
$value = base64_decode($value);
return $value ^ $key;
}
?>

接下来,我们在首页控制器中判断是否进行账号的自动登录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/* /practice/Home/Controller/IndexController.class.php */

<?php
namespace Home\Controller;
use Think\Controller;

class IndexController extends Controller
{
public function index()
{
//处理自动登录
if (isset($_COOKIE['login']) && !isset($_SESSION['uid'])) {
//将COOKIE值解密并拆分
$value = explode('|', encryption($_COOKIE['login'],1));
$ip = get_client_ip(); //获取当前登录IP

//判断当前登录IP与COOKIE中保存的IP是否相同
//如果相同,则执行账号自动登录
if ($ip == $value[1]) {
$account = $value[0];
$where = array('account' => $account);
$user= M('user')->where($where)->field('id')->find();
session('uid',$user['id']); //将COOKIE中保存的账号信息存入SESSION中
}
}
//判断用户是否已经登录
if (!isset($_SESSION['uid'])) {
redirect(U('Login/login'));
}
}
}

退出登录

在网站页面中,会有一个退出登录的链接,当用户点击时,可以登出当前在线用户。而此时需要进行处理得即是将与该用户相关的session和cookie信息清楚即可。

1
2
3
4
5
<!-- /practice/Home/View/Index/index.html -->

<div>
<a href="{:U('Index/loginOut')}">退出登录</a>
</div>
1
2
3
4
5
6
7
8
9
/* LoginController.class.php */

//退出登录处理
public function loginOut() {
session_unset(); //卸载session
session_destroy(); //销毁session
cookie('login',null); //清楚cookie
redirect(U('Login/login')); //跳转至登录页
}
-------------The End-------------