在最近写统计后台的时候,接口传过来包含主渠道,子渠道,平台的json,获取并解析

1.解析json获得主渠道子渠道

传过来的值是类似t=wg_1

int j = t.indexOf("_");

String channel= t.substring(0, j);

Integer subChannel= Integer.valueOf(t.substring(j + 1));

2.从http的请求中获取访问的来源

这里pr是访问来源,如果接口中没有传输访问来源的话就从http请求中解析

获取请求头部的"user-agent"并将其转化为小写,如果其中存在"micromessenger"就是从微信访问,存在"qq"就是从qq访问

Integer source;if (pr==null){

String ua= request.getHeader("user-agent").toLowerCase();if (ua.contains("micromessenger")) {

source= 1;

}else if (ua.contains("qq")) {

source= 2;

}else{

source= 3;

}

}else{

source=pr;

}

3.将每一条访问数据都存储数据库后,每小时统计一次,通过前端的查询反馈数据库的数据并计算

前端的界面如下:

业务逻辑层代码如下:

public voidgetStatistics(LocalDate localDate,Integer hour, Integer platform) {

ZonedDateTime starTime=DateUtil.getStartDayTime(localDate,hour);

ZonedDateTime endTime=DateUtil.getEndDayTime(localDate,hour);

List list =channelStatisticsRecordDAO.findAllByCreateTimeBetweenAndPlatform(starTime,endTime, platform);

Map> map1 =list.stream().collect(Collectors.groupingBy(ChannelStatisticsRecord::groupChannel));for (Map.Entry>entry1 : map1.entrySet()) {

ChannelStatistics channelStatistics= newChannelStatistics();

String[] ch= entry1.getKey().split("_");

String channel= ch[0];

Integer subChannel= Integer.valueOf(ch[1]);

channelStatistics.setChannel(channel);

channelStatistics.setSubChannel(subChannel);

channelStatistics.setPlatform(platform);

channelStatistics.setDate(localDate);

channelStatistics.setHour(hour);

Integer qqNum= 0;

Integer wxNum= 0;

Integer wapNum= 0;for(ChannelStatisticsRecord channelStatisticsRecord : entry1.getValue()) {if (channelStatisticsRecord.getSource() == 1) {

wxNum++;

}else if (channelStatisticsRecord.getSource() == 2) {

qqNum++;

}else{

wapNum++;

}

}

channelStatistics.setQqNum(qqNum);

channelStatistics.setWxNum(wxNum);

channelStatistics.setWapNum(wapNum);

channnelStatisticsDAO.save(channelStatistics);

}

}

在这过程中遇到几个问题:

(1)首先是如何按小时统计:

解决办法:写了一个TaskStics的统计类

@Componentpublic classTaskStics {

@AutowiredprivateChannelStatisticsRecordService channelStatisticsRecordService;/*** 每小时零一分*/@Scheduled(cron= "0 1 * * * ?")public voidgetStatistics() {

channelStatisticsRecordService.getStatistics(LocalDate.now(),DateUtil.getHour(),1);

channelStatisticsRecordService.getStatistics(LocalDate.now(),DateUtil.getHour(),2);

channelStatisticsRecordService.getStatistics(LocalDate.now(),DateUtil.getHour(),3);

}

在每个小时零一分的时候调用统计的方法并将当前的日期和当前的小时还有平台参数传过去

(2)其次是传了当前的日期和小时过去了,但是数据库中记录表里是createTime,也就是是年月日时分秒的格式,怎么获取在上一个小时中的所有记录

解决方法:在DateUtil里面增加几个方法

public staticZonedDateTime getStartDayTime(LocalDate localDate,Integer hour){return localDate.atTime(hour,0,0).atZone(ZoneId.systemDefault());

}public staticInteger getHour() {

String str= LocalDateTime.now().minusDays(1).minusHours(1).format(DateTimeFormatter.ofPattern("HH"));returnInteger.valueOf(str);

}public staticZonedDateTime getEndDayTime(LocalDate localDate,Integer hour){return localDate.atTime(hour,59,59).atZone(ZoneId.systemDefault());

}

第一个方法是通过日期和小时数得到该时间的起始,如传进来2018-10-08和12,那么通过这个方法得到的是2018-10-08 12:00:00

同理第三个方法得到的是该时间的结束值2018-10-08 12:59:59

第二个方法是获取前一个小时,如现在是12点则得到11点,因为统计的是前一个小时的数据

(3)解决上面两个问题后通过传入的时间和平台已经可以得到一个list,那么怎么把这个list根据主渠道,子渠道,访问来源去多级分组

解决办法:想了很多办法也在网上查阅了很多,觉得都很麻烦,后来尝试了自定义一个分组的方法,方便了许多

Map> map1 = list.stream().collect(Collectors.groupingBy(ChannelStatisticsRecord::groupChannel));

groupChannel是自己自定义在实体类中的一个方法,将主渠道和子渠道拼合起来

publicString groupChannel() {return getChannel() + "_" +getSubChannel();

}

看了项目中别人写的代码后发现还有一种方法

Map> collect =list.stream()

.collect(Collectors.groupingBy(instance-> instance.getChannel()+"_"+instance.getSubChannel()+"_"+instance.getSource()+"_"+(instance.getTime().getHours())));

ua解析接口_截取字符串+ua解析访问来源+stream多级分组相关推荐

  1. java截取split_Java使用split截取字符串过程解析

    这篇文章主要介绍了Java使用split截取字符串过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 作用背景:一串字符串中的信息有些是有用的有 ...

  2. 搭建一个解析接口教程(自己的解析接口,可自定义广告)

    搭建一个解析接口(自己的解析接口,可自定义广告) 演示网站:https://vip.yftx2020.top 一.下载解析源码 解析源码下载 提取码:3tkq 二.修改user.php文件(压缩包里有 ...

  3. cname解析教程_域名cname怎么解析 域名cname解析设置方法

    所谓的域名CNAME解析就是别名解析意思.基本上设置CNAME解析的话都是搞搞网站的朋友,很多人没有花钱买空间,用了一些免费的空间,然后自己搭建网站,当然最后就是需要CNAME解析域名咯,不然你的网站 ...

  4. bilibili解析接口_仿最新BiliBili客户端(已开源)

    前言 该项目仿照B站的Android客户端进行开发,初衷是想学习流行的Android技术,但是没有数据资源.因为喜欢逛B站,而且B站的Android客户端又是Google推荐的MD设计规范,于是花了些 ...

  5. php在html中无法解析json数据,json字符串无法解析的问题

    就是我做了一个PHP接口,返回的数据是json格式(数据格式没问题,且编码是utf8格式):但调用时无法解析这个json格式的数据,但我把返回的数据复制成字符串,就可以解析了.找了半天,发现在输出的源 ...

  6. cname 别名记录 解析过程_西部数码操作解析:如何为服务器创建别名地址

    版权归西部数码所有,原文链接:https://www.west.cn/faq/list.asp?unid=2394 服务器使用过程中不断创建增加站点,这些都需要域名指向到服务器ip地址,才能实现网站访 ...

  7. 字符串不替代_使用第三方库demjson解析不规范的json字符串

    Json在编程中是一种轻量级的文件格式,在本地开发或者web开发中使用较多.JSON(JavaScript Object Notation,JavaScript对象表示法,读作/ˈdʒeɪsən/)是 ...

  8. 淘口令解析api接口_淘口令解析API免费接口,淘口令解析API连接器接口付费定制-进制数据...

    淘口令解析 接口地址:http://route.showapi.com/1713-1 (注意:接口支持https,更安全,但稍慢一些,你懂的.请根据自己的情况进行选择.) 支持格式:json 请求方法 ...

  9. php解析乱码字符串,PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]

    在PHP中,使substr函数截取字符串末位会出现乱码,因为中文UTF-8编码,每个汉字占3字节,而GB2312占2字节,英文占1字节,截取位不准确,造成断开的字符会把其后的..拉过来一起做一个字,所 ...

  10. 00截断上传绕过_【文件上传与解析】文件上传与解析漏洞总结v1.0

    点击上方"公众号" 可以订阅哦! Hello,各位小伙伴晚上好~ 这里是依旧勤劳写公众号的小编~ 今天本公众号将推出一个新的模块,那就是漏洞知识点总结模块!!!(此处应有掌声~) ...

最新文章

  1. luogu P1345 [USACO5.4]奶牛的电信Telecowmunication(建图技巧 - “割点”模板 、最小割)
  2. isnull的使用方法
  3. libevent 获取多线程结构体变量加锁方法
  4. 网络推广外包浅析提升移动端网站建设效率有哪些网络推广外包技巧
  5. 【Xamarin开发 Android 系列 4】 Android 基础知识
  6. PHP多选题怎么弄,php多选题评分算法求指导解决方法
  7. 一致性哈希算法的基本原理
  8. MSU发布2018年视频压缩评比报告
  9. PHP多种序列化/反序列化的方法 (转载)
  10. 在运行时更新代码(已Spring解密)
  11. 阿里云李刚:下一代低延时的直播CDN
  12. [深度学习-TF2实践]应用Tensorflow2.x训练ResNet,SeNet和Inception模型在cifar10,测试集上准确率88.6%
  13. 2021高通AI应用创新大赛-创新赛道-垃圾分类识别 第二次讨论会
  14. API经济正在牵制技术的改革
  15. redis整理の配置
  16. 区块链 性能压力测试工具Caliper
  17. Python的逻辑操作
  18. maven pom.lastupdated
  19. 英语NLP词汇类别列表
  20. rancher运行pvc程序报错解决方法

热门文章

  1. 牛客NOIP提高组(三)题解
  2. JFinal Template Engine 使用
  3. 30个免费网页设计模板
  4. 15-07-22 数据库--存储过程、触发器
  5. Win7(64Bit) 安装 PL/SQL Developer图解
  6. autotools 学习
  7. GARFIELD@02-21-2005
  8. maven环境、本地仓储配置(下载安装)
  9. Codeforces Round 253 (Div. 2)
  10. Java基础知识汇总(持续更新)