Lumen企业站内容管理实战 - 新增文章分类

文章分类

 我们从路由开始,新建几个路由:新增分类、编辑分类、删除分类、新增子分类、分类状态开启和关闭这五个路由

<?php

$router->group(['namespace' => 'Admin', 'prefix' => 'admin'], function () use ($router) {

    $router->addRoute(['GET', 'POST'], '/login', 'AuthController@login'); // 登录
    $router->addRoute(['GET', 'POST'], '/index', 'IndexController@index');
    $router->get('/welcome', 'WelcomeController@index');
    $router->addRoute(['GET', 'POST'], '/siteSetting', 'SiteSettingController@set'); // 网站设置
    $router->post('/upload', 'UploadController@file'); // 文件上传

    // 文章分类
    $router->addRoute(['GET', 'POST'], '/category/add', 'CategoryController@add'); // 添加文章分类
    $router->addRoute(['GET', 'POST'], '/category/addChild/{id:[1-9]+}', 'CategoryController@addChild'); // 添加文章子分类
    $router->addRoute(['GET', 'POST'],'/category/edit/{id:[1-9]+}', 'CategoryController@edit'); // 编辑文章分类
    $router->get('/category/list', 'CategoryController@lists'); // 文章分类列表
    $router->post('/category/del/{id:[1-9]+}', 'CategoryController@del'); // 删除文章分类
    $router->post('/category/status/{id:[1-9]+}', 'CategoryController@status'); // 更改状态status

});

在app/Http/Controllers/Admin/目录下建立一个控制器,写五个方法。编辑、删除、更改状态三个路由中有个{id:[1-9]+},是指路由的最后要跟上一个数字,其他类型的数据不行,必须数字,[0-9]+是个正则表达式,代表必须是一个或多个数字且不能为空或者为0。

在resources/views/admin/目录下建立一个category视图

把x-admin多级分类的html代码复制到category.blade.php文件中

我们还没有category的数据表,那就用数据迁移生成一个。在命令行工具下执行命令

php artisan make:migration create_categories_table

然后在/database/migrations/目录下会有一个新的文件生成,打开新生成的文件,在up()方法中添加

public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedTinyInteger('type')->default(1)->comment('类型,1:列表,2:单页');
            $table->unsignedInteger('parent_id')->default(0)->comment('父类分类ID');
            $table->string('name',20)->default('')->comment('分类名称');
            $table->string('dir_name',20)->default('')->comment('目录名称');
            $table->string('pic',50)->default('')->comment('图片');
            $table->unsignedTinyInteger('is_nav')->default(1)->comment('是否作为导航');
            $table->unsignedInteger('sort')->default(0)->comment('排序');
            $table->unsignedInteger('is_del')->default(0)->comment('是否已经删除,0:未删除,1:已删除');
            $table->timestamps();
        });
    }

在命令行工具上执行

php artisan migrate

成功了!

数据表有了,我们就建立一个相对应的模型

在/app/Models/目录下,建立一个Category模型,写个新增的方法

<?php

namespace App\Models;


use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    public static function add(array $data)
    {
        $category = new Category();
        !empty($data['type']) && $category->type = (int)$data['type'];
        !empty($data['parent_id']) && $category->parent_id = (int)$data['parent_id'];
        !empty($data['name']) && $category->name = $data['name'];
        !empty($data['dir_name']) && $category->dir_name = $data['dir_name'];
        !empty($data['pic']) && $category->pic = $data['pic'];
        !empty($data['is_nav']) && $category->is_nav = (int)$data['is_nav'];
        !empty($data['sort']) && $category->sort = (int)$data['sort'];
        return $category->save();
    }
}

我们到Category控制器中,我们添加一个方法

<?php

namespace App\Http\Controllers\Admin;


use App\Http\Controllers\Controller;
use App\Models\Category;
use Illuminate\Http\Request;

class CategoryController extends Controller
{

    /**
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function add(Request $request)
    {

        if($request->post()){

            // todo 对表单提交的数据进行验证;分类名称不能重复做验证

            Category::add($request->input());
            return $this->response->responseJSON();
        }

        return view('admin.category.addCategory');

    }
}

在/resources/views/admin/目录下新建一个category目录,新建一个addCategory.blade.php文件,用于提交表单,保存主分类信息。代码如下

<!DOCTYPE html>
<html class="x-admin-sm">

<head>
    <meta charset="UTF-8">
    <title>添加文章分类</title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport"
          content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi"/>
    <link rel="stylesheet" href="/css/font.css">
    <link rel="stylesheet" href="/css/xadmin.css">
    <script type="text/javascript" src="/lib/layui/layui.js" charset="utf-8"></script>
    <script type="text/javascript" src="/js/xadmin.js"></script>
    <!-- 让IE8/9支持媒体查询,从而兼容栅格 -->
    <!--[if lt IE 9]>
    <script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
    <script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
</head>
<body>
<div class="layui-fluid" style="width: 50%">
    <div class="layui-row">
        <form class="layui-form">
            <div class="layui-form-item">
                <label for="name" class="layui-form-label">
                    <span class="x-red">*</span>分类名称
                </label>
                <div class="layui-input-inline">
                    <input type="text" id="name" name="name" required="" lay-verify="required"
                           autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-form-item">
                <label for="dir_name" class="layui-form-label">
                    <span class="x-red">*</span>目录名称
                </label>
                <div class="layui-input-inline">
                    <input type="text" id="dir_name" name="dir_name" required="" lay-verify="required"
                           autocomplete="off" class="layui-input" >
                </div>
            </div>
            <div class="layui-form-item">
                <label for="is_nav" class="layui-form-label">
                    类型
                </label>
                <div class="layui-input-inline">
                    <input type="radio" name="type" value="1" title="列表" checked>
                    <input type="radio" name="type" value="2" title="单页" >
                </div>
            </div>
            <div class="layui-form-item">
                <label for="pic" class="layui-form-label">
                   图片
                </label>
                <button type="button" class="layui-btn" id="L_pic" required="" lay-verify="logo" autocomplete="off">
                    <i class="layui-icon">&#xe67c;</i>上传图片
                </button>
                <input type="hidden" id="i_pic" name="pic" value="">
                <img id="pic" src="" style="margin-top: 20px; width: 300px;  @if(empty($data['logo'])) display: none @endif">
            </div>

            <div class="layui-form-item">
                <label for="is_nav" class="layui-form-label">
                    作为导航
                </label>
                <div class="layui-input-inline">
                    <input type="radio" name="is_nav" value="" title="是" checked>
                    <input type="radio" name="is_nav" value="女" title="否" >
                </div>
            </div>

            <div class="layui-form-item">
                <label for="L_repass" class="layui-form-label">
                </label>
                <button class="layui-btn" lay-filter="add" lay-submit="">
                    增加
                </button>
            </div>
        </form>
    </div>
</div>
<script>layui.use(['form', 'layer', 'jquery', 'upload'],
        function () {
            $ = layui.jquery;
            var form = layui.form,
                layer = layui.layer;

            //自定义验证规则
            form.verify({
                name: function (value) {
                    if (value.length < 1) {
                        return '分类名称至少1个字符';
                    }
                },
                dir_name: function (value) {
                if (value.length < 1) {
                    return '目录名至少一个字符';
                }
            },
            });

            //监听提交
            form.on('submit(add)',
                function (data) {
                    console.log(data);
                    //发异步,把数据提交给php
                    $.post('/admin/category/add',data.field,function (data) {
                        console.log(data);

                        layer.alert(data.msg, {
                                icon: 6
                            },
                            function () {
                                //关闭当前frame
                                xadmin.close();

                                // 可以对父窗口进行刷新
                                xadmin.father_reload();
                            });
                        return false;
                    });
                    return false;
                });


            var upload = layui.upload;
            //执行实例
            var uploadInst = upload.render({
                elem: '#L_pic' //绑定元素
                , url: '/admin/upload/' //上传接口
                , done: function (res) {

                    //上传完毕回调
                    if (res.code === 200) {
                        $('#i_pic').val(res.data.file);
                        $('#pic').attr('src', res.data.file).show();
                    }

                }
                , error: function () {
                    //请求异常回调
                }
            });

        });</script>

</body>

</html>

刷新页面,增加一条数据看看

数据表中也有保存到了数据。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangpeng52758

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值