Thinkphp会员模块

jianfly.com 2019-01-31 2061次浏览

1、会员表设计

CREATE TABLE IF NOT EXISTS `qf_member` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` char(50) DEFAULT NULL COMMENT '用户名',
  `password` char(50) DEFAULT NULL COMMENT '密码',
  `email` char(50) DEFAULT NULL COMMENT '邮箱',
  `header` varchar(255) DEFAULT NULL COMMENT '头像',
  `relname` char(50) NOT NULL COMMENT '真实姓名',
  `mobile` char(25) NOT NULL COMMENT '手机',
  `qq` char(25) NOT NULL COMMENT 'QQ',
  `openid` char(50) DEFAULT NULL COMMENT 'QQ登录后的openid',
  `access_token` char(50) DEFAULT NULL COMMENT 'QQ登录后的access_token',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='前台用户表' AUTO_INCREMENT=87 ;

2、php公用方法

(1)外部框架

<?php
namespace Home\Controller;
/**
 * used for members related
 * @author jianfly.com
 */
class UserController extends PublicController {
   function __construct()
	{
		parent::__construct();
	}
}

(2)Public公用

/**
* 检测格式
* @param email    邮箱 不为空,格式验证
* @param password 密码 不为空
*/
protected function checkSafe( $email , $password ) {
	$email    = htmlspecialchars($email);
	$password = htmlspecialchars($password);
	$data = array();//返回值
	//检测邮箱和密码为空
	if(!$email)
	{
		$data['state'] = false;
		$data['msg']   = "邮箱不能为空";
		return $data;
		exit;
	}
	if(!$password)
	{
		$data['state'] = false;
		$data['msg']   = "密码不能为空";
		return $data;
		exit;
	}
	//检测邮箱格式
	if( !$this->checkEmail($email) )
	{
		$data['state'] = false;
		$data['msg']   = "邮箱格式错误";
		return $data;
		exit;
	}
	$data['state'] = true;
	$data['msg']   = "验证通过";
	return $data;
}
/**
* 检测邮箱格式
*/
public function checkEmail ( $email ) {
	$email = htmlspecialchars($email);
	if (!preg_match('/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/', $email))
		return false;//邮件格式错误
	else
		return true;//邮件格式正确
}
/**
 * 检查用户是否登录
 */
public function checkLogin()
{  
    if (!$_SESSION['member']) {
    	$this->error("请先登录",U('User/login'));
    	exit;
    }
}
/**
 * 从SESSION中获取个人信息
*/
protected function find_lists() {
    if($_SESSION['member'])
	$this->assign('member',$_SESSION['member']);//从SESSION中获取个人信息
}

(3)重复使用的方法封装

/**
* 增加用户
*/
protected function addUser( $email , $password ) {
	$data = array();
	$data['email']    = htmlspecialchars($email);
	$data['password'] = md5(htmlspecialchars($password));
	if(M('member')->add($data))
		return true;//添加成功
	else
		return false;//添加失败
}
/**
 * 通过邮箱号找到此用户
 */
protected function findUserByEmail( $email )
{
	$email = htmlspecialchars($email);
	$member = M('member')->where(array("email"=>$email))->find();
	if($member)
	{
		return true;//重复
	}else{
		return false;//不重复
	}
}
/*
* 通过邮箱和密码找到用户信息
*/
protected function findUserByPwd ( $email , $pwd ) {
	$email = htmlspecialchars($email);
	$pwd   = md5(htmlspecialchars($pwd));
	$member = M('member')->where(array("email"=>$email , 'password'=>$pwd))->find();
	if($member)
		return $member;
	else
		return false;
}
/**
* 修改用户信息
*/
protected function changeInfo( $id , $data ) {
	$ret = M('member')->where(array('id'=>$id))->save($data);
	return $ret;
}
/**
* 清除用户信息(登出)
*/
public function logOut() {
	unset($_SESSION['member']);
	$this->display('login');
}

(4)注册

/*
* 用户注册页面
*/
public function reg() {
	$this->display();
}
/*
* 处理用户注册数据
*/
public function doreg() {
    if ($_SESSION['verify'] != md5($_POST['code'])) {
        $this->error('验证码错误!');
    }
	//获取数据
	$email    = htmlspecialchars($_POST['email']);
	$password = htmlspecialchars($_POST['password']);
	//检测邮箱和密码格式
	$check = $this->checkSafe( $email, $password );
	if( !$check['state'] )
	{
		$this->error($check['msg']);
		exit;
	}
	//检测用户名是否重复
	if($this->findUserByEmail($email))
	{
		$this->error("邮箱重复");exit;
	}
	//将用户写入数据表
	if($this->addUser( $email , $password ))
	{
		$this->success("注册成功","login");
	}else{
		$this->error("系统繁忙,请稍后重试");exit;
	}
}

(5)登录

/*
* 用户登录页面
*/
public function login() {
	$this->display();
}
/*
* 处理用户登录
*/
public function dologin() {
	//获取数据
	$email    = htmlspecialchars($_POST['email']);
	$password = htmlspecialchars($_POST['password']);
	//检测邮箱和密码格式
	$check = $this->checkSafe( $email, $password );
	if( !$check['state'] )
	{
		$this->error($check['msg']);
		exit;
	}
	//检测用户名是否存在
	if(!$this->findUserByEmail($email))
	{
		$this->error("用户名不存在");exit;
	}
	//查找用户信息
	$member = $this->findUserByPwd( $email , $password );
	if(!$member)
		$this->error("密码错误");
	else
	{
		$_SESSION['member'] = $member;
		$this->redirect('index');
	}
}

(6)个人中心信息修改等

/*
* 个人中心
*/
public function index() {
	$this->checkLogin();
	$this->display();
}
/*
* 更改密码
*/
public function cpwd() {
	$this->checkLogin();
	$this->display();
}
/**
* 处理修改密码
* @param id 用户id,SESSION获取
* @param password 新密码
*/
public function docpwd() {
	$this->checkLogin();
	//获取数据
	$id       = $_SESSION['member']['id'];
	$password = htmlspecialchars($_POST['password']);
	//检测密码是否为空
	if(!$password)
	{
		$this->error("请填写密码");
		exit;
	}
	$data['password'] = md5($password);
	if( $this->changeInfo($id,$data) )
	{
		$this->logOut();
		$this->success("修改成功,请重新登录",'login');
	}else {
		$this->error("系统繁忙,请稍后重试");
	}
	
}
/**
 * 修改个人信息
 * @param id 用户id,SESSION获取
 * @param data 徐修改的信息
 */
public function docinfo() {
	$this->checkLogin();
	//获取数据
	$id       = $_SESSION['member']['id'];
	$data['name'] = htmlspecialchars($_POST['name']);
	$data['relname'] = htmlspecialchars($_POST['relname']);
	$data['qq'] = htmlspecialchars($_POST['qq']);
	$data['mobile'] = htmlspecialchars($_POST['mobile']);
	if( $this->changeInfo($id,$data) )
	{
		$member = M('member')->where(array('id'=>$id))->find();
		$_SESSION['member'] = $member;
		$this->assign('member',$member);
		$this->success("修改成功",'index');
	}else {
		$this->error("系统繁忙,请稍后重试");
	}
}