ThinkPHP开发博客系统笔记之一

时间:2022-05-18 10:18:50
ThinkPHP开发博客系统笔记之一

1.前后台搭建

开发的第一步是搭建前后台系统。搭建前台系统的时候新建了LoginController控制器和登录界面View/Login/index.tpl。模板文件中需要引入js和css文件,这里想通过在配置文件中创建模板变量的方式简化脚本文件的引入,但在创建的过程中遇到了问题。

Home/Conf/config.php
<?php
return array(
'TMPL_PARSE_STRING' => array(
'__CSS__' => '__PUBLIC__/Home/css',
'__JS__' => '__PUBLIC__/Home/js',
'__IMG__' => '__PUBLIC__/Home/img',
),
);
View/Login/index.tpl
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>微博系统——登录界面</title>
<script type="text/javascript" src="__JS__/jquery.js"></script>
<script type="text/javascript" src="__JS__/jquery.ui.js"></script>
<script type="text/javascript" src="__JS__/login.js"></script>
<link rel="stylesheet" href="__CSS__/jquery.ui.css">
<link rel="stylesheet" href="__CSS__/login.css">
</head>
<body> </body>
</html>

结果__JS__等几个变量在模板文件中无法正确解析。原因是__PUBLIC__是模板替换变量,只有出现在模板文件中时才会被替换为对应的字符串。而__ROOT__、__APP__、__MODULE__、__CONTROLLER__、__ACTION__、__SELF__既是模板替换变量,也是系统常量,它们可以应用在模板文件和配置文件中,所以这里可以用__ROOT__

Home/Conf/config.php
<?php
return array(
'TMPL_PARSE_STRING' => array(
'__CSS__' => __ROOT__.'/Public/Home/css',
'__JS__' => __ROOT__.'/Public/Home/js',
'__IMG__' => __ROOT__.'/Public/Home/img',
),
);

这里还可以用系统常量MODULE_NAME代替模块名称Home,改进后的版本如下:

Home/Conf/config.php

<?php
return array(
'TMPL_PARSE_STRING' => array(
'__CSS__' => __ROOT__.'/Public/'.MODULE_NAME.'/css',
'__JS__' => __ROOT__.'/Public/'.MODULE_NAME.'/js',
'__IMG__' => __ROOT__.'/Public/'.MODULE_NAME.'/img',
),
);

2. 登录页设计

登录页的功能之一就是自动缩放和随机变换的背景,前一个功能是通过CSS3的新属性background-size实现的。

body {
margin:;
padding:;
height: 100%;
background: url(../img/background.jpg) no-repeat;
background-size: 100%;
}

因为我用的图片宽度过小,无法填充整个页面,我试图通过设置width: 100%来填充整个页面,结果当然是失败的,因为heightwidth属性是控制content的,与background无关。

后一个功能是通过js实现的。最初的测试脚本如下:

$(function(){

    //登录页背景随机
var rand = Math.floor(Math.random() * 5) + 1;
$("body").css("background", "url(../img/login_bg1.jpg)");
});

刷新浏览器页面报错:

aaarticlea/png;base64,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" alt="" />

注意,这里查找login_bg1.jpg的路径是相对于index.php的,因为index.php已位于网站根目录www,所以它的上级目录还是www。

这里的url路径是否可以使用__PUBLIC__呢?答案是否定的。因为模板替换只会发生在模板文件中,在js脚本中无法替换。但我们可以在模板文件中定义js变量,这样在引用该脚本中就可以使用这些变量了。

Home/View/Login/index.tpl

<script type="text/javascript">
var ThinkPHP = {
"IMG" : "__PUBLIC__/{:MODULE_NAME}/img",
};
</script>
login.js

$(function(){

    //登录页背景随机
var rand = Math.floor(Math.random() * 5) + 1;
$("body")
.css("background", "url(" + ThinkPHP['IMG']+ "/login_bg" + rand +".jpg) no-repeat")
.css("background-size" , "100%"); });

这个地方还有一个小问题,就是url不能写成如下形式:

$(function(){

    //登录页背景随机
var rand = Math.floor(Math.random() * 5) + 1;
$("body").css("background", "url(ThinkPHP['IMG']/login_bg1.jpg)");
});

因为Javascript中引号中的都是字符串常量,将ThinkPHP['IMG']放在引号中就不会转换为它所代表的变量了。

登录页面中不可或缺的元素就是登陆表单。登陆form的各元素在页面上布置好之后,先用jquery ui将type=submit的input元素转换为按钮:

login.js

$(function(){

    //登录页按钮
$("#login input[type='submit']").button();
});

设置好各元素的css之后我发现submit按钮的位置有点儿靠上,需要通过定位让它的位置下移一些,并用:hover实现鼠标移动到它上面时的动画效果:

login.css

#login input[type="submit"] {
position: relative;
top: -4px; width: 150px;
height: 50px; font-family: 黑体;
font-size: 24px; background-color: #c3c3c3;
} #login input[type="submit"]:hover {
background-color: #3c3c3c;
}

上面的main部门又加了一个注册和找回密码链接后就开始设计页面的底部,也就是footer部门。这里footer要实现一个透明的功能,我直接在footer上进行CSS的设计,结果footer里的文字也变透明了,这不是我想要的结果。所以我把里面的文字移出来,放到一个class=“footer_text”的p标签中。

Login/index.tpl

<div id="footer"></div>
<p class="footer_text">Juedi's blog</p>
login.css

#footer {
position: absolute;
bottom:; width: 100%;
height: 40px; opacity: 0.4;
background: #000;
} .footer_text {
position: absolute;
bottom:; width: 100%; text-align: center;
font-size: 13px;
color: #000;
}

下面就开始设计新用户注册界面了,最初的版本如下:

<div id="register">
<form>
<p>
<label for="user">账号:</label>
<input type="text" name="user" class="text" id="user" placeholder="昵称,不小于两位!">
<span class="star">*</span>
<label for="password">密码:</label>
<input type="password" name="password" class="text" id="password" placeholder="密码,不小于6位!">
<span class="star">*</span>
<label for="email">邮箱:</label>
<input type="email" name="email" class="text" id="email" placeholder="邮箱,用于找回密码!">
<span class="star">*</span>
</p>
</form>
</div>

结果界面如下:

aaarticlea/png;base64,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" alt="" />

很显然是哪里出了问题。问题就在于label、span和input都是行内元素,它们不会自动换行,所以需要就它们放在一个块元素里面,这里我们用的是p,然后就正常了。

<div id="register">
<form>
<p>
<label for="user">账号:</label>
<input type="text" name="user" class="text" id="user" placeholder="昵称,不小于两位!">
<span class="star">*</span>
</p>
<p>
<label for="password">密码:</label>
<input type="password" name="password" class="text" id="password" placeholder="密码,不小于6位!">
<span class="star">*</span>
</p>
<p>
<label for="email">邮箱:</label>
<input type="email" name="email" class="text" id="email" placeholder="邮箱,用于找回密码!">
<span class="star">*</span>
</p>
</form>
</div>

3. 创建用户表

现在开始创建用户表,第一个版本的表结构如下:

ThinkPHP开发博客系统笔记之一

这个表有几个需要改进的地方。首先,create可以改为int类型,方便在web程序里操作。其次,这个表里有的字段是char类型,有的字段是varchar类型。char类型是固定长度的,可能会浪费一些空间,但查询速度快,varchar正好相反。所以,我们考虑把经常需要查询到的username、email改为char类型。如果一个表里既有char也有varchar,那么它的查询速度就会收到影响,所以我们这里把intro单独拿出来放到一个新表里,两个表通过外键关联,并且在username、email和uid上都建立unique索引。最终两个表如下:

ThinkPHP开发博客系统笔记之一

4. AJAX注册及自动完成

这里主要应用了jquery validate插件来实现注册信息的ajax方式提交

$("#register").dialog({
width: 430,
height: 330,
modal: true,
resizable: false,
autoOpen: false,
title: "注册新用户",
closeText: "关闭",
buttons: [{
text: "提交",
click: function(e) {
$(this).submit();
},
}], }).validate({
submitHandler: function(form) {
$(form).ajaxSubmit({
url: ThinkPHP["MODULE"] + "/User/register",
type: "POST",
});
},
});

为了访问User/register,我们定义了ThinkPHP["MODULE"]变量

index.tpl

<script type="text/javascript">
var ThinkPHP = {
"IMG" : "__PUBLIC__/{:MODULE_NAME}/img",
"MODULE" : "__MODULE__"
};
</script>

最开始我们把用户注册逻辑放在了UserController中,但是这样程序的结构不够清晰,应该将其放到UserModel中,由Model来处理业务逻辑,Controller的作用主要是处理用户提交的数据,这里注意不要忘记在UserController.class.php中use Home\Model\UserModel。

UserModel.class.php

<?php
namespace Home\Model;
use Think\Model; class UserModel extends Model { protected $_auto = array(
array("password", "sha1", self::MODEL_BOTH, "function"),
array("create", "time", self::MODEL_INSERT, "function"),
); //注册一个用户
public function register($username, $password, $email) {
$data = array(
'username' => $username,
'password' => sha1($password),
'email' => $email,
'create' => time(),
); if ($this->create($data)) {
$uid = $this->add($data);
return $uid? $uid : 0;
}
}
}

5. 服务器端验证

服务器端的验证应用了ThinkPHP框架中模型的自动验证功能:

UserModel.class.php

//用户表自动验证
protected $_validate = array(
array('username', '2, 20', '用户名长度不合法', self::EXISTS_VALIDATE, 'length'),
array('password', '6, 30', '密码长度不合法', self::EXISTS_VALIDATE, 'length'),
);
......

if ($this->create($data)) {
$uid = $this->add($data);
return $uid? $uid : 0;
} else {
return $this->getError();
}

 

验证错误信息(如上面的"用户名长度不合法")可以通过模型的getError()方法得到,但是getError只会返回第一个验证的错误信息,因为验证到第一个不符合条件的项目后就不再继续验证了。可以通过打开批量验证功能,是所有表项都得到验证,此时getError返回的是一个数组:

UserModel.class.php

//打开批量验证功能
protected $patchValidate = true; ...... if ($this->create($data)) {
$uid = $this->add($data);
return $uid? $uid : 0;
} else {
print_r($this->getError());
}

设置好以上自动验证后,输入用户名和密码的时候测试总是报错:

ThinkPHP开发博客系统笔记之一

原因是我们在自动完成里设置了对密码进行hash,所以hash后的密码长度都是40,超过了自动验证里的长度限制30。但是,通过阅读《ThinkPHP3.2.2完全开发手册》,我发现自动验证是在自动完成之前,应该不会出现上面的问题才对啊?!

今天终于找到了原因:

UserModel.class.php

//注册一个用户
public function register($username, $password, $email) {
$data = array(
'username' => $username,
'password' => sha1($password),
'email' => $email,
'create' => time(),
); if ($this->create($data)) {
$uid = $this->add($data);
return $uid? $uid : 0;
} else {
print_r($this->getError());
}
}

上面对password执行了sha1,导致了长度为40,去掉sha1就正常了。

前面的自动验证的错误信息返回的都是字符串,其实这个错误最终要返回给客户端,所以最好用数字代替字符串,这样还需要关闭批量验证功能:

UserModel.class.php

//打开批量验证功能
//protected $patchValidate = true; //用户表自动验证
protected $_validate = array(
//-1, 用户名长度不合法
array('username', '2, 20', -1, self::EXISTS_VALIDATE, 'length'),
//-2, 密码长度不合法
array('password', '6, 30', -2, self::EXISTS_VALIDATE, 'length'),
//-3, 密码和密码确认不一致
array('repassword', 'password', -3, self::EXISTS_VALIDATE, 'confirm'),
//-4, 邮箱格式不正确
array('email', 'email', -4, self::EXISTS_VALIDATE),
//-5, 用户名被占用
array('username', '', -5, self::EXISTS_VALIDATE, 'unique', self::MODEL_INSERT),
//-6, 邮箱被占用
array('email', '', -6, self::EXISTS_VALIDATE, 'unique', self::MODEL_INSERT),
); ...... if ($this->create($data)) {
$uid = $this->add($data);
return $uid? $uid : 0;
} else {
return $this->getError();
}

6. 客户端验证

客户端验证利用了jquery validate插件:

validate({
submitHandler: function(form) {
$(form).ajaxSubmit({
url: ThinkPHP["MODULE"] + "/User/register",
type: "POST",
});
}, rules: {
username: {
required: true,
minlength: 2,
maxlength: 20,
},
password: {
required: true,
minlength: 6,
maxlength: 30,
},
repassword: {
required: true,
equalTo: '#password',
},
email: {
required: true,
email: true,
},
}, messages: {
username: {
required: '账号不得为空',
minlength: $.format('账号不得小于{0}位!'),
maxlength: $.format('账号不得大于{0}位!'),
},
password: {
required: '密码不得为空',
minlength: $.format('密码不得小于{0}位!'),
maxlength: $.format('密码不得大于{0}位!'),
},
repassword: {
required: '密码确认不得为空',
equalTo: '密码和密码确认必须一致!',
},
email: {
required: '邮箱不得为空',
email: '邮箱格式不正确',
},
}, });

效果如下图所示:

aaarticlea/png;base64,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*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" alt="" />

现在所有的错误提示信息都显示在了表单项的后面,这样很不美观,我们想把它们放到注册窗口的最上方,并重写错误信息的显示方式。

首先我们在注册表单中添加一个无序列表:

index.tpl

<form id="register" action="123.html">
<ol class="register_errors"></ol>
<p>
<label for="user">账号:</label>
<input type="text" name="username" class="text" id="user" placeholder="昵称,不小于两位!">
<span class="star">*</span>
</p>
......
login.js

showErrors: function(errorMap, errorList) {
this.defaultShowErrors();
}, errorLabelContainer: 'ol.register_errors',

现在错误显示如下:

aaarticlea/png;base64,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" alt="" />

我们应该把每条信息放到一个单独的列表项中,添加如下代码:

showErrors: function(errorMap, errorList) {
this.defaultShowErrors();
}, errorLabelContainer: 'ol.register_errors', wrapper: 'li',

现在的显示效果如下:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbAAAAFvCAIAAACkRAmHAAAgAElEQVR4nO2dz48bWZ3A85cgcRiJCxKSxYXlhAQSXDjlsAIJGdicNhIX3DtSLqAttJrMYQB5EWiRYKV4JigG9hIOiJmBbpPpdHbS7s4knjHdM+sxZJI46d9ZdzPy28O3+u3r96qey2W3Xc/+fPRV1F2uH69ceZ/+vh9VdWFnZ0cBACw8Ozs7F2ZdBgCAooAQAQBiLiil/v7xx2t3723eu78FALBgbN67v3b33t8//jgW4trde6+vrEY//s+lf/spQRDEQsW//vg/31xZXbu7GQtx850H3//RL2deLIIgiJnEv/7ol/fuP4iFuLW1NfMCEQRBzDC2trYQIkEQxE+XECJBEIQOhEgQBBEHQiQIgogDIRIEQcSBEAmCIOJAiARBhB1Xrv7Hm8u3VldvNzKzunr7zeVbV67+h7UrhEgQRNjx5vKtzc3NnZ2d55nZ2dnZ3Nx8c+Uta1dhCLFUKpVKpW9/54r70eUrL3k+zRFf+NJXSqXSzE+ZIIiMsbq6uru7m92Gwu7u7urqqrWrcYX4hS995asXv24t1JJy1//2d66UznL5ykvuQstuX7349VKp9I/f+me9xFpf9py4/0S+8KWvJJ6O3tw9KYIgihmNRmNUGwqNRsPa1bhC/Mdv/bPrvstXXpI8y1SYhBhHdCPraCHKQnGf3256+eUrLyXu3/SdHEUb1l1hHIESBDHzKJAQl07zQRGZB9NxGYWody7i+/Z3rmgxTVyI7q7S1icIolBRLCEmhqUhHaMKUTJQ8yP5GSESBCHhCvHZs2dLS0uvvvqqXvLqq68uLS09e/bsHIXokcWkhGh2R5rm8gtxpCYwQiSIoMMV4tIp4kSxoXC+QlxKGQKeiBDTmuGJy8VZZIgEsWjhCtE0oPVzgZrMsjAjpoOk4eyOMl++8pL1EUIkiEWLxD5E04OJNjwvIeqZN3rE2WO3iY8yT0qI2e1MEEShIm1QxZMbnpcQdR+flWHlaDKL1Kw+RIm0DNH9KHcfYtoJkiESRMEjUYjXrl2zMsRqtXruQkzzRZoQTX9pIZoLLSHq+YxyFL2aX4jZM0QROr4jiHDDFaJpQzNPtJw4eSGaU2HMSBOi6TstRHcgRX7W6ae2nt5EW8wSojlNJ7EklhDNjJUgiBDDM8osBqxWq9MYZV5Kv8s4TYjmcm03c6Erxy986Svaelpn2mKWEN2b/PxCdBvjBEGEFWnzEM18UJx4vvMQ0zoQl1KEaN3jrNcxF5pCFFt9+ztXLG2ZFvZ8lFgSS4hayjO/qARB5Iui3KliNl2H3rong9GujBIXmoayOhn13B351PxID3Obm1tCNNv4dCASxBxEUYSYI7568es64zObve5CcxPTgEv/9lNpRMvP7qCKtbmVh5rG1BnozK8oQRC546233trb2xvVhufy+C+CIIjZhjwgdiQn7u3tBfyAWIIgiLSQVwi8tbqa/RUCb62u8goBgiAIXyBEgiCIOBAiQRBEHAiRIAgiDoRIEAQRB0IkCIKIAyESBEHE8f9CfOf+g+/98BczLxBBEMRM4vs/+uW9+w9iIa7dvff6yur3cSJBEIsX3/vhL95cWV27uxkL8e8ff7x29979B60tAIAF4/6D1trde3//+ONYiAAAc0a/3//www8fPnz49OnTHYPd3V35V7O3t7e/v//48WOFEAFgLkGIAAAxCBEAIAYhAgDEIEQAgBiECAAQkybEg4ODo6Ojg4MDhAgAi0KiEPf394+Ojj796U+bTkSIADDnuEIUG37iE5/47Gc/+7WvfU07ESECwJxjCVFs+MlPfvLLX/7yiy+++PLLL//gBz8QJyJEAJhzLCEeHR1dvHhxaWnp5z//+a9//evf/e53b7zxxs2bN4+OjhAiAMw5iRmiCxkiAMw/TLsBAIhBiAAAMQgRACAGIQIAxCBEAIAYhAgAENPv99fW1m7cuPHTs/zsZz+TfzW/+tWv3n77bYQIAHNLv9+/ceNGt9t9fopMPHz69OmTJ08fP37y6NHjv/3t4Qcf/M/6+ka9XkeIADC39Pv9n/zkJ1qF+/sHu3t7Ozu7H3741w8+6Gxtf/Dee1vNjXvLK7c2N9+p/nsVIQLA3CJC1Lej7O7uPXu20+s93dr64N13/3L/wbubm/ffWr3zxz821tc3ECIAzDNaiIeHh3t7+2LDR4+evPveX955p9Vs3vvv/27eurX25psrd+82ESIAzDMIEQAgBiECAMQgRACAmMUVYq1Wi6Jo1qUAgAKxEEIsl8slg3K5rJKEKMunRqfTKZVK+bat1WrTLK17uFKp1Ol0plYAgOkQsBCzC6VcLjcaDflZ121LiOVy2fy10WiUvNRqNb1D/5qui/URZSdRFCWurMvs4hdixiLpU1Bn/2aYy62iCp1ORw6RxYnWFwtQZAIWotTeLGsOFaJbaRuNhsc4URS51nCL51kniiJ9xMS9mWV2GTVD9K8vNhS7ienMb0P+8LjuM0/BA0KEgAhSiGb6lmV9kYt4xxViYo0dU4hRFHl0FkWRufOMGaIpNf1zmq0sPEKUPZjHEida28pqGfNNE4QIARGeEMWGtVpNfsiyiUeIaUMr2ZvMLm6SZe1ZPtJN/owZoqktU3DlcnlotjhSRinnriVrtZdHJWMiCVAEwhOiZiJC9Ow8X4bYaDTkEEMtMFIfonWypuDcFM9lJCFKeczjSjnTstHsnQMABWdBhZjmoDGrbqfTMZvhVqplMmonoJWmWZubbfC0U8t4vqYB1Wn3ovmr5T7POeryIEQIhQUVojrNEN2sx5qjMxS9YafTMZuxZrvYKqeUXFbwjwinpWaWEIcmiRn9axZMGW1/c0jd2s9Q3yFECIjFEqJuz6qzgyqJKvG3mi0sUyRO4pEVtHQ8mrCa5O7Krpj8PYlZhGjlhnJcyXn1QlfNfhEnFh6gsCyQEOVfV4hpnYnZBxNcGSX2IUpjVntZ56ce9PCutStXcPJtpLlpqBAlGUw8X8vO5teS/RIABMFCCFGwmq6mBxNVMlRVslqi+4YOqphHFz+an1qtVNdTiYLzHDTLRO40mVpCNHeVZT4mQEAsihAlQzRn2FlKGsmtQ5uBIwlRmqXWIIlfNBOcmC0ZqH+Y2LpNRbeaSxmmQGaZFQRQEOZKiB4N6Y5CrR7daJVfzbkmQ/HfRuIvieCf9DO0tW4JdCiew6WN6mjTpdnZfwoahAgBEbAQs2P5RTrm9PQUXfPT0ih3IkuWOYY5hGgeKDHzMkfA/UbOt34ienQ+Yx8CQLjMvxDHHzPJwTzdr0ZHISwO8y9EAICMIEQAgBiECAAQgxABAGIQIgBADEKcDDmeegAARWOxhDh0QrUm8fkxnhtaRn38TNoRO52OfoLsbBn1ZhiAOSBIIfrfiOTf0H0MddrtGa4OPEmf+4DCUacuayHKzTPm2wL8M6LdQ2RfX/xrLVTGU8s0RXA0wHkTnhD9b0Qauq0rRNmV+VCZxPcHJC4URVpKSnwGYimDu0tnH9zvv004yw5HWt8ssFmSjK9tAZgDAhPi0DciJZL4zFfZia7q5v0YYjrrWHJnS9oDot1nwFhP09E/j/QA2jSFRd6XWCXiF6LZTre+4ez9DAChE5gQXYY+wl4ZVdr9oXTaStVWtdrFkqmZT8NWSU950Y1cc02dPGbMYUvZuh2z5MXu1+IXovnwC88LtjAjzDfBCzHLU2qGCjHxmYNWeujawXrNk5D4NoLsD5odapyML7EaSYhm+WW3aYkzQoT5Jmwhuk+9T2SoEM2duPmRftq2uU+zjSwpm/xqDmtYr1WRPaQ9JVs/sdFzItlfYjWSEPUfFd3MR4iwmAQsROuNSB6y9CGWkl77aWaIHiGKDXWTOVE9stwqreUs/9TF7C+xUilCtJA96D8A6qwQ06ydVjyAOSBUIWbMDYWhGaJy5hhK0pSlyVw7feF9jll7lrP8j3HN+BIrc0mWDFFnmsp4aC4ZIiwmQQrR80akRLIIURkV3mzV6oZwWoYoBjGFlTYokdhNaTorbeL3SC+xMnc1Uh+iQoiw8IQnRP8bkRLJKERzpFVniNKv5x9UUWczuESvJT5m1XJW4oy/fC+xGkeIjDLDwhKYEIe+ESmR7BmivnNDOaPMnj5ENZ4QtW3V2ed4e1rQ5zrKbN6lQ4YIC0VgQvS/ESlNE/5BFb1P2VbajOqchZj2+hRTZJ5n959Thqicqe+WELlfBeabwISYD1dniRmiRSnzPESVJEQXMYs1XJNY2tLpnYJpq3mEONKdMEPv1xYhan2nlRlgPlgIIXrILsTzaDKnIVLzDFvP00usAIrDogsRAECDEAEAYhAiAEAMQgQAiEGIAAAxCBEAIAYhAgDEIEQAgBiECAAQgxABAGIQIgBADEIEAIhBiAAAMQgRACAGIQIAxCBEAIAYhAgAEIMQAQBiEKJSSg0Gg263u7GxcQcAcrGxsdHtdgeDwaxr81ggRKWU6na77Xa73+/PuiAAodLv99vtdrfbnXVBxgIhKqVUs9k8Pj6edSkAwub4+LjZbM66FGOBEJVS6s6dO7MuAsA8EHpVQohKhX8VAQpC6FUJISoV/lUEKAihVyWEqFT4VxGgIIRelRCiUuFfRYCCEHpVQohKhX8VAQpC6FUJISoV/lUEKAihV6XZC7FWq0VRNMEd5iD0qwhQEEKvSlMVYrlcLhmUy2WVJERZPk1Cv4oABSH0qjRtITYaDfm5VqslCrFcLpu/NhqNkpdarZb/7E8J/SoCFITEqlSEVmBGiiVEy4ZKqUaj4UkYoyhCiADFwapKktDUarVarVYqlYqvxRkIUSzmCtG1oUKIAEGRWJWkr2z6hclBUYSYllSP2WQul8tZeiTThHjp0qULp9y8eTPbWQIsLm5VkpwmiqLip4eqOEJM22TMDHEcIV66dOnSpUvy8yuvvHLhwoV2uz10VwCLjFuVoihqNBqdTieIJHHGQoyiKDHvm/Ifk0QhmgZst9skiQBDCb33qSgZovwB6XQ65sr+xrLFON+C/yrevHmTVjNAFuZJiIeHR4eHRwcHB3t7+w8fPup2/9bpdN9/v7O5eX/CQmw0GomDKnoM2sTfap4IiVdRmskCGSJAFuZJiM+f/+8/fO5z3/rmN/9laUnih6+88tvf/Kbd3p6kEOVfV4hpnYnlcnkiQ8ke3KtoGRAhAmRhzoR46Z/+6Ze/+MV/nfKHP/zh9u3bExOiYLVwTQ+WSiU3SfS3lCeSPLpXUZrJ1q8IEcDPPAnx3JvM6rT9K7M0ZYkpRJlkk31vQ8fyc48yWymhNJxfeeWV7GUDWEDmSYjn3mRWRkdhFEXWoIr8KuPOo+7Ns0LuaTdWH6LMSWTmDYCHORPi+TaZrd7Acrnc6XT0zBs9xKy7Fy3cOTqTmp0T+lUEKAihV6XpNZlnOGYylNCvIkBBCL0qTbvJXExCv4oABSH0qmQJ8fvf+95vf/Ob10+5detWs9lEiACQidCr0rRHmYtJ6FcRoCCEXpVm/wqBIhD6VQQoCKFXJYSoVPhXEaAghF6VEKJS4V9FgIIQelVCiEqFfxUBCkLoVQkhKhX+VQQoCKFXJYSolFLNZvPk5GTWpQAIm+Pj42azOetSjAVCVEqpbrfbbrdxIkBuTk5O2u12t9uddUHGAiEqpdRgMOh2u+vr63cAIBfr6+vdbncwGMy6No8FQgQAiEGIAAAxCBEAIAYhAgDEIEQAgBiECAAQgxABAGIQIgBADEIEAIhBiAAAMQgRACAGIQIAxCBEAIAYhAgAEIMQAQBiECIAQAxCVOr0AbEbGxuzfsgmQKhsbGzwgNg5QV4h0O/3Z10QgFDp9/u8QmBOaDabx8fHsy4FQNjwkqk54U7g704EKAihVyWEqFT4VxGgIIRelRCiUuFfRYCCEHpVQohKhX8VAQpC6FUJISoV/lUEKAihVyWEqFT4VxGgIIRelRCiUklX8cKFeTtHgCmAEOcBhAgwERDiWJRKpVqtNqm95SajECuVyvLy8lRKdC4sLy9Xq9UZHq5SqfR6vakVAKYPQhyLWq1WKpUSP2o0GqWz1Gq1crlccmg0GmMWI6MQl5eXK5VK4h5arVblLKKDikOr1cpRQjl0RtKs5xdixkOYfxJ6vZ5eXq/XrR1Wq1VrZTlEFidWq1V3h1B8EoVYq9WiKJp+YXIwPSF2Oh3XZWl0Oh29Yblc9iivXC6bK+cjUYjZBWTW8Gq16lFetVqdbIpUGSVpHTVD9K/farXMTy0niivdk63X61lMhxADxapKktbUajVJfYqvxWkL0VqS+AWZQrS2cneSlmCORJoQzSW9Xi+xiprVXixgbmLtpJKSYOajXq8PzTdNqemf02zl2dbFSgCt9Fm2NVPIofmmtXOEGCKJGaI07KZfmBxMu8lcLpejKJIUutPpmE1m+cha30q2O51OuVzWvzYaDfPXxMP5VxDSmsxSLZeXl+v1um7xyQqJNVbW1L/2ej1TKFZKNSZSmKHWqBiNdFNw1Wp1aGE8QhyqVEuXo5IxkYSi4VYlqaRRFBU/PVRTFqLkz+JB/e3oprS0i60xFqv5bBlwaN/EOEKUbkHxoK6cOuURy1h13nKEZUBLl+PQarXEVv4dyimYBdDlkRPxJ5geIeo9J+Z68qksSVOnv7GPEAPFrUpRFDUaDbdtV0ymKkQ9piwi0yMkojz5G2IqLIois2NROQb0dy9mJ63JLDVWRKZHSKRuS40186x6vW42BpVjQH/3YnZ0412EqMXtrum2ak3BSfkTC+9HsmZ9mvpY+mTlu9KHdrNFT5l1eRBiiDDKPDJacFZyp5NEaVPrUWZldB1KE3viA82eUWbTAuYKOr0SO+hRZmV0HaaN246jRbMZrh2k81ZrTUs6lhCHJomeDNEdL9Y5o27Lawm6+xnqO4QYKAgxK7pprPNBS2pW21YSRkuIiZyTEK180JJaYg23hJjIOEK0zGI1mUVJZtJnOcUVk78ncagQzSVar9LfagrRVfPQLwEhBgpCzEqOCdiSJCqvEOWjMWfeTOROFZ0ieYSYcXg3EVdeiX2I4uXEMriCkzKnuSlLH6LGOjVTiOpsq9ndFuYGhDgW0jpO+9QSojtVWy+cjhCtSm5hCdGdqq0X5hBiovs8gyrLy8tuURMF59+JJ3+0TGppzvquzF35v0YIGoQ4GtYwiCVEbUDr19wZ4vjTbsw6b9VkSwHjZ4ijthNHnaw32YnZbvvd/HKs78o88Sx/ErLMCoICghBHI4cQzVFmF8/Nf2oWQtQkHshz858avXtxVCGaw8pZGDpPyDxlK+lLSwMzzj1CiIGCEEcj8WZkC72yJ0M0x2TGfzyER4iJw8SJ4vNkiOaYTFpr0T8Uk0hGIZpnkUW4o66fiAhx6P3RWG/OQIiTxMoQp0a+QZXJDg7kmLZd5Pvb6ChcTBDiPMDzEAEmAkKcB0K/igAFIfSqhBCVCv8qAhSE0KsSQlQq/KsIUBBCr0oIUanwryJAQQi9KiFEpcK/igAFIfSqhBCVCv8qAhSE0KsSQlQq/KsIUBBCr0oIUSmlms3mycnJrEsBEDbHx8fNZnPWpRgLhKiUUt1ut91u40SA3JycnLTb7W63O+uCjAVCVEqpwWDQ7XbX19fvAEAu1tfXu93uYDCYdW0eC4QIABCDEAEAYhAiAEAMQgQAiEGIAAAxCBEAIAYhAgDEIEQAgBiECAAQgxABAGIQIgBADEIEAIhBiAAAMQgRACAGIQIAxCBEAIAYhKjU6QNiNzY2Zv2QTYBQ2djY4AGxc4K8QqDf78+6IACh0u/35+kVAgcHB7u7e73e08ePn3z00aMHD97b3Lx/9+7G2trbjT+vvv7Gn+ZZiM1m8/j4eNalAAibuXnJ1OHhodjw0aPHDx8++utfH25uvnP3bnPtztu3bt3+0/Kf//D6H+dZiHcCf3ciQEEIvSr1+/3XXnut2+3u7e09e7bT6/WePOk9fvxka2v7vff+8u577Vbr3fv3W/fu3V9dXbt27RpCBIBUQq9K/X7/1q1br732WvXfq/64du3a73//e4QIAKmEXpX6/f6HH3748OHDp0+f7hjs7u7Kv5q9vb39/X2ECACphF6VEKJS4V9FgIIQelVCiEqFfxUBCkLoVQkhKhX+VQQoCKFXJYSoVPhXEaAghF6VZi/EWq1WLpcTP+p0Ookf1Wq1KIomWIaMV7FSqSwvL0/wuEK1Wq1UKtVqddQNz6k8JsvLy2kF6/V6iR8tLy/X6/Use261WhnL0Ov1sqw5EXq9XqVSmeYR5wmEmJVGo1E6i1Kq0+lYCy3Tlctl132zEuLy8nKlUkn8qNVqVc4iKqk4iAXM9U2pJW4y5fLog4oaTCzTVatV130ZhShHNJ3YarVcw2o9JRY+sVRZcE9Nn7Xnb4BF4ukvOIlVaeIV9vyYQYYoKtQ/dzod+VnkqH8116nVauaSKQgxrcIkYmYT1WrVk/hUq1Ur9ahWq5YQzc2lGNMsT8UwrLmrtLyp4mSpQ4WoV5B96uIlFjVxYWJJ8jH0ivi3RYgWVlWSNKhWq9VqNTfdKSDTFmKj0dBfSqlUajQa+qNyuWz+am5iNZynJkRrSeL/ftcanp1UnIRuJCGed3larZbeZ+Vs+pYmVjetyy5E84iJeVm9XnfdlD2DG4o+uj47N1OupGegCNElMUMsl8tmGlRkpi1Ebb0oitxGtCbRjJrsQiyXy2kdlCZpTWb5Hy8VuNfrmU3ULK1Fq5fNdEe9XncrnqyQKMTzLo/eiRy9Xq8nqkGXM/HrSjyoiWzrriDHsjK1er0uq3lUJXgK40efvuxclpjfiT8V1SUEjVuVJKGJoqj46aGashDNHkP5dnQbOYoi3S4WIcpfFbe9LCtn0ZwaT4i6lpoVWDddpZZa+YtVfyzjuCKQvWXJEKdQHrNVLsv15mampsUta7oZXL1eT8zgtHQSj9tqtfQKKilXTexhNDcZFdewUvJKSqeBC0J0cauSpD5S92dSpJGYqhCjKJIvRad4HiHqTVwhTjwDTxSiru1SgbUCtCNkYVrSp5ya77Y6JcXLKMTzLo+sb67mEaLexBWi5RTzZHXr2CxGxWiTuobVXQqmEK0Wrj5oRmQ/lbMj+zrd1r2Kbg+DBUJ0YZQ5K7qBrM4K0d9kThRiqVQql8vu8EtuPFfRSprM5bp1KTNItHd0RZI65qKFouuntoC/yXx+5THXN4XoL3+iEOWM3MRKn6YpROtErDTQ7AfwCzE37jcs3QVuYVwQogtCzIruNFSnQjSHlbNniLKVjFuNc+YmnlFmnSIlZhkaqRuVlAEQk4ox00USOlNwQ0eZz6k8utNQnQrLHFbOniHqToDE5bI3U7iucfT+rV7RqQnRHOfx+w4huiDEEdD9CDmE2Ol09GiMbJuxGzEL7lXMMeFZV06PgEwvSK3WeVPFO6gyhfKYxxpViL1eT+ensq0raL1Ez4hMm9ctGa7ZTyq+1utXzk6fHPWb0TtJ+6NSOW07Z5w6DhqEOAKWELOMMosQZU3dNasd6h+Mzk7Gq5jYQtRYAkocFTUHRqT6ZZx2c97lUY4Qs4wym83zVqtlOTTNJtJyd3OrtAmAkipqIboDTWnfQBYSv2GrNxaygxBHwBplNgeLPRmirK8lqAfvdQPcw/jTbqxhB7PGWrVxpIxM0ig1ohDPrzzKaJWLrcyczpMhyvrmwE5iYcwyJ9rQPTu9vrWy7glNPKNRSfxy3LtoEkGaLghxBMyhd/k5sa/QvF/FHFCWye7mDodObpq+EDWJO3RvtnOF6GZk0ymPqQbrHhJLiHrAxBxQdk/NcpkuT+K8HE+mZi4xU+zKJG7ltm4Bkra/7Lky7H4YhOiCEHNiuUyEqPNBvVyPJosN3ZHlxJudR8UjxLRmoysaT0ZmjoGkTSvRv/ozxPMuj17BdFn9dDa4K2g9TpKoDz0wIivIqaXdhuh+M5ZurKPLfvIpySyDdeKVsynzeT8+Y85AiNPA3zoe34n5ruL4HViTZVbl8R833/1t7vybtHxtgvfPJe6KNHAkEOI8EPpVBCgIoVclhKhU+FcRoCCEXpUQolLhX0WAghB6VUKISoV/FQEKQuhVCSEqFf5VBCgIoVclhKhU+FcRoCCEXpUQolLhX0WAghB6VUKISoV/FQEKQuhVCSEqpVSz2Tw5OZl1KQDC5vj4uNlszroUY4EQlVKq2+22222cCJCbk5OTdrvd7XZnXZCxQIhKKTUYDLrd7vr6+h0AyMX6+nq32x0MBrOuzWOBEAEAYhAiAEAMQgQAiEGIAAAxCBEAIAYhAgDEIEQAgBiECAAQgxABAGIQIgBADEIEAIhBiAAAMQgRACAGIQIAxCBEAIAYS4j7+/tHSRwcHCBEAJhzLCEeHR195jOfeeGFF1544YVPfepTn//85y9duvTyyy8fHR3NsxDlAbEbGxuzfsgmQKhsbGzM3wNiJUO8ePHiN77xjRdffPHatWtvvPHG/GeI8gqBfr8/64IAhEq/35/LVwiIE7/73e9ev379zp07YsM570NsNpvHx8ezLgVA2MzNS6Y++uijZ8+e6fGTg4ODo6OjGzduaBvOuRDvBP7uRICCEHpVEiE+efJkZ2dnz+Dw8PD58+eHh4d6yf7+/sHBAUIEgFRCr0oixGfPnonyPBwcHCBEAPARelUSIe7u7rr60xI0QYgAkEroVUmE6Lrv8PBQ/rVAiACQSuhVSYToii8NhAgAqYRelUSIj0dBzZ8QAQBygxABAGIQIgBADEIEAIhBiAAAMQgRACAGIQIAxCBEAICYC0qpLQCAhUeRIQIAaBAiAEAMQgQAiEGIAAAxCBEAIAYhAgDEIEQAgBiECAAQgxABAGIQIgBADEIEAIhBiAAAMQgRACAGIQIsOoPBYHt7e21trREga2tr29vbg8FgIl8FQgRYdLa3tzc3N3d2dp4HyM7Ozubm5vvvvz+RrwIhAiw6t2/f3t3dnbXZ8rO7u3v79u2JfBUIEZ7qw7MAAAJoSURBVGDRaTQas3bauDQajYl8FQgRYNFBiBqECLDoIEQNQgRYdBCiBiECLDoIUYMQARYdhKhBiACLDkLUIESARQchahAiwKKTW4iXL1++fv16bot98YtfXFlZyb25CUIEgMkwESFev379i0l4lCeb5Du0BUIEgMkwKSFevXrVXUGEmKbLRHJknQgRACZDDiFevXrVUliODHGCIEQAmAxTyBBNtra2Ll++bK2WrwAahAgAk2HKfYhuo1i23drayleM5wgRACbFmEK8fv36yspKxgwxsZdQN8BzOxEhAsBkGEeI2cdAtra2ZGX5wVq+srKysrKSu88RIQLAZMgnRNOG/lFjyRxN2V29elVr9OrVq7oPcWVlJV9/IkIEgMmQb5RZxkYS08OhjV/JCre2tnR6OGoBLBAiAEyGiY8yZ+kNlAayzh/HBCECwGSYiBDN8ROryZy4rR5IyXdoC4QIAJNhfCHqdE8SQ3+GKM1krcJ8t6ZYIEQAmAzjC9EcJvZMKrS8qZFNxmk7I0QAmAzj3LrnDq3I6LM1yiwq9CtP6zLHGAtCBIDJwPMQNQgRYNFBiBqECLDoIEQNQgRYdBCiBiECLDoIUYMQARYdhKhBiACLzurq6t7e3qydlp/d3d3bt29P5KtAiACLzvb29ubmZqBO3Nvb29zcfP/99yfyVSBEgEVnMBhsb2+vrq42AmR1dXV7e3swGEzkq0CIAAAxCBEAIAYhAgDEIEQAgBiECAAQgxABAGIQIgBADEIEAIhBiAAAMQgRACAGIQIAxCBEAIAYhAgAEIMQAQBiECIAQAxCBACIQYgAADH/B6pSMBXiMvRLAAAAAElFTkSuQmCC" alt="" />

我们看到注册表框右边出现了一个scrollbar,错误信息的颜色也不够显眼,我们现在想把它去掉,同时让错误信息和出现错误的表单项的边框变为红色:

login.css

#register ol.register_errors {
margin:;
padding: 0 0 0 20px;
color: red;
} #register ol.register_errors li {
height: 20px;
}
login.js

showErrors: function(errorMap, errorList) {
var errors = this.numberOfInvalids();
if (errors > 0){
$("#register").dialog('option', 'height', errors * 20 + 370);
} else {
$("#register").dialog('option', 'height', 370);
};
this.defaultShowErrors();
}, hightlight: function(element, errorClass) {
$(element).css('border', '1px solid red');
}, unhightlight: function(element, errorClass) {
$(element).css('border', '1px solid #ccc');
},

现在我们想实现另一个效果,当输入项正确的时候,表单项后面出现一个对号,错误的时候出现一个叉号,如下所示:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbEAAAGVCAIAAAD/j1jGAAAgAElEQVR4nO2deXhTZdr/+8d7zTszr+PO0p7yAxFaKVCWtKW0TdlaWUrfikxeRWFAB1SUUVBqsKItDJsjFEQRwtpSIBARFJCRKVIUSpd0IwSoaIF0TWiLDtBBBXp+f5z2nJOz5SQ5Sdr0+7nua4ac9XkSn0/vZzlJAAkAAKCdAF8XAAAAOhBtTrx3756xwnzu/MUqAADoYpw7f9FYbr537x7jRGOFubCkfM2WvdpVOgQCgehSsWbL3vyiUmOFmXHi+QuVECICgeiysVqnP3+hknFiVVWVz8uEQCAQPoyqqio4EYFAINoCTkQgEAgm4EQEAoFgAk5EIBAIJuBEBAKBYAJORCAQCCbgRAQC0ekj7cMteacKioqK8mVTVFR08nRB2odbOJeCExEIRKePvFMF5eXljY2N/5FNY2NjRUVF3qkCzqU6ixNXacaoVCpV/IxVQnu1k1QSe52OWSkqlSpBk+bzWiMQCFlRWFjolBApmpqaCgsLOZdSwImzUlSqMS/N426nPCVklrSX4lV2TJonsJEjuHkzElQqlSpF276lzZLtJGjSdPPmaecJXV8EzSzBGtGnC1QKgUB0xMjPz3dWiBT5+fmcS7nvxFXz5lESsddf2ipNisreYvSul+LbjTMrxd6JY16a166/NieKCC5+hpZy4qR5vCK1ncIoj7oLI1nuARy9OulQBALh6+hQTqRCO0mlUo3RTJKUi53mZDqx/eJt7kt7Kb7NTasUd6LApUQuiEAgOlR0QCcKBNdEdDjrxHkalf0u1ZiX5sGJCASiPfhOvH79ular1ev19Ba9Xq/Vaq9fv+5hJ4r7QjEnMkOTbHk5dKL8vjCciEB07uA7UdsOpUVKiBSedeK8edp5IpPCijixLTHkI9xP18xahTwRgehywXciW4Kcf3esvjO1UTYsDVE9aN6886R5vF1wIgLRxUJwPJGtQkEhetCJzHIcSk/SglN83lkhJzohaAQC0ZFCbI5FIkP0qBPblkxz8ixX+s4pWq3AeKJOu0osT0zQpIk5Ub7jWJcSrCDyRASiY4egE3fv3s3JEzds2OAVJ4ooQ9SJLIUxTmRt5Dix7amSGdTsc0K7Oh06UX6eSDkdykMgOmvwncgWIjtb5GjRI05krY+x2y7mRLbyaCfy51XaT2yfdJ7RJr72B+9YIuM4kbV2R7gkHCey8laff7QIBMKFkJh3piS4YcMGL807SzyJLOZE9nbaieyNQvPOmlm0+NJeilep4sewRGzvRN5TgI6cyO2VIxCIThZi6xPZWSGlRc+vTxQZTNSKOtHuOeh2J9pttHPiPE28KiF+htbeXPYiltglWBJ7JzL9d19/rggEwrXoSM+xpGknjWnzi+haQgaNhs77Vum0tI9SNAIbWZKal7aKPwrJzIqwndg+8c0+neNE+84+BhMRiE4fHcmJzse8GQnxM1Yxq3ba+78CG1mn2EmQ0hxnAJE9x2J/ersTtew1N23SnKcRSmYRCERnisLCIle/K6yIc6nO8v2JCAQ*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" alt="" />

首先我们设计两个CSS样式:

login.css

#register span.succ {
display: inline-block; padding: 5px;
width: 28px;
height: 28px; background: url(../img/success.png) no-repeat top;
} #register span.failure {
display: inline-block; padding: 5px;
width: 28px;
height: 28px; background: url(../img/failure.png) no-repeat top;
}

然后在login.js中添加如下代码:

login.js

highlight: function(element, errorClass) {
$(element).css('border', '1px solid red');
$(element).parent().find('span').html('&nbsp;').removeClass('succ').addClass('failure');
}, unhighlight: function(element, errorClass) {
$(element).css('border', '1px solid #ccc');
$(element).parent().find('span').html('&nbsp;').removeClass('star').addClass('succ');
},

7. Ajax验证数据

这里也是应用的validate插件的功能,基本思路如下:通过remote将数据Ajax提交给服务器,服务器调用相应的方法检查字段,返回'true'或'false'给remote。注意,remote只接受字符串true或false作为返回值,所以checkUserName和checkEmail都返回true或false。

login.js

rules: {
username: {
required: true,
minlength: 2,
maxlength: 20,
remote: {
url: ThinkPHP['MODULE'] + '/User/checkUserName',
type: 'POST',
/* beforeSend: function() {
$('#username').next().html('&nbsp;').removeClass('succ').addClass('loading');
},
complete: function(jqXHR) {
if (jqXHR.responseText == 'true') {
$('#username').next().html('&nbsp;').removeClass('loading').addClass('succ');
} else {
$('#username').next().html('&nbsp;').removeClass('loading').addClass('failure');
}
} */
},
},
password: {
required: true,
minlength: 6,
maxlength: 30,
},
repassword: {
required: true,
equalTo: '#password',
},
email: {
required: true,
email: true,
remote: {
url: ThinkPHP['MODULE'] + '/User/CheckEmail',
type: 'POST',
/* beforeSend: function() {
$('#email').next().html('&nbsp;').removeClass('succ').addClass('loading');
},
complete: function(jqXHR) {
if (jqXHR.responseText == 'true') {
$('#email').next().html('&nbsp;').removeClass('loading').addClass('succ');
} else {
$('#email').next().html('&nbsp;').removeClass('loading').addClass('failure');
}
} */
},
},
},
UserModel.class.php

//验证占用字段
public function checkField($field, $type) {
$data = array();
switch ($type) {
case 'username':
$data['username'] = $field;
break;
case 'email':
$data['email'] = $field;
break;
default:
return 0;
} return $this->create($data)? 1 : $this->getError(); }
UserController.class.php

//Ajax验证数据,账号返回给Ajax
public function checkUserName() {
if (IS_AJAX) {
$user = new UserModel();
$uid = $user->checkField(I('username'), 'username');
echo $uid > 0? 'true' : 'false';
}
} //Ajax验证数据,邮箱返回给Ajax
public function checkEmail() {
if (IS_AJAX) {
$user = new UserModel();
$uid = $user->checkField(I('email'), 'email');
echo $uid > 0? 'true' : 'false';
}
}

8. 完善及邮箱补全

到这一步,登陆界面已经快完成了,但还有几个需要完善的地方。首先我们希望在用户提交了注册信息到服务器返回这段时间能有一个提示信息,用户注册成功后也有一个提示信息,像下面这样:

aaarticlea/png;base64,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" alt="" />

aaarticlea/png;base64,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" alt="" />

这两个提示框其实是两个没有titlebar的dialog,其中第一个dialog我们是写在模板文件中的,第二个dialog是通过javascript替换第一个的图标和文字内容实现的:

index.tpl

<div id="loading">数据交互中...</div>

它的CSS代码如下:

login.css

#loading {

    font-size: 14px;
font-weight: bold;
color: #666;
line-height: 25px;
text-indent: 40px; background: url(../img/loading.gif) no-repeat 20px center;
}
login.js

submitHandler: function(form) {
$(form).ajaxSubmit({
url: ThinkPHP["MODULE"] + "/User/register",
type: "POST",
beforeSubmit: function() {
$('#loading').dialog('open');
},
success: function(responseText) {
if (responseText) {
$('#loading').css('background', 'url(' + ThinkPHP['IMG'] + '/reg_success.png) no-repeat 20px center').html('数据新增成功...'); }
},
});
},

现在当用户注册成功的时候会有提示信息,但是现在该信息和注册界面都不会消失,所以我们还得加上让它们消失的代码。此外,如果提示信息消失的太快会显得很突兀,所以我们给它加上一秒的延时:

login.js

success: function(responseText) {
if (responseText) {
$('#loading').css('background', 'url(' + ThinkPHP['IMG'] + '/reg_success.png) no-repeat 20px center').html('数据新增成功...');
setTimeout(function() {
$('#register').dialog('close'); //关闭注册界面
$('#loading').dialog('close'); //关闭提示界面
$('#register').resetForm(); //还原注册表单
$('#register span.star').html('*').removeClass('succ'); //恢复*去掉对号
}, 1000);
}
},

对于邮箱补全功能,我直接copy了网上现成的代码:

$("#email").autocomplete({
delay: 0, //默认为300 毫秒,延迟显示设置。
autoFocus:true, //设置为true 时,第一个项目会自动被选定。
source: function (request, response) { var hosts = ["qq.com", "163.com", "263.com", "sina.com.cn", "gmail.com", "hotmail.com"];//邮箱域名集合 var term = request.term; //获取用户输入的内容;
var name = term; //邮箱的用户名
var host = ""; //邮箱的域名 例如qq.com
var ix = term.indexOf('@'); //@的位置
var result = []; //最终呈现的邮箱列表 //当用户输入的数据(email)里存在@的时候,就重新给用户名和域名赋值
if (ix > -1) { //如果@符号存在,就表示用户已经输入用户名了。
name = term.slice(0, ix);
host = term.slice(ix + 1);
} if (name) { //如果name有值 即:不为空 var getHosts = []; //根据用户名填写的域名我们在hosts里面找到对应的域名集合 getHosts= host ? ($.grep(hosts, function (val) { return val.indexOf(host) > -1 })) : hosts; result = $.map(getHosts, function (val) { //这个val就是getHosts里的每个域名元素。
return name + "@" + val;
});
}
result.unshift(term); // unshift方法的作用是:将一个或多个新元素添加到数组开始,数组中的元素自动后移,返回数组新长度 response(result); }
});

这里有一个问题就是dialog阻止了溢出(overflow),导致自动提示的内容显示不全:

aaarticlea/png;base64,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" alt="" />

我们需要设置dialog显示溢出:

login.css

.ui-dialog {
border: none;
overflow: visible;
}

9. 弹出验证码

为了防止机器注册,我们给注册页面添加一个弹出验证码的功能。这里需要一个新的dialog,我在模板文件里新添加一个form:

index.tpl

<form id="verify_register">
<ol class="ver_error"></ol>
<p>
<label for="verify">验证码:</label>
<input type="text" name="verify" class="text" id="verify">
<span class="star">*</span>
<a href="javascript:void(0)" class="changeimg">换一换</a>
</p>
<p>
<img src='{:U("Login/verify",'','')}' class="changeimg verifyimg">
</p>
</form>

然后我们在LoginController.class.php中添加一个verify方法,就是上面img的src中的方法:

LoginController.class.php

<?php
namespace Home\Controller;
use Think\Controller; class LoginController extends Controller {
public function index() {
$this->display();
} public function verify() {
$verify = new \Think\Verify();
$verify->entry(1);
}
}

在javascript中将form变为dialog:

login.js

$("#verify_register").dialog({
width: 290,
height: 300,
modal: true,
resizable: false,
autoOpen: true,
title: "请输入验证码",
closeText: "关闭",
buttons: [{
text: "完成",
click: function(e) {
$(this).submit();
},
}],
});

最后为这个验证码弹出页面添加样式:

login.css
i
#verify_register input.text {
padding: 5px;
border: 1px solid #ccc;
border-radius: 3px;
width: 85px;
height: 25px; background: #fff;
}

我们还需要验证码刷新的功能,这样是通过javascript实现的:

login.js

//点击更换验证码
var verifyimg = $('.verifyimg').attr('src');
$('.changeimg').click(function(){
$('.verifyimg').attr('src', verifyimg + '?random=' + Math.random());
});

上周日添加了验证码功能后,注册表单的提交按钮突然不好用了,详细检查了login.js,依然无果。今天又查看了一下其它文件,终于找到了问题的原因,原来是UserController.class.php里一个函数写错了:

UserController.class.php

//Ajax验证数据,邮箱返回给Ajax
public function checkEmail() {
if (IS_AJAX) {
$user = new UserModel();
$uid = $user->checkField(I('email'), 'email');
echo $uid > 0? 'true' : 'false';
}
} //Ajax验证数据,验证码返回给Ajax
public function checkEmail() { //应该是checkVerify
if (IS_AJAX) {
if (check_verify(I('verify'))) {
echo "验证码正确";
} else {
echo "验证码错误";
}
}
}

10. 登陆验证

当用户登陆的时候,既可以使用用户名,也可以用邮箱,因为用户名和邮箱都是唯一的。但是这里有一个问题,那就是如果用户用邮箱作为用户名来注册,这就可能出现一个用户有两个账号的问题,所以我们需要在注册的用户名上做一些限制,使邮箱无法作为用户名来注册。方法也很简单,就是限制用户名不能包含@符号。

我们需要同时在客户端和服务器端进行检测。

客户端代码:

login.js

//自定义验证,不得包含@符号
$.validator.addMethod('inAt', function(value, element) {
var text = /^[^@]+$/i; //注意不要加引号!!!
return this.optional(element) || (text.test(value));
}, '存在@符号');
login.js

rules: {
username: {
required: true,
inAt: true,
minlength: 2,
maxlength: 20,
remote: {
url: ThinkPHP['MODULE'] + '/User/checkUserName',
type: 'POST',
login.js

messages: {
username: {
required: '账号不得为空',
inAt: '账号不得包含@符号',
minlength: $.format('账号不得小于{0}位!'),
maxlength: $.format('账号不得大于{0}位!'),
remote: '账号被占用',
},

现在当用户登陆的时候可以使用用户名也可以使用邮箱名,当然登陆方式还是采用ajax方式:

login.js

$('#login').validate({
submitHandler: function(form){
$(form).ajaxSubmit({
url: ThinkPHP['MODULE'] + '/User/login',
type: 'POST',
});
},
});

后台的登陆处理程序是UserController.class.php中的login方法:

Usercontroller.class.php

//Ajax验证数据,账号返回给Ajax
public function login() {
if (IS_AJAX) {
$user = new UserModel();
$uid = $user->login(I('username'), I('password'));
echo $uid;
} else {
$this->error('非法访问');
}
}

它又调用了UserModel.class.php中的login方法:

UserModel.class.php

//登陆验证
public function login($username, $password) {
$data = array(
'login_username' => $username,
'password' => $password,
); //where条件
$map = array(); if ($this->create($data)) {
//这里采用邮箱登陆
$map['email'] = $username;
$user = $this->field('id, password')->where($map)->find();
if ($user['password'] == $password) {
return $user['id'];
} else {
return -9; //用户密码错误
} } else {
if($this->getError() == 'noemail') {
//这里采用用户名登陆
$map['username'] = $username;
$user = $this->field('id, password')->where($map)->find();
if ($user['password'] == $password) {
return $user['id'];
} else {
return -9; //用户密码错误
} } else {
echo $this->getError();
}
} }

我们可以看到这里在处理用户名登陆和邮箱名登陆时有一部分代码是相同的,我们可以把这部分代码拿出来:

UserModel.class.php

//登陆验证
public function login($username, $password) {
$data = array(
'login_username' => $username,
'password' => $password,
); //where条件
$map = array(); if ($this->create($data)) {
//这里采用邮箱登陆
$map['email'] = $username;
} else {
if($this->getError() == 'noemail') {
//这里采用用户名登陆
$map['username'] = $username;
} else {
echo $this->getError();
}
} $user = $this->field('id, password')->where($map)->find();
if ($user['password'] == $password) {
return $user['id'];
} else {
return -9; //用户密码错误
} }

当用户登录的时候如果登录信息不合法,我们需要显示错误信息,这里我们把信息显示在相应的input中,如下图所示:

aaarticlea/png;base64,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" alt="" />

首先我们需要改造模板页面,把username和password放到span标签中:

index.tpl

<div id="main">
<form id="login">
<div class="top">
<span class="username">
<input type="text" name="username" placeholder="用户名/邮箱">
</span>
<span class="password">
<input type="password" name="password" placeholder="密码">
</span>
<input type="submit" name="submit" value="登录">
</div>
<div class="bottom">
<a href="javascript:void(0)" id="reg_link">注册新用户</a>
<a href="javascript:void(0)">忘记密码?</a>
</div>
</form>
</div>

接着设计CSS:

login.css

#login span.username, #login span.password {
position: relative;
} #login span.username label.error, #login span.password label.error {
position: absolute;
right: 20px;
bottom: 0px; color: #f90;
}

前端验证代码如下:

login.js

$('#login').validate({
submitHandler: function(form){
$(form).ajaxSubmit({
url: ThinkPHP['MODULE'] + '/User/login',
type: 'POST',
});
},
rules: {
username: {
required: true,
minlength: 2,
maxlength: 50,
},
password: {
required: true,
minlength: 6,
maxlength: 30,
},
},
messages: {
username: {
required: '账号不得为空',
minlength: $.format('账号不得小于{0}位!'),
maxlength: $.format('账号不得大于{0}位!'),
},
password: {
required: '密码不得为空',
minlength: $.format('密码不得小于{0}位!'),
maxlength: $.format('密码不得大于{0}位!'),
},
},
});

当用户点击登录按钮之后,我们需要根据ajax返回数据做出反应,这主要是通过javascript实现的:

login.js

$('#login').validate({
submitHandler: function(form){
$(form).ajaxSubmit({
url: ThinkPHP['MODULE'] + '/User/login',
type: 'POST',
beforeSubmit: function() {
$('#loading').dialog('open');
},
success: function(responseText) {
if (responseText == -9) {
$('#loading').dialog('option', 'width', 200).css('background', 'url(' + ThinkPHP['IMG'] + '/warning.png) no-repeat 20px center').html('账号或密码不正确...');
setTimeout(function(){
$('#loading').dialog('close');
$('#loading').dialog('option', 'width', 180).css('background', 'url(' + ThinkPHP['IMG'] + '/loading.gif) no-repeat 20px center').html('数据交互中...');
}, 2000);
} else {
$('#loading').dialog('option', 'width', 220).css('background', 'url(' + ThinkPHP['IMG'] + '/reg_success.png) no-repeat 20px center').html('登录成功,跳转中...');
setTimeout(function(){
location.href = 'http://www.baidu.com';
}, 1000);
}
},
});