1.安装 laravel-admin
composer require encore/laravel-admin "1.5.*"
然后运行下面的命令来发布资源:
php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"
在该命令会生成配置文件config/admin.php,可以在里面修改安装的地址、数据库连接、以及表名,建议都是用默认配置不修改。
然后运行下面的命令完成安装:
php artisan admin:install
报错:
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table
users
add uniqueusers_email_unique
(
解决:修改 app/Providers/AppServiceProvider.php 文件:
use Illuminate\Support\Facades\Schema;
public function boot()
{
//增加这一行
Schema::defaultStringLength(191);
}
2. 测试
启动服务后,在浏览器打开 mylaravel.com/admin/
使用用户名:admin,密码:admin 登陆
a.如果在本地显示正常,在服务器显示不了
服务器显示404错误 在nginx配置xxx.conf(自己项目的nginx配置)文件中增加
location / {
try_files $uri $uri/ /index.php?$query_string;
}
b.如果显示的格式不对,此网页正试图从未经验证的来源加载脚本
在config/admin中
'secure' => false 改成 'secure' => true
3. 在后台安装执行定时任务组件
composer require laravel-admin-ext/scheduling
php artisan admin:import scheduling
会在vendor目录下生成 laravel-admin-ext 目录
安装这个组件后,登陆后台可以在后台执行 3.1 中创建的命令任务。
4. 使用 laravel-admin
laravel-admin 中文文档
后台管理主要都是对数据库表里面的数据进行展示和操作用的。
1. 创建模型
对需要操作的表在 app/ 目录下建一个 model ,比如对FuliLog表建一个模型
FuliLog.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class FuliLog extends Model
{
use Notifiable;
const CREATED_AT = 'CreateTime';
const UPDATED_AT = 'UpdateTime';
protected $table = 'FuliLog'; //数据库表名
//格式化时间戳
public function fromDateTime($value)
{
return strtotime(parent::fromDateTime($value));
}
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
];
}
2. 创建admin控制器
传入一个model,它会根据model对应表的字段,默认构建出所需的grid,form和show三个页面的代码
命令如下:
$ php artisan admin:make FuliLogController --model=App\\Post
// 在windows系统中
$ php artisan admin:make FuliLogController --model=App\Post
执行该命令后会在 app/Admin/Controllers 下面创建一个 FuliLogController.php 文件, 主要对类里面的几个方法修改
index():页面标题修改
grid():展示表里需要显示的字段
form():对表字段进行操作管理的方法
<?php
namespace App\Admin\Controllers;
use App\FuliLog;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\HasResourceActions;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Layout\Content;
use Encore\Admin\Show;
class FuliController extends Controller
{
use HasResourceActions;
/**
* Index interface.
*
* @param Content $content
* @return Content
*/
public function index(Content $content)
{
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
}
有时在展示页面 grid() 方法,和操作页面 form() 方法 默认的一些操作可能无法完成界面需求,这是可以使用 js 来辅助实现,如:
protected function grid()
{
$grid = new Grid(new User);
$script = <<<ET
ftzhClick(uid, titlestr){
//...
}
$('.ftzh_btn').click(function(){
console.log("ftzh_btn");
var uid = $(this).attr('uid');
var accountBanEnd = $(this).attr('accountBanEnd');
var timesp = $(this).attr('timesp');
var titlestr = '';
if (accountBanEnd == 0) {
titlestr = "1"
} else {
titlestr = "2"
}
ftzhClick(uid, titlestr);
});
ET;
Admin::script($script);
//属性显示...
//操作
$grid->actions(function($actions){
$accountBanEnd = $actions->row->AccountBanEnd;
if($accountBanEnd == 0){
$html .= "<a class='ftzh_btn' uid=".$uid." accountBanEnd=".$accountBanEnd. " timesp=0 title='1' href='javascript:void(0);'>111</a>";
}
$actions->append($html);
}
}
return $grid;
protected function form()
{
//表单提交请求再次确认弹框
$script = <<<SCRIPT
$('button[type=submit]').on('click',function(e){
e.preventDefault();
var form = $(this).parents('form');
swal({
title: "您确定发放?",
text: "确认发放后无法恢复!",
type: "warning",
showCancelButton: true,
confirmButtonColor: "#DD6B55",
confirmButtonText: "确认发放",
cancelButtonText: "取消",
preConfirm: function() {
form.submit();
}
}).then(function(result) {
});
});
SCRIPT;
Admin::script($script);
return Admin::form(FuliLog::class, function (Form $form) {
//页面显示...
$form->saving(function (Form $form) {
//表单操作业务处理
});
$form->saved(function (Form $form){
//数据库保存
});
}
}
3.admin 的路由
每创建一个 admin 控制器就在 app/Admin/routes.php 里面增加一条主页面路由,
若该控制器里面有具体的方法需要被跳转到,则也需要把该方法加入到路由上。
比如创建了一个 UserExpertController 控制器,且它的 grid 里面有需要操作置顶动作
/**
* 设置/取消 置顶
*/
public function setTop(Request $request){
$id = isset($request['id']) ? intval($request['id']) : null;
$status = isset($request['status']) ? intval($request['status']) : null;
if (null === $id || null === $status) {
$error = new MessageBag(['title'=>'提示','message'=>'缺少参数!']);
return back()->withInput()->with(compact('error'));
}
//$result = User::where('id','=',$id)->update(['Top'=>$status, 'BeTopTime' => time()]);
if (1 == $status) {
$result = User::where('id','=',$id)->update(['Top'=>$status, 'BeTopTime' => time()]);
$tips = '置顶';
} else {
$result = User::where('id','=',$id)->update(['Top'=>$status, 'BeTopTime' => NULL]);
$tips = '取消置顶';
}
$success = new MessageBag([
'title' => '操作成功',
'message' => '成功'.$tips.' <a href="javascript:window.location.reload();">点击返回</a>',
]);
return back()->with(compact('success'));
}
//
protected function grid()
{
$grid = new Grid(new User);
$grid->actions(function($actions){
if($actions->row->Top == 1){
$html .= '<a title="" href="UserExpert/setTop?id='.$actions->row->id.'&status=0">取消置顶</a> | ';
}
else{
$html .= '<a title="" href="UserExpert/setTop?id='.$actions->row->id.'&status=1">置顶</a> | ';
}
$actions->append($html);
}
return $grid;
}
其路由:
$router->get('UserExpert/setTop','UserExpertController@setTop');
$router->resource('UserExpert', UserExpertController::class);
4.日期时间筛选
数据库中一般存放时间都是utc时间戳,laravel 中直接用两个日期时间范围搜索出来的结果不正确,需要自己去处理时间,写一个 Between 子类去重写 condition 方法
use Encore\Admin\Grid\Filter\Between;
class TimestampBetween extends Between
{
// 重载condition方法,
public function condition($inputs)
{
// $inputs即为传进来的参数,格式化成timestamp再去构建条件
if (!array_has($inputs, $this->column)) {
return;
}
$this->value = array_get($inputs, $this->column);
$value = array_filter($this->value, function ($val) {
return $val !== '';
});
if (empty($value)) {
return;
}
if (!isset($value['start'])) {
$value['end'] = strtotime($value['end']);//转成时间戳
return $this->buildCondition($this->column, '<=', $value['end']);
}
if (!isset($value['end'])) {
$value['start'] = strtotime($value['start']);//转成时间戳
return $this->buildCondition($this->column, '>=', $value['start']);
}
$this->query = 'whereBetween';
$value['end'] = strtotime($value['end']);//转成时间戳
$value['start'] = strtotime($value['start']);//转成时间戳
//return $this->buildCondition($this->column, $this->value);
//这里需要注意$this->value的值会作用于页面reset按钮,不能直接修改这个值,否则会导致按reset回显时间戳
return $this->buildCondition($this->column, $value);
}
}
网友评论