Layui与ECharts结合,用Ajax动态展示图表数据

后端

接口代码

使用Spring+SpringMVC+MyBatis框架,具体接口如下


    /**
     * layui 和 echart结合,展示图表
     * 
	 * 1.展示本月各个星期的销售金额--直方图
	 * 
	 * 2.展示 销售总额 vs 广告总费用--饼状图
	 * @return
	 */
	@RequestMapping("/layui/echart")
	@ResponseBody
	public Map<String, Object> learnLayuiAndEchart() {
		/**
		 * 直方图---展示每个星期的销售金额
		 */
		// 设置 周数
		List<String> sale_weekList = new ArrayList<String>();
		sale_weekList.add("第1周");
		sale_weekList.add("第2周");
		sale_weekList.add("第3周");
		sale_weekList.add("第4周");
		// 设置 每周销售金额
		List<String> sale_feeList = new ArrayList<String>();
		sale_feeList.add("1000");
		sale_feeList.add("700");
		sale_feeList.add("800");
		sale_feeList.add("1200");
		// 封装 销售数据
		Map<String, Object> sale_data = new LinkedHashMap<String, Object>();
		sale_data.put("week", sale_weekList);
		sale_data.put("fee", sale_feeList);
		
		/**
		 * 饼状图---销售总额 对比 广告总费用
		 */
		Map<String, Object> saleTotalFee = new LinkedHashMap<String, Object>();
		saleTotalFee.put("name", "销售总额");
		saleTotalFee.put("value", "3700");
		Map<String, Object> adTotalFee = new LinkedHashMap<String, Object>();
		adTotalFee.put("name", "宣传费用");
		adTotalFee.put("value", "500");
		// 封装 总额数据
		List<Map<String, Object>> feeList = new ArrayList<Map<String,Object>>();
		feeList.add(saleTotalFee);
		feeList.add(adTotalFee);
		
		// 封装 数据
		Map<String, Object> data = new LinkedHashMap<String, Object>();
		data.put("sale", sale_data);
		data.put("total", feeList);
		// 返回结果
		Map<String, Object> resMap = new LinkedHashMap<String, Object>();
		resMap.put("code", 0);
		resMap.put("data", data);
		resMap.put("msg", "成功获取到图表数据!");
		return resMap;
	}

接口效果

调用以上效果,返回的数据如下所示:

{
    "code": 0,
    "data": {
        "sale": {
            "week": [
                "第1周",
                "第2周",
                "第3周",
                "第4周"
            ],
            "fee": [
                "1000",
                "700",
                "800",
                "1200"
            ]
        },
        "total": [
            {
                "name": "销售总额",
                "value": "3700"
            },
            {
                "name": "宣传费用",
                "value": "500"
            }
        ]
    },
    "msg": "成功获取到图表数据!"
}

前端

前端代码

使用Layui和Apache ECharts结合,展示销售数据的直方图,费用比较的饼状图。
动态加载使用Ajax实现。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>layui结合echarts展示图表</title>
		<link rel="stylesheet" href="../static/css/layui.css">
	</head>
	<body>
		<!-- 月内各周_销售额 -->
		<div class="layui-card">
		    <div class="layui-card-body">
				<div id="div_sale_chart" style="width: 600px;height:400px;"></div>
		    </div>
		</div> 
		<!-- 销售额:广告费用 -->
		<div class="layui-card">
		    <div class="layui-card-body">
				<div id="div_compare_chart" style="width: 600px;height:400px;"></div>
		    </div>
		</div> 
		 
		<script type="text/javascript" src="../static/js/layui.js"></script>
		<script type="text/javascript" src="../static/js/echarts.js"></script>
		<script type="text/javascript" >
		    layui.use(['layer', 'form'], function(){
		       $ = layui.jquery;
		       var layer = layui.layer
		          ,form = layui.form ;
			// 初始化 销售额
			var saleChart = echarts.init(document.getElementById('div_sale_chart'));
			// 销售额--显示标题,图例和空的坐标轴
			saleChart.setOption({
			    title: {
			        text: '月度_销售额_直方图'
			    },
			    tooltip: {},
			    legend: {
			        data:['销售额(元)']
			    },
			    xAxis: {
			        data: []
			    },
			    yAxis: {},
			    series: [{
			        name: '销售额(元)',
			        type: 'bar',
			        data: []
			    }]
			});
			// 初始化 费用比较
			var compareChart = echarts.init(document.getElementById('div_compare_chart'));
			// 费用比较---配置相关信息
			compareChart.setOption({
				title: {
					text: '销售额/广告费_饼状图',
				},
				tooltip: {},
				legend: {
				    data:['金额(元)']
				},
				series: [{
					name: '金额(元)',
					type: 'pie',
					itemStyle: {
					    // 阴影的大小
					    shadowBlur: 200,
					    // 阴影水平方向上的偏移
					    shadowOffsetX: 0,
					    // 阴影垂直方向上的偏移
					    shadowOffsetY: 0,
					    // 阴影颜色
					    shadowColor: 'rgba(0, 0, 0, 0.2)'
					},
					// roseType: 'angle',//设置为南丁格尔图,即饼的半径不一致
					radius: '80%',
					data:[]
				}]
			});
			// 动态加载的相关数据
			$.ajax({
				url: 'http://localhost:8080/layui/echart',
				type: "post",
				async: true,//异步
				complete: function (XHR, TS) {
					if (XHR.status != 200) {
						layer.alert("系统繁忙,稍后重试");
					}
				},
				success: function (result) {
					if(result.code==0){
						//填入 销售数据
						saleChart.setOption({
							xAxis: {
								data: result.data.sale.week
							},
							series: [{
								// 根据名字对应到相应的系列
								name: '销售额(元)',
								data: result.data.sale.fee
							}]
						});
						//填入 费用比较
						compareChart.setOption({
							series: [{
								name: '金额(元)',
								// 根据名字对应到相应的系列
								data: result.data.total
							}]
						});
					}else{
						layer.msg("服务器提示:" + result.msg);
					}
				},
				error: function () {
					layer.alert("error");
				}
			});
		});
		</script >
	</body>
</html>

(ECharts资源下载:链接: 点击下载CSDN资源.)

最终结果

在这里插入图片描述
另外,鼠标停在直方图的某个柱子,或者饼状图的某块饼上,会显示对应的数据。
如下图中的红框所示
在这里插入图片描述
在这里插入图片描述
(补充:Emmm…上面2个截图里的鼠标图片是我为了演示效果P上去的,实际鼠标不长这样。但是红框展示的数据是真真切切的。)

  • 14
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值