Laravel框架实战项目Blog

文章分类

  • 后台文章分类列表页模板导的详细步骤
    • 建立数据表blog_category,并添加相应的文章字段
    • 使用php artisan make:model Category命令,创建Category.php模型文件,并编写对应的属性代码
    • Admin文件下使用php artisan make:controller CategoryController命令创建基于CommonControllerCategoryController控制器
    • 在路由文件routes.php中配置文章分类的资源路由,代码如下
    // 文章分类路由
    Route::resource('category', 'CategoryController');
    
    • 使用php artisan route:list命令找到对文章分类进行CRUD的方法,写到CategoryController控制器中,具体方法代码如下
    //get.admin/category  全部分类列表
    public function index()
    {
        $categorys = Category::all();
        return view('admin.category.index')->with('data',$categorys);
    }
    
    //post.admin/category
    public function store()
    {
    
    }
    
    //get.admin/category/create   添加分类
    public function create()
    {
    
    }
    
    //get.admin/category/{category}  显示单个分类信息
    public function show()
    {
    
    }
    
    //delete.admin/category/{category}   删除单个分类
    public function destroy()
    {
    
    }
    
    //put.admin/category/{category}    更新分类
    public function update()
    {
    
    }
    
    //get.admin/category/{category}/edit  编辑分类
    public function edit()
    {
    
    }
    
    • 将视图模板中的list.html拷贝到admin下新建的文件category下,并重新命名为index.blade.php,并利用admin.blade.php重新调整代码结构
  • 基本信息展示的详细步骤
    • index.blade.php中修改导航栏的链接为<a href="{{url('admin/info')}}">首页</a> &raquo; 全部分类
    • 根据控制器中传过来的数据调整<table></table>标签的内容和格式,具体代码如下:
    <table class="list_tab">
        <tr>
            <th class="tc" width="5%">排序</th>
            <th class="tc" width="5%">ID</th>
            <th>分类名称</th>
            <th>标题</th>
            <th>查看次数</th>
            <th>操作</th>
        </tr>
    
        @foreach($data as $v)
        <tr>
            <td class="tc">
                <input type="text" name="ord[]" 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="#">修改</a>
                <a href="#">删除</a>
            </td>
        </tr>
        @endforeach
    </table>
    
  • 后台文章分类页多级分类列表的详细步骤
    • 给数据表blog_category,添加相应的二级分类字段
    • Category.php模型文件中添加如下方法
    /*
     * 获取分类列表数据
     */
    public function tree()
    {
        $categorys = $this->all();
        return $this->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;
    }
    
    • CategoryController.php文件中修改全部分类的方法index,具体代码如下
    //get.admin/category  全部分类列表
    public function index()
    {
        $categorys = (new Category)->tree();
        return view('admin.category.index')->with('data',$categorys);
    }
    
    • 将视图模板下的admin下的category下的index.blade.php中的展示分类名称的行改为
    <td>
        <a href="#">{{$v->_cate_name}}</a>
    </td>
    
  • 后台文章分类页Ajax异步修改分类排序的详细步骤
    • 在路由文件routes.php中配置修改文章分类排序的路由,代码如下
    // 修改文章分类排序路由
    Route::post('cate/changeorder', 'CategoryController@changeOrder');
    
    • CategoryController.php文件中编写修改文章分类排序的方法changeOrder,具体代码如下
    // 修改文章分类排序
    public function changeOrder()
    {
        $input = Input::all();
        $cate = Category::find($input['cate_id']);
        $cate->cate_order = $input['cate_order'];
        $res = $cate->update();
        if ($res) {
            $data = [
                'status' => 0,
                'msg' => '分类排序更新成功!',
            ];
        } else {
            $data = [
                'status' => 1,
                'msg' => '分类排序更新失败,请稍后重试!',
            ];
        }
        return $data;
    }
    
    • layer文件拷贝到resources下的org
    • layer文件下的layer.js引入到视图模板views下的layouts下的公共php文件admin.blade.php中,具体代码如下
    <script type="text/javascript" src="{{asset('resources/org/layer/layer.js')}}"></script>
    
    • 将视图模板下的admin下的category下的index.blade.php中的展示分类排序的行改为
    <td class="tc">
        <input type="text" onchange="changeOrder(this,{{$v->cate_id}})" value="{{$v->cate_order}}">
    </td>
    
    • 在视图模板下的admin下的category下的index.blade.php中添加如下js代码
    <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});
            }
        });
    }
    

</script>
* 在`Category.php`模型文件中修改获取分类列表数据的方法(按照排序的升序进行获取数据),具体代码如下objc
/*
* 获取分类列表数据
*/
public function tree()
{
$categorys = $this->orderBy('cate_order','asc')->get();
return $this->getTree($categorys,'cate_name','cate_id','cate_pid');
}
```

  • 后台文章分类添加模板分配的详细步骤
    • 将视图模板中的add.html拷贝到category下并修改名称为add.blade.php,并利用admin.blade.php重新调整代码结构
    • 根据数据库中blog_category表的字段设计页面<table></table>的内容
    • 修改导航栏的链接
    • CategoryController.phpcreate方法中返回add.blade.php视图
  • 后台文章父级分类嵌入的详细步骤
    • 修改CategoryController.phpcreate方法,具体代码如下
    //get.admin/category/create   添加分类
    public function create()
    {
        $data = Category::where('cate_pid',0)->get();
        return view('admin.category.add',compact('data'));
    }
    
    • 编写CategoryController.phpstore方法,具体代码如下
    //post.admin/category   添加分类提交
    public function store()
    {
        $input = Input::all();
        dd($input);
    }
    
    • add.blade.php文件中修改父级分类选项的代码,具体如下
    <select name="cate_pid">
        <option value="0">==顶级分类==</option>
        @foreach($data as $d)
            <option value="{{$d->cate_id}}">{{$d->cate_name}}</option>
        @endforeach
    </select>
    
  • 后台文章分类添加数据Validation验证的详细步骤
    • CategoryController.php文件中的添加分类提交的方法store中,进行后台文章分类添加数据Validation验证,具体代码如下
    //post.admin/category   添加分类提交
    public function store()
    {
        $input = Input::except('_token');
        $rules = [
            'cate_name' => 'required',
        ];
        $message = [
            'cate_name.required' => '分类名称不能为空!',
        ];
    
        // 表单输入验证
        $validator = Validator::make($input,$rules,$message);
    
        if ($validator->passes()) {
            return redirect('admin/category');
        } else {
            return back()->withErrors($validator);
        }
    }
    
    • add.blade.php文件写上验证错误信息提示的代码,具体如下
  • 后台文章分类编辑的详细步骤
    • CategoryController.php文件中编写edit方法,具体代码如下
    //get.admin/category/{category}/edit  编辑分类
    public function edit($cate_id)
    {
        $field = Category::find($cate_id);
        $data = Category::where('cate_pid',0)->get();
        return view('admin.category.edit',compact('field','data'));
    }
    
    • 拷贝add.blade.php到当前文件并修改名称为edit.blade.php,并修改编辑选项的value
    • 修改edit.blade.php文件中的顶级分类代码如下
<select name="cate_pid">
    <option value="0">==顶级分类==</option>
    @foreach($data as $d)
        <option value="{{$d->cate_id}}"
                @if($d->cate_id==$field->cate_pid) selected @endif
        >{{$d->cate_name}}</option>
    @endforeach
</select>
* 修改`category`下的`index.blade.php`中的修改选项的链接为`<a href="{{url('admin/category/'.$v->cate_id.'/edit')}}">修改</a>`
  • 后台文章分类模拟PUT方法提交表单的象征步骤
    • CategoryController.php文件中编写update方法,具体代码如下
    //put.admin/category/{category}    更新分类
    public function update($cate_id)
    {
        $input = Input::except('_token','_method');
        $re = Category::where('cate_id',$cate_id)->update($input);
        if($re){
            return redirect('admin/category');
        }else{
            return back()->with('errors','分类信息更新失败,请稍后重试!');
        }
    }
    
    • edit.blade.php文件中的<form></form>标签中添加如下代码
    <input type="hidden" name="_method" value="put">
    {{csrf_field()}}
    
  • 后台文章分类删除及Ajax异步模拟DELETE方法的详细步骤
    • CategoryController.phpdestory方法中添加如下代码
    //delete.admin/category/{category}   删除单个分类
    public function destroy($cate_id)
    {
        $res = Category::where('cate_id',$cate_id)->delete();
    
        // 删除顶级分类时,底下的分类变成顶级分类
        Category::where('cate_pid',$cate_id)->update(['cate_pid'=>0]);
    
        if ($res) {
            $data = [
                'status' => 0,
                'msg' => '分类删除成功!',
            ];
        } else {
            $data = [
                'status' => 1,
                'msg' => '分类删除失败,请稍后重试!',
            ];
        }
        return $data;
    }
    
    • category下的index.blade.php文件中修改删除的链接为<a href="javascript:;" onclick="delCate({{$v->cate_id}})">删除</a>,并添加删除分类的JS代码,具体代码如下
    // 删除分类
    function delCate(cate_id) {
        layer.confirm('您确定要删除这个分类吗?', {
            btn:['确定', '取消']
        }, function(){
            $.post("{{url('admin/category')}}/"+cate_id,{'_method':'delete','_token':"{{csrf_token()}}"}, function (data) {
                if(data.status == 0) {
                    location.href = location.href;
                    layer.msg(data.msg, {icon:6});
                } else {
                    layer.msg(data.msg, {icon:5});
                }
            })
        });
    }
    
    • 修改category下的各个文件的页面布局

文章

  • 数据库文章表的创建及添加文章模板导入的详细步骤
    • 新建数据表blog_article
    • 使用命令php artisan make:controller ArticleController创建文章控制器
    • route.php文件中配置文章的资源路由,具体代码如下
    // 文章资源路由
    Route::resource('article', 'ArticleController');
    
    • ArticleController控制器中添加全部文章列表index方法,具体代码如下
    //get.admin/article  全部文章列表
    public function index()
    {
        echo '全部文章列表';
    }
    
    • resources下的views下的admin下新建文件article,并拷贝category下的add.blade.php到该文件下,做文字显示的修改工作
    • ArticleController控制器中添加文章create方法,具体代码如下
    //get.admin/article  全部文章列表
    //get.admin/article/create   添加文章
    public function create()
    {
        $data = [];
        return view('admin.article.add',compact('data'));
    }
    
  • 后台文章添加及百度编辑器Ueditor嵌入的详细步骤
    • 将下载好的编辑器的文件夹拷贝到resources下的org下,并重新命名为ueditor
    • 修改resources下的views下的admin下的article下的add.blade.php文件中的<table></table>里面的代码,具体代码如下
    <table class="add_tab">
        <tbody>
        <tr>
            <th width="120">分类:</th>
            <td>
                <select name="cate_id">
                    @foreach($data as $d)
                    <option value="{{$d->cate_id}}">{{$d->_cate_name}}</option>
                    @endforeach
                </select>
            </td>
        </tr>
        <tr>
            <th><i class="require">*</i> 文章标题:</th>
            <td>
                <input type="text" class="lg" name="art_title">
            </td>
        </tr>
        <tr>
            <th>编辑:</th>
            <td>
                <input type="text" class="sm" name="art_editor">
            </td>
        </tr>
        <tr>
            <th>缩略图:</th>
            <td>
                <input type="text" size="50" name="art_thumb">
            </td>
        </tr>
        <tr>
            <th>关键词:</th>
            <td>
                <input type="text" class="lg" name="art_tag">
            </td>
        </tr>
        <tr>
            <th>描述:</th>
            <td>
                <textarea name="art_description"></textarea>
            </td>
        </tr>
    
        <tr>
            <th>文章内容:</th>
            <td>
                <script type="text/javascript" charset="utf-8" src="{{asset('resources/org/ueditor/ueditor.config.js')}}"></script>
                <script type="text/javascript" charset="utf-8" src="{{asset('resources/org/ueditor/ueditor.all.min.js')}}"> </script>
                <script type="text/javascript" charset="utf-8" src="{{asset('resources/org/ueditor/lang/zh-cn/zh-cn.js')}}"></script>
                <script id="editor" name="art_content" type="text/plain" style="width:860px;height:500px;"></script>
                <script type="text/javascript">
                    var ue = UE.getEditor('editor');
                </script>
                <style>
                    .edui-default{line-height: 28px;}
                    div.edui-combox-body,div.edui-button-body,div.edui-splitbutton-body
                    {overflow: hidden; height:20px;}
                    div.edui-box{overflow: hidden; height:22px;}
                </style>
            </td>
        </tr>
    
        <tr>
            <th></th>
            <td>
                <input type="submit" value="提交">
                <input type="button" class="back" onclick="history.go(-1)" value="返回">
            </td>
        </tr>
        </tbody>
    </table>
    
    • 在数据表blog_article中添加cate_id文章分类字段
    • ArticleController控制器中修改添加文章create方法,具体代码如下
    //get.admin/article/create   添加文章
    public function create()
    {
        $data = (new Category)->tree();
        return view('admin.article.add',compact('data'));
    }
    
  • 后台文章添加缩略图上传之uploadify插件引入的详细步骤
    • 将下载好的uploadify插件的文件夹拷贝到resources下的org
    • 修改resources下的views下的admin下的article下的add.blade.php文件中的缩略图部分的代码,具体代码如下
    <th>缩略图:</th>
        <td>
            <input type="text" size="50" name="art_thumb">
            <input id="file_upload" name="file_upload" type="file" multiple="true">
            <script src="{{asset('resources/org/uploadify/jquery.uploadify.min.js')}}" type="text/javascript"></script>
            <link rel="stylesheet" type="text/css" href="{{asset('resources/org/uploadify/uploadify.css')}}">
            <script type="text/javascript">
                <?php $timestamp = time();?>
                $(function() {
                    $('#file_upload').uploadify({
                        'buttonText' : '图片上传',
                        'formData'     : {
                            'timestamp' : '<?php echo $timestamp;?>',
                            '_token'     : "{{csrf_token()}}"
                        },
                        'swf'      : "{{asset('resources/org/uploadify/uploadify.swf')}}",
                        'uploader' : "{{url('admin/upload')}}"
                    });
                });
            </script>
            <style>
                .uploadify{display:inline-block;}
                .uploadify-button{border:none; border-radius:5px; margin-top:8px;}
                table.add_tab tr td span.uploadify-button-text{color: #FFF; margin:0;}
            </style>
        </td>
    
  • 后台文章添加缩略图上传之文件存储的详步骤
    • 修改commonController.php中的upload方法,具体代码如下
    //图片上传
    public function upload()
    {
        $file = Input::file('Filedata');
        if ($file -> isValid()) {
            $entension = $file -> getClientOriginalExtension();
            // 上传文件的后缀
            $newName = date('YmdHis').mt_rand(100,999).'.'.$entension;
            // 上传文件的路径
            $path = $file -> move(base_path().'/uploads',$newName);
            $filepath = 'uploads/'.$newName;
            return $filepath;
        }
    }
    
    • 修改resources下的views下的admin下的article下的add.blade.php文件中的缩略图部分的代码,具体代码如下
    <tr>
        <th>缩略图:</th>
        <td>
            <input type="text" size="50" name="art_thumb">
            <input id="file_upload" name="file_upload" type="file" multiple="true">
            <script src="{{asset('resources/org/uploadify/jquery.uploadify.min.js')}}" type="text/javascript"></script>
            <link rel="stylesheet" type="text/css" href="{{asset('resources/org/uploadify/uploadify.css')}}">
            <script type="text/javascript">
                <?php $timestamp = time();?>
                $(function() {
                    $('#file_upload').uploadify({
                        'buttonText' : '图片上传',
                        'formData'     : {
                            'timestamp' : '<?php echo $timestamp;?>',
                            '_token'     : "{{csrf_token()}}"
                        },
                        'swf'      : "{{asset('resources/org/uploadify/uploadify.swf')}}",
                        'uploader' : "{{url('admin/upload')}}",
                        'onUploadSuccess' : function(file, data, response) {
                            $('input[name=art_thumb]').val(data);
                            $('#art_thumb_img').attr('src','/'+data);
                        }
                    });
                });
            </script>
            <style>
                .uploadify{display:inline-block;}
                .uploadify-button{border:none; border-radius:5px; margin-top:8px;}
                table.add_tab tr td span.uploadify-button-text{color: #FFF; margin:0;}
            </style>
        </td>
    </tr>
    
  • 后台文章添加数据及Validation验证的详细步骤
    • 使用命令php artisan make:mode Article创建文章模型
    • 修改文章模型的命名空间并添加相应的属性
    • ArticleController.php文章控制器中添加添加文章提交的方法store,具体代码如下
    //post.admin/article  添加文章提交
    public function store()
    {
        $input = Input::except('_token');
        $input['art_time'] = time();
    
        $rules = [
            'art_title'=>'required',
            'art_content'=>'required',
        ];
    
        $message = [
            'art_title.required'=>'文章名称不能为空!',
            'art_content.required'=>'文章内容不能为空!',
        ];
    
        $validator = Validator::make($input,$rules,$message);
    
        if($validator->passes()){
            $re = Article::create($input);
            if($re){
                return redirect('admin/article');
            }else{
                return back()->with('errors','数据填充失败,请稍后重试!');
            }
        }else{
            return back()->withErrors($validator);
        }
    }
    
  • 后台文章页列表展示及分页功能实现的详细步骤
    • ArticleController.php文章控制器中修改全部文章列表的方法index,具体代码如下
    //get.admin/article  全部文章列表
    public function index()
    {
        $data = Article::orderBy('art_id','desc')->paginate(1);
        return view('admin.article.index',compact('data'));
    }
    
    • 将视图模板中的list.html拷贝到article下并重新命名为为index.blade.php,并利用admin.blade.php重新调整代码结构,其中form表单中和样式布局的具体代码如下
    <form action="#" method="post">
        <div class="result_wrap">
            <!--快捷导航 开始-->
            <div class="result_title">
                <h3>文章列表</h3>
            </div>
            <div class="result_content">
                <div class="short_wrap">
                    <a href="{{url('admin/article/create')}}"><i class="fa fa-plus"></i>添加文章</a>
                    <a href="{{url('admin/article')}}"><i class="fa fa-recycle"></i>全部文章</a>
                </div>
            </div>
            <!--快捷导航 结束-->
        </div>
    
        <div class="result_wrap">
            <div class="result_content">
                <table class="list_tab">
                    <tr>
                        <th class="tc">ID</th>
                        <th>标题</th>
                        <th>点击</th>
                        <th>编辑</th>
                        <th>发布时间</th>
                        <th>操作</th>
                    </tr>
                    @foreach($data as $v)
                        <tr>
                            <td class="tc">{{$v->art_id}}</td>
                            <td>
                                <a href="#">{{$v->art_title}}</a>
                            </td>
                            <td>{{$v->art_view}}</td>
                            <td>{{$v->art_editor}}</td>
                            <td>{{date('Y-m-d',$v->art_time)}}</td>
                            <td>
                                <a href="{{url('admin/article/'.$v->art_id.'/edit')}}">修改</a>
                                <a href="javascript:;" onclick="delArt({{$v->art_id}})">删除</a>
                            </td>
                        </tr>
                    @endforeach
                </table>
    
                <div class="page_list">
                    {{$data->links()}}
                </div>
            </div>
        </div>
    </form>
    <style>
        .result_content ul li span {
            font-size: 15px;
            padding: 6px 12px;
        }
    </style>
    
  • 后台文章编辑的详细步骤
    • ArticleController.php文章控制器中添加编辑文章列表的方法edit,具体代码如下
    //get.admin/article/{article}/edit  编辑文章
    public function edit($art_id)
    {
        $data = (new Category)->tree();
        $field = Article::find($art_id);
        return view('admin.article.edit',compact('data','field'));
    }
    
    • 拷贝视图模板article下的add.blade.php并重新命名为为edit.blade.php,并利用admin.blade.php重新调整代码结构,其中form表单中和样式布局的具体代码如下
    <form action="{{url('admin/article/'.$field->art_id)}}" method="post">
        <input type="hidden" name="_method" value="put">
        {{csrf_field()}}
        <table class="add_tab">
            <tbody>
            <tr>
                <th width="120">分类:</th>
                <td>
                    <select name="cate_id">
                        @foreach($data as $d)
                            <option value="{{$d->cate_id}}"
                                    @if($field->cate_id==$d->cate_id) selected @endif
                            >{{$d->_cate_name}}</option>
                        @endforeach
                    </select>
                </td>
            </tr>
            <tr>
                <th><i class="require">*</i> 文章标题:</th>
                <td>
                    <input type="text" class="lg" name="art_title" value="{{$field->art_title}}">
                </td>
            </tr>
            <tr>
                <th>编辑:</th>
                <td>
                    <input type="text" class="sm" name="art_editor" value="{{$field->art_editor}}">
                </td>
            </tr>
            <tr>
                <th>缩略图:</th>
                <td>
                    <input type="text" size="50" name="art_thumb" value="{{$field->art_thumb}}">
                    <input id="file_upload" name="file_upload" type="file" multiple="true">
                    <script src="{{asset('resources/org/uploadify/jquery.uploadify.min.js')}}" type="text/javascript"></script>
                    <link rel="stylesheet" type="text/css" href="{{asset('resources/org/uploadify/uploadify.css')}}">
                    <script type="text/javascript">
                        <?php $timestamp = time();?>
                        $(function() {
                            $('#file_upload').uploadify({
                                'buttonText' : '图片上传',
                                'formData'     : {
                                    'timestamp' : '<?php echo $timestamp;?>',
                                    '_token'     : "{{csrf_token()}}"
                                },
                                'swf'      : "{{asset('resources/org/uploadify/uploadify.swf')}}",
                                'uploader' : "{{url('admin/upload')}}",
                                'onUploadSuccess' : function(file, data, response) {
                                    $('input[name=art_thumb]').val(data);
                                    $('#art_thumb_img').attr('src','/blog/'+data);
    

// alert(data);
}
});
});
</script>
<style>
.uploadify{display:inline-block;}
.uploadify-button{border:none; border-radius:5px; margin-top:8px;}
table.add_tab tr td span.uploadify-button-text{color: #FFF; margin:0;}
</style>
</td>
</tr>
<tr>
<th></th>
<td>
<img alt="" id="art_thumb_img" style="max-width: 350px; max-height:100px;" src="/blog/{{$field->art_thumb}}">
</td>
</tr>
<tr>
<th>关键词:</th>
<td>
<input type="text" class="lg" name="art_tag" value="{{$field->art_tag}}">
</td>
</tr>
<tr>
<th>描述:</th>
<td>
<textarea name="art_description">{{$field->art_description}}</textarea>
</td>
</tr>

        <tr>
            <th>文章内容:</th>
            <td>
                <script type="text/javascript" charset="utf-8" src="{{asset('resources/org/ueditor/ueditor.config.js')}}"></script>
                <script type="text/javascript" charset="utf-8" src="{{asset('resources/org/ueditor/ueditor.all.min.js')}}"> </script>
                <script type="text/javascript" charset="utf-8" src="{{asset('resources/org/ueditor/lang/zh-cn/zh-cn.js')}}"></script>
                <script id="editor" name="art_content" type="text/plain" style="width:860px;height:500px;">{!! $field->art_content !!}</script>
                <script type="text/javascript">
                    var ue = UE.getEditor('editor');
                </script>
                <style>
                    .edui-default{line-height: 28px;}
                    div.edui-combox-body,div.edui-button-body,div.edui-splitbutton-body
                    {overflow: hidden; height:20px;}
                    div.edui-box{overflow: hidden; height:22px;}
                </style>
            </td>
        </tr>

        <tr>
            <th></th>
            <td>
                <input type="submit" value="提交">
                <input type="button" class="back" onclick="history.go(-1)" value="返回">
            </td>
        </tr>
        </tbody>
    </table>
</form>
```
* 将视图模板`article`下的`index.blade.php`中修改的链接改为`<a href="{{url('admin/article/'.$v->art_id.'/edit')}}">修改</a>`
* 在`ArticleController.php`文章控制器中添加编辑文章列表的方法`update`,具体代码如下
```objc
//put.admin/article/{article}    更新文章
public function update($art_id)
{
    $input = Input::except('_token','_method');
    $re = Article::where('art_id',$art_id)->update($input);
    if($re){
        return redirect('admin/article');
    }else{
        return back()->with('errors','文章更新失败,请稍后重试!');
    }
}
```
  • 后台文章删除的详细步骤
    • ArticleController.php文章控制器中添加编辑文章列表的方法destroy,具体代码如下
    //delete.admin/article/{article}   删除单个文章
    public function destroy($art_id)
    {
        $re = Article::where('art_id',$art_id)->delete();
        if($re){
            $data = [
                'status' => 0,
                'msg' => '文章删除成功!',
            ];
        }else{
            $data = [
                'status' => 1,
                'msg' => '文章删除失败,请稍后重试!',
            ];
        }
        return $data;
    }
    
    • 在视图模板article下的index.blade.php添加删除确认的弹框,具体代码如下
    <script>
        //删除分类
        function delArt(art_id) {
            layer.confirm('您确定要删除这篇文章吗?', {
                btn: ['确定','取消'] //按钮
            }, function(){
                $.post("{{url('admin/article/')}}/"+art_id,{'_method':'delete','_token':"{{csrf_token()}}"},function (data) {
                    if(data.status==0){
                        location.href = location.href;
                        layer.msg(data.msg, {icon: 6});
                    }else{
                        layer.msg(data.msg, {icon: 5});
                    }
                });
    

// layer.msg('的确很重要', {icon: 1});
}, function(){

        });
    }
</script>
```
* 将视图模板`article`下的`index.blade.php`中删除的链接改为`<a href="javascript:;" onclick="delArt({{$v->art_id}})">删除</a>`
* 修改视图模板`style`下的`index.blade.php`中左侧列表,具体代码如下
```objc
<ul class="sub_menu">
    <li><a href="{{url('admin/category/create')}}" target="main"><i class="fa fa-fw fa-plus-square"></i>添加分类</a></li>
    <li><a href="{{url('admin/category')}}" target="main"><i class="fa fa-fw fa-list-ul"></i>分类列表</a></li>
    <li><a href="{{url('admin/article/create')}}" target="main"><i class="fa fa-fw fa-plus-square"></i>添加文章</a></li>
    <li><a href="{{url('admin/article')}}" target="main"><i class="fa fa-fw fa-list-ul"></i>文章列表</a></li>
</ul>
```

友情链接模块

  • 友情链接模块使用Migrations数据迁移创建数据表的详细步骤
    • 使用命令php artisan make:migration create_links_table创建数据库迁移文件
    • 数据库迁移文件中的代码如下所示
    public function up()
    {
        Schema::create('links', function (Blueprint $table) {
            $table->engine = 'MyISAM';
            $table->increments('link_id');
            $table->string('link_name')->default('')->comment('//名称');
            $table->string('link_title')->default('')->comment('//标题');
            $table->string('link_url')->default('')->comment('//链接');
            $table->integer('link_order')->default('')->comment('//排序');
        });
    }
    
    public function down()
    {
        Schema::drop('links');
    }
    
    • 使用命令php artisan migrate执行创建数据库迁移文件
  • 友情链接模块使用Seeding填充测试数据的详细步骤
    • 使用php artisan make:seeder LinksTableSeeder命令创建种子文件
    • php artisan make:seeder LinksTableSeeder文件中添加如下代码
    public function run()
    {
        $data = [
            [
                'link_name' => '后盾网',
                'link_title' => '国内口碑最好',
                'link_url' => 'http://www.houdunwang.com',
                'link_order' => 1,
            ],
            [
                'link_name' => '后盾论坛',
                'link_title' => '人人做后盾',
                'link_url' => 'http://bbs.houdunwang.com',
                'link_order' => 2,
            ]
    
        ];
        DB::table('links')->insert($data);
    }
    
    • DatabaseSeeder.php中修改代码,具体如下
    public function run()
    {
         $this->call(LinksTableSeeder::class);
    }
    
    • 使用php artisan db:seed命令执行种子文件,填充测试数据
  • 友情链接模块列表页面展示的详细步骤
    • routes.php中配置友情链接的资源路由,具体代码是Route::resource('links', 'LinksController');
    • 使用命令php artisan make:controller LinksController创建友情链接控制器
    • 使用命令php artisan make:mode Links创建友情链接模型
    • LinksController.php文章控制器中添加全部友情链接列表的方法index,具体代码如下
    //get.admin/links  全部友情链接列表
    public function index()
    {
        $data = Links::orderBy('link_order','asc')->get();
        return view('admin.links.index',compact('data'));
    }
    
    • 拷贝resources文件下的views下的category到当前文件并重新命名为links
    • 修改links下的index.blade.php文件中的代码
  • 友情链接模块Ajax异步修改排序的详细步骤
    • routes.php中配置修改友情链接排序的路由,具体代码是Route::post('links/changeorder', 'LinksController@changeOrder');
    • LinksController.php文章控制器中添加修改友情链接排序的方法changeOrder,具体代码如下
    public function changeOrder()
    {
        $input = Input::all();
        $links = Links::find($input['link_id']);
        $links->link_order = $input['link_order'];
        $re = $links->update();
        if($re){
            $data = [
                'status' => 0,
                'msg' => '友情链接排序更新成功!',
            ];
        }else{
            $data = [
                'status' => 1,
                'msg' => '友情链接排序更新失败,请稍后重试!',
            ];
        }
        return $data;
    }
    
    • LinksController.php文章控制器中添加修改友情链接排序的方法show,具体代码如下
    //get.admin/category/{category}  显示单个分类信息
    public function show()
    {
    
    }
    
    • 修改links下的index.blade.php文件中的代码
  • 友情链接模块之友情链接添加的详细步骤
    • LinksController.php文章控制器中添加全部友情链接列表的方法create,具体代码如下
    //get.admin/links/create   添加友情链接
    public function create()
    {
        return view('admin.links.add');
    }
    
    • 修改links下的add.blade.php文件中的代码
    • LinksController.php文章控制器中添加全部友情链接列表的方法store,具体代码如下
    //post.admin/links   添加友情链接提交
    public function store()
    {
        $input = Input::except('_token');
        $rules = [
            'link_name'=>'required',
            'link_url'=>'required',
        ];
    
        $message = [
            'link_name.required'=>'友情链接名称不能为空!',
            'link_url.required'=>'友情链接URL不能为空!',
        ];
    
        $validator = Validator::make($input,$rules,$message);
    
        if($validator->passes()){
            $re = Links::create($input);
            if($re){
                return redirect('admin/links');
            }else{
                return back()->with('errors','友情链接失败,请稍后重试!');
            }
        }else{
            return back()->withErrors($validator);
        }
    }
    
  • 友情链接模块之友情链接修改的详细步骤
    • LinksController.php友情链接控制器中添加全部友情链接列表的方法edit,具体代码如下
    //get.admin/links/{links}/edit  编辑友情链接
    public function edit($link_id)
    {
        $field = Links::find($link_id);
        return view('admin.links.edit',compact('field'));
    }
    
    • 修改links下的edit.blade.php文件中的代码
    • LinksController.php友情链接控制器中添加全部友情链接列表的方法destroy,具体代码如下
    //delete.admin/links/{links}   删除友情链接
    public function destroy($link_id)
    {
        $re = Links::where('link_id',$link_id)->delete();
        if($re){
            $data = [
                'status' => 0,
                'msg' => '友情链接删除成功!',
            ];
        }else{
            $data = [
                'status' => 1,
                'msg' => '友情链接删除失败,请稍后重试!',
            ];
        }
        return $data;
    }
    
    • links下的index.blade.php文件中添加如下的代码
    //删除友情链接
        function delLinks(link_id) {
            layer.confirm('您确定要删除这个链接吗?', {
                btn: ['确定','取消'] //按钮
            }, function(){
                $.post("{{url('admin/links/')}}/"+link_id,{'_method':'delete','_token':"{{csrf_token()}}"},function (data) {
                    if(data.status==0){
                        location.href = location.href;
                        layer.msg(data.msg, {icon: 6});
                    }else{
                        layer.msg(data.msg, {icon: 5});
                    }
                });
    

// layer.msg('的确很重要', {icon: 1});
}, function(){

        });
    }
```
  • style下的index.blade.php文件中修改系统设置下的代码具体的代码如下
    <ul class="sub_menu " style="display: block;">
        <li><a href="{{url('admin/links')}}" target="main"><i class="fa fa-fw fa-cubes"></i>友情链接</a></li>
        <li><a href="#" target="main"><i class="fa fa-fw fa-database"></i>备份还原</a></li>
    </ul>
    

自定义导航模块

  • 在友情链接模块基础上完成自定义导航模块的详细步骤
    • 创建数据表blog_liks
    • 分别在对应的控制器,模型和视图文件下进行拷贝,并做相应的修改

网站配置模块

  • 数据表创建
    • 创建数据表名为blog_config,并添加相应的数据表字段
  • 添加网站配置项
    • route.php文件中配置网站配置的资源路由
    // 网站配置的资源路由
    Route::resource('config', 'ConfigController');
    
    • 拷贝LinksController.php友情链接控制器到当前文件内并重新命名为ConfigController.php,并修改网站配置控制器中的代码
    • 拷贝Links.php友情链接模型到当前文件内并重新命名为Config.php,并修改网站配置模型中的代码
    • 拷贝resources下的views下的links友情链接到当前文件内并重新命名为config
    • 修改resources下的views下的config文件下的add.blade.php中的代码
  • 网站配置项列表以及异步修改排序
    • 修改resources下的views下的config文件下的index.blade.php中的代码
    • route.php文件中配置网站配置的资源路由
    // 修改网站配置排序路由
    Route::post('config/changeorder', 'ConfigController@changeOrder');
    
  • 网站配置项修改
    • 修改resources下的views下的config文件下的edit.blade.php中的代码
  • 网站配置值分类类型显示
    • 修改ConfigController.php项目配置控制器的全部配置列表方法index,具体代码如下
    //get.admin/config  全部配置项列表
    public function index()
    {
        $data = Config::orderBy('conf_order','asc')->get();
        foreach ($data as $k=>$v){
            switch ($v->field_type){
                case 'input':
                    $data[$k]->_html = '<input type="text" class="lg" name="conf_content" value="'.$v->conf_content.'">';
                    break;
                case 'textarea':
                    $data[$k]->_html = '<textarea type="text" class="lg" name="conf_content">'.$v->conf_content.'</textarea>';
                    break;
                case 'radio':
                    //1|开启,0|关闭
                    $arr = explode(',',$v->field_value);
                    $str = '';
                    foreach($arr as $m=>$n){
                        //1|开启
                        $r = explode('|',$n);
                        $c = $v->conf_content==$r[0]?' checked ':'';
                        $str .= '<input type="radio" name="conf_content" value="'.$r[0].'"'.$c.'>'.$r[1].' ';
                    }
                    $data[$k]->_html = $str;
                    break;
            }
    
        }
        return view('admin.config.index',compact('data'));
    }
    
    • 修改resources下的views下的config文件下的index.blade.php中的代码,增加配置内容的显示项,在<table></table>标签中添加如下代码
    <td>
        {!! $v->_html !!}
    </td>
    
  • 网站配置值修改
    • 修改resources下的views下的config文件下的index.blade.php中的代码,添加form表单和提交按钮
    <form action="{{url('admin/config/changecontent')}}" method="post">
    <div class="btn_group">
        <input type="submit" value="提交">
        <input type="button" class="back" onclick="history.go(-1)" value="返回" >
    </div>
    </form>
    
    • route.php文件中配置网站配置内容路由
    // 修改网站配置内容路由
    Route::post('config/changecontent', 'ConfigController@changeContent');
    
    • ConfigController.php项目配置控制器添加修改网站配置内容的方法changeContent,具体代码如下
    public function changeContent()
    {
        $input = Input::all();
        foreach($input['conf_id'] as $k=>$v){
            Config::where('conf_id',$v)->update(['conf_content'=>$input['conf_content'][$k]]);
        }
        $this->putFile();
        return back()->with('errors','配置项更新成功!');
    }
    
    • 修改ConfigController.php项目配置控制器中全部配置项列表的方法index,将name="conf_content"改为name="conf_content[]"
    • 修改resources下的views下的config文件下的index.blade.php中的代码,在显示网站配置内容的地方加上如下代码<input type="hidden" name="conf_id[]" value="{{$v->conf_id}}">
  • 生成网站配置项文件
    • 修改ConfigController.php项目配置控制器中添加生成配置文件的方法putFile,具体代码如下
    // 生成配置文件
    public function putFile()
    {
        $config = Config::pluck('conf_content','conf_name')->all();
        $path = base_path().'/config/web.php';
        $str = '<?php return '.var_export($config,true).';';
        file_put_contents($path,$str);
    }
    
    • route.php文件中配置生成配置文路由
    // 生成配置文件的路由
    Route::get('config/putfile', 'ConfigController@putFile');
    
    • ConfigController.php项目配置控制器中的方法changeContentdestroyupdate方法中加上代码$this->putFile();
    • 修改resources下的views下的style文件下的index.blade.php中的代码如下
    <li><a href="{{url('admin/config')}}" target="main"><i class="fa fa-fw fa-cogs"></i>网站配置</a></li>
    

推荐阅读更多精彩内容