<?php
namespace App\Admin\Controllers;
use App\Facades\MessageFacade;
use App\User;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Form;
use Encore\Admin\Layout\Content;
use Encore\Admin\Widgets\Box;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Lang;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Validator;
class AuthController extends Controller
{
protected $loginView = 'auth.login';
public function getLogin()
{
if ($this->guard()->check()) {
return redirect($this->redirectPath());
}
return view($this->loginView);
}
public function postLogin(Request $request)
{
$this->loginValidator($request->all())->validate();
$credentials = $request->only([$this->username(), 'password']);
$remember = $request->get('remember', false);
if ($this->guard()->attempt($credentials, $remember)) {
return $this->sendLoginResponse($request);
}
return back()->withInput()->withErrors([
$this->username() => $this->getFailedLoginMessage(),
]);
}
public function sendSmsLoginCode(Request $request){
if (empty($request->mobile)) {
return ['code' => 400, 'msg' => '请输入手机号'];
}
$key = 'login_'.$request->mobile;
if ($request->session()->exists('last_login_send_time')) {
if (time() - $request->session()->get('last_login_send_time') < 60) {
return ['code' => 400, 'msg' => '发送太频繁'];
}
}
$code = rand('100000','999999');;
$request->session()->put($key, $code);
$request->session()->put('last_login_send_time', time());
return MessageFacade::sendLoginCode($request->mobile,$code);
}
public function sendSmsCode(Request $request){
if (empty($request->mobile)) {
return ['code' => 400, 'msg' => '请输入手机号'];
}
$key = 'register_'.$request->mobile;
if ($request->session()->exists('last_register_send_time')) {
if (time() - $request->session()->get('last_register_send_time') < 60) {
return ['code' => 400, 'msg' => '发送太频繁'];
}
}
$code = rand('100000','999999');;
$request->session()->put($key, $code);
$request->session()->put('last_register_send_time', time());
return MessageFacade::sendRegisterCode($request->mobile,$code);
}
public function smsLogin(){
return view('auth.smslogin');
}
public function postSmsLogin(Request $request){
$this->smsLoginValidator($request->all())->validate();
$key = 'login_'.$request->mobile;
$realCode = $request->session()->get($key);
if (empty($realCode)) {
return back()->withInput()->withErrors([
'error' => '请先获取验证码'
]);
} else if ($realCode != $request->code) {
return back()->withInput()->withErrors([
'error' => '验证码不正确'
]);
}
$user = User::where('username', $request->mobile)->first();
if (empty($user)) {
return back()->withInput()->withErrors(['error' => '手机号不存在']);
}
$credentials = ['mobile' => $request->mobile];
if ($this->guard()->attempt($credentials, true)) {
return $this->sendLoginResponse($request);
}
return back()->withInput()->withErrors([
$this->username() => $this->getFailedLoginMessage(),
]);
}
public function register() {;
return view('auth.register');
}
public function postRegister(Request $request){
$key = 'register_'.$request->mobile;
$realCode = $request->session()->get($key);
if (empty($realCode)) {
return back()->withInput()->withErrors([
'error' => '请先获取验证码'
]);
} else if ($realCode != $request->code) {
return back()->withInput()->withErrors([
'error' => '请输入正确的验证码'
]);
}
$this->getRegisterValidator($request->all())->validate();
$user = new User();
$users = User::whereHas('roles', function($query) {
$query->where('slug', 'CustomerService');
})->get();
if (count($users) > 0) {
$user->service_user_id = $users[0]->id;
}
$isExist = User::where('username',$request->mobile)->first();
if (!empty($isExist)) {
return back()->withInput()->withErrors([
'error' => '改手机号已被占用'
]);
}
$user->username = $request->mobile;
$user->phone = $request->mobile;
$user->name = $request->name;
$user->password = bcrypt($request->password);
$user->save();
Db::table('admin_role_users')->insert(['role_id' => 8,
'user_id' => $user->id
]);
$request->session()->remove($key);
MessageFacade::sendRegisterNotify($request->mobile);
return redirect(admin_base_path('auth/login'));
}
protected function smsLoginValidator(array $data) {
return Validator::make($data, [
'mobile' => 'regex:/^1[123456789][0-9]{9}$/',
'code' => 'required|regex:/^\d{6}$/'
],[
'mobile.required' => '请输入手机号',
'mobile.regex' => '请检查手机号',
'code.required'=>'请输入验证码',
'code.regex' => '验证码位6位数字'
]);
}
protected function getRegisterValidator(array $data){
return Validator::make($data, [
'mobile' => 'regex:/^1[123456789][0-9]{9}$/',
'name' => 'required|max:5',
'password' => 'required',
'code' => 'required|regex:/^\d{6}$/'
],[
'mobile.required' => '请输入手机号',
'mobile.regex' => '请检查手机号',
'name.required' => '请填写姓名',
'name.max' => '姓名不应该超过5个字符',
'password.required' => '请输入密码',
'code.required'=>'请输入验证码',
'code.regex' => '验证码位6位数字'
]);
}
protected function loginValidator(array $data)
{
return Validator::make($data, [
$this->username() => 'required',
'password' => 'required',
]);
}
public function getLogout(Request $request)
{
$this->guard()->logout();
$request->session()->invalidate();
return redirect(config('admin.route.prefix'));
}
public function getSetting(Content $content)
{
$form = $this->settingForm();
$form->tools(
function (Form\Tools $tools) {
$tools->disableList();
}
);
return $content
->header(trans('admin.user_setting'))
->body($form->edit(Admin::user()->id));
}
public function putSetting()
{
return $this->settingForm()->update(Admin::user()->id);
}
protected function settingForm()
{
$class = config('admin.database.users_model');
$form = new Form(new $class());
$form->display('username', trans('admin.username'));
$form->text('name', trans('admin.name'))->rules('required');
$form->image('avatar', trans('admin.avatar'));
$form->password('password', trans('admin.password'))->rules('confirmed|required');
$form->password('password_confirmation', trans('admin.password_confirmation'))->rules('required')
->default(function ($form) {
return $form->model()->password;
});
$form->setAction(admin_base_path('auth/setting'));
$form->ignore(['password_confirmation']);
$form->saving(function (Form $form) {
if ($form->password && $form->model()->password != $form->password) {
$form->password = bcrypt($form->password);
}
});
$form->saved(function () {
admin_toastr(trans('admin.update_succeeded'));
return redirect(admin_base_path('auth/setting'));
});
return $form;
}
protected function getFailedLoginMessage()
{
return Lang::has('auth.failed')
? trans('auth.failed')
: 'These credentials do not match our records.';
}
protected function redirectPath()
{
if (method_exists($this, 'redirectTo')) {
return $this->redirectTo();
}
return property_exists($this, 'redirectTo') ? $this->redirectTo : config('admin.route.prefix');
}
protected function sendLoginResponse(Request $request)
{
admin_toastr(trans('admin.login_successful'));
$request->session()->regenerate();
return redirect()->intended($this->redirectPath());
}
protected function username()
{
return 'username';
}
protected function guard()
{
return Auth::guard('admin');
}
}