YII MVC之用户注册和用户登录(一)
来源:互联网 发布:环境地质数据包括哪些 编辑:程序博客网 时间:2024/05/17 01:13
这部分主要包含
1 基本控制器、模型、视图使用规则;
2 登录和注册在视图通过表单使用YII小物件并分析;
3 模型中规则制定和分析;
4 控制器用方法形式访问其他类;
5 进行session和cookie分析 ,并在前后区分session和cookie;
6 生成验证码 ;
这期间也会会有错误,会不断修正
先看下目录结构:
1 基本控制器、模型、视图使用规则;
控制器:都需要继承Controller基类 进行外部访问的方法都需要以action做为方法名称的开始。
用方法形式访问其他类,需要定义actions方法,返回一个二维数组
模型:继承CActiveRecord,基本要实现:四个方法,一个是model,是静态public类型,用来返回模型名称,
一个talbeName,用来返回方法名称;
一个是attributeLabels,设置显示内容,将前面视图中英文转化为汉字,进行统一管理
一个是rules,设置一些验证规则
视图:主要是通过小物件来实现,$this -> beginWidget('CActiveForm');
此篇把主要贴下来,下面再进行调用讲解
前台控制器:
[php] view plaincopy
<?php
/**
* 用户控制器
*/
class UserController extends Controller{
/*
* 验证码生成
* 以下代码的意思:在当前控制器里边,以方法的形式访问其他类
* 我们访问./index.php?r=user/captcha就会访问到以方法的CCaptchaAction
* 会走CCaptchaAction类里边的run()方法
*
* 谁会过来使用 user/captcha 这个路由
* 答:是视图表单间接过来调用($this->widget('CCaptcha'))
*/
function actions(){
return array(
'captcha'=>array(
'class'=>'system.web.widgets.captcha.CCaptchaAction',
'width'=>75,
'height'=>30,
),
//我们在外边随便定义一个类,都可以通过这种方式访问
// user/co 就会访问Computer.php里边的run()方法
'co'=>array(
'class'=>'application.controllers.Computer',
),
);
}
/**
*用户登录
*/
function actionLogin(){
echo $this -> id."<br />";
echo $this -> action->id;
//创建登录模型对象
$user_login = new LoginForm;
if(isset($_POST['LoginForm'])){
//收集表单信息
$user_login->attributes = $_POST['LoginForm'];
//校验数据,走的是rules()方法
//该地方不只校验用户名和密码是否填写,还要校验真实性(在模型里边自定义方法校验真实性)
//用户信息进行session存储,调用模型里边的一个方法login(),就可以进行session存储
if($user_login->validate() && $user_login->login()){
$this ->redirect ('./index.php');
}
}
$this -> render('login',array('user_login'=>$user_login));
}
/*
* 实现用户注册功能:
* 1. 展现注册表单
* 2. 收集数据、校验数据、存储数据
*/
function actionRegister(){
//实例化数据模型对象user
$user_model = new User();
/**
* renderPartial不渲染布局
* render会渲染布局
*/
//$this ->renderPartial('register');
//性别信息
$sex[1] = "男";
$sex[2] = "女";
$sex[3] = "保密";
//定义学历
$xueli[1] = "-请选择-";
$xueli[2] = "小学";
$xueli[3] = "初中";
$xueli[4] = "高中";
$xueli[5] = "大学";
//定义爱好信息
$hobby[1] = "篮球";
$hobby[2] = "足球";
$hobby[3] = "排球";
$hobby[4] = "棒球";
//如果用户有注册表单
if(isset($_POST['User'])){
//给模型收集表单信息
//foreach($_POST['User'] as $_k => $_v){
// $user_model -> $_k = $_v;
//}
//收集转化爱好的信息implode
if(is_array($_POST['User']['user_hobby']))
$_POST['User']['user_hobby'] = implode(',',$_POST['User']['user_hobby']);
//密码要md5加密
$_POST['User']['password'] = md5($_POST['User']['password']);
$_POST['User']['password2'] = md5($_POST['User']['password2']);
//上边的foreach,在yii框架里边有优化,使用模型属性attributes来进行优化
//attributes 属性已经把foreach集成好了,我们可以直接使用
$user_model -> attributes = $_POST['User'];
//实现信息存储
if($user_model -> save())
$this ->redirect ('./index.php'); //重定向到首页
}
$this -> render('register',array('user_model'=>$user_model,'sex'=>$sex,'xueli'=>$xueli,'hobby'=>$hobby));
}
function actionCc(){
echo "cc";
}
/*
* 用户退出系统
*/
function actionLogout(){
//删除session信息
//Yii::app()->session->clear(); //删除内存里边sessiion变量信息
//Yii::app()->session->destroy(); //删除服务器的session文件
//session和cookie一并删除
Yii::app()->user->logout();
$this->redirect('/');
}
/*
* session使用
*/
function actionS1(){
echo $this->id."<br />";
echo $this->action->id."<br />";
//设置session,通过session组件来设置
Yii::app()->session['username'] = "zhangsan";
Yii::app()->session['useraddr'] = "beijing";
echo "make session success";
}
function actionS2(){
//使用session
echo Yii::app()->session['username'],"<br />";
echo Yii::app()->session['useraddr'];
echo "use session success";
}
function actionS3(){
//删除一个session
//unset(Yii::app()->session['useraddr']);
//删除全部session
Yii::app()->session->clear(); //删除session变量
Yii::app()->session->destroy(); //删除服务器的session信息
}
/*
* cookie在Yii框架使用
*/
function actionC1(){
//设置cookie
$ck = new CHttpCookie('hobby','篮球,足球');
$ck -> expire = time()+3600;
//把$ck对象放入cookie组件里边
Yii::app()->request->cookies['hobby'] = $ck;
$ck2 = new CHttpCookie('sex','nan');
$ck2 -> expire = time()+3600;
//把$ck对象放入cookie组件里边
Yii::app()->request->cookies['sex'] = $ck2;
echo "cookie make success";
}
function actionC2(){
//访问cookie
echo Yii::app()->request->cookies['hobby'],"<br />";
echo Yii::app()->request->cookies['sex'];
}
function actionC3(){
//删除cookie
unset(Yii::app()->request->cookies['sex']);
}
function actionLu(){
//输出路径别名信息/yii就是框架直接可以操作使用的类
//Yii::app() 是一个实例,是在当前框架里边唯一可以直接使用的实例对象
//echo Yii::getPathOfAlias('system'); //D:\www\0507\framework
//echo Yii::getPathOfAlias('system.web'); //D:\www\0507\framework\web
//echo Yii::getPathOfAlias('application'); //D:\www\0507\shop\protected
//echo Yii::getPathOfAlias('zii'); //D:\www\0507\framework\zii
echo Yii::getPathOfAlias('webroot'); //D:/www/0507/shop
}
/*
* 使用Yii::app()调用相关属性、方法
*/
function actionAp(){
echo Yii::app()->defaultController,"<br />";
echo Yii::app()->layout,"<br />";
echo Yii::app()->name,"<br />";
echo Yii::app()->charset,"<br />";
echo Yii::app()->getLayoutPath(),"<br />";
echo Yii::app()->request->getUrl(),"<br />";
echo Yii::app()->request->getHostInfo(),"<br />";
}
/*
* 计算脚本执行时间
*/
function actionTime(){
//查看脚本开始时间
Yii::beginProfile('mytime');
for($i=0; $i<=100; $i++){
if($i%7==0)
echo "seven<br />";
else if($i%8==0)
echo "eight<br />";
else
echo $i."<br />";
}
Yii::endProfile('mytime');
}
}
前台user模型:
User.php
[php] view plaincopy
<?php
/**
* 用户模型model
* 两个基本方法:
* model
* tableName
*/
class User extends CActiveRecord{
//在当前模型增加一个属性password2,因为数据库表里边没有这个属性
//我们可以在当前类直接设置这个属性使用
public $password2;
//获得数据模型方法
public static function model($className = __CLASS__) {
return parent::model($className);
}
//定义数据表名字
public function tableName(){
return "{{user}}";
}
//设置标签名字与数据库字段对应
public function attributeLabels() {
return array(
'username'=>'用户名',
'password'=>'密 码',
'password2'=>'确认密码',
'user_sex'=>'性 别',
'user_qq'=>'qq号码',
'user_hobby'=>'爱 好',
'user_xueli'=>'学 历',
'user_introduce'=>'简 介',
'user_email'=>'邮 箱',
'user_tel'=>'手机号码',
);
}
/*
* 实现用户注册表单验证
* 在模型里边设置一个方法,定义具体表单域验证规则
*/
public function rules() {
return array(
array('username','required','message'=>'用户名必填'),
//用户名不能重复(与数据库比较)
array('username', 'unique', 'message'=>'用户名已经占用'),
array('password','required','message'=>'密码必填'),
//验证确认密码password2 要与密码的信息一致
array('password2','compare','compareAttribute'=>'password','message'=>'两次密码必须一致'),
//邮箱默认不能为空
array('user_email','email','allowEmpty'=>false, 'message'=>'邮箱格式不正确'),
//验证qq号码(都是数字组成,5到12位之间,开始为非0信息,使用正则表达式验证)
array('user_qq','match','pattern'=>'/^[1-9]\d{4,11}$/','message'=>'qq格式不正确'),
//验证手机号码(都是数字,13开始,一共有11位)
array('user_tel','match','pattern'=>'/^13\d{9}$/','message'=>'手机号码格式不正确'),
//验证学历(信息在2、3、4、5之间则表示有选择,否则没有),1正则;2范围限制
//范围限制
array('user_xueli','in','range'=>array(2,3,4,5),'message'=>'学历必须选择'),
//验证爱好:必选两项以上(自定义方法对爱好进行验证)
array('user_hobby','check_hobby'),
//为没有具体验证规则的属性,设置安全的验证规则,否则attributes不给接收信息
array('user_sex,user_introduce','safe'),
);
}
/*
* 在当前模型里边定义一个方法check_hobby对爱好进行验证
*/
function check_hobby(){
//在这个方法里边,我们可以获得模型的相关信息
//$this -> 属性名; //调用模型对象的相关属性信息
//$this 就是我们在控制器controller里边实例化好的模型对象
$len = strlen($this -> user_hobby);
if($len < 3)
$this -> addError('user_hobby','爱好必须选择两项或以上');
}
}
前台登陆视图:
login.php
[php] view plaincopy
<style type="text/css">
div .errorMessage{color:red;}
label .required {color:red;}
</style>
<div class="block box">
<div class="usBox clearfix">
<div class="usBox_1 f_l">
<div class="logtitle"></div>
<?php $form = $this -> beginWidget('CActiveForm'); ?>
<table align="left" border="0" cellpadding="3" cellspacing="5" width="100%">
<tbody><tr>
<td align="right" width="25%">
<?php echo $form->labelEx($user_login,'username'); ?>
</td>
<td width="75%">
<?php echo $form->textField($user_login,'username',array('size'=>25,'class'=>'inputBg')); ?>
<?php echo $form->error($user_login,'username'); ?>
</td>
</tr>
<tr>
<td align="right">
<?php echo $form->labelEx($user_login,'password'); ?>
</td>
<td>
<?php echo $form->textField($user_login,'password',array('size'=>15,'class'=>'inputBg')); ?>
<?php echo $form->error($user_login,'password'); ?>
</td>
</tr>
<tr>
<td align="right">
<?php echo $form->labelEx($user_login, 'verifyCode'); ?>
</td>
<td>
<?php echo $form->textField($user_login, 'verifyCode',array('size'=>15,'class'=>'inputBg','maxlength'=>4)); ?>
<!--显示验证码图片/使用小物件显示验证码-->
<?php $this -> widget('CCaptcha'); ?>
<?php echo $form->error($user_login,'verifyCode'); ?>
</td>
</tr>
<tr>
<td align="right">
<?php echo $form->checkBox($user_login, 'rememberMe'); ?>
</td>
<td>
<?php echo $form->labelEx($user_login, 'rememberMe'); ?>
</td>
</tr>
<tr>
<td> </td>
<td align="left">
<input name="submit" value="" class="us_Submit" type="submit" />
</td>
</tr>
<tr><td></td><td><a href="#" class="f3">密码问题找回密码</a> <a href="#" class="f3">注册邮件找回密码</a></td></tr>
</tbody>
</table>
<?php $this->endWidget(); ?>
<div class="blank"></div>
</div>
<div class="usTxt">
<div class="regtitle"></div>
<div style="padding-left: 50px;">
<strong>如果您不是会员,请注册</strong> <br />
<strong class="f4">友情提示:</strong><br />
不注册为会员也可在本店购买商品<br />
但注册之后您可以:<br />
1. 保存您的个人资料<br />
2. 收藏您关注的商品<br />
3. 享受会员积分制度<br />
4. 订阅本店商品信息 <br />
<a href="#"><img src="<?php echo IMG_URL; ?>bnt_ur_reg.gif"></a>
</div>
</div>
</div>
</div>
</div>
前台register.php视图
[php] view plaincopy
<!--放入view具体内容-->
<style type="text/css">
div .errorMessage{color:red;}
label .required {color:red;}
</style>
<div class="block box">
<div class="usBox">
<div class="usBox_2 clearfix">
<div class="logtitle3"></div>
<?php $form = $this -> beginWidget('CActiveForm',
array(
'enableClientValidation'=>true,
'clientOptions'=>array(
'validateOnSubmit'=>true,
),
)
);
?>
<table cellpadding="5" cellspacing="3" style="text-align:left; width:100%; border:0;">
<tbody>
<tr>
<td style="width:13%; text-align: right;">
<?php echo $form->labelEx($user_model, 'username'); ?>
</td>
<td style="width:87%;">
<?php echo $form->textField($user_model,'username',array('class'=>'inputBg','id'=>'User_username')); ?>
<!--表单验证失败显示错误信息-->
<?php echo $form ->error($user_model,'username'); ?>
</td>
</tr>
<tr>
<td align="right">
<?php echo $form->labelEx($user_model, 'password'); ?>
</td>
<td>
<?php echo $form->passwordField($user_model,'password',array('class'=>'inputBg','id'=>'User_password')); ?>
<?php echo $form ->error($user_model,'password'); ?>
</td>
</tr>
<tr>
<td align="right">
<?php echo $form->label($user_model,'password2') ?>
</td>
<td>
<?php echo $form->passwordField($user_model,'password2',array('class'=>'inputBg','id'=>'User_password2')); ?>
<?php echo $form ->error($user_model,'password2'); ?>
</td>
</tr>
<tr>
<td align="right"><?php echo $form->label($user_model, 'user_email'); ?></td>
<td>
<?php echo $form->textField($user_model,'user_email',array('class'=>'inputBg','id'=>'User_user_email')); ?>
<?php echo $form->error($user_model,'user_email'); ?>
</td>
</tr>
<tr>
<td align="right"><?php echo $form->label($user_model, 'user_qq'); ?></td>
<td>
<?php echo $form->textField($user_model,'user_qq',array('class'=>'inputBg','id'=>'User_user_qq')); ?>
<?php echo $form->error($user_model,'user_qq'); ?>
</td>
</tr>
<tr>
<td align="right"><?php echo $form->label($user_model, 'user_tel'); ?></td>
<td>
<?php echo $form->textField($user_model,'user_tel',array('class'=>'inputBg','id'=>'User_user_tel','maxlength'=>11)); ?>
<?php echo $form->error($user_model,'user_tel'); ?>
</td>
</tr>
<tr>
<!--radioButtonList($model,$attribute,$data,$htmlOptions=array())-->
<td align="right"><?php echo $form->label($user_model, 'user_sex'); ?></td>
<td>
<?php echo $form->radioButtonList($user_model,'user_sex',$sex,array('separator'=>' ')); ?>
</td>
</tr>
<tr>
<!--dropDownList($model,$attribute,$data,$htmlOptions=array())-->
<td align="right"><?php echo $form->label($user_model, 'user_xueli'); ?></td>
<td>
<?php echo $form -> dropDownList($user_model,'user_xueli',$xueli); ?>
<?php echo $form->error($user_model,'user_xueli'); ?>
</td>
</tr>
<tr>
<!--checkBoxList($model,$attribute,$data,$htmlOptions=array())-->
<td align="right"><?php echo $form->label($user_model, 'user_hobby'); ?></td>
<td>
<?php echo $form -> checkBoxList($user_model,'user_hobby',$hobby,array('separator'=>' ')); ?>
<?php echo $form->error($user_model,'user_hobby'); ?>
</td>
</tr>
<tr>
<!--textArea($model,$attribute,$htmlOptions=array())-->
<td align="right"><?php echo $form->label($user_model, 'user_introduce'); ?></td>
<td>
<?php echo $form -> textArea($user_model,'user_introduce',array('cols'=>50,'rows'=>5)); ?>
</td>
</tr>
<tr>
<td> </td>
<td align="left">
<input name="Submit" value="" class="us_Submit_reg" type="submit" />
</td>
</tr>
<tr>
<td colspan="2"> </td>
</tr>
</tbody>
</table>
<?php $this->endWidget(); ?>
</div>
</div>
</div>
<!--放入view具体内容-->
</div>
后台管理员登陆模块
控制器:ManagerController.php
[php] view plaincopy
<?php
/**
* 后台管理员登录控制器
*/
class ManagerController extends Controller{
/*
* 实现用户登录
*/
function actionLogin(){
$login_model = new LoginForm();
if(isset($_POST['LoginForm'])){
$login_model->attributes = $_POST['LoginForm'];
//用户名和密码(包括真实性)判断validate,持久化session信息login
if($login_model->validate() && $login_model->login())
$this->redirect('./index.php?r=houtai/index/index');
}
//调用模板
$this ->renderPartial('login',array('login_model'=>$login_model));
}
/*
* 管理员退出系统
*/
function actionLogout(){
//删除session变量
Yii::app()->session->clear();
//删除服务器session信息
Yii::app()->session->destroy();
//页面重定向到登录页面
$this -> redirect('./index.php?r=houtai/manager/login');
}
}
后台模型:
Manager.php
[php] view plaincopy
<?php
/**
* 后天管理员数据模型manager
* 基本方法:
* model()
* tableName()
* rules()
* attributeLabels()
*/
class Manager extends CActiveRecord{
public static function model($className = __CLASS__) {
return parent::model($className);
}
public function tableName() {
return '{{manager}}';
}
}
LoginForm.php
[php] view plaincopy
<?php
/**
* LoginForm class.
* LoginForm is the data structure for keeping
* user login form data. It is used by the 'login' action of 'SiteController'.
*/
class LoginForm extends CFormModel
{
public $username;
public $password;
private $_identity;
/**
* Declares the validation rules.
* The rules state that username and password are required,
* and password needs to be authenticated.
*/
public function rules()
{
return array(
// username and password are required
array('username', 'required','message'=>'用户名必填'),
array('password', 'required','message'=>'密码必填'),
// password needs to be authenticated
//array('password', 'authenticate'),
//校验用户名和密码的真实性,通过自定义方法实现校验
array('password','authenticate'),
);
}
/**
* Authenticates the password.
* This is the 'authenticate' validator as declared in rules().
*/
public function authenticate($attribute,$params)
{
if(!$this->hasErrors())
{
$this->_identity=new UserIdentity($this->username,$this->password);
if(!$this->_identity->authenticate())
$this->addError('password','用户名或密码不存在');
}
}
/**
* Declares attribute labels.
*/
public function attributeLabels()
{
return array(
'username'=>'用户名',
'password'=>'密 码',
);
}
/**
* Logs in the user using the given username and password in the model.
* @return boolean whether login is successful
*/
public function login()
{
if($this->_identity===null)
{
$this->_identity=new UserIdentity($this->username,$this->password);
$this->_identity->authenticate();
}
if($this->_identity->errorCode===UserIdentity::ERROR_NONE)
{
//$duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days
Yii::app()->user->login($this->_identity,$duration);
return true;
}
else
return false;
}
}
视图login.php
[php] view plaincopy
<!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>
<style type="text/css">
.errorMessage {clear:both;}
</style>
<link href="<?php echo HOUTAI_CSS_URL ?>User_Login.css" type="text/css" rel="stylesheet" />
</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">
<?php $form = $this -> beginWidget('CActiveForm'); ?>
<ul>
<li class="user_main_l"></li>
<li class="user_main_c">
<div class="user_main_box">
<ul>
<li class="user_main_text">
<?php echo $form -> labelEx($login_model, 'username'); ?>
</li>
<li class="user_main_input">
<?php echo $form -> textField($login_model,'username',array('class'=>'TxtUserNameCssClass','maxlength'=>20)); ?>
<?php echo $form->error($login_model,'username'); ?>
</li></ul>
<ul>
<li class="user_main_text"><?php echo $form -> labelEx($login_model, 'password'); ?> </li>
<li class="user_main_input">
<?php echo $form -> textField($login_model,'password',array('class'=>'TxtPasswordCssClass','maxlength'=>20)); ?>
<?php echo $form->error($login_model,'password'); ?>
</li>
</ul>
</div>
</li>
<li class="user_main_r">
<input style="border: medium none; background: url('<?php echo HOUTAI_IMG_URL; ?>user_botton.gif') repeat-x scroll left top transparent; height: 122px; width: 111px; display: block; cursor: pointer;" value="" type="submit">
</li>
</ul>
<?php $this -> endWidget(); ?>
</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></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>
- YII MVC之用户注册和用户登录(一)
- YII用户注册和用户登录(一)之基本控制器、模型、视图使用规则
- YII用户注册和用户登录(三)之模型中规则制定和分析
- YII用户注册和用户登录(四)之进行会话控制
- YII用户注册和用户登录(六)之生成验证码
- YII用户注册和用户登录(二)之登录和注册在视图通过表单使用YII小物件并分析
- Spring MVC用户注册和登录示例
- YII用户注册和用户登录(五)之进行session和cookie分析 ,并在前后区分session和cookie
- 用户注册和登录
- 使用MVC模型的用户的注册和登录(注册部分)
- spring boot MVC 三 用户注册和登录的实现
- 用户登录和注册功能
- 用户注册和登录案例
- 用户注册和登录实例
- Asp.Mvc 2.0用户登录实例讲解---(1)用户注册
- Yii 用户登录和注销流程
- Yii 用户登录验证
- Yii 用户登录验证
- Mac 下配置vi的语法高亮 显示行号 自动缩进
- 中缀表达式转换到后缀表达式(java实现)
- 【ORACLE_环境】ORACLE中安装Gird Control(含图解)
- warning:deprecated conversion from string constant to 'char *'
- 【FreeMarker】【程序开发】在Servlet中使用FreeMarker
- YII MVC之用户注册和用户登录(一)
- 通过管道实现文件复制
- 高效面试之栈
- 获取指定目录下的文件列表
- 实现所有文件格式复制
- md5加密
- LeetCode刷题笔录LRUCache
- 与Scheme共舞
- 高效面试之数组专题中级篇(leetcode)