社区项目(2):用户注册、用户登录、退出

用户注册

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' => '登录']);
}
论坛软件系统亦称电子公告板(BBS)系统,它伴随社区BBS的流行而成为互联网最重要的应用之一,也逐渐成为网站核心竞争力的标志性体现。2006年7月 CNNIC 发布的最新统计表明,43.2% 的中国网民经常使用论坛/BBS/讨论组,论坛社区应用首次超过即时通讯 IM ,成为仅次于收发Email的互联网基本应用。 Crossday Discuz! Board(以下简称 Discuz!,中国国家版权局著作权登记号 2006SR11895)是康盛创想(北京)科技有限公司(英文简称Comsenz)推出的一套通用的社区论坛软件系统,用户可以在不需要任何编程的基础上,通过简单的设置和安装,在互联网上搭建起具备完善功能、很强负载能力和可高度定制的论坛服务。Discuz! 的基础架构采用世界上最流行的 web 编程组合 PHP+MySQL 实现,是一个经过完善设计,适用于各种服务器环境的高效论坛系统解决方案。 作为国内最大的社区软件及服务提供商,Comsenz旗下的 Discuz! 开发组具有丰富的 web 应用程序设计经验,尤其在论坛产品及相关领域,经过长期创新性开发,掌握了一整套从算法,数据结构到产品安全性方面的领先技术。使得 Discuz! 无论在稳定性,负载能力,安全保障等方面都居于国内外同类产品领先地位。 自2001年6月面世以来,Discuz!已拥有五年以上的应用历史和三十多万网站用户案例,是全球成熟度最高、覆盖率最大的论坛软件系统之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无知的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值