從零開始搭建laravel-admin項目
- 參考文檔
- windows環境下安裝composer,然後使用composer安裝Laravel
- laravel-admin快速開始
- laravel-admin 報錯 Disk [admin] not configured, please add a disk config in `config/filesystems.php`.
- laravel-admin excel導出中文亂碼問題
- 常見的基本配置
- 自定義帶驗證碼的登錄頁面
- 語言修改與錯誤提示
- 單表關聯
- 查詢過濾
- 獲取當前的管理員的信息
- 自定義按鈕控件的使用
- **1.首先先在controller裏面定義按鈕**
- **2.在app/Admin/Extentsions下面新建工具類**
- **3.在route裏面填寫請求路徑的方法**
- **4.在相應Controller裏面創建方法**
- 時間戳存取 與軟刪除
- grid form detail一些常用代碼
- 郵件系統
- 常用擴展:富文本,大文件上傳,在線視頻播放
- 多路由複用一個controller
- 全局搜索
- 權限管理
參考文檔
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裏面通過給頁面綁定角色來實現管理員能不能看見菜單列表