# FastAdmin笔记 **Repository Path**: weekee/fast-admin-notes ## Basic Information - **Project Name**: FastAdmin笔记 - **Description**: 用于记录FastAdmin开发实战 - **Primary Language**: PHP - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 6 - **Created**: 2025-06-10 - **Last Updated**: 2025-06-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # FastAdmin笔记 ## 修改列表页面搜索栏针对的搜索字段 可实现检索后再过滤的功能。比如,先在标题检索栏中模糊搜索指定关键词的数据,再使用搜索栏进行二次过滤含有另一个关键词的数据。 ![输入图片说明](https://foruda.gitee.com/images/1721308893913546297/c602a7e3_893102.jpeg "Snipaste_2024-07-18_21-18-07.jpg") 支持同时对biaoTi和id两个字段进行搜索 **controller** ``` protected $searchFields = 'biaoTi,id'; ``` ## 修改登录账号长度限制 **public/assets/require-backend.min.js** 文件中将 ``` 请填写3-12位数字、字母、下划线 ``` 的一行正则改为 ``` 3,20 ``` 可以支持3-20位 ## 列表页面显示列增加全选功能 ![输入图片说明](images/11.jpg) **js** ``` var table = $("#table"); ``` 的下一行增加 ``` table.on('post-common-search.bs.table', function (e, settings, json, xhr) { $("ul.dropdown-menu", settings.$toolbar).prepend("
  • "); $(document).on("click", "ul.dropdown-menu li[role='menucheckall'] input", function (e) { e.stopPropagation(); var that = settings; var checked = $(this).prop('checked'); $("ul.dropdown-menu li[role='menuitem'] input").each(function () { that.toggleColumn($(this).val(), checked, false); that.trigger('column-switch', $(this).data('field'), checked); $(this).prop("checked", checked); }); }); }); ``` ## selectpage显示内容优化 ![输入图片说明](images/Snipaste_2024-07-18_21-49-00.jpg) **add.html edit.html** ``` ``` ## 新增、编辑页面中的字段默认使用检索条件的内容 将检索栏中的参数是否为空作为add页面某个表单域是否显示的条件 ![输入图片说明](images/Snipaste_2024-07-18_21-55-43.jpg) ![输入图片说明](images/Snipaste_2024-07-18_21-56-30.jpg) **add.html** ``` {if empty($_GET['xiaoShouHeTong_id'])}
    {else} {/if} ``` **edit.html** ``` {if empty($_GET['kuCun_id'])}
    {else} {/if} ``` **js** ``` Table.api.init({ extend: { index_url: 'xiaoshouhetongmingxi/index' + location.search, add_url: 'xiaoshouhetongmingxi/add'+location.search,//点击按钮同时将检索栏内容带过去 edit_url: 'xiaoshouhetongmingxi/edit'+location.search, del_url: 'xiaoshouhetongmingxi/del', multi_url: 'xiaoshouhetongmingxi/multi', import_url: 'xiaoshouhetongmingxi/import', table: 'xiaoshouhetongmingxi', } }); ``` ## 字典类型的下拉列表 系统配置中新增一个字典 ![输入图片说明](images/111.jpg) ![输入图片说明](images/22.jpg) ![输入图片说明](images/33.png) ![输入图片说明](images/44.jpg) **controller index()** ``` $this->assignconfig('xiaoShouHeTongMingTou', config('site.xiaoShouHeTongMingTou'));//销售合同名头 ``` **controller add() edit()** ``` //产品类型列表 $chanPinLeiXingArr = array(); foreach (config('site.chanPinLeiXing') as $k => $v){ $chanPinLeiXingArr[] = array( "id" => $k, "title" => $v, ); } $chanPinLeiXingJson = json_encode($chanPinLeiXingArr,JSON_UNESCAPED_UNICODE); $this->assign('chanPinLeiXingJson',$chanPinLeiXingJson ); return $this->view->fetch(); ``` **js** ``` {field: 'chanPinLeiXing', title: __('Chanpinleixing'), searchList: Config.chanPinLeiXing, formatter:function (value) { for (const valueKey in Config.chanPinLeiXing) { if (valueKey == value){return Config.chanPinLeiXing[valueKey]} } } }, ``` **add.html** ``` ``` **edit.html** ``` ``` ## 列表页检索栏支持多标签显示和搜索的形式 ![输入图片说明](images/Snipaste_2024-07-21_15-46-07.jpg) 需要重新编写一套检索栏的html模板。 自定义检索栏 **js** 设置table.bootstrapTable中的searchFormTemplate ``` url: $.fn.bootstrapTable.defaults.extend.index_url, pk: 'id', sortName: 'id', fixedColumns: true, fixedRightNumber: 1, searchFormTemplate: 'shangpinkandengformtpl', searchFormVisible: true, ``` **index.html** ``` ``` ## add、edit表单域联动计算 ![输入图片说明](images/Snipaste_2024-07-21_15-56-43.jpg) 输入销售单价后,销售净单价实时计算和更新内容,输入销售净单价后,销售单价也实时计算和更新内容。 **js** ``` $("#c-xiaoShouDanJia").keyup(function () { console.log("销售单价change"); let xiaoShouDanJia =$(this).val(); let shuiLv =$('input[name="row[shuiLv]"]').val(); let shuiLvFlo = parseFloat(shuiLv); let xiaoShouDanJiaFlo = parseFloat(xiaoShouDanJia); let xiaoShouJingDanJia =xiaoShouDanJiaFlo/(1+shuiLvFlo/100); $('input[name="row[xiaoShouJingDanJia]"]').val(xiaoShouJingDanJia.toFixed(2)); }); $("#c-xiaoShouJingDanJia").keyup(function () { console.log("销售净单价change"); let xiaoShouJingDanJia =$(this).val(); let shuiLv =$('input[name="row[shuiLv]"]').val(); let shuiLvFlo = parseFloat(shuiLv); let xiaoShouJingDanJiaFlo = parseFloat(xiaoShouJingDanJia); let xiaoShouDanJia =xiaoShouJingDanJiaFlo*(1+shuiLvFlo/100); $('input[name="row[xiaoShouDanJia]"]').val(xiaoShouDanJia.toFixed(2)); }); return Controller; ``` ## 新增和编辑时,需要修改提交的表单数据 **controller add() edit()** ``` //计算需要计算的字段 $params['dianJiBiaoJia'] = empty($params['dianJiJingBiaoJia'])?0:$params['dianJiJingBiaoJia'] * (empty($params['shuiLv'] )?0:$params['shuiLv'] /100 +1); //电机表价 = 电机净表价*(1+税率/100) ``` ## 添加、编辑、删除时同时更新父级页面的字段数据 **controller add() edit() delete()** ``` //先计算一下费用总额 $chengBenZongE = $this->jiSuanZongE($params,"chengBen"); $xiaoShouZongE = $this->jiSuanZongE($params,"xiaoShou"); $yiFuKuanZongE = $this->jiSuanZongE($params,"yiFuKuan"); $yingFuKuanZongE = $this->jiSuanZongE($params,"yingFuKuan"); $yunFeiZongE = $this->jiSuanZongE($params,"yunFei"); //更新销售合同页面的数据:成本总额、销售总额、已付款总额、应付款总额、运费总额、利润总额(触发其自动执行) $this->updateXiaoShouHeTongZongE($params, $chengBenZongE, $xiaoShouZongE, $yiFuKuanZongE, $yingFuKuanZongE, $yunFeiZongE ); private function jiSuanZongE($params,$zongELeiXing) { switch ($zongELeiXing){ case "chengBen": return $this->modelCaiGouDingDan ->where('xiaoShouHeTong_id', $params['xiaoShouHeTong_id']) ->sum('chengBenZongJia'); case "xiaoShou": return $this->model ->where('xiaoShouHeTong_id', $params['xiaoShouHeTong_id']) ->sum('xiaoShouZongJia'); case "yiFuKuan": return $this->model ->where('xiaoShouHeTong_id', $params['xiaoShouHeTong_id']) ->sum('yiFuKuan'); case "yingFuKuan": return $this->model ->where('xiaoShouHeTong_id', $params['xiaoShouHeTong_id']) ->sum('yingFuKuan'); case "yunFei": return $this->modelKuCun ->where('xiaoShouHeTong_id', $params['xiaoShouHeTong_id']) ->sum('yunFeiHeJi'); default: return ""; } } private function updateXiaoShouHeTongZongE($params, $chengBenZongE, $xiaoShouZongE, $yiFuKuanZongE, $yingFuKuanZongE, $yunFeiZongE) { //更新销售合同表的成本总额 $this->modelXiaoShouHeTong ->where('id', $params['xiaoShouHeTong_id']) ->update(['chengBenZongE' => $chengBenZongE]); //更新销售合同表的销售总额 $this->modelXiaoShouHeTong ->where('id', $params['xiaoShouHeTong_id']) ->update(['xiaoShouZongE' => $xiaoShouZongE]); //更新销售合同表的已付款总额 $this->modelXiaoShouHeTong ->where('id', $params['xiaoShouHeTong_id']) ->update(['yiFuKuanZongE' => $yiFuKuanZongE]); //更新销售合同表的应付款总额 $this->modelXiaoShouHeTong ->where('id', $params['xiaoShouHeTong_id']) ->update(['yingFuKuanZongE' => $yingFuKuanZongE]); //更新销售合同表的运费总额 $this->modelXiaoShouHeTong ->where('id', $params['xiaoShouHeTong_id']) ->update(['yunFeiZongE' => $yunFeiZongE]); } ``` ## 列表页数据 a关联b b关联c,取c表的一个字段:(该写法where条件无法使用) xiaoshouhetongmingxi表关联caigoudingdan表,caigoudingdan表关联gongyingshang,显示gongyingshang表的gongYingShang字段 注意:getRelation('caigoudingdan')->visible(函数中要加gongYingShang字段 **controller index()** ``` if ($this->request->isAjax()) { //如果发送的来源是Selectpage,则转发到Selectpage if ($this->request->request('keyField')) { return $this->selectpage(); } list($where, $sort, $order, $offset, $limit) = $this->buildparams(); $list = $this->model ->with(['xiaoshouhetong','chanpinleixing','guige','dinghuoxinghao','caigoudingdan']) ->where($where) ->order($sort, $order) ->paginate($limit); foreach ($list as $row) { $row->getRelation('xiaoshouhetong')->visible(['xiaoShouHeTongMingCheng']); $row->getRelation('chanpinleixing')->visible(['chanPinLeiXing']); $row->getRelation('guige')->visible(['guiGe']); $row->getRelation('dinghuoxinghao')->visible(['dingHuoXingHao']); $row->getRelation('caigoudingdan')->visible(['id','caiGouDingDanMingCheng','gongYingShang_id','caiGouDingDanHao','caiGouDingDanDiZhi','chengBenJingDanJia','chengBenJingZongJia','chengBenDanJia','chengBenZongJia','gongYingShang']); $row->caigoudingdan->gongYingShang = Db::name("gongyingshang")->where("id",$row->caigoudingdan->gongYingShang_id)->value("gongYingShang"); } $result = array("total" => $list->total(), "rows" => $list->items()); return json($result); } ``` ## selectpage 二级联动 a联动b ![输入图片说明](images/Snipaste_2024-07-21_21-06-13.jpg) ![输入图片说明](images/Snipaste_2024-07-21_21-06-41.jpg) **b的controller index()** ``` list($where, $sort, $order, $offset, $limit) = $this->buildparams(); $param1 = $this->request->param(); if(!empty($param1['custom'])){ $where1['xiaoShouHeTong_id'] = $param1['custom']['xiaoShouHeTong_id']; }else{ $where1 = "id > 0"; } $list = $this->model ->with(['xiaoshouhetong','chanpinleixing','guige','dinghuoxinghao','caigoudingdan']) ->where($where) ->where($where1) ->order($sort, $order) ->paginate($limit); ``` **js** ``` add: function () { $("#c-xiaoShouHeTongMingXi_id").data("params", function(){ return {custom: {xiaoShouHeTong_id: $("#c-xiaoShouHeTong_id").val()}}; }); Controller.api.bindevent(); }, edit: function () { $("#c-xiaoShouHeTongMingXi_id").data("params", function(){ return {custom: {xiaoShouHeTong_id: $("#c-xiaoShouHeTong_id").val()}}; }); Controller.api.bindevent(); }, ``` ## 直接执行一个sql语句 **controller** ``` $execRet = Db::execute(' INSERT INTO fa_kucun_liushui ( quTuiHuoFeiYong, qiTaZaFei, feiYongHeji, yue ) SELECT ifnull( kuaizhao1.cangChuFeiYong, 0 )- ifnull( kuaizhao2.cangChuFeiYong, 0 ), ifnull( kuaizhao1.yiQuTuiHuoShuLiang, 0 )- ifnull( kuaizhao2.yiQuTuiHuoShuLiang, 0 ), ifnull( kuaizhao1.quTuiHuoFeiYong, 0 )- ifnull( kuaizhao2.quTuiHuoFeiYong, 0 ), ifnull( kuaizhao1.qiTaZaFei, 0 )- ifnull( kuaizhao2.qiTaZaFei, 0 ), ifnull( kuaizhao1.feiYongHeji, 0 )- ifnull( kuaizhao2.feiYongHeji, 0 ), 0 FROM fa_kucun_kuaizhao kuaizhao1 LEFT JOIN fa_kucun_kuaizhao kuaizhao2 ON kuaizhao1.kuCun_id = kuaizhao2.kuCun_id AND kuaizhao1.kuaiZhaoRiQi = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY), "%Y-%m-%d") AND kuaizhao2.kuaiZhaoRiQi = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 2 DAY), "%Y-%m-%d") WHERE kuaizhao1.kuaiZhaoRiQi = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY), "%Y-%m-%d") ORDER BY kuaizhao1.kuaiZhaoRiQi DESC; '); ``` ## 表单域中设置为不可输入,不影响正常提交数据 **add.hml edit.html** ``` ``` ## 前端某一列使用其他列的数据 js保留两位小数 **js** ``` {field: 'liRun', title: __('Lirun'), operate:'BETWEEN',formatter:function (value, row, index) { console.log(row.xiaoShouZongJia); console.log(row.caigoudingdan.chengBenZongJia); console.log(row.yunFeiHeJi); return (row.xiaoShouZongJia-row.caigoudingdan.chengBenZongJia-row.yunFeiHeJi).toFixed(2); }}, ``` ## 在列表页中增加任意数据字段 yunFeiHeJi为后添加进来的字段 **controller index** ``` $list = $this->model ->with(['xiaoshouhetong','chanpinleixing','guige','dinghuoxinghao','caigoudingdan']) ->where($where) ->where($where1) ->order($sort, $order) ->paginate($limit); foreach ($list as $row) { $row->getRelation('xiaoshouhetong')->visible(['xiaoShouHeTongMingCheng']); $row->getRelation('chanpinleixing')->visible(['chanPinLeiXing']); $row->getRelation('guige')->visible(['guiGe']); $row->getRelation('dinghuoxinghao')->visible(['dingHuoXingHao']); $row->getRelation('caigoudingdan')->visible([ 'id','caiGouDingDanMingCheng','gongYingShang_id', 'caiGouDingDanHao','caiGouDingDanDiZhi','chengBenJingDanJia','chengBenJingZongJia', 'chengBenDanJia','chengBenZongJia','gongYingShang','yunFeiHeJi' ]); $row->caigoudingdan->gongYingShang = Db::name("gongyingshang")->where("id",$row->caigoudingdan->gongYingShang_id)->value("gongYingShang"); $row->yunFeiHeJi = Db::name("kucun")->where("caiGouDingDan_id",$row->caigoudingdan->id)->value('yunFeiHeJi'); } $result = array("total" => $list->total(), "rows" => $list->items()); return json($result); ``` ## 日期表单允许为空 **controller** 复制通用的add函数 ``` //处理时间,如果时间为空,设置为null if (empty($params['ruKuShiJian'])) { $params['ruKuShiJian'] = null; } if (empty($params['chuKuShiJian'])) { $params['chuKuShiJian'] = null; } ``` ## 关闭子页面后刷新父页面 **js** ``` //关闭弹窗后触发父窗口的刷新按钮点击事件,进而完成父页面数据刷新。 parent.window.$(".layui-layer-iframe").find(".layui-layer-close").on('click',function () { parent.$(".btn-refresh").trigger("click"); }); // 为表格绑定事件 Table.api.bindevent(table); ``` ## 带条件更新数据 **controller add edit** ``` $this->modelKuCun->allowField(true)->save(array( 'yunFeiHeJi' => $yunFeiSum, 'kuCunShuLiang' =>$kuCunShuLiang, ),['id' =>$params['kuCun_id']]); ``` ## 带条件针对某一字段求和 **controller add edit** ``` //计算当前库存的运费合计,更新库存表 $yunFeiSum =$this->model->where('kuCun_id',$params['kuCun_id'])->sum('yunFei'); ``` ## 列表页上方显示统计数据 **controller inde** ``` $chengBenZongJiaSum = $this->model ->with(['gongyingshang','dinghuoxinghao','guige','xiaoshouhetong','xiaoshouhetongmingxi','kehu','caigoudingdandizhi']) ->where($where)->sum("chengBenZongJia"); $result = array( "total" => $list->total(), "rows" => $list->items(), "extend" => [ 'chengBenZongJiaSum' => number_format($chengBenZongJiaSum, 2), 'xiaoShouZongJiaSum' => number_format($xiaoShouZongJiaSum, 2), 'keHuYiFuKuanSum' => number_format($keHuYiFuKuanSum, 2), 'yingFuKuanZongESum' => number_format($yingFuKuanZongESum, 2), 'yunFeiSum' => number_format($yunFeiSum, 2), 'liRunSum' => number_format($liRunSum, 2), ], ); ``` **html index.html** ``` 成本总额: 销售总额: 已付款总额: 应付款总额: 运费总额: 利润总额:
    ``` **js** ``` // 为表格绑定事件 Table.api.bindevent(table); //当表格数据加载完成时 table.on('load-success.bs.table', function (e, data) { //这里可以获取从服务端获取的JSON数据 $("#chengBenZongJiaSum").text(data.extend.chengBenZongJiaSum); $("#xiaoShouZongJiaSum").text(data.extend.xiaoShouZongJiaSum); $("#keHuYiFuKuanSum").text(data.extend.keHuYiFuKuanSum); $("#yingFuKuanZongESum").text(data.extend.yingFuKuanZongESum); $("#yunFeiSum").text(data.extend.yunFeiSum); $("#liRunSum").text(data.extend.liRunSum); }); ``` ## 列表页鼠标悬停提示 **js** ``` {field: 'xiaoShouZongJia', title: __('Xiaoshouzongjia'), titleTooltip: "=销售单价*数量",operate: 'LIKE'}, ``` ## 修改上方标签的背景颜色 **public/assets/css/skins/skin-black.css** ``` .skin-black .main-header .navbar .nav > .active > a { background: rgb(167 167 167 / 84%); ``` ## 给前端的数据只暴露指定表的指定列数据的用法 (只显示关联表kehuhao的xiaoShouHeTongMingTou数据给前端) **controller index** ``` foreach ($list as $row) { $row->visible(['id','xiaoShouHeTongMingCheng','xiaoShouHeTongMingTou', 'xiaoShouHeTongHao','qianDingRiQi','keHuHeTongHao', 'xiangMuMingCheng','xiaoShouZongE']); $row->visible(['xiaoshourenyuan']); $row->getRelation('xiaoshourenyuan')->visible(['xingMing','dianHua']); $row->visible(['kehu']); $row->getRelation('kehu')->visible(['keHuMingCheng']); $row->visible(['kehuhao']); $row->getRelation('kehuhao')->visible(['xiaoShouHeTongMingTou']); } ``` ## 发送邮件报错问题处理 应用项目:圣派 **application/common/library/Email.php** ``` $this->mail = new Mailer(new Log); ``` 修改为: ``` $this->mail = new Mailer(); ``` ## 前端设置某一列默认不显示 应用项目:圣派 - 销售合同管理 **js** ``` {field: 'xiaoShouRenYuan_id', title: __('Xiaoshourenyuan_id'),visible:false}, ``` ## 解决页面搜索栏搜索时报错 应用项目:圣派 - 客户管理 提示id歧义的问题,是因为没有添加关联查询的属性,在controller中添加即可。 **controller** ``` protected $relationSearch=true; ``` ## 页面添加和编辑数据时,做唯一性校验 应用项目:圣派 - 订货型号管理 **controller** ``` protected $model = null; protected $modelValidate = true; validate\Dinghuoxinghao.php /** * 验证规则 */ protected $rule = [ 'dingHuoXingHao|订货型号' => 'unique:dinghuoxinghao', ]; ``` ## 页面附加额外条件,解决对日期筛选为空或者不为空的场景 **js** 增加额外的筛选项 ``` {field: 'ruKuRiQi2', title: '入库日期是否为空', searchList: {"1":"为空","2":"不为空"}, formatter: Table.api.formatter.normal,visible:false}, ``` **js** 将入库日期2和出库日期2筛选内容附加到入库日期出库日期上 ``` url: $.fn.bootstrapTable.defaults.extend.index_url, pk: 'id', sortName: 'id', queryParams:function(params){ var filter=JSON.parse(params.filter); var op = JSON.parse(params.op); if (filter.ruKuRiQi2 == "1"){ filter.ruKuRiQi='null'; op.ruKuRiQi='is'; delete filter.ruKuRiQi2; delete op.ruKuRiQi2; params.filter=JSON.stringify(filter); params.op = JSON.stringify(op); } else if (filter.ruKuRiQi2 == "2"){ filter.ruKuRiQi='not null'; op.ruKuRiQi='is'; delete filter.ruKuRiQi2; delete op.ruKuRiQi2; params.filter=JSON.stringify(filter); params.op = JSON.stringify(op); } if (filter.chuKuRiQi2 == "1"){ filter.chuKuRiQi='null'; op.chuKuRiQi='is'; delete filter.chuKuRiQi2; delete op.chuKuRiQi2; params.filter=JSON.stringify(filter); params.op = JSON.stringify(op); } else if (filter.chuKuRiQi2 == "2"){ filter.chuKuRiQi='not null'; op.chuKuRiQi='is'; delete filter.chuKuRiQi2; delete op.chuKuRiQi2; params.filter=JSON.stringify(filter); params.op = JSON.stringify(op); } return params; }, ``` ## 两表关联查询,带where条件取值 **controller** ``` $result = $this->modelXiaoShouHeTong::alias('xiaoshouhetong') ->field('kehu.id as keHu_id,kehu.keHuMingCheng as keHu') ->join("kehu","xiaoshouhetong.keHu_id=kehu.id") ->where(['xiaoshouhetong.id' => $xiaoShouHeTong_id]) ->find(); if (empty($result)){ $this->success("","",["keHu_id"=>'',"keHu"=>'']); }else{ $this->success("","",["keHu_id"=>$result->keHu_id,"keHu"=>$result->keHu]); } ``` ## 前端发送post 请求后端数据 **js** ``` add: function () { // add页面selectpage下拉菜单二级联动 $("#c-xiaoShouHeTongMingXi_id").data("params", function(){ return {custom: {xiaoShouHeTong_id: $("#c-xiaoShouHeTong_id").val()}}; }); Controller.api.bindevent(); $("#c-xiaoShouHeTong_id").on( "change",function (e, data) { //调用后端接口,获得客户下拉选项的默认值 Fast.api.ajax({ url:'caigoudingdan/huoQuKeHuXinXi', data:{xiaoShouHeTong_id:$("#c-xiaoShouHeTong_id").val()}, },function (data) { $("#c-keHu_id_text").val(data.keHu); $("#c-keHu_id").val(data.keHu_id); },function () { }) }); }, ``` ## 访问后端接口提示没有权限 可能是因为没有在菜单规则中添加对应接口的权限。 ## php代码中保留两位小数 ``` $xiaoShouZongJiaHeJi = number_format($xiaoShouZongJiaHeJi,2); ``` ## 字段增加排序 **js** ``` {field: 'crt_time',sortable:true, title: __('Crt_time'), operate:'RANGE', addclass:'datetimerange', autocomplete:false}, ``` ## 枚举类型字段生成页面的问题 使用命令行生成页面,如果数据字段设置成枚举类型,则生成的页面中该字段是下拉选项 如果在生成命令前将状态字段指定为实际的字段名字,则会生成带tab标签的页面。 ## 上传文件类型受限 **application\extra\upload.php** mimetype中增加需要的类型文件 ``` 'mimetype' => 'jpg,png,bmp,jpeg,gif,webp,zip,rar,wav,mp4,mp3,webm,xls,xlsx', ``` ## 获取当前用户登录信息 **controller** ``` $user = Session::get('admin'); if (empty($user['id'])) { $this->error(__('获取当前用户ID失败,请联系管理员')); } $userInfo = Db::table('fa_admin')->where('id', $user["id"])->find(); $userInfo["keHu_id"] ``` ## 管理员设置组,多选改为单选。下拉框多选改为单选 **view add.html edit.html** ``` {:build_select('group[]', $groupdata, $groupids, ['class'=>'form-control selectpicker', 'multiple'=>'', 'data-rule'=>'required'])} ``` 改为: ``` {:build_select('group[]', $groupdata, $groupids, ['class'=>'form-control selectpicker', 'data-rule'=>'required'])} ``` ## 页面上方增加一个批量操作的按钮,在html中增加按钮写入一个参数来区分功能 **index.html** ``` 批量加入商品刊登2 ``` 用data-params="2" 来区分功能 ## 列表页面中有url的情况 如果前端设置的格式为:formatter: Table.api.formatter.url 在列表页中显示好看一些,但导出表格时,url没有被导出。 可以修改页面formatter为自定义格式: ``` formatter: function (value,row,index){ if (value){ return ''; }else{ return '' } } ``` ## 日期控件 时间控件 中的英文换成中文 **public\assets\libs\eonasdan-bootstrap-datetimepicker\build\js** **bootstrap-datetimepicker.min.js** 直接修改min.js或者修改src\js\bootstrap-datetimepicker.js 再使用命令编译一次js