auth = $auth; $this->userRepository = $userRepository; $this->captchaService = $captchaService; } public function login(Request $request){ /*登录表单处理*/ if($request->isMethod('post')) { $request->flashOnly('email'); $validateRules = [ 'email' => 'required|min:2|max:128', 'password' => 'required|min:6' ]; if( Setting()->get('code_login') == 1){ $this->captchaService->setValidateRules('code_login', $validateRules); } /*表单数据校验*/ $this->validate($request,$validateRules); /*只接收email和password的值*/ $credentials = [ 'password' => $request->input('password') ]; // if(is_email($request->input('email'))){ $credentials['email'] = $request->input('email'); // }else{ // $credentials['mobile'] = $request->input('email'); // } /*根据邮箱地址和密码进行认证*/ if ($this->auth->attempt($credentials, $request->has('remember'))) { if($this->credit($request->user()->id,'login',Setting()->get('coins_login'),Setting()->get('credits_login'))){ $message = '登陆成功! '.get_credit_message(Setting()->get('credits_login'),Setting()->get('coins_login')); return $this->success(route('website.index'),$message,true); } session_start(); $_SESSION['login_time'] = time(); /*认证成功后跳转到首页*/ return $this->success(route('auth.doing.index'),'登陆成功!',true); } /*登录失败后跳转到首页,并提示错误信息*/ return redirect(route('auth.user.login')) ->withInput($request->only('email', 'remember')) ->withErrors([ 'password' => '用户名或密码错误,请核实!', ]); } return view("theme::account.login"); } /** * 用户注册入口 * @param Request $request * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View */ public function register(Request $request) { /*注册是否开启*/ if(!Setting()->get('register_open',1)){ return $this->showErrorMsg(route('website.index'),'管理员已关闭了网站的注册功能!'); } /*防灌水检查*/ if( Setting()->get('register_limit_num') > 0 ){ $registerCount = $this->counter('register_number_'.md5($request->ip())); if( $registerCount >= Setting()->get('register_limit_num')){ return $this->showErrorMsg(route('website.index'),'您的当前的IP已经超过当日最大注册数目,如有疑问请联系管理员'); } } /*注册表单处理*/ if($request->isMethod('post')) { $request->flashExcept(['password','password_confirmation']); /*表单数据校验*/ $validateRules = [ 'name' => 'required|min:2|max:100|unique:users', 'password' => 'required|confirmed|min:6|max:16', ]; if(Setting()->get('register_type') == 'email'){ $validateRules['email'] = 'required|email|max:255|unique:users'; }else{ $validateRules['mobile'] = 'required|regex:/^1[3456789]\d{9}$/|unique:users'; $validateRules['code'] = 'required|min:4|:max:8'; } if( Setting()->get('code_register') == 1){ $this->captchaService->setValidateRules('code_register', $validateRules); } $this->validate($request,$validateRules); $formData = $request->all(); $formData['status'] = 0; $formData['visit_ip'] = $request->getClientIp(); if( Setting()->get('register_type') == 'mobile' ){ if( !SmsService::verifySmsCode($formData['mobile'],$request->input('code')) ) { return view("theme::account.register")->withErrors(['code'=>'短信验证码错误']); } $formData['status'] = 1; } $user = $this->userRepository->register($formData); $user->attachRole(2); //默认注册为普通用户角色 $this->auth->login($user); $message = '注册成功!'; if($this->credit($request->user()->id,'register',Setting()->get('coins_register'),Setting()->get('credits_register'))){ $message .= get_credit_message(Setting()->get('credits_register'),Setting()->get('coins_register')); } if(Setting()->get('register_type')=='email'){ /*发送邮箱验证邮件*/ $emailToken = EmailToken::create([ 'email' => $user->email, 'token' => EmailToken::createToken(), 'action'=> 'register' ]); if($emailToken){ $subject = '欢迎注册'.Setting()->get('website_name').',请激活您注册的邮箱!'; $content = "「".$request->user()->name."」您好,请激活您在 ".Setting()->get('website_name')." 的注册邮箱!
请在1小时内点击该链接激活注册账号 → ".route('auth.email.verifyToken',['action'=>$emailToken->action,'token'=>$emailToken->token])."
如非本人操作,请忽略此邮件!"; $this->sendEmail($emailToken->email,$subject,$content); } } /*记录注册ip*/ $this->counter('register_number_'.md5($request->ip()) , 1,86400 ); return $this->success(route('website.index'),$message); } return view("theme::account.register"); } /*忘记密码*/ public function forgetPassword() { return view("theme::account.forgetPassword"); } /*通过邮件方式找回密码*/ public function findByEmail(Request $request){ if($request->isMethod('post')) { $request->flashOnly('email'); /*表单数据校验*/ $this->validate($request, [ 'email' => 'required|email|exists:users', 'captcha' => 'required|captcha' ]); $emailToken = EmailToken::create([ 'email' => $request->input('email'), 'token' => EmailToken::createToken(), 'action'=> 'findPassword' ]); if($emailToken){ $subject = Setting()->get('website_name').' 找回密码通知'; $content = "如果您在 ".Setting()->get('website_name')."的密码丢失,请点击下方链接找回 → ".route('auth.user.findPassword',['token'=>$emailToken->token])."
如非本人操作,请忽略此邮件!"; $this->sendEmail($emailToken->email,$subject,$content); } return view("theme::account.findByEmail")->with('success','ok')->with('email',$request->input('email')); } return view("theme::account.findByEmail"); } /*通过手机验证码找回密码*/ public function findByMobile(Request $request){ if($request->isMethod('post')){ $this->validate($request, [ 'mobile' => 'required|regex:/^1[34578]\d{9}$/|exists:users', 'code' => 'required|min:4|max:6', 'password' => 'required|min:6|max:32' ]); $mobile = $request->input('mobile'); $code = $request->input('code'); if( !SmsService::verifySmsCode($mobile,$code) ){ return view("theme::account.findByMobile")->withErrors(['code'=>'验证码错误']); } $user = User::where('mobile','=',$mobile)->first(); if(!$user){ return view("theme::account.findByMobile")->withErrors(['mobile'=>'手机号不存在']); } $user->password = Hash::make($request->input('password')); $user->save(); return $this->success(route('auth.user.login'),'密码修改成功,请重新登录'); } return view("theme::account.findByMobile"); } public function findPassword($token,Request $request) { if($request->isMethod('post')){ $this->validate($request, [ 'password' => 'required|min:6|max:32', 'captcha' => 'required|captcha' ]); $emailToken = EmailToken::where('action','=','findPassword')->where('token','=',$token)->first(); if(!$emailToken){ return $this->error(route('website.ask'),'token信息不存在,请重新找回'); } if($emailToken->created_at->diffInMinutes() > 60){ return $this->error(route('website.ask'),'token信息已失效,请重新找回'); } $user = User::where('email','=',$emailToken->email)->first(); if(!$user){ return $this->error(route('website.ask'),'用户不存在或已被删除'); } $user->password = Hash::make($request->input('password')); $user->save(); EmailToken::clear($user->email,'findPassword'); return $this->success(route('auth.user.login'),'密码修改成功,请重新登录'); } return view("theme::account.findPassword")->with('token',$token); } /*每日签到*/ public function sign(Request $request){ if(!Setting()->get('open_user_sign')){ abort(404); } $loginUser = $request->user(); if($loginUser->isSigned()){ return $this->error(route('website.index'),'今日已签到,不能重复签到'); } $message = '签到成功!'; if(CreditService::create($loginUser->id, 'sign', Setting()->get('coins_sign'),Setting()->get('credits_sign'))){ $message .= get_credit_message(Setting()->get('credits_sign'),Setting()->get('coins_sign')); } return $this->success(route('website.index'),$message); } /** * 用户登出 */ public function logout(){ setcookie("token",0,time()-7200,"/",".nxjiewei.com"); session_start(); unset($_SESSION['login_time']); $this->auth->logout(); return redirect()->to(route('website.index')); } }