lordjoo/crudi

带有管理面板的 Laravel CRUD 系统

安装: 7

依赖者: 0

建议者: 0

安全: 0

星级: 0

关注者: 2

分支: 1

开放问题: 0

语言:JavaScript

v1.1.7-beta 2021-06-12 08:34 UTC

README

一个实现了现成管理面板的 CRUD 系统的 laravel 包

特性

  • Material Design 管理面板已准备好
  • 完整的 CRUD 系统
  • 支持 Datatables

要求

  • laravel >= 8
  • php >= 7.3

使用方法

安装

  • 使用 composer 安装它,运行 composer require lordjoo/crudi
  • 然后你需要发布资产文件和配置文件,运行 php artisan vendor:publish
  • 然后你需要运行 php artisan migrate 来创建图片表(这个表用于存储与任何其他模型一对一关联的各种图像)

它是如何工作的?

这个库依赖于 两个 主要的东西

  1. CrudiControllerTrait

我们创建了一个具有所有 CRUD 逻辑的 trait,并将其提供给任何控制器使用

  1. CrudiModal

为了使 CRUD 操作更加流畅,我们创建了一个自定义的抽象类 CrudiModel,该类扩展了 Laravel 模型基类

开始使用

假设我们有一个博客,我们需要使用 Crudi 来处理帖子的 CRUD 操作。

  • 首先,我们将创建帖子模型、控制器和迁移
php artisan make:model Post -mc
  • 之后,我们将进入 PostController.php 并使用 CrudiControllerTrait,控制器应该看起来像这样
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Lordjoo\Crudi\Traits\CrudiControllerTrait;

class PostController extends Controller
{
    use CrudiControllerTrait;
}
  • 然后我们必须编辑位于 Models 目录中的 Post.php 的帖子模型,并使其看起来像这样
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Lordjoo\Crudi\Models\CrudiModel;

class Post extends CrudiModel
{
    use HasFactory;
}
  • 之后,你必须打开 routes 目录中的 web.php 文件,为它添加路由。Crudi 提供了一个名为 crudi 的路由宏,将为您定义所有路由的名称、前缀和动作

所以打开 web.php 并添加这一行

Route::crudi('posts', 'posts.',\App\Http\Controllers\PostController::class);

第一个参数是路由前缀,第二个是路由名称前缀,最后一个是目标控制器,Crudi 将为您生成以下路由

  • 现在,我们必须在 PostController 中定义一些必需的属性
    • private $model = App\Models\Post::class 这将持有与此控制器关联的模型
    • private $route = "posts" 这将持有我们刚刚添加为第二个参数的路线名称

现在我们几乎完成了,你可以访问 https://:8001/posts/create,你将得到添加帖子页面,但是页面将是空的。你需要定义帖子字段,我们将通过进入 PostModel 并添加一个 受保护的 属性 fields 来完成这个任务,该属性将是一个二维数组,具有以下形状

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Lordjoo\Crudi\Models\CrudiModel;

class Post extends CrudiModel
{
    use HasFactory;

    /*
     * System use this object to create the form for creating and updating the model
     * Types available :
     * - text
     * - file
     * - textarea
     * - relation_select 
    */

    protected $fields = [
        [
            'type'=>"text", 
            'name'=>"Title",
            'col'=>'name',
        ],
        [
            'type'=>"textarea",
            'name'=>"Body",
            'col'=>'body'
        ],
        [
            'type'=>"image",
            "accept"=>"img",
            'name'=>"Post Thumbnail",
            'col'=>'img_id'
        ],
        [
            'type'=>'relation_select',
            "name"=>"Category",
            'col'=>"category_id",
            "relation" => "category"
        ],  
    ];
}

唯一需要解释的是字段类型中的 relation_select
如你所见,我们定义了一个名为 Category 的字段,它引用了 category 的 id 列,并且这个字段是一个 relation_select,这意味着你将找到一个下拉框,其中包含 categories_table(关系)中的所有项,以选择要附加到帖子上的 category_id

这里还有另一件事,即 帖子图片 字段。Crudi 有一个内置的图片上传功能,因此如果你的任何列应该是图片,只需将其类型设置为 image,crudi 就会负责验证和上传图片。注意,所有图片都存储在 images 表 中,并通过 img_id 相关联,如所示

  • 现在如果您保存并返回到 posts/create 页面,您将找到用于提供数据的输入框

在创建页面点击保存后,您将被重定向回 posts/ 页面,页面中有一个空的表格,只有一个列,该列是项目 ID,但是如何显示每个帖子的所有其他值呢?

我们通过定义另一个名为 $4datatable 的 受保护 属性来简单实现这一点
注意:CRUDI 使用 LARAVEL DATATABLES 来生成 {modae}/page

数据表格控制

CRUDI 使用数据表格在仪表板上列出并显示数据,CRUDI 在模型类中使用一个名为 $dataTable受保护 属性来确定要列出什么以及如何列出

在我们的示例中,我们将编写 $datatable 属性以列出帖子标题、缩略图和类别

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Lordjoo\Crudi\Models\CrudiModel;

class Post extends CrudiModel
{
    use HasFactory;

    protected $dataTable = [
        [
            'data'=>'id',"title"=>"ID"
        ],
        [
            'data'=>"name",'title'=>"Post Title","width"=>200
        ],
        [
            'data'=>"thumbnail_url",'title'=>"Post Photo","render"=>'`<img src="${data}" />`'
        ],
        [
            'data'=>'id','title'=>"Category",'name'=>'category','custom'=>true,"width"=>200
        ]
    ];
 
    protected $datatables_custom = [
        [
            'col'=>"Category",
            "relation"=>"category",
            "relation_col"=>'name'
        ]
    ];
    protected $with = ['category'];
    public function category(){
        return $this->belongsTo(Category::class);
    }

}