谷粒学院service-statistics模块

谷粒学院service-statistics模块

模块介绍

​ 主要实现后台数据统计功能,统计学员的注册数,学员的登陆数,课程播放量,课程数。

在这里插入图片描述

库表设计

在这里插入图片描述

详细设计

网站统计数据

统计某天的注册人数
接口设计

接受参数:日期
请求类型:POST
请求体:JSON 格式的数据

流程
  1. 需要调用ucenter模块中的方法查询出注册的人数.
  2. 先查询表中是否存在与插入日期相同的数据,有则删除。
  3. 把获取的数据添加到统计表中。
代码
//controller层
@Autowired
private StatisticsDailyService staService;

//统计某天的注册人数(远程调用)并加到统计表
@PostMapping("registerCount/{day}")
public R registerCount(@PathVariable String day) {
    staService.registerCount(day);
    return R.ok();
}
//service层
	@Autowired
    private UcenterClient ucenterClient;

    //统计某天的注册人数(远程调用)并加到统计表
    @Override
    public void registerCount(String day) {
        //插入新数据之前,先删掉表中与即将插入的数据日期相同的数据
        QueryWrapper<StatisticsDaily> wrapper = new QueryWrapper<>();
        wrapper.eq("date_calculated", day);
        baseMapper.delete(wrapper);

        //远程调用,得到某天的注册人数
        R registerR = ucenterClient.countRegister(day);
        Integer countRegister = (Integer)registerR.getData().get("countRegister");

        //把获取到的数据添加到统计表
        StatisticsDaily sta = new StatisticsDaily();
        sta.setRegisterNum(countRegister); //注册人数
        sta.setDateCalculated(day); //统计的哪天的数据
        //统计表中的其它数据我们这里模拟生成随机数,后期自行完善
        sta.setVideoViewNum(RandomUtils.nextInt(100, 200));
        sta.setLoginNum(RandomUtils.nextInt(100, 200));
        sta.setCourseNum(RandomUtils.nextInt(100, 200));
        baseMapper.insert(sta);
    }
//远程调用接口
@Component
@FeignClient("service-ucenter")
public interface UcenterClient {
    //查询某天注册人数
    @GetMapping("/educenter/member/countRegister/{day}")
    public R countRegister(@PathVariable("day") String day);
}
图表显示
接口设计

接受参数:类型,开始时间和结束时间
请求类型:GET
返回值:map集合

流程
  1. 根据条件查询对应数据
  2. 封装数据(统计日期和对应数量)
    1. 创建两个list
    2. 一个封装日期,一个封装类型对应的数量
  3. 将封装后的两个list集合放到map集合中并返回
代码
//controller层
//图表显示,返回两部分数据:日期的json数组(横坐标)和数量的json数组(纵坐标)
@GetMapping("showData/{type}/{begin}/{end}")
public R showData(@PathVariable String type,
                  @PathVariable String begin,
                  @PathVariable String end) {
    Map<String, Object> map = staService.getShowData(type, begin, end);
    return R.ok().data(map);
}
//service层
//图表显示,返回两部分数据:日期的json数组(横坐标)和数量的json数组(纵坐标)
    @Override
    public Map<String, Object> getShowData(String type, String begin, String end) {
        //1.根据条件查询对应数据
        QueryWrapper<StatisticsDaily> wrapper = new QueryWrapper<>();
        wrapper.between("date_calculated", begin, end);
        wrapper.select("date_calculated", type);
        List<StatisticsDaily> staList = baseMapper.selectList(wrapper);

        //2.封装数据(我们需要返回两部分数据:统计日期 和 该日期对应的数量)
        //2.1创建两个list集合
        List<String> date_calculated = new ArrayList<>(); //统计日期
        List<Integer> numDataList = new ArrayList<>(); //数量
        //2.2遍历staList进行数据的封装
        for (int i = 0; i < staList.size(); i++) {
            StatisticsDaily daily = staList.get(i);
            //2.2.1封装日期list集合
            date_calculated.add(daily.getDateCalculated());
            //2.2.2封装对应数量
            switch (type) {
                case "login_num":
                    numDataList.add(daily.getLoginNum());
                    break;
                case "register_num":
                    numDataList.add(daily.getRegisterNum());
                    break;
                case "video_view_num":
                    numDataList.add(daily.getVideoViewNum());
                    break;
                case "course_num":
                    numDataList.add(daily.getCourseNum());
                    break;
                default:
                    break;
            }
        }

        //3.将封装后的两个list集合放到map集合中并返回
        Map<String, Object> map = new HashMap<>();
        map.put("date_calculated", date_calculated);
        map.put("numDataList", numDataList);
        return map;
    }
定时任务:每天的凌晨一点查询前一天的统计数据并插入到统计表
代码
@Component
public class ScheduledTask {
    @Autowired
    private StatisticsDailyService staService;

    //在每天的凌晨一点查询前一天的统计数据并插入到统计表
    @Scheduled(cron = "0 0 1 * * ?")
    public void task2() {
        //获取上一天的日期(格式是yyyy-MM-dd)
        String day = DateUtil.formatDate(DateUtil.addDays(new Date(), -1));
        staService.registerCount(day);
    }
}
日期操作工具类
代码
public class DateUtil {

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

    /**
     * 格式化日期
     *
     * @param date
     * @return
     */
    public static String formatDate(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        return sdf.format(date);

    }

    /**
     * 在日期date上增加amount天 。
     *
     * @param date   处理的日期,非null
     * @param amount 要加的天数,可能为负数
     */
    public static Date addDays(Date date, int amount) {
        Calendar now =Calendar.getInstance();
        now.setTime(date);
        now.set(Calendar.DATE,now.get(Calendar.DATE)+amount);
        return now.getTime();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值