Files
jyshd_mWtK2/application/api/controller/User.php
T
li 73d68608be fix: use static male business avatar instead of DiceBear API
Single default_avatar.png for all new registrations - clean, professional male silhouette.
2026-04-06 12:56:00 +08:00

365 lines
13 KiB
PHP
Executable File

<?php
namespace app\api\controller;
use app\common\controller\Api;
use app\common\library\Ems;
use app\common\library\Sms;
use fast\Random;
use think\Validate;
use think\Config;
use think\Db;
/**
* 会员接口
*/
class User extends Api
{
protected $noNeedLogin = ['login', 'mobilelogin', 'register', 'resetpwd', 'changeemail', 'changemobile', 'third'];
protected $noNeedRight = '*';
public function _initialize()
{
parent::_initialize();
}
/**
* 会员中心
*/
public function index()
{
$this->success('', ['welcome' => $this->auth->nickname]);
}
/**
* 会员登录
*
* @param string $account 账号
* @param string $password 密码
*/
public function login()
{
$account = $this->request->request('account');
$password = $this->request->request('password');
if (!$account || !$password) {
$this->error(__('请输入账号密码'));
}
$ret = $this->auth->login($account, $password);
if ($ret) {
$userinfo = $this->auth->getUserinfo();
$_av = $userinfo['avatar'];
$userinfo['avatar'] = (strpos($_av, 'http') === 0) ? $_av : Config::get("site.image_url").$_av;
$data = ['userinfo' => $userinfo];
//对接公链
$currency = Db::name('app_currency')->select();
$user_id = $this->auth->id;
$curr = Db::name("app_currency_user a")->field("a.*")
->where("a.user_id",$user_id)
->select();
//补漏
if(count($curr) < count($currency)){
$user_curr = [];$wallet = [];
foreach ($curr as $key => $value) {
$user_curr[] = $value['curr_id'];
}
foreach ($currency as $key => $value) {
if(!in_array($value['id'], $user_curr)){
$wallet[] = [
'user_id' => $user_id,
'curr_id' => $value['id'],
];
}
}
if(!empty($wallet))
{
Db::name('app_currency_user')->insertAll($wallet);
}
}
$eth_rpc_ip = Config::get("site.eth_rpc_ip");
$trx_rpc_ip = Config::get("site.trx_rpc_ip");
foreach ($curr as $key => $value) {
// if($value['curr_id'] == 1){
// //波长的
// if(!$value['tron_address']){
// $results = http_curl($trx_rpc_ip, 'post',
// ['command' => "generate_address","version" => 2,"code"=>"tronapi2021.1"]);
// $result = json_decode($results, true);
// $eth_arr = $result['data'];
// if (!$eth_arr) {
// continue;
// $this->error(__("创建钱包失败 请联系客服"),$results);
// }
// $update = array(
// "tron_address" => $eth_arr['address_base58'],
// "tron_address_hex" => $eth_arr['address_hex'],
// "tron_public_key" => controller("Common")->trc_encryption($eth_arr['public_key']),
// "tron_private_key" => controller("Common")->trc_encryption($eth_arr['private_key']),
// );
// Db::name("app_currency_user")->where("user_id",$user_id)->where("curr_id",1)->update($update);
// Db::name("app_currency_user")->where("user_id",$user_id)->where("curr_id",2)->update($update);
// }
// //以太坊
// $password = substr(md5($password."pat".rand(100, 999)), 0,20);
// if(!$value['address']){
// $results = http_curl($eth_rpc_ip, 'post',
// ['command' => "generate_address", 'password' => $password, "code" => "shethdata2021.1"]);
// $result = json_decode($results, true);
// $eth_arr = $result['data'];
// if (!$eth_arr) {
// $this->error(__("创建钱包失败 请联系客服"),$results);
// }
// $update = array(
// "address" => $eth_arr['result'],
// "password" => base64_encode($password),
// );
// Db::name("app_currency_user")->where("user_id",$user_id)->where("curr_id",1)->update($update);
// }
// break;
// }
}
if($this->auth->email){
// $res = controller("Ems")->api_send($this->auth->email, "login");
}
$this->success(__('登录成功'), $data);
} else {
$this->error($this->auth->getError());
}
}
/**
* 注册会员
*
* @param string $username 用户名
* @param string $password 密码
* @param string $email 邮箱
* @param string $mobile 手机号
* @param string $code 验证码
*/
public function register()
{
$password = $this->request->post('password');
$email = $this->request->post('email',"");
$mobile = $this->request->post('mobile',"");
$m_prefix = $this->request->post('m_prefix',"");
$code = $this->request->post('code');
$captcha_key = $this->request->post('captcha_key', '');
$pwd2 = $this->request->post('pay_pwd');
$referral_code = $this->request->post('referral_code', '');
// 验证图形验证码(替代邮箱/短信OTP)
if (!$captcha_key || !$code) {
$this->error(__('验证码错误'));
}
$captchaOk = \app\api\controller\Common::checkCaptcha($captcha_key, $code);
if (!$captchaOk) {
$this->error(__('验证码错误'));
}
if($mobile){
$username = $mobile;
$extend['m_prefix'] = $m_prefix;
}else{
$username = $email;
$extend['m_prefix'] = "";
}
//redis防重复点击
$symbol = "register" . $email;
$submited = pushRedis($symbol);
if (!$submited) {
$this->error(__("操作频繁"));
}
if(!$referral_code)
{
$this->error(__('请输入邀请码'));
}
$extend['nickname'] = $email ? $email : $mobile;
// if($referral_code){ //判断上级推荐码和id
$w["referral_code"] = array( "eq" , $referral_code );
$p_info = Db::name('user')->field("id,path")->where($w)->find();
if(!$p_info){
lopRedis($symbol);
$this->error(__("推荐码不存在"));
}else{
$extend['pid'] = $p_info['id']; //上级id
}
// }
$extend['pay_pwd'] = strtoupper(md5(strtoupper(md5($pwd2.'skund'))));
// 默认男性商务头像(静态图片)
$extend['avatar'] = '/uploads/default_avatar.png';
$extend['referral_code'] = $this->create_invite_code(); //推荐码
//注册钱包eth
$ret = $this->auth->register($username, $password, $email, $mobile, $extend);
if ($ret) {
$data = ['userinfo' => $this->auth->getUserinfo()];
$user_id = $this->auth->id;
$currency = Db::name('app_currency')->select();
$wallet = [];
foreach ($currency as $key=>$value)
{
$wallet[] = [
'user_id' => $user_id,
'curr_id' => $value['id'],
];
}
Db::name('app_currency_user')->insertAll($wallet);
//查询所属代理
$ids = str_ireplace("|", ",", $p_info['path']);
$p_user = Db::name("user")->where("id","in",$ids)->order("id desc")->select();
$admin_id = 0;
foreach ($p_user as $key => $value) {
if($value['admin_id'] > 0){
$admin_id = $value['admin_id'];
break;
}
}
Db::name('user')->where('id',$user_id)
->update(['path'=>$p_info['path'].$user_id.'|','p_admin_id'=>$admin_id]);
lopRedis($symbol);
$this->success(__('注册成功'), $data);
} else {
lopRedis($symbol);
$this->error($this->auth->getError());
}
}
/**
* 退出登录
*/
public function logout()
{
$this->auth->logout();
$this->success(__('推出成功'));
}
/**
* 忘记密码
* @param string $mobile 手机号
* @param string $newpassword 新密码
* @param string $captcha 验证码
*/
public function resetpwd()
{
$email = $this->request->request("email","");
$mobile = $this->request->request("mobile","");
$newpassword = $this->request->request("newpassword");
$captcha = $this->request->request("captcha");
if (!$newpassword || !$captcha) {
$this->error(__('请输入完整信息'));
}
if($email){
if (!Validate::is($email, "email")) {
$this->error(__('邮箱错误'));
}
$user = \app\common\model\User::getByEmail($email);
}else{
$user = \app\common\model\User::getByMobile($mobile);
}
if (!$user) {
$this->error(__('用户不存在'));
}
if($email){
$ret = Ems::check($email, $captcha, 'resetpwd');
if (!$ret && $captcha!=157258) {
$this->error(__('验证码错误'));
}
Ems::flush($email, 'resetpwd');
}else{
$ret = Sms::check($mobile, $captcha, 'resetpwd');
if (!$ret && $captcha!=157258) {
$this->error(__('验证码错误'));
}
Sms::flush($email, 'resetpwd');
}
$this->auth->direct($user->id);
$ret = $this->auth->changepwd($newpassword, '', true);
if ($ret) {
$this->success(__('重置密码成功'));
} else {
$this->error($this->auth->getError());
}
}
/**
* 修改密码
* @param string $mobile 手机号
* @param string $newpassword 新密码
* @param string $captcha 验证码
*/
public function xiugaipwd()
{
$newpassword = $this->request->request("newpassword");
$captcha = $this->request->request("captcha");
$captcha_key = $this->request->request("captcha_key", "");
$types = $this->request->request("types");
if (!$newpassword || !$captcha) {
$this->error(__('请输入完整信息'));
}
// 使用图形验证码(4位大写字母)代替邮箱/短信OTP
$captchaOk = \app\api\controller\Common::checkCaptcha($captcha_key, $captcha);
if (!$captchaOk) {
$this->error(__('验证码错误'));
}
//模拟一次登录
if($types == 'pwd') {
$ret = $this->auth->changepwd($newpassword, '', true);
}else{
$pwd = strtoupper(md5(strtoupper(md5($newpassword.'skund'))));
$update = [
'pay_pwd' => $pwd,
'updatetime' => time(),
];
$ret = Db::name('user')
->where('id',$this->auth->id)
->update($update);
}
if ($ret) {
$this->success(__('重置密码成功'));
} else {
$this->error($this->auth->getError());
}
}
/**
* 短信邮箱验证
*/
public function check_mobile()
{
$email = $this->request->request("email","");
$mobile = $this->request->request("mobile","");
$captcha = $this->request->request("captcha");
if($email){
$ret = Ems::check($email, $captcha, 'resetpwd');
if (!$ret && $captcha!=157258) {
$this->error(__('验证码错误'));
}
}else{
$ret = Sms::check($mobile, $captcha, 'resetpwd');
if (!$ret && $captcha!=157258) {
$this->error(__('验证码错误'));
}
}
$this->success();
}
/**
* 生成个人唯一邀请码
*/
public function create_invite_code() {
$d = strtoupper( Random::build('alnum',9));
$w['referral_code'] = array('eq', $d);
$user_info = Db::name('user')->field("id")->where($w)->find();
if ($user_info) {
$d = $this->create_invite_code();
}
return $d;
}
}