## 项目第十一天 ##


统计分析模块


早期的报表技术(了解)


Excel图形报表(了解)

1. 早期可以使用Excel进行图形报表的操作
    * 从数据库中查询到数据
    * 打开Excel,将数据复制进去,再插入图形就可以了

2. 例如:统计各个生产厂家的销售总金额,并对总金额进行排行
    * select c.factory_name,sum(c.amount) t from CONTRACT_PRODUCT_C c group by c.factory_name order by t desc
    * 创建Excel,拷贝查询出的数据,插入图形

JFreechart制作图形报表(了解)

1. 它是使用Java开源方式编写出来的一套专门制作图形的插件,早期应用还是比较多。
2. 开发的步骤
    * 导入JFreechart的坐标
    * 导入相关的代码
    * 显示效果

amchart图形报表技术


amChart图形报表概述

1. 现在流行的报表技术都是由JS + Flash效果组成的,常用的JS报表技术有:amChart highchart eCharts(百度)
2. 这一类的图形报表技术都是基于JS的技术完成的,咱们开发方式主要是给提供数据就可以了
3. 开发的步骤
    * 找到显示图形效果的html例子
    * 给该html提供数据

4. amChart的数据来源有两种方式
    * 早期使用的是XML作为数据来源(相对比较麻烦)
    * 新版本中推荐使用Json作为数据来源

amChart的入门程序

1. 先把下载的amCharts的js、css和图片拷贝到项目中去
2. 查找到一个demo案例,制作图形
3. 创建StatChartAction类,编写方法,跳转页面
    /**
     * 统计分析模块
     * @author Administrator
     */
    @Namespace("/stat")
    public class StatChartAction extends BaseAction{

        @Autowired
        private SqlService sqlService;

        /**
         * 统计生产厂家的销售金额
         * @return
         * @throws Exception
         */
        public String factorysale() throws Exception {

            return "factorysale";
        }

        /**
         * 统计产品销售排行
         * @return
         * @throws Exception
         */
        public String productsale() throws Exception {

            return "productsale";
        }

        /**
         * 统计在线人数
         * @return
         * @throws Exception
         */
        public String onlineinfo() throws Exception {

            return "onlineinfo";
        }
    }

4. 制作饼图,先找到demo的案例,把案例的代码拷贝到JSP页面中
5. 修改引入的js和css文件的路径,把路径修改正确,功能就可以使用,替换数据    

统计分析模块的准备工作

1. 在项目中考入amCharts相关的JS和CSS的文件
    * 咱们采用的方式是拼接字符串的方式,拼接出一个XML的文档

2. 从资料中配置SqlDao类了,创建cn.itcast.common.dao的包,考入SqlDao类
    * 在applicationContext.xml配置文件中配置JdbcTemplate类
        <!-- 配置JdbcTemplate类 -->
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"/>
        </bean>

    * 使用注解的方式,配置SqlDao类
        @Repository
        public class SqlDao {

            private static Logger log = Logger.getLogger(SqlDao.class);
            private UtilFuns utilFuns = new UtilFuns();

            @Autowired
            private JdbcTemplate jdbcTemplate;

3. 导入service,配置service

统计生产厂家销售额

1. 后台代码
    @Action(value = "statChartAction_factorysale", results = {@Result(name = "factorysale", location = "/WEB-INF/pages/stat/chart/pieDonut3D.jsp") })
    public String factorysale() throws Exception {
        // 编写SQL语句
        String sql = "select c.factory_name,sum(c.amount) t from CONTRACT_PRODUCT_C c group by c.factory_name order by t desc";
        // 执行SQL
        List<String> list = sqlService.executeSQL(sql);

        // 存储map集合
        List<Map<String, Object>> list2 = new ArrayList<Map<String, Object>>();
        // 遍历list
        for (int i=0;i<list.size();i++) {
            Map<String, Object> map = new HashMap<String, Object>();
            // 存入值
            map.put("factoryName", list.get(i++));
            map.put("value", Double.parseDouble(list.get(i)));
            list2.add(map);
        }
        String str = FastJsonUtils.toJSONString(list2);
        super.put("str", str);
        return "factorysale";
    }

2. 前端代码
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>amCharts examples</title>
        <link rel="stylesheet" href="${pageContext.request.contextPath }/components/newAmcharts/style.css" type="text/css">
        <script src="${pageContext.request.contextPath }/components/newAmcharts/amcharts/amcharts.js" type="text/javascript"></script>
        <script src="${pageContext.request.contextPath }/components/newAmcharts/amcharts/pie.js" type="text/javascript"></script>

        <script>
            var chart;
            var chartData = ${str};

            AmCharts.ready(function () {
                // PIE CHART
                chart = new AmCharts.AmPieChart();

                // title of the chart
                chart.addTitle("统计销售量的前15名", 16);

                chart.dataProvider = chartData;
                chart.titleField = "factoryName";//===============================
                chart.valueField = "value";//==================================
                chart.sequencedAnimation = true;
                chart.startEffect = "elastic";
                chart.innerRadius = "40%";
                chart.startDuration = 5;
                chart.labelRadius = 15;
                chart.balloonText = "[[title]]<br><span style='font-size:14px'><b>[[value]]</b> ([[percents]]%)</span>";
                // the following two lines makes the chart 3D
                chart.depth3D = 10;
                chart.angle = 15;

                chart.creditsPosition = "top-right";

                // WRITE
                chart.write("chartdiv");
            });
        </script>
    </head>

    <body>
        <div id="chartdiv" style="width:100%; height:100%;position: absolute;left: -10px;top: 10px"></div>
    </body>

统计产品销售排行

1. 代码如下
    /**
     * 统计产品销售排行
     * @return
     * @throws Exception
     */
    @Action(value = "statChartAction_productsale", results = {@Result(name = "productsale", location = "/WEB-INF/pages/stat/chart/column3D.jsp") })
        public String productsale() throws Exception {
            String sql = "select * from (select c.product_no,sum(c.amount) t from contract_product_c c group by c.product_no order by t desc) b where rownum < 3";
            List<String> productList = sqlService.executeSQL(sql);
            List<Map<String, Object>> productJsonList = new ArrayList<Map<String, Object>>();
            for (int i = 0; i < productList.size(); i++) {
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("productNo", productList.get(i++));
                map.put("saleAmount", productList.get(i));
                // 在productJsonList集合中添加一个元素(map)
                productJsonList.add(map);
            }
            String str = FastJsonUtils.toJSONString(productJsonList);
            super.put("str", str);
            return "productsale";
        }

2. 前端的代码如下
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>amCharts examples</title>
        <link rel="stylesheet" href="${pageContext.request.contextPath }/components/newAmcharts/style.css" type="text/css">
        <script src="${pageContext.request.contextPath }/components/newAmcharts/amcharts/amcharts.js" type="text/javascript"></script>
        <script src="${pageContext.request.contextPath }/components/newAmcharts/amcharts/serial.js" type="text/javascript"></script>

        <script>
            var chart;
            var chartData = ${str};

            AmCharts.ready(function () {
                // SERIAL CHART
                chart = new AmCharts.AmSerialChart();
                chart.dataProvider = chartData;
                chart.categoryField = "productNo";//======================================
                // the following two lines makes chart 3D
                chart.depth3D = 20;
                chart.angle = 30;

                // AXES
                // category
                 var categoryAxis = chart.categoryAxis;
                //categoryAxis.labelRotation = 20;
                categoryAxis.dashLength = 5;
                categoryAxis.gridPosition = "start"; 

                // value
                var valueAxis = new AmCharts.ValueAxis();
                valueAxis.title = "销售额";
                valueAxis.dashLength = 5;
                chart.addValueAxis(valueAxis);

                // GRAPH
                var graph = new AmCharts.AmGraph();
                graph.valueField = "saleAmount";//================================================
                graph.colorField = "color";
                graph.balloonText = "<span style='font-size:18px'>[[category]]: <b>[[value]]</b></span>";
                graph.type = "column";
                graph.lineAlpha = 0;
                graph.fillAlphas = 1;
                chart.addGraph(graph);

                // CURSOR
                var chartCursor = new AmCharts.ChartCursor();
                chartCursor.cursorAlpha = 0;
                chartCursor.zoomable = false;
                chartCursor.categoryBalloonEnabled = false;
                chart.addChartCursor(chartCursor);

                chart.creditsPosition = "top-right";

                // WRITE
                chart.write("chartdiv");
            });
        </script>
    </head>

    <body>
        <div id="chartdiv" style="width: 100%; height: 400px;"></div>
    </body>

统计每个时间段登录过的人数

1. 统计每个时间段登录过的人数,时间端以1小时为单位。
2. 重点就是SQL语句,SQL语句推到出来的过程
    * 查询在14点登录过的人数(不管是哪年,哪月)
        * select * from LOGIN_LOG_P where to_char(login_time,'HH24') = '14';

    * 统计每个时间段登录过的人数,以小时为时间段
        * select to_char(login_time,'HH24') a1,count(*) t from LOGIN_LOG_P group by to_char(login_time,'HH24') order by a1

    * 把每个时间段都显示,没有值的显示成0
        select a.a1,nvl(b.t,0) from (select * from online_info_t) a left join (select to_char(login_time,'HH24') a1,count(*) t from LOGIN_LOG_P group by to_char(login_time,'HH24') order by a1) b on a.a1 = b.a1 order by a.a1

3. 代码如下
    /**
     * 统计每个时间段登录过的人数
     * @return
     * @throws Exception
     */
    @Action(value = "statChartAction_onlineinfo", results = {@Result(name = "onlineinfo", location = "/WEB-INF/pages/stat/chart/linSmooth.jsp") })
    public String onlineinfo() throws Exception {
        String sql = "select a.a1,nvl(b.t,0) from (select * from online_info_t) a left join (select to_char(login_time,'HH24') a1,count(*) t from LOGIN_LOG_P group by to_char(login_time,'HH24') order by a1) b on a.a1 = b.a1 order by a.a1";
        List<String> list = sqlService.executeSQL(sql);
        List<Map<String, Object>> list2 = new ArrayList<Map<String, Object>>();
        for (int i = 0; i < list.size(); i++) {
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("hour", list.get(i++));
            map.put("value", list.get(i));
            list2.add(map);
        }
        String str = FastJsonUtils.toJSONString(list2);
        super.put("str", str);

        return "onlineinfo";
    }

4. 前端的代码如下
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>amCharts examples</title>
        <link rel="stylesheet" href="${pageContext.request.contextPath }/components/newAmcharts/style.css" type="text/css">
        <script src="${pageContext.request.contextPath }/components/newAmcharts/amcharts/amcharts.js" type="text/javascript"></script>
        <script src="${pageContext.request.contextPath }/components/newAmcharts/amcharts/serial.js" type="text/javascript"></script>

        <script>
            var chart;
            var graph;
            /* 
            var chartData = [
                {
                    "hour": "00",
                    "value": 5
                },
                {
                    "hour": "01",
                    "value": 12
                },
                {
                    "hour": "02",
                    "value": 56
                },
                {
                    "hour": "03",
                    "value": 1
                },
                {
                    "hour": "04",
                    "value": 0
                },
                {
                    "hour": "05",
                    "value": 3
                },
                {
                    "hour": "06",
                    "value": 1
                },
                {
                    "hour": "07",
                    "value": 5
                },
                {
                    "hour": "08",
                    "value": 8
                },
                {
                    "hour": "09",
                    "value": 110
                },
                {
                    "hour": "10",
                    "value": 20
                },
                {
                    "hour": "11",
                    "value": 12
                },
                {
                    "hour": "12",
                    "value": 22
                },
                {
                    "hour": "13",
                    "value": 1
                },
                {
                    "hour": "14",
                    "value": 78
                },
                {
                    "hour": "15",
                    "value": 12
                },
                {
                    "hour": "16",
                    "value": 46
                },
                {
                    "hour": "17",
                    "value": 78
                },
                {
                    "hour": "18",
                    "value": 9
                },
                {
                    "hour": "19",
                    "value": 4
                },
                {
                    "hour": "20",
                    "value": 2
                },
                {
                    "hour": "21",
                    "value": 1
                },
                {
                    "hour": "22",
                    "value": 0
                },
                {
                    "hour": "23",
                    "value": 3
                }
            ];
             */

            var chartData = ${str};

            AmCharts.ready(function () {
                // SERIAL CHART
                chart = new AmCharts.AmSerialChart();

                chart.dataProvider = chartData;
                chart.marginLeft = 10;
                chart.categoryField = "hour";
                //chart.dataDateFormat = "YYYY";

                // listen for "dataUpdated" event (fired when chart is inited) and call zoomChart method when it happens
                //chart.addListener("dataUpdated", zoomChart);

                // AXES
                // category
                var categoryAxis = chart.categoryAxis;
                //categoryAxis.parseDates = true; // as our data is date-based, we set parseDates to true
                //categoryAxis.minPeriod = "YYYY"; // our data is yearly, so we set minPeriod to YYYY
                categoryAxis.dashLength = 3;
                categoryAxis.minorGridEnabled = true;
                categoryAxis.minorGridAlpha = 0.1;//0.1

                // value
                var valueAxis = new AmCharts.ValueAxis();
                valueAxis.axisAlpha = 0;
                valueAxis.inside = true;
                valueAxis.dashLength = 3;
                chart.addValueAxis(valueAxis);

                // GRAPH
                graph = new AmCharts.AmGraph();
                graph.type = "smoothedLine"; // this line makes the graph smoothed line.
                graph.lineColor = "#d1655d";
                graph.negativeLineColor = "#637bb6"; // this line makes the graph to change color when it drops below 0
                graph.bullet = "round";
                graph.bulletSize = 8;
                graph.bulletBorderColor = "#FFFFFF";
                graph.bulletBorderAlpha = 1;
                graph.bulletBorderThickness = 2;
                graph.lineThickness = 2;
                graph.valueField = "value";
                graph.balloonText = "[[category]]<br><b><span style='font-size:14px;'>[[value]]</span></b>";
                chart.addGraph(graph);

                // CURSOR
                var chartCursor = new AmCharts.ChartCursor();
                chartCursor.cursorAlpha = 0;
                chartCursor.cursorPosition = "mouse";
                //chartCursor.categoryBalloonDateFormat = "YYYY";
                chart.addChartCursor(chartCursor);

                // SCROLLBAR
                //var chartScrollbar = new AmCharts.ChartScrollbar();
                //chart.addChartScrollbar(chartScrollbar);

                chart.creditsPosition = "top-right";

                // WRITE
                chart.write("chartdiv");
            });

            // this method is called when chart is first inited as we listen for "dataUpdated" event
            function zoomChart() {
                // different zoom methods can be used - zoomToIndexes, zoomToDates, zoomToCategoryValues
                chart.zoomToDates(new Date(1972, 0), new Date(1984, 0));
            }
        </script>
    </head>

    <body>
        <div id="chartdiv" style="width:100%; height:400px;"></div>
    </body>

eCharts的介绍

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值