【SSH网上商城项目实战29】使用JsChart技术在后台显示商品销售报表

  这个项目终于接近尾声了,注册功能我就不做了,关于注册功能我的另一篇博客详细的介绍了一下注册的表单验证,可以直接把功能加到本项目中,修改一下相关的跳转即可,就不再做了。另外,目前这个项目只有action层和service层,dao层我还没抽取,做完这个报表,我把dao层抽取一下,再对整个项目做个总结,差不多就可以上传源码了,到时候欢迎大家下载~

  这一节主要做一下最后一个功能:使用JsChart这个工具来显示商品的销售报表,JsChart是很好用的一款制作报表的工具,之所以好用,是因为它的官方实例做的非常好,可以直接在图形化界面操作后生成相应的代码,我们修改一下,然后放到我们自己项目的逻辑里面即可。

1. JsChart工具的介绍

 

  JsChart是一款优秀的制作报表的工具,生成的代码是js,所以是前端jsp页面很好的使用工具,可以看一下JsChart的 官网,打开后点击Online Edit,然后随便选择一个报表点击进入,可以在线编辑我们想要的图表类型和格式,如下:

  再往下翻,可以设置我们想要的类型:

  都设置好了后,就可以点击上面那个生成js代码的button了,然后把对应的代码复制到我们的jsp中。如下是我生成的js代码(截取有用部分即可):

<div id="chart_container">Loading chart...</div>
<script type="text/javascript">
    var myChart = new JSChart(‘chart_container‘, bar‘‘, ‘‘);
    myChart.setDataArray([‘#44A622‘,‘#A7B629‘,‘#CAD857‘,‘#E4DB7B‘,‘#ECDE49‘,‘#ECC049‘,‘#EC9649‘,‘#D97431‘,‘#D95531‘]);
    myChart.colorize(colorArr.slice(0,data.length));
    myChart.setSize(100*$("#number").val(), 400);
    myChart.setBarValues(false);
    myChart.setBarSpacingRatio(45);
    myChart.setBarOpacity(1);
    myChart.setBarBorderWidth(1);
    myChart.setTitle(‘商城销售报表‘);
    myChart.setTitleFontSize(10);
    myChart.setTitleColor(‘#607985‘);
    myChart.setAxisValuesColor(‘#607985‘);
    myChart.setAxisNameX(‘商品名称‘, false);
    myChart.setAxisNameY(‘销量‘, true);
    myChart.setGridOpacity(0.8);
    myChart.setAxisPaddingLeft(50);
    myChart.setAxisPaddingBottom(40);
    myChart.set3D(true);
    myChart.draw();
</script>

  这样我们就有了生成图表的js代码了,下面我们来分析一下整个流程:首先前台jsp页面发送一个Ajax请求,然后后台从数据库中取出相应的数据,这里的数据我们只需要取出卖了哪些商品以及相应的卖出数量即可,也就是说我们得从订单项的表中取,另外,前台还得传过去一个参数,告诉后台取多少条数据。后台取好了后将数据以json的格式发送到前台,前台再运行上面的js代码(当然要做相应的修改)将数据显示成报表的形式。好了,根据这个流程,先把后台做好。

2. 完成后台查询的逻辑

 

  首先在service层完成查询功能,这个查询时查询两项的:商品和商品销售数量。看一下代码:

//sorderService接口
public interface SorderService extends BaseService<Sorder> {
    //省去不相关的代码……
    //查询热点商品的销售量
    public List<Object> querySale(int number);
}

//sorderServiceImpl实现类
@Service("sorderService")
@SuppressWarnings("unchecked")
public class SorderServiceImpl extends BaseServiceImpl<Sorder> implements
        SorderService {

    //省去不相关的代码……
    @Override
    public List<Object> querySale(int number) {
        //不用fecth查出来的就是两项
        String hql = "select s.name, sum(s.number) from Sorder s join s.product group by s.product.id";
        return getSession().createQuery(hql) //
            .setFirstResult(0) //
            .setMaxResults(number) //
            .list();
    }
}

然后我们来完成action的部分:

@Controller
@Scope("prototype")
public class SorderAction extends BaseAction<Sorder> {
    public String addSorder() {

    //省去不相关代码……

    //返回热门商品及其销售量
    public String querySale() {
        List<Object> jsonList = sorderService.querySale(model.getNumber());
        //将查询出来的list放到值栈的顶端,为什么这样做呢?看下面的解释
        ActionContext.getContext().getValueStack().push(jsonList);
        return "jsonList";
    }
}

  BaseAction中有个List<T>对象,但是我们不能使用这个对象,因为这里jsonList是个List<Object>对象,不是BaseAction中的List<T>对象,所以我们要在这个Action中定义一个List<Object>对象并实现get方法,然后在struts.xml文件中配置一下root即可,不过这有点麻烦。

  这里介绍个更加简便的方法,struts2在转json如果找不到配置的root,就会从值栈的栈顶拿出来数据来转json,所以我们只要将现在拿到的jsonList扔到值栈的栈顶,然后在配置文件中写好result就可以了。

所以struts.xml中如下:

3. 完成前端的jsp页面

  后台的逻辑写完了,现在我们要完成前台的跳转逻辑以及接收后台传过来的json数据后的逻辑了。sale.jsp页面如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
    <%@ include file="/public/head.jspf" %>
    <script type="text/javascript" src="${shop }/js/jquery-1.11.1.js"></script>
    <script type="text/javascript" src="${shop }/js/jscharts.js"></script>
    <script type="text/javascript">
        $(function(){
            $("#submit").click(function(){
                var colorArr = [‘#44A622‘,‘#A7B629‘,‘#CAD857‘,‘#E4DB7B‘,‘#ECDE49‘,‘#ECC049‘,‘#EC9649‘,‘#D97431‘,‘#D95531‘,‘#E4DB7B‘];
                //发送Ajax请求
                $.post($("#sale").val(), {number:$("#number").val()}, function(data){

                    var myChart = new JSChart(‘chart_container‘, $("#type").val(), ‘‘);
                    myChart.setDataArray(data);
                    myChart.colorize(colorArr.slice(0,data.length));//选择几个就显示几个
                    myChart.setSize(100*$("#number").val(), 400);
                    myChart.setBarValues(false);
                    myChart.setBarSpacingRatio(45);
                    myChart.setBarOpacity(1);
                    myChart.setBarBorderWidth(1);
                    myChart.setTitle(‘商城销售报表‘);
                    myChart.setTitleFontSize(10);
                    myChart.setTitleColor(‘#607985‘);
                    myChart.setAxisValuesColor(‘#607985‘);
                    myChart.setAxisNameX(‘商品名称‘, false);
                    myChart.setAxisNameY(‘销量‘, true);
                    myChart.setGridOpacity(0.8);
                    myChart.setAxisPaddingLeft(50);
                    myChart.setAxisPaddingBottom(40);
                    myChart.set3D(true);
                    myChart.draw();
                    }, "json");
            });
        });
    </script>
</head>
<body style="margin:10px;">

    请选择报表类型:
    <select id="sale">
        <option value="sorder_querySale.action">年度销售报表</option>
    </select>
    查询数量:
    <select id="number">
        <option value="5">5</option>
        <option value="7">7</option>
        <option value="10">10</option>
    </select>
    类型:
    <select id="type">
        <option value="bar">柱状型</option>
        <option value="line">线型</option>
        <option value="pie">饼状型</option>
    </select>
    <input type="button" id="submit" value="查询">
    <div id="chart_container">Loading Chart...</div>
</body>
</html>

  主要是几个选择框,可以根据用户选择做出相应的显示,$.post();中有四个参数,第一个是指定接收的action,我写在选择标签中了,直接通过定位dom元素来获取的,第二个参数是要传送的参数,这里是要显示的数目,第三个参数是接收后台json数据后要执行的函数,第四个参数是指定接收数据类型,这里是json类型。

  下面看一下接收后台数据后执行的函数,这个主要是之前自动生成的js代码,主要是要生成报表,但是做了一点修改,比如图标的类型改成了用户选择的类型,显示的数量也改掉了,不过这都是一些小改,问题不大。下面看一下不同类型的图标的显示效果吧:

  效果还是挺不错的,所以如果有需要制作报表的朋友,推荐使用这个JsChart工具,很好用~整个项目基本就写这么多了吧~后面再做个总结,再上传一下源码,就差不多结束了~



—–乐于分享,共同进步!

—–更多文章请看:http://blog.csdn.net/eson_15

时间: 2024-10-09 23:11:01

【SSH网上商城项目实战29】使用JsChart技术在后台显示商品销售报表的相关文章

【SSH网上商城项目实战27】域名空间的申请和项目的部署及发布

前面陆陆续续的完成了网上商城的一些基本功能,虽然还有很多地方有待完善,但是不影响项目的部署和发布,我们可以先来玩一把,这一节主要介绍下域名空间的申请以及项目的部署和发布流程. 1. 域名空间的申请 作为一个伟大的屌丝,肯定没钱买域名空间,很自然的想到去申请个免费的,现在免费的域名空间也很多,我在福佳jsp技术网上申请了一个试用期是15天的,大家也可以去申请个玩玩,反正作为学习,这已经足够了,当然,如果要长期的肯定要付费的.注册过程我截几个图,如下: 然后下一步,最后开通如下: 建议把上面这些信息

【SSH网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示

网上商城首页都有热门商品,那么这些商品的点击率是很高的,当用户点击某个热门商品后需要进入商品的详细信息页面,就像淘宝里面那样.那么每次点击都要去后台查询一下该商品的详细信息,就会发送相应的sql语句,每次刷新一下详细页面也会发sql语句,这样的话,性能肯定会受到很大的影响.那么使用Hibernate的二级缓存就可以解决这个问题. 有些人可能会想,我们可以使用重定向,这样的话,在用户第一次访问的时候把信息查出来放到session中,以后每次用户刷新就可以去session中拿了,这样就不用去数据库中

【SSH网上商城项目实战21】从Demo中看易宝支付的流程

这一节我们先写一个简单点的Demo来测试易宝支付的流程,熟悉这个流程后,再做实际的开发,因为是一个Demo,所以我没有考虑一些设计模式的东西,就是直接实现支付功能.实现支付功能需要易宝给我们提供的API.那么问题来了,使用第三方支付平台最主要的一件事就是获取该平台的API,我们首先得获取他们的API以及开发文档,然后才可以做进一步的开发. 1. 获取易宝的API 获取API的第一步,要在易宝上注册一个账号,这个账号是商家的账号,后面买家付款后,会将钱款存入该账号中,然后商家自己提取到银行卡,易宝

【SSH网上商城项目实战25】使用java email给用户发送邮件

当用户购买完商品后,我们应该向用户发送一封邮件,告诉他订单已生成之类的信息,邮箱地址是从用户的基本信息中获取,好了,首先我们来看一下Java中发送邮件的方法. 1. java中发送email的方法     在完善这个项目之前,先来回顾一下java中是如何发送邮件的,首先肯定需要发送邮件的jar包:mail.jar,导入到lib目录下,好了,下面我们先写一个普通的java程序来回顾一下java email的知识点: public class SendEmailDemo { public stati

【SSH网上商城项目实战14】商城首页UI的设计

前面我们利用EasyUI和SSH搭建好了后台的基本框架,做好了后台的基本功能,包括对商品类别的管理和商品的管理等,这一节我们开始搭建前台页面. 做首页的思路:假设现在商品的业务逻辑都有了,首先我们需要创建一个监听器,在项目启动时将首页的数据查询出来放到application里,即在监听器里调用后台商品业务逻辑的方法. 1.  首页商品显示逻辑 在首页,我们只显示商品热点类别中的前几个商品,比如热点类别有儿童休闲类,女性休闲类,男性休闲类,那我们会有三个板块来显示不同的商品类,每个类别里再显示几个

【SSH网上商城项目实战20】在线支付平台的介绍

之前已经完成了首页的显示,用户添加购物车,确认订单等功能,下面就是支付功能的开发了.用户确认了订单后会直接跳转到支付页面进行在线支付,在线支付需要第三方的接口,这一节主要介绍一些关于第三方支付的内容,从下一节开始,我们真正开发在线支付模块. 1. 在线支付介绍 在线支付是指卖方与买方通过因特网上的电子商务网站进行交易时,银行为其提供网上资金结算服务的一种业务.它为企业和个人提供了一个安全.快捷.方便的电子商务应用环境和网上资金结算工具.在线支付不仅帮助企业实现了销售款项的快速归集,缩短收款周期,

【SSH网上商城项目实战10】商品类基本模块的搭建

前面我们完成了与商品类别相关的业务逻辑,接下来我们开始做具体商品部分. 1. 数据库建表并映射Model 首先我们在数据库中新建一张表,然后使用逆向工程将表映射成Model类,表如下: /*=============================*/ /* Table: 商品表结构 */ /*=============================*/ create table product ( /* 商品编号,自动增长 */ id int primary key not null aut

【SSH网上商城项目实战18】过滤器实现购物登录功能的判断

上一节我们做完了购物车的基本操作,但是有个问题是:当用户点击结算时,我们应该做一个登录的判断,判断用户有没有登录,没有登录的话,得首先让用户登录.这就用到了过滤器的技术了,过滤器是专门拦截页面请求的,它与拦截器的原理差不多,拦截器是专门拦截Action请求的,所以各有所用,如果直接是页面的跳转,不经过Action的话,我们只要写一个拦截器即可,如果需要跳转到一个Action处理,那么我们就得写一个拦截器. 1. 登录跳转的原理 先说一下实现原理:写一个过滤器,在web.xml中配置一下需要拦截的

【SSH网上商城项目实战06】基于DataGrid的数据显示

EasyUI中DataGrid以表格形式展示数据,并提供了丰富的选择.排序.分组和编辑数据的功能支持.DataGrid的设计用于缩短开发时间,并且使开发人员不需要具备特定的知识.它是轻量级的且功能丰富.单元格合并.多列标题.冻结列和页脚只是其中的一小部分功能. 1. 回顾一下第4节内容 在第4节中,我们使用EasyUI搭建好了左侧菜单栏,并且通过点击菜单选项在右边弹出对应的选项卡.这节我们来使用DataGrid把右边的选项卡部分做好.先看一下第4节中最后的aindex.jsp文件(也可参见第4节