谷粒学院service-statistics模块
模块介绍
主要实现后台数据统计功能,统计学员的注册数,学员的登陆数,课程播放量,课程数。
库表设计
详细设计
网站统计数据
统计某天的注册人数
接口设计
接受参数:日期
请求类型:POST
请求体:JSON 格式的数据
流程
- 需要调用ucenter模块中的方法查询出注册的人数.
- 先查询表中是否存在与插入日期相同的数据,有则删除。
- 把获取的数据添加到统计表中。
代码
//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集合
流程
- 根据条件查询对应数据
- 封装数据(统计日期和对应数量)
- 创建两个list
- 一个封装日期,一个封装类型对应的数量
- 将封装后的两个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();
}
}