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

说明

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

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).

本帖已被设为精华帖!
本帖由系统于 7年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 119

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

7年前 评论
ruolis

感觉 BUG 略多

7年前 评论

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

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

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

@ruooooooli 欢迎提issue :smile:

7年前 评论

感谢管理员推荐!

7年前 评论

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

7年前 评论

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

表单数据验证也是有的:

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

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

7年前 评论

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

7年前 评论

@qloog 过奖了:smile:

7年前 评论
幽弥狂

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

file

7年前 评论

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

7年前 评论
wenber

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

7年前 评论

请问你这个有开发文档吗

7年前 评论
superwen

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

7年前 评论
幽弥狂

@Jokin ??

一脸懵逼中。。。。。

7年前 评论

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

7年前 评论

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

7年前 评论

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

7年前 评论

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

7年前 评论

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

7年前 评论

@阡陌 建议到github提issue交流

7年前 评论

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

7年前 评论

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

7年前 评论

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

7年前 评论

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

7年前 评论

你好id搜索有出现错误了

7年前 评论

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

7年前 评论

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

7年前 评论

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

7年前 评论

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

7年前 评论
wenber

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

7年前 评论

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

7年前 评论

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

7年前 评论

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

7年前 评论

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

7年前 评论

@阡陌 activities是关系名 参考link

7年前 评论

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

7年前 评论

laravel5.1可以加载1.3的不

7年前 评论

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

7年前 评论

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

7年前 评论

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

7年前 评论

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

7年前 评论

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

7年前 评论

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

7年前 评论

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

7年前 评论

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

7年前 评论

@阡陌 请问你的laravel版本

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

7年前 评论

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

7年前 评论

谢谢,我已经摸索成功了

7年前 评论

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

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

7年前 评论

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

7年前 评论

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

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

class Profile extends Model
{
}

,然后

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

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

7年前 评论

好的,我去试试

7年前 评论

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

file

7年前 评论

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

参考 多选框

7年前 评论

file

file这两个地方怎么实现

7年前 评论

@阡陌
第一个

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'));
});
7年前 评论
DukeAnn

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

7年前 评论

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

7年前 评论

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

7年前 评论

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

7年前 评论
DukeAnn

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

7年前 评论

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

7年前 评论
DukeAnn

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

7年前 评论

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

7年前 评论
DukeAnn

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

7年前 评论

@ADKi 没有依赖 自己写的

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

7年前 评论
DukeAnn

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

7年前 评论

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

7年前 评论
Link

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

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

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

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

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

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

7年前 评论

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

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

@song OK 谢谢 我试一下。

7年前 评论

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

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

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

7年前 评论

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

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

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

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

7年前 评论

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

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

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

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

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

7年前 评论

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

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

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

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

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

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

7年前 评论

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

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

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

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

7年前 评论

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

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

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

7年前 评论

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

7年前 评论

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

7年前 评论

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

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

7年前 评论

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

7年前 评论

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

7年前 评论

你好,请问这个怎么解决

file

6年前 评论
MasterShu

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

6年前 评论

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

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

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

6年前 评论

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

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

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

6年前 评论

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

6年前 评论

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

6年前 评论

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

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

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

6年前 评论

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

file

5年前 评论
susucool

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

5年前 评论

666 laravel-china Php的天堂

5年前 评论

@song 跨多个表查询呢

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!