tencentImAccountService = $tencentImAccountService; } /** * 极光认证一键登录 */ public function auth_login(Request $request){ file_put_contents('login_log.log',date("Y-m-d H:i:s").var_export($request->all(),true).PHP_EOL,FILE_APPEND); try { if(empty($request->loginToken)){ throw new Exception("参数错误"); } $loginToken = $request->loginToken; $exID = $request->post('exID','800'); $ret = JPushService::jgLoginTokenVerify($loginToken,$exID); $mobile = JPushService::jgOpensslPrivateDecrypt($ret['phone']); $res = $this->do_login($mobile); }catch (\Exception $exception){ return $this->response->errorForbidden($exception->getMessage()); } return response()->json($res); } /** * 手机号登录 * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function login_by_mobile(Request $request) { file_put_contents('login_log.log',date("Y-m-d H:i:s").var_export($request->all(),true).PHP_EOL,FILE_APPEND); try { $validator = Validator::make($request->all(), [ 'mobile' => ['required', 'regex:/^1[3456789]\d{9}$/'], 'verifyKey' => 'bail|required|string', 'smsCode' => 'bail|required', ], [ 'mobile.required'=>"手机号码必须", 'mobile.regex'=>"手机号码格式错误", 'verifyKey.required'=>"验证码必须", 'smsCode.required'=>"短信验证码必须", ]); if ($validator->fails()) { return $this->response()->errorForbidden($validator->messages()->first()); } //验证短信验证码 SmsService::checkSmsCodeByVerifyKey($request->verifyKey, $request->smsCode); $res = $this->do_login($request->mobile,null,$request->registrationId,$request->phoneModel); }catch (\Exception $exception){ return $this->response->errorForbidden($exception->getMessage()); } catch (SmsException $e) { return $this->response->errorForbidden($e->getMessage()); } return response()->json($res); } /** * 用户账号密码登录 * @param Request $request * @return \Illuminate\Http\JsonResponse|void */ public function login_by_account_password(Request $request) { file_put_contents('login_log.log',date("Y-m-d H:i:s").var_export($request->all(),true).PHP_EOL,FILE_APPEND); try { $validator = Validator::make($request->all(), [ 'mobile' => ['required', 'regex:/^1[3456789]\d{9}$/'], 'password' => 'required|string', ],[ 'mobile.required'=>"手机号码必须", 'mobile.regex'=>"手机号码格式错误", 'password.required'=>"密码必须", ]); if ($validator->fails()) { throw new Exception($validator->messages()->first()); } $res = $this->do_login($request->mobile,$request->password,$request->registrationId,$request->phoneModel); }catch (\Exception $exception){ return $this->response->errorForbidden($exception->getMessage()); } file_put_contents('login_log.log',date("Y-m-d H:i:s").'执行成功'.PHP_EOL,FILE_APPEND); return response()->json($res); } //登录操作 public function do_login($mobile,$password=null,$registrationId=null,$phoneModel=null){ if(!empty($password)){ if (!$user=User::query()->where(['mobile' => $mobile,'is_distory'=>0])->whereNull('deleted_at')->first()) { throw new Exception("用户不存在"); } file_put_contents('login_log.log',date("Y-m-d H:i:s").var_export($user->toArray(),true).PHP_EOL,FILE_APPEND); $credentials = ['mobile'=>$mobile,'password'=>$password]; if (!auth('api')->attempt($credentials)) { throw new Exception("手机号或密码错误"); } }else{ if(!User::query()->where(['mobile'=>$mobile,'is_distory'=>0])->first()){ User::query()->create([ 'mobile' => $mobile, ]); } $user = User::query()->where(['mobile'=>$mobile,'is_distory'=>0])->whereNull('deleted_at')->first(); } if (!$user->ycode) { $user->ycode = $this->create_code(); } if(!UserInfoModel::query()->where('user_id',$user->id)->first()){ UserInfoModel::query()->create([ 'user_id'=>$user->id, 'avatar'=>"https://zhengda.oss-cn-chengdu.aliyuncs.com/chengluApp/default.jpg", 'nickname'=>"用户".$user->mobile, 'birthday'=>"1990-01-01" ]); } if(!UserVipLimit::query()->where('user_id',$user->id)->first()){ UserVipLimit::query()->create([ 'user_id'=>$user->id, ]); } if (!$user->tencent_im_user_id || str_contains($user->tencent_im_user_id, 'SSS_SFS')) { $user->tencent_im_user_id = $this->tencentImAccountService->accountImport($user); } if($user->status!=1){ throw new Exception("用户已被禁用,请联系管理员"); } $token = Auth::guard('api')->fromUser($user); $user->remember_token = $token; $user->last_login_time = date("Y-m-d H:i:s"); $user->last_login_ip = request()->ip(); $user->online = 1; if(!empty($registrationId)){ $user->registrationId = $registrationId; $user->phoneModel = $phoneModel; } $re = $user->save(); file_put_contents('login_log.log',date("Y-m-d H:i:s").$re.PHP_EOL,FILE_APPEND); $resdata['token'] = "Bearer ".$token; $resdata['sex'] = $user->sex; $resdata['password'] = $user->password?1:0; $resdata['tencent_im_user_id'] =$user->tencent_im_user_id; $resdata['mobile'] =$user->mobile; $resdata['lock_pass'] =$user->lock_pass?$user->lock_pass:false; $resdata['status'] =$user->status; $resdata['is_auth'] =$user->is_auth; $resdata['ycode'] =$user->ycode; $resdata['online'] =$user->online; $resdata['notice_status'] =$user->notice_status; $resdata['userinfo'] = $this->getinfo($user->id); return $resdata; } public function captcha(){ return response(captcha_src()); } /** * 根据用户ID生成唯一邀请码 * @param $user_id * @return string */ public function create_code() { $code = create_invite_code(); if(User::where(['ycode'=>$code])->first()){ $code = create_invite_code(); } return $code; } /** * 注册账号 */ public function register(Request $request){ $validator = Validator::make($request->all(), [ 'mobile' => ['required', 'regex:/^1[3456789]\d{9}$/'], 'password' => 'bail|required', ],[ 'mobile.required'=>"手机号码必须", 'mobile.regex'=>"手机号码格式错误", 'password.required'=>"密码必须", ]); if ($validator->fails()){ return $this->response()->errorForbidden($validator->messages()->first()); } if(User::where(['mobile'=>$request->mobile,'is_distory'=>0])->first()){ return $this->response->errorForbidden("该手机号码已注册"); } $ins = array(); $ins['mobile'] = $request->mobile; $ins['password'] = $request->password; if(User::create($ins)){ return response()->json(['message'=>"注册成功"]); }else{ return $this->response->errorForbidden("注册失败"); } } public function reg_h5(Request $request){ $validator = Validator::make($request->all(), [ 'mobile' => ['required', 'regex:/^1[3456789]\d{9}$/'], 'password' => 'bail|required', 'smsCode' => 'bail|required', ],[ 'mobile.required'=>"手机号码必须", 'mobile.regex'=>"手机号码格式错误", 'password.required'=>"密码必须", 'smsCode.required'=>"短信验证码必须", ]); if ($validator->fails()){ return response()->json([ 'code'=>0, 'message'=>$validator->messages()->first() ]); } DB::beginTransaction(); try { //验证短信验证码 SmsService::checkSmsCodeByVerifyKey($request->verifyKey, $request->smsCode); if(User::where(['mobile'=>$request->mobile,'is_distory'=>0])->first()){ throw new Exception("该手机号码已使用"); } //邀请码设置 $pid = 0; if(isset($request->ycode) && $request->ycode!=""){ if(!$puser = User::where(['ycode'=>$request->ycode])->first()){ throw new Exception("邀请码不存在"); } $pid = $puser->id; } $ins = array(); $ins['mobile'] = $request->mobile; $ins['password'] = $request->password; $ins['pid'] = $pid; $ins['created_at'] = date('Y-m-d H:i:s'); $ins['updated_at'] = date('Y-m-d H:i:s'); $insid = User::query()->insertGetId($ins); //赠送会员天数 UserInviteLog::query()->create([ 'user_id'=>$pid, 'invite_id'=>$insid, 'day'=>1, 'status'=>0, ]); DB::commit(); } catch (SmsException $e) { DB::rollBack(); return response()->json([ 'code'=>0, 'message'=>$e->getMessage() ]); } catch (\Exception $e) { DB::rollBack(); return response()->json([ 'code'=>0, 'message'=>'短信校验失败' ]); } return response()->json([ 'code'=>1, 'message'=>'注册成功' ]); } /** * 忘记密码 */ public function forget_password(Request $request){ try { $validator = Validator::make($request->all(), [ 'mobile' => ['required', 'regex:/^1[3456789]\d{9}$/'], 'verifyKey' => 'bail|required|string', 'smsCode' => 'bail|required', 'password' => 'bail|required', ],[ 'mobile.required'=>"手机号码必须", 'mobile.regex'=>"手机号码格式错误", 'verifyKey.required'=>"验证码必须", 'smsCode.required'=>"短信验证码必须", 'password.required'=>"密码必须", ]); if ($validator->fails()) { throw new Exception($validator->messages()->first()); } //验证短信验证码 //SmsService::checkSmsCodeByVerifyKey($request->verifyKey, $request->smsCode); $user = User::where(['mobile'=>$request->mobile])->first(); $user->password =$request->password;// Hash::make($request->password); if(!$user->save()){ throw new Exception("设置失败"); } $res = $this->do_login($request->mobile,$request->password); }catch (\Exception $exception){ return $this->response->errorForbidden($exception->getMessage()); } catch (SmsException $e) { return $this->response->errorForbidden($e->getMessage()); } return response()->json($res); } /** * 用户协议 */ public function xieyi(Request $request){ if(isset($request->cont) && $request->cont==1){ $data = DB::table("document")->where(['id'=>$request->id])->first(); return response()->json(['data'=>$data]); }else{ $url = "https://".$_SERVER['HTTP_HOST']."/xieyi/content.html?id=1"; $url2 = "https://".$_SERVER['HTTP_HOST']."/xieyi/content.html?id=2"; return response()->json(['url1'=>$url,'url2'=>$url2]); } } /** * Get the authenticated User. * * @return \Illuminate\Http\JsonResponse */ public function me() { $user = auth('api')->user(); return $this->response->item($user, new UserTransformer()); } /** * Log the user out (Invalidate the token). * * @return \Illuminate\Http\JsonResponse */ public function logout() { $user = auth('api')->user(); $user->online = 0; $user->save(); auth('api')->logout(); return response()->json(['message' => '退出成功!']); } /** * Refresh a token. * 刷新token,如果开启黑名单,以前的token便会失效。 * 值得注意的是用上面的getToken再获取一次Token并不算做刷新,两次获得的Token是并行的,即两个都可用。 * @return \Illuminate\Http\JsonResponse */ public function refresh() { return $this->respondWithToken(Auth::guard('api')->refresh()); } static public function updateLastLogin(User $user, string $jwtToken) { $user->remember_token = $jwtToken; $user->last_login_time = Carbon::now(); $user->last_login_ip = request()->ip(); $user->save(); } /** * Get the token array structure. * * @param string $token * * @return \Illuminate\Http\JsonResponse */ protected function respondWithToken($token) { return response()->json([ 'access_token' => $token, 'token_type' => 'Bearer', 'expires_in' => Auth::guard('api')->factory()->getTTL() * 60 ]); } /** * 获取个人资料 */ public function getinfo($user_id){ $user = User::where(['id'=>$user_id])->first(); $userinfo = UserInfoModel::query()->where('user_id', $user->id)->first(); //不看拉黑用户 $black_list = UserBlacklistModel::query() ->where('user_id',$user->id) ->orWhere('black_id',$user->id) ->select(['black_id']) ->get() ->toArray(); $ids = array_column($black_list,'black_id'); $ids[]= $user->id; $userinfo['hobby'] = !empty($userinfo['hobby'])?explode(',',$userinfo['hobby']):[]; $userinfo['photo'] = !empty($userinfo['photo'])?json_decode($userinfo['photo'],true):[]; $video_info = !empty($userinfo['video'])?json_decode($userinfo['video'],true):[]; $userinfo['video'] = array_column($video_info,'url'); $userinfo['like_num'] = $user->like_num; $userinfo['like_me_num'] = $user->like_me_num; $userinfo['look_num'] = UserLookModel::query() ->with(['user'=>function($query){ $query->select('id','sex','is_vip','tencent_im_user_id'); },'user_info']) ->where(['look_id'=>$user->id]) ->whereNotIn('user_id',$ids) ->whereHas("user",function($query){ $query->where('is_distory',0)->select(); })->count(); $userinfo['look_num_red'] = UserLookModel::query() ->with(['user'=>function($query){ $query->select('id','sex','is_vip','tencent_im_user_id'); },'user_info']) ->where(['look_id'=>$user->id,'status'=>0]) ->whereNotIn('user_id',$ids) ->whereHas("user",function($query){ $query->where('is_distory',0)->select(); }) ->count(); $userinfo['sex'] = $user->sex; $userinfo['mobile'] = $user->mobile; $userinfo['is_auth'] = $user->is_auth; $userinfo['is_vip'] = $user->is_vip; $userinfo['ycode'] = $user->ycode; $userinfo['notice_status'] = $user->notice_status; $userinfo['update_num'] = UserVipLimit::query()->where('user_id',$user->id)->value('user_info'); $userinfo['see_user_num'] = UserVipLimit::query()->where('user_id',$user->id)->value("user_detail"); return $userinfo; } }