<?php
/**
  * @method 会员基本操作
  * @author soul
  * @copyright 2016/3/31
  */
class YpwUser extends YpwBase
{
	public function __construct()
	{
		parent::__construct();
		LibFc::useMainDb();
	}

	/**
	  * @method 查询表信息
	  * @param  $FieldArr 需要查询的字段名称数组
	  * @param  $Where 查询条件
	  * @param  $OneRow true|false
	  * @author soul
	  * @copyright 2016/3/30
	  * @return array(3) { ["status"]=> bool(true) ["data"]=> $OneRow=true 二维数组 ; $OneRow=true 一维数组["code"]=> int(0) } 
	  */
	public function GetUser($FieldArr, $Where = '', $OneRow = false)
	{
		$Table = 'yp_user as u JOIN yp_user_ext as ui ON u.u_id=ui.ui_uid JOIN yp_user_level ON u_ul_id=ul_id';
		return $this->Get($Table, $FieldArr, $Where, $OneRow);
	}


	/**
	  * @method 会员登录
	  * @param  $Type Type password | token | weixin | unitag | apple
	  * @param  $DataArr 登录信息
						password['name'=>'', 'password'=>'123456']
						token['token'=>'c291bDEyQDZmNDczMDA4MzQyYTI2NDZlYjcwODRhMGZhMzFjYTlkQDE0OTMzNTE1OTY']
						mobile['mobile'=>'1355', 'code'=>32154]
						weixin['unionid'=>'ok4PpvzZiYdMfaJzC_cMdsrVman4', 'openid'=>'']
						qq['unionid'=>'ok4PpvzZiYdMfaJzC_cMdsrVman4', 'openid'=>'']
						apple['unionid'=>'apple userid']
						unitag['unitag'=>'ok4PpvzZiYdMfaJzC_cMdsrVman4']
	  * @param  $LangCode 语言版本 cn  en
	  * @author soul
	  * @copyright 2016/3/30
	  * @return ['status'=>bool, 'data'=>$UserData, 'code'=>'']; 
	  */
	public function Login($Type, $DataArr, $LangCode = 'cn')
	{
		$Error = $LangCode != 'en' ? '获取数据失败，请稍后重试' : 'Get data failed, please try again later';
		$Return = ['login'=>false, 'data'=>$Error, 'code'=>'data_failed'];
		$filedArr = ['u_id', 'u_name', 'u_emil_check', 'u_mobile', 'u_mobile_check', 'u_password', 'u_error_count', 'u_error_ltime', 'u_b2c_worker', 'u_b2c_shopid'];
		$Type = $Type == 'password' && stripos($DataArr['name'], ':') !== false? 'worker': $Type;
		$DataArr['from'] = empty($DataArr['from'])? '其它': $DataArr['from'];
		if($Type == 'worker' && ($DataArr['from'] != 'IM' && stripos($DataArr['from'], 'PJD') === false) )
		{
			return LibFc::ReturnData(false, '子账号不能使用于此系统');
		}

		switch($Type)
		{
			//职员登录【用户名 + 密码】
			case 'worker':
				if(!empty($DataArr['name']) && !empty($DataArr['password']))
				{
					$Error = $LangCode != 'en' ? '账户名与密码不匹配，请注意密码大小写': 'Account name and password do not match. Please re-enter';
					$Return = ['login'=>false, 'data'=>$Error, 'code'=>'password_error'];
					
					$Res = $this->GetUser(['u_id', 'u_password', 'u_b2c_shopid'], sprintf(" AND u_name='%s' AND u_b2c_worker='Y' AND u_b2c_shopid > 0 ", LibFc::Escape($DataArr['name'])), true);
					$userArr = $Res['data'];
					if(!empty($userArr['u_id']))
					{
						$postPass = [md5('Y'.md5(trim($DataArr['password'])).'P')];
						if($DataArr['passtype'] == 'dbmd5')
						{//商城店铺
							$B2cBase = new B2cBase();
							$res = $B2cBase->get('sh_shop', ['shop_id'], sprintf(" and shop_id=%d", $userArr['u_id']));
							if(!empty($res['data'])) $postPass[] = $DataArr['password'];
						}
						if(in_array($userArr['u_password'], $postPass))
						{
							//检查店铺状态
							$B2cBase = new B2cBase();
							$where = sprintf(" and wor_shop_id =%d and wor_uid = %d and wor_status =1 and shop_status=1", $userArr['u_b2c_shopid'], $userArr['u_id']);
							$res = $B2cBase->get('sh_worker join sh_shop on wor_shop_id = shop_id', ['wor_uid'], $where);
							if(!empty($res['data']))
							{
								$Return = ['login'=>true, 'data'=>$Res['data']['u_id'], 'code'=>''];
							}
							else
							{
								$Error = $LangCode != 'en' ? '此店铺子账号已停用': 'he shop account has been disused';
								$Return = ['login'=>false, 'data'=>$Error, 'code'=>'account_disused'];
							}
						}
					}
					else
					{
						$Error = $LangCode != 'en' ? '此账号尚未注册，请先注册': 'This account has not yet been registered';
						$Return = ['login'=>false, 'data'=>$Error, 'code'=>'not_reg'];
					}
				}
				else if(empty($DataArr['name']))
				{
					$Error = $LangCode != 'en' ? '请输入账号': 'Please enter the your account';
					$Return = ['login'=>false, 'data'=>$Error, 'code'=>'name_null'];
				}
				else if(empty($DataArr['password']))
				{
					$Error = $LangCode != 'en' ? '请输入密码': 'Please enter your password';
					$Return = ['login'=>false, 'data'=>$Error, 'code'=>'password_null'];
				}
			break;
			case 'password':
				if(empty($DataArr['name']))
				{
					$Error = $LangCode != 'en' ? '请输入账号': 'Please enter the your account';
					return LibFc::ReturnData(false, $Error, 'name_null');
				}

				if(empty($DataArr['password']))
				{
					$Error = $LangCode != 'en' ? '请输入密码': 'Please enter your password';
					return LibFc::ReturnData(false, $Error, 'password_null');
				}

				if(preg_match('/^1\d{10}$/', $DataArr['name']))
				{
					//手机号码
					$Res = $this->GetUser($filedArr, sprintf(" AND u_mobile='%s' AND u_mobile_check='Y'", $DataArr['name']), true);
					if(empty($Res['data']))
					{
						$Error = $LangCode != 'en' ? '此手机号尚未注册，请先注册': 'This phone number has not been verified, please use the user name to log in';
						return LibFc::ReturnData(false, $Error, 'no_mobile_check');
					}
					$UserRes = $Res['data'];
				}
				else if(filter_var($DataArr['name'], FILTER_VALIDATE_EMAIL))
				{
					//邮箱
					$Res = $this->GetUser($filedArr, sprintf(" AND u_email='%s' AND u_emil_check=1", $DataArr['name']), true);
					if(empty($Res['data']))
					{
						$Error = $LangCode != 'en' ? '此邮箱尚未通过验证，请使用用户名登录': 'This email has not been verified. Please log in using your username';
						return LibFc::ReturnData(false, $Error, 'no_email_check');
					}
					$UserRes = $Res['data'];
				}
				else
				{
					//用户名
					$Res = $this->GetUser($filedArr, sprintf(" AND u_name='%s'", LibFc::Escape($DataArr['name'])), true);
					if(empty($Res['data']))
					{
						$Error = $LangCode != 'en' ? '此账号尚未注册': 'This account has not yet been registered';
						return LibFc::ReturnData(false, $Error, 'not_reg');
					}
					$UserRes = $Res['data'];
				}
				//输错5次密码，停用10分钟
				
				if($UserRes['u_error_count'] >= 5 && (time()-$UserRes['u_error_ltime']) < 600)
				{
					$Error = $LangCode != 'en' ? '输错密码已达到5次，请'.ceil(($UserRes['u_error_ltime']+600-time())/60).'分钟后重试！': 'The error password has reached the upper limit. Please try again later!';
					$Return = ['login'=>false, 'data'=>$Error, 'code'=>'password_max'];
				}
				else
				{
					//尚未设置初始密码
					if(empty($UserRes['u_password']))
					{
						$Error = $LangCode != 'en' ? '请先通过找回密码或者修改密码功能，设置初始登录密码！': 'Please set the initial login password by retrieving the password first!';
						$Return = ['login'=>false, 'data'=>$Error, 'code'=>'password_error'];
					}
					else
					{
						$postPass = [md5('Y'.md5(trim($DataArr['password'])).'P')];
						if($DataArr['from'] == '宜配查') $postPass[] = $DataArr['password'];
						if(isset($DataArr['passtype']) && $DataArr['passtype'] == 'dbmd5')
						{//商城店铺
							$B2cBase = new B2cBase();
							$res = $B2cBase->get('sh_shop', ['shop_id'], sprintf(" and shop_id=%d", $UserRes['u_id']));
							if(!empty($res['data'])) $postPass[] = $DataArr['password'];
						}
						if(in_array($UserRes['u_password'], $postPass))
						{
							//$this->Set('yp_user', ['u_error_ltime'=>0, 'u_error_count'=>0], sprintf(" and u_id=%d", $UserRes['u_id']));
							$Return = ['login'=>true, 'data'=>$UserRes['u_id'], 'code'=>''];
						}
						else
						{
							$Error = $LangCode != 'en' ? '账户名与密码不匹配，请注意密码大小写': 'Account name and password do not match. Please re-enter';
							$Return = ['login'=>false, 'data'=>$Error, 'code'=>'password_error'];
						}

						if($Return['code'] == 'password_error')
						{
							$SetSql = sprintf("UPDATE yp_user SET u_error_ltime=%d, u_error_count = u_error_count+1 WHERE u_id=%d ", time(), $UserRes['u_id']);
							$ResFlag = $this->YpwDb->Query($SetSql);
							if(!$ResFlag) return LibFc::ReturnData(false, $Table.'修改记录SQL语句执行失败。');
						}
					}
				}
				break;
			case 'mobile':
				$Error = $LangCode != 'en' ? '此手机号尚未注册，请先注册': 'This phone number has not been verified, please use the user name to log in';
				if(preg_match('/^1\d{10}$/', $DataArr['mobile']) && preg_match('/^\d{6}$/', $DataArr['code']))
				{
					$Res = $this->GetUser(['u_id'], sprintf(" AND u_mobile='%s' AND u_mobile_check='Y'", $DataArr['mobile']), true);
					if(!empty($Res['data']['u_id']))
					{
						$uid = $Res['data']['u_id'];
						$SendSms = new SendSms();
						$tArr = [
							'mobile'=>$DataArr['mobile'],
							'style'=>'bind,password,login',
							'from'=>$DataArr['from'],
							'code'=>$DataArr['code']
						];
						$SendSms->checkMobileCode($tArr);
						$SendSms->outMobileCode($tArr);
						$Return = ['login'=>true, 'data'=>$uid, 'code'=>''];
					}
					else
					{
						//自动创建账号
						$regArr = [
							'u_mobile'=>$DataArr['mobile'],
							'u_from'=>$DataArr['from'],
							'mobile_code'=>$DataArr['code']
						];
						$res = $this->Register($regArr);
						$uid = $res['data'];
						$Return = ['login'=>true, 'data'=>$uid, 'code'=>''];
					}
				}
				break;
			case 'token':
				$Error = $LangCode != 'en' ? 'Token失效，请重新登录': 'Token is invalid, please use the account password to log in';
				$Return = ['login'=>false, 'data'=>$Error, 'code'=>'token_invalid'];
				if($DataArr['token'] == '2c077a4b2ae18ecf3db3fbe672d77885')
				{
					$TokenArr = ['uname'=>'hzqghost', 'uid'=>md5('yp1001')];
				}
				else
				{	
					$res = $this->getDataByToken($DataArr['token']);
					$TokenArr = $res['data'];
				}
				if(!empty($TokenArr['uid']) && !empty($TokenArr['uname']))
				{
					$Res = $this->GetUser(['u_id', 'u_name'], sprintf(" AND u_name='%s'", LibFc::Escape($TokenArr['uname'])), true);
					$UserData = $Res['data'];
					if(!empty($UserData) && md5('yp'.$UserData['u_id']) == $TokenArr['uid'])
					{
						$Return = ['login'=>true, 'data'=>$UserData['u_id'], 'code'=>''];
					}
				}
				break;
			case 'weixin':
				$UserData = [];
				if(!empty($DataArr['unionid']))
				{
					$Res = $this->GetUser(['u_id'], sprintf(" AND u_weixin_unionid='%s' AND u_weixin_bd='Y' LIMIT 1", LibFc::Escape($DataArr['unionid'])), true);
					$UserData = $Res['data'];
					if(!empty($UserData['u_id']) && !empty($DataArr['openid']))
					{
						$res = $this->get('yp_user_openid', ['yuo_u_id'], sprintf(" and yuo_u_id=%d and yuo_type='weixin' and yuo_unionid='%s' and yuo_openid='%s'", $UserData['u_id'], LibFc::Escape($DataArr['unionid']), LibFc::Escape($DataArr['openid'])), true);
						if(empty($res['data']))
						{
							$openidLink = ['yuo_u_id'=>$UserData['u_id'],'yuo_type'=>'weixin','yuo_unionid'=>$DataArr['unionid'],'yuo_openid'=>$DataArr['openid'],'yuo_etime'=>time()];
							$this->replace('yp_user_openid', $openidLink);
						}
					}
				}

				if(empty($UserData) && !empty($DataArr['openid']))
				{
					$res = $this->get('yp_user_openid join yp_user on yuo_u_id = u_id', ['u_id'], sprintf(" and u_weixin_bd='Y' and yuo_type='weixin' and yuo_openid='%s'", LibFc::Escape($DataArr['openid'])), true);
					$UserData = $res['data'];
				}
				
				if(!empty($UserData['u_id']))
				{
					$Return = ['login'=>true, 'data'=>$UserData['u_id'], 'code'=>''];
				}
				else
				{
					$Error = $LangCode != 'en' ? '微信未绑定，请使用用户名登录': 'Weixin is not binding, please use the account password login';
					$Return = ['login'=>false, 'data'=>$Error, 'code'=>'weixin_invalid'];
				}
				break;
			case 'qq':
				$UserData = [];
				if(!empty($DataArr['unionid']))
				{
					$Res = $this->GetUser(['u_id'], sprintf(" AND u_qq_unionid='%s' AND u_qq_bd='Y' LIMIT 1", LibFc::Escape($DataArr['unionid'])), true);
					$UserData = $Res['data'];
					if(!empty($UserData['u_id']) && !empty($DataArr['openid']))
					{
						$res = $this->get('yp_user_openid', ['yuo_u_id'], sprintf(" and yuo_u_id=%d and yuo_type='qq' and yuo_unionid='%s' and yuo_openid='%s'", $UserData['u_id'], LibFc::Escape($DataArr['unionid']), LibFc::Escape($DataArr['openid'])), true);
						if(empty($res['data']))
						{
							$openidLink = ['yuo_u_id'=>$UserData['u_id'],'yuo_type'=>'qq','yuo_unionid'=>$DataArr['unionid'],'yuo_openid'=>$DataArr['openid'],'yuo_etime'=>time()];
							$this->replace('yp_user_openid', $openidLink);
						}
					}
				}

				if(empty($UserData) && !empty($DataArr['openid']))
				{
					$res = $this->get('yp_user_openid join yp_user on yuo_u_id = u_id', ['u_id'], sprintf(" and u_qq_bd='Y' and yuo_type='qq' and yuo_openid='%s'", LibFc::Escape($DataArr['openid'])), true);
					$UserData = $res['data'];
				}

				if(!empty($UserData['u_id']))
				{
					$Return = ['login'=>true, 'data'=>$UserData['u_id'], 'code'=>''];
				}
				else
				{
					$Error = $LangCode != 'en' ? 'QQ未绑定，请使用用户名登录': 'QQ is not binding, please use the account password login';
					$Return = ['login'=>false, 'data'=>$Error, 'code'=>'qq_invalid'];
				}
				break;
			case 'unitag':
				$res = $this->decodeUnitag($DataArr['unitag']);
				$Return = ['login'=>true, 'data'=>$res['data']['u_id']];
			break;
			case 'apple':
				$Res = $this->GetUser(['u_id'], sprintf(" AND u_apple_unionid='%s' AND u_apple_bd='Y' LIMIT 1", LibFc::Escape($DataArr['unionid'])), true);
				$UserData = $Res['data'];
				if(!empty($UserData['u_id']))
				{
					$Return = ['login'=>true, 'data'=>$UserData['u_id'], 'code'=>''];
				}
				else
				{
					$Error = $LangCode != 'en' ? '尚未绑定账号，请使用用户名登录': 'Weixin is not binding, please use the account password login';
					$Return = ['login'=>false, 'data'=>$Error, 'code'=>'apple_invalid'];
				}
				break;
		}
		if($Return['login'] && $Return['data'] > 0)
		{
			$filed = ['u_status', 'u_password', 'u_b2c_shopid', 'u_b2c_worker', 'u_email', 'u_emil_check', 'u_growth', 'u_gzh_bd','u_id', 'u_integral', 'u_login_time', 'u_logo', 'u_mobile', 'u_mobile_check', 'u_name', 'u_nickname', 'u_real_name', 'u_type', 'u_weixin_bd', 'u_weixin_info', 'u_apple_bd', 'ui_period'];
			$Res = $this->GetUser($filed, sprintf(" AND u_id=%d", $Return['data']), true);
			$UserData = $Res['data'];
			if($UserData['u_status'] == -3)
			{
				return LibFc::ReturnData(false, $LangCode != 'en' ? '账号不存在': 'Account does not exist', 'discontinued');
			}
			else if($UserData['u_status'] < 1)
			{
				return LibFc::ReturnData(false, $LangCode != 'en' ? '账号访问异常，已被停用！': 'Account discontinued', 'discontinued');
			}

			if($UserData['u_mobile_check'] != 'Y' && (stripos($DataArr['from'], 'PJ') === 0 || in_array($DataArr['from'], ['其它'])) && in_array($Type, ['token','apple','weixin','qq','unitag']))
			{
				return LibFc::ReturnData(false, $LangCode != 'en' ? '账号尚未进行手机验证，请使用账户密码登录！': 'The account has not been verified by mobile phone yet. Please log in with your account password!', 'notbindmobile');
			}
			$this->YpwDb->Begin();
			
			$Res = $this->initUserLogo($UserData, true);
			$UserData = $Res['data'];

			$res = $this->buildUnitag($UserData);
			$UserData['unitag'] = $res['data'];
			unset($UserData['u_password']);
			$UserData['utag'] = base64_encode($UserData['u_name'].'@'.md5('yp'.$UserData['u_id']));
			$UserData['u_weixin_info'] = !empty($UserData['u_weixin_info']) ? json_decode($UserData['u_weixin_info'], true): [];
			$Return = ['login'=>true, 'data'=>$UserData, 'code'=>''];
			$this->Set('yp_user',['u_login_time'=>time(), 'u_login_count'=>'#@u_login_count+1', 'u_error_count'=>0], sprintf(" AND u_id=%d", $UserData['u_id']));
			if(!in_array($UserData['u_id'], [8, 1532])){
				$DataArr['ip'] = empty($DataArr['ip'])? LibFc::GetClientIp(): $DataArr['ip'];
				$this->Add('log_login', ['lol_uid'=>$UserData['u_id'], 'lol_time'=>time(), 'lol_ip'=>$DataArr['ip'], 'lol_from'=>$DataArr['from'], 'lol_type'=>'login', 'lol_methon'=>$Type]);
			}
			$this->YpwDb->End();
		}
		return LibFc::ReturnData($Return['login'], $Return['data'], $Return['code']);
	}
	

	/**
	  * @method 生成unitag
	  * @param  $unitag 
	  * @author soul
	  * @copyright 2016/3/30
	  * @return ['status'=>bool, 'data'=>['u_id'=>111,...], 'code'=>'']; 
	  */
	public function buildUnitag($UserData)
	{
		$LibEncry = new LibEncry();
		//unionid 默认30天有效期 = userID@开始计时时间@md5(password)
		$unitag = $LibEncry->encode($UserData['u_id'].'@'.time().'@'.md5('yp'.$UserData['u_password']));
		return LibFc::ReturnData(true, $unitag);
	}

	
	/**
	  * @method 解码unitag并获取用户ID
	  * @param  $unitag 
	  * @author soul
	  * @copyright 2016/3/30
	  * @return ['status'=>bool, 'data'=>['u_id'=>111,...], 'code'=>'']; 
	  */
	public function decodeUnitag($unitag)
	{
		//30天有效期
		$expiry = 3600*24*30;
		$LibEncry = new LibEncry();
		$unitag = $LibEncry->decode($unitag);
		$temp = explode('@', $unitag);
		if(count($temp) == 3 && preg_match('/^\d+$/', $temp[0]) && preg_match('/^1\d{9}$/', $temp[1]) && strlen($temp[2]) == 32)
		{
			if(($temp[1]+$expiry) > time())
			{
				$Res = $this->GetUser(['u_id', 'u_password', 'u_status'], sprintf(" AND u_id=%d LIMIT 1", $temp[0]), true);
				$UserData = $Res['data'];
				if(!empty($UserData['u_id']) && md5('yp'.$UserData['u_password']) == $temp[2])
				{
					unset($UserData['u_password']);
					if($UserData['u_status'] < 1)  return LibFc::ReturnData(false, '监控系统检测到账号使用异常，已被停用！');
					unset($UserData['u_status']);
					return LibFc::ReturnData(true, $UserData);
				}
			}
			else
			{
				return LibFc::ReturnData(false, 'unitag已过期', '');
			}
		}
		return LibFc::ReturnData(false, 'unitag无效', '');
	}

	/**
	  * @method 会员注册
	  * @param  $DataArr 
	  * @param  $LangCode 语言版本 cn  en
	  * @author soul
	  * @copyright 2016/3/30
	  * @return ['status'=>bool, 'data'=>id, 'code'=>'']; 
	  */
	public function Register($DataArr, $LangCode = 'cn')
	{
		$DataArr['u_mobile_check'] = 'N';
		$DataArr['u_from'] = empty($DataArr['u_from'])? 'YP': $DataArr['u_from'];
		//中文版手机必填，其它语言版本邮箱必填
		$this->YpwDb->Begin();
		if($LangCode != 'en')
		{
			if(preg_match('/^1\d{10}$/', $DataArr['u_mobile']) && preg_match('/^\d{6}$/', $DataArr['mobile_code']))
			{
				$res = $this->GetUser(['u_id'], sprintf(" AND u_mobile_check='Y' AND u_mobile='%s'", $DataArr['u_mobile']), true);
				if(!empty($res['data']))
					return LibFc::ReturnData(false, '手机号码已被注册，请重新输入！【注：宜配网、跑街商城、跑街令均使用同一通用的用户系统（宜配通行证）】', 'mobile_error');
				$SendSms = new SendSms();
				$tArr = [
					'mobile'=>$DataArr['u_mobile'],
					'style'=>'bind,password,login',
					'from'=>$DataArr['u_from'],
					'code'=>$DataArr['mobile_code']
				];
				
				$SendSms->checkMobileCode($tArr);
				$DataArr['u_mobile_check'] = 'Y';
				$SendSms->outMobileCode($tArr);
			}
			if($DataArr['u_mobile_check'] != 'Y')
				return LibFc::ReturnData(false, '手机号码或者手机验证码错误，请重新输入！', 'mobile_error');
			
			//自动填写用户名
			if(empty($DataArr['u_name']))
			{
				$tempArr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'q', 'w', 'z', 'x', 'y', 'p', 'a1', 'b1', 'c1', 'd1', 'e1', 'f1', 'g1', 'h1', 'i1', 'j1', 'k1', 'q1', 'w1', 'z1', 'x1', 'y1', 'p1'];
				foreach($tempArr as $char)
				{
					$DataArr['u_name'] = $char.substr($DataArr['u_mobile'], -6);
					$Res = $this->Get('yp_user', ['u_id'], sprintf(" AND u_name ='%s' LIMIT 1", LibFc::Escape($DataArr['u_name'])), true);
					if(empty($Res['data'])) break;
				}
			}
		}
		else if(empty($DataArr['u_email']))
		{
			$Error = $LangCode != 'en' ? '请填写手机号码或者邮箱': 'Please fill in the phone number or email';
			return LibFc::ReturnData(false, $Error, 'insert_error');
		}

		if(!preg_match('/^(?![0-9]+$)[0-9A-Za-z_]{4,20}$/', $DataArr['u_name']))
		{
			$Error = $LangCode != 'en' ? '用户名是4-20个(字母、数字、下划线)的组合，且必须含有字母': 'The username is a combination of 4-20 letters, numbers, and underscores, and must contain letters';
			return LibFc::ReturnData(false, $Error, 'name_error');
		}
		
		if($DataArr['u_mobile_check'] == 'Y' && !isset($DataArr['u_password']))
		{
			//手机注册允许不设置密码
		}
		else
		{
			$DataArr['u_password'] = trim($DataArr['u_password']);
			if(strlen($DataArr['u_password']) < 6 || strlen($DataArr['u_password']) > 20)
			{
				$Error = $LangCode != 'en' ? '密码是长度为6~20个字符的组合': 'A password is a combination of 6 to 20 characters in length';
				return LibFc::ReturnData(false, $Error, 'pass_error');
			}
			$DataArr['u_password'] = md5('Y'.md5(trim($DataArr['u_password'])).'P');
		}
		if(!empty($DataArr['u_email']))
		{
			if(!filter_var($DataArr['u_email'], FILTER_VALIDATE_EMAIL))
			{
				$Error = $LangCode != 'en' ? '请输入正确的Email': 'Please enter the correct email';
				return LibFc::ReturnData(false, $Error, 'email_error');
			}
			//检查EMAIL唯一性
			$Res = $this->Get('yp_user', ['u_id'], sprintf(" AND u_email ='%s' LIMIT 1", LibFc::Escape($DataArr['u_email'])), true);
			if(!empty($Res['data']))
			{
				$Error = $LangCode != 'en' ? 'Email已被注册，请重新输入【注：宜配网、跑街商城、跑街令均使用同一通用的用户系统（宜配通行证）】': 'The email has been registered. Please re-enter it';
				return LibFc::ReturnData(false, $Error, 'email_exists');
			}
		}

		//检查用户名唯一性
		$Res = $this->Get('yp_user', ['u_id'], sprintf(" AND u_name ='%s' LIMIT 1", LibFc::Escape($DataArr['u_name'])), true);
		if(!empty($Res['data']))
		{
			$Error = $LangCode != 'en' ? '用户名已被注册，请重新输入【注：宜配网、跑街商城、跑街令均使用同一通用的用户系统（宜配通行证）】': 'The user name has been registered. Please re-enter it';
			return LibFc::ReturnData(false, $Error, 'name_exists');
		}

		if(empty($DataArr['u_nickname']))
			$DataArr['u_nickname'] = $DataArr['u_name'];
		$Res = $this->Get('yp_user', ['u_id'], sprintf(" AND u_nickname='%s'", LibFc::Escape($DataArr['u_name'])), true);
		if(!empty($Res['data']))
			$DataArr['u_nickname'] = $DataArr['u_name'].'_'.rand(1,100);

		if(isset($DataArr['u_nickname'])) $DataArr['u_nickname'] = LibFc::msubstr($DataArr['u_nickname'], 0, 20, 'utf-8', false);

		$BaseArr = [];
		$ExtArr = [];
		foreach($DataArr as $K=>$V)
		{
			if(stripos($K, 'u_') === 0)
			{
				$BaseArr[$K] = $V;
			}
			else if(stripos($K, 'ui_') === 0)
			{
				$ExtArr[$K] = $V;
			}
		}
		unset($BaseArr['u_type']);
		unset($BaseArr['u_emil_check']);
		unset($BaseArr['u_ul_id']);
		unset($BaseArr['u_weixin_bd']);
		unset($BaseArr['u_gzh_bd']);
		unset($BaseArr['u_login_count']);
		unset($BaseArr['u_login_time']);
		$BaseArr['u_register_time'] = time();
		$BaseArr['u_from_uid'] = (int) $BaseArr['u_from_uid'];
		
		$Res = $this->Add('yp_user', $BaseArr);
		if(!LibFc::Int($Res['data']))
		{
			$Error = $LangCode != 'en' ? '用户注册失败，请稍后重试': 'Data storage failed, please try again later';
			return LibFc::ReturnData(false, $Error, 'insert_error');
		}
		$Uid = $Res['data'];
		$ExtArr['ui_uid'] = $Uid;
		$this->Add('yp_user_ext', $ExtArr);
		
		//商城
		$B2cBase = new B2cBase();
		$B2cBase->add('us_user_base', ['ub_uid'=>$Uid, 'ub_username'=>$BaseArr['u_name']]);

		//防止并发造成一个手机号被多账号同时绑定
		if($BaseArr['u_mobile_check'] == 'Y')
			$this->Set('yp_user', ['u_mobile_check'=>'N'], sprintf(" and u_mobile='%s' and u_mobile_check='Y' AND u_id != %d", $BaseArr['u_mobile'], $Uid));

		
		$DataArr['ip'] = empty($DataArr['ip'])? LibFc::GetClientIp(): $DataArr['ip'];
		$this->Add('log_login', ['lol_uid'=>$Uid, 'lol_time'=>time(), 'lol_ip'=>$DataArr['ip'], 'lol_from'=>$DataArr['from'], 'lol_type'=>'reg']);

		//初始化IM用户信息
		$OthIm = new OthIm();
		$OthIm->importUser([$Uid]);
		$this->YpwDb->End();
		return LibFc::ReturnData(true, $Uid);
	}



	/**
	  * @method 商城职员添加
	  * @param  $DataArr [u_name, u_password 提供明文密码, u_b2c_shopid店铺ID]
	  * @author soul
	  * @copyright 2016/3/30
	  * @return ['status'=>bool, 'data'=>id, 'code'=>'']; 
	  */
	public function addWorker($DataArr)
	{
		$DataArr['u_b2c_shopid'] = (int) $DataArr['u_b2c_shopid'];
		$nameArr = explode(':', $DataArr['u_name']);
		if(preg_match('/^(?![0-9]+$)[0-9A-Za-z_]{4,20}$/', $nameArr[0]) && preg_match('/^[0-9A-Za-z]{4,10}$/', $nameArr[1]))
		{
			//无此商家用户
			$Res = $this->Get('yp_user', ['u_id'], sprintf(" AND u_name ='%s' AND u_b2c_shopid = %d LIMIT 1", LibFc::Escape($nameArr[0]), $DataArr['u_b2c_shopid']), true);
			if(empty($Res['data'])) return LibFc::ReturnData(false, '店铺不存在', 'name_error');
		}
		else
		{
			return LibFc::ReturnData(false, '用户名格式不正确', 'name_error');
		}

		$DataArr['u_password'] = trim($DataArr['u_password']);
		if(strlen($DataArr['u_password']) < 6 || strlen($DataArr['u_password']) > 20)
		{
			return LibFc::ReturnData(false, '密码是长度为6~20个字符的组合', 'pass_error');
		}
		$DataArr['u_password'] = md5('Y'.md5(trim($DataArr['u_password'])).'P');

		$this->YpwDb->Begin();

		//检查用户名唯一性
		$Res = $this->Get('yp_user', ['u_id'], sprintf(" AND u_name ='%s' LIMIT 1", LibFc::Escape($DataArr['u_name'])), true);
		if(!empty($Res['data']))
		{
			return LibFc::ReturnData(false, '用户名已被注册，请重新输入', 'name_exists');
		}

		$BaseArr = [];
		$ExtArr = [];
		foreach($DataArr as $K=>$V)
		{
			if(stripos($K, 'u_') !== false)
			{
				$BaseArr[$K] = $V;
			}
			else if(stripos($K, 'ui_') !== false)
			{
				$ExtArr[$K] = $V;
			}
		}
		unset($BaseArr['u_type']);
		unset($BaseArr['u_emil_check']);
		unset($BaseArr['u_mobile_check']);
		unset($BaseArr['u_ul_id']);
		unset($BaseArr['u_weixin_bd']);
		unset($BaseArr['u_gzh_bd']);
		unset($BaseArr['u_login_count']);
		unset($BaseArr['u_login_time']);
		$BaseArr['u_nickname'] = $BaseArr['u_name'];
		$BaseArr['u_register_time'] = time();
		$BaseArr['u_b2c_worker'] = 'Y';
		$Res = $this->Add('yp_user', $BaseArr);
		if(!LibFc::Int($Res['data']))
		{
			return LibFc::ReturnData(false, '商城职员添加失败，请稍后重试', 'insert_error');
		}
		$Uid = $Res['data'];
		$ExtArr['ui_uid'] = $Uid;
		$this->Add('yp_user_ext', $ExtArr);
		$this->YpwDb->End();
		return LibFc::ReturnData(true, $Uid, '');
	}



	/**
	  * @method 手机、微信、QQ的绑定与解绑 公众号关注或者取消关注
	  * @param  $DataArr [
	  		'qq'=>['bind'=>'Y|N', 'u_qq_unionid'=>'', 'u_qq_info'=>''] bind必填
			'weixin'=>['bind'=>'Y|N', 'u_weixin_unionid'=>'', 'u_weixin_info'=>''] bind必填
			'gzh'=>['bind'=>'Y|N', 'u_weixin_unionid'=>'', 'u_weixin_info'=>''] bind必填
			'shouji'=>['bind'=>'Y|N', 'u_mobile'=>''] bind必填
			'apple'=>['bind'=>'Y|N', 'u_apple_unionid'=>'', 'u_apple_info'=>''] bind必填
			]
	      'weixin','qq','shouji','gzh', 'apple' 可选择里面的任意key组合
	  * @param  $Uid 
	  * @author soul
	  * @copyright 2016/3/30
	  * @return ['status'=>bool, 'data'=>['unitag'=>'用户唯一编码'], 'code'=>'']; 
	  */
	public function BindAccount($Uid, $DataArr)
	{
		$Uid = (int) $Uid;
		$BindArr = ['qq','weixin','shouji','gzh', 'apple'];
		foreach($DataArr as $K=>$V)
		{
			if(!in_array($K, $BindArr))
			{
				unset($DataArr[$K]);
			}
		}
		$arr = ['unitag'=>''];
		if($Uid > 0 && !empty($DataArr))
		{
			$this->YpwDb->Begin();
			$Res = $this->GetUser(['u_id', 'u_mobile_check', 'u_weixin_unionid', 'u_weixin_bd', 'u_gzh_bd', 'u_qq_unionid', 'u_qq_bd','u_mobile', 'u_password', 'u_nickname', 'u_logo', 'u_weixin_info', 'u_apple_unionid', 'u_apple_bd', 'u_apple_info'], sprintf(" AND u_id='%d'", $Uid), true);
			$OldUserData = $Res['data'];
			if(empty($OldUserData)) return LibFc::ReturnData(false, '此账号尚未注册');

			$LibEncry = new LibEncry();
			if(in_array('Y', array_column($DataArr, 'bind')))
			{//unionid 默认30天有效期 = userID@开始计时时间@md5(password)
				$arr['unitag'] = $LibEncry->encode($OldUserData['u_id'].'@'.time().'@'.md5('yp'.$OldUserData['u_password']));
			}
			foreach($DataArr as $By=>$V)
			{
				$Bind = strtoupper($V['bind']);
				unset($V['bind']);
				if(!in_array($Bind, ['Y', 'N'])) continue;
				switch($By)
				{
					case 'qq':
						if($Bind == 'Y')
						{
							//{"client_id":"101534400","openid":"3A22B8E26B3467E37A5DF37812BE7FC2","unionid":"UID_CC46D2958EA97208E4DEF9386AA7452E","ret":0,"msg":"","is_lost":0,"nickname":"\u9ed1\u767d\u914d","gender":"\u7537","gender_type":2,"province":"\u5e7f\u4e1c","city":"\u6df1\u5733","year":"1990","constellation":"","figureurl":"http:\/\/qzapp.qlogo.cn\/qzapp\/101534400\/3A22B8E26B3467E37A5DF37812BE7FC2\/30","figureurl_1":"http:\/\/qzapp.qlogo.cn\/qzapp\/101534400\/3A22B8E26B3467E37A5DF37812BE7FC2\/50","figureurl_2":"http:\/\/qzapp.qlogo.cn\/qzapp\/101534400\/3A22B8E26B3467E37A5DF37812BE7FC2\/100","figureurl_qq_1":"http:\/\/thirdqq.qlogo.cn\/g?b=oidb&k=mYQet1SLf9cskbHOwJAz9w&kti=ZMNdigAAAAA&s=40&t=1554993178","figureurl_qq_2":"http:\/\/thirdqq.qlogo.cn\/g?b=oidb&k=mYQet1SLf9cskbHOwJAz9w&kti=ZMNdigAAAAA&s=100&t=1554993178","figureurl_qq":"http:\/\/thirdqq.qlogo.cn\/g?b=oidb&k=mYQet1SLf9cskbHOwJAz9w&kti=ZMNdigAAAAA&s=640&t=1554993178","figureurl_type":"1","is_yellow_vip":"0","vip":"0","yellow_vip_level":"0","level":"0","is_yellow_year_vip":"0"}
							$unionid = $V['u_qq_unionid'];
							$infoArr = json_decode($V['u_qq_info'], true);
							if(!empty($infoArr['unionid']) && !empty($infoArr['openid']) && $unionid == $infoArr['unionid'])
							{
								$infoStr = LibFc::jsonEncode($infoArr);
								//去除其他绑定
								$this->Set('yp_user', ['u_qq_bd'=>'N', 'u_qq_info'=>'#@NULL', 'u_qq_unionid'=>''], sprintf(" AND u_id!=%d AND u_qq_unionid='%s'", $Uid, LibFc::Escape($unionid)));
								$this->del('yp_user_openid', sprintf(" and yuo_type='qq' and yuo_u_id!=%d and yuo_unionid='%s'", $Uid, LibFc::Escape($unionid)));
								//重新绑定
								$this->Set('yp_user', ['u_qq_bd'=>'Y', 'u_qq_unionid'=>$unionid, 'u_qq_info'=>$infoStr], sprintf(" AND u_id=%d", $Uid));
								$openidLink = ['yuo_u_id'=>$Uid,'yuo_type'=>'qq','yuo_unionid'=>$unionid,'yuo_openid'=>$infoArr['openid'],'yuo_etime'=>time()];
								$this->replace('yp_user_openid', $openidLink);
							}else{
								return LibFc::ReturnData(false, '获取QQ绑定信息失败，无法绑定');
							}
						}
						else if($Bind == 'N')
						{
							$this->Set('yp_user', ['u_qq_bd'=>'N', 'u_qq_info'=>'#@NULL', 'u_qq_unionid'=>''], sprintf(" AND (u_id=%d OR u_qq_unionid='%s')", $Uid, LibFc::Escape($unionid)));
							$this->del('yp_user_openid', sprintf(" and (yuo_u_id=%d or yuo_unionid='%s') and yuo_type='qq'", $Uid, LibFc::Escape($unionid)));
						}
					break;
					case 'weixin':
						if($Bind == 'Y')
						{
							//{"openid":"obxtFwN9z4_RLadXXeyjiA18bpBY","nickname":"\u9759","sex":0,"language":"","city":"","province":"","country":"","headimgurl":"https:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/Q0j4TwGTfTLZQCRxSIawcMCE4yQdE8fqLCia4F2FvUf4wFfQeXLLQcyu7b4tAkFR4V2iaboqwxccDPAg8z6WsibMQ\/132","privilege":[],"unionid":"ok4Ppv_ZptzI6XBiLQXfAmdGXzoE"}
							$unionid = $V['u_weixin_unionid'];
							$infoArr = json_decode($V['u_weixin_info'], true);
							if(!empty($infoArr['unionid']) && !empty($infoArr['openid']) && $unionid == $infoArr['unionid'])
							{
								$infoStr = LibFc::jsonEncode($infoArr);
								//取消之前这个微信的所有绑定与关注
								$this->Set('yp_user', ['u_gzh_bd'=>'N', 'u_weixin_bd'=>'N', 'u_weixin_info'=>'#@NULL', 'u_weixin_unionid'=>''], sprintf(" AND u_id!=%d AND u_weixin_unionid='%s'", $Uid, LibFc::Escape($unionid)));
								$this->del('yp_user_openid', sprintf(" and yuo_type='weixin' and yuo_u_id!=%d and yuo_unionid='%s'", $Uid, LibFc::Escape($unionid)));
								//重新绑定
								$setArr = ['u_weixin_bd'=>'Y', 'u_weixin_unionid'=>$unionid, 'u_weixin_info'=>$infoStr];
								if(empty($OldUserData['u_logo']) && !empty($infoArr['headimgurl']))
								{//头像
									$LibHttp = new LibHttp();
									$html = $LibHttp->fetch($infoArr['headimgurl']);
									if(strlen($html) > 1000 && md5($html) != 'fee9458c29cdccf10af7ec01155dc7f0')
									{
										$data_arr = [
											'token'=>mvc::$cfg['FILE_CENTER']['yp']['token'],
											'file'=>[
												'name'=>'a.jpg',
												'data'=>$html
											],
											'cate'=>'yp_logo'
										];
										$res  = $LibHttp->upload(mvc::$cfg['FILE_CENTER']['yp']['url_put'], $data_arr);
										$setArr['u_logo'] = $res['data']['path'].$res['data']['small'].'/'.$res['data']['name'].'.'.$res['data']['ext'];
									}
								}

								if(!empty($infoArr['nickname']))
								{//昵称
									$infoArr['nickname'] = preg_replace_callback( '/./u', function (array $match) {return strlen($match[0]) >= 4 ? '' : $match[0];}, $infoArr['nickname']);
									if(empty($OldUserData['u_nickname']) && !empty($infoArr['nickname']))
									{
										$res = $this->Get('yp_user', ['u_id'], sprintf(" AND u_nickname='%s' and u_id != %d", LibFc::Escape($infoArr['nickname']), $Uid), true);
										if(empty($res['data']))
										{
											$setArr['u_nickname'] = $infoArr['nickname'];
										}
									}
								}

								//是否有关注公众号，只要存在当已关注处理，忽略取消关注的
								$res = $this->Get('wx_gzh_user', ['gu_subscribe'], sprintf(" and gu_unionid='%s'", $setArr['u_weixin_unionid']), true);
								$setArr['u_gzh_bd'] = empty($res['data']['gu_subscribe'])? 'N': 'Y';
								//重新绑定
								$this->Set('yp_user', $setArr, sprintf(" AND u_id = %d", $Uid));
								$openidLink = ['yuo_u_id'=>$Uid,'yuo_type'=>'weixin','yuo_unionid'=>$unionid,'yuo_openid'=>$infoArr['openid'],'yuo_etime'=>time()];
								$this->replace('yp_user_openid', $openidLink);
							}else{
								return LibFc::ReturnData(false, '获取微信绑定信息失败，无法绑定');
							}
						}
						else if($Bind == 'N')
						{
							$this->Set('yp_user', ['u_gzh_bd'=>'N', 'u_weixin_bd'=>'N', 'u_weixin_info'=>'#@NULL', 'u_weixin_unionid'=>''], sprintf(" AND (u_id=%d OR u_weixin_unionid = '%s')", $Uid, LibFc::Escape($unionid)));
							$this->del('yp_user_openid', sprintf(" and (yuo_u_id=%d or yuo_unionid='%s') and yuo_type='weixin'", $Uid, LibFc::Escape($unionid)));
						}
					break;
					case 'gzh':
						if($Bind == 'Y')
						{
							$unionid = $V['u_weixin_unionid'];
							$infoArr = json_decode($V['u_weixin_info'], true);
							if(!empty($infoArr['unionid']) && !empty($infoArr['openid']) && $unionid == $infoArr['unionid'])
							{
								$infoStr = LibFc::jsonEncode($infoArr);
								//取消之前这个微信的所有绑定与关注
								$this->Set('yp_user', ['u_gzh_bd'=>'N', 'u_weixin_bd'=>'N', 'u_weixin_info'=>'#@NULL', 'u_weixin_unionid'=>''], sprintf(" AND u_id!=%d AND u_weixin_unionid='%s'", $Uid, LibFc::Escape($unionid)));
								//关注必绑定
								$this->Set('yp_user', ['u_gzh_bd'=>'Y', 'u_weixin_bd'=>'Y', 'u_weixin_unionid'=>$unionid, 'u_weixin_info'=>$infoStr], sprintf(" AND u_id = %d", $Uid));
							}else{
								return LibFc::ReturnData(false, '获取微信绑定信息失败，无法绑定');
							}
						}
						else if($Bind == 'N')
						{
							$this->Set('yp_user', ['u_gzh_bd'=>'N'], sprintf(" AND u_id = %d", $Uid));
						}
					break;
					case 'shouji':
						$Mobile = !empty($V['u_mobile'])? $V['u_mobile']: $OldUserData['u_mobile'];
						if($Bind == 'Y' && preg_match('/^1\d{10}$/', $Mobile))
						{
							//取消之前
							$this->Set('yp_user', ['u_mobile_check'=>'N', 'u_mobile'=>''], sprintf(" AND  u_id!= %d AND u_mobile ='%s'", $Uid, $Mobile));
							//重新绑定
							$this->Set('yp_user', ['u_mobile_check'=>'Y', 'u_mobile'=>$Mobile], sprintf(" AND u_id = %d", $Uid));
						}
						else if($Bind == 'N')
						{
							$this->Set('yp_user', ['u_mobile_check'=>'N'], sprintf(" AND u_id = %d", $Uid));
						}
					break;
					case 'apple':
						//QQ绑定
						$Unionid = !empty($V['u_apple_unionid'])? $V['u_apple_unionid']: $OldUserData['u_apple_unionid'];
						$Info = !empty($V['u_apple_info'])? LibFc::jsonEncode(json_decode($V['u_apple_info'])): $OldUserData['u_apple_info'];
						if($Bind == 'Y' && !empty($Unionid) && !empty($Info))
						{
							//取消之前这个QQ的所有绑定与关注
							$this->Set('yp_user', ['u_apple_bd'=>'N', 'u_apple_info'=>'#@NULL', 'u_apple_unionid'=>''], sprintf(" AND u_id!=%d AND u_apple_unionid = '%s'", $Uid, LibFc::Escape($Unionid)));
							//重新绑定
							$this->Set('yp_user', ['u_apple_bd'=>'Y', 'u_apple_unionid'=>$Unionid, 'u_apple_info'=>$Info], sprintf(" AND u_id = %d", $Uid));
						}
						else if($Bind == 'N')
						{
							$this->Set('yp_user', ['u_apple_bd'=>'N', 'u_apple_info'=>'#@NULL', 'u_apple_unionid'=>''], sprintf(" AND (u_id=%d OR u_apple_unionid = '%s')", $Uid, LibFc::Escape($Unionid) ));
						}
					break;
				}
			}
			$this->YpwDb->End();
		}
		return LibFc::ReturnData(true, $arr);
	}


	/**
	  * @method 修改会员信息
	  * @param  $uid  用户ID
	  * @param  $dataArr ['u_logo'=>.....]
	  * @author soul
	  * @copyright 2016/3/30
	  * @return ['status'=>bool, 'data'=>, 'code'=>'']; 
	  */
	public function setUser($uid, $dataArr)
	{
		$uid = (int) $uid;
		if($uid < 1 || empty($dataArr) || !is_array($dataArr)) return LibFc::ReturnData(false, 'setUser提供的参数不正确');
		$setArr = ['base'=>[], 'info'=>[]];
		foreach($dataArr as $k=>$v)
		{
			if(stripos($k, 'u_') === 0)
			{
				$setArr['base'][$k] = $v;
			}
			else if(stripos($k, 'ui_') === 0)
			{
				$setArr['info'][$k] = $v;
			}
		}

		unset($setArr['base']['u_name']);
		unset($setArr['base']['u_mobile_check']);
		unset($setArr['base']['u_gzh_bd']);
		unset($setArr['base']['u_pay_password']);
		unset($setArr['base']['u_register_time']);

		if(isset($setArr['base']['u_password']))
		{
			$setArr['base']['u_password'] = trim($setArr['base']['u_password']);
			if(strlen($setArr['base']['u_password']) < 6 || strlen($setArr['base']['u_password']) > 20)
			{
				return LibFc::ReturnData(false, '密码是长度为6~20个字符的组合', 'pass_error');
			}
			$setArr['base']['u_password'] = md5('Y'.md5($setArr['base']['u_password']).'P');
		}
		if(isset($setArr['base']['u_nickname'])) 
		{
			$setArr['base']['u_nickname'] = LibFc::msubstr($setArr['base']['u_nickname'], 0, 20, 'utf-8', false);
			$Res = $this->Get('yp_user', ['u_id'], sprintf(" AND u_nickname='%s' and u_id != %d", LibFc::Escape($setArr['base']['u_nickname']), $uid), true);
			if(!empty($Res['data']))
				return LibFc::ReturnData(false, '昵称已被注册，请重新输入', 'nickname_error');
		}
		$this->YpwDb->Begin();
		if(!empty($setArr['base']))
		{
			//账号被禁用，删除token
			if(!empty($setArr['base']['u_status']) && $setArr['base']['u_status'] != 1)
			{
				$url = mvc::$cfg['HOST']['apiToken'];
				$LibCurl = new LibCurl();
				$urlParamArr = [
					'fun'=>'delToken',
					'uid'=>$uid
				];
				$url .= '?'.http_build_query($urlParamArr);
				$LibCurl->fetch($url);
			}
			$this->Set('yp_user', $setArr['base'], sprintf(" AND u_id=%d", $uid));
		}
		if(!empty($setArr['info']))
		{
			$this->Set('yp_user_ext', $setArr['info'], sprintf(" AND ui_uid=%d", $uid));
		}

		//初始化IM用户信息
		$OthIm = new OthIm();
		$OthIm->importUser([$Uid]);

		$this->YpwDb->End();
		return LibFc::ReturnData(true);
	}



	/**
	  * @method 获取用户token
	  * @http  get
	  * @param  token              string [必填] 调用接口凭证 (post|get)
	  * @param  uid                string  [必填] md5('yp'.id)
	  * @param  uname              string  [必填] 
	  * @author soul
	  * @copyright 2017/8/16
	  * @return 
		{"status":true,"data":'token',"code":0}
		{"status":false,"data":'失败原因',"code":0}
	  */
	public function getToken($dataArr)
	{
		if($dataArr['uid'] != '' && $dataArr['uname'] != '')
		{
			$timerUrl = mvc::$cfg['HOST']['userToken'];
			$urlParamArr = [
				'type'=>'addToken',
				'data'=>urlencode(json_encode($dataArr))
			];
			$timerUrl .= '?'.http_build_query($urlParamArr);
			$LibCurl = new LibCurl();
			$html = $LibCurl->fetch($timerUrl);
			$res = json_decode($html, true);
			if(is_array($res) && $res['status'])
			{
				return $res;
			}
			else
			{
				return LibFc::ReturnData(false, '获取token失败'.$html);
			}
		}
		return LibFc::ReturnData(false, '获取token的参数不完整');
	}

	/**
	  * @method 获取token的原始信息
	  * @http  get
	  * @param  token              string [必填] 调用接口凭证 (post|get)
	  * @param  token              string [必填] 用户登录token
	  * @author soul
	  * @copyright 2017/8/16
	  * @return 
		{"status":true,"data":'token',"code":0}
		{"status":false,"data":'失败原因',"code":0}
	  */
	public function getDataByToken($token)
	{
		if(strlen($token) > 10)
		{
			$timerUrl = mvc::$cfg['HOST']['userToken'];
			$urlParamArr = [
				'type'=>'getToken',
				'token'=>$token
			];
			$timerUrl .= '?'.http_build_query($urlParamArr);
			$LibCurl = new LibCurl();
			$res = $LibCurl->fetch($timerUrl);
			return json_decode($res, true);
		}
		return LibFc::ReturnData(false, '请提供正确的token');
	}


	/**
	  * @method 修改支付密码 
	  * @param  $uid  用户ID
	  * @param  $dataArr[  
					'new_password'=>新密码
					'old_password'=> 旧密码 [可选]      未设置过密码不需要提供，修改支付密码：$old_password、$mobile_code二选一 
					'mobile_code'=>  手机验证码 [可选]  未设置过密码不需要提供，修改支付密码：$old_password、$mobile_code二选一 
					'from'=>来源
				]
	  * @author soul
	  * @copyright 2018/8/25
	  * @return 
			成功：['status'=>true, 'data'=>true]
			失败：['status'=>false, 'data'=>'错误原因']
	  */
	public function setPayPassword($uid, $dataArr)
	{
		$uid = (int) $uid;
		$new_password = trim($dataArr['new_password']);
		if($uid < 1 || empty($new_password))
			return LibFc::ReturnData(false, 'setPayPassword提供的参数不正确！');
		if(in_array($uid, [369676])) return LibFc::ReturnData(false, '此账号为内部账号，禁止修改密码！');
		
		if(strlen($new_password) < 6)
			return LibFc::ReturnData(false, '请输入6位及以上的支付密码！');
		$res = $this->Get('yp_user', ['u_pay_password', 'u_mobile', 'u_mobile_check'], sprintf(" and u_id=%d", $uid), true);
		if(empty($res['data']))
			return LibFc::ReturnData(false, '用户记录不存在，无法设置支付密码！');
		$userArr = $res['data'];

		$setArr = ['u_pay_password'=>md5('Y'.md5($new_password).'P')];
		
		$this->YpwDb->Begin();
		//未设置过，直接修改
		$MainLog = new MainLog();
		if(empty($userArr['u_pay_password']))
		{
			$this->Set('yp_user', $setArr, sprintf(" AND u_id=%d", $uid));
			$MainLog->addLog($uid, '设置支付密码', $dataArr['from']);
			$this->YpwDb->End();
			return LibFc::ReturnData(true, true);
		}
		
		if(!empty($dataArr['old_password']))
		{
			if(md5('Y'.md5(trim($dataArr['old_password'])).'P') == $userArr['u_pay_password'])
			{
				$this->Set('yp_user', $setArr, sprintf(" AND u_id=%d", $uid));
				$MainLog->addLog($uid, '通过旧支付密码设置支付密码', $dataArr['from']);
				$this->YpwDb->End();
				return LibFc::ReturnData(true, true);
			}
			return LibFc::ReturnData(false, '旧支付密码不正确，请重新输入！');
		}
		
		if(!empty($dataArr['mobile_code']))
		{
			if($userArr['u_mobile_check'] != 'Y')
				return LibFc::ReturnData(false, '账号尚未绑定手机，请使用旧支付密码设置支付密码！');
			
			//检查验证码
			$SendSms = new SendSms();
			$dataArr = [
				'mobile'=>$userArr['u_mobile'],
				'style'=>'paypassword',
				'from'=>$dataArr['from'],
				'code'=>$dataArr['mobile_code']
			];
			$res = $SendSms->checkMobileCode($dataArr);
			if(!empty($res['data']))
			{	
				$this->Set('yp_user', $setArr, sprintf(" AND u_id=%d", $uid));
				$MainLog->addLog($uid, '通过'.$userArr['u_mobile'].'验证码设置支付密码', $dataArr['from']);
				$this->YpwDb->End();
				return LibFc::ReturnData(true, true);
			}
			return LibFc::ReturnData(false, '手机验证码不正确，请重新输入！');
		}
		return LibFc::ReturnData(false, 'setPayPassword提供的参数不正确！');
	}

	
	/**
	  * @method 积分充值订单提交
	  * @param  $dataArr [
			'up_u_id'=>1,
			'up_money'=>支付金额, 
			'up_integral'=>兑换积分数
			'up_pay_by'=>alipay||weixin,
			'up_pay_type'=>pc:扫码 app:APP wap:手机网 gzh:公众号,
			'up_from'=>来源
			]
	  * @author soul
	  * @copyright 2016/3/30
	  * @return 
			成功：['status'=>true, 'data'=>[up_id, 支付信息]]
			失败：['status'=>false, 'data'=>'错误原因']
	  */
	public function rechargeIntegral($dataArr)
	{
		$dataArr['up_u_id'] = (int) $dataArr['up_u_id'];
		$dataArr['up_money'] = sprintf("%.2f", $dataArr['up_money']);
		$dataArr['up_integral'] = (int) $dataArr['up_integral'];
		if($dataArr['up_u_id'] > 0 && $dataArr['up_money'] > 0 && $dataArr['up_integral'] > 0 && !empty($dataArr['up_pay_by']) && !empty($dataArr['up_pay_type']) && !empty($dataArr['up_from']))
		{
			$arr = [];
			$res = $this->Get('yp_user', ['u_integral'], sprintf(" AND u_id=%d", $dataArr['up_u_id']), true);
			if(empty($res['data'])) return LibFc::ReturnData(false, '会员信息不存在！');
			//正常1:1
			if($dataArr['up_integral']/100/$dataArr['up_money'] > 1.5) return LibFc::ReturnData(false, '兑换积分比例异常！');
			$this->YpwDb->Begin();
			$dataArr['up_atime'] = time();
			$dataArr['up_guid'] = LibFc::guid();
			$res = $this->Add('yp_user_pay', $dataArr);
			$arr['up_id'] = $res['data'];
			$res = $this->getRechargeIntegralPay($arr['up_id'], $dataArr['up_pay_by'], $dataArr['up_pay_type']);
			$arr = array_merge($arr, $res['data']);
			$this->YpwDb->End();
			return LibFc::ReturnData(true, $arr);
		}
		return LibFc::ReturnData(false, 'rechargeIntegral提供的参数不正确！');
	}


	/**
	  * @method 积分充值支付信息
	  * @param  $upId 订单ID
	  * @param  $payBy alipay||weixin[可选，需要变更时提供]
	  * @param  $payType pc:扫码 app:APP wap:手机网 gzh:公众号[可选，需要变更时提供]
	  * @author soul
	  * @copyright 2016/3/30
	  * @return 
			成功：['status'=>true, 'data'=>[支付信息]]
			失败：['status'=>false, 'data'=>'错误原因']
	  */
	public function getRechargeIntegralPay($upId, $payBy='', $payType='')
	{
		$arr = [];
		$upId = (int) $upId;
		if($upId > 0)
		{
			$res = $this->Get('yp_user_pay', ['*'], sprintf(" and up_id=%d", $upId), true);
			if(empty($res['data'])) return LibFc::ReturnData(false, '充值订单不存在！');
			$upArr = $res['data'];
			if($upArr['up_status'] > 0) return LibFc::ReturnData(false, '已完成付款，请勿重复支付！');
			$MainOrder = new MainOrder();
			//更换支付方式
			if(empty($upArr['up_por_id']) || (!empty($payBy) && $payBy != $upArr['up_pay_by']) || (!empty($payType) && $payType != $upArr['up_pay_type']))
			{
				if(!empty($payBy)) $upArr['up_pay_by'] = $payBy;
				if(!empty($payType)) $upArr['up_pay_type'] = $payType;
				//关闭之前的支付
				$this->YpwDb->Begin(); 
				if(!empty($upArr['up_por_id'])) $MainOrder->closePay($upArr['up_por_id']);
				$tArr = [
					'por_guid'=>LibFc::guid(),
					'por_u_id'=>$upArr['up_u_id'],
					'por_site'=>'',
					'por_style'=>'YPING',
					'por_orderids'=>$upArr['up_id'],
					'por_pay_method'=>$upArr['up_pay_by'],
					'por_pay_type'=>$upArr['up_pay_type'],
					'por_money'=>$upArr['up_money'],
					'por_title'=>'积分充值订单：'.$upArr['up_id'],
					'por_from'=>$upArr['up_from']
				];
				$res = $MainOrder->buildPay($tArr);
				$arr = $res['data'];
				$setArr = [
					'up_por_id'=>$arr['por_id'],
					'up_guid'=>$tArr['por_guid'],
					'up_pay_by'=>$upArr['up_pay_by'],
					'up_pay_type'=>$upArr['up_pay_type']
				];
				$this->Set('yp_user_pay', $setArr, sprintf(" and up_id=%d", $upId));
				$this->YpwDb->End();
			}
			else if(!empty($upArr['up_por_id']))
			{
				$res = $MainOrder->getPayPage($upArr['up_por_id']);
				$arr = $res['data'];
			}
			
			return LibFc::ReturnData(true, $arr);
		}
		return LibFc::ReturnData(false, 'rechargeIntegral提供的参数不正确！');
	}



	/**
	  * @method 检查积分充值是否完成
	  * @param  $upId 订单ID
	  * @author soul
	  * @copyright 2016/3/30
	  * @return 
			成功：['status'=>true, 'data'=>-1已关闭 0 待支付 2支付并且已兑换积分]
			失败：['status'=>false, 'data'=>'错误原因']
	  */
	public function checkRechargeIntegral($upId)
	{
		$upId = (int) $upId;
		if($upId > 0)
		{
			$res = $this->Get('yp_user_pay', ['*'], sprintf(" and up_id=%d", $upId), true);
			if(empty($res['data'])) return LibFc::ReturnData(false, '充值订单不存在！');
			$upArr = $res['data'];
			if($upArr['up_status'] > 0) return LibFc::ReturnData(true, $upArr['up_status']);
			$MainOrder = new MainOrder();
			if(!empty($upArr['up_por_id']))
			{
				$this->YpwDb->Begin(); 
				$res = $MainOrder->checkPay($upArr['up_por_id'], 'por_id');
				//支付完成
				if($res['data']['por_status'] == 1)
				{
					$tArr = [
						'uil_u_id'=>$upArr['up_u_id'],
						'uil_type'=>'pay',
						'uil_by'=>'系统',
						'uil_change'=>$upArr['up_integral'],
						'uil_des'=>'充值'.$upArr['up_money'].'元兑换'.$upArr['up_integral'].'积分'
					];
					$res = $this->changeIntegral($tArr);
					$setArr = [
						'up_uil_id' =>$res['data'],	
						'up_status' =>2,	
						'up_pay_time' =>time(),	
						'up_check_time' =>time()
					];
					$this->Set('yp_user_pay', $setArr, sprintf(" AND up_id=%d", $upId));
					$upArr['up_status'] = $setArr['up_status'];
				}
				$this->YpwDb->End();
			}
			return LibFc::ReturnData(true, $upArr['up_status']);
		}
		return LibFc::ReturnData(false, 'checkRechargeIntegral提供的参数不正确！');
	}


	/**
	  * @method 关闭积分充值
	  * @param  $upId 订单ID
	  * @author soul
	  * @copyright 2016/3/30
	  * @return 
			成功：['status'=>true, 'data'=>true]
			失败：['status'=>false, 'data'=>'错误原因']
	  */
	public function closeRechargeIntegral($upId)
	{
		$upId = (int) $upId;
		if($upId > 0)
		{
			$res = $this->Get('yp_user_pay', ['*'], sprintf(" and up_id=%d", $upId), true);
			if(empty($res['data'])) return LibFc::ReturnData(false, '充值订单不存在！');
			$upArr = $res['data'];
			if($upArr['up_status'] > 0) return LibFc::ReturnData(false, '积分已完成兑换，禁止关闭！');
			if($upArr['up_status'] == -1) return LibFc::ReturnData(true, true);
		
			$this->YpwDb->Begin(); 
			if(!empty($upArr['up_por_id']))
			{
				$MainOrder = new MainOrder();
				$MainOrder->closePay($upArr['up_por_id']);
			}
			$setArr = ['up_status' =>-1];
			$this->Set('yp_user_pay', $setArr, sprintf(" AND up_id=%d", $upId));
			$this->YpwDb->End();
			return LibFc::ReturnData(true, true);
		}
		return LibFc::ReturnData(false, 'closeRechargeIntegral提供的参数不正确！');
	}
	


	/**
	  * @method 用户积分变动
	  * @param  $dataArr [
		'uil_u_id'=>1,
		'uil_change'=>-5, 
		'uil_des'=>'插入数据：....'
		]
	  * @author soul
	  * @copyright 2016/3/30
	  * @return 
			成功：['status'=>true, 'data'=>$uil_id]
			失败：['status'=>false, 'data'=>'错误原因']
	  */
	public function changeIntegral($dataArr)
	{
		$dataArr['uil_u_id'] = (int) $dataArr['uil_u_id'];
		$dataArr['uil_change'] = (int) $dataArr['uil_change'];
		if($dataArr['uil_u_id'] > 0 && $dataArr['uil_change'] != 0 && !empty($dataArr['uil_des']))
		{
			$res = $this->Get('yp_user', ['u_integral'], sprintf(" AND u_id=%d", $dataArr['uil_u_id']), true);
			if(!empty($res['data'])) 
			{
				$UserData = $res['data'];
				$this->YpwDb->Begin();
				if($dataArr['uil_change'] < 0 && ($UserData['u_integral']+$dataArr['uil_change']) < 0)
				{
					return LibFc::ReturnData(false, '积分余额不足，请先充值！', 'noIntegral');
				}
				else
				{
					$UserData['u_integral'] += $dataArr['uil_change'];
					$this->Set('yp_user', ['u_integral'=>$UserData['u_integral']], sprintf(" AND u_id=%d", $dataArr['uil_u_id']));
					$dataArr['uil_has'] = $UserData['u_integral'];
					$dataArr['uil_time'] = time();
					$res = $this->Add('yp_user_integral_list', $dataArr);
					$uilId = $res['data'];
					$this->Add('yp_user_integral_list_all', $dataArr);
				}
				$this->YpwDb->End();
				return LibFc::ReturnData(true, $uilId);
			}
		}
		return LibFc::ReturnData(false, 'changeIntegral提供的参数不正确！');
	}



	/**
	  * @method 绑定用户提现账号
	  * @param  $dataArr [
			'uac_u_id'=>1,
			'uac_type'=>0微信 1支付宝, 2银行卡 
			'uac_name'=>'收款姓名',
			'mobile_code'=>'手机验证码',  style:baccount
			'uac_alipay'=>'邮箱或者手机号码', 支付宝
			'uac_weixin'=>'{openid:   unionid:.... }'  微信
			'uac_from'=>来源,
			
			'uac_bank_card'=>卡号,
			'uac_bank_name'=>银行名称,
			'uac_bank_open'=>开户行,
		]
	  * @author soul
	  * @copyright 2016/3/30
	  * @return 
			成功：['status'=>true, 'data'=>uac_id]
			失败：['status'=>false, 'data'=>'错误原因']
	  */
	public function bindMoneyAccount($dataArr)
	{
		$dataArr['uac_u_id'] = (int) $dataArr['uac_u_id'];
		$dataArr['uac_type'] = (int) $dataArr['uac_type'];
		if($dataArr['uac_u_id'] > 0 && !empty($dataArr['uac_name']) && in_array($dataArr['uac_type'], [0,1,2]) && !empty($dataArr['mobile_code']))
		{
			$res = $this->Get('yp_user', ['u_mobile'], sprintf(" AND u_id=%d", $dataArr['uac_u_id']), true);
			if(empty($res['data']))  return LibFc::ReturnData(false, '会员账号不存在！');
			$userArr = $res['data'];
			
			$SendSms = new SendSms();
			$smsArr = [
				'mobile'=>$userArr['u_mobile'],
				'style'=>'baccount',
				'from'=>$dataArr['uac_from'],
				'code'=>$dataArr['mobile_code']
			];
			$SendSms->checkMobileCode($smsArr, true);

			$this->YpwDb->Begin();
			switch($dataArr['uac_type'])
			{
				case 0:
					$temp = json_decode($dataArr['uac_weixin'], true);
					if(empty($temp['openid']) || empty($temp['unionid']))
						return LibFc::ReturnData(false, '获取微信账号信息失败！');
					$dataArr['uac_weixin_oppenid'] = $temp['openid'];
					$this->Del('yp_user_account', sprintf(" and uac_u_id=%d and uac_weixin_oppenid='%s'", $dataArr['uac_u_id'], LibFc::Escape($dataArr['uac_weixin_oppenid'])));
				break;
				case 1:
					if(!preg_match('/^1\d{10}$/', $dataArr['uac_alipay']) && !filter_var($dataArr['uac_alipay'], FILTER_VALIDATE_EMAIL))
						return LibFc::ReturnData(false, '支付宝账号不存在！');
					$this->Del('yp_user_account', sprintf(" and uac_u_id=%d and uac_alipay='%s'", $dataArr['uac_u_id'], LibFc::Escape($dataArr['uac_alipay'])));
				break;
				case 2:
					if(empty($dataArr['uac_bank_name']) || empty($dataArr['uac_bank_open']))
					return LibFc::ReturnData(false, '开户银行名称、所属开户支行必填！');

					if(!preg_match('/^\d{10,30}$/', $dataArr['uac_bank_card']))
						return LibFc::ReturnData(false, '提供的银行卡卡号格式不正确！');
					$this->Del('yp_user_account', sprintf(" and uac_u_id=%d and uac_bank_card='%s'", $dataArr['uac_u_id'], LibFc::Escape($dataArr['uac_bank_card'])));
				break;
			}
			unset($dataArr['uac_id']);
			unset($dataArr['mobile_code']);
			$dataArr['uac_atime'] = time();
			$res = $this->Add('yp_user_account', $dataArr);
			$SendSms->outMobileCode($smsArr);
			$this->YpwDb->End();
			return $res;
		}
		return LibFc::ReturnData(false, 'bindAccount提供的参数不正确！');
	}


	/**
	  * @method 解绑用户提现账号
	  * @param  $dataArr [
			'uac_id'=>1,
			'mobile_code'=>'手机验证码',  style:ubaccount
			'uac_from'=>来源
		]
	  * @author soul
	  * @copyright 2016/3/30
	  * @return 
			成功：['status'=>true, 'data'=>true]
			失败：['status'=>false, 'data'=>'错误原因']
	  */
	public function unbindMoneyAccount($dataArr)
	{
		$dataArr['uac_id'] = (int) $dataArr['uac_id'];
		if($dataArr['uac_id'] > 0 && !empty($dataArr['uac_from']) && !empty($dataArr['mobile_code']))
		{
			$res = $this->Get('yp_user_account join yp_user on uac_u_id = u_id', ['u_mobile'], sprintf(" AND uac_id=%d", $dataArr['uac_id']), true);
			if(empty($res['data']))  return LibFc::ReturnData(false, '提现账号记录不存在！');
			$userArr = $res['data'];
			
			$SendSms = new SendSms();
			$smsArr = [
				'mobile'=>$userArr['u_mobile'],
				'style'=>'ubaccount',
				'from'=>$dataArr['uac_from'],
				'code'=>$dataArr['mobile_code']
			];
			$SendSms->checkMobileCode($smsArr, true);
			$this->YpwDb->Begin();
			$res = $this->Del('yp_user_account', sprintf(" AND uac_id=%d", $dataArr['uac_id']));
			$SendSms->outMobileCode($smsArr);
			$this->YpwDb->End();
			return $res;
		}
		return LibFc::ReturnData(false, 'unbindAccount提供的参数不正确！');
	}
	

	//初始化头像链接
	public function initUserLogo($dataArr, $oneRow = false)
	{
		if(!empty($dataArr))
		{
			if($oneRow)
			{
				if(array_key_exists('u_logo', $dataArr))
				{
					$dataArr['u_logo'] = !empty($dataArr['u_logo']) ? mvc::$cfg['FILE_CENTER']['yp']['url_get'].'&c=yp_logo&f='.$dataArr['u_logo'].mvc::$cfg['FILE_CENTER']['yp']['get_uri'] : mvc::$cfg['urls']['b2c'].'static/images/userlogo.jpg?v=3';
				}
				
			}
			else
			{
				foreach($dataArr as $k=>$v)
				{
					if(array_key_exists('u_logo', $v))
						$dataArr[$k]['u_logo'] = !empty($v['u_logo']) ? mvc::$cfg['FILE_CENTER']['yp']['url_get'].'&c=yp_logo&f='.$v['u_logo'].mvc::$cfg['FILE_CENTER']['yp']['get_uri'] : mvc::$cfg['urls']['b2c'].'static/images/userlogo.jpg?v=3';
				}
			}
		}
		return LibFc::ReturnData(true, $dataArr);
	}




	/**
	  * @method 获取省市区名称
	  * @param  $ids 省市镇区id yp_province_city逗号分隔
	  * @author 卢
	  * @copyright 2017.6.10
	  * @return  array(3){[0]=>'广东省',[1]=>'广州市',[3]=>'白云区'}
	  */
	 function getAddrByIds($ids)
	 {
		 $IdArr = [];
		 foreach(explode(',', $ids) as $V)
		 {
			if(LibFc::Int($V) && $V > 0)
			{
				$IdArr[$V] = '';
			}
		 }
		 $ids=implode(',',array_filter(explode(',', $ids)));
	 	if(count( $IdArr) > 0)
	 	{
		 	$data=array();
		 	$result=$this-> get('yp_province_city',['pc_id','pc_name'], sprintf(' and pc_id in(%s)',$ids));
		 	foreach($result['data'] as $k => $v)
		 	{
		 		$IdArr[$v['pc_id']]=$v['pc_name'];
		 	}
	 	}
		return LibFc::ReturnData(true, $IdArr);
	 }

	/**
	  * @method 检测支付密码是否正确
	  * @param  $uid  用户ID [必填]
	  * @param  $password 密码 [必填]
	  * @author soul
	  * @copyright 2018/8/25
	  * @return 
			成功：['status'=>true, 'data'=>true|false]
			失败：['status'=>false, 'data'=>'错误原因']
	  */
	public function checkPayPassword($uid, $password)
	{
		$uid = (int) $uid;
		$password = trim($password);
		$pass = false;
		if($uid > 1 && !empty($password))
		{
			$res = $this->Get('yp_user', ['u_pay_password'], sprintf(" and u_id=%d", $uid), true);
			if(md5('Y'.md5($password).'P') == $res['data']['u_pay_password'])
			{
				$pass = true;
			}
		}
		return LibFc::ReturnData(true, $pass);
	}

	/**
	 * @method 注销当前账号
	 * @http  get
	 * @param  $uid    int [必填] 账号ID
	 * @param $mobile_code   string [选填] 手机验证码
	 * @param $from   string [必填] 手机验证码的来源
	 * @author soul 2022/7/19
	 * @return {"status":true,"data": ['iscancel'=>1|0, 'msg'=>'iscancel=0时无法注销的原因'],"code":0}
	 */
	public function cancelAccount($uid, $mobile_code, $from)
	{
		//暂时不做任何检测，直接修改状态
		if(!empty($uid) && !empty($mobile_code))
		{
			$res = $this->Get('yp_user', ['u_id', 'u_mobile', 'u_name', 'u_nickname'], sprintf(" AND u_id = %d and u_status = 1 and u_mobile_check = 'Y'", $uid), true);
			if(!empty($res['data']['u_mobile']))
			{
				$oldArr = $res['data'];
				$SendSms = new SendSms();
				$tArr = [
					'mobile'=>$res['data']['u_mobile'],
					'style'=>'delaccount',
					'from'=>$from,
					'code'=>$mobile_code
				];
				$this->YpwDb->Begin();
				$SendSms->checkMobileCode($tArr);
				$this->Set('yp_user', ['u_password'=>'', 'u_mobile'=>'_'.$oldArr['u_mobile'],'u_status'=>-3, 'u_status_remark'=>'自助申请注销'.date('Y-m-d H:i:s')], sprintf(" AND u_id = %d", $oldArr['u_id']));
				$SendSms->outMobileCode($tArr);
				$this->YpwDb->End();
				return LibFc::ReturnData(true, ['iscancel'=>1, 'msg'=>'']);
			}
			return LibFc::ReturnData(true, ['iscancel'=>0, 'msg'=>'手机号码不存在']);
		}
		return LibFc::ReturnData(false, '无法获取账号信息');
	}
}