跳到主要内容

统计图

统计图是用于数据可视化展示的重要组件,基于ECharts图表库实现多样化的图表渲染能力。它负责将数据模型转换为直观的图形表示、支持交互式数据探索和提供丰富的样式配置选项,支持24种图表类型包括折线图、柱状图、饼图、地图、雷达图等。

统计图元素分层结构为Meta(components.Meta) → Type(components.Chart) → 实例,开发者可通过JitAI的可视化开发工具快捷地创建统计图实例元素。

当然,开发者也可以创建自己的Type元素,或者在自己的App中改写JitAi官方提供的components.ChartType元素,以实现自己的封装。

快速开始

基础配置示例

折线图配置示例
{
"chartType": "line",
"fieldList": [
[
{
"name": "createDate",
"dataType": "Date",
"alias": "日期",
"ormType": "GROUP"
}
],
[
{
"name": "amount",
"dataType": "Numeric",
"alias": "金额",
"ormType": "SUM"
}
]
],
"requireElements": [
{
"name": "models.SalesModel",
"filter": "",
"orderBy": []
}
],
"chartOption": {
"legendShow": true,
"smooth": false
}
}
饼图配置示例
{
"chartType": "pie",
"fieldList": [
[
{
"name": "category",
"dataType": "Stext",
"alias": "分类",
"ormType": "GROUP"
}
],
[
{
"name": "count",
"dataType": "Numeric",
"alias": "数量",
"ormType": "COUNT"
}
]
],
"requireElements": [
{
"name": "models.ProductModel",
"filter": "",
"orderBy": []
}
],
"chartOption": {
"legendShow": true,
"radius": 150
}
}

配置属性说明

属性名类型必填默认值说明
chartTypestring'line'图表类型,支持line/bar/pie/map等24种类型
fieldListArray<Array<CommonFieldSelectorItem>>[]字段配置列表,第一层为维度字段,第二层为指标字段
requireElementsArray<DataSourcesConfig>[]数据源配置,指定使用的模型和过滤条件
chartOptionobject图表样式配置选项
commonOptionobject通用选项配置
customOptionobject自定义选项配置

chartOption属性详解:

属性名类型默认值说明
legendShowbooleantrue是否显示图例
legendLegendEnum0图例位置:0-顶部,1-底部,2-左侧,3-右侧
smoothbooleanfalse折线图是否平滑显示
barWidthnumber20柱状图柱宽
radiusnumber100饼图/环图半径
axisLabelStyleobject坐标轴标签样式配置
XAxisStyleobjectX轴样式配置
YAxisStyleobjectY轴样式配置

变量

dimensionFilter

  • 类型: QFilter
  • 说明: 维度筛选条件,用于对图表数据进行筛选
  • 只读: 是
  • 泛型: 关联的模型类型

detailFilter

  • 类型: QFilter
  • 说明: 明细筛选条件,用于图表明细数据筛选
  • 只读: 是
  • 泛型: 关联的模型类型

方法

call

刷新图表数据,根据筛选条件重新获取和渲染数据。

参数详解

参数名类型必填说明
qFilterQFilter查询筛选条件

返回值

无返回值

使用示例

刷新图表数据
// 创建筛选条件
const filter = new Jit.datatypes.QFilter({
value: "Q(status='active')"
});

// 刷新图表
chartComponent.call(filter);

getChartData

获取图表数据,从模型服务获取预览数据并处理。

返回值

类型说明
Promise<void>异步获取数据,结果存储在组件data属性中

使用示例

获取图表数据
// 获取图表数据
await chartComponent.getChartData();

// 访问数据
const chartData = chartComponent.data.dataList;
console.log('图表数据:', chartData);

checkConfig

检查图表配置是否有效,验证字段配置的完整性。

返回值

类型说明
boolean配置是否有效

使用示例

验证图表配置
// 检查配置有效性
const isValid = chartComponent.checkConfig();

if (isValid) {
console.log('图表配置有效');
await chartComponent.getChartData();
} else {
console.log('图表配置无效,请检查字段配置');
}

publishEvent

发布组件事件,通知其他组件或页面元素。

参数详解

参数名类型必填说明
namestring事件名称
exRecord<string, any>事件携带的额外数据

返回值

类型说明
Promise<void>异步发布事件

使用示例

发布事件示例
// 发布表格刷新事件
await chartComponent.publishEvent('tableRefresh', {
timestamp: Date.now()
});

// 发布自定义事件
await chartComponent.publishEvent('dataChanged', {
newValue: 'updated data',
source: 'chart'
});

subscribeEvent

订阅组件事件,监听其他组件发布的事件。

参数详解

参数名类型必填说明
namestring事件名称
evtCbFunction事件回调函数
unSubscribeExistboolean是否取消已存在的订阅,默认true

返回值

类型说明
string事件处理器ID,用于后续取消订阅

使用示例

订阅事件示例
// 订阅数据变化事件
const handlerId = chartComponent.subscribeEvent(
'dataUpdate',
async (eventData) => {
console.log('接收到数据更新事件:', eventData);
await chartComponent.getChartData();
}
);

// 订阅过滤器变化事件
chartComponent.subscribeEvent(
'filterChanged',
(filterData) => {
const newFilter = new Jit.datatypes.QFilter(filterData);
chartComponent.call(newFilter);
}
);

unSubscribeEvent

取消事件订阅,停止监听指定的事件。

参数详解

参数名类型必填说明
idstring事件处理器ID

返回值

类型说明
boolean是否成功取消订阅

使用示例

取消事件订阅
// 取消指定事件订阅
const success = chartComponent.unSubscribeEvent(handlerId);

if (success) {
console.log('成功取消事件订阅');
}

setConfig

设置组件配置,支持部分更新或完全替换配置。

参数详解

参数名类型必填说明
nextPartial<ChartPageConfig>新的配置对象
cleanboolean是否完全替换配置,默认false

使用示例

更新图表配置
// 部分更新配置
chartComponent.setConfig({
chartType: 'bar',
chartOption: {
legendShow: false,
barWidth: 30
}
});

// 完全替换配置
chartComponent.setConfig(newCompleteConfig, true);

getPermConfig

获取当前组件的权限配置信息。

返回值

类型说明
Record<string, any> | undefined权限配置对象,如果没有权限限制则返回undefined

使用示例

获取权限配置
const permConfig = chartComponent.getPermConfig();

if (permConfig) {
console.log('组件权限配置:', permConfig);
// 根据权限配置调整组件行为
} else {
console.log('组件无权限限制');
}

bindApp

绑定应用实例到组件,建立组件与应用的关联关系。

参数详解

参数名类型必填说明
appApp应用实例对象

使用示例

绑定应用实例
const app = getRuntimeApp();
chartComponent.bindApp(app);

// 绑定后可访问应用级服务
console.log('应用名称:', chartComponent.app?.name);

bindPage

绑定页面实例到组件,同时为组件变量绑定页面上下文。

参数详解

参数名类型必填说明
pageBasePage页面实例对象

使用示例

绑定页面实例
// 绑定当前页面
chartComponent.bindPage(currentPage);

// 绑定后组件变量也会自动绑定页面上下文
console.log('页面实例:', chartComponent.page);

getEventKey

生成组件事件的唯一键名,用于事件系统中的事件标识。

参数详解

参数名类型必填说明
eventNamestring事件名称

返回值

类型说明
string格式为${uuid}.${name}.${eventName}的事件键名

使用示例

获取事件键名
const eventKey = chartComponent.getEventKey('dataChanged');
console.log('事件键名:', eventKey);
// 输出: "uuid-string.chartName.dataChanged"

// 用于自定义事件系统
const customEventKey = chartComponent.getEventKey('customEvent');

initVariables

初始化组件变量,根据数据类型配置创建对应的变量实例。

参数详解

参数名类型必填说明
dataTypeListBaseDataType[]数据类型配置列表

使用示例

初始化变量
const variableConfigs = [
{
name: 'filterCondition',
dataType: 'QFilter',
title: '筛选条件',
generic: 'models.SalesModel'
},
{
name: 'chartData',
dataType: 'RowList',
title: '图表数据'
}
];

chartComponent.initVariables(variableConfigs);

// 初始化后可访问变量
console.log('筛选条件变量:', chartComponent.filterCondition);

newVariable

根据变量配置创建新的数据类型变量实例。

参数详解

参数名类型必填说明
varConfigInstanceType<typeof Jit.DataTypeConfig>变量配置对象

返回值

类型说明
BaseDataType | undefined创建的变量实例,失败时返回undefined

使用示例

创建新变量
const varConfig = new Jit.DataTypeConfig({
name: 'customFilter',
dataType: 'QFilter',
title: '自定义筛选器',
generic: 'models.UserModel'
});

const variable = chartComponent.newVariable(varConfig);
if (variable) {
console.log('变量创建成功:', variable.title);
// 手动绑定组件和页面
variable.bindComponent(chartComponent);
variable.bindPage(chartComponent.page);
} else {
console.error('变量创建失败');
}

### destroy

销毁组件实例,清理所有事件监听器和变量引用,释放内存资源。

#### 使用示例

```typescript title="销毁组件"
// 组件不再使用时调用
chartComponent.destroy();

runCode

在页面上下文中执行自定义代码,支持访问页面和组件的作用域。

参数详解

参数名类型必填说明
codestring要执行的JavaScript代码字符串

返回值

类型说明
any代码执行结果,异常时返回undefined

使用示例

执行自定义代码
// 执行简单表达式
const result = chartComponent.runCode('1 + 1');
console.log('计算结果:', result); // 2

// 访问页面变量
const pageData = chartComponent.runCode('this.pageVariable');

// 调用页面方法
chartComponent.runCode('this.refreshData()');

属性

config

  • 类型: ChartPageConfig
  • 说明: 图表的完整配置对象,包含图表类型、字段配置、样式设置等
  • 可写: 是

data

  • 类型: { dataList?: Array<Record<string, any>> }
  • 说明: 图表的数据对象,包含从模型获取的数据列表
  • 可写: 是

ModelClass

  • 类型: typeof Jit.BaseModel
  • 说明: 关联的数据模型类,用于数据查询和操作
  • 可写: 是

chartIns

  • 类型: InstanceType<typeof BaiduChart>
  • 说明: 图表实例对象,负责图表的渲染和交互
  • 可写: 是

QObj

  • 类型: Qex | undefined
  • 说明: 当前的查询对象,用于数据筛选
  • 可写: 是

name

  • 类型: string
  • 说明: 组件名称标识
  • 可写: 是

title

  • 类型: string
  • 说明: 组件显示标题
  • 可写: 是

fullName

  • 类型: string
  • 说明: 组件的完整名称路径
  • 可写: 是

showTitle

  • 类型: boolean
  • 说明: 是否显示组件标题
  • 可写: 是

compType

  • 类型: COMPONENT_TYPE
  • 说明: 组件类型标识
  • 可写: 是

type

  • 类型: string
  • 说明: 组件的类型字符串
  • 可写: 是

app

  • 类型: App | undefined
  • 说明: 当前应用实例的引用
  • 只读: 是

page

  • 类型: BasePage | undefined
  • 说明: 当前页面实例的引用
  • 只读: 是

modelFilter

  • 类型: Qex | string | undefined
  • 说明: 模型过滤条件,结合权限配置和组件配置生成
  • 只读: 是

dataTypeList

  • 类型: BaseDataType[]
  • 说明: 组件的数据类型配置列表,包含所有变量的类型定义
  • 可写: 是

uuid

  • 类型: string
  • 说明: 组件的唯一标识符,用于事件系统和组件识别
  • 只读: 是

事件

点击明细

  • 事件名: clickDetail
  • 触发时机: 用户点击图表中的明细数据点时触发
  • 事件数据: 包含被点击的数据项信息

使用示例

监听点击明细事件
// 订阅点击明细事件
chartComponent.subscribeEvent('clickDetail', (eventData) => {
console.log('点击明细数据:', eventData);

// 获取点击的数据项
const clickedData = eventData.data;
const seriesName = eventData.seriesName;
const dataIndex = eventData.dataIndex;

// 根据点击的数据执行相应操作
if (clickedData) {
// 跳转到详情页面
const detailUrl = `/detail/${clickedData.id}`;
window.open(detailUrl, '_blank');

// 或者显示详情弹窗
showDetailModal(clickedData);

// 或者更新其他组件的筛选条件
const filter = new Jit.datatypes.QFilter({
value: `Q(category='${clickedData.category}')`
});
otherComponent.call(filter);
}
});

// 在组件销毁时取消订阅
chartComponent.subscribeEvent('destroy', () => {
chartComponent.unSubscribeEvent('clickDetail');
});
结合页面路由的点击处理
chartComponent.subscribeEvent('clickDetail', async (eventData) => {
const { data } = eventData;

// 更新页面参数
const currentPage = chartComponent.page;
if (currentPage && data.orderId) {
// 导航到订单详情页
await currentPage.navigate('/orders/detail', {
orderId: data.orderId,
source: 'chart'
});
}
});

点击维度

  • 事件名: clickDimension
  • 触发时机: 用户点击图表中的维度标签或图例时触发
  • 事件数据: 包含被点击的维度信息

使用示例

监听点击维度事件
// 订阅点击维度事件
chartComponent.subscribeEvent('clickDimension', (eventData) => {
console.log('点击维度:', eventData);

const dimensionValue = eventData.name;
const dimensionType = eventData.type;

// 根据点击的维度进行数据筛选
if (dimensionValue) {
// 构建筛选条件
const filterCondition = `Q(${dimensionType}='${dimensionValue}')`;
const filter = new Jit.datatypes.QFilter({
value: filterCondition
});

// 更新当前图表的筛选
chartComponent.call(filter);

// 同时更新相关组件
relatedTableComponent.call(filter);
relatedChartComponent.call(filter);
}
});
图例交互示例
chartComponent.subscribeEvent('clickDimension', (eventData) => {
const { name: legendName, selected } = eventData;

if (selected) {
console.log(`显示系列: ${legendName}`);
// 显示对应系列的数据
showSeriesData(legendName);
} else {
console.log(`隐藏系列: ${legendName}`);
// 隐藏对应系列的数据
hideSeriesData(legendName);
}

// 更新其他图表的显示状态
syncChartSeries(legendName, selected);
});
维度钻取示例
chartComponent.subscribeEvent('clickDimension', async (eventData) => {
const { name: dimensionValue } = eventData;

// 实现维度钻取功能
if (currentDrillLevel === 'year' && dimensionValue) {
// 从年度钻取到月度
const monthlyConfig = {
...chartComponent.config,
fieldList: [
[
{
name: 'month',
dataType: 'Date',
alias: '月份',
ormType: 'GROUP'
}
],
chartComponent.config.fieldList[1] // 保持指标不变
],
requireElements: [
{
...chartComponent.config.requireElements[0],
filter: `Q(year='${dimensionValue}')`
}
]
};

// 更新图表配置
chartComponent.setConfig(monthlyConfig);
await chartComponent.getChartData();

// 更新钻取状态
currentDrillLevel = 'month';
currentDrillValue = dimensionValue;
}
});

高级特性

支持的图表类型

统计图组件支持24种图表类型,涵盖常用的数据可视化需求:

基础图表类型:

  • line - 折线图
  • bar - 柱状图
  • yBar - 条形图
  • pie - 饼状图
  • circlePie - 环形饼图
  • areaLine - 面积图

高级图表类型:

  • radar - 雷达图
  • funnel - 漏斗图
  • scatter - 散点图
  • bubble - 气泡图
  • chinaMap - 地图
  • calendar - 日历热力图

特殊图表类型:

  • CustomSingleValue - 单值图
  • CustomMutiValue - 多值图
  • gauge - 仪表盘图
  • liquidFill - 水球图
  • progress - 进度条

动态图表切换

动态切换图表类型
// 切换为柱状图
chartComponent.setConfig({
chartType: 'bar',
chartOption: {
barWidth: 25,
legendShow: true
}
});

// 切换为饼图
chartComponent.setConfig({
chartType: 'pie',
chartOption: {
radius: 120,
legendShow: true,
legend: 1 // 底部显示图例
}
});

复杂数据源配置

多维度多指标配置
const complexConfig = {
chartType: 'line',
fieldList: [
// 维度组 - 支持多个维度
[
{
name: 'year',
dataType: 'Date',
alias: '年份',
ormType: 'GROUP'
},
{
name: 'quarter',
dataType: 'Date',
alias: '季度',
ormType: 'GROUP'
}
],
// 指标组 - 支持多个指标
[
{
name: 'revenue',
dataType: 'Numeric',
alias: '营收',
ormType: 'SUM'
},
{
name: 'profit',
dataType: 'Numeric',
alias: '利润',
ormType: 'SUM'
}
]
],
requireElements: [
{
name: 'models.FinanceModel',
filter: "Q(status='confirmed')",
orderBy: [['year', 1], ['quarter', 1]]
}
]
};

样式主题配置

自定义图表样式
const styleConfig = {
chartOption: {
// 坐标轴样式
XAxisStyle: {
show: true,
fontSize: 12,
color: '#666666'
},
YAxisStyle: {
show: true,
fontSize: 12,
color: '#666666'
},
// 标签样式
axisLabelStyle: {
width: 60,
rotate: 45,
show: true,
inside: false
},
// 图例配置
legendShow: true,
legend: 0, // 顶部
// 间距配置
horizontalPadding: 10,
verticalPadding: 10
}
};