引入验证码类和$_SESSION处理方法
(使用第三方$-SESSION时需在人口文件打开原生session 即在index.php 中加入session_start();
点击验证码时换一张:
<img src="{{url('admin/code')}}"
alt="" οnclick="this.src='{{url('admin/code')}}?'+Math.random()"
>)
登录表单提交CSRF认证及验证码判断
(在表单提交时需在表单页面设置csrf认证,即加一个_token字段{{csrf_field}};
验证码判断:
if($input = Input::all()){
$code = new \Code;
$_code = $code->get();
if(strtoupper($input['code'])!=$_code){
return back()->with('msg','验证码错误!');
}
在login.blade.php中加入
@if(session('msg'))
<p style="color:red">{{session('msg')}}</p>
用来显示错误信息
)
后台登陆密码Crypt加密和解密
(创建表和 与之对应的模型;
进行判断:
$user = User::first();
if($user->user_name != $input['user_name'] || Crypt::decrypt($user->user_pass)!= $input['user_pass']){
return back()->with('msg','用户名或者密码错误!');
}
session(['user'=>$user]);
return redirect('admin/index');
获取系统基本信息:
更改时区:在配置文件config/app.php中’timezone’=>’PRC’,//八东区
创建子视图:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="{{asset('resources/views/admin/style/css/ch-ui.admin.css')}}">
<link rel="stylesheet" href="{{asset('resources/views/admin/style/font/css/font-awesome.min.css')}}">
<script type="text/javascript" src="{{asset('resources/views/admin/style/js/jquery.js')}}"></script>
<script type="text/javascript" src="{{asset('resources/views/admin/style/js/ch-ui.admin.js')}}"></script>
<script type="text/javascript" src="{{asset('resources/org/layer/layer.js')}}"></script>
</head>
<body>
@yield('content')
</body>
</html>
使用子视图:
@extends('layouts.admin')
@section('content')
//此处为编辑的内容
@endsection
)
后台管理员登录中间件设置和注销登录
(此处中间件是用来判断登陆的用户是否是管理员 在Kernel.php中注册中间件。
配置中间件
public function handle($request, Closure $next)
{
if(!session('user')){
return redirect('admin/login');
}
return $next($request);
注销登录
public function quit()//注销登录
{
session(['user'=>null]);
return redirect('admin/login');
}
在路由中设置前缀和命名空间
Route::group(['middleware' => ['web','admin.login'],'prefix'=>'admin','namespace'=>'Admin'], function () { }
)
后台管理员修改密码及validation验证
//更改超级管理员密码
public function pass()
{
if($input = Input::all()){
$rules = [
'password'=>'required|between:6,20|confirmed',
];
$message = [
'password.required'=>'新密码不能为空!',
'password.between'=>'新密码必须在6-20位之间!',
'password.confirmed'=>'新密码和确认密码不一致!',
];
$validator = Validator::make($input,$rules,$message);
if($validator->passes()){
$user = User::first();
$_password = Crypt::decrypt($user->user_pass);
if($input['password_o']==$_password){
$user->user_pass = Crypt::encrypt($input['password']);
$user->update();
return back()->with('errors','密码修改成功!');
}else{
return back()->with('errors','原密码错误!');
}
}else{
return back()->withErrors($validator);
}
}else{
return view('admin.pass');
}
}
界面显示错误信息
@if(count($errors)>0)
<div class="mark">
@if(is_object($errors))
@foreach($errors->all() as $error)
<p>{{$error}}</p>
@endforeach
@else
<p>{{$errors}}</p>
@endif
</div>
@endif
创建数据库文章分类表
后台文章分类列表模板导入及基本信息展示(
用一条路由控制一堆操作时应使用资源路由
Route::resource('category', 'CategoryController');
查看路由列表命令:php artisan route:list
在控制器中写如下方法:
//get.admin/category 全部分类列表
public function index()
{
// $categorys = Category::tree();
$categorys = (new Category)->tree();
return view('admin.category.index')->with('data',$categorys);//返回视图,传递参数
}
在category/index.blade.php页面中进行循环输出
@foreach($data as $v)
<tr>
<td class="tc">
<input type="text" οnchange="changeOrder(this,{{$v->cate_id}})" value="{{$v->cate_order}}">
</td>
<td class="tc">{{$v->cate_id}}</td>
<td>
<a href="#">{{$v->_cate_name}}</a>
</td>
<td>{{$v->cate_title}}</td>
<td>{{$v->cate_view}}</td>
<td>
<a href="{{url('admin/category/'.$v->cate_id.'/edit')}}">修改</a>
<a href="javascript:;" οnclick="delCate({{$v->cate_id}})">删除</a>
</td>
</tr>
@endforeach
)
后台文章分类页多级分类列表
(
主标题下是副标题的实现办法:
控制器
public function index()
{
// $categorys = Category::tree();
$categorys = (new Category)->tree();
return view('admin.category.index')->with('data',$categorys);
}
模型
public function tree()
{
$categorys = $this->orderBy('cate_order','asc')->get();
return $this->getTree($categorys,'cate_name','cate_id','cate_pid');
}
// public static function tree()
// {
// $categorys = Category::all();
// return (new Category)->getTree($categorys,'cate_name','cate_id','cate_pid');
// }
public function getTree($data,$field_name,$field_id='id',$field_pid='pid',$pid=0)
{
$arr = array();
foreach ($data as $k=>$v){
if($v->$field_pid==$pid){
$data[$k]["_".$field_name] = $data[$k][$field_name];
$arr[] = $data[$k];
foreach ($data as $m=>$n){
if($n->$field_pid == $v->$field_id){
$data[$m]["_".$field_name] = '├─ '.$data[$m][$field_name];
$arr[] = $data[$m];
}
}
}
}
return $arr;
}
视图
@foreach($data as $v)
<tr>
<td class="tc">
<input type="text" οnchange="changeOrder(this,{{$v->cate_id}})" value="{{$v->cate_order}}">
</td>
<td class="tc">{{$v->cate_id}}</td>
<td>
<a href="#">{{$v->_cate_name}}</a>
</td>
<td>{{$v->cate_title}}</td>
<td>{{$v->cate_view}}</td>
<td>
<a href="{{url('admin/category/'.$v->cate_id.'/edit')}}">修改</a>
<a href="javascript:;" οnclick="delCate({{$v->cate_id}})">删除</a>
</td>
</tr>
@endforeach
)
后台文章分类页Ajax异步修改分类排序
$.post方式实现异步请求
$.post{‘url’,{参数},{回调函数}}
在input表单内加入如下动作
<td class="tc">
<input type="text" οnchange="changeOrder(this,{{$v->cate_id}})" value="{{$v->cate_order}}">
</td>
编写一条<script>函数
function changeOrder(obj,cate_id){
var cate_order = $(obj).val();
$.post("{{url('admin/cate/changeorder')}}",{'_token':'{{csrf_token()}}','cate_id':cate_id,'cate_order':cate_order},function(data){
if(data.status == 0){
layer.msg(data.msg, {icon: 6});
}else{
layer.msg(data.msg, {icon: 5});
}
});
}
配置路由并编写一条控制器,如下所示
public function changeOrder()
{
$input = Input::all();
$cate = Category::find($input['cate_id']);
$cate->cate_order = $input['cate_order'];
$re = $cate->update();
if($re){
$data = [
'status' => 0,
'msg' => '分类排序更新成功!',
];
}else{
$data = [
'status' => 1,
'msg' => '分类排序更新失败,请稍后重试!',
];
}
return $data;
}
引入弹层库,给用户更好的体验(larer.layui.com)
下载文件后放至resource/org目录下,引入js文件至主文件目录
在要显示的地方加入layer.msg(data.msg, {icon: 6})即可;
在Category.php中加入
$categorys = $this->orderBy('cate_order','asc')->get();实现排序
后台文章分类添加模板分配及父级分类嵌入
引入添加分类的模板
写添加分类的控制方法
public function create()
{
$data = Category::where('cate_pid',0)->get();
return view('admin/category/add',compact('data'));
}
修改引入的模板
<form action="{{url('admin/category')}}" method="post">
{{csrf_field()}}
<table class="add_tab">
<tbody>
<tr>
<th width="120"><i class="require">*</i>父级分类:</th>
<td>
<select name="cate_pid">
<option value="0">==顶级分类==</option>
@foreach($data as $d)
<option value="{{$d->cate_id}}">{{$d->cate_name}}</option>
@endforeach
</select>
</td>
</tr>
</tbody>
</table>
</form>
后台文章分类添加数据validation验证及入库
在添加数据之前首先对填入的数据进行验证
编写验证控制器方法验证分类名称不能为空
public function store()
{
$input = Input::except('_token');//除了_token属性外其余方法均返回
$rules = [
'cate_name'=>'required',
];
$message = [
'cate_name.required'=>'分类名称不能为空!',
];
$validator = Validator::make($input,$rules,$message);
if($validator->passes()){
$re = Category::create($input);
if($re){
return redirect('admin/category');
}else{
return back()->with('errors','数据填充失败,请稍后重试!');
}
}else{
return back()->withErrors($validator);
}
}
模板页添加如下信息用于显示错误提示消息
@if(count($errors)>0)
<div class="mark">
@if(is_object($errors))
@foreach($errors->all() as $error)
<p>{{$error}}</p>
@endforeach
@else
<p>{{$errors}}</p>
@endif
</div>
@endif
使用create()方法填充数据须在模型中声明
protected $guarded=[‘a’,‘b’….];或protected $fillable=[‘a’,‘b’….];
后