超越昨天的自己系列(8)

morris.js的官网有详细的例子:http://www.oesmith.co.uk/morris.js/

特别注意它的依赖:

<link rel="stylesheet" href="http://cdn.oesmith.co.uk/morris-0.4.3.min.css">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js"></script>
<script src="http://cdn.oesmith.co.uk/morris-0.4.3.min.js"></script>

放个div:

<div class="graph-container">
20天内用户增长数量
<div id="examplefirst" class="graph" style="position: relative;">
<div id="myfirstchart" style="height: 250px;"></div>
</div>
</div>

script:

    <script >
// 后台传来的数据
var data = '$data';
data = data.replace(/&quot;/g, '"');
var array = eval(data);
new Morris.Line({
xLabels: "day",
// ID of the element in which to draw the chart.
element: 'myfirstchart',
// Chart data records -- each entry in this array corresponds to a point on
// the chart.
data: array,
// The name of the data record attribute that contains x-values.
xkey: 'year',
// A list of names of data record attributes that contain y-values.
ykeys: ['value'],
// Labels for the ykeys -- will be displayed when you hover over the
// chart.
labels: ['Value']
});
</script>

就可以展示啦~ 只要注意插件中参数data是个数组即可。

后台传来的数据类似:

[
{ year: '2008', value: 20 },
{ year: '2009', value: 10 },
{ year: '2010', value: 5 },
{ year: '2011', value: 5 },
{ year: '2012', value: 20 }
]

所以后台的查询我做成了循环查询的方式,本人觉得一定是有更优的方式能够一次查出全部需求数据。先看下实现(hibernate):

action处理:注意循环部分的查询,每次只查一天内的量,如果数量过多可能会影响数据库性能

        // y轴末尾时间 时间处理成: 20130201 23:59:59:999
Date endDate = WXDateUtil.getTodayLastTime();
// y轴开始时间 默认20天前到现在
Date beginDate = WXDateUtil.getBeforeDays(endDate, 20);
// y轴上时间点列表
List<Date> dateList = new ArrayList<Date>();
// 先放开始时间
Date midDate = beginDate;
while(endDate.after(midDate)){
dateList.add(midDate);
// 下一天
midDate = WXDateUtil.getNextDay(midDate);
}
// 再放结束时间
dateList.add(endDate);
JSONArray array = new JSONArray();
if(dateList.size() > 0){
for (int i = 0; i < dateList.size() - 1; i++) {
long count = clientService.getCountByTypeAndTime(0, dateList.get(i), dateList.get(i+1));
JSONObject object = new JSONObject();
object.put("year", WXDateUtil.dateToStr(dateList.get(i+1), "yyyy-MM-dd" ));
object.put("value", count);
array.add(object);
}
}
context.put("data", array.toJSONString());

时间处理 Util的包:

public class WXDateUtil {

    private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";

    /**
* 把日期型转换成字符串形式。
*
* @param date 日期
* @param dateFormat 日期格式,例如"yyyy/MM/dd"、"yyyy年MM月dd"
* @return 日期字符串
*/
public static String toLocaleString(Date date, String dateFormat) {
if (date == null) {
return "";
} if (StringUtil.isBlank(dateFormat)) {
return new SimpleDateFormat(DEFAULT_DATE_FORMAT).format(date);
} return new SimpleDateFormat(dateFormat).format(date);
} /**
* 把日期型转换成"yyyy/MM/dd/"字符串形式。
*
* @param date
* @return 日期字符串
*/
public static String toLocaleString(Date date) {
return toLocaleString(date, null);
} /**
* 获得sysdate+hours后的时间
*
* @param hours 提前或者推后的时间
* @return sysdate+hours后的时间
*/
public static Date getSysDate(int hours) {
Calendar time = Calendar.getInstance(); time.add(Calendar.HOUR, hours); return time.getTime();
} /**
* 方法说明:天数差
*
* @param firstDate
* @param lastDate
*/
public static int getTimeIntervalDays(Date firstDate, Date lastDate) {
long intervals = lastDate.getTime() - firstDate.getTime() + (60 * 1000); if (intervals > 0) {
long daysd = intervals / (24 * 60 * 60 * 1000); return new Long(daysd).intValue();
} return 0;
} /**
* 方法说明:小时差
*
* @param firstDate
* @param lastDate
*/
public static int getTimeIntervalHours(Date firstDate, Date lastDate) {
long intervals = lastDate.getTime() - firstDate.getTime() + (60 * 1000); if (intervals > 0) {
long longHours = (intervals / (60 * 60 * 1000)) % 24; return new Long(longHours).intValue();
} return 0;
} /**
* 方法说明:分钟差
*
* @param firstDate
* @param lastDate
*/
public static int getTimeIntervalMins(Date firstDate, Date lastDate) {
long intervals = lastDate.getTime() - firstDate.getTime() + (60 * 1000); if (intervals > 0) {
long longMins = (intervals / (60 * 1000)) % 60; return new Long(longMins).intValue();
} return 0;
} /**
* 方法说明:parse date
*
* @param date
* @param dateformat
*/
public static Date parseDate(String date, String dateformat) {
SimpleDateFormat sdf = new SimpleDateFormat(dateformat); try {
return sdf.parse(date);
} catch (ParseException e) {
return null;
}
} /**
* 比较日期是否大于当前日期
*/
public static boolean afterNow(Date date) {
if (date == null) {
return false;
} Calendar nowCar = Calendar.getInstance();
Calendar car = Calendar.getInstance(); car.setTime(date); return car.after(nowCar);
} /*
* 查看是否早几天
*/
public static boolean afterDays(Date date, int day) {
if (date == null) {
return false;
} Calendar levelDay = Calendar.getInstance();
Calendar createDay = Calendar.getInstance(); createDay.setTime(date);
createDay.add(Calendar.DATE, day); if (createDay.after(levelDay)) {
return true;
} else {
return false;
}
} public static String getIconPathDay(){
GregorianCalendar now;
String year, day, month, hour;
now = new GregorianCalendar();
year = String.valueOf(now.get(Calendar.YEAR));
month = (now.get(Calendar.MONTH) + 1) < 10 ? "0" + String.valueOf(now.get(Calendar.MONTH) + 1) : String.valueOf(now.get(Calendar.MONTH) + 1);
day = String.valueOf(now.get(Calendar.DAY_OF_MONTH));
StringBuilder sb = new StringBuilder();
sb.append(year).append("/");
sb.append(month).append("/");
sb.append(day).append("/");
return sb.toString();
} /*
* 查看是否早几小时
*/
public static boolean afterHours(Date date, int hours) {
if (date == null) {
return false;
} Calendar levelDay = Calendar.getInstance();
Calendar createDay = Calendar.getInstance(); createDay.setTime(date);
createDay.add(Calendar.HOUR, hours); if (createDay.after(levelDay)) {
return true;
} else {
return false;
}
} /**
* 取得系统当前日期
*/
public static Date getCurrentTime() {
return new Date();
} /**
* 返回多少时间的前的时间, seconds 可以是负的
*
* @param when
* @param seconds
*/
public static Date addTime(Date when, int seconds) {
Calendar c = Calendar.getInstance(); c.setTime(when);
c.add(Calendar.SECOND, seconds); return c.getTime();
} /**
* @param date
* @param pattern "yyyy-MM-dd HH:mm:ss.SSS"
* @return
*/
public static String dateToStr(Date date, String pattern) {
if (pattern == null) {
pattern = "yyyy-MM-dd HH:mm:ss.SSS";
}
DateFormat ymdhmsFormat = new SimpleDateFormat(pattern); return ymdhmsFormat.format(date);
} /**
* @param str
* @param pattern "yyyy-MM-dd HH:mm:ss.SSS"
* @return
* @throws ParseException
*/
public static Date strToDate(String str, String pattern) {
if (pattern == null) {
pattern = "yyyy-MM-dd HH:mm:ss.SSS";
}
DateFormat ymdhmsFormat = new SimpleDateFormat(pattern);
try {
return ymdhmsFormat.parse(str);
} catch (ParseException e) {
return null;
}
} /**
* 获得当天日期
*
* @date 2009-2-20
*/
public static Date getToday() {
Calendar ca = Calendar.getInstance();
return ca.getTime();
} /**
* @date 2009-2-20
*/
public static Date mkDate(int year, int month, int date) {
Calendar ca = Calendar.getInstance();
ca.set(year, month - 1, date);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
sdf.format(ca.getTime());
return ca.getTime();
} /**
* <li></li>
*
* @param date1
* @param date2 <li></li>
*/
public static boolean compareTwoDate(Date date1, Date date2) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd HH:mm");
return simpleDateFormat.format(date1).equals(simpleDateFormat.format(date2));
} /**
* <li></li>
*
* @param date1
* @param date2 <li></li>
*/
public static boolean compareTwoDateDay(Date date1, Date date2) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
return simpleDateFormat.format(date1).equals(simpleDateFormat.format(date2));
} /**
* 通过文件路径获取文件名,类似Linux下basename命令
* @param path
* @return
*/
public static String getFileName(String path){
String str[] = path.split("/");
return str[str.length-1]; } /**
* 取得今天最后时间的Date
* @return 23:59:59
*/
public static Date getTodayLastTime(){
Calendar cal = Calendar.getInstance(); // represents right now, i.e. today's date
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
cal.set(Calendar.MILLISECOND, 999); // credit to f1sh
return cal.getTime();
} /**
* 指定日期向后推几天的日期
* @param date
* @param n 天数
* @return
*/
public static Date getBeforeDays(Date date, int n){
Long dateTime = date.getTime() - n*24*60*60*1000;
return new Date(dateTime);
} /**
* 指定日期向后推1天的日期
* @param date
* @return
*/
public static Date getNextDay(Date date){
Long dateTime = date.getTime() + 24*60*60*1000;
return new Date(dateTime);
} /**
*
* @param args
*/
public static void main(String[] args) {
System.out.println(getToday()); }
}

然后了解下hibernate查询count的方式:

参考了:http://stackoverflow.com/questions/1372317/how-do-we-count-rows-using-hibernate

例子:

    public long getCountByTypeAndTime(int type, Date beginTime, Date endTime) {

        Criteria criterion = this.getSession().createCriteria(ClientDO.class);
if(type!= 0){
criterion.add(Restrictions.eq("type", type));
}
if (beginTime != null) {
criterion.add(Restrictions.ge("createTime", beginTime));
}
if (endTime != null) {
criterion.add(Restrictions.le("createTime", endTime));
} return (Long)criterion.setProjection(Projections.rowCount()).uniqueResult(); }

时间作为横轴的图表(morris.js)超越昨天的自己系列(8)的更多相关文章

  1. spring和redis的整合-超越昨天的自己系列(7)

    超越昨天的自己系列(7) 扯淡:  最近一直在慢慢多学习各个组件,自己搭建出一些想法.是一个涉猎的过程,慢慢意识到知识是可以融汇贯通,举一反三的,不过前提好像是研究的比较深,有了自己的见解.自认为学习 ...

  2. maven为不同环境打包(hibernate)-超越昨天的自己系列(6)

    超越昨天的自己系列(6) 使用ibatis开发中,耗在dao层的开发时间,调试时间,差错时间,以及适应修改需求的时间太长,导致项目看起来就添删改查,却特别费力.   在项目性能要求不高的情况下,开始寻 ...

  3. HashMap归档-超越昨天的自己系列

    java HashMap 读一下源码,一个数组存储数据: transient Entry[] table; 内部存key和value的内部类: static class Entry<K,V> ...

  4. Collections.reverse 代码思考-超越昨天的自己系列(13)

    点进Collections.reverse的代码瞄了眼,然后就开始了一些基础知识的收集. 现在发现知道的越多,知道不知道的越多. 列几个记录下: reverse方法源码: /** * Reverses ...

  5. crontab 移动日志-超越昨天的自己系列(12)

    linux上定时执行某些脚本是管理服务器的时候比较常用的场景,比如定时检查进程是否存在,定时启动或关闭进程,定时检查日志删除日志等. 当我打开google百度crontab时长篇大论的一大堆,详细解释 ...

  6. java进程性能分析步骤-超越昨天的自己系列(11)

    java进程load过高分析步骤: top 查看java进程情况     top -Hp 查看某个进程的具体线程情况   printf 0x%x 确认哪一个线程占用cpu比较多,拿出来转成16进制   ...

  7. 快速用springmvc搭建web应用-超越昨天的自己系列(10)

    Demo地址:http://pan.baidu.com/s/1sjttKWd 创建命令: mvn archetype:generate -DgroupId=com.witown.open.demo - ...

  8. 轻量级的绘制图表js库--Morris.js

    Morris.js 是一个轻量级的 JS 库,使用 jQuery 和 Raphaël 来生成各种时序图. 虽说现在移动手机网络已经到了4G,但是在移动web客户端开发过中,为了达到良好的体验效果,需要 ...

  9. jquery图表插件morris.js参数详解和highcharts图表插件

    一.morris.js 优点:轻巧.简单好用 缺点:没highcharts功能多,常用的足以 网址:http://morrisjs.github.io/morris.js/ 核心代码 1.head调用 ...

随机推荐

  1. Windows内核对象

    1. 内核对象 Windows中每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核进行访问,应用程序不能在内存中定位这些数据结构并直接更改其内容.这个内存块是一个数据结构,其成员 ...

  2. js基础之ajax

    必须搞懂的几个问题: 1.如何创建ajax对象? 2.如何连接服务器? 3.如何发送请求? 4.监控请求状态的事件是什么?分几个阶段?如何获取返回值? 答:onreadystatechange事件:一 ...

  3. 带你揭开ATM的神秘面纱

    相信大家都用过ATM取过money吧,但是有多少人真正是了解ATM的呢?相信除了ATM从业者外了解的人寥寥无几吧,鄙人作为一个从事ATM软件开发的伪专业人士就站在我的角度为大家揭开ATM的神秘面纱吧. ...

  4. HDU 4046 Panda

    线段树单点更新,要注意两段合并多出的答案的计算即可 //======================================================================== ...

  5. C#解析复杂的Json成Dictionary<key,value>并保存到数据库(多方法解析Json 四)

    准备工作: 1.添加引用System.Web.Extensions, 2..net3.5+版本都有,如果VS2010找不到,在这个文件夹找:C:\Program Files\Reference Ass ...

  6. visualSVN server库迁移

    首先,VisualSVN Server Manager,包含两个路径,一个是安装路径,例如本机:C:\Program Files\VisualSVN Server,一个是库路径,例如本机:C:\Rep ...

  7. android Xutils dbutils 注解

    xUtils DbUtils 关于实体类注解 汇总 RockyZhang 发布于 1年前,共有 0 条评论 先来官方demo DbUtils db = DbUtils.create(this);    ...

  8. ZOJ 2672 Fibonacci Subsequence(动态规划+hash)

    题意:在给定的数组里,寻找一个最长的序列,满足ai-2+ai-1=ai.并输出这个序列. 很容易想到一个DP方程 dp[i][j]=max(dp[k][i])+1. (a[k]+a[i]==a[j], ...

  9. IOS的变量前加extern和static字段

    IOS的变量前加extern和static字段 前一阵子,做项目的时候到网上找Demo,打开运行的时候发现其中变量前有关键字extern和static,所以我研究了一下子 对于extern来说可以理解 ...

  10. Ubuntu 14.10 下设置静态IP

    修改 /etc/network/interfaces 文件 sudo nano /etc/network/interfaces 修改为 # 前面的不变auto eth0 iface eth0 inet ...