LaravelLaravel开发实践laravel学习笔记

Laravel-admin 后台管理

2019-06-28  本文已影响1人  _给我一支烟_

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 unique users_email_unique(email))

解决:修改 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> &nbsp;|&nbsp;';
        }
        else{
            $html .= '<a title="" href="UserExpert/setTop?id='.$actions->row->id.'&status=1">置顶</a> &nbsp;|&nbsp;';
        }
        
        $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);
    }
}
上一篇下一篇

猜你喜欢

热点阅读