1. 目的
在系統後臺,很多地方都需要以直觀的方式呈現相關統計資料,然而總是從查詢語句、介面、頁面到圖表的過程,繁瑣費時。對於簡單的統計需求,期望建立合適的模型,簡化這個過程,並使得整個過程聚焦資料本身,快捷而簡單,併為整個過程的配置化提供可能。
2. 圖表要素
這裡只討論簡單的統計需求。
要素一:標題 和 統計資料
要素二:圖表型別(餅圖、柱狀圖、線圖)
3. 約定
統計資料的標籤與值屬性名總是使用 name、value,更多維度時也總是先進行約定後再使用。
4. 期待效果
給定一個名字或是編號,得到相關資料,指定圖表型別呈現。
具體描述:
(1)可配置資料語句、圖表標題及指定一個編號
(2)提供一個介面通過指定編號可取得資料
(3)指定圖表型別,將資料應用到該圖表(進一步完善可直接配置生成圖表頁)
5. 資料的模型設計
create table t_chart_data(
id int primary key,
code varchar(40) not null, -- 編號
chart_title varchar(80) not null, -- 圖表標題
query varchar(2000), -- 資料查詢語句
note varchar(200), -- 備註
status bool -- 狀態
);
-- code 設定唯一索引
create unique index uidx_chart_data_code on t_chart_data(code);
create sequence seq_chart_data_id;
6. 資料介面
提供通過編號取得資料的介面方法。這裡插入一條資料用於測試。
INSERT INTO t_chart_data(id, code, chart_title, query, note, status)
VALUES (1, 'test', '測試圖表', 'select ''name'' as name, 1 as value', null, true);
以下為 c# 實現的一個根據 code 讀取並形成介面資料的簡單實現。
public static JObject GetChartData(string code)
{
JObject result = new JObject();
string sql = "select chart_title, query from t_chart_data where code=@code";
var dt = PostgreSQLHelper.ExecuteQuery(ServiceTableHelper.QryHelper.ConnectString, CommandType.Text, sql, new NpgsqlParameter("code", code)).Tables[0];
if (dt.Rows.Count == 0)
{
result["err_code"] = 101;
result["err_msg"] = "未找到相關配置!";
return result;
}
string chartTitle = dt.Rows[0]["chart_title"] as string;
string query = dt.Rows[0]["query"] as string;
// 以下資料查詢可以帶上環境引數實現不同上下文不同查詢結果
try
{
var data = PostgreSQLHelper.ExecuteQuery(ServiceTableHelper.QryHelper.ConnectString, CommandType.Text, query).Tables[0];
result["err_code"] = 200;
result["err_msg"] = "success";
result["chart_title"] = chartTitle;
result["data"] = JArray.Parse(JsonConvert.SerializeObject(data));
return result;
}
catch(Exception e)
{
result["err_code"] = 101;
result["err_msg"] = e.Message;
return result;
}
}
如,傳參 code=test,將得到以下結果:
{
"err_code": 200,
"err_msg": "success",
"chart_title": "測試圖表",
"data": [
{
"name": "name",
"value": 1
}
]
}
7. 簡易圖表介面
期待效果:在指定位置,以指定圖表呈現資料。通過封裝 echarts 形成工具介面類。
如 EchartsTool.bar("elementId", data);
形式,封裝中會預設一種樣式。
一個簡單的封裝版本可在這裡找到:
https://github.com/triplestudio/helloworld/blob/master/echarts-tool.js
8. 實際應用
引入相關 js
<script src="jquery-1.10.2.min.js" type="text/javascript"></script>
<script src="https://cdn.bootcss.com/echarts/4.6.0/echarts.min.js"></script>
<script src="echarts-tool.js"></script>
可以使用以下方式載入資料,並呈現,如下為柱狀與餅圖示例。
$(function(){
$.post("api/chartdata.aspx", { code: "test" }, function (resp) {
$("#userStatTitle").text(resp.chart_title);
EchartsTool.bar("userStat", resp.data);
});
$.post("api/chartdata.aspx", { code: "test" }, function (resp) {
$("#demo2Title").text(resp.chart_title);
EchartsTool.pie("demo2", resp.data);
});
});
執行效果如下圖: