@jzliu-cli/bi-engine
Version:
bi引擎
734 lines (594 loc) • 14.4 kB
Markdown
jzliu-cli BI 引擎 - 基于 Vue 2.x 的现代化 BI 仪表板解决方案
```bash
yarn add @jzliu-cli/bi-engine
npm install @jzliu-cli/bi-engine
```
```bash
yarn add @jzliu-cli/bi-engine element-ui vue@^2.6.11 vuex@^3.6.2
npm install @jzliu-cli/bi-engine element-ui vue@^2.6.11 vuex@^3.6.2
```
**main.js**:
```javascript
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import Vuex from 'vuex'
// 必需:使用 Element UI
Vue.use(ElementUI)
// 必需:使用 Vuex
Vue.use(Vuex)
new Vue({
render: h => h(App),
}).$mount('#app')
```
**最简单的使用方式**:
```vue
<template>
<div style="height: 100vh;">
<bi-dashboard />
</div>
</template>
<script>
import { BiDashboard } from '@jzliu-cli/bi-engine'
export default {
components: { BiDashboard }
}
</script>
```
**使用内置数据**:
```vue
<template>
<div style="height: 100vh;">
<bi-dashboard
:widgets="widgets"
:layoutObj="layoutObj"
/>
</div>
</template>
<script>
import bi, { BiDashboard } from '@jzliu-cli/bi-engine'
export default {
components: { BiDashboard },
data() {
return {
// 使用内置模拟数据
widgets: bi.mockData.widgets,
layoutObj: {
layout: [],
dashboardName: '我的仪表板'
}
}
}
}
</script>
```
主仪表板组件,提供完整的仪表板设计器功能。
**Props:**
- `previewFlag` (Boolean): 预览模式开关
- `layoutObj` (Object): 仪表板布局配置对象
- `widgets` (Array): 外部传入的图表组件数据
- `enableTabSwitch` (Boolean): 是否启用 tab 切换功能,默认 true
**Events:**
- `@dashboard-updated`: 仪表板更新时触发
- `@chart-selected`: 图表选中时触发
- `@tab-change`: 组件面板 tab 切换时触发,参数为 `{ tabKey, tabLabel }`
图表渲染组件,用于渲染单个图表。
**Props:**
- `chartData` (Object): 图表数据配置
- `styleConfig` (Object): 样式配置
**示例:**
```javascript
<chart-render
:chartData="chartData"
:styleConfig="styleConfig"
@chart-click="handleChartClick"
/>
```
自定义标签页组件,提供美观的标签页切换功能。
**Props:**
- `tabList` (Array): 标签页列表,格式:`[{ key: 'tab1', label: '标签1' }, { key: 'tab2', label: '标签2' }]`
- `value` (String|Number): 当前激活的标签页 key
**Events:**
- `@input`: 标签页切换时触发,参数为新的 tabKey
- `@change`: 标签页切换时触发,参数为新的 tabKey
**示例:**
```javascript
<c-tabs
:tabList="tabList"
v-model="activeTab"
@change="handleTabChange"
/>
```
提供丰富的工具函数集合:
```javascript
import { utils } from '@jzliu-cli/bi-engine'
// 图表工具函数
utils.chartUtils.elResizeObverse(element, callback)
utils.chartUtils.getParamsRowsAndColumns(data)
// 数据处理工具函数
utils.dataUtils.calcDescartes(arrays)
utils.dataUtils.transferWhiteVal(value)
utils.dataUtils.mateMapping(data)
// 样式工具函数
utils.styleUtils.generateStyle(config)
// 验证工具函数
utils.validationUtils.validateChartData(data)
```
仪表板面板配置:
```javascript
import { panelConfig } from '@jzliu-cli/bi-engine'
// 获取默认配置
const defaultConfig = panelConfig.getDefaultConfig()
// 获取图表类型配置
const chartTypes = panelConfig.getChartTypes()
// 获取样式配置
const styleConfig = panelConfig.getStyleConfig()
```
提供各种枚举数据:
```javascript
import { enumData } from '@jzliu-cli/bi-engine'
// 聚合器映射
console.log(enumData.aggregatorMap)
// 表格类型映射
console.log(enumData.tableTypeZnMap)
// 图表系列颜色
console.log(enumData.chartSeriesColors)
// 线条类型映射
console.log(enumData.lineTypeMap)
```
用于开发和测试的模拟数据:
```javascript
import { mockData } from '@jzliu-cli/bi-engine'
// 获取示例图表数据
const sampleChartData = mockData.getSampleChartData()
// 获取仪表板配置示例
const sampleDashboardConfig = mockData.getSampleDashboardConfig()
```
Vuex store 配置,用于状态管理:
```javascript
import { storeConfig } from '@jzliu-cli/bi-engine'
import Vuex from 'vuex'
// 创建 store 实例
const store = new Vuex.Store(storeConfig)
// 在 Vue 应用中使用
new Vue({
store,
// ...
})
- **柱状图** (Column)
- **折线图** (Line)
- **饼图** (Pie)
- **表格** (Table)
- **指标卡** (IndicatorCard)
```bash
git clone <repository-url>
yarn install
yarn build:watch
yarn build
```
```bash
yarn link
yarn link "@jzliu-cli/bi-engine"
```
- Vue: ^2.6.11
- Element UI: ^2.15.10
- Vuex: ^3.6.2
- @antv/g2plot: ^2.4.13
- lodash: ^4.17.21
- vue-grid-layout: ^2.3.12
- vuedraggable: ^2.24.3
```vue
<template>
<div class="chart-container">
<chart-render
:chartData="chartData"
:styleConfig="styleConfig"
/>
</div>
</template>
<script>
import { chartRender } from '@jzliu-cli/bi-engine'
export default {
components: { chartRender },
data() {
return {
chartData: {
type: 'Column',
name: '销售数据',
data: {
meta: [
{ field: 'category', name: '类别' },
{ field: 'value', name: '数值' }
],
data: [
{ category: 'A', value: 100 },
{ category: 'B', value: 200 },
{ category: 'C', value: 150 }
]
},
fields: [
{
label: '类别轴',
type: 'dimension',
chooseFields: [{ name: 'category' }]
},
{
label: '值轴',
type: 'measure',
chooseFields: [{ name: 'value' }]
}
]
},
styleConfig: {
commongConfig: {
showTitle: true,
backgroundColor: '#fff'
}
}
}
}
}
</script>
```
```vue
<template>
<div class="dashboard">
<bi-dashboard
:config="dashboardConfig"
@dashboard-updated="handleDashboardUpdate"
@chart-selected="handleChartSelect"
/>
</div>
</template>
<script>
import BiDashboard from '@jzliu-cli/bi-engine'
export default {
components: { BiDashboard },
data() {
return {
dashboardConfig: {
layout: [],
dashboardName: '我的仪表板'
}
}
},
methods: {
handleDashboardUpdate(newConfig) {
console.log('仪表板已更新:', newConfig)
},
handleChartSelect(chartData) {
console.log('图表已选中:', chartData)
}
}
}
</script>
```
1. **样式不生效**
- 确保已导入 Element UI 样式
- 检查样式隔离前缀是否正确
2. **图表不显示**
- 检查数据格式是否正确
- 确认字段映射配置
3. **组件未注册**
- 确保已正确使用 `Vue.use(BiDashboard)`
- 检查组件名称拼写
```javascript
// 开启调试模式
Vue.use(BiDashboard, {
debug: true,
config: {
// 自定义配置
}
})
```
MIT License
欢迎提交 Issue 和 Pull Request!
**main.js 配置**:
```javascript
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import Vuex from 'vuex'
// 使用 Element UI
Vue.use(ElementUI)
// 使用 Vuex (必需)
Vue.use(Vuex)
new Vue({
render: h => h(App),
}).$mount('#app')
```
**编辑模式 - 支持拖拽设计**:
```vue
<template>
<div id="app" style="min-width: 1366px;">
<div style="height:100%;width:100%;">
<bi-dashboard
:widgets="widgets"
:layoutObj="layoutObj"
@tab-change="handleTabChange"
/>
</div>
</div>
</template>
<script>
import bi, { BiDashboard } from '@jzliu-cli/bi-engine'
export default {
name: 'App',
components: {
BiDashboard,
},
data() {
return {
// 使用内置模拟数据
widgets: bi.mockData.widgets,
layoutObj: {
"layout": [
{
"type": "Table",
"defaultRows": 8,
"dataSetId": "USER_BEHAVIOR_FACT",
"dataSetName": "用户行为事实表",
"name": "交叉表",
"defaultCols": "whole",
"className": "component-type-cross-table",
"measures": [
{
"unitCode": "page_views",
"unitName": "页面浏览量",
"belongDimName": null
}
],
"dimensions": [
{
"unitCode": "user_id",
"unitName": "用户ID",
"belongDimName": "用户维度"
}
]
}
],
"dashboardName": "我的仪表板"
}
}
},
methods: {
handleTabChange(tabInfo) {
console.log('Tab 切换:', tabInfo)
// 这里可以根据 tab 切换重新加载数据
// 例如:this.loadWidgetsByTab(tabInfo.tabKey)
}
}
}
</script>
```
**预览模式 - 只读展示**:
```vue
<template>
<div id="app" style="min-width: 1366px;">
<div style="height:100%;width:100%;">
<Preview :widgets="widgets" :layoutObj="layoutObj" />
</div>
</div>
</template>
<script>
import bi, { Preview } from '@jzliu-cli/bi-engine'
export default {
name: 'App',
components: {
Preview,
},
data() {
return {
widgets: bi.mockData.widgets,
layoutObj: {
// 仪表板布局配置
}
}
}
}
</script>
```
**单个图表渲染**:
```vue
<template>
<div>
<chart-render :chartData="chartData"></chart-render>
</div>
</template>
<script>
import BiDashboard, { chartRender, mockData, enumData } from '@jzliu-cli/bi-engine'
export default {
name: 'ChartComponent',
components: { chartRender },
data() {
return {
// 使用内置模拟数据
chartData: mockData.pieWidgets
}
}
}
</script>
```
**根据 tab 切换动态加载数据**:
```vue
<template>
<div>
<bi-dashboard
:widgets="widgets"
:layoutObj="layoutObj"
@tab-change="handleTabChange"
/>
</div>
</template>
<script>
import bi, { BiDashboard } from '@jzliu-cli/bi-engine'
export default {
components: { BiDashboard },
data() {
return {
widgets: [],
layoutObj: {
layout: [],
dashboardName: '动态仪表板'
},
currentTab: 'all'
}
},
methods: {
async handleTabChange(tabInfo) {
console.log('Tab 切换:', tabInfo)
this.currentTab = tabInfo.tabKey
// 根据 tab 切换重新调用接口获取数据
await this.loadWidgets(tabInfo.tabKey)
},
async loadWidgets(tabKey) {
try {
// 调用你的接口获取对应 tab 的 widgets 数据
const response = await this.$http.get(`/api/widgets?tab=${tabKey}`)
this.widgets = response.data
} catch (error) {
console.error('加载 widgets 失败:', error)
// 失败时使用默认数据
this.widgets = bi.mockData.widgets
}
}
},
async created() {
// 初始化加载数据
await this.loadWidgets('all')
}
}
</script>
```
**使用工具函数和配置**:
```javascript
import bi, {
chartRender,
mockData,
enumData,
utils,
panelConfig
} from '@jzliu-cli/bi-engine'
// 使用模拟数据
const sampleData = mockData.widgets
// 使用枚举数据
const chartTypes = enumData.chartTypeMap
// 使用工具函数
const processedData = utils.dataUtils.calcDescartes(data)
// 使用配置
const defaultConfig = panelConfig.getDefaultConfig()
```
适用于需要拖拽设计仪表板的场景,用户可以:
- 从组件面板拖拽图表到画布
- 配置图表样式和数据
- 实时预览效果
- 保存和加载仪表板配置
适用于只读展示的场景,用户可以:
- 查看已设计的仪表板
- 交互式浏览图表
- 响应式适配不同屏幕
适用于只需要展示单个图表的场景:
- 在现有页面中嵌入图表
- 使用内置的图表类型
- 自定义图表样式
适用于需要根据用户操作动态加载数据的场景:
- 根据 tab 切换加载不同数据
- 实时更新图表内容
- 支持数据筛选和查询
```javascript
const widgets = [
{
type: 'Column', // 图表类型
name: '柱状图', // 图表名称
className: 'component-type-column', // CSS 类名
defaultImg: 'http://example.com/img.png', // 默认图片
measures: [ // 度量字段
{
unitCode: 'sales',
unitName: '销售额',
belongDimName: null
}
],
dimensions: [ // 维度字段
{
unitCode: 'category',
unitName: '类别',
belongDimName: '商品维度'
}
]
}
]
```
```javascript
const layoutObj = {
layout: [ // 布局配置
{
type: 'Column',
x: 0, y: 0, w: 6, h: 4, // 网格位置和大小
i: 'unique-id', // 唯一标识
// ... 其他图表配置
}
],
dashboardName: '仪表板名称'
}
```
如有问题,请联系:
- 邮箱: support@jzliu-cli.com
- 文档: [在线文档](https://docs.jzliu-cli.com/bi-engine)
---