Laravel admin 後臺管理外掛的使用

ckxllf發表於2019-09-05

  今天透過使用 laravel-admin 外掛,來簡單說說怎麼優雅的寫 Laravel 程式碼。

  建立 Laravel 專案

  laravel-admin是一個基於laravel的後臺管理開發框架,能幫助你使用很少的時間和程式碼量開發出功能完備的管理後臺,另外它作為一個三方包,可以和框架內其它專案並行開發,真正做到前後臺開發分離。

  我們根據官方文件走,建立一個 Laravel 專案還是很簡單的:

  // 使用 Composer 下載 Laravel 安裝程式

  composer global require "laravel/installer"

  // 建立 web 專案

  laravel new web

  具體配置資料庫等:略

  安裝 laravel-admin

  laravel-admin 是一個可以快速幫你構建後臺管理的工具,它提供的頁面元件和表單元素等功能,能幫助你使用很少的程式碼就實現功能完善的後臺管理功能。

  注:當前版本(1.5)需要安裝 PHP 7+和 Laravel 5.5

  看看 laravel-admin 的特性:

  內建使用者和許可權系統

  model-grid 支援快速構建資料表格

  model-form 支援快速構建資料表單

  model-tree 支援快速構建樹狀資料

  內建 40+ 種 form 元素元件、以及支援擴充套件元件

  支援 Laravel 的多種模型關係

  mysql、mongodb、pgsql 等多資料庫支援

  支援引入第三方前端庫

  資料庫和 artisan 命令列工具的 web 實現

  支援自定義圖表

  多種常用 web 元件

  支援本地和 oss 檔案上傳

  有了這些功能,開發一個後臺管理系統就變得相對簡單了。

  安裝外掛:

  composer require encore/laravel-admin "1.5.*"

  // 釋出資源:

  php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"

  // 安裝

  php artisan admin:install

  簡單的三條命令,即可配置好一個簡單的後臺管理系統,賬號和密碼都是 admin

  程式碼主要集中在\APP\Admin中

  預設系統提供了一個 Dashboard 介面:

  namespace App\Admin\Controllers;

  use App\Http\Controllers\Controller;

  use Encore\Admin\Facades\Admin;

  use Encore\Admin\Layout\Column;

  use Encore\Admin\Layout\Content;

  use Encore\Admin\Layout\Row;

  class HomeController extends Controller

  {

  public function index()

  {

  return Admin::content(function (Content $content) {

  $content->header('Test Dashboard');

  $content->description('Description...');

  $content->row(Dashboard::title());

  $content->row(function (Row $row) {

  $row->column(4, function (Column $column) {

  $column->append(Dashboard::environment());

  });

  $row->column(4, function (Column $column) {

  $column->append(Dashboard::extensions());

  });

  $row->column(4, function (Column $column) {

  $column->append(Dashboard::dependencies());

  });

  });

  });

  }

  }

  結合介面和程式碼,可以看出介面主要分成這麼幾個部分:header、description、兩個 row,後一個 row 包含三個 column 模組;具體的程式碼放在 Dashboard 程式碼中,如下:

  namespace Encore\Admin\Controllers;

  use Encore\Admin\Admin;

  class Dashboard

  {

  /**

  * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View

  */

  public static function title()

  {

  return view('admin::dashboard.title');

  }

  /**

  * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View

  */

  public static function environment()

  {

  $envs = [

  ['name' => 'PHP version', 'value' => 'PHP/'.PHP_VERSION],

  ['name' => 'Laravel version', 'value' => app()->version()],

  ['name' => 'CGI', 'value' => php_sapi_name()],

  ['name' => 'Uname', 'value' => php_uname()],

  ['name' => 'Server', 'value' => array_get($_SERVER, 'SERVER_SOFTWARE')],

  ['name' => 'Cache driver', 'value' => config('cache.default')],

  ['name' => 'Session driver', 'value' => config('session.driver')],

  ['name' => 'Queue driver', 'value' => config('queue.default')],

  ['name' => 'Timezone', 'value' => config('app.timezone')],

  ['name' => 'Locale', 'value' => config('app.locale')],

  ['name' => 'Env', 'value' => config('app.env')],

  ['name' => 'URL', 'value' => config('app.url')],

  ];

  return view('admin::dashboard.environment', compact('envs'));

  }

  /**

  * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View

  */

  public static function extensions()

  {

  $extensions = [

  'helpers' => [

  'name' => 'laravel-admin-ext/helpers',

  'link' => '

  'icon' => 'gears',

  ],

  'log-viewer' => [

  'name' => 'laravel-admin-ext/log-viewer',

  'link' => '

  'icon' => 'database',

  ],

  'backup' => [

  'name' => 'laravel-admin-ext/backup',

  'link' => '

  'icon' => 'copy',

  ],

  'config' => [

  'name' => 'laravel-admin-ext/config',

  'link' => '

  'icon' => 'toggle-on',

  ],

  'api-tester' => [

  'name' => 'laravel-admin-ext/api-tester',

  'link' => '

  'icon' => 'sliders',

  ],

  'media-manager' => [

  'name' => 'laravel-admin-ext/media-manager',

  'link' => '

  'icon' => 'file',

  ],

  'scheduling' => [

  'name' => 'laravel-admin-ext/scheduling',

  'link' => '

  'icon' => 'clock-o',

  ],

  'reporter' => [

  'name' => 'laravel-admin-ext/reporter',

  'link' => '

  'icon' => 'bug',

  ],

  'translation' => [

  'name' => 'laravel-admin-ext/translation',

  'link' => '

  'icon' => 'language',

  ],

  ];

  foreach ($extensions as &$extension) {

  $name = explode('/', $extension['name']);

  $extension['installed'] = array_key_exists(end($name), Admin::$extensions);

  }

  return view('admin::dashboard.extensions', compact('extensions'));

  }

  /**

  * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View

  */

  public static function dependencies()

  {

  $json = file_get_contents(base_path('composer.json'));

  $dependencies = json_decode($json, true)['require'];

  return view('admin::dashboard.dependencies', compact('dependencies'));

  }

  }

  這樣我們就把程式碼分塊的組織在一起。具體佈局類看:class Content implements Renderable

  其它的靜態資原始檔放在 /public/vendor/laravel-admin 目錄下

  禁用建立按鈕

  $grid->disableCreateButton();

  禁用分頁條

  $grid->disablePagination();

  禁用查詢過濾器

  $grid->disableFilter();

  禁用匯出資料按鈕

  $grid->disableExport();

  禁用行操作列

  $grid->disableActions();

  設定分頁選擇器選項

  $grid->perPages([10, 20, 30, 40, 50]);

  model-grid預設有兩個行操作編輯和刪除,可以透過下面的方式關閉它們:

  $grid->actions(function ($actions) {

  // 隱藏刪除按鈕

  $actions->disableDelete();

  // 隱藏修改按鈕

  $actions->disableEdit();

  });

  如果有自定義的操作按鈕,可以透過下面的方式新增:

  $grid->actions(function ($actions) {

  // append一個操作

  $actions->append('');

  // prepend一個操作

  $actions->prepend('');

  });

  獲取主鍵資訊或者獲取當前行的陣列

  $grid->actions(function ($actions) {

  // 當前行的資料陣列

  $row = $actions->row;

  // 獲取當前行主鍵值

  $id = $actions->getKey();

  });

  複製程式碼目前預設實現了批次刪除操作的功能,如果要關掉批次刪除操作:

  $grid->tools(function ($tools) {

  $tools->batch(function ($batch) {

  $batch->disableDelete();

  });

  });

  查詢過濾Filter:如下

  $grid->filter(function ($query) {

  // 去掉預設的id過濾器

  $query->disableIdFilter();

  $query->like('title', '文章標題');

  $query->equal('cate_id', '所屬分類')->select(

  ArticleCategories::pluck('name', 'id')

  );

  });

  form的一些小技巧 :

  $form->text('from', '文章來源')->rules('required') //可以加rules驗證規則

  $form->image('thumb', '文章縮圖')->uniqueName()

  ->move('upload/article/' . date("Ymd"))

  ->options(['overwriteInitial' => true]);//代表新圖片替換修圖片

  ->uniqueName() //為隨機名稱

  //儲存前回撥

  $form->saving(function (Form $form) {

  });

  //儲存後回撥

  $form->saved(function (Form $form) {

  });

  設定表單提交的action

  $form->setAction('admin/users');

  獲取URL中的id

  $shopId = request()->route()->parameter('shop');

  當為新增操作時,店鋪名稱不可和資料庫內其他資料重複

  當為修改操作時,店鋪名稱除自己外不可和資料庫內其他資料重複

  if ($shopId) { 無錫人流醫院哪家好

  $form->text('shop_name', '店鋪名稱')

  ->rules("required|unique:shops,shop_name,{$shopId},id");

  } else {

  $form->text('shop_name', '店鋪名稱')

  ->rules("required|unique:shops");

  }

  進入grid表格時,預設id倒序

  $grid->model()->orderBy('id', 'desc');

  多圖片上傳

  昨天有個朋友在開發一個功能的時候,因為需要用到多圖上傳,問我Laravel_admin怎麼做多圖片上傳,所以我也是檢視文件,但是官方文件基本沒談到,最後還是在外網上找到,今天向大家分享有關使用小技巧。

  我們可以在表單中這樣引用多圖上傳,程式碼如下:

  $form->multipleImage('images', '圖冊')->help('請上傳圖片格式')->removable();

  但是我們用到removeable()方法需要注意在form表單中不能使用MessageBag方法。

  然後在資料模型中,我們必須這樣定義兩個方法,程式碼如下:

  public function getLogoAttribute($value)

  {

  return explode(',', $value);

  }

  public function setLogoAttribute($value)

  {

  $this->attributes['images'] = implode(',', $value);

  }

  完成以上操作,我們便成功的配置完多圖上傳。

  更多內容參考 laravel-admin 官網:

  laravel-admin.org/docs/#/zh/

  總結

  有了 Laravel 和 laravel-admin,基本不用寫什麼程式碼,敲敲幾個命令就可以完成一個「功能比較齊全」的資源操作後臺。極大的方便了我們的開發。

  總體命令列和程式碼如下

  php artisan make:model Movie -m

  php artisan migrate

  composer require fzaninotto/faker

  php artisan make:seeder MovieTableSeeder

  php artisan db:seed --class=MovieTableSeeder

  php artisan admin:make MovieController --model=App\\Movie

  $router->resource('movies', MovieController::class);

  框架和開源外掛,有時候確實是能方便我們開發,所以尋找優質的框架和開源庫也是促進我們生產力的。

  laravel-admin 程式碼是如何組織的,可以具體參考網站開發。先根據官網的介紹,利用好 laravel-admin,然後學習它的原始碼和程式碼設計,最後取其精華,為你所用。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2656104/,如需轉載,請註明出處,否則將追究法律責任。

相關文章