從零開始搭建laravel-admin項目

參考文檔

laravel-admin中文文檔
https://laravel-admin.org/docs/zh
laravel文檔
https://laravel-china.org/docs/laravel/5.7
https://laravelacademy.org/laravel-docs-5_7

windows環境下安裝composer,然後使用composer安裝Laravel

參照這篇文章
https://blog.csdn.net/qq_41249766/article/details/81121596

laravel-admin快速開始

laravel-admin框架安裝
https://laravel-admin.org/docs/zh/installation

快速開始

創建model

創建模型實例最簡單的辦法就是使用 Artisan 命令 make:model

php artisan make:model User

如果你想要在生成模型時生成數據庫遷移,可以使用 --migration 或 -m 選項:

php artisan make:model User --migration
php artisan make:model User -m

例:在laravel-admin中創建一個文章model和一個文章類型的model
在app/Admin下新建一個Models的文件夾

php artisan make:model Admin/Models/Article 
php artisan make:model Admin/Models/ArticleType

注意我們並沒有告訴 Eloquent 我們的 Flight 模型使用哪張表,默認規則是小寫的模型類名複數格式作爲與其對應的表名(除非在模型類中明確指定了其它名稱)。

<?php

namespace App\Admin\Models;
use Illuminate\Database\Eloquent\Model;
class ArticleType extends Model
{
    //     * 關聯到模型的數據表
    //     *
    //     * @var string
    //     */
     protected $table = 'article_type';
}

路由器

使用下面的命令來創建一個對應App\Admin\Models\ArticleType模型的路由器

//php artisan admin:make UserController --model=App\\User
// 在windows系統中
php artisan admin:make ArticleTypeController --model=App\Admin\Models\ArticleType 

在laravel-admin的路由配置文件app/Admin/routes.php裏添加一行:

$router->resource('ArticleType', ArticleTypeController::class);

打開http://localhost:8000/admin/auth/menu,添加對應的menu
再具體的修改到生成的Controller進行修改

數據模型樹

要使用model-tree,要遵守約定的表結構:
表結構裏面有三個必要的字段parent_id、order、title,其它字段沒有要求。

<?php

namespace App\Admin\Models;
use Encore\Admin\Traits\AdminBuilder;
use Encore\Admin\Traits\ModelTree;
use Illuminate\Database\Eloquent\Model;
class ArticleType extends Model
{
  use ModelTree, AdminBuilder;
    //     * 關聯到模型的數據表
    //     *
    //     * @var string
    //     */
    protected $table = 'article_type';
    //表結構中的三個字段parent_id、order、title的字段名也是可以修改的:
 	//public function __construct(array $attributes = [])
    //{
    // parent::__construct($attributes);
    // $this->setParentColumn('pid');
    // $this->setOrderColumn('sort');
    // $this->setTitleColumn('name');
    // }    
}

頁面中使用model-tree,在controller修改index

  public function index()
    {
        return Admin::content(function (Content $content) {
            $content->header('樹狀模型');
            $content->body(Category::tree());
        });
    }

修改行數據的顯示

 ArticleType::tree(function ($tree) {
    $tree->branch(function ($branch) {
        $src = config('admin.upload.host') . '/' . $branch['logo'] ;
        $logo = "<img src='$src' style='max-width:30px;max-height:30px' class='img'/>";

        return "{$branch['id']} - {$branch['title']} $logo";
    });
})

修改模型的查詢

   ArticleType::tree(function ($tree) {

    $tree->query(function ($model) {
        return $model->where('type', 1);
    });

})

laravel-admin 報錯 Disk [admin] not configured, please add a disk config in config/filesystems.php.

在config/filesystems.php中添加:

'disks' => [

    'local' => [
        'driver' => 'local',
        'root' => storage_path('app'),
    ],

    'public' => [
        'driver' => 'local',
        'root' => storage_path('app/public'),
        'url' => env('APP_URL').'/storage',
        'visibility' => 'public',
    ],

    's3' => [
        'driver' => 's3',
        'key' => env('AWS_KEY'),
        'secret' => env('AWS_SECRET'),
        'region' => env('AWS_REGION'),
        'bucket' => env('AWS_BUCKET'),
    ],
    //添加如下代碼
    'admin' => [
        'driver'     => 'local',
        'root'       => public_path('upload'),
        'visibility' => 'public',
        'url' => env('APP_URL').'/upload/',
    ],

],

laravel-admin excel導出中文亂碼問題

用默認的導出按鈕,導出的中文有亂碼
vendor\encore\laravel-admin\src\Grid\Exporters\CsvExporter.php

  $headers = [
            'Content-Encoding'    => 'UTF-8',
            'Content-Type'        => 'text/csv;charset=UTF-8',
            'Content-Disposition' => "attachment; filename=\"$filename\"",
        ];
        //添加的代碼
        print(chr(0xEF).chr(0xBB).chr(0xBF));

常見的基本配置

安裝完成之後,會生成兩個配置文件,用來對管理後臺進行配置,config/admin.php和app/Admin/bootstrap.php
https://laravel-admin.org/docs/zh/configuration

自定義帶驗證碼的登錄頁面

安裝驗證碼庫

composer require mews/captcha

修改config/app.php

    'providers' => [
        // ...
        Mews\Captcha\CaptchaServiceProvider::class,
    ]   

     'aliases' => [
        // ...
        'Captcha' => Mews\Captcha\Facades\Captcha::class,
    ]

發佈

  php artisan vendor:publish

修改config/captcha.php的default

 return [
        'default'   => [
            'length'    => 5,
            'width'     => 120,
            'height'    => 36,
            'quality'   => 90,
        ],
        // ...
    ];

修改登錄方法
複製vendor/encore/laravel-admin/src/Controllers/AuthController.php到app/Admin/Controllers/AuthController.php,修改代碼如下:

   <?php

    namespace App\Admin\Controllers;

    use Illuminate\Http\Request;
    use Illuminate\Routing\Controller;
    use Illuminate\Support\Facades\Auth;
    use Illuminate\Support\Facades\Lang;
    use Illuminate\Support\Facades\Redirect;
    use Illuminate\Support\Facades\Validator;

    class AuthController extends Controller
    {
        /**
         * Login page.
         *
         * @return \Illuminate\Contracts\View\Factory|Redirect|\Illuminate\View\View
         */
        public function getLogin()
        {
            if (!Auth::guard('admin')->guest()) {
                return redirect(config('admin.route.prefix'));
            }

            return view('admin.login');
        }

        /**
         * @param Request $request
         *
         * @return mixed
         */
        public function postLogin(Request $request)
        {
            $credentials = $request->only(['username', 'password','captcha']);

            $validator = Validator::make($credentials, [
                'username' => 'required',
                'password' => 'required',
                'captcha' => 'required|captcha'
            ]);

            if ($validator->fails()) {
                return Redirect::back()->withInput()->withErrors($validator);
            }

            unset($credentials['captcha']);

            if (Auth::guard('admin')->attempt($credentials)) {
                admin_toastr(trans('admin.login_successful'));

                return redirect()->intended(config('admin.route.prefix'));
            }

            return Redirect::back()->withInput()->withErrors(['username' => $this->getFailedLoginMessage()]);
        }

        /**
         * @return string|\Symfony\Component\Translation\TranslatorInterface
         */
        protected function getFailedLoginMessage()
        {
            return Lang::has('auth.failed')
                ? trans('auth.failed')
                : 'These credentials do not match our records.';
        }
    }

添加驗證錯誤(根據自己的lang修改); 在resources/lang/zh-CN/validation.php中添加。

  'captcha'               => ':attribute 錯誤',
'attributes'           => [
        'captcha'               => '驗證碼',
        //...
]

複製vendor/encore/laravel-admin/resources/views/login.blade.php到resources/views/admin/login.blade.php。
新增

<div class="form-group has-feedback {!! !$errors->has('password') ?: 'has-error' !!}">

      @if($errors->has('password'))
        @foreach($errors->get('password') as $message)
          <label class="control-label" for="inputError"><i class="fa fa-times-circle-o"></i>{{$message}}</label></br>
        @endforeach
      @endif

      <input type="password" class="form-control" placeholder="{{ trans('admin::lang.password') }}" name="password" value="{{ old('username') }}">
      <span class="glyphicon glyphicon-lock form-control-feedback"></span>
    </div>
    <div class="row">
    <div class="form-group has-feedback {!! !$errors->has('captcha') ?: 'has-error' !!}">

      @if($errors->has('captcha'))
        @foreach($errors->get('captcha') as $message)
          <label class="control-label" for="inputError" style=" margin-left: 15px"><i class="fa fa-times-circle-o"></i>{{$message}}</label></br>
        @endforeach
      @endif

      <input type="text" class="form-control" style="display: inline;width: 55%; margin-left: 15px" placeholder="{{ trans('admin.captcha') }}" name="captcha">
        <span class="glyphicon glyphicon-refresh form-control-feedback captcha" style="right:39%;z-index: 100"></span>
        <img  class="captcha" src="{{ captcha_src('admin') }}" onclick="refresh()">
    </div>
    <script>
        function refresh(){
            $('img[class="captcha"]').attr('src','{{ captcha_src('admin') }}'+Math.random());
        }
    </script>

app/Admin/routes.php中新增,覆蓋原來的路由

 $router->get('auth/login', 'AuthController@getLogin');
 $router->post('auth/login', 'AuthController@postLogin');

語言修改與錯誤提示

在config/app.php設置locale,默認爲en

'locale' => 'zh-CN',//en

在設置完語言以後,打開
resources/lang/zh-CN/ 發現只有一個admin文件夾將en文件夾中的其它四個文件複製進去,不然錯誤提示會提示查找不到文件

單表關聯

在model裏添加關聯表
例:ArticleType通過userid關聯管理員表

 /*** 關聯管理員表 */
    public function admin_user()
    {
        return $this->belongsTo(AdminUser::class,'userid');
    }

在controller裏的grid裏面獲取關聯表的數據

  $grid->admin_user()->username('更新管理員');

查詢過濾

  $grid->filter(function($filter){
    // 去掉默認的id過濾器
    $filter->disableIdFilter();
    // 在這裏添加字段過濾器
    $filter->like('name', 'name');
   // 多條件查詢
	$filter->scope('new', '最近修改')
    ->whereDate('created_at', date('Y-m-d'))
    ->orWhere('updated_at', date('Y-m-d'));
	// 關聯關係查詢
	$filter->scope('address')->whereHas('profile', function ($query) {
    $query->whereNotNull('address');});
    //查詢軟刪除數據
	$filter->scope('trashed', '被軟刪除的數據')->onlyTrashed();
	//radio查詢
 	 $filter->equal('display','展示狀態')->radio([
                ''   => '全部',
                1    => '顯示',
                0   => '隱藏',
            ]);
});

詳情
https://laravel-admin.org/docs/zh/model-grid-filters

獲取當前的管理員的信息

	use Encore\Admin\Facades\Admin;
	//在方法裏調用,獲取當前管理員的id
   Admin::user()->id
	//如果form提交時數據庫需要存入當前管理員的id
	 $form->hidden('userid')->default(Admin::user()->id);

自定義按鈕控件的使用

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

 $grid->actions(function ($actions) {
    $actions->disableDelete();
    $actions->disableEdit();
    $actions->disableView();
});

可以通過傳入的$actions參數來獲取當前行的數據:

 $grid->actions(function ($actions) {
    // 當前行的數據數組
    $actions->row;
    // 獲取當前行主鍵值
    $actions->getKey();
});

如果有自定義的操作按鈕,可以通過下面的方式添加:

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

    // append一個操作
    $actions->append('<a href=""><i class="fa fa-eye"></i></a>');

    // prepend一個操作
    $actions->prepend('<a href=""><i class="fa fa-paper-plane"></i></a>');
});

如果有比較複雜的操作

1.首先先在controller裏面定義按鈕

  $grid->actions(function ($actions) {
            $actions->disableDelete();
            $actions->append(new AuditingInteract($actions->getKey(),$actions->row));
        });

2.在app/Admin/Extentsions下面新建工具類

在這裏插入圖片描述
在工具類裏面進行數據操作

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/12/12
 * Time: 18:22
 */
namespace App\Admin\Extensions;
use Encore\Admin\Admin;

class AuditingInteract
{
    protected $id;
    protected $row;

    public function __construct($id,$row)
    { $this->id = $id;
        $this->row=$row;
        $this->check=$row->check;
    }

    protected function script()
    { return <<<SCRIPT
        $('.AuditingInteact{$this->id}').on('click', function () {
      $.ajax({
        method: 'get',
        url: '/admin/AuditingInteact',
        data: {
            id:{$this->id},
            check:{$this->check}
        },
        success: function () {
        location.href=location.href
        toastr.success('操作成功');
        }
    });
});
SCRIPT;
    }
    protected function render()
    {
       Admin::script($this->script());
      return "<a  data-id='{$this->id}' class='AuditingInteact{$this->id}'>審</a>";
    }
    public function __toString()
    {
        return $this->render();
    }
}

3.在route裏面填寫請求路徑的方法

    $router->get('AuditingInteract', 'TpInvestInteractController@AuditingInteract');

4.在相應Controller裏面創建方法

	use Illuminate\Http\Request;
	 /**審覈*/
    public function AuditingInteract(Request $request)
    {
        $id=$request->id;
        $check=$request->check;
        if($check==0){
            $flight = TpInvestInteract::find($id);
            $flight->check = 1;
            $flight->save();
        }
        if($check==1){
            $flight = TpInvestInteract::find($id);
            $flight->check = 0;
            $flight->save();
        }
    }

時間戳存取 與軟刪除

時間戳

在對應的model中添加,然後再生成controller

 /**
     * 模型日期列的存儲格式
     *
     * @var string
     */
    protected $dateFormat = 'U';

將時間戳格式在grid中顯示爲正常時間格式

  $grid->created_at('創建時間')->display(function ($time){
            if(empty($time)){
                return '——';
            }
            else{
                return date('Y-m-d h:i:s',$time);
            }
        });
        $grid->updated_at('更新時間')->display(function ($time){
            if(empty($time)){
                return '——';
            }
            else{
                return date('Y-m-d h:i:s',$time);
            }
        });

軟刪除

https://laravelacademy.org/post/8194.html#

軟刪除需要數據庫表中必須有deleted_at字段,然後在Model中添加SoftDeletes

<?php

namespace App\Admin\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class GrFriendlyLink extends Model
{
    use SoftDeletes;
    /**
     * 關聯到模型的數據表
     *
     * @var string
     */
    protected $table = 'gr_friendly_link';
   
}

軟刪除恢復

    protected function restoredelete(Request $request)
    {
        $id=$request->id;
        GrNewsInformation::withTrashed()
            ->where('id', $id)
            ->restore();
    }

軟刪除篩選

在controller的grid中

   $grid->model()->onlyTrashed()->orderby('created_at','desc');

刪除方法重寫

在model中

 
    public function delete(){
        $this->status =0;
        $this->save();
    }

grid form detail一些常用代碼

grid常用

//對查詢數據進行處理
 $grid->model()->where('status','!=',0)->orderby('created_at','desc');

//結合having 查出名字重複的
$grid->model()->select('name_en')->groupBy('name_en')->havingRaw('count(name_en)>1')
//嵌套子查詢 查出名字重複的全部信息
$grid->model()->select('id','name_en')->whereIn('name_en',Project::select('name_en')->groupBy('name_en')->havingRaw('count(name_en)>1'))->orderBy('name_en');

 //顯示圖片
    $grid->photo('圖片')->image();
// 第一列顯示id字段,並將這一列設置爲可排序列,並可以在頁面進行修改
$grid->id('ID')->sortable()->editable('text');
//展示狀態,通過判斷展示不同的圖標
 $grid->column('display', '展示狀態')->display(function ($status) {
            return $status==1 ? '<span style="color: #0d9dd6"><i class=\'fa fa-check\'></i></span>' : '<span style="color: red"><i class=\'fa fa-close\'></i></span>';
        });
// 第二列顯示title字段,由於title字段名和Grid對象的title方法衝突,所以用Grid的column()方法代替
$grid->column('title');
//關聯管理員表
 $grid->admin_user()->username('更新管理員');
 //修改顯示輸出
$grid->text()->display(function($text) {
    return str_limit($text, 30, '...');
});

$grid->name()->display(function ($name) {
    return "<span class='label'>$name</span>";
});
// 添加不存在的字段
$grid->column('column_not_in_table')->display(function () {
    return 'blablabla....';
});
//顯示director字段,通過display($callback)方法設置這一列的顯示內容爲users表中對應的用戶名
$grid->director()->display(function($userId) {
    return User::find($userId)->name;
});
// 默認爲每頁20條
$grid->paginate(15);

form

   $form->text('name', '姓名')->rules('required');
        $form->image('photo', '圖片')->rules('required');
        $form->number('sort', '排序')->default(1);

        $form->switch('display', '展示狀態')->default(1);
        $form->switch('is_top', '置頂狀態')->default(1);
        $form->editor('introduce', '簡介');
        $form->hidden('userid')->default(Admin::user()->id);

detail

        $show->id('Id');
        $show->name('姓名');
        $show->photo('圖片')->image();
        $show->introduce('簡介')->unescape()->as(function ($body) {
            return "<pre>{$body}</pre>";
        });
        $show->display( '展示狀態')->using([1 => '√', 0 => '×']);
        $show->is_top( '是否置頂')->using([1 => '置頂',0 => '正常']);
        $show->sort('排序');
        $show->updated_at('更新時間');
        $show->created_at('創建時間');

其它數據參照Laravel-admin文檔
https://laravel-admin.org/docs/zh

郵件系統

使用Laravel自帶SMTP郵件組件實現發送郵件

實驗使用郵箱的163,QQ郵箱
需要注意的是:使用QQ郵箱的話,需要開啓POP3和SMTP服務。開啓方式如下:

需要開啓服務
當開啓成功會生成密鑰,這個東西會在配置中用到
生成密鑰
當需要記錄發信記錄時,你還需要進行相關配置
發信記錄

打開config/mail.php,進行配置

<?php

return [
	//driver用於配置默認的郵件發送驅動
    'driver' => env('MAIL_DRIVER', 'smtp'),
	//host是郵箱所在主機,比如我們使用163郵箱,對應值是smtp.163.com,使用QQ郵箱的話,對應值是smtp.qq.com
    'host' => env('MAIL_HOST', 'smtp.qq.com'),
	//port用於配置郵箱發送服務端口號,比如一般默認值是25,但如果設置SMTP使用SSL加密,該值爲465。
    'port' => env('MAIL_PORT', 25),
	//from配置項包含address和name,前者表示發送郵箱,後者表示發送郵件使用的用戶名。
    'from' => ['address' => '[email protected]','name' => '董祕'],
    //encryption表示加密類型,可以設置爲null表示不使用任何加密,也可以設置爲tls或ssl。
    'encryption' => env('MAIL_ENCRYPTION', 'tls'),
	//username表示郵箱賬號
    'username' => env('MAIL_USERNAME'),
	//password表示上述郵箱登錄對應登錄密碼。注意QQ郵箱的話應該開啓POP3|SMTP服務時給的密鑰。
    'password' => env('MAIL_PASSWORD'),
    //sendmail是在設置driver爲sendmail時使用,用於指定sendmail命令路徑。
    'sendmail' => '/usr/sbin/sendmail -bs',
    'markdown' => [
        'theme' => 'default',
        'paths' => [
            resource_path('views/vendor/mail'),
        ],
    ],
    'log_channel' => env('MAIL_LOG_CHANNEL'),

];

打開.env文件進行配置

MAIL_DRIVER=smtp
MAIL_HOST=smtp.qq.com
MAIL_PORT=25
MAIL_USERNAME=2502187899@qq.com
MAIL_PASSWORD=qq的密匙
MAIL_ENCRYPTION=null

發送純文本郵件

        $form->text('title', '提問人名稱');
        $form->email('email', '提問人');
        $form->textarea('content', '提問內容');
        $form->text('re_title', '回覆標題')->rules('required');
        $form->textarea('re_content', '回覆內容')->rules('required');
 // 在表單提交前調用
	$form->submitted(function (Form $form) {
    
		});
 	 // 在保存前調用,發送郵件
        $form->saving(function (Form $form) {
            $this->name = $form->email;
            $this->retitle=$form->re_title;
            $re_content=$form->re_content;
            Mail::raw( $re_content, function ($message) {
                $message ->to($this->name)->subject($this->retitle);
            });
        });
        //保存後回調,更改數據庫數據
        $form->saved(function (Form $form) {
         // 返回的一個錯誤數組,利用此可以判斷是否發送成功
            if(count(Mail::failures()) < 1){
                $id= $form->model()->id;
                $flight = TpInvestEmail::find($id);
                $flight->re_email = 1;
                $flight->re_time = time();
                $flight->save();
            }
            else{
                $id= $form->model()->id;
                $flight = TpInvestEmail::find($id);
                $flight->re_email = 0;
                $flight->save();

            }
        });

其它方式發送
參照下面文章
https://www.jianshu.com/p/8ccb2820df23

常用擴展:富文本,大文件上傳,在線視頻播放

富文本 百度Ueditor

https://github.com/laravel-admin-extensions/UEditor

大文件上傳

https://github.com/laravel-admin-extensions/large-file-upload
關於config/aetherupload裏面的配置信息

  return [

    "ENABLE_EXAMPLE_PAGE" => true, # 啓用示例頁面,訪問域名/aetherupload,生產環境下請將該選項設置爲false
    "CHUNK_SIZE"          => 1 * 1000 * 1000, # 上傳時的分塊大小(B),默認爲1M,越大傳輸越快,需要小於web服務器和php.ini中設置的上傳限值
    "UPLOAD_PATH"         => storage_path(). DIRECTORY_SEPARATOR . "app".DIRECTORY_SEPARATOR."public".DIRECTORY_SEPARATOR."uploads".DIRECTORY_SEPARATOR."aetherupload", # 上傳目錄的本地物理路徑
    "HEAD_DIR"            => "_head", # 指針頭文件目錄的名稱,建議保持默認
    "FILE_SUB_DIR"        => @date("Ym", time()), #資源文件目錄的子目錄生成規則,變量或常量均可
    "REDIS_KEY"           => "aetherupload_file_hashes", #redis中hashes的key名稱
    "GROUPS"              => [ # 分組,可設置多個不同分組,各自擁有獨立配置
        "file" => [ # 新增分組請儘量使用video、audio等有意義的分組名
            "FILE_MAXSIZE"                 => 0, # 被允許的資源文件大小(MB),0爲不限制
            "FILE_EXTENSIONS"              => "", # 被允許的資源文件擴展名,空爲不限制,多個值以逗號分隔
            "MIDDLEWARE_PREPROCESS"        => [], # 上傳預處理時的路由中間件
            "MIDDLEWARE_SAVE_CHUNK"        => [], # 上傳文件分塊時的路由中間件
            "MIDDLEWARE_DISPLAY"           => [], # 文件展示時的路由中間件
            "MIDDLEWARE_DOWNLOAD"          => [], # 文件下載時的路由中間件
            "EVENT_BEFORE_UPLOAD_COMPLETE" => '', # 上傳完成前觸發的事件(臨時文件),Receiver的實例被注入
            "EVENT_UPLOAD_COMPLETE"        => '', # 上傳完成後觸發的事件(已存文件),Receiver的實例被注入
        ],

    ],
];

在線視頻播放

https://github.com/laravel-admin-extensions/media-player

多路由複用一個controller

在route裏面

  //集團簡介type=1
    $router->resource('grGrbriefIntroduction', GrBasicFactsController::class);
    //企業文化type=2
    $router->resource('grBusinessCulture', GrBasicFactsController::class);
    //組織架構type=3
    $router->resource('grOrgaStructure', GrBasicFactsController::class);

在controller進行區分

use Illuminate\Support\Facades\Route;
  use HasResourceActions;
    protected $routeName;

    public function __construct()
    {
        //通過該方法可以查詢到輸入的route路徑
        $host = explode('/',Route::getFacadeRoot()->current()->uri);
        $this->routeName = $host[1];
    }
    
    public function index(Content $content)
    {

        if($this->routeName=='grGrbriefIntroduction'){
            return $content
                ->header('集團簡介')
                ->description('數據列表')
                ->body($this->grid());
        }
        if($this->routeName=='grBusinessCulture'){
            return $content
                ->header('企業文化')
                ->description('數據列表')
                ->body($this->grid());
        }
        if($this->routeName=='grOrgaStructure'){
            return $content
                ->header('組織架構')
                ->description('數據列表')
                ->body($this->grid());
        }
    }

  

全局搜索

關於全局搜索功能的簡單實現

創建全局搜索表

全局搜索表

創建model

 <?php
namespace App\Admin\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Storage;
/**全局搜索
 * @package App\Admin\Models
 */
class TpSitequery extends Model
{

    /**
     * 關聯到模型的數據表
     *
     * @var string
     */
    protected $table = 'tp_sitequery1';
}

在需要全局搜索的表裏的form裏面添加

  /**
     * Make a form builder.
     *
     * @return Form
     */
    protected function form()
    {
        $form = new Form(new TpProductBooks);
        $form->saved(function (Form $form) {
         $form->select('typeid','圖書類別')->options(TpProductBookType::all()->pluck('name', 'id'))->rules('required');
         $form->hidden('userid')->default(Admin::user()->id);
        //拼接要跳轉的路徑
            $url = '/pdctbooks/'.$form->model()->typeid.'/detail/'.$form->model()->id;
            $this->optSitequery($form,$url);
        });
        return $form;
    }

    private function optSitequery($form,$url){
        $sitequery = TpSitequery::where('url',$url)->first();
        if(empty($sitequery)){
            //插入
            $tpSitequery= new TpSitequery;
            $tpSitequery->title = $form->model()->name;
            $tpSitequery->url = $url;
            $tpSitequery->display=$form->model()->display;
            $tpSitequery->status=$form->model()->status;
            $tpSitequery->save();
        }else{
            //更新
            $sq = TpSitequery::find($sitequery->id);
            $sq->title = $form->model()->name;
            $sq->url = $url;
            $sq->display=$form->model()->display;
            $sq->status=$form->model()->status;
            $sq->save();
        }
    }

權限管理

在admin/permission裏面通過綁定路由建立新的權限

在這裏插入圖片描述
在admin/roles裏面通過分配權限建立新的角色

在這裏插入圖片描述

在admin/users裏面通過給管理員分配角色來實現權限管理
在這裏插入圖片描述
在admin/menu裏面通過給頁面綁定角色來實現管理員能不能看見菜單列表在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章