成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

炫酷,SpringBoot+Echarts實現用戶訪問地圖可視化(附源碼)

開發 后端
在常見的電商、新聞、社交網站等,合理運用運營成本才能最大化輸出自己的產品,其中最常見的功能就有針對不同訪問熱度的城市制定不同的運營手段,因此我們掌握用戶城市分布情況至關重要。

SpringBoot+Echarts用戶訪問地圖可視化

意義

  •  在常見的電商、新聞、社交網站等,合理運用運營成本才能最大化輸出自己的產品,其中最常見的功能就有針對不同訪問熱度的城市制定不同的運營手段,因此我們掌握用戶城市分布情況至關重要。
  •  pc端與移動端不同,無法依托手機自帶的gps定位到用戶所在城市,只能通過ip來進行判斷所在地理位置。

根據ip獲取城市的方式

  •  淘寶、新浪等常年提供根據ip獲取城市的接口,但是隔一段時間會出現接口地址更改的情況,也有一定的限流
  •  開源純真ip庫:不斷迭代更新ip庫內容,一般場景下足以使用,自主可控。(下載qqwry.dat庫)

思路

首先需要獲取用戶請求的ip地址,我們對該方法進行簡單封裝: 

  1. public class IPUtil {  
  2.     public static String getIpAddress(HttpServletRequest request) {  
  3.         String ip = request.getHeader("x-forwarded-for");  
  4.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  5.             ip = request.getHeader("Proxy-Client-IP");  
  6.         }  
  7.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  8.             ip = request.getHeader("WL-Proxy-Client-IP");  
  9.         }  
  10.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  11.             ip = request.getHeader("HTTP_CLIENT_IP");  
  12.         }  
  13.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  14.             ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
  15.         }  
  16.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  17.             ip = request.getRemoteAddr();  
  18.         }  
  19.         return ip;  
  20.     }  

封裝純真ip的解析工具,根據ip獲取請求地址所在城市,github有大量實現版本,我們這里不做贅述,具體代碼見文末源碼 

  1. //篇幅較長,截取的主要方法,詳細在源碼地址查看      
  2. public IPZone findIP(final String ip) {  
  3.         final long ipNum = toNumericIP(ip);  
  4.         final QIndex idx = searchIndex(ipNum);  
  5.         if (idx == null) {  
  6.             return new IPZone(ip); 
  7.          }  
  8.         return readIP(ip, idx);  

自定義攔截器,對用戶的登錄請求進行攔截,在此處判斷請求ip所在城市,并進行計數。我們這里只是簡單邏輯的說明,在生產上時應該用redis來存放計數,并且專門提供一個rest接口來推送當前各城市訪問數量情況,再由前端配合,隔一段時間發起一次請求,例如隔一小時請求一次該rest接口,從而進行前端數據的展示。 

  1. /**  
  2.  * 登錄攔截器  
  3.  */  
  4. @Slf4j  
  5. public class MyLoginInterceptor implements HandlerInterceptor {  
  6.     private static final String LOGIN_PATH = "/user/login" 
  7.     private static Map<String, AtomicInteger> visitCount;  
  8.     private static final QQWry qqWry;  
  9.     static {  
  10.         visitCount = new HashMap<>(31);  
  11.         qqWry = new QQWry();  
  12.     } 
  13.     //展示訪問數量不是精確指標,如果要做到完全正確需要使用鎖,防止計數存在并發問題  
  14.     @Override  
  15.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  
  16.         log.info("【MyLoginInterceptor】調用了:{}", request.getRequestURI());  
  17.         if (request.getRequestURI().equals(LOGIN_PATH)) {  
  18.             String ipAddress = IPUtil.getIpAddress(request);  
  19.             String province = qqWry.findIP(ipAddress).getMainInfo();  
  20.             if (visitCount.containsKey(province)) {  
  21.                 visitCount.put(province,new AtomicInteger(visitCount.get(province).incrementAndGet()));  
  22.             } else {  
  23.                 visitCount.put(province,new AtomicInteger());  
  24.             }  
  25.         }  
  26.         return true;  
  27.     }  
  28.     @Override  
  29.     public void postHandle(HttpServletRequest request, HttpServletResponse response,  
  30.                            Object handler, ModelAndView modelAndView) throws Exception {}  
  31.     @Override  
  32.     public void afterCompletion(HttpServletRequest request, HttpServletResponse response,  
  33.                                 Object handler, Exception ex){}  

注冊自定義的攔截器 

  1. @Configuration  
  2. public class WebMvcConfig implements WebMvcConfigurer {  
  3.     @Override  
  4.     public void addInterceptors(InterceptorRegistry registry) {  
  5.         registry.addInterceptor(new MyLoginInterceptor());  
  6.     }  

登錄controller模擬邏輯,注意:如果想看效果圖需要自己寫線程用不同的虛擬ip進行訪問url,從而達到在不同城市訪問接口的效果。 

  1. @RestController("user") 
  2. public class LoginController { 
  3.     @GetMapping("login")  
  4.     public String login() {  
  5.         //登錄邏輯  
  6.         return "success";  
  7.     }  

最終效果

前后端源碼

  1. https://github.com/Motianshi/distribute-tool  

 

責任編輯:龐桂玉 來源: Java知音
相關推薦

2022-09-29 11:16:21

Python數據可視化

2020-03-11 14:39:26

數據可視化地圖可視化地理信息

2022-04-13 09:01:53

Echart5繪制地圖

2018-03-21 12:13:47

工具數據開發

2021-12-30 12:02:52

Python可視化代碼

2013-10-22 10:37:47

谷歌數據可視化

2019-07-26 09:19:32

數據可視化架構

2022-08-17 09:01:16

數據可視化大數據

2014-01-17 10:36:39

2020-03-01 14:01:22

Echarts數據可視化圖表

2022-03-01 10:29:44

Kubernetes容器

2019-05-20 08:20:40

數據集數據可視化數據

2017-10-14 13:54:26

數據可視化數據信息可視化

2017-10-11 18:17:06

大數據數據可視化前后端

2021-04-19 09:00:54

Python批量下載視頻下載器

2010-08-04 10:48:17

路由器

2021-03-17 08:07:56

Python可視化工具

2017-09-05 08:35:09

Python可視化地圖

2017-09-01 19:49:50

Python工具地圖

2021-03-18 08:11:18

PythonDash工具
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品一区二区电影 | 成人黄在线观看 | 亚洲精品一二区 | 亚洲精品视频一区 | 久久午夜精品福利一区二区 | 国产精品精品视频一区二区三区 | 亚洲精品九九 | 日韩欧美字幕 | 91看片官网 | 美女黄视频网站 | av中文字幕在线 | 99re视频在线观看 | 国产精品久久久久久久久久久久 | 九九亚洲| 欧美激情综合五月色丁香小说 | 日韩一区二区在线观看 | 日韩中文不卡 | 国产欧美日韩综合精品一区二区 | 麻豆精品一区二区三区在线观看 | 亚洲精彩免费视频 | 国产欧美在线播放 | 免费在线一区二区三区 | 日韩av免费在线电影 | 国产7777| 国产亚洲成av人片在线观看桃 | 亚洲在线日韩 | 久久久久亚洲 | 国产精品美女www爽爽爽视频 | 在线观看中文字幕 | 91免费视频观看 | 一区二区三区免费 | 精品成人在线观看 | 古典武侠第一页久久777 | 精品国产免费一区二区三区演员表 | av手机免费在线观看 | 成人h免费观看视频 | 久草欧美视频 | 久草在线青青草 | 久久久久久久香蕉 | 在线一区视频 | 人人射人人插 |