echarts灵活加载的方式

本文介绍如何使用ECharts和Freemarker在前端动态生成图表,包括数据的动态加载、图表的实时更新及响应式设计。通过Ajax与后端交互,实现数据的动态展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端的写法,用的freemark的加载方式。

$(function () {
     	//控件初始化  main是div的ID
       worldMapContainer = document.getElementById('main');

       resizeWorldMapContainer = function () {
           worldMapContainer.style.width = window.innerWidth-300 + 'px';
           worldMapContainer.style.height = 400 + 'px';
       };
       ReportControl();

});

function ReportControl(){
		//设置容器高宽
        resizeWorldMapContainer();
        myChart = echarts.init(worldMapContainer);
        //参数设置
        var option = {
            title: {text: '这个是标题'},
            tooltip: {trigger: 'axis'},
            legend: {data: []},
            toolbox: {feature: {saveAsImage: {}}},
            grid: {
                left: '2%',
                right: '3%',
                bottom: '2%',
                containLabel: true
            },
            xAxis: [
                {
                    type: 'category',
                    boundaryGap: false,
                    data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
                }
            ],
            yAxis: [
                {
                    type: 'value'
                }
            ],
            series: [
            	<#list firstList as info>
            		<#if !info_has_next>
					{
						name: '${info}',
						type: 'line',
						stack: '${info}',
						areaStyle: {normal: {}},
						data: [0, 0, 0, 0, 0, 0, 0]

					}
					<#else>
					{
						name: '${info}',
						type: 'line',
						stack: '${info}',
						areaStyle: {normal: {}},
						data: [0, 0, 0, 0, 0, 0, 0]

					},
					</#if>
            	</#list>
            ]
        };

        myChart.setOption(option);   //参数设置方法
        myChart.hideLoading();
        getChartData('7', '','','firstList');//ajax后台交互
        window.onresize = function () {
            //重置容器高宽
            resizeWorldMapContainer();
            myChart.resize();
        };
	}

function getChartData(lastDay, startTime, endTime,divCode) {

		var url="${basePath}/activityStatement/getStatisticalStatement";

           //获得图表的options对象
           var options = myChart.getOption();
           //通过Ajax获取数据
           $.ajax({
               type: "POST",
               async: false, //同步执行
               url: url,
               data: {"lastDay": lastDay, "startTime": startTime, "endTime": endTime,"divCode":divCode},
               dataType: "json", //返回数据形式为json
               success: function (result) {
                   if (result) {
                       options.legend.data = result.dataTitle;
                       options.xAxis[0].data = result.dateString;
					   options.series = result.series;
                       myChart.hideLoading();
                       myChart.setOption(options, true);
                   }
               },
               error: function (errorMsg) {
                   console.log(errorMsg);
                   myChart.hideLoading();
               }
           });
       }

后台代码

package com.oruit.app.web.action;

import com.oruit.app.data.source.DbContextHolder;
import com.oruit.app.service.ActivityStatementService;
import com.oruit.app.util.DateUtil;
import com.oruit.app.util.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Created by xuzhen on 8/13/19.
 * 活动报表
 */

@Controller
@RequestMapping("activityStatement")
public class ActivityStatementAction {

    @Autowired
    private ActivityStatementService activityStatementService;

    //首次收徒奖励
    static List<String> firstList = new ArrayList<>();
    //第二轮收徒奖励
    static List<String> secondList = new ArrayList<>();
    //第三轮收徒奖励
    static List<String> thirdList = new ArrayList<>();
    //用户抽奖总收入
    static List<String> totalDrawIncomeList = new ArrayList<>();
    //总抽奖人数
    static List<String> totalDrawNumberList = new ArrayList<>();
    //获得抽奖机会人数
    static List<String> opportunityList = new ArrayList<>();
    //中奖数据(页面加载再初始化)
    static List<String> winningDataList = new ArrayList();
    static List<String> winningViewList = new ArrayList();

    static String divCodeStatic = "";

    static {
        firstList.add("拜师用户");
        firstList.add("收徒首次奖励次数");

        secondList.add("拜师用户");
        secondList.add("第二轮礼包发放数");

        thirdList.add("拜师用户");
        thirdList.add("第三轮礼包发放数");

        totalDrawIncomeList.add("抽奖总次数");
        totalDrawIncomeList.add("抽奖总金额");

        totalDrawNumberList.add("可抽奖总人数");
        totalDrawNumberList.add("参与抽奖人数");

        opportunityList.add("获得机会人数");

    }


    /**
     * 活动报表
     *
     * @param request
     * @param model
     * @return
     */
    @RequestMapping("/activityStatementReport")
    public String activityStatementReport(HttpServletRequest request, Model model) {

        DbContextHolder.setDbType("dataRead"); //切换数据源到统计库

        //模块id
        String moduleid = request.getParameter("moduleid");
        model.addAttribute("moduleid", moduleid);

        //表格初始化
        //firstList secondList thirdList 使用 apprenticeDiv
        model.addAttribute("firstList", firstList);

        //totalDrawIncomeList totalDrawNumberList使用 luckdrawDiv1
        model.addAttribute("totalDrawIncomeList", totalDrawIncomeList);

        //opportunityList 使用luckdrawDiv2
        model.addAttribute("opportunityList", opportunityList);

        //winningDataList 使用luckdrawDiv3 页面加载再初始化动态表头
        winningDataList = activityStatementService.getWinningDataList();

        winningViewList = activityStatementService.getWinningViewList();

        model.addAttribute("winningDataList", winningDataList);

        return "report/activityStatement-report";
    }

    @RequestMapping("getStatisticalStatement")
    @ResponseBody
    public Object getStatisticalStatement(HttpServletRequest request, Model model) throws Exception {

        DbContextHolder.setDbType("analysis"); //切换数据源到统计库
        //返回总数据
        Map<String, Object> data = new HashMap<>();

        //用于查询的集合数据
        Map<String, Object> params = new HashMap<>();
        //返回数据头
        List<String> dataTitle = new ArrayList<>();
        //返回数据集合
        List<List<Integer>> datalist = new ArrayList<>();

        Integer lastDay = null;
        String lastDayString = request.getParameter("lastDay");
        if (!StringUtils.isEmpty(lastDayString)) {
            lastDay = Integer.parseInt(lastDayString);
        }

        String startTime = request.getParameter("startTime");
        String endTime = request.getParameter("endTime");

        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date start = null;
        Date end = null;
        List<Date> dateList = null;
        if (lastDay != null) {  //选中过去多少天
            String seven = DateUtil.getYesterday(lastDay); //得到过去多少天的时间
            String yesterday = DateUtil.getYesterday(1);
            start = sdf.parse(seven);
            end = sdf.parse(yesterday);
            dateList = DateUtil.dateSplit(start, end);  //获取两个日期之间的日期
        } else { //自选时间
            start = sdf.parse(startTime);
            end = sdf.parse(endTime);
            dateList = DateUtil.dateSplit(start, end);
        }
        Collections.reverse(dateList); //使用Reverse方法可以根据元素的自然顺序 对指定列表按降序进行排序。

        List<String> dateString = new ArrayList<>();
        for (Date date : dateList) {
            dateString.add(sdf.format(date));
        }

        params.put("startTime", start);
        params.put("endTime", end);

        model.addAttribute("startTime", startTime);
        model.addAttribute("endTime", endTime);


        //调用过来需要获取的数据
        String divCode = request.getParameter("divCode");
        if (StringUtils.isEmpty(divCode)) {
            if (StringUtils.isEmpty(divCodeStatic)) {
                divCodeStatic = "firstList";
            }
            divCode = divCodeStatic;
        } else {
            divCodeStatic = divCode;
        }

        if ("firstList".equals(divCode)) {

            dataTitle = firstList;
            datalist = activityStatementService.getFirstListDiv(params, dateString);


        } else if ("secondList".equals(divCode)) {

            dataTitle = secondList;
            datalist = activityStatementService.getSecondListDiv(params, dateString);

        } else if ("thirdList".equals(divCode)) {

            dataTitle = thirdList;
            datalist = activityStatementService.getThirdListDiv(params, dateString);

        } else if ("totalDrawIncomeList".equals(divCode)) {

            dataTitle = totalDrawIncomeList;
            datalist = activityStatementService.getTotalDrawIncomeListDiv(params, dateString);

        } else if ("totalDrawNumberList".equals(divCode)) {

            dataTitle = totalDrawNumberList;
            datalist = activityStatementService.getTotalDrawNumberListDiv(params, dateString);

        } else if ("opportunityList".equals(divCode)) {

            dataTitle = opportunityList;
            datalist = activityStatementService.getOpportunityListDiv(params, dateString);

        } else if ("winningDataList".equals(divCode)) {

            dataTitle = winningDataList;
            datalist = activityStatementService.getWinningDataListDiv(params, dateString, winningViewList.toArray(new String[winningViewList.size()]));

        }


        //列表表头重构
        List<Map<String, Object>> series = new ArrayList<>();
        for (int i = 0; i < dataTitle.size(); i++) {
            Map<String, Object> item = new HashMap<>();
            item.put("name", dataTitle.get(i));
            item.put("type", "line");
            item.put("stack", dataTitle.get(i));
            //这个是数据
            item.put("data", datalist.get(i));
            series.add(item);
        }
        data.put("series", series);
        //时间
        data.put("dateString", dateString);
        //标题
        data.put("dataTitle", dataTitle);

        return data;
    }

}

service ,getDataList方法提供的是获取 每天一行数据,数据对应字段名显示

package com.oruit.app.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.oruit.app.common.cache.MemcacheUtil;
import com.oruit.app.dao.AnalysisApprenticeStatMapper;
import com.oruit.app.dao.AnalysisLotteryDrawStatMapper;
import com.oruit.app.service.ActivityStatementService;
import com.oruit.app.util.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Created by xuzhen on 8/13/19.
 */
@Service
public class ActivityStatementServiceImpl implements ActivityStatementService {

    @Autowired
    private AnalysisApprenticeStatMapper analysisApprenticeStatMapper;

    @Autowired
    private AnalysisLotteryDrawStatMapper analysisLotteryDrawStatMapper;

    @Override
    public List<String> getWinningDataList() {

        List<String> winningDataList = analysisLotteryDrawStatMapper.getWinningDataList();

        List<String> list = new ArrayList<>();
        for (String data : winningDataList) {
            list.add(data + "金币次数");
            list.add(data + "金币中奖(百分比)");
        }
        list.add("参与抽奖次数");
        return list;
    }

    @Override
    public List<String> getWinningViewList() {
        return analysisLotteryDrawStatMapper.getWinningDataList();
    }

    @Override
    public List<List<Integer>> getFirstListDiv(Map<String, Object> params, List<String> dateString) {

        List<Map<String, Object>> list = analysisApprenticeStatMapper.queryData(params);

        String[] viewArr = new String[]{"user_num", "first_reward_num"};

        return getDataList(dateString, list, viewArr);
    }

    @Override
    public List<List<Integer>> getSecondListDiv(Map<String, Object> params, List<String> dateString) {
        List<Map<String, Object>> list = analysisApprenticeStatMapper.queryData(params);

        String[] viewArr = new String[]{"user_num", "second_reward_num"};

        return getDataList(dateString, list, viewArr);
    }

    @Override
    public List<List<Integer>> getThirdListDiv(Map<String, Object> params, List<String> dateString) {
        List<Map<String, Object>> list = analysisApprenticeStatMapper.queryData(params);

        String[] viewArr = new String[]{"user_num", "third_reward_num"};

        return getDataList(dateString, list, viewArr);
    }

    @Override
    public List<List<Integer>> getTotalDrawIncomeListDiv(Map<String, Object> params, List<String> dateString) {
        List<Map<String, Object>> list = analysisApprenticeStatMapper.queryData(params);

        String[] viewArr = new String[]{"lottery_draw_num", "lottery_draw_gold"};

        return getDataList(dateString, list, viewArr);
    }

    @Override
    public List<List<Integer>> getTotalDrawNumberListDiv(Map<String, Object> params, List<String> dateString) {
        List<Map<String, Object>> list = analysisApprenticeStatMapper.queryData(params);

        String[] viewArr = new String[]{"lottery_draw_user_total", "join_lottery_draw_user_num"};

        return getDataList(dateString, list, viewArr);
    }

    @Override
    public List<List<Integer>> getOpportunityListDiv(Map<String, Object> params, List<String> dateString) {
        List<Map<String, Object>> list = analysisApprenticeStatMapper.queryData(params);

        String[] viewArr = new String[]{"get_lottery_draw_user_num"};

        return getDataList(dateString, list, viewArr);
    }

    @Override
    public List<List<Integer>> getWinningDataListDiv(Map<String, Object> params, List<String> dateString, String[] viewArr) {

        List<List<Integer>> datalist = new ArrayList<>();

        MemcacheUtil memcacheUtil = MemcacheUtil.getInstance();
        Object memcachelist = memcacheUtil.cacheGet("ActivityStatementService_getWinningDataListDiv");

        if (StringUtils.isEmpty(memcachelist + "")) {
            //读取缓存
            datalist = JSONObject.parseObject(memcachelist.toString(), List.class);
            return datalist;
        }


        //首次数据
        String firstDate = dateString.get(0);

        for (String date : dateString) {

            List<Map<String, Object>> list = analysisLotteryDrawStatMapper.queryData(date);
            Integer toDayNum = analysisLotteryDrawStatMapper.queryToDayNum(date);
            for (int i = 0; i < viewArr.length; i++) {

                //对应头数据(默认没有)
                boolean noDayHava = true;

                for (Map<String, Object> item : list) {
                    if (viewArr[i].equals(item.get("title"))) {
                        noDayHava = false;

                        Integer gold = Integer.parseInt(item.get("title").toString());
                        Integer num = Integer.parseInt(item.get("num").toString());

                        if (firstDate.equals(date)) {
                            //金币次数
                            List<Integer> rowlist = new ArrayList<>();
                            rowlist.add(num);
                            datalist.add(rowlist);
                            //中奖励百分比
                            rowlist = new ArrayList<>();
                            rowlist.add(num * 100 / toDayNum);
                            datalist.add(rowlist);
                        } else {
                            datalist.get(i * 2).add(num);
                            datalist.get(i * 2 + 1).add(num * 100 / toDayNum);
                        }
                        break;
                    }
                }
                if (noDayHava) {
                    if (firstDate.equals(date)) {
                        List<Integer> rowlist = new ArrayList<>();
                        rowlist.add(0);
                        //有两列数据,加两次
                        datalist.add(rowlist);

                        rowlist = new ArrayList<>();
                        rowlist.add(0);
                        datalist.add(rowlist);
                    } else {
                        datalist.get(i * 2).add(0);
                        datalist.get(i * 2 + 1).add(0);
                    }
                }
            }
            if (firstDate.equals(date)) {
                List<Integer> rowlist = new ArrayList<>();
                rowlist.add(toDayNum);
                datalist.add(rowlist);
            } else {
                datalist.get(viewArr.length * 2).add(toDayNum);
            }
        }

        memcacheUtil.cacheSet("ActivityStatementService_getWinningDataListDiv", 60, JSON.toJSONString(memcachelist));


        return datalist;
    }

    /**
     * 返回数据集合
     *
     * @param dateString 时间格式
     * @param list       数据集
     * @param viewArr    对应Key
     * @return
     */
    public List<List<Integer>> getDataList(List<String> dateString, List<Map<String, Object>> list, String[] viewArr) {

        List<List<Integer>> datalist = new ArrayList<>();

        for (String date : dateString) {
            //没有当天数据
            boolean noDayHava = true;
            for (Map<String, Object> item : list) {

                if (date.equals(item.get("statdates"))) {
                    //获取到某天的数据
                    noDayHava = false;
                    if (datalist.size() == 0) {
                        List<Integer> rowlist = new ArrayList<>();
                        for (int i = 0; i < viewArr.length; i++) {
                            rowlist.add(Integer.parseInt(item.get(viewArr[i]).toString()));
                        }
                        datalist.add(rowlist);
                    } else {
                        for (int i = 0; i < viewArr.length; i++) {
                            datalist.get(i).add(Integer.parseInt(item.get(viewArr[i]).toString()));
                        }
                    }
                    continue;
                }

            }
            //没有当天数据全部默认0
            if (noDayHava) {
                if (datalist.size() == 0) {
                    //这里代表首次就没得
                    for (int i = 0; i < viewArr.length; i++) {
                        List<Integer> rowlist = new ArrayList<>();
                        rowlist.add(0);
                        datalist.add(rowlist);
                    }
                } else {
                    for (List<Integer> data : datalist) {
                        data.add(0);
                    }
                }
            }
        }
        return datalist;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值