图文介绍

发布日志v2.7

PC 端整体界面深度优化

  • 配色系统化、主题化、Token 化
  • 支持通过 custom.css 自定义 UI 配色
  • 文档系统迁移

数据源

文件数据源上传优化

  • 文件资源树,大文件上传增加进度条显示
  • 文件上传完成定位文件位置
  • 区分上传文件类型

数据集

数据脱敏 重要

场景

面向手机号、身份证号、邮箱、住址等敏感字段,让图表展示、明细数据、维度下拉只暴露脱敏后的内容, 底层数据与查询 SQL 保持不变,满足合规与隐私要求。

  • 支持脱敏字段过滤
  • 提供常用脱敏模板,支持自定义脱敏规则

详见 数据集基础 - 数据脱敏

字段自动补全 重要

数据集 SQL 编辑器输入提示

  • 支持表提示
  • 支持字段提示
  • 字段提示时支持表别名区分,如 b. 只显示别名为 b 的表字段

模板引擎增加条件函数 重要

cc 对象提供了内置的条件判断函数,可以极大简化传统的 <% %> 脚本块语法。使用 #value 占位符可以引用当前变量的具体值。

如下原来判断变量是否存在的逻辑脚本处理

<%
  var  where = "where 1 = 1";
  if (has(township)) {
      where = where + (" AND township = '" + township + "'");
  }
  if (has(village)) {
      where = where + (" AND village = '" + village + "'");
  }
  if (has(group_name)) {
      where = where + (" AND group_name = '" + group_name + "'");
  }
%>
select *,1 as cnt from pas_wm_dz_wt ${where}

使用条件函数之后

select *,1 as cnt from pas_wm_dz_wt
 where 1 = 1
 ${cc.isNotBlank(township, "AND township = '#value'")}
 ${cc.isNotBlank(village, "AND village = '#value'")}
 ${cc.isNotBlank(group_name, "AND group_name = '#value'")}

cc 函数参考列表

函数说明
cc.isBlank(val)当值为 null 或空字符串时返回 true
cc.isNotBlank(val)当值非空时返回 true
cc.isBlank(val, then)当 val 为空时返回 then 表达式
cc.isNotBlank(val, then)当 val 非空时返回 then 表达式(支持 #value 占位符)
cc.isNotBlank(val, then, else)根据 val 是否非空分别返回 then / else
cc.eq(val, target)当 val 等于 target 时返回 true
cc.eq(val, target, then)当 val 等于 target 时返回 then 表达式(支持 #value 占位符)
cc.ne(val, target, then)当 val 不等于 target 时返回 then 表达式
cc.inList(val, list)当 val 存在于 list 列表中时返回 true(支持分号或逗号分隔)
cc.inList(val, list, then)当 val 存在于 list 列表中时返回 then(支持 #value 占位符用于 IN 子句)
cc.notInList(val, list, then)当 val 不存在于 list 列表中时返回 then
cc.contains(val, substr, then)当 val 包含子串 substr 时返回 then
cc.startsWith(val, prefix, then)当 val 以 prefix 前缀开头时返回 then
cc.endsWith(val, suffix, then)当 val 以 suffix 后缀结尾时返回 then
cc.between(val, min, max, then)当 val 在 min 和 max 范围之间时返回 then
cc.match(val, pattern, then)当 val 匹配正则表达式 pattern 时返回 then
cc.ifNull(val, default)当 val 为空时返回默认值 default,否则返回 val 原值
cc.coalesce(val1, val2, ...)返回第一个非空的值
cc.when(condition, then)当条件 condition 为 true 时返回 then
cc.when(condition, then, else)根据条件 condition 分别返回 then / else

三元表达式与 cc 函数结合

-- inList 与三元表达式结合
${cc.inList(name, ['a', 'b', 'c']) ? 'A类' : 'B类'}

-- isNotBlank 与三元表达式结合
${cc.isNotBlank(remark) ? remark : '无备注'}

-- eq 与三元表达式结合
${cc.eq(level, '1') ? 'VIP用户' : '普通用户'}

SQL 数组转换函数 — sql

函数说明示例
sql.numberArray(val)转换为数值型 IN 列表:(1, 2, 3)sql.numberArray("1;2;3") → (1, 2, 3)
sql.stringArray(val)转换为字符串型 IN 列表:('a', 'b', 'c')sql.stringArray("a,b,c") → ('a', 'b', 'c')

典型使用示例

-- 使用 sql.numberArray 构造动态 IN 条件
${cc.isNotBlank(dept_no, "AND dept_no IN" + sql.numberArray(dept_no))}
-- 输出结果:AND dept_no IN (1, 2, 3)

-- 使用 sql.stringArray 构造动态 IN 条件
${cc.isNotBlank(dept_name, "AND dept_name IN" + sql.stringArray(dept_name))}
-- 输出结果:AND dept_name IN ('A', 'B', 'C')

-- 多值检查与替换
${cc.inList(status, '1;2;3', "AND status IN ('#value')")}
-- 若 status='2',输出:AND status IN ('2')

-- 模板占位符替换
${cc.eq(type, 'A', "type = '#value'")}
-- 若 type='A',输出:type = 'A'

-- 区间计算(常用于条件输出)
SELECT name, age,
       ${cc.between(age, '18', '60', "'在职'")} as category
FROM employee
-- 若 age='25',输出:'在职'
-- 若 age='65',输出:(空)

-- 正则匹配校验手机号
${cc.match(phone, '^1[3-9]\d{9}$', "phone_format_valid")}
-- 若 phone='13812345678',输出:phone_format_valid

输入格式说明

前端传入的所有变量值均作为字符串处理。多值数组类型的变量可以使用分号 (;) 或逗号 (,) 作为分隔符:例如 "A;B;C" 或 "A,B,C"

表达式解析容错

优化数据集表达式解析,汇总函数后允许带空格,复杂公式排版更自由。

sum(`salary`)
-- sum汇总函数之后带空格
sum (`salary`)

文本数据源智能推断 重要

  • Excel 文本数据源支持字段数据类型自动推断,减少手工配置工作量。

自助分析

拖拽体验升级 重要

除过滤器组合外,维度和指标可在配置栏自由调整顺序。

  • 维度拖拽到指标: 自动增加 count 汇总函数
  • 指标拖拽到维度: 自动增加 bucket 分桶配置
  • 指标可直接拖拽至过滤器: 快速为指标添加过滤条件

即席查询文本数据源数据类型配置

优化即席查询文本数据源字段类型配置体验:选中文本数据源后,可在配置栏即时加载数据并配置字段类型,无需反复切换。同时可复用本次新增的字段类型推断能力,进一步减少手工配置。

明细表列宽持久化

明细表列宽支持拖拽调整,拖拽出来的列宽自动保存至配置,刷新后保留。

样式快速定位

图表样式配置支持搜索,方便用户快速找到目标配置。

图表预览查询提示

  • 优化图表设计器状态判断,根据当前配置状态提供对应的引导与提示信息
  • 未配置字段时提供操作引导,帮助用户快速完成图表配置
  • 图表配置完成但尚未预览时,明确提示用户进行预览
  • 数据查询过程中显示查询状态,避免用户误以为操作未生效
  • 统一空状态、查询状态及操作提示的视觉与交互规范

校验提示优化

  • 点击暂不可用的图表类型时,精确展示所需的维度、指标配置
  • 对比当前配置与图表要求,帮助用户快速定位配置差异
  • 降低新用户上手难度,提升自助分析体验

顶部菜单响应式显示

图表设计器顶部菜单按钮在窄屏下自动收起文字、仅显示图标,在较小分辨率下也能完整展示操作入口。

看板

参数浮动 / 折叠

网格看板参数支持浮动与折叠:当看板内容较长时,参数区可浮动跟随或折叠收起,无需反复滚动至顶部即可随时调整参数。

网格边距可配置

支持设置网格边距,图表之间的留白更自由。

日期参数增强

  • 快捷日期支持结束日期配置
    • 日期组件及日期范围的快捷日期新增结束日期配置,结束日期不再固定为“今天”,可根据实际业务需求灵活设置开始与结束日期。
  • 日期偏移支持按时间粒度计算
    • 日期偏移后新增年、月、日、周计算方式,可根据偏移后日期的开始或结束位置,自动计算对应的年月日周日期。

大屏

文本溢出可控

  • 文本组件支持配置内容是否溢出,长文本展示更可控。

模板权限隔离

增加大屏模板权限检查:普通用户仅可操作自己创建的模板,避免误改公共模板。

复杂报表

单元格直接编辑

  • 文本单元格支持双击直接编辑,无需再打开属性面板。

缓存清理

  • 支持按报表 ID 清理缓存,编辑后其他人能立刻看到最新结果。
  • 增加缓存定时清理任务,长期运行更稳定。

其他

专题分析配色方案升级

支持自定义 Logo 与高度调整,简化配色配置,并内置多种经典配色方案,快速打造符合品牌风格的专题分析页面。

  • Logo 自定义:支持上传 Logo,并灵活调整 Logo 高度(适应不同长宽比、内容占比的图片,避免 Logo 裁剪)
  • 配色方案升级:简化配色配置,内置多种经典配色方案,一键切换主题风格
  • 实时效果预览:配置后即时预览导航栏效果,所见即所得

全新登录页

  • 登录页重新设计,去掉老式 Bootstrap 风格,更符合现代审美。

异常提示统一

  • 统一异常提示信息的样式与措辞,梳理产品内不一致的报错文案

错误消息国际化

  • 服务端错误消息支持国际化,移除硬编码文本
  • 数据查询错误提示更友好

修复

  • [修复] 标签页清空后无法编辑的问题
  • [修复] 衍生维度字段过滤异常的问题
  • [修复] 明细表查询数据超过 int 类型最大值时的大表查询报错问题
  • [修复] 兼容 Oracle 升级至 2.5 后的 folder_id 字段升级
  • [修复] 公开文件夹只能设置可读权限的问题
  • [修复] 复杂报表快捷键触发重复保存的问题
  • [修复] 大屏画布尺寸变化,图表没有响应式适应的问题
  • [修复] 文件夹 equals 对比失败的问题,解决资源为空时权限管理 Resource Tree 中出现重复文件夹的问题
  • [修复] 数据集没有保存的情况下添加组合过滤无法获取维度成员数据的问题