From f8f10c4af904849d562b3a4b68a6ee1da9c82d3b Mon Sep 17 00:00:00 2001 From: quietcoder <1642965215@qq.com> Date: Mon, 25 Dec 2017 20:43:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(chart):=20=E6=96=B0=E5=A2=9E=E4=BB=AA?= =?UTF-8?q?=E8=A1=A8=E7=9B=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/candle.md | 11 +- docs/gauge.md | 341 ++++++++++++++++++++++ docs/sidebar.md | 1 + examples/data/gauge.js | 90 ++++++ examples/data/index.js | 4 +- examples/pages/chart.vue | 4 +- src/component-list.js | 3 +- src/index.es.js | 5 +- src/packages/gauge/index.js | 13 + src/packages/gauge/main.js | 106 +++++++ src/packages/index/index.js | 5 +- test/index.js | 6 +- test/load/cdn/gauge/index.html | 48 +++ test/load/webpack/guage/App.vue | 36 +++ test/load/webpack/guage/index.js | 8 + test/load/webpack/guage/webpack.config.js | 51 ++++ 16 files changed, 721 insertions(+), 11 deletions(-) create mode 100644 docs/gauge.md create mode 100644 examples/data/gauge.js create mode 100644 src/packages/gauge/index.js create mode 100644 src/packages/gauge/main.js create mode 100644 test/load/cdn/gauge/index.html create mode 100644 test/load/webpack/guage/App.vue create mode 100644 test/load/webpack/guage/index.js create mode 100644 test/load/webpack/guage/webpack.config.js diff --git a/docs/candle.md b/docs/candle.md index d4504a6..92b3b56 100644 --- a/docs/candle.md +++ b/docs/candle.md @@ -1,6 +1,6 @@ ### K线图 - + #### 简单K线图 @@ -244,7 +244,7 @@ } this.chartSettings = { showMA: true, - showVOL: true + showVol: true } } } @@ -308,13 +308,14 @@ } this.chartSettings = { showMA: true, - showVOL: true, + showVol: true, labelMap: { MA5: 'ma5' }, legendName: { '日K': 'day k' - } + }, + showDataZoom: true } } } @@ -452,6 +453,8 @@ #### settings 配置项 +| 配置项 | 简介 | 类型 | 备注 | +| --- | --- | --- | --- | | dimension | 维度 | String | 默认为 columns[0] | | metrics | 指标 | Array | 默认为 [columns[1] ~ columns[5]] | | digit | 设置数据类型为percent时保留的位数 | Number | 默认为2 | diff --git a/docs/gauge.md b/docs/gauge.md new file mode 100644 index 0000000..ea47b53 --- /dev/null +++ b/docs/gauge.md @@ -0,0 +1,341 @@ +### 仪表盘 + + + +#### 指标维度配置 + + + + + + +#### 设置数据类型 + + + + + + +#### 设置指标别名与单位 + + + + + + +#### 设置多表盘及修改样式 + + + + + + + +#### settings 配置项 + +| 配置项 | 简介 | 类型 | 备注 | +| --- | --- | --- | --- | +| dimension | 维度 | String | 默认 columns[0] | +| metrics | 指标 | String | 默认 columns[1] | +| dataType | 数据类型 | Object | - | +| digit | 设置数据类型为percent时保留的位数 | Number | 默认为2 | +| labelMap | 设置指标的别名 | Object | - | +| seriesMap | 附加到 series 中的设置 | Object | - | +| dataName | 表盘上显示的单位 | Object | - | + +> 备注1: 通过 seriesMap,可以为每一个仪表设置样式,具体样式的配置可以参考[文档](http://echarts.baidu.com/option.html#series-gauge) diff --git a/docs/sidebar.md b/docs/sidebar.md index 208ac8e..7b934bb 100644 --- a/docs/sidebar.md +++ b/docs/sidebar.md @@ -16,6 +16,7 @@ - [热力图](/heatmap) - [散点图](/scatter) - [K线图](/candle) + - [仪表盘](/gauge) - 其他 - [事件监听](/event) - [图表切换](/toggle) diff --git a/examples/data/gauge.js b/examples/data/gauge.js new file mode 100644 index 0000000..fe7ab25 --- /dev/null +++ b/examples/data/gauge.js @@ -0,0 +1,90 @@ +export default { + name: '仪表盘', + type: 'gauge', + data: [ + { + name: '简单仪表盘', + data: { + columns: ['type', 'value'], + rows: [ + { type: '油量', value: 123 } + ] + }, + settings: {} + }, + { + name: '设置指标维度', + data: { + columns: ['a', 'b', 'type', 'value'], + rows: [ + { type: '油量', value: 123, a: 1, b: 2 } + ] + }, + settings: { + dimension: 'type', + metrics: 'value' + } + }, + { + name: '设置数据类型', + data: { + columns: ['type', 'value'], + rows: [ + { type: '油量', value: 0.12 } + ] + }, + settings: { + dataType: { + '油量': 'percent' + }, + seriesMap: { + '油量': { + min: 0, + max: 1 + } + } + } + }, + { + name: '设置别名', + data: { + columns: ['type', 'value'], + rows: [ + { type: 'speed', value: 123 } + ] + }, + settings: { + labelMap: { + speed: '速度' + }, + dataName: { + speed: 'km/h' + } + } + }, + { + name: '多个仪表盘', + data: { + columns: ['type', 'value'], + rows: [ + { type: '油量', value: 2343 }, + { type: '速度', value: 123 } + ] + }, + settings: { + seriesMap: { + '油量': { + radius: 90, + center: ['25%', '55%'], + min: 0, + max: 10000 + }, + '速度': { + radius: 90, + center: ['75%', '55%'] + } + } + } + } + ] +} diff --git a/examples/data/index.js b/examples/data/index.js index c8662fb..d1e2e19 100644 --- a/examples/data/index.js +++ b/examples/data/index.js @@ -12,6 +12,7 @@ import sankey from './sankey' import heatmap from './heatmap' import scatter from './scatter' import candle from './candle' +import gauge from './gauge' export default { bar, @@ -27,5 +28,6 @@ export default { sankey, heatmap, scatter, - candle + candle, + gauge } diff --git a/examples/pages/chart.vue b/examples/pages/chart.vue index 5fbd8c9..2a803b5 100644 --- a/examples/pages/chart.vue +++ b/examples/pages/chart.vue @@ -38,6 +38,7 @@ import VeSankey from '../../src/packages/sankey' import VeHeatmap from '../../src/packages/heatmap' import VeScatter from '../../src/packages/scatter' import VeCandle from '../../src/packages/candle' +import VeGauge from '../../src/packages/gauge' import CHART_DATA from '../data' export default { @@ -81,7 +82,8 @@ export default { VeSankey, VeHeatmap, VeScatter, - VeCandle + VeCandle, + VeGauge } } diff --git a/src/component-list.js b/src/component-list.js index 07fd54b..976e5d4 100644 --- a/src/component-list.js +++ b/src/component-list.js @@ -14,5 +14,6 @@ module.exports = { VeSankey: { src: 'src/packages/sankey/index.js', dist: 'lib/sankey' }, Veheatmap: { src: 'src/packages/heatmap/index.js', dist: 'lib/heatmap' }, VeScatter: { src: 'src/packages/scatter/index.js', dist: 'lib/scatter' }, - VeCandle: { src: 'src/packages/candle/index.js', dist: 'lib/candle' } + VeCandle: { src: 'src/packages/candle/index.js', dist: 'lib/candle' }, + VeGauge: { src: 'src/packages/gauge/index.js', dist: 'lib/gauge' } } diff --git a/src/index.es.js b/src/index.es.js index 8086b62..c57fa26 100644 --- a/src/index.es.js +++ b/src/index.es.js @@ -13,6 +13,7 @@ import VeSankey from './packages/sankey' import VeHeatmap from './packages/heatmap' import VeScatter from './packages/scatter' import VeCandle from './packages/candle' +import VeGauge from './packages/gauge' const components = [ VeBar, @@ -29,7 +30,8 @@ const components = [ VeSankey, VeHeatmap, VeScatter, - VeCandle + VeCandle, + VeGauge ] function install (Vue, _) { @@ -54,5 +56,6 @@ export { VeHeatmap, VeScatter, VeCandle, + VeGauge, install } diff --git a/src/packages/gauge/index.js b/src/packages/gauge/index.js new file mode 100644 index 0000000..7a36a07 --- /dev/null +++ b/src/packages/gauge/index.js @@ -0,0 +1,13 @@ +import echarts from '../../echarts-base' +import 'echarts/lib/chart/gauge' +import { gauge } from './main' +import Core from '../../core' + +export default { + name: 'VeGauge', + mixins: [Core], + created () { + this.chartHandler = gauge + this.echartsLib = echarts + } +} diff --git a/src/packages/gauge/main.js b/src/packages/gauge/main.js new file mode 100644 index 0000000..200892a --- /dev/null +++ b/src/packages/gauge/main.js @@ -0,0 +1,106 @@ +import { isObject, getFormated } from '../../utils' + +function getTooltip (args) { + const { tooltipFormatter, dataType, digit } = args + return { + formatter (options) { + const { + seriesName, + data: { + value, + name + } + } = options + if (tooltipFormatter) { + return tooltipFormatter.apply(null, arguments) + } + const tpl = [] + tpl.push(`${seriesName}: `) + tpl.push(`${getFormated(value, dataType[seriesName], digit)} ${name}`) + return tpl.join('') + } + } +} + +function getSeries (args) { + const { + rows, + dimension, + metrics, + digit, + dataType, + labelMap, + seriesMap, + dataName + } = args + + const series = rows.map(row => { + const label = row[dimension] + const seriesItem = seriesMap[label] + const result = { + type: 'gauge', + name: labelMap[label] != null ? labelMap[label] : label, + data: [ + { + name: dataName[label] || '', + value: row[metrics] + } + ], + detail: { + formatter (v) { + return getFormated(v, dataType[label], digit) + } + }, + axisLabel: { + formatter (v) { + return getFormated(v, dataType[label], digit) + } + } + } + + if (seriesItem) { + Object.keys(seriesItem).forEach(key => { + if (isObject(result[key])) { + Object.assign(result[key], seriesItem[key]) + } else { + result[key] = seriesItem[key] + } + }) + } + + return result + }) + + return series +} + +export const gauge = (columns, rows, settings, extra) => { + const { + dimension = columns[0], + metrics = columns[1], + digit = 2, + dataType = {}, + labelMap = {}, + seriesMap = {}, + dataName = {} + } = settings + + const { tooltipFormatter, tooltipVisible } = extra + + const tooltip = tooltipVisible && getTooltip({ + tooltipFormatter, + dataType + }) + + const series = getSeries({ + rows, + dimension, + metrics, + digit, + dataType, + labelMap, + seriesMap, + dataName + }) + return { tooltip, series } +} diff --git a/src/packages/index/index.js b/src/packages/index/index.js index 4fb37f8..cd4ce68 100755 --- a/src/packages/index/index.js +++ b/src/packages/index/index.js @@ -13,6 +13,7 @@ import VeSankey from '../sankey' import VeHeatmap from '../heatmap' import VeScatter from '../scatter' import VeCandle from '../candle' +import VeGauge from '../gauge' const components = [ VeBar, @@ -29,7 +30,8 @@ const components = [ VeSankey, VeHeatmap, VeScatter, - VeCandle + VeCandle, + VeGauge ] function install (Vue, _) { @@ -57,5 +59,6 @@ export default { VeSankey, VeScatter, VeCandle, + VeGauge, install } diff --git a/test/index.js b/test/index.js index 19b09c6..63005bb 100644 --- a/test/index.js +++ b/test/index.js @@ -19,7 +19,8 @@ import { VeSankey, VeHeatmap, VeScatter, - VeCandle + VeCandle, + VeGauge } from '../lib/index.esm' const comps = { @@ -36,7 +37,8 @@ const comps = { sankey: VeSankey, heatmap: VeHeatmap, scatter: VeScatter, - candle: VeCandle + candle: VeCandle, + gauge: VeGauge } let box let vm = {} diff --git a/test/load/cdn/gauge/index.html b/test/load/cdn/gauge/index.html new file mode 100644 index 0000000..5b93dd5 --- /dev/null +++ b/test/load/cdn/gauge/index.html @@ -0,0 +1,48 @@ + + + + + + + Document + + +
+ + +
+ + + + + + diff --git a/test/load/webpack/guage/App.vue b/test/load/webpack/guage/App.vue new file mode 100644 index 0000000..cbb6a89 --- /dev/null +++ b/test/load/webpack/guage/App.vue @@ -0,0 +1,36 @@ + + + diff --git a/test/load/webpack/guage/index.js b/test/load/webpack/guage/index.js new file mode 100644 index 0000000..e1d5dcd --- /dev/null +++ b/test/load/webpack/guage/index.js @@ -0,0 +1,8 @@ +import Vue from 'vue' +import App from './App' + +/* eslint-disable no-new */ +new Vue({ + el: '#app', + render: h => h(App) +}) diff --git a/test/load/webpack/guage/webpack.config.js b/test/load/webpack/guage/webpack.config.js new file mode 100644 index 0000000..424b363 --- /dev/null +++ b/test/load/webpack/guage/webpack.config.js @@ -0,0 +1,51 @@ +const webpack = require('webpack') +const path = require('path') +const HtmlWebpackPlugin = require('html-webpack-plugin') + +module.exports = { + entry: { + app: './index.js' + }, + output: { + path: path.resolve(__dirname, '../dist'), + filename: 'index.js', + publicPath: '/' + }, + resolve: { + extensions: ['.js', '.vue'] + }, + devServer: { + port: '8180', + hot: true, + stats: 'errors-only' + }, + module: { + rules: [ + { + test: /\.vue$/, + loader: 'vue-loader' + }, + { + test: /\.js$/, + loader: 'babel-loader' + }, + { + test: /\.css$/, + use: ['style-loader', 'css-loader'] + } + ] + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: '"development"' + } + }), + new webpack.HotModuleReplacementPlugin(), + new HtmlWebpackPlugin({ + filename: 'index.html', + template: '../index.html', + inject: true + }) + ] +}