Laravel-admin 后台管理

作者: _给我一支烟_ | 来源:发表于2019-06-28 15:42 被阅读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);
        }
    }
    

    相关文章

      网友评论

        本文标题:Laravel-admin 后台管理

        本文链接:https://www.haomeiwen.com/subject/vmulcctx.html