<?php namespace app\admin\controller; use app\admin\model\AdminModel; use app\admin\model\StaffModel; use think\Controller; use think\facade\Cache; use think\facade\Session; use think\Request; use app\admin\validate\LoginValidate; use think\captcha\Captcha; /** * 登录控制器 * 负责检测用户登录 * Class Login * @package app\admin\controller */ class Login extends Controller { public function index() { $baseUrl = config('admin.base_url'); echo '<script type="text/javascript">top.location.href="'.$baseUrl.'";</script>'; } public function login(Request $request,LoginValidate $validate) { $pattern = config('admin.login_pattern'); if(!$validate->check($request->post())){ $data = [ 'status' => 0, 'message' => $validate->getError() ]; return $data; } $captcha = new Captcha(); if( !$captcha->check($request->post('verify'))) { $data = [ 'status' => 0, 'message' => '验证码错误' ]; return $data; } //如果是邮箱 if(preg_match($pattern,$request->post('name'))){ return $this->checkStaff(); } else { return $this->checkAdmin(); } } //验证码 public function verify() { $captcha = new Captcha(); $captcha->fontSize = 30; $captcha->length = 4; $captcha->useNoise = true; $captcha->imageH=0; $captcha->imageW=0; return $captcha->entry(); } public function loginOut() { session(null); cookie(null); (new SingleSign())->clear(); $this->redirect('/login'); } private function checkStaff(){ $email = $this->request->post('name'); $passwd = $this->request->post('password'); $staff = StaffModel::with('passwd')->get(['email'=>$email]); if(!$staff){ $data = [ 'status' => 0, 'message' => '用户不存在' ]; return $data; } $status=(new StaffModel)->getStaffStatusByName($email); if(!$status['status']==1){ $data = [ 'status' => 0, 'message' => '该账户当前禁用,请联系管理员开启' ]; return $data; } if(decrypt($passwd) == $staff->passwd->passwd){ $user = [ 'name'=> $staff->name, 'user_id' => $staff->id, 'is_admin' => false ]; loginlog($staff->name,$staff->id,'用户成功登录系统',1); Session::set('user',$user); return $this->goRedirect($user); } else { loginlog($staff->name,$staff->id,'用户名或密码错误',2); $data = [ 'status' => 0, 'message' => '用户名或密码错误' ]; return $data; } } private function checkAdmin(){ $name = $this->request->post('name'); $passwd = decrypt($this->request->post('password')); $admin = AdminModel::get(['name'=>$name,'password'=>$passwd]); if(!$admin){ $data = [ 'status' => 0, 'message' => '用户名或密码错误' ]; return $data; } else { loginlog($admin->name,$admin->id,'管理员用户成功登录系统',1); $user = [ 'name' => $admin->name, 'user_id' => $admin->id, 'is_admin' => true ]; //写入登录信息 $admin->ip = \think\facade\Request::ip(); $admin->load_times += 1; $admin->load_time_at = time(); $admin->save(); Session::set('user',$user); return $this->goRedirect($user); } } private function goRedirect($user){ //存储redis $key = $this->getRandomStr(); $data = [ 'status'=> 1, 'message' => '登录成功', 'user' => $key, 'home' => '/' ]; $encryptKey = substr(md5(config('admin.encrypt_key').$key),0,10); //存储到redis Cache::store('redis')->set($encryptKey,json_encode($user),3600); return $data; } private function getRandomStr($length = 10){ $strs="QWERTYUIOPASDFGHJKLZXCVBNM1234567890qwertyuiopasdfghjklzxcvbnm"; return substr(str_shuffle($strs),mt_rand(0,strlen($strs)-11),$length); } }