跳到主要内容

选项设置

单选框组、多选框组、下拉选择框的选项有四种来源:静态数据源、数据字典、Api、表字典,在「控件设置 → 选项」中选择。

一、静态数据源​

直接在控件上添加选项。每个选项都有「文本」和「值」两个输入框:文本用于展示,值是实际保存到数据库的内容。

JSON 批量配置​

v2.5.5+ 支持此功能。

点击「JSON」可以一次性粘贴批量配置,内容必须是 JSON 数组:

[
{ "label": "男", "value": "1" },
{ "text": "女", "value": "2" }
]
写法说明
{"label": "男", "value": "1"}标准写法,label 为文本,value 为值

二、数据字典​

点击输入框打开「选择字典」弹窗,选择要使用的字典。

v2.5.5+ 弹窗分为【积木字典】和【系统字典】两个页签。

页签数据来源维护位置
积木字典积木报表自己的字典积木报表「数据字典」管理,参考 数据字典维护
系统字典集成方的系统字典(如 JeecgBoot 系统字典)集成方自己的字典管理,在积木中只读

使用规则:

  • 选了哪个页签的字典,填报时就只从那个来源取,两者互不回落:选了系统字典,系统里没有这个编码时选项为空,不会再去积木字典里找;反之亦然。
  • 升级前已经配置好的报表(没有记录字典来源)按积木字典处理,行为不变。
  • 【系统字典】页签只有集成方实现了下面的 getDictList 方法、并且返回了数据时才会显示。
  • 下拉框里的搜索、编辑记录时已选项的回显、滚动分页,对系统字典同样有效,由积木报表完成,集成方无需处理。
预览时的积木字典

开启多租户模式(saasMode 为 created 或 tenant)时,积木字典会按创建人或租户隔离。填报报表在预览、分享预览时不按当前登录人隔离,保证其他用户打开报表时也能看到报表作者配置的积木字典;在设计器里仍按当前登录人隔离。

集成系统字典​

在 JmReportTokenServiceI 的实现类中实现以下两个方法(不实现则【系统字典】页签不显示,不影响积木字典的使用):

方法用途
getDictItems(String dictCode)按字典编码返回全部字典项,填报控件选了系统字典时调用。只需按编码返回全部字典项,搜索、回显、分页由积木报表完成
getDictList(String token, String dictName, String dictCode, Integer pageNo, Integer pageSize)「选择字典」弹窗【系统字典】页签的分页列表,dictName、dictCode 分别对应弹窗里的「字典名称」「字典编号」查询条件

代码示例(写死了「性别」「学历」两个字典,实际项目请改成查询自己的字典表):

@Slf4j
@Component
public class JimuReportTokenServiceImpl implements JmReportTokenServiceI {

/**
* 【示例】系统字典:编码 -> 字典名称
*/
private static final Map<String, String> DEMO_DICT_NAMES = new LinkedHashMap<String, String>() {{
put("sex", "性别");
put("xueli", "学历");
}};

/**
* 【示例】系统字典:编码 -> 字典项
*/
private static final Map<String, List<JmDictModel>> DEMO_DICT_ITEMS = new LinkedHashMap<String, List<JmDictModel>>() {{
put("sex", Arrays.asList(new JmDictModel("1", "男"), new JmDictModel("2", "女")));
put("xueli", Arrays.asList(new JmDictModel("1", "大专"), new JmDictModel("2", "本科"),
new JmDictModel("3", "硕士"), new JmDictModel("4", "博士")));
}};

/**
* 根据字典编码查询字典项
*/
@Override
public List<JmDictModel> getDictItems(String dictCode) {
return DEMO_DICT_ITEMS.get(dictCode);
}

/**
* 分页查询系统字典列表,供「选择字典」弹窗的【系统字典】页签使用
*/
@Override
public JmPage<JmSysDictModel> getDictList(String token, String dictName, String dictCode, Integer pageNo, Integer pageSize) {
List<JmSysDictModel> allList = new ArrayList<>();
for (Map.Entry<String, String> dict : DEMO_DICT_NAMES.entrySet()) {
allList.add(new JmSysDictModel(dict.getKey(), dict.getValue()));
}
if (StringUtils.isNotEmpty(dictName)) {
allList.removeIf(dict -> !dict.getDictName().contains(dictName));
}
if (StringUtils.isNotEmpty(dictCode)) {
allList.removeIf(dict -> !dict.getDictCode().contains(dictCode));
}
// 分页
int current = (pageNo == null || pageNo < 1) ? 1 : pageNo;
int size = (pageSize == null || pageSize < 1) ? 10 : pageSize;
int fromIndex = Math.min((current - 1) * size, allList.size());
int toIndex = Math.min(fromIndex + size, allList.size());
JmPage<JmSysDictModel> page = new JmPage<>();
page.setPageNo(current);
page.setPageSize(size);
page.setTotal(allList.size());
page.setRecords(allList.subList(fromIndex, toIndex));
return page;
}
}
与报表字段字典的区别

报表数据集字段的「字典 code」对接 JeecgBoot 系统字典的方式见 JeecgBoot 系统字典对接,那里是积木字典优先、找不到再取系统字典;填报控件则按「选择字典」时选的页签明确区分来源。

三、Api​

填写返回选项数据的接口地址。

  • 只支持以 http:// 或 https:// 开头的完整地址,例如 http://192.168.1.10:8080/jeecg-boot/test/getOptions;相对路径不支持

例:http://api.jeecg.com/mock/26/option_api

请求时积木会自动拼接以下参数:

参数名类型说明
searchTextString下拉框输入的搜索关键字
searchValueString指定的值(多个逗号分隔),编辑记录时用于回显已选项,有值时才传
pageNoInteger当前页码
pageSizeInteger每页条数
queryAllBoolean是否查询全部,为 true 时需返回全部数据

返回格式:

[
{ "text": "群众", "value": 0 },
{ "text": "团员", "value": 1 },
{ "text": "党员", "value": 2 }
]

四、表字典​

直接从数据库表里取选项,配置分为三步:

  1. 数据来源:选择数据源和数据库表。
  2. 字段映射:选择存储字段(值)和显示字段(文本)。
  3. 过滤条件(可选,v2.5.5+):按 SQL 的 WHERE 条件来写,不用写 where 关键字,例如:
sex = '1' and status = 1

注意

过滤条件会做 SQL 注入校验,包含 union、select、注释(--、/* */)、多语句(;)、盲注函数(sleep、ascii、substr 等)的条件会被拦截,只支持普通的字段比较、like、in 等写法。

五、接口参数说明​

数据字典和 Api 两种来源调用的都是 /jmreport/form/getDictList,前端会自动传参,以下供自定义前端参考:

参数名类型必填说明
dictCodeString✅字典编码(Api 来源时为接口地址)
searchTextString❌搜索关键字
searchValueString❌指定字典值(多个逗号分隔),用于回显已选项
pageNoInteger❌当前页码
pageSizeInteger❌每页条数
queryAllBoolean✅是否查询全部