# 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笔记
## 修改列表页面搜索栏针对的搜索字段
可实现检索后再过滤的功能。比如,先在标题检索栏中模糊搜索指定关键词的数据,再使用搜索栏进行二次过滤含有另一个关键词的数据。

支持同时对biaoTi和id两个字段进行搜索
**controller**
```
protected $searchFields = 'biaoTi,id';
```
## 修改登录账号长度限制
**public/assets/require-backend.min.js**
文件中将
```
请填写3-12位数字、字母、下划线
```
的一行正则改为
```
3,20
```
可以支持3-20位
## 列表页面显示列增加全选功能

**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显示内容优化

**add.html edit.html**
```
```
## 新增、编辑页面中的字段默认使用检索条件的内容
将检索栏中的参数是否为空作为add页面某个表单域是否显示的条件


**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',
}
});
```
## 字典类型的下拉列表
系统配置中新增一个字典




**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**
```
```
## 列表页检索栏支持多标签显示和搜索的形式

需要重新编写一套检索栏的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表单域联动计算

输入销售单价后,销售净单价实时计算和更新内容,输入销售净单价后,销售单价也实时计算和更新内容。
**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


**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