表设计原则
要考虑到以后单表体积
要把主要大字段分割出去
使用搜索引擎
记录多的话,要用第三方搜索引擎,分词器,elastic seacrch
后台登录
指定controller路径
用artisan创建控制器, php artisan make:controller admins/Account
<a name="KoKUE"></a>
创建路由
添加路由 Route::get('/admins/account/login','admins\Account@login');
,注意命名空间反斜杠
Route::get('/admins/account/login','admins\Account@login');
指定view路径
return view('admins.account.login');
验证码
注意给验证码写路由
/**
* 验证码类
*/
class VeriCode{
// 获取验证码配置
private static function _getCodeConfig(){
return [
// 验证码字符集
'codeStr' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',
// 验证码个数
'codeCount' => 4,
// 字体大小
'fontsize' =>16,
// 验证码的宽度
'width' => 100,
// 验证码高度
'height' => 36,
// 是否有干扰点?true有,false没有
'disturbPoint' => true,
// 干扰点个数,disturbPoint开启后生效
'pointCount' => 200,
// 是否有干扰条?true有,false没有
'disturbLine' => true,
// 干扰条个数,disturbLine开启后生效
'lineCount' => 3
];
}
// 创建图片验证码
public static function create(){
// 配置
$config = self::_getCodeConfig();
//创建画布
$image = imagecreatetruecolor($config['width'],$config['height']);
//背景颜色
$bgcolor=imagecolorallocate($image,255,255,255);
imagefill($image,0,0,$bgcolor);
$captch_code = '';//存储验证码
$captchCodeArr = str_split($config['codeStr']);
//随机选取4个候选字符
for($i=0;$i<$config['codeCount'];$i++){
$fontsize = $config['fontsize'];
$fontcolor=imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));//随机颜色
$fontcontent = $captchCodeArr[rand(0,strlen($config['codeStr'])-1)];
$captch_code.=$fontcontent;
$_x = $config['width']/$config['codeCount'];
$x=($i*(int)$_x)+rand(5,10); //随机坐标
$y=rand(5,10);
imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor); // 水平地画一行字符串
}
session_start();
$_SESSION['code']=$captch_code;
//增加干扰点
if($config['disturbPoint']){
for($i=0;$i<$config['pointCount'];$i++){
$pointcolor=imagecolorallocate($image,rand(50,200),rand(50,200),rand(50,200));
imagesetpixel($image,rand(1,99),rand(1,29),$pointcolor);
}
}
//增加干扰线
if($config['disturbLine']){
for($i=0;$i<$config['lineCount'];$i++){
$linecolor=imagecolorallocate($image,rand(80,280),rand(80,220),rand(80,220));
imageline($image,rand(1,99),rand(1,29),rand(1,99),rand(1,29),$linecolor);
}
}
//输出格式
header('content-type:image/png');
imagepng($image);
//销毁图片
imagedestroy($image);
}
}
登录提交
定义post提交路由,用ajax的post提交登录数据
使用post提交注意添加@csrf
function dologin(){
var username = $.trim($('#username').val());
var pwd = $.trim($('#password').val());
var verifycode = $.trim($('#verifycode').val());
if(username==''){
layer.alert('请输入用户名',{icon:2});
return;
}
if(pwd==''){
layer.alert('请输入密码',{icon:2});
return;
}
if(verifycode==''){
layer.alert('请输入验证码',{icon:2});
return;
}
var _token = $('input[name="_token"]').val();
$.post('/admins/account/dologin',{username:username,pwd:pwd,verifycode:verifycode,_token:_token},function(res){
if(res.code>0){
reload_captcha();
return layer.alert(res.msg,{icon:2});
}
layer.alert(res.msg,{icon:1});
setTimeout(function(){
window.location.href='/admins/home/index';
},1000);
},'json');
}
控制器中用Request接收
public function dologin(Request $req){
$username = trim($req->username);
$pwd = trim($req->pwd);
$VeriCode = trim($req->verifycode);
if ($username==''){
return json_encode(array('code'=>1,'msg'=>'用户不能为空'));
}
if ($pwd==''){
return json_encode(array('code'=>1,'msg'=>'密码不能为空'));
}
session_start();
if (strtolower($VeriCode)!=strtolower($_SESSION['code'])){
return json_encode(array('code'=>1,'msg'=>'验证码不正确'));
}
return json_encode(array('code'=>0,'msg'=>'登录成功'));
}