Files
midi-php/application/api/model/Login.php
2025-09-23 19:03:05 +08:00

479 lines
19 KiB
PHP

<?php
namespace app\api\model;
use fast\Http;
use think\Db;
use think\Model;
use think\facade\Env;
class Login extends Model
{
//注册
public function user_reg($system,$login_device,$user_name='',$openid='',$ali_userid='',$apple_id='')
{
$block = db::name('block')->where(['type_text' => $login_device,'type' => 2])->find();
if ($block) {
return ['code' => 0, 'msg' => '设备已被封禁', 'data' => null];
}
$ip = request()->ip();
$block = db::name('block')->where(['type_text' => $ip,'type' => 3])->find();
if ($block) {
return ['code' => 0, 'msg' => 'ip已被封禁', 'data' => null];
}
$data = [];
$user_code = $this->get_user_code(); //获取用户code_id 过滤靓号
$data['user_code'] = $user_code;
$data['username'] = $user_name;
$data['mobile'] = $user_name;
$data['nickname'] = '游客'.$user_code;
$data['joinip'] = request()->ip();
$data['birthday'] = date('Y-m-d');
$data['avatar'] = get_system_config_value('web_site').'/data/avatar/head_pic.png';
$data['profile'] = '这个人很懒,什么都没写';
$data['system'] = $system;
$data['login_device'] = $login_device;
$data['createtime'] = time();
$data['logintime'] = time();
$data['status'] = 1;
// $data['init_code'] = model('User')->invite_code();
$reslut = db::name('user')->insertGetId($data);
//获取上一步的id
$user_id = model('User')->where('user_code',$user_code)->value('id');
if (!$reslut) {
return ['code' => 0, 'msg' => '登录失败le', 'data' => null];
};
//创建钱包
$user_wallet = model('UserWallet')->create_data($user_id);
if (!$user_wallet) {
return ['code' => 0, 'msg' => '登录失败1', 'data' => null];
}
//注册即奖励金币【完成任务】
model('DailyTasks')->tasks_complete($user_id,11);
/*********** 腾讯云IM ********/
$user_sig = model('Tencent')->tencent_user_sig_info('u'.$user_id);
model('Tencent')->account_import($user_id);
if(empty($user_sig)){
return ['code' => 0, 'msg' => '登录失败2', 'data' => null];
}
//登录token
$login_token = model('UserToken')->update_token($user_id);
if(isset($login_token['code']) && $login_token['code'] != 1){
return ['code' => 0, 'msg' => '登录失败3', 'data' => null];
}
$user_data = [];
$user_data['tencent_im'] = $user_sig;
$user_data['createtime'] = time();
$user_data['user_id'] = $user_id;
$user_data['wx_openid'] = $openid;
$user_data['ali_userid'] = $ali_userid;
$user_data['apple_id'] = $apple_id;
$reslut_user_data = model('UserData')->save($user_data);
if (!$reslut_user_data) {
return ['code' => 0, 'msg' => '登录失败4', 'data' => null];
}
$return_res[0]['user_id'] = $user_id;
$return_res[0]['user_code'] = $user_code;
$return_res[0]['avatar'] = 'data/avatar/head_pic.png';
$return_res[0]['nickname'] = '游客'.$user_code;
$return_res[0]['token'] = $login_token;
$return_res[0]['tencent_im'] = $user_sig;
$return_res[0]['sex'] = 0;
$return_res[0]['mobile'] = $user_name;
$return_res[0]['auth'] = 0;
$return_res[0]['icon'][0] = model('UserData')->user_wealth_icon($user_id);//财富图标
$return_res[0]['icon'][1] = model('UserData')->user_charm_icon($user_id);//魅力图标
return ['code' => 1, 'msg' => '登录成功', 'data' => $return_res];
}
//登录
public function login($user_info, $system,$login_device ,$logtype='')
{
//查询账号封禁
$block = db::name('block')->where(['type_text' => $user_info['id'],'type' => 1])->find();
if ($block) {
return ['code' => 0, 'msg' => '用户已被封禁', 'data' => null];
}
$block = db::name('block')->where(['type_text' => $login_device,'type' => 2])->find();
if ($block) {
return ['code' => 0, 'msg' => '设备已被封禁', 'data' => null];
}
$ip = request()->ip();
$block = db::name('block')->where(['type_text' => $ip,'type' => 3])->find();
if ($block) {
return ['code' => 0, 'msg' => 'ip已被封禁', 'data' => null];
}
$save_data = [];
$save_data['id'] = $user_info['id'];
//查询手机号绑定的账号
$phone_user = $this->phone_login_query($user_info['mobile']);
if($phone_user['code'] == 1){
if(empty($logtype)){ //多账号登录
//获取返回数据的长度
if(count($phone_user['data']) >= 2){
//多账号就返回多用户选择登录 id,user_code,avatar,nickname,sex
$return_res = $phone_user['data'];
foreach ($return_res as $key => $value){
$return_res[$key]['token'] = '';
$return_res[$key]['tencent_im'] = '';
}
return ['code' => 1, 'msg' => '用户获取成功!~', 'data' => $return_res];
}else{
$user_info = $phone_user['data'][0];
}
}
//登录token
$login_token = model('UserToken')->update_token($user_info['id']);
if(isset($login_token['code']) && $login_token['code'] != 1){
return ['code' => 0, 'msg' => '登录失败,', 'data' => null];
}
//获取userData 腾讯IM唯一标识
$tencent_im = model('UserData')->get_tencent_im($user_info['id']);
if(isset($tencent_im['code']) && $tencent_im['code'] != 1){
return ['code' => 0, 'msg' => '登录失败!', 'data' => null];
}
$save_data['system'] = $system;
$save_data['login_device'] = $login_device;
$save_data['logintime'] = time();
$save_data['loginip'] = request()->ip();
$save_data['updatetime'] = time();
$save_data['prevtime'] = $user_info['logintime'];//上次登录时间
$reslut = model('User')->update($save_data);
if (!$reslut) {
return ['code' => 0, 'msg' => '登录失败!!', 'data' => null];
}
$return_res[0]['user_id'] = $user_info['id'];
$return_res[0]['user_code'] = $user_info['user_code'];
$return_res[0]['avatar'] = $user_info['avatar'];
$return_res[0]['nickname'] = $user_info['nickname'];
$return_res[0]['token'] = $login_token;
$return_res[0]['tencent_im'] = $tencent_im;
$return_res[0]['sex'] = $user_info['sex'];
$return_res[0]['mobile'] = $user_info['mobile'];
$return_res[0]['icon'][0] = model('UserData')->user_wealth_icon($user_info['id']);//财富图标
$return_res[0]['icon'][1] = model('UserData')->user_charm_icon($user_info['id']);//魅力图标
$isAuth = 0;
if($user_info['mobile']){
$isAuth = db::name('user_auth')->where('mobile' , $user_info['mobile'])->value('is_real') == 1 ? 1 : 0;
}
$return_res[0]['auth'] = $isAuth;
//是否可以发布动态
$user_rechange = db::name('vs_user_recharge')->field('sum(money) as money')->where(['user_id' => $user_info['id'],'pay_status' => 2])->find();
//系统配置
$config_money = get_system_config_value('private_chat_recharge_money');
if(($config_money > 0) && ($user_rechange['money'] < $config_money)){
$return_res[0]['is_can_chat'] = 0;
}else{
$return_res[0]['is_can_chat'] = 1;
}
$return_res[0]['can_chat_money'] = $config_money;
return ['code' => 1, 'msg' => '登录成功', 'data' => $return_res];
}else{
return ['code' => 0, 'msg' => '登录失败,账号失效', 'data' => null];
}
}
//过滤靓号
public function get_user_code()
{
$user_code = model('User')->order('user_code desc')->value('user_code');
if(empty($user_code)){
$user_code = 10000;
}
$user_code = $user_code + 1;
$vip_code = db::name('vip_code')->where(['type' => 1, 'status' => 1])->field('code')->select();
if (empty($vip_code)) {
return $user_code;
}
if (in_array($user_code, (array)$vip_code)) {
return $user_code + 2;
}
return $user_code;
}
//验证码/一键登录
public function phone_verification_code_log($user_name, $system,$login_device)
{
if (empty($user_name)) {
return ['code' => 0, 'msg' => '登录账号不能为空', 'data' => null];
}
$user_info = db::name('user')->where(['mobile' => $user_name,'status' => ['<>',0]])->find();
if($user_info){//登录
$login = $this->login($user_info,$system,$login_device);
if($login['code'] != 1){
return $login;
}
return ['code' => 1, 'msg' => '登录成功', 'data' => $login['data']];
}else{//注册
Db::startTrans();
// try {
$reslut = $this->user_reg($system,$login_device,$user_name);
if($reslut['code'] != 1){
Db::rollback();
return $reslut;
}
$return_res = $reslut['data'];
Db::commit();
return ['code' => 1, 'msg' => '登录成功', 'data' => $return_res];
// } catch (\Exception $e) {
// // 回滚事务
// Db::rollback();
// return ['code' => 0, 'msg' => $e, 'data' => null];
// }
}
}
//账号密码登录
public function user_login($user_name, $password, $system,$login_device)
{
if (empty($user_name)) {
return ['code' => 0, 'msg' => '用户名不能为空', 'data' => null];
}
if (empty($password)) {
return ['code' => 0, 'msg' => '密码不能为空', 'data' => null];
}
$user_info = model('User')->where(['mobile' => $user_name,'status'=>['<>',0]])->find();
if (empty($user_info)) {
return ['code' => 0, 'msg' => '用户不存在', 'data' => null];
}
if ($user_info['status'] != 1) {
return ['code' => 301, 'msg' => '用户被禁用,请联系管理员', 'data' => null];
}
if (md5($password) != $user_info['password']) {
return ['code' => 0, 'msg' => '密码错误', 'data' => null];
}
// $multi_user = [];
// //查询手机号绑定的账号
// $phone_user = $this->phone_login_query($user_name);
// if($phone_user['code'] == 1){
// //获取返回数据的长度
// if(count($phone_user['data']) >= 2){
// $multi_user = $phone_user['data'];
// }
// }
$login = $this->login($user_info,$system,$login_device);
if($login['code'] != 1){
return $login;
}
return ['code' => 1, 'msg' => '登录成功', 'data' => $login['data']];
}
//多账号选号登录
public function multi_account_login($user_name,$system,$login_device){
$user_info = db::name('user')->where('id', $user_name)->find();
$login = $this->login($user_info,$system,$login_device,2);
if($login['code'] != 1){
return $login;
}
return ['code' => 1, 'msg' => '登录成功', 'data' => $login['data']];
}
//微信/支付宝 登录
public function wechat_ali_Login($type,$userinfo,$system,$login_device){
$ali_userid = '';
$openid = '';
$apple_id = '';
if($type == 'wx'){
$openid = $userinfo['openid'];
$user_info_data = model('UserData')->where(['wx_openid' => $openid,'deletetime'=>0])->find();
$config_time = get_system_config_value('cancel_to_reset_reg');
if($user_info_data['deletetime'] != 0 && time() - $user_info_data['deletetime'] < 86400 * $config_time){
return ['code' => 0, 'msg' => '注销后需等待'.$config_time.'天才能重新注册', 'data' => null];
}
}elseif ($type == 'ali'){
$ali_userid = $userinfo['open_id'];
$user_info_data = model('UserData')->where(['ali_userid' => $ali_userid,'deletetime'=>0])->find();
$config_time = get_system_config_value('cancel_to_reset_reg');
if($user_info_data['deletetime'] != 0 && time() - $user_info_data['deletetime'] < 86400 * $config_time){
return ['code' => 0, 'msg' => '注销后需等待'.$config_time.'天才能重新注册', 'data' => null];
}
}elseif ($type == 'ios'){
$apple_id = $userinfo;
$user_info_data = model('UserData')->where(['apple_id' => $userinfo,'deletetime'=>0])->find();
$config_time = get_system_config_value('cancel_to_reset_reg');
if($user_info_data['deletetime'] != 0 && time() - $user_info_data['deletetime'] < 86400 * $config_time){
return ['code' => 0, 'msg' => '注销后需等待'.$config_time.'天才能重新注册', 'data' => null];
}
}
else{
return ['code' => 0, 'msg' => '登录类型错误', 'data' => null];
}
if($user_info_data){//登录
$return_res = [];
$user_info = model('User')->where('id', $user_info_data['user_id'])->find();
if($user_info['sex'] != 0){//已完善过自己的信息
return $this->login($user_info,$system,$login_device,2);
}else{//没有完善过自己的信息
$return_res[0]['user_id'] = $user_info_data['user_id'];
$return_res[0]['user_code'] = '';
$return_res[0]['avatar'] = '';
$return_res[0]['nickname'] = '';
$return_res[0]['token'] = '';
$return_res[0]['tencent_im'] = '';
$return_res[0]['sex'] = 0;
$return_res[0]['auth'] = 0;
$return_res[0]['icon'][0] = model('UserData')->user_wealth_icon($user_info_data['user_id']);//财富图标
$return_res[0]['icon'][1] = model('UserData')->user_charm_icon($user_info_data['user_id']);//魅力图标
return ['code' => 1, 'msg' => '登录成功', 'data' => $return_res];
}
}else{//注册
//开启事务
Db::startTrans();
$reslut = $this->user_reg($system,$login_device,'',$openid,$ali_userid,$apple_id);
if($reslut['code'] != 1){
Db::rollback();
return $reslut;
}
$return_res = $reslut['data'];
Db::commit();
return ['code' => 1, 'msg' => '登录成功', 'data' => $return_res];
}
}
//手机号相关登录时 查询此手机号在平台绑定的所有账号
public function phone_login_query($phone){
$user_info = db::name('user')->where(['mobile' => $phone,'status' =>['neq',0]])->select();
if(empty($user_info)){
return ['code' => 0, 'msg' => '查询失败', 'data' => null];
}
foreach ($user_info as &$value){
$value['user_id'] = $value['id'];
}
return ['code' => 1, 'msg' => '查询成功', 'data' => $user_info];
}
//退出登录
public function logout($token){
$user_info = model('UserToken')->where('token', $token)->find();
if($user_info){
model('UserToken')->where('id', $user_info['id'])->update(['token' => 1]);
return ['code' => 1, 'msg' => '退出成功', 'data' => null];
}else{
return ['code' => 0, 'msg' => '退出失败', 'data' => null];
}
}
//注销
public function cancel($token){
$user_info = model('UserToken')->where('token', $token)->find();
//用户注册时间
$register_time = db::name('user')->where('id', $user_info['user_id'])->value('createtime');
$config_time = get_system_config_value('reg_to_cancel');
if(time() - $register_time < 86400 * $config_time){
return ['code' => 0, 'msg' => '注册'.$config_time.'天内不能注销!', 'data' => null];
}
if($user_info){
model('UserToken')->where('id', $user_info['id'])->update(['token' => 1]);
$isstatus = model('User')->where('id', $user_info['user_id'])->update(['status' => 0]);
if($isstatus){
//删除用户
// model('Tencent')->account_delete($user_info['user_id']);
model('User')->where('id', $user_info['user_id'])->update(['delete_time' => time()]);
model('User')->where('id', $user_info['user_id'])->update(['avatar' => get_system_config_value('delete_avatar')]);
model('UserData')->where('user_id', $user_info['user_id'])->update(['deletetime' => time()]);
//查询创建的房间
$room_list = db::name('vs_room')->where('user_id', $user_info['user_id'])->select();
if($room_list){
foreach ($room_list as &$value) {
db::name('vs_room')->where('id', $value['id'])->update(['room_status' => 3]);
}
}
//查询用户所在房间
$room_list = db::name('vs_room_visitor')->where('user_id', $user_info['user_id'])->select();
if($room_list){
foreach ($room_list as &$value) {
model('Room')->quit_room($user_info['user_id'], $value['room_id'],$user_info['user_id']);
}
}
}else{
return ['code' => 0, 'msg' => '注销失败', 'data' => null];
}
//查询绑定的手机号
$mob = db::name('user')->where('id', $user_info['user_id'])->value('mobile');
$mobile = db::name('user')->where(['mobile' => $mob,'status' => ['<>',0]])->select();
if(isset($mobile) && count($mobile) < 2){
db::name('user_auth')->where('mobile', $mob)->delete();
}
return ['code' => 1, 'msg' => '注销成功', 'data' => null];
}else{
return ['code' => 0, 'msg' => '注销失败', 'data' => null];
}
}
//忘记密码
public function forgot_password($mobile,$password){
$user = model('User')->where(['mobile'=>$mobile,'status'=>1])->find();
if(empty($user)){
return ['code' => 0, 'msg' => '用户不存在', 'data' => null];
}
$re = model('User')->where('id',$user['id'])->update(['password'=>md5($password)]);
if(empty($re)){
return ['code' => 0, 'msg' => '修改失败', 'data' => null];
}
return ['code' => 1, 'msg' => '修改成功', 'data' => null];
}
}