fastadmin 后台管理框架使用技巧(持续更新中)

FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架,具体介绍,请查看文档,文档地址为:https://doc.fastadmin.net/docs/index.html

这里只整理一下在使用过程中用到的小技巧,以便用到的时候查看,其实,在fastadmin的论坛中,有一篇介绍后台表格的文章,说的也不错,如有问题,请先点击:一张图解析FastAdmin中的表格列表的功能

如果还没解决,那就继续往下看了

1、修改默认排序字段

在fastadmin后台中,如果数据表里存在weigh字段,则index页面显示的时候,包括排序按钮是显示三个按钮,如果没有,则显示修改和删除两个按钮

如果不想要使用默认字段weigh来排序的话,只需要改一个地方就好了,就是在table初始化的时候,把默认的排序字段改成你想要其他的字段就行了

如图所示:,其实,我们可以在require.js中大约65行出看到,table在初始化的时候,默认是dragsortfield:weigh,只要改掉这个值就行了

2、自定义菜单

在fastadmin中,默认是自带三个操作按钮,分别是拖拽、编辑和删除,如果想要自定义菜单按钮的话,也挺简单,在“一张图解析fastadmin表格列表的功能”文章中有提过,一般是有三种形式:弹出窗口、ajax和新选项卡,就是在classname中增加不同的样式,弹窗:"btn-dialog",ajax:"btn-magic btn-ajax",新选项卡:"btn-addtabs",通过不同的样式绑定了不同的事件,下面一个示例是弹窗的,而且只是数据展示,还没有数据处理

  1. {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate,
  2. buttons:[
  3. {
  4. name: 'cow_list',
  5. hidden:false,
  6. title: '可用牛牛',
  7. classname: 'btn btn-xs btn-success btn-dialog',
  8. icon: 'fa fa-github-alt',
  9. url: 'farm/log/index',
  10. },
  11. ], formatter: Table.api.formatter.operate}

效果如图所示:

如果是要操作数据的话,比如自带的edit和add,需要再增加

  1. 1 cow_list: function () {
  2. 2 Controller.api.bindevent();
  3. 3 },

因为是index,要特殊一些,因为index方法包含了get和ajax两步操作,get渲染出主页模板,然后再用ajax请求数据,所以还得修改js中index对应的URL地址,比如直接获取参数,或者直接自定义查询条件,两者区别在于后者直接修改了在弹窗出现的index页面中通用搜索显示时候的相应字段的默认值,比如user_id默认为空,自定义之后,直接user_id为指定值了。

3、渲染数据

我们知道,fastadmin底层自带了很多渲染数据的格式,比如

  1. > `Table.api.formatter.icon` 快速将字段渲染成一个按钮,仅支持Fontawesome按钮
  2. > `Table.api.formatter.image` 快速将字段渲染成图片展示的形式
  3. > `Table.api.formatter.images` 快速将字段渲染成多图片展示的形式,字段数据请以`,`进行分隔
  4. > `Table.api.formatter.status` 快速将字段渲染成状态,默认`normal/hidden/deleted/locked`这四个状态
  5. > `Table.api.formatter.url` 快速将字段渲染成URL
  6. > `Table.api.formatter.search` 快速将字段渲染成可搜索的链接,点击后将执行搜索
  7. > `Table.api.formatter.addtabs` 快速将字段渲染成可添加到选项卡的链接,点击后将把链接添加到选项卡
  8. > `Table.api.formatter.flag` 快速将字段渲染成标志,仅支持`index/hot/recommend/new`这四种标志
  9. > `Table.api.formatter.label` 快速将字段渲染Label标签
  10. > `Table.api.formatter.datetime` 快速时间戳数据渲染成日期时间数据
  11. > `Table.api.formatter.operate` 操作栏固定按钮
  12. > `Table.api.formatter.buttons` 快速生成多个按钮
  13. > `Table.api.formatter.toggle` 快速生成切换按钮

我们可以自定义渲染数据,比如订单查询的时候,一个订单可能会对应多条商品数据,这在index页面显示的时候,就不好显示了,所以可以把每个订单对应的商品数据,都放在一个字段里,示例如下图所示,此处goods字段是控制器中with的一对多的goods模型

  1. {field: 'goods',title:'商品',formatter:function (value,data,key) {
  2. var content = '';
  3. value.forEach((value,key)=>{
  4. content += value.title+'-';
  5. content += value.attr_name+'*';
  6. content += value.num+',';
  7. });
  8. return content;
  9. }},
  10. // {field: 'address_address', title: __('Address_address')},

4、js中使用控制器中的数据

如果想在js中调用控制器中的方法,就不能使用$this->view->assign()了,得使用$this->assignconfig("total", $total),然后在js中调用Config.total,或可参考文章:js中如何使用控制器中的数据

5、自定义配置

在fast中,自带这很多类型的配置信息,类型比较丰富,有字符、文本、数组、单图、多图等,在做一下配置项的时候非常方便,比如一些比例设置、开关设置等

如果想自定义配置的话,也很简单,首先在application/common/model/config.php中获取配置类型的方法,可以追加自己想要的类型,比如:

  1. 'radio' => __('Radio'),
  2. 'array' => __('Array'),
  3. 'custom' => __('Custom'),
  4. 'rank' =>'名次规则',
  5. ];
  6. return $typeList;
  7. }

然后在application/admin/view/general/config/index.html文件中,增加自定义配置的格式就行了,比如我这个是借用一下数组的格式

  1. {case rank}
  2. <dl class="fieldlist" data-name="row[{$item.name}]">
  3. <dd>
  4. <ins>名次</ins>
  5. <ins>分红比例</ins>
  6. </dd>
  7. <dd><a href="javascript:;" class="btn btn-sm btn-success btn-append"><i class="fa fa-plus"></i> {:__('Append')}</a></dd>
  8. <textarea name="row[{$item.name}]" class="form-control hide" cols="30" rows="5">{$item.value}</textarea>
  9. </dl>
  10. {/case}

最后展示一下效果

6、自定义按钮

这里的自定义按钮并不是表格中的自定义菜单,而是工具栏按钮,如图所示:

html代码,切记a标签的title属性一定要有,否则在弹出框中没有顶部的标题:

  1. <a href="javascript:;" class="btn btn-default" style="font-size:14px;color:dodgerblue;">
  2. <i class="fa fa-dollar"></i>
  3. <span class="extend">
  4. 账户余额:<span id="price">0</span>
  5. </span>
  6. </a>
  7. <a class="btn btn-info btn-dialog btn-withdraw" href="shop/log/withdraw" data-name="withdraw" title="申请提现">
  8. <i class="fa fa-leaf"></i>申请提现
  9. </a>
  10. </div>

在js中增加事件:

  1. withdraw: function () {
  2. Controller.api.bindevent();
  3. },
  4. api: {
  5. bindevent: function () {
  6. Form.api.bindevent($("form[role=form]"));
  7. }
  8. }

最终效果图如下:

7、二级分类

在有的时候,需要有多级类别,比如添加商品的时候,需要先选择父类,再选择子类,其实,这个有点像三级联动,但是自己写起来比较麻烦,在fast中有已经写好了,详情请见插件中的开发实例中,这里只是整理一部分。

效果如图所示:父类是“心理”,然后下面有“心理测试”,“心理暗示”,两个子类,这样就能实现效果了

此处是源码部分:

  1. <div class="form-group">
  2. <label class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label>
  3. <div class="col-xs-12 col-sm-8">
  4. <div class="form-inline" data-toggle="cxselect" data-selects="first,second">
  5. <select data-rule="required" style="width: 50%" class="first form-control" name="row[category_pid]" data-url="ajax/category?type=science&amp;pid=0"></select>
    <select data-rule="required" style="width: 50%" class="second form-control" name="row[category_id]" data-url="ajax/category" data-query-name="pid"></select>
  6. </div>
  7. </div>
  8. </div>

这里重点是调用了ajax.php下的category方法,并传递两个参数,注意传递pid=0之后,需要更改下category方法,这里就不说明了 。

8、详情内自定义审核按钮

一般在查看详情的时候,有修改操作,自动生成的就是这个样子,默认就是确定及重置操作,其中确定是提交到form表单指定的action地址上,已经满足了日常修改的需求

但有时候,只有一个提交是不够的,特别是用到审核的时候,既有审核通过,也有审核拒绝,都是提交,那改怎么办呢,其实就是动态的修改form表单action指定的地址,

实现后效果如下:

这是代码:

  1. <div class="form-group layer-footer">
  2. <label class="control-label col-xs-12 col-sm-2"></label>
  3. <div class="col-xs-12 col-sm-8">
  4. {if condition="$row['admin_status'] eq 0"}
  5. <button onclick="on_sub(true);" class="btn btn-success">取消咨询</button>
  6. {/if}
  7. {if condition="$row['admin_refund_status'] eq 0"}
  8. <button onclick="on_sub(false);" class="btn btn-warning">同意退款</button>
  9. {/if}
  10. <!-- <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>-->
  11. <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
  12. </div>
  13. <input type="hidden" id="is_true" name="is_true" value="0">
  14. <script>
  15. var on_sub = function (on) {
  16. var url = on ? 'Consult/cancel' : 'Consult/refund';
  17. url = url + '?ids={:input("ids")}';
  18. $('#edit-form').attr('action',url);
  19. }
  20. </script>
  21. </div>

自动生成的edit页面,提交的时候默认是edit

9、手动增加软删除

在最开始设计表用命令生成增删改查的时候,如果一开始没有设计delete_time字段,就不能实现软删除,所以在后来想要再添加的时候,稍微有点麻烦,其实完全可以重新生成一个测试表,仿照新生成的model改一下就行了,强烈建议一开始就把软删除加上,不然如果已经写了接口再添加的话,你会骂娘的,关于软删除,更多可以查看手册:软删除

  1. use traits\model\SoftDelete;
  2.  
  3. class Product extends Model
  4. {
  5. use SoftDelete;
  6. // 自动写入时间戳字段
  7. protected $autoWriteTimestamp = 'int';
  8.  
  9. // 定义时间戳字段名
  10. protected $createTime = 'createtime';
  11. protected $updateTime = 'updatetime';
  12. protected $deleteTime = 'delete_time';//默认就是deleteTime,所以此处直接可以省略可以不写

需要注意的是:tp5底层实现软删除的delete_time字段默认值是null,而不是0,所以这个地方一定要注意!

10、手动更改toggle

一般toggle开关针对的是status字段,而且默认值是0或1,但是系统用户与后台管理员的status是字符串normal与hidden,所以要是也想实现toggle开关,可以添加yes:'normal',no:'hidden',还是直接上代码吧

  1. {
  2. field: 'status', title: __("Status"),
  3. searchList: {'hidden': __('Hidden'), 'normal': __('Normal')},
  4. formatter: function (value, row, index) {
  5. if(row.id == Config.admin.id){
  6. return '';
  7. }
  8. return Table.api.formatter.toggle.call(this, value, row, index);
  9. },
  10. yes: 'normal',
  11. no: 'hidden'
  12. },

然后,处理事件 我直接手写的

  1. /**
  2. * 批量更新
  3. * @internal
  4. */
  5. public function multi($ids = "")
  6. {
  7. // 管理员禁止批量操作
  8. //暂不考虑ids 是多个的情况下
  9. if ($ids > 1) {
  10. $status = $this->model->where('id',$ids)->value('status');
  11. $new_status = $status == 'normal' ? 'hidden' : 'normal' ;
  12. $this->model->save([
  13. 'status'=>$new_status,
  14. ],['id'=>$ids]);
  15. $this->success('操作成功');
  16. } else {
  17. $this->error('超级管理员不能隐藏');
  18. }
  19. }

如果有其他更好的方法,欢迎留言交流!

11、设置某字段正序或倒序按钮

  1. {field: 'id', title: __('Id'),operate:false,sortable: true},

这个太简单了,实在是不想多说了,其实就是字段在sql中的asc和desc,所以对于先查询出来,再二次加工的那种就不生效了

12、二级分类

在很多地方都用到二级分类,包括商品的一级分类是什么,二级分类是什么,选择范围只能是该一级分类下的二级分类,不多说了,还是直接上代码吧

这段代码在fastadmin的开发实例中有,可以参考那个,不过修改只提供了一种,这里还有更简单的方式

  1. <select class="first form-control" style="width: 50%" data-rule="required"
  2. name="row[jq_category_id]" data-url="jq/ajax/category" >
  3. <option selected="selected" value="{$row.jq_category_id|htmlentities}">{$row.jq_category_name|htmlentities}</option>
  4. </select>
  5. <select class="second form-control" style="width:50%" data-rule="required"
  6. name="row[jq_category_child_id]" data-url="jq/ajax/category"
  7. data-query-name="pid" value="{$row.jq_category_child_id|htmlentities}">
  8. <option selected="selected" value="{$row.jq_category_child_id|htmlentities}">{$row.jq_category_child_name|htmlentities}</option>
  9. </select>
  10.  
  11. <select class="first form-control" style="width: 50%" data-rule="required"
  12. name="row[jq_insurance_company_id]" data-url="jq/ajax/company?type=1" data-value="{$row.jq_insurance_company_id|htmlentities}">
  13. </select>
  14. <select class="second form-control" style="width: 50%" data-rule="required"
  15. name="row[jq_insurance_child_company_id]" data-value="{$row.jq_insurance_child_company_id|htmlentities}"
  16. data-url="jq/ajax/company?type=3" data-query-name="pid">
  17. </select>

13、控制table中字段的长度

在列表展示中,如果像一些字段比如简介或备注之类的东西,内容太长,全部显示有点不友好,这里是限制长度,给个width(百分比或ps都行),字符过长显示...,鼠标放上去,显示全部

  1. {field: 'des', title: __('Des'), operate:false,cellStyle:function (value,row,index,field) {
  2. return {
  3. css: {
  4. "min-width": "150px",
  5. "white-space": "nowrap",
  6. "text-overflow": "ellipsis",
  7. "overflow": "hidden",
  8. "max-width":"300px"
  9. }
  10. };
  11. },formatter:function (value,row,index,field) {
  12. var span=document.createElement('span');
  13. span.setAttribute('title',value);
  14. span.innerHTML = value;
  15. return span.outerHTML;
  16. }},

通过cssStyle自定义样式,然后再自定义formatter即可,效果如下所示

14、data_rule 验证规则

常用的data_rule就是required了,表示该字段不能为空,其他的还有 mobile,tel,email,url,chinese等,更多规则直接参考nice-validator,因为fastadmin就是用的这个插件

  1. <div class="form-group">
  2. <label class="control-label col-xs-12 col-sm-2">{:__('Claim_mobile')}:</label>
  3. <div class="col-xs-12 col-sm-8">
  4. <input id="c-claim_mobile" data-rule="required mobile|tel" class="form-control" name="row[data][claim_mobile]" type="text" value="">
  5. </div>
  6. </div>

15、

 

fastadmin 后台管理框架使用技巧(持续更新中)的更多相关文章

  1. linux常用小技巧(持续更新中)

    一.设置固定ip地址1.config查看用的是哪一个网卡这是假设用的是eth12.修改dns地址vim /etc/resolv.confsearch 域名地址nameserver 192.168.3. ...

  2. tp5 使用技巧(持续更新中...)

    tp5 使用技巧(持续更新中...) 1.自动写入时间 create_time和update_time 使用save方法才行,insert方法不生效,不知为何 2.过滤字段 allowfield和st ...

  3. git使用技巧集合(持续更新中)

    git使用技巧集合(持续更新中) 在团队协作中,git.svn等工具是非常重要的,在此只记录一些git使用过程中遇到的问题以及解决方法,并且会持续更新. 1.git commit之后,还没push,如 ...

  4. 《WCF技术剖析》博文系列汇总[持续更新中]

    原文:<WCF技术剖析>博文系列汇总[持续更新中] 近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析(卷1)>的写作,一直无暇管理自己的Blog.在<WCF技术剖 ...

  5. PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)

    PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++:      欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/ ...

  6. 从零开始搭建WebAPI Core_SqlSugar管理系统 (持续更新中......)

    从零开始搭建WebAPI Core_SqlSugar管理系统 前言 本系列皆在从零开始逐步搭建,后台管理系统服务端部分,后续还会推出前端部分. 这次的目的是搭出一个功能完善的 本次系列技术栈以下几个部 ...

  7. PLSQL Developer 11 使用技巧(持续更新)

    PLSQL Developer 11 使用技巧 (持续更新) 目录(?)[-] 首先是我的颜色配置 常用快捷键 提升PLSQL编程效率 按空格自动替换 关闭Window窗口 PLSQL 实用技巧 TI ...

  8. vue项目常用方法封装,持续更新中。。。

    vue项目中可以直接使用 1.常用工具类untils.js中 /* * 验证手机号是否合格 * true--说明合格 */ export function isPhone(phoneStr){ let ...

  9. git常用命令(持续更新中)

    git常用命令(持续更新中) 本地仓库操作git int                                 初始化本地仓库git add .                       ...

随机推荐

  1. display详细说明

    display:block,inline,inline-block区别 display:block就是将元素显示为块级元素. block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都可 ...

  2. 栅格那点儿事(四E)

    栅格金字塔   如果上面的部分都已经看过了,那么如何在ArcMap中更好的渲染一个栅格数据你已经知道了.可仅展示好一个栅格数据是不够的,我们还需要知道如何快速的展示一个栅格数据. 讲金字塔之前,先解释 ...

  3. Java获取Date类型-针对SQL语句

    简便使用Date类型: import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedState ...

  4. 【Troubleshooting 】Outlook 客户端无法显示电子邮件图像

    出于安全原因,Outlook 2013/2016不会在电子邮件中显示图像,但您可以右键单击图像并选择" 下载图片 "选项.我最近注意Outlook停止显示图像,并且没有下载图像的选 ...

  5. 微信小程序之性能优化

    如果做前端仅仅停留在编码和实现业务功能上面,可能进步速度会有些慢,但是如果经历了对页面的性能优化之后而且有所成绩的话那就不同了,因为你对他背后的机制进行了研究,才能做好性能优化. 做微信小程序也是一样 ...

  6. K星异客

    http://baike.baidu.com/view/222058.htm 这部改编自基恩·布汝尔1995年出版的同名小说的电影在当年的十月档票房榜上称冠.本来这部电影的外星人主人公属意于威尔.史密 ...

  7. ALPS语言学校(西雅图)|ALPS Language School (Seattle)

    http://www.swliuxue.com/school-3879.html 所属国家: 美国 所在省洲: 华盛顿州 所在城市: 华盛顿州 建校时间: 1992年 学校类型: 院校 学校类别: 私 ...

  8. 整理齐全 - Vultr VPS自定义安装Windows ISO(2003/2012/2008/WIN7)

    最近公司有几个项目是需要在Windows VPS服务器中运行调试的,但是公司给予的成本有限,所以只能在Linux VPS中考虑,毕竟Linux服务器相比Windows系统便宜很多.开始我们运维部门考虑 ...

  9. DataGrid 样式

    <SolidColorBrush x:Key="OutsideFontColor" Color="#FF000000" /> <LinearG ...

  10. 【CCPC-Wannafly Winter Camp Day4 (Div1) G】置置置换(动态规划)

    点此看题面 大致题意: 求出有多少个长度为\(n\)的排列满足对于奇数位\(a_{i-1}<a_i\),对于偶数位\(a_{i-1}>a_i\). 考虑打表? 考虑每次只有一个数\(n\) ...