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
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?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;
}
}