我也来分享一个自己撸的管理后台开发框架吧

说明

前前后后开发了有半年了,公司内部多个项目的后台也在使用这个框架,反馈良好,在这里分享给大家,欢迎使用和拍砖。

Github : laraval-admin

Demo admin/admin

laraval-admin目前支持Laravel 5.1、5.2、5.3,作为一个扩展包,不会干扰Laravel框架下的其它项目和功能,你可以在需要的时候使用它提供的功能,也可以自定义管理页面。同时封装了很多常用的web组件和form元素,并且提供了比较简单的API,能用很少的代码构建功能完善的后台功能。

Feature

  • 路由配置
  • 菜单配置
  • 显示布局
  • 数据模型表格
  • 数据模型表单
  • WEB组件
    • 表格
    • 表单
    • 盒子容器
    • 信息盒子
    • 选项卡
    • 滑动相册
    • 折叠容器
    • 数据图表 TODO
    • treegrid TODO
  • 权限控制

代码示例

//构建表格
public function grid()
{
    return Admin::grid(User::class, function (Grid $grid) {

        $grid->model()->where('id', '>', 10);

        $grid->id('ID')->sortable();
        $grid->name('用户名')->style('color:green');
        $grid->email('邮箱')->link('mailto:{$value}');
        $grid->profile()->mobile('手机号')->value(function($mobile) {
            return "+86 $mobile";
        });
        $grid->column('profile.homepage', '个人主页')->link();
        $grid->created_at('创建时间');
        $grid->updated_at('更新时间');

        $grid->paginate(15);

        $grid->filter(function ($filter) {
            $filter->like('name', '用户名');
            $filter->like('email', '邮箱');
        });
    });
}

//构建表单
public function form()
{
    return Admin::form(User::class, function (Form $form) {

        $form->display('id', 'ID');
        $form->text('name', '用户名');
        $form->email('email', '邮箱');
        $form->url('profile.homepage', '个人主页');
        $form->ip('profile.last_login_ip', '登录ip');
        $form->datetime('profile.last_login_at', '登录时间');
        $form->color('profile.color', '颜色')->default('#c48c20');
        //图片上传,裁切,加水印
        $form->image('profile.avatar', '头像')
            ->resize(null, 200, function ($constraint) {
            $constraint->aspectRatio();
        })->insert('upload/image/watermark.png', 'bottom-right', 10, 10);
        // 上传文件
        $form->file('profile.document', '文档')->rules('mimes:doc,docx,xlsx');
        $form->mobile('profile.mobile', '手机号')->default(13500000000);
        $form->text('profile.address', '地址');
        $form->json('profile.address', 'JSON');
        $form->date('profile.birthday', '生日');
        $form->radio('profile.gender', '性别')->values(['0' => '女', '1'=> '男']);
        $form->map('profile.lat', 'profile.lng', '位置');
        $form->slider('profile.age', '年龄')->options(
            ['max' => 50, 'min' => 20, 'step' => 1, 'postfix' => '岁']
        );
        // 时间范围
        $form->datetimeRange('profile.created_at', 'profile.updated_at', '时间线');
        $form->multipleSelect('friends', '好友')->options(User::all()->pluck('name', 'id'));
        $form->checkbox('roles', '角色')->values(Role::all()->lists('display_name', 'id'));
        $form->display('created_at');
        $form->display('updated_at');
    });
}

// 布局
public function index()
{
    return Admin::content(function (Content $content) {

        $content->header('Dashboard');
        $content->description('description...');

        $content->row(function ($row) {
            $row->column(3, new InfoBox('New Users', 'users', 'aqua', '/admin/users', '1024'));
            $row->column(3, new InfoBox('New Orders', 'shopping-cart', 'green', '/admin/orders', '150%'));
            $row->column(3, new InfoBox('Movies', 'film', 'yellow', '/admin/movies', '2786'));
            $row->column(3, new InfoBox('Documents', 'file', 'red', '/admin/files', '698726'));
        });

        $table = new Table(
            ['id', '标题', '发布时间', '浏览量', '评论数'],
            Article::take(10)->get(['id', 'title', 'created_at', 'view_count', 'comment_count'])->toArray()
        );

        $content->row((new Box('Last Articles', $table))->style('info')->solid());
    });
}

截图

qq20160927-3
qq20160927-1
qq20160927-0
qq20160927-2

详细使用请戳README

其它

laravel-admin 基于以下组件或者服务开发:

License

laravel-admin is licensed under The MIT License (MIT).

本帖已被设为精华帖!
本帖由系统于 2年前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 119

菜单配置为啥不和权限挂钩?

2年前 评论
ruolis

感觉 BUG 略多

2年前 评论

@awh521 菜单配置是和权限挂钩的

后台添加好角色 'administrator', 'editor',以下配置即可让菜单在这两个角色下的用户可见

[
    'title' => 'Roles',
    'url'   => 'auth/roles',
    'icon'  => 'fa-user',
    'roles' => ['administrator', 'editor'],
],
2年前 评论

@ruooooooli 欢迎提issue :smile:

2年前 评论

感谢管理员推荐!

2年前 评论

@song 你这个是自动生成还是手动配置,没看懂。还有就是连基本的前后台数据验证都没,问题很大哦。

2年前 评论

@awh521 菜单是手工配置的 菜单配置

表单数据验证也是有的:

$form->text('name', '用户名')->rules('required|min:5|max:10');
$form->file('profile.document', '文档')->rules('mimes:doc,docx,xlsx');

表单提交的时候会用rules方法中的规则验证。

2年前 评论

看了下源码,比较高大上~

2年前 评论

@qloog 过奖了:smile:

2年前 评论
Chasers9527

尴尬,直接定位定到海里去了

file

2年前 评论

@xhh110 都是用faker生成的假数据

2年前 评论
ziyanziyu

菜单与权限的挂勾感觉 不应该依赖于配置文件 ,若是给客户使用的话,新建一个角色,为这个角色分配哪些可见菜单.还得去编辑配置文件 ,感觉不太方便.

2年前 评论

请问你这个有开发文档吗

2年前 评论
superwen

非常棒,通用的cms还是够用了的。

2年前 评论
Chasers9527

@Jokin ??

一脸懵逼中。。。。。

2年前 评论

@ziyanziyu 现在已经支持菜单管理界面了 http://120.26.143.106/admin/auth/menu :smile:

2年前 评论

@useramaya 文档请参考README.MD 以及demo相关页面的代码

2年前 评论

你好,你的这个后台代码可以给我研究吗?有很的地方都不是很懂

2年前 评论

@阡陌 代码已经在github上,又不懂的地方可以随时问我

2年前 评论

比如那个数据表的关联file怎么定义

2年前 评论

@阡陌 建议到github提issue交流

2年前 评论

@song 你这个代码销售不,我觉得挺好的,想研究透彻

2年前 评论

@阡陌 :laughing:代码已经开源,你可以随意使用

2年前 评论

@song 我要完整的代码,现在看都还一头雾水

2年前 评论

@阡陌 我也只是搭了个简单的demo,并没有完整的项目,你可以按照文档安装一遍,然后去慢慢了解

2年前 评论

你好id搜索有出现错误了

2年前 评论

@shxhengxin 欢迎到github上开issue,贴出详细错误 :smiley:

2年前 评论

laravel5.1没有菜单栏配置项吗

2年前 评论

@阡陌 在左侧栏的Auth > Menu下配置菜单

2年前 评论

那个下面好像是menu.php模型

2年前 评论
ziyanziyu

@song :+1: 有空学习下代码.

2年前 评论

我想问一下,这里多对多怎么定义

2年前 评论

@song 那个我定义好了,在控制器该怎么写

2年前 评论

@妮子 laravel-admin 里面的管理员和角色就是多对多关系,你可以参考一下模型 AdministratorRole和控制器UserController

2年前 评论

file这里多对多的关系,那个activities是对应关系表的表名还是当前表中的字段

2年前 评论

@阡陌 activities是关系名 参考link

2年前 评论

file这里编辑的时候图片显示不出来

2年前 评论

laravel5.1可以加载1.3的不

2年前 评论

@阡陌 1.3是用来兼容laravel5.3的,建议在github上开个issue帮你解答这些问题。

2年前 评论

您好,前几天您回复了我的帖子,关于如何用简洁代码插入不重复的好友数据的,今天想在帖子里回复您表示感谢,但不知道为什么您的评论不见了,特此来感谢! Orz

2年前 评论

@Harry 客气了,因为那天写完答案后才发现自己好像答偏了,就删掉了答案,在原问题下面我已经补上了优化代码。

2年前 评论

请问图片上传可以设置存到阿里云上吗

2年前 评论

@HelloWorkd1 现在只要使用实现了laravel storage的driver,即可上传到任意OSS上 图片/文件上传

2年前 评论

file请问laravel5.1这个带有百分号的怎样解决

2年前 评论

@阡陌 建议将Laravel升级到5.2或5.3,很多新特性和优化都在5.2或5.3版本下维护。

2年前 评论

你这个怎么把文件上传到阿里云的OSS上去,我看了你写的那个上传的,好像上传不上去

2年前 评论

@阡陌 请问你的laravel版本

ps:我只测试过七牛的oss,阿里云的还没测试过,稍后我补充一下

2年前 评论

@阡陌 测试了一下 通过安装这个aliyun-oss-adapter是可以上传成功的,前提是你的配置都要正确

2年前 评论

谢谢,我已经摸索成功了

2年前 评论

你这个框架怎么跨表查寻数据比如

file这个,不想查询本模型的数据,但要查询另一个模型的数据,这里该怎么弄

2年前 评论

file这个在本地环境下运行没有错误,上传到服务器上怎么出现了错误,请问应该怎么解决

2年前 评论

@阡陌 现在两个模型之间做好关联

class User extends Model
{
    public function profile()
    {
        return $this->hasOne(Profile::class);
    }
}

class Profile extends Model
{
}

,然后

$filter->like('profile.address')
2年前 评论

@shxhengxin 有点小bug,已修复,请更新一下包,你的服务器和本地环境估计也有差异

2年前 评论

好的,我去试试

2年前 评论

楼主,我觉得这里要改善一下

file

2年前 评论

@阡陌 这种多选的情况,如果选项少可以用这种方式,如果选项太多,可以使用multiSelect的ajax动态加载选项避免这个问题

参考 多选框

2年前 评论

file

file这两个地方怎么实现

2年前 评论

@阡陌
第一个

public function index()
{
    return Admin::content(function (Content $content) {

        $tab = new Tab();

        $tab->add('Grid', $this->grid());
        $tab->add('Code', $this->gridCode());

        $content->body($tab);
    });
}

参考 https://github.com/z-song/laravel-admin/bl...

第二个

$grid->filter(function ($filter) {
    $filter->like('title');
    $filter->is('language_id', 'Language')->select(Language::all()->pluck('name', 'id'));
});
2年前 评论
DukeAnn

为什么前端代码要用php生成呢,不给维护带来了麻烦

2年前 评论

@ADKi 用PHP函数封装常用的前端组件,能减少很多代码量,提高开发效率

2年前 评论

@tablecell 请问你是按照README上的安装流程来安装的吗?

2年前 评论

@tablecell 你需要先安装好Laravel,配置好数据库连接,然后在项目里用composer安装这个package

2年前 评论
DukeAnn

@ADKi 你的这个生成html是什么扩展 66的

2年前 评论

@ADKi 这里生成html是laravel-admin的内置功能

2年前 评论
DukeAnn

@song 那用户权限的那些呢也是自己写的没有依赖?

2年前 评论

@ADKi 依赖可以在composer.json里面看到,另外还使用了大量js库和组件

2年前 评论
DukeAnn

兄弟 你说个名字好不好,我这得找多久

2年前 评论

@ADKi 没有依赖 自己写的

composer.json里面能看到所有依赖,不难找吧

2年前 评论
DukeAnn

新人,好多个composer 文件 我该找哪个

2年前 评论

@ADKi 一个package只有一个composer.json文件

2年前 评论

@ADKi 你缺的知识可能比较多,先去学习下 composer 的文档吧:https://getcomposer.org/ ,这个项目 PHP 依赖几乎没什么,前端依赖的库有一大堆,列举几个我也比较熟悉的吧:

  • AdminLTE,一个基于 bootstrap 的管理后台主题,整个界面的设计风格都是基于这个主题的
  • bootstrap,css 框架,感觉没必要解释了
  • font-awosome,的确非常 awosome 的图标库,你看到的各种可爱的小图标都是用的它提供的
  • jQuery,js 库,感觉没必要解释了
  • jquery.pjax,基于 jQuery 实现页面局部刷新的一个库
  • select2,非常棒的一个替代 <select> 标签方案,你看到的那些带搜索的下拉框就是它提供的

还有太多组件一下说不过来,不过真是一个集大成之作!总而言之,干得漂亮!@song :sparkles: :+1:

2年前 评论
朕略显ぼうっと萌

你好,这个 我从git上看到了,并且在用,其中model-grid和model-form 很好用,但是我发现一个问题,就是关于后台权限的方面的,感觉这个权限管理系统并不完善,我后台可以设置菜单对应访问的用户,但是我在地址栏里输入是可以再进去的,这个问题,目前已修复,但是这样修复我感觉治标不治本,通过埋点控制的话太不灵活,只能程序做好后不再分配权限和角色,如果这样的话后台的管理员菜单作用不大,但是我觉得这个很有必要,所以能不能试着将权限作为中间件来开发,每个权限的控制是通过中间件来判断的,并不是靠埋点来控制的,埋点控制这个只是作为一个备用方式来使用,处理复杂逻辑,这样的话后台的权限管理回更灵活。

后台的权限管理还是一个比较重要的部分的,这是我们选择后台框架的一个重要的部分。
相对于友好的操作来说,安全系数和灵活程度 更重要一点

2年前 评论

@朕略显ぼうっと萌 感谢关注,在目前在1.3分支里面已经实现了权限中间件 PermissionMiddleware.php,刚刚补充了文档 权限中间件

2年前 评论
朕略显ぼうっと萌

@song OK 谢谢 我试一下。

2年前 评论

@朕略显ぼうっと萌 你上面提到的修复,就是通过权限中间件实现的 https://github.com/z-song/laravel-admin/bl...

2年前 评论
朕略显ぼうっと萌

@song 这样的话 后台的管理员菜单中的还是写死的?就是说只能administrator角色进行访问,如果我要想给其他的管理员进行分配角色,让他有 查看日志的操作但是不能有修改菜单的操作怎么弄?

2年前 评论

@朕略显ぼうっと萌 你说的这几个操作都是权限级别最高的操作,所以我就设计了只有超管能够使用这几项功能

如果实在有这种需求的话也是有办法的,你可以新建路由指向这几个controller,再添加菜单设置权限,等于是新增了一个操作入口

2年前 评论
朕略显ぼうっと萌

@song 我看了下权限中间件这个,这个的话应该是写死的吧,假设这样一个场景 我开发了一个项目,正式上线了,管理员进入后台 给一个管理员新开一个身份或者是权限,我们这个是有这个功能的,如果新开的身份权限和之前的不一样那么代码不进行重写的话 这个权限管理是会有bug的。不知道这样说您能明白吗,也就是说 是权限管理权限,权限管理是活的,但是您这种方法的话,权限是死的,写完后就这样了,这样的话项目只适合将超级管理员身份剥离出来。既然我们可以根据对应的身份控制菜单显示,为什么不能控制具体进入某个方法呢。我想说的意思是,制作中间件 中间件中自动判断身份这个样子的。

2年前 评论

@朕略显ぼうっと萌 你的意思是能完全在后台控制权限,不用通过在代码里面埋点的方式写死权限?

2年前 评论
朕略显ぼうっと萌

@song 其实不只是这样,目前的权限管理和菜单根据不同角色显示这两个是不重合的,也就是说其实这个是两套系统分别控制的,这样的话其实是有问题的,我说个例子,我在后台设置一个用户他能登陆系统,设置他的角色为普通管理员,普通管理员有权限访问用户管理和查看日志。我在后台用超级管理员administrator 权限 在菜单设置中普通管理员能访问查看日志这个菜单。 但是当普通管理员登陆后是能够看到日志这个菜单的,但是点击以后会提示没有权限,这个就有点矛盾了吧。

2年前 评论
朕略显ぼうっと萌

@song 是的,毕竟这种埋点的方式太不灵活,而且后台的权限和角色是可以修改和编辑的

2年前 评论

@朕略显ぼうっと萌 目前确实是分开的,在菜单设置权限只是表面上挡住了无权限用户,具体的访问权限还是根据在代码里面埋点来判断,采用埋点的方式是因为它能在程序的任何节点来控制权限,每一个resource的任何操作都可以通过埋点的方式来控制权限

如果只是通过后台 来设置进入控制器的某个方法的权限还好做,但是如果要在方法里面的某个流程里面能控制权限,可视化的配置权限操作就无法完成了。

2年前 评论
朕略显ぼうっと萌

@song 但是这样的话后台的控制权限岂不是有问题? 明面上的遮挡安全性什么的都不行,其实控制到具体到某个方法就足够了, 权限管理并不能满足每一个人,只要满足大部分需求,保留埋点控制方式作为扩展用户特殊需求不是更好的方式吗?
您觉得呢。现在laravel 中有太多的权限控制,大多输都是埋点控制,使用起来复杂不说,最终还是要封装成后台控制的类型吧。

2年前 评论
朕略显ぼうっと萌

@song 主要是目前的方式 逻辑上处理起来会有冲突。我明明可以看到这个操作为什么没有权限。既然可以看到但是没有权限,那我为什么要控制它显示或者是隐藏呢?

2年前 评论

@朕略显ぼうっと萌 控制菜单对不同角色的可见性,一是为了限制用户操作,二是为了避免一个角色知晓其它角色的权限范围

如果一个用户看见了菜单项,却点击进去没有权限,我们可以认为是超管在设置菜单对这个角色的可见权限时有遗漏。

2年前 评论
朕略显ぼうっと萌

@song 好吧,那这样的话只能在正式上线之前进行确认所有角色和权限,规划合理后进行埋点控制,并且隔离administrator 的使用权限了。

2年前 评论

@朕略显ぼうっと萌 另外你说的通过控制器+方法这种粒度的权限控制实现后台可视化配置,可以目前的基础上另外开发一个package嵌入到后台系统中

2年前 评论
朕略显ぼうっと萌

@song OK 谢谢,我还有一个问题,就是说自定义文件系统,也就是您之前提的 Laravel storage 的 driver 的问题,我想弄一下,可是没有相关的文档或资料。文档上说的太模糊了,可以请教一下您吗?

2年前 评论

楼主亮照片吧,你说你长得不帅,鬼都不信

2年前 评论

楼主 问个问题哈。比如我在某个页面想单独写个按钮 做一个简单的 状态修改 比如对用户禁用的这种功能 该怎么实现呢
还有我试了一下 修改的功能 在展示的字段添加 editable 功能没有生效 是什么原因呢

2年前 评论

@leng 想单独写页面,和开发Laravel普通页面没有区别,不会限制你必须在这个框架下开发

第二个问题可以开issue,贴一下详细的问题或者截图

2年前 评论

@song 目前写完的部分,跟我自己需要的还差不少,今天刚看了一点源码,有开发这个的想法,比如我想加个模态弹窗的组件,里面可以放入表单等,开发核心代码的难度有多大,自己写这个模态弹窗出来,然后放到content的body里面render出来会不会快不少?

2年前 评论

@song 还有,有没有想过加入5.3新的json格式增删改查支持,没有这个好麻烦,跟自己写的视图混合使用如何?有没有认识人开发的时候跟自己写的混合起来用,另外,我这里过滤没有发现结果会报错。。。。。。

2年前 评论

挺强大的..

2年前 评论

你好,请问这个怎么解决

file

2年前 评论

@秋风 参考配置文件权限那块,就是图片和文件上传!!!

2年前 评论

@朕略显ぼうっと萌 我也跟你的想法一样 后面我在后台控制器继承的控制器里加了方法 在后太的每个控制器里去调取这个方法去达到控制权限

2年前 评论
朕略显ぼうっと萌

@longyuan 现在我已经不用这个了,公司的开发形式 没法用这种框架,而且随着这个项目的增大,略显臃肿了,这个不是我想要的,所以我就放弃了。

2年前 评论

@朕略显ぼうっと萌 一点也不臃肿啊,只不过作者做成了独立项目,核心东西可以随时拿来自己用,自己定义,包括权限,权限表就那四张,也是通用结构设计,可以换其他扩展包,替代权限细分。我对这个用PHP封装HTML和JS的代码设计感觉挺6的,避免了很多重复劳动啊。赞

1年前 评论
朕略显ぼうっと萌

@kylesean 公司现在的项目后台也是restful api 模式,所以说 根本用不上,

1年前 评论

@朕略显ぼうっと萌 是的啊,我也放弃了,我搞了两天发现局限性有点大,哈哈,不过源码值得学习下。

1年前 评论

请问 按照教程的编写后
新增后 没有数据插入 直接跳回到列表了
请问是什么原因?
form中的内容是return Admin::form(Test::class, function (Form $form) {$form->text('name', '用户名');});
希望能指教

1年前 评论

@朕略显ぼうっと萌 大佬看了最新的评论,有没有什么权限包比较好的推荐一下

1年前 评论
朕略显ぼうっと萌

@Prefect丶 额,我并不是大佬,我只是小菜鸡,权限我们现在用的 Entrust 不过 貌似不维护了。

1年前 评论

你好,我刚开始使用这个框架,在新建菜单的时候父级菜单选择栏里就出现了很多& nbsp;,但是我在demo里看到的是正常的空格,请问这个是什么原因引起的,要怎么改过来

file

1年前 评论
susucool

很强大了,做一般的cms小系统完全够用,节省很多时间啊,life is short,knowledge is too more。
虽然现在还有很多小瑕疵,但是瑕不掩瑜,源码、设计思路感觉很值得学习,赞一个,楼主大大。

1年前 评论

666 laravel-china Php的天堂

1年前 评论

@song 跨多个表查询呢

1年前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!