first commit
This commit is contained in:
507
app/api/logic/LoginLogic.php
Normal file
507
app/api/logic/LoginLogic.php
Normal file
@@ -0,0 +1,507 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | likeadmin快速开发前后端分离管理后台(PHP版)
|
||||
// +----------------------------------------------------------------------
|
||||
// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
|
||||
// | 开源版本可自由商用,可去除界面版权logo
|
||||
// | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
|
||||
// | github下载:https://github.com/likeshop-github/likeadmin
|
||||
// | 访问官网:https://www.likeadmin.cn
|
||||
// | likeadmin团队 版权所有 拥有最终解释权
|
||||
// +----------------------------------------------------------------------
|
||||
// | author: likeadminTeam
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
namespace app\api\logic;
|
||||
|
||||
use app\common\cache\WebScanLoginCache;
|
||||
use app\common\logic\BaseLogic;
|
||||
use app\api\service\{UserTokenService, WechatUserService};
|
||||
use app\common\enum\{LoginEnum, user\UserTerminalEnum, YesNoEnum};
|
||||
use app\common\service\{
|
||||
UtilsService,
|
||||
ConfigService,
|
||||
FileService,
|
||||
wechat\WeChatConfigService,
|
||||
wechat\WeChatMnpService,
|
||||
wechat\WeChatOaService,
|
||||
wechat\WeChatRequestService
|
||||
};
|
||||
use app\common\model\user\{User,UserInfo,UserAuth,UserNotice};
|
||||
use app\common\model\decorate\DecorateHint;
|
||||
use think\facade\{Db,Config};
|
||||
|
||||
/**
|
||||
* 登录逻辑
|
||||
* Class LoginLogic
|
||||
* @package app\api\logic
|
||||
*/
|
||||
class LoginLogic extends BaseLogic
|
||||
{
|
||||
|
||||
/**
|
||||
* @notes 账号密码注册
|
||||
* @param array $params
|
||||
* @return bool
|
||||
* @author 段誉
|
||||
* @date 2022/9/7 15:37
|
||||
*/
|
||||
public static function register(array $params)
|
||||
{
|
||||
Db::startTrans();
|
||||
try {
|
||||
//查询IP注册数量
|
||||
$config_ip_num = ConfigService::get('login', 'ip_num');
|
||||
$count_ip = User::where(['register_ip' => request()->ip()])->count();
|
||||
if ($config_ip_num <= $count_ip) {
|
||||
throw new \Exception('login.ipExisted');
|
||||
}
|
||||
|
||||
$regioncodes = ConfigService::get('website', 'regioncode');
|
||||
$country_code = $params['country_code'];
|
||||
|
||||
$found = array_filter($regioncodes, function($object) use ($country_code) {
|
||||
return strpos($object['code'], $country_code) !== false;
|
||||
});
|
||||
if ($found === false) {
|
||||
throw new \Exception('network.parameterAbnormality');
|
||||
}
|
||||
$userSn = User::createUserSn();
|
||||
$passwordSalt = Config::get('project.unique_identification');
|
||||
$password = create_password($params['password'], $passwordSalt);
|
||||
$password_pay_ = ConfigService::get('login', 'password_pay');
|
||||
$password_pay = create_password($password_pay_, $passwordSalt);
|
||||
$avatar = ConfigService::get('default_image', 'user_avatar');
|
||||
|
||||
|
||||
//判断上级
|
||||
//邀请码
|
||||
$top_sn = $params['invite_code'];
|
||||
|
||||
//判断邀请码是否填写
|
||||
$is_invite_code = ConfigService::get('login', 'invite_code');
|
||||
if($is_invite_code && $top_sn == '') throw new \Exception('login.inviteCodeEmpty');//请输入邀请码
|
||||
|
||||
$top_User = '';
|
||||
|
||||
if(isset($top_sn) && $top_sn != ''){
|
||||
if(!preg_match("/^-?\d+$/",$top_sn)) throw new \Exception('login.inviteCodeNoExist');//邀请码不存在
|
||||
|
||||
$top_User = User::where(['sn' => $top_sn,'is_sn' => 1])->findOrEmpty();
|
||||
if ($top_User->isEmpty()) {
|
||||
throw new \Exception('login.inviteCodeNoExist');//邀请码不存在
|
||||
}
|
||||
}
|
||||
|
||||
$mobile = $params['account'];
|
||||
if($params['login_way'] == 1){
|
||||
$mobile = $params['country_code'] . ' ' .$params['account'];
|
||||
}
|
||||
|
||||
$is_transfer = 0;
|
||||
$trade = ConfigService::get('website', 'trade');
|
||||
if($trade['is_transfer'] != 0) $is_transfer = 1;
|
||||
|
||||
$user = User::create([
|
||||
'sn' => $userSn,
|
||||
'avatar' => $avatar,
|
||||
'nickname' => '' . $userSn,
|
||||
'account' => $params['account'],
|
||||
'password' => $password,
|
||||
'password_pay' => $password_pay,
|
||||
'mobile' => $mobile,
|
||||
'country_code' => $params['country_code'],
|
||||
'channel' => $params['channel'],
|
||||
'is_transfer' => $is_transfer,
|
||||
'login_ip' => request()->ip(),
|
||||
'register_ip' => request()->ip(),
|
||||
'login_time' => time(),
|
||||
]);
|
||||
|
||||
//创建用户关系
|
||||
if ($top_User != "") {
|
||||
UtilsService::create_user_relation($user['id'],$top_User['id'],UtilsService::get_distribute_level());
|
||||
}
|
||||
|
||||
//创建系统消息记录
|
||||
UtilsService::create_user_notice($user['id']);
|
||||
|
||||
//创建初始会员等级
|
||||
UtilsService::set_user_member($user['id']);
|
||||
|
||||
//创建用户信息
|
||||
UserInfo::create(['user_id' => $user['id']]);
|
||||
|
||||
//设置token
|
||||
$userInfo = UserTokenService::setToken($user['id'], $params['channel']);
|
||||
Db::commit();
|
||||
|
||||
return [
|
||||
'token' => $userInfo['token'],
|
||||
];
|
||||
} catch (\Exception $e) {
|
||||
Db::rollback();
|
||||
self::setError($e->getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @notes 账号/手机号登录,手机号验证码
|
||||
* @param $params
|
||||
* @return array|false
|
||||
* @author 段誉
|
||||
* @date 2022/9/6 19:26
|
||||
*/
|
||||
public static function login($params)
|
||||
{
|
||||
try {
|
||||
|
||||
$user = User::where(['account' => $params['account']])->findOrEmpty();
|
||||
|
||||
//更新登录信息
|
||||
$user->login_time = time();
|
||||
$user->login_ip = request()->ip();
|
||||
$user->save();
|
||||
|
||||
//设置token
|
||||
$userInfo = UserTokenService::setToken($user->id, $params['terminal']);
|
||||
|
||||
//返回登录信息
|
||||
$avatar = $user->avatar ?: Config::get('project.default_image.user_avatar');
|
||||
$avatar = FileService::getFileUrl($avatar);
|
||||
|
||||
return [
|
||||
'nickname' => $userInfo['nickname'],
|
||||
'sn' => $userInfo['sn'],
|
||||
'mobile' => $userInfo['mobile'],
|
||||
'avatar' => $avatar,
|
||||
'token' => $userInfo['token'],
|
||||
];
|
||||
} catch (\Exception $e) {
|
||||
self::setError($e->getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @notes 退出登录
|
||||
* @param $userInfo
|
||||
* @return bool
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
* @author 段誉
|
||||
* @date 2022/9/16 17:56
|
||||
*/
|
||||
public static function logout($userInfo)
|
||||
{
|
||||
//token不存在,不注销
|
||||
if (!isset($userInfo['token'])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//设置token过期
|
||||
return UserTokenService::expireToken($userInfo['token']);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @notes 更新用户信息
|
||||
* @param $params
|
||||
* @param $userId
|
||||
* @return User
|
||||
* @author 段誉
|
||||
* @date 2023/2/22 11:19
|
||||
*/
|
||||
public static function updateUser($params, $userId)
|
||||
{
|
||||
return User::where(['id' => $userId])->update([
|
||||
'nickname' => $params['nickname'],
|
||||
'avatar' => FileService::setFileUrl($params['avatar']),
|
||||
'is_new_user' => YesNoEnum::NO
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @notes 更新登录信息
|
||||
* @param $userId
|
||||
* @throws \Exception
|
||||
* @author 段誉
|
||||
* @date 2022/9/20 19:46
|
||||
*/
|
||||
public static function updateLoginInfo($userId)
|
||||
{
|
||||
$user = User::findOrEmpty($userId);
|
||||
if ($user->isEmpty()) {
|
||||
throw new \Exception('network.parameterAbnormality');
|
||||
}
|
||||
|
||||
$time = time();
|
||||
$user->login_time = $time;
|
||||
$user->login_ip = request()->ip();
|
||||
$user->update_time = $time;
|
||||
$user->save();
|
||||
}
|
||||
|
||||
// /**
|
||||
// * @notes 获取微信请求code的链接
|
||||
// * @param string $url
|
||||
// * @return string
|
||||
// * @author 段誉
|
||||
// * @date 2022/9/20 19:47
|
||||
// */
|
||||
// public static function codeUrl(string $url)
|
||||
// {
|
||||
// return (new WeChatOaService())->getCodeUrl($url);
|
||||
// }
|
||||
|
||||
|
||||
// /**
|
||||
// * @notes 公众号登录
|
||||
// * @param array $params
|
||||
// * @return array|false
|
||||
// * @throws \GuzzleHttp\Exception\GuzzleException
|
||||
// * @author 段誉
|
||||
// * @date 2022/9/20 19:47
|
||||
// */
|
||||
// public static function oaLogin(array $params)
|
||||
// {
|
||||
// Db::startTrans();
|
||||
// try {
|
||||
// //通过code获取微信 openid
|
||||
// $response = (new WeChatOaService())->getOaResByCode($params['code']);
|
||||
// $userServer = new WechatUserService($response, UserTerminalEnum::WECHAT_OA);
|
||||
// $userInfo = $userServer->getResopnseByUserInfo()->authUserLogin()->getUserInfo();
|
||||
|
||||
// // 更新登录信息
|
||||
// self::updateLoginInfo($userInfo['id']);
|
||||
|
||||
// Db::commit();
|
||||
// return $userInfo;
|
||||
|
||||
// } catch (\Exception $e) {
|
||||
// Db::rollback();
|
||||
// self::$error = $e->getMessage();
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
// /**
|
||||
// * @notes 小程序-静默登录
|
||||
// * @param array $params
|
||||
// * @return array|false
|
||||
// * @author 段誉
|
||||
// * @date 2022/9/20 19:47
|
||||
// */
|
||||
// public static function silentLogin(array $params)
|
||||
// {
|
||||
// try {
|
||||
// //通过code获取微信 openid
|
||||
// $response = (new WeChatMnpService())->getMnpResByCode($params['code']);
|
||||
// $userServer = new WechatUserService($response, UserTerminalEnum::WECHAT_MMP);
|
||||
// $userInfo = $userServer->getResopnseByUserInfo('silent')->getUserInfo();
|
||||
|
||||
// if (!empty($userInfo)) {
|
||||
// // 更新登录信息
|
||||
// self::updateLoginInfo($userInfo['id']);
|
||||
// }
|
||||
|
||||
// return $userInfo;
|
||||
// } catch (\Exception $e) {
|
||||
// self::$error = $e->getMessage();
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
// /**
|
||||
// * @notes 小程序-授权登录
|
||||
// * @param array $params
|
||||
// * @return array|false
|
||||
// * @author 段誉
|
||||
// * @date 2022/9/20 19:47
|
||||
// */
|
||||
// public static function mnpLogin(array $params)
|
||||
// {
|
||||
// Db::startTrans();
|
||||
// try {
|
||||
// //通过code获取微信 openid
|
||||
// $response = (new WeChatMnpService())->getMnpResByCode($params['code']);
|
||||
// $userServer = new WechatUserService($response, UserTerminalEnum::WECHAT_MMP);
|
||||
// $userInfo = $userServer->getResopnseByUserInfo()->authUserLogin()->getUserInfo();
|
||||
|
||||
// // 更新登录信息
|
||||
// self::updateLoginInfo($userInfo['id']);
|
||||
|
||||
// Db::commit();
|
||||
// return $userInfo;
|
||||
// } catch (\Exception $e) {
|
||||
// Db::rollback();
|
||||
// self::$error = $e->getMessage();
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// /**
|
||||
// * @notes 小程序端绑定微信
|
||||
// * @param array $params
|
||||
// * @return bool
|
||||
// * @author 段誉
|
||||
// * @date 2022/9/20 19:46
|
||||
// */
|
||||
// public static function mnpAuthLogin(array $params)
|
||||
// {
|
||||
// try {
|
||||
// //通过code获取微信openid
|
||||
// $response = (new WeChatMnpService())->getMnpResByCode($params['code']);
|
||||
// $response['user_id'] = $params['user_id'];
|
||||
// $response['terminal'] = UserTerminalEnum::WECHAT_MMP;
|
||||
|
||||
// return self::createAuth($response);
|
||||
|
||||
// } catch (\Exception $e) {
|
||||
// self::$error = $e->getMessage();
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
// /**
|
||||
// * @notes 公众号端绑定微信
|
||||
// * @param array $params
|
||||
// * @return bool
|
||||
// * @throws \GuzzleHttp\Exception\GuzzleException
|
||||
// * @author 段誉
|
||||
// * @date 2022/9/16 10:43
|
||||
// */
|
||||
// public static function oaAuthLogin(array $params)
|
||||
// {
|
||||
// try {
|
||||
// //通过code获取微信openid
|
||||
// $response = (new WeChatOaService())->getOaResByCode($params['code']);
|
||||
// $response['user_id'] = $params['user_id'];
|
||||
// $response['terminal'] = UserTerminalEnum::WECHAT_OA;
|
||||
|
||||
// return self::createAuth($response);
|
||||
|
||||
// } catch (\Exception $e) {
|
||||
// self::$error = $e->getMessage();
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
// /**
|
||||
// * @notes 生成授权记录
|
||||
// * @param $response
|
||||
// * @return bool
|
||||
// * @throws \Exception
|
||||
// * @author 段誉
|
||||
// * @date 2022/9/16 10:43
|
||||
// */
|
||||
// public static function createAuth($response)
|
||||
// {
|
||||
// //先检查openid是否有记录
|
||||
// $isAuth = UserAuth::where('openid', '=', $response['openid'])->findOrEmpty();
|
||||
// if (!$isAuth->isEmpty()) {
|
||||
// throw new \Exception('该微信已被绑定');
|
||||
// }
|
||||
|
||||
// if (isset($response['unionid']) && !empty($response['unionid'])) {
|
||||
// //在用unionid找记录,防止生成两个账号,同个unionid的问题
|
||||
// $userAuth = UserAuth::where(['unionid' => $response['unionid']])
|
||||
// ->findOrEmpty();
|
||||
// if (!$userAuth->isEmpty() && $userAuth->user_id != $response['user_id']) {
|
||||
// throw new \Exception('该微信已被绑定');
|
||||
// }
|
||||
// }
|
||||
|
||||
// //如果没有授权,直接生成一条微信授权记录
|
||||
// UserAuth::create([
|
||||
// 'user_id' => $response['user_id'],
|
||||
// 'openid' => $response['openid'],
|
||||
// 'unionid' => $response['unionid'] ?? '',
|
||||
// 'terminal' => $response['terminal'],
|
||||
// ]);
|
||||
// return true;
|
||||
// }
|
||||
|
||||
|
||||
// /**
|
||||
// * @notes 获取扫码登录地址
|
||||
// * @return array|false
|
||||
// * @author 段誉
|
||||
// * @date 2022/10/20 18:23
|
||||
// */
|
||||
// public static function getScanCode($redirectUri)
|
||||
// {
|
||||
// try {
|
||||
// $config = WeChatConfigService::getOpConfig();
|
||||
// $appId = $config['app_id'];
|
||||
// $redirectUri = UrlEncode($redirectUri);
|
||||
|
||||
// // 设置有效时间标记状态, 超时扫码不可登录
|
||||
// $state = MD5(time().rand(10000, 99999));
|
||||
// (new WebScanLoginCache())->setScanLoginState($state);
|
||||
|
||||
// // 扫码地址
|
||||
// $url = WeChatRequestService::getScanCodeUrl($appId, $redirectUri, $state);
|
||||
// return ['url' => $url];
|
||||
|
||||
// } catch (\Exception $e) {
|
||||
// self::$error = $e->getMessage();
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
// /**
|
||||
// * @notes 网站扫码登录
|
||||
// * @param $params
|
||||
// * @return array|false
|
||||
// * @author 段誉
|
||||
// * @date 2022/10/21 10:28
|
||||
// */
|
||||
// public static function scanLogin($params)
|
||||
// {
|
||||
// Db::startTrans();
|
||||
// try {
|
||||
// // 通过code 获取 access_token,openid,unionid等信息
|
||||
// $userAuth = WeChatRequestService::getUserAuthByCode($params['code']);
|
||||
|
||||
// if (empty($userAuth['openid']) || empty($userAuth['access_token'])) {
|
||||
// throw new \Exception('获取用户授权信息失败');
|
||||
// }
|
||||
|
||||
// // 获取微信用户信息
|
||||
// $response = WeChatRequestService::getUserInfoByAuth($userAuth['access_token'], $userAuth['openid']);
|
||||
|
||||
// // 生成用户或更新用户信息
|
||||
// $userServer = new WechatUserService($response, UserTerminalEnum::PC);
|
||||
// $userInfo = $userServer->getResopnseByUserInfo()->authUserLogin()->getUserInfo();
|
||||
|
||||
// // 更新登录信息
|
||||
// self::updateLoginInfo($userInfo['id']);
|
||||
|
||||
// Db::commit();
|
||||
// return $userInfo;
|
||||
|
||||
// } catch (\Exception $e) {
|
||||
// Db::rollback();
|
||||
// self::$error = $e->getMessage();
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user