实施商品管理系统项目《第五天》

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类型的值,为什么呢?原先是报错的,我把两个值删掉了,就可以使用了。

十一点了,我还是没有解决这个问题,哎只能明天继续了…感觉效率还太低了,很不喜欢这种忙碌之后没有什么收获的感觉。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值