博客 城市访问量统计并且通过Echarts+百度地图展示

本篇讲解一下 如何在Vue 中使用 Echarts + 百度地图 统计 博客访问量 并且通过QQWry 解析 ip 地址 利用Echarts 展示出来

效果图如下:

1.纯真Ip地址库 QQWry

这是我在github上找的 java版本的 解析 qqwry的

1.1 maven 引入 qqwry

        ​       com.github.jarod            qqwry-java  0.7.0        

引入后可以看到 该jar 包其实内部已经引入了 qqwry.dat 库了

使用教程:

QQWry qqwry = new QQWry(); // load qqwry.dat from classpath QQWry qqwry = new QQWry(Paths.get("path/to/qqwry.dat")); // load qqwry.dat from java.nio.file.Path​byte[] data = Files.readAllBytes(Paths.get("path/to/qqwry.dat"));QQWry qqwry = new QQWry(data); // create QQWry with provided data​String myIP = "127.0.0.1";IPZone ipzone = qqwry.findIP(myIP);System.out.printf("%s, %s", ipzone.getMainInfo(), ipzone.getSubInfo()); // 江苏省无锡市, 电信

1.2 QQWryUtils

用于提供 一个静态的 QQWry 加载 qqwry.dat ,并且提供根据ip 获取 IpZone

public class QQWryUtils {    private static QQWry qqWry;    static {        try {            qqWry = new QQWry();        } catch (IOException e) {            e.printStackTrace();        }    }    public static void main(String[] args) throws IOException {        QQWry qqWry = new QQWry();        IPZone ipZone = qqWry.findIP("58.214.17.66");        System.out.printf("%s, %s", ipZone.getMainInfo(), ipZone.getSubInfo());    }    public static IPZone getIpZoneByIp(String ip) {        return qqWry.findIP(ip);    }}

2.提供拦截器解析Ip并放入队列

给SpringMVC 提供一个拦截器,在拦截器中 用于获取当前的请求ip 并且通过 QQWryUtils 解析该ip ,封装成IpAccessInfo 对象 存入 linkedBlockingQueue 队列中去,这里只是简单处理下

@Slf4jpublic class AccessRecordInterceptor extends HandlerInterceptorAdapter {    /**     * 目前是 解析 ip 并且生成 IpAccessInfo 放入 linkedBlockingQueue 队列中去     *     * @param request     * @param response     * @param handler     * @return     * @throws Exception     */    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        String ip = IpUtil.getIpAddress(request);        log.info("【请求者 ip : {} 】", ip);        IPZone ipZone = QQWryUtils.getIpZoneByIp(ip);        log.info("【解析到 城市: {}】", ipZone.getMainInfo());        IpAccessInfo ipAccessInfo = new IpAccessInfo();        ipAccessInfo.setCity(ipZone.getMainInfo());        ipAccessInfo.setIp(ip);        ipAccessInfo.setOperators(ipZone.getSubInfo());        try {            IpQueue.linkedBlockingQueue.add(ipAccessInfo);        } catch (IllegalStateException e) {            log.warn("队列已满 ");        }        return true;    }}

IpAccessInfo 我这里入库ip 信息

@Data@Entity@EntityListeners(AuditingEntityListener.class)public class IpAccessInfo {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    private String ip;    private String city;    /**     * 运营商     */    private String operators;}

3.提供线程消费队列,并且根据城市记录访问量

这里提供 线程消费 队列 并且使用redis的自增 记录每个城市的访问量,并且使用SpringBoot的 CommandLineRunner 接口,在项目启动的时候 加载初始数据

/** * @author johnny * @create 2020-08-15 下午1:56 **/@Component@Order(value = 1)@Slf4jpublic class IpQueue implements CommandLineRunner {    public static final LinkedBlockingQueue linkedBlockingQueue = new LinkedBlockingQueue(10000);    @Autowired    private ThreadPoolTaskExecutor threadPoolTaskExecutor;    @Autowired    private IpAccessInfoRepository ipAccessInfoRepository;    @Autowired    private IpAccessCountRepository ipAccessCountRepository;    @Autowired    private StringRedisTemplate redisTemplate;    @Override    public void run(String... args) throws Exception {        ipAccessCountRepository.findAll().forEach(ipAccessCount -> {            if (!redisTemplate.hasKey(ipAccessCount.getCity())) {                redisTemplate.opsForValue().set(ipAccessCount.getCity(), String.valueOf(ipAccessCount.getCount()));            } else {                log.info("【存在: {} 】", ipAccessCount.getCity());            }        });        log.info("【服务启动  --------------  监听 队列 IpQueue 】");        IpAccessThread ipAccessThread = new IpAccessThread(linkedBlockingQueue, ipAccessInfoRepository, redisTemplate);        threadPoolTaskExecutor.submit(ipAccessThread);    }    static class IpAccessThread implements Runnable {        private LinkedBlockingQueue linkedBlockingQueue;        private IpAccessInfoRepository ipAccessInfoRepository;        private RedisTemplate redisTemplate;        public IpAccessThread(LinkedBlockingQueue linkedBlockingQueue, IpAccessInfoRepository ipAccessInfoRepository, RedisTemplate redisTemplate) {            this.linkedBlockingQueue = linkedBlockingQueue;            this.ipAccessInfoRepository = ipAccessInfoRepository;            this.redisTemplate = redisTemplate;        }        @Override        public void run() {            while (true) {                try {                    System.out.println("开始获取 : ");                    IpAccessInfo accessInfo = linkedBlockingQueue.take();                    System.out.println("监听到 : " + accessInfo);                    //江苏省无锡市                    if (accessInfo.getCity().contains("省") && accessInfo.getCity().contains("市")) {                        String city = accessInfo.getCity();                        city = city.substring(city.indexOf("省") + 1, city.indexOf("市"));                        if (redisTemplate.hasKey(city)) {                            redisTemplate.opsForValue().increment(city);                        }                    } else {                        log.error("【异常 地理位置 {} 】", accessInfo.getCity());                    }                    ipAccessInfoRepository.save(accessInfo);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }    }}

4. Echarts + 百度地图

由于本博客前端是用Vue 编写的,所以下面的引入就是在Vue下引入的方式

4.1 在public/index.html中添加以下代码

ak密钥: 就是百度地图AK密钥,需要自己去百度地图申请,或者网上找可用的ak

53oVIOgmSIejwV7EfphPgTynOZbIiVYu 网上找的可用的密钥

4.2 在vue.config.js中添加配置

主要是 externals 部分

  configureWebpack: {    // provide the app's title in webpack's name field, so that    // it can be accessed in index.html to inject the correct title.    name: name,    resolve: {      alias: {        '@': resolve('src')      }    },    externals: {        'BMap': 'BMap',        'BMap_Symbol_SHAPE_POINT':'BMap_Symbol_SHAPE_POINT'    }  },

4.3 最后在vue main.js 文件中引入

import BMap from 'BMap require('echarts/extension/bmap/bmap')

4.4 编写展示Echarts+百度地图的组件

可以参考echarts 网站https://echarts.apache.org/zh/index.html

需要注意 我这里是从后台拿的数据 ,是通过上面拦截器解析ip 后 记录每个城市对应的访问量存入 redis中的。

注意如果需要扩展其他城市,可以找到城市的经纬度,然后扩展 geoCoordMap 就行了。。

总结

本篇主要记录一下 关于如何统计网站访问量,并且利用Echarts + 百度地图 友好的展示出来

1.提供拦截器 拦截Ip 请求,获取到 对应的 城市 我这里使用 纯真qqwry,网上也有其他方法。。

2.解析后 可以根据 key = 城市 存入redis中,利用redis 的 自增操作来 统计城市的 访问量,或者也可以通过Map 等去统计,然后刷入到存储中 。。 方式很多

3.利用echarts+百度地图案例,暂时统计的数据,可以参考echarts官网

欢迎访问 我的博客网站 https://www.askajohnny.com

fastreport picture 放入data展示_博客 城市访问量统计并且通过Echarts展示相关推荐

  1. 地图统计_博客 城市访问量统计并且通过Echarts+百度地图展示

    本篇讲解一下 如何在Vue 中使用 Echarts + 百度地图 统计 博客访问量 并且通过QQWry 解析 ip 地址 利用Echarts 展示出来 效果图如下: 1.纯真Ip地址库 QQWry 这 ...

  2. hexo博客添加访问量统计

    1.配置是否开启不蒜子访问量统计功能 在themes/yilia/_config.yml添加属性 # 是否开启访问量统计功能(不蒜子) busuanzi:enable: true 2.引入不蒜子并添加 ...

  3. 个人主页博客网页设计制作HTML5+CSS大作业——个人相册展示留言博客模板(6页) 简单个人网页制作

    HTML5+CSS大作业--个人相册展示留言博客模板(6页) 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. 茶叶. 家居. 酒店. 舞蹈. 动漫. 明星. 服 ...

  4. 第二节认识计算机教案,第二章 第二节 局域网的构建 教学设计_博客

    <第二章 第二节 局域网的构建 教学设计_博客>由会员分享,可在线阅读,更多相关<第二章 第二节 局域网的构建 教学设计_博客(3页珍藏版)>请在装配图网上搜索. 1.第二章 ...

  5. wpsppt页面卷曲在哪里_2013版ppt怎么制作页面卷曲动画效果_博客

    2013 版 ppt 怎么制作页面卷曲动画效果 _ 博客 2013 版 ppt 怎么制作页面卷曲动画效果 在制作幻灯片的时候会用到不少切换动画效果, 但是怎么才能实现 ? 对于不常用 ppt 的朋友或 ...

  6. 大牛_博客Java方面链接总结

    大牛_博客Java方面链接总结找找差距 源码分析 The IoC container – Spring                     http://thinkinginjavablog.si ...

  7. 帝国cms linux伪静态规则,置帝国cms如何设置tag标签伪静态化 linux伪静态设置方法_博客...

    <置帝国cms如何设置tag标签伪静态化 linux伪静态设置方法_博客>由会员分享,可在线阅读,更多相关<置帝国cms如何设置tag标签伪静态化 linux伪静态设置方法_博客(6 ...

  8. HTML5+CSS大作业——个人相册展示留言博客模板(6页)

    HTML5+CSS大作业--个人相册展示留言博客模板(6页) 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. 茶叶. 家居. 酒店. 舞蹈. 动漫. 明星. 服 ...

  9. HTML5期末大作业:个人网站设计——自适应个人相册展示留言博客模板(6页) HTML+CSS+JavaScript...

    常见网页设计作业题材有 ​​个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. 茶叶. 家居. 酒店. 舞蹈. 动漫. 明星. 服装. 体育. 化妆品. 物流. 环保. 书籍. 婚纱. 军 ...

  10. 听我说说我的博客: 月访问量过万的个人IT博客的技术史

    过去曾经写过一系列的文章,试图去鼓励更多的人去写文章.从毕业前的<成为笔杆子>.<[写作驱动学习 ](https://www.phodal.com/blog/write-driven ...

最新文章

  1. HTML实现折现图完整源码及效果图
  2. 重做日志文件(redo log file)和归档日志文件(archive log file)
  3. Best Cow Line
  4. java的时间变化_通过java记录数据持续变化时间代码解析
  5. NFS运维二班--梁瑞
  6. 苹果网页归档转html,常用JS转换HTML转义符
  7. c语言用递归方法实现冒泡排序,C语言 冒泡排序 递归法
  8. 基于参考点的非支配遗传算法-NSGA-III(一)
  9. 怎么往JFrame中添加图片
  10. shell 截取某个字符串之后的内容
  11. 动态启用和禁用mainfest中组件
  12. 键盘按钮KeyCode使用案例
  13. 用I2C级联扩展器做一个时钟盒子
  14. 金蝶K3 BOM独立控制跳层开关开发
  15. 计算机组成与结构习题答案,计算机组成与结构习题及答案
  16. 数据机房特殊规范标签生成及打印方案分享
  17. 宠物商店信息管理系统
  18. A Game of Thrones(82)
  19. NB6612电机驱动与C8T6连接配置双电机
  20. 2021NCTF-RE

热门文章

  1. 当安防撞上AI风潮 会迸出怎样火花?
  2. Window下本地redis的安装、配置以及java版试用
  3. 生活在REPL中(续):在REPL中动态加载依赖的库
  4. Spring和ThreadLocal
  5. Jboss 安装配置
  6. Oracle 11g for Linux安装前准备工作
  7. ArcEngine 相关-转载
  8. 新东方总裁俞敏洪在北京大学2008年开学典礼上的发言
  9. 6.关于 MySQL
  10. 18. CSS 内边距