You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

627 lines
17 KiB
PHTML

5 years ago
<?php
namespace Mobile\Model;
use Think\Model;
use User\Api\SuserApi;
class UserModel extends Model{
protected $_validate = array(
// 验证用户名
array('account', '6,30', -1, self::EXISTS_VALIDATE, 'length'), //用户名长度不合法
array('account', '', -3, self::EXISTS_VALIDATE, 'unique'), //用户名被占用
// 验证密码
array('password', '6,30', -4, self::EXISTS_VALIDATE, 'length'), //密码长度不合法
// 验证邮箱
array('email', 'email', -5, self::EXISTS_VALIDATE), //邮箱格式不正确
//验证手机号码
array('mobile', '/^13[\d]{9}$|^14[0-9][\d]{8}|^15[0-9][\d]{8}$|^18[0-9][\d]{8}$/', -9, self::MUST_VALIDATE,'regex',2), //手机格式不正确 TODO:
);
/* 用户模型自动完成 */
protected $_auto = array(
array('password', 'think_ucenter_md5', self::MODEL_BOTH, 'function', UC_AUTH_KEY),
);
/**
* 构造函数
* @param string $name 模型名称
* @param string $tablePrefix 表前缀
* @param mixed $connection 数据库连接信息
*/
public function __construct($name = '', $tablePrefix = '', $connection = '') {
/* 设置默认的表前缀 */
$this->tablePrefix ='tab_';
/* 执行构造方法 */
parent::__construct($name, $tablePrefix, $connection);
}
/**
* 验证用户名
*/
public function checkUsername($username){
$map = array();
$map['account'] = $username;
$user = $this->where($map)->find();
return $user;
}
/**
* 用户注册
*/
public function register($username, $password, $email, $realname, $idcard){
$data = array(
'account' => $username,
'password' => $password,
'flatcoin' => 0,
'viplevel' => 0,
'addup' => 0,
'lock' => 1,
'createdate' => date("Y-m-d H:i:s",time()),
'email' => $email,
'realname' => $realname,
'idcard' => $idcard,
'registerip' => $this->getIPaddress(),
);
// 添加用户
if($this->create($data)){
$uid = $this->add();
return $uid ? $uid : 0; //0-未知错误大于0-注册成功
} else {
return $this->getError();
}
}
/**
* 获取用户信息
* @param $account
* @param array $filed
* @return mixed
* author: xmy 280564871@qq.com
*/
public function getUserByAccount($account,$filed=['*']){
$map['account'] = $account;
$data = $this->field($filed)->where($map)->find();
return $data;
}
/**
* 修改密码
* @param $phone
* @param $old_pwd 旧密码
* @param $new_pwd 新密码
* @return bool
* author: xmy 280564871@qq.com
*/
public function changePwd($account, $old_pwd, $new_pwd)
{
//修改UC密码
$result = $this->changeUcPwd($account,$old_pwd,$new_pwd,0);
if(!$result){
return false;
}
$user = $this->getUserByAccount($account);
if (!empty($user) && think_psw_md5($old_pwd, UC_AUTH_KEY) === $user['password'])
{
$user['password'] = think_psw_md5($new_pwd, UC_AUTH_KEY);
$result = $this->save($user);
}else{
$result = -1;
}
return $result;
}
/**
* 修改UC密码
* @param $account
* @param string $old_pwd 旧密码
* @param $new_pwd 新密码
* @param $type 0 修改密码 1 忘记密码
* @return bool
* author: xmy 280564871@qq.com
*/
private function changeUcPwd($account,$old_pwd="",$new_pwd,$type){
//修改UC密码
if(C('UC_SET') == 1){
$uc = new Ucservice();
$data_uc = $uc->get_uc($account);
if (is_array($data_uc)) {
$result = $uc->uc_edit($account, $old_pwd, $new_pwd,'',$type);
if($result < 0){
return false;
}
return true;
}else{
return true;
}
}else{
return true;
}
}
function getIPaddress(){
$ip=false;
if(!empty($_SERVER['HTTP_CLIENT_IP'])){
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ips=explode (', ', $_SERVER['HTTP_X_FORWARDED_FOR']);
if($ip){ array_unshift($ips, $ip); $ip=FALSE; }
for ($i=0; $i < count($ips); $i++){
if(!eregi ('^(10│172.16│192.168).', $ips[$i])){
$ip=$ips[$i];
break;
}
}
}
return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
}
/**
* 用户登录
*/
public function login($uid){
$user = $this->field(true)->find($uid);
//if(!$user || 1 != $user['status']) {
if (!$user && 1 != $user['lock']) {
$this->error = '用户不存在或已被禁用!'; //应用级别禁用
return false;
}
$this->autoLogin($user);
return true;
}
/**
* 验证邮箱
*/
public function checkEmail($email) {
$user = $this->where('email="'.$email.'"')->find();
return $user;
}
/**
* 修改密码
*/
public function update($uid,$password) {
$data = array(
'playerid' => $uid,
'password' => think_ucenter_md5($password, UC_AUTH_KEY),
);
return $this->save($data);
}
/**
* 获取用户信息
* @param $user_id
* @param array $field
* @return mixed
* author: xmy 280564871@qq.com
*/
public function getUserInfo($account,$field=['id','account','nickname','promote_id','phone','balance','head_img','sex','point','idcard','real_name','age_status']){
//根据手机号或者账号查找信息(WAP找回密码需要根据手机号查找)
$map['account'] = $account;
$map['phone'] = $account;
$map['_logic'] = 'OR';
$data = $this->field($field)->where($map)->find();
if (empty($data)){
return $data;
}
if(is_numeric($data['head_img'])){
$head_img = get_img_url($data['head_img']);
$data['head_img'] = $head_img == false?"":$head_img;
}
if ($data['age_status']==0 && !empty($data['idcard']) && !empty($data['real_name'])){
$data['age_status'] = 4;
}
return $data;
}
/**
* 退出
*/
public function logout(){
$member = new SuserApi;
$member->logout();
}
public function getLoginInfo() {
$member = new SuserApi;
return $member->login_info();
}
/**
* 检测用户是否已登录
*/
public function isLogin() {
$users = $this->getLoginInfo();
if(is_array($users) && !empty($users['username'])) {
return $users;
}else {
return false;
}
}
public function updateInfo($uid,$info='',$type) {
$data['playerid'] = $uid;
if('email'==$type) {
if (preg_match("/^([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)$/i",$info)) {
$data['email']=$info;
$type = 1;
} else
$type = -5;
}
if ('phone'==$type) {
if (preg_match("/^13[0-9]{1}[0-9]{8}$|15[0189]{1}[0-9]{8}$|189[0-9]{8}$/",$info)) {
$data['phone']=$info;
$type = 1;
} else
$type = -9;
}
if ($type>0) {
$this->save($data);
return true;
} else {
return $type;
}
}
/**
* 密码
*/
public function checkPwd($username,$password) {
$account['account']=$username;
$user = $this->where($account)->find();
if(is_array($user)){
if(think_ucenter_md5($password, UC_AUTH_KEY) === $user['password']){
return $user['playerid']; //登录成功返回用户ID
} else {
return -2; //密码错误
}
} else {
return -1; //用户不存在或被禁用
}
}
/**
* 自动登录用户
*/
private function autoLogin($user){
// 更新登录信息
$data = array(
'playerid' => $user['playerid'],
'addup' => array('exp', '`addup`+1'),
'lastlogintime' => date("Y-m-d H:i:s",time()),
'lastloginip' => $this->getIPaddress(),
);
$this->save($data);
// 设置session
$auth = array(
'uid' => $user['playerid'],
'username' => $user['account'],
'flatcoin' => empty($user['flatcoin'])?0:$user['flatcoin'],
'status' => $user['lock'],
'logintime' => $user['lastlogintime'],
);
session('user_auth', $auth);
session('user_auth_sign', data_auth_sign($auth));
cookie('user_auth',$auth,3600);
}
/**
* 添加支付宝
* @author 鹿文学
*/
public function saveAlipay() {
$alipay = $_POST['alipay'];
$alipay_real_name = $_POST['alipay_real_name'];
if(empty($alipay)) {return ['status'=>0,'info'=>'支付宝不能为空'];}
if(empty($alipay_real_name)) {return ['status'=>0,'info'=>'真实姓名不能为空'];}
if(!preg_match('/^[\x{4e00}-\x{9fa5}]{2,}$/u',$alipay_real_name)) {return ['status'=>0,'info'=>'真实姓名必须是大于2位的汉字'];}
$user = $this->getLoginInfo();
$data = array('alipay'=>$alipay,'alipay_real_name'=>$alipay_real_name);
$res = $this->where(['id'=>$user['user_id']])->save($data);
if ($res) {
return ['status'=>1,'info'=>'支付宝添加成功'];
} else {
return ['status'=>1,'info'=>'支付宝添加成功'];
}
}
/**
* 获取支付宝信息
*/
public function getAlipay() {
$user = $this->getLoginInfo();
return $this->field('id,alipay,alipay_real_name')->where(['id'=>$user['user_id']])->find();
}
public function useing_record($p=1) {
$page = intval($p);
$page = $page ? $page : 1; //默认显示第一页数据
$row = 10;
$spend = M('Spend','tab_');
$deposit = M('Deposit','tab_');
$bind = M('BindRecharge','tab_');
$user = $this->getLoginInfo();
if(is_array($user)) {
$map['pay_status'] = 1;
$map['user_id'] = $user['user_id'];
$bindids = $bind->field('GROUP_CONCAT(id) as ids')->where($map)->group('user_id')->select();
$map['pay_way'] = array('gt',0);
$depositids = $deposit->field('GROUP_CONCAT(id) as ids')->where($map)->group('user_id')->select();
$spendids = $spend->field('GROUP_CONCAT(id) as ids')->where($map)->group('user_id')->select();
$ids='';
if(!empty($bindids[0]['ids'])){ $bids = $bindids[0]['ids']; $ids .= ','.$bids;$bmap['b.id'] = array('in',$bids);}
if(!empty($depositids[0]['ids'])){$dids = $depositids[0]['ids']; $ids .= ','.$dids;$dmap['d.id'] = array('in',$dids);}
if(!empty($spendids[0]['ids'])){$sids = $spendids[0]['ids']; $ids .= ','.$sids;$smap['s.id'] = array('in',$sids);}
if(!empty($ids)) {
$count = count(explode(',',substr($ids,1)));
if(!empty($smap)) {
empty($bmap) || $bind_data = $bind->alias('b')->field('b.id,b.amount as pay_amount,FROM_UNIXTIME(b.create_time,"%Y-%m-%d %H:%i:%s") as pay_time,b.game_id,b.game_name,b.zhekou')->where($bmap)->select(false);
empty($dmap) || $deposit_data = $deposit->alias('d')->field('d.id,d.pay_amount,FROM_UNIXTIME(d.create_time,"%Y-%m-%d %H:%i:%s") as pay_time,if(d.user_id,0,0) as game_id,if(d.user_account,"","") as game_name,IF (d.user_id, -1, -1) as zhekou')->where($dmap)->select(false);
$sql = $spend->alias('s')->field('s.id,s.pay_amount,FROM_UNIXTIME(s.pay_time,"%Y-%m-%d %H:%i:%s") as pay_time,s.game_id,s.game_name,IF (s.user_id, -1, -1) as zhekou')
->union($bind_data)
->union($deposit_data)
->where($smap)->select(false);
$lists = $spend->table('('.$sql.') as a')->page($page,$row)->select();
} elseif(!empty($dmap)) {
empty($bmap) || $bind_data = $bind->alias('b')->field('b.id,b.amount as pay_amount,FROM_UNIXTIME(b.create_time,"%Y-%m-%d %H:%i:%s") as pay_time,b.game_id,b.game_name,b.zhekou')->where($bmap)->select(false);
$sql = $deposit->alias('d')->field('d.id,d.pay_amount,FROM_UNIXTIME(d.create_time,"%Y-%m-%d %H:%i:%s") as pay_time,if(d.user_id,0,0) as game_id,if(d.user_account,"","") as game_name,IF (d.user_id, -1, -1) as zhekou')
->union($bind_data)
->where($dmap)->select(false);
$lists = $spend->table('('.$sql.') as a')->page($page,$row)->select();
} elseif(!empty($bmap)) {
$sql = $bind->alias('b')->field('b.id,b.amount as pay_amount,FROM_UNIXTIME(b.create_time,"%Y-%m-%d %H:%i:%s") as pay_time,b.game_id,b.game_name,b.zhekou')->where($bmap)->select();
$lists = $spend->table('('.$sql.') as a')->page($page,$row)->select();
}
}
}
if(is_array($lists)) {
$data['lists'] = $lists;$data['status']=1;
if($count > $row){
$data['total'] = ceil($count/$row);
} else {
$data['total']=1;
}
} else {
$data['lists']='';$data['total'] = 1;$data['status'] = 0;
}
$data['current'] = $page;
return $data;
}
/**
* 规则显示与否
* @param integer $type 类型 0表示买家 1表示卖家
* @return array
* @author 鹿文学
*/
public function set_rule_status($type=0) {
if(is_numeric($type) && ($type == 1 || $type == 0)) {
$user = $this->getLoginInfo();
if(is_array($user)) {
$rule = $_POST['rule'];
if($type == 1){$data['seller_rule']=$rule;}else{$data['buyer_rule']=$rule;}
$res = $this->where(['id'=>$user['user_id']])->save($data);
if($res) {
return ['status'=>1,'info'=>'已记住'];
} else {
return ['status'=>0,'info'=>'更改失败'];
}
} else {
return ['status'=>0,'info'=>'未登录'];
}
} else {
return ['status'=>0,'info'=>'参数错误'];
}
}
/**
* 获取规则显示与否
* @param integer $type 类型 0表示买家 1表示卖家
* @return array
* @author 鹿文学
*/
public function get_rule_status($type=0) {
if(is_numeric($type) && ($type == 1 || $type == 0)) {
$user = $this->getLoginInfo();
if(is_array($user)) {
if($type == 1){$fields = 'seller_rule';}else{$fields = 'buyer_rule';}
$data = $this->field($fields)->where(['id'=>$user['user_id']])->find();
return $data[$fields]?$data[$fields]:0;
} else {
return 0;
}
} else {
return 0;
}
}
/**
* 获取小号信息
* @param integer $id 小号编号
* @return array
* @author 鹿文学
*/
public function get_small_info($id=0) {
$data = $this->field('DATEDIFF(CURDATE(),FROM_UNIXTIME(register_time,"%Y-%m-%d")) as day,cumulative as accumulation')
->where(['id'=>$id])->find();
return $data;
}
/**
* 获取金币数额
* @return integer
* @author 鹿文学
*/
public function get_gold_coin() {
$user = $this->getLoginInfo();
$gold_coin = $this->field('gold_coin')->where(['id'=>$user['user_id']])->find();
return $gold_coin['gold_coin'];
}
/**
* 获取金币相关信息
* @return array
* @author 鹿文学
*/
public function get_info_about_gold() {
$user = $this->getLoginInfo();
$gold_coin = $this->field('id,account,gold_coin,alipay,alipay_real_name')->where(['id'=>$user['user_id']])->find();
return $gold_coin;
}
public function get_phone() {
$user = $this->getLoginInfo();
$data = $this->field('account,phone')->where(['id'=>$user['user_id']])->find();
if(preg_match('/^1[3456789][0-9]{9}$/u',$data['account'])) {
return $data['account'];
} elseif (!empty($data['phone'])) {
return $data['phone'];
} else {
return '';
}
}
/**
* 获取小号列表通过游戏
* @param integer $game_id 游戏编号
* @return array
* @author 鹿文学
*/
public function get_small_list_by_game($game_id=0) {
if(is_numeric($game_id) && $game_id > 0) {
$lists = $this->get_small_list_on_shop($game_id);
$spend = $this->get_small_list_on_self($game_id);
if(!is_array($lists)) {$lists = array();}
if(!is_array($spend)) {$spend = array();}
return array_merge($lists,$spend);
} else {
return '';
}
}
/**
* 获取自己购买的小号列表
* @param integer $game_id 游戏编号
* @return array
* @author 鹿文学
*/
public function get_small_list_on_shop($game_id=0) {
if(is_numeric($game_id) && $game_id > 0) {
$user = D('User')->getLoginInfo();
$lists = $this->alias('u')->field('u.id as small_id,u.account as small_account,u.cumulative')
->join('tab_merchandise as m on (m.small_id=u.id and m.status=1) ')
->where(['m.game_id'=>$game_id,'u.lock_status'=>1,'u.puid'=>$user['user_id'],'source_puid'=>array('gt',0),'source_time'=>array('gt',0)])->select();
return $lists;
} else {
return '';
}
}
/**
* 获取自己创建的且充过值的小号列表
* @param integer $game_id 游戏编号
* @return array
* @author 鹿文学
*/
public function get_small_list_on_self($game_id=0) {
if(is_numeric($game_id) && $game_id > 0) {
$user = D('User')->getLoginInfo();
$lists = $this->alias('u')->field('u.id as small_id,u.account as small_account,u.cumulative')
->join('tab_spend as s on(u.id=s.small_id and s.pay_status=1) ')
->where(['s.game_id'=>$game_id,'u.lock_status'=>1,'u.puid'=>$user['user_id'],'u.source_puid'=>0,'u.source_time'=>0])->group('s.small_id')->select();
return $lists;
} else {
return '';
}
}
/**
* 获取自己创建的且充过值的小号列表
* @param string $fields 字段列表
* @return array
* @author 鹿文学
*/
public function getInfo($fields=true) {
$session = $this->getLoginInfo();
$data = $this->field($field)->where(['id'=>$session['user_id']])->find();
if (empty($data)){
return $data;
}
if(is_numeric($data['head_img'])){
$head_img = get_img_url($data['head_img']);
$data['head_img'] = $head_img == false?"":$head_img;
}
if ($data['age_status']==0 && !empty($data['idcard']) && !empty($data['real_name'])){
$data['age_status'] = 4;
}
return $data;
}
}