util
为了在dashboard页面统计访问人数,用线程来计数
RunnableThreadWebCount
public class RunnableThreadWebCount implements Runnable {
public static HashMap<String,Integer> map = new HashMap<>();
@Override
public void run() {
System.out.println("计数线程已经启动...");
map.put(new String("111"),0);
}
public static void showThread(){
}
public static int addCount(String key){
Integer count = map.get(key);
if(count == null){
return 0;
}
count++ ;
map.put(key,count);
System.out.println("当前网站访问人数:" + count);
return count;
}
}
Times
public class Times implements Runnable {
@Override
public void run() {
System.out.println("计数线程以及启动...");
TimerTask task = new TimerTask() {
@Override
public void run() {
RunnableThreadWebCount.showThread();
}
};
Timer timer = new Timer();
timer.scheduleAtFixedRate(task,1000,1000);//第二个参数是延时(1秒),第三个参数是间隔时间(1秒)
}
}
这是我第一次接触Timer任务类,所以去找了一些它的功能。
Timer,一般用来做延时任务或者循环定时执行的任务。
使用Timer的时候,必须要有一个TimerTask去执行任务,这是一个线程,它实现了Runnable接口,run方法里面就是线程需要做的,也是我们自己定义的。
在启动类中添加这两个线程类,启动线程,并在控制台打印。 ```
/*计数线程*/
RunnableThreadWebCount runnableThreadWebCount = new RunnableThreadWebCount();
runnableThreadWebCount.run();
/*计时器线程*/
Timers timers = new Timers();
timers.run();
DashboardController
将首页需要展示的数据添加至缓存,实现其统计功能。
Long mIncome, lastIncome; //当月收入,上个月收入
Integer curOrderNum, preOrderNum; //当月订单数,上月订单数
Integer curRefundOrder, lastRefundOrder; //当月退单数,上月退单数
/*全部加进缓存*/
mIncome = redisService.get(DashboardKey.board,"mIncome",Long.class);
if(mIncome == null){
mIncome = orderService.selectCurPayment();
mIncome = mIncome == null ? 0L : mIncome;
redisService.set(DashboardKey.board, "mIncome", mIncome);
}
lastIncome = redisService.get(DashboardKey.board, "lastIncome", Long.class);
if(lastIncome == null){
lastIncome = orderService.selectLastPayment();
lastIncome = lastIncome == null ? 0L : lastIncome;
redisService.set(DashboardKey.board, "lastIncome", lastIncome);
}
curOrderNum = redisService.get(DashboardKey.board, "curOrderNum", Integer.class);
if (curOrderNum == null){
curOrderNum = orderService.selectCurOrderNum();
curOrderNum = curOrderNum == null? 0 : curOrderNum;
redisService.set(DashboardKey.board, "curOrderNum", curOrderNum);
}
preOrderNum = redisService.get(DashboardKey.board, "preOrderNum", Integer.class);
if (preOrderNum == null){
preOrderNum = orderService.selectLastOrderNum();
preOrderNum = curOrderNum == null? 0 : preOrderNum;
redisService.set(DashboardKey.board, "preOrderNum", preOrderNum);
}
curRefundOrder = redisService.get(DashboardKey.board, "curRefundOrder", Integer.class);
if (curRefundOrder == null){
curRefundOrder = orderService.selectCurRefundOrder();
curRefundOrder = curRefundOrder == null? 0 : curRefundOrder;
redisService.set(DashboardKey.board,"curRefundOrder",curRefundOrder);
}
lastRefundOrder = redisService.get(DashboardKey.board, "lastRefundOrder", Integer.class);
if (lastRefundOrder == null){
lastRefundOrder = orderService.selectLastRefundOrder();
lastRefundOrder = lastRefundOrder == null? 0 : lastRefundOrder;
redisService.set(DashboardKey.board, "lastRefundOrder", lastRefundOrder);
}
计算增长百分比
/*计算增长百分比*/
public String getPer(long a, long b){
StringBuilder stringBuilder = new StringBuilder();
double d = (a-b) / b;
String s = String.format("%.2f",d);
stringBuilder.append(s).append("%");
return stringBuilder.toString();
}
计数
/*计数*/
@RequestMapping("/border/website/count/")
@ResponseBody
public int count(@RequestParam("key") String key){
return RunnableThreadWebCount.addCount(key);
}
将需要在仪表盘中需要展示的数据存到实例中,在html页面中通过th:text获取值
int count = RunnableThreadWebCount.addCount("111");
stats.setPv(count); //访问量
stats.setmIncome(mIncome); //月收入
stats.setIncomePer(getPer(mIncome,lastIncome)); //月收入环比
stats.setmOrderNum(orderService.selectCurOrderNum()); //订单数
stats.setmOrderRefund(orderService.selectCurRefundOrder()); //月退单数
stats.setmOrderRefundPer(getPer(curRefundOrder,lastRefundOrder)); //月退单环比
stats.setOrderNumPer(getPer(curOrderNum,preOrderNum)); //月订单环比
model.addAttribute("dashboard", stats);
每天的订单数和收入也存到model中
Date now = new Date();
/*获取三十天前的日期*/
Calendar instance = Calendar.getInstance();
instance.setTime(now);
instance.add(instance.DATE, -31); //最后一个数字30可改,30天的意思
Date temp = new Date();
Order order = new Order();
for (int i = 0; i < 31; i++) {
instance.add(instance.DATE, 1);
temp = instance.getTime();
order.setCreateTime(temp);
/*每天的订单数加入缓存*/
orderNum = redisService.get(DashboardKey.board,"orderNum",Integer.class);
if (orderNum == null){
orderNum = orderService.selectDayOrderNum(order);
orderNum = orderNum == null? 0:orderNum;
redisService.set(DashboardKey.board, "orderNum", orderNum);
}
/*每天的收入加入缓存*/
orderSum = redisService.get(DashboardKey.board, "orderSum", Integer.class);
if (orderSum == null){
orderSum = orderService.selectDayOrderSum(order);
orderSum = orderSum == null? 0: orderSum;
redisService.set(DashboardKey.board, "orderSum", orderSum);
}
data2.add(orderNum);
data3.add(orderSum);
}
model.addAttribute("data2", data2);
model.addAttribute("data3", data3);
写完了以上,我以为ok可以使用了。但是,登录后一直加载怎么都进不去dashboard页面,控制台也不报错,等了几分钟后,终于报了一个错,说无法从池中获取资源。大概感觉到是没有从jedis连接池中获取到连接池。经过一系列的等等待测试,发现问题就是出现以上关于缓存的代码块中,注释过后可以访问,以上我写了那么多,只有统计访问人数可以用…我也是第一次使用jedispool连接池,感觉使用上和druid差不多,我看了jedis连接池的使用等博客后发现我的使用方法是没有问题的,但是就是没有办法使用。太难过了。redis缓存很重要,还是要把这个问题解决了!以及发现了一个问题,th:text后面不能获取model中String类型的值,为什么呢?原先是报错的,我把两个值删掉了,就可以使用了。
十一点了,我还是没有解决这个问题,哎只能明天继续了…感觉效率还太低了,很不喜欢这种忙碌之后没有什么收获的感觉。