用户注册
1、在view目录下创建User目录来存放与用户有关的模板
2、用户注册
//注册
public function register(){
//页面标题
$this->view->assign('title','用户注册');
//渲染页面
$this->view->fetch('register');
}
注册页面使用表单组件
<form class="form-horizontal" method="post" id="formRegister">
<!-- 用户名 -->
<div class="form-group">
<label for="inputUsername" class="col-sm-2 control-label">用户名</label>
<div class="col-sm-8">
<input
type="text"
class="form-control"
id="username"
name="name"
placeholder="Username"
/>
</div>
</div>
<!-- 邮件 -->
<div class="form-group">
<label for="inputEmail" class="col-sm-2 control-label">邮箱</label>
<div class="col-sm-8">
<input
type="email"
class="form-control"
id="inputEmail"
name="email"
placeholder="Email"
/>
</div>
</div>
<!-- 手机 -->
<div class="form-group">
<label for="inputPhone" class="col-sm-2 control-label">手机号</label>
<div class="col-sm-8">
<input
type="text"
class="form-control"
id="inputPhone"
name="mobile"
placeholder="Phone"
/>
</div>
</div>
<!-- 密码 -->
<div class="form-group">
<label for="inputPassword1" class="col-sm-2 control-label">密码</label>
<div class="col-sm-8">
<input
type="password"
class="form-control"
id="inputPassword1"
name="password"
placeholder="Password"
/>
</div>
</div>
<!-- 再次输入 -->
<div class="form-group">
<label for="inputPassword2" class="col-sm-2 control-label"
>确认密码</label
>
<div class="col-sm-8">
<input
type="password"
class="form-control"
id="inputPassword2"
name="password_confirm"
placeholder="Password Confirm"
/>
</div>
</div>
<!-- 注册 -->
<div class="form-group">
<div class="col-sm-offset-4 col-sm-8">
<button type="submit" class="btn btn-primary btn-lg" id="register">
注册
</button>
</div>
</div>
</form>
注:
- input标签内部必须添加name属性,php通过name属性获取提交的数据
- name属性的值必须要与数据库中的字段名对应,不然再往数据库保存数据时,会因为字段名不一致而无法保存
- 表单中的字段顺序不需要与数据库一致,比如表单是name,age而数据库是age,name。但是字段名必须一致
$("#register").click(function () {
var d = {};
var t = $("form").serializeArray();
//t的值为[{name: "a1", value: "xx"},{name: "a2", value: "xx"}...]
$.each(t, function () {
d[this.name] = this.value;
});
// alert(JSON.stringify(d));
$.post(
"http://localhost/MyWorkSpace/zh/think/public/index/user/insert",
d,
function (data, status) {
//console.log(data);
//alert("状态: " + status);
if (data.status == 1) { //成功跳转到主页失败跳转到注册页
alert(data.message);
window.location.href = "http://localhost/MyWorkSpace/zh/think/public/index/index";
} else {
alert(data.message);
window.location.href = "http://localhost/MyWorkSpace/zh/think/public/index/user/register";
}
}
);
});
调用定义后的验证规则进行验证
//处理用户提交的注册信息
public function insert()
{
//获取除password_confirm以外的其它数据
$data = Request::except('password_confirm', 'post'); //没问题,可以获得数据
//验证规则
$rule = '\app\common\validate\User';
//验证
$result = $this->validate($data, $rule);
if (true !== $result) { //验证不通过
return ['status' => -1, 'message' => $result];
}
//使用模型将数据插入到数据库,没问题
$user = new UserModel();
$res = $user->save($data);
if ($res == true) {
return ['status' => 1, 'message' => '注册成功'];
} else {
return ['status' => 0, 'message' => '注册失败,请重试'];
}
}
修改用户模型,添加其它配置
<?php
/**
* zh_user表的用户模型
*/
namespace app\common\model;
use think\Model;
class User extends Model
{
//指定主键和关联的表
//变量名是固定的
protected $pk = 'id';
protected $table = 'zh_user';
//开自动时间戳
protected $autoWriteTimestamp = true;
//设置对应的时间戳字段
protected $create_time = "create_time";
protected $update_time = "update_time";
protected $dataFormat = 'y/年/m月/d日';
//获取器
public function getStatusAttr($value)
{
$status = ['1' => '启用', '0' => '禁用'];
return $status[$value];
}
public function getIsAdminAttr($value)
{
$status = ['1' => '管理员', '0' => '用户'];
return $status[$value];
}
//修改器
public function setPasswordAttr($value)
{
//加密用户密码
return sha1($value);
}
}
获取器
- 格式:get字段名Attr(),字段名必须与数据库中的字段名相同
- 方法名采用驼峰命名,不使用连字符。如果字段位
is_admin
,方法名位getIsAdminAttr()
- 获取器用来获取数据库中某些字段的值
修改器
- 格式:set字段名Attr()字段名必须与数据库中的字段名相同
- 方法名采用驼峰命名,不使用连字符。如果字段位
is_admin
,方法名位setIsAdminAttr()
- 修改器用来修改数据库中某些字段的值,可以用来加密密码
用户登录
User.php
//用户登录
public function login()
{
$this->Logined();
return $this->view->fetch('login', ['title' => '登录']);
}
//登录验证与查询
public function loginCheck()
{
//获取登录数据
$data = Request::param();
$map[] = ['email', '=', $data['email']];
$map[] = ['password', '=', sha1($data['password'])];
$res = UserModel::where($map)->find();
if ($res) {
Session::set('admin_id', $res['id']);
Session::set('admin_name', $res['name']);
Session::set('admin_power', $res['is_admin']);
$this->success('登录成功', 'index/index');
} else {
$this->error('登录失败,请重试', 'index/user/login');
}
}
退出
//退出登录
public function logout()
{
Session::delete('admin_id');
Session::delete('admin_name');
Session::delete('admin_power');
$this->success('退出登录成功', 'index/index');
}
- 修改nav.html
<ul class="nav navbar-nav navbar-right">
<li><a href="#">{$Think.session.user_email}</a></li>
<li class="dropdown">
<a
href="#"
class="dropdown-toggle"
data-toggle="dropdown"
role="button"
aria-haspopup="true"
aria-expanded="false"
>操作 <span class="caret"></span
></a>
<ul class="dropdown-menu">
<li><a href="#">发布文章</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">退出</a></li>
</ul>
</li>
</ul>
修改为
<!-- 最右侧操作 -->
<ul class="nav navbar-nav navbar-right">
{if ($Think.session.admin_id)}
<li><a href="#">{$Think.session.admin_name}</a></li>
<li class="dropdown">
<a
href="#"
class="dropdown-toggle"
data-toggle="dropdown"
role="button"
aria-haspopup="true"
aria-expanded="false"
>
操作
<span class="caret"></span>
</a>
<ul class="dropdown-menu">
<li><a href="{:url('article/insert')}">发布文章</a></li>
<li role="separator" class="divider"></li>
<li><a href="{:url('admin/user/userlist')}">管理中心</a></li>
<li role="separator" class="divider"></li>
<li><a href="{:url('user/logout')}">退出</a></li>
</ul>
</li>
{else /}
<li><a href="{:url('user/login')}">登录</a></li>
<li><a href="{:url('user/register')}">注册</a></li>
{/if}
</ul>
注:
- 使用
$Think
来获取系统session变量,从而知道当前登录用户 - {:url(‘user/login’)} 相对地址,前面是控制器后面是控制器中的方法
- 使用Session类的方法删除session
防止重复登录
当已经登录后,再访问登录界面立马跳转到首页。因为多个控制器(其它页面)都需要检测是否登录,所有将该方法添加到基础控制器中,使其它控制器可以继承
<?php
/**
* 基础控制器
* 必须继承think\Controller.php
*/
namespace app\common\controller;
use think\Controller;
use think\facade\Session;
class Base extends Controller
{
/**
* 初始化方法,在所有方法之前被调用
* 创建常量,公共方法
*/
protected function initialize()
{
}
//防止重复登录
protected function Logined()
{
if (Session::has('user_email')) {
$this->error('请不要重复登录', "index/index");
}
}
//判断用户是否登录
protected function isLogin()
{
if (!Session::has('user_email')) {
$this->error('请先登录', "user/login");
}
}
}
在哪里调用,因为只要登录还是到登录界面所以在登录界面使用
//用户登录
public function login()
{
$this->Logined();
return $this->view->fetch('login', ['title' => '登录']);
}