<?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;
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]);
}
public function login()
{
$account = $this->request->request('account');
$password = $this->request->request('password');
if (!$account || !$password)
{
$this->error(__('Invalid parameters'));
}
$ret = $this->auth->login($account, $password);
if ($ret)
{
$data = ['userinfo' => $this->auth->getUserinfo()];
$this->success(__('Logged in successful'), $data);
}
else
{
$this->error($this->auth->getError());
}
}
public function mobilelogin()
{
$mobile = $this->request->request('mobile');
$captcha = $this->request->request('captcha');
if (!$mobile || !$captcha)
{
$this->error(__('Invalid parameters'));
}
if (!Validate::regex($mobile, "^1\d{10}$"))
{
$this->error(__('Mobile is incorrect'));
}
if (!Sms::check($mobile, $captcha, 'mobilelogin'))
{
$this->error(__('Captcha is incorrect'));
}
$user = \app\common\model\User::getByMobile($mobile);
if ($user)
{
$ret = $this->auth->direct($user->id);
}
else
{
$ret = $this->auth->register($mobile, Random::alnum(), '', $mobile, []);
}
if ($ret)
{
Sms::flush($mobile, 'mobilelogin');
$data = ['userinfo' => $this->auth->getUserinfo()];
$this->success(__('Logged in successful'), $data);
}
else
{
$this->error($this->auth->getError());
}
}
public function register()
{
$username = $this->request->request('username');
$password = $this->request->request('password');
$email = $this->request->request('email');
$mobile = $this->request->request('mobile');
if (!$username || !$password)
{
$this->error(__('Invalid parameters'));
}
if ($email && !Validate::is($email, "email"))
{
$this->error(__('Email is incorrect'));
}
if ($mobile && !Validate::regex($mobile, "^1\d{10}$"))
{
$this->error(__('Mobile is incorrect'));
}
$ret = $this->auth->register($username, $password, $email, $mobile, []);
if ($ret)
{
$data = ['userinfo' => $this->auth->getUserinfo()];
$this->success(__('Sign up successful'), $data);
}
else
{
$this->error($this->auth->getError());
}
}
public function logout()
{
$this->auth->logout();
$this->success(__('Logout successful'));
}
public function profile()
{
$user = $this->auth->getUser();
$username = $this->request->request('username');
$nickname = $this->request->request('nickname');
$bio = $this->request->request('bio');
$avatar = $this->request->request('avatar');
$exists = \app\common\model\User::where('username', $username)->where('id', '<>', $this->auth->id)->find();
if ($exists)
{
$this->error(__('Username already exists'));
}
$user->username = $username;
$user->nickname = $nickname;
$user->bio = $bio;
$user->avatar = $avatar;
$user->save();
$this->success();
}
public function changeemail()
{
$user = $this->auth->getUser();
$email = $this->request->post('email');
$captcha = $this->request->request('captcha');
if (!$email || !$captcha)
{
$this->error(__('Invalid parameters'));
}
if (!Validate::is($email, "email"))
{
$this->error(__('Email is incorrect'));
}
if (\app\common\model\User::where('email', $email)->where('id', '<>', $user->id)->find())
{
$this->error(__('Email already exists'));
}
$result = Ems::check($email, $captcha, 'changeemail');
if (!$result)
{
$this->error(__('Captcha is incorrect'));
}
$verification = $user->verification;
$verification->email = 1;
$user->verification = $verification;
$user->email = $email;
$user->save();
Ems::flush($email, 'changeemail');
$this->success();
}
public function changemobile()
{
$user = $this->auth->getUser();
$mobile = $this->request->request('mobile');
$captcha = $this->request->request('captcha');
if (!$mobile || !$captcha)
{
$this->error(__('Invalid parameters'));
}
if (!Validate::regex($mobile, "^1\d{10}$"))
{
$this->error(__('Mobile is incorrect'));
}
if (\app\common\model\User::where('mobile', $mobile)->where('id', '<>', $user->id)->find())
{
$this->error(__('Mobile already exists'));
}
$result = Sms::check($mobile, $captcha, 'changemobile');
if (!$result)
{
$this->error(__('Captcha is incorrect'));
}
$verification = $user->verification;
$verification->mobile = 1;
$user->verification = $verification;
$user->mobile = $mobile;
$user->save();
Sms::flush($mobile, 'changemobile');
$this->success();
}
public function third()
{
$url = url('user/index');
$platform = $this->request->request("platform");
$code = $this->request->request("code");
$config = get_addon_config('third');
if (!$config || !isset($config[$platform]))
{
$this->error(__('Invalid parameters'));
}
$app = new \addons\third\library\Application($config);
$result = $app->{$platform}->getUserInfo(['code' => $code]);
if ($result)
{
$loginret = \addons\third\library\Service::connect($platform, $result);
if ($loginret)
{
$data = [
'userinfo' => $this->auth->getUserinfo(),
'thirdinfo' => $result
];
$this->success(__('Logged in successful'), $data);
}
}
$this->error(__('Operation failed'), $url);
}
public function resetpwd()
{
$type = $this->request->request("type");
$mobile = $this->request->request("mobile");
$email = $this->request->request("email");
$newpassword = $this->request->request("newpassword");
$captcha = $this->request->request("captcha");
if (!$newpassword || !$captcha)
{
$this->error(__('Invalid parameters'));
}
if ($type == 'mobile')
{
if (!Validate::regex($mobile, "^1\d{10}$"))
{
$this->error(__('Mobile is incorrect'));
}
$user = \app\common\model\User::getByMobile($mobile);
if (!$user)
{
$this->error(__('User not found'));
}
$ret = Sms::check($mobile, $captcha, 'resetpwd');
if (!$ret)
{
$this->error(__('Captcha is incorrect'));
}
Sms::flush($mobile, 'resetpwd');
}
else
{
if (!Validate::is($email, "email"))
{
$this->error(__('Email is incorrect'));
}
$user = \app\common\model\User::getByEmail($email);
if (!$user)
{
$this->error(__('User not found'));
}
$ret = Ems::check($email, $captcha, 'resetpwd');
if (!$ret)
{
$this->error(__('Captcha is incorrect'));
}
Ems::flush($email, 'resetpwd');
}
$this->auth->direct($user->id);
$ret = $this->auth->changepwd($newpassword, '', true);
if ($ret)
{
$this->success(__('Reset password successful'));
}
else
{
$this->error($this->auth->getError());
}
}
}