【实时数仓】省份交易额统计接口、新老访客对比接口、访客分时统计接口

news2025/1/13 9:59:10

文章目录

  • 一 省份交易额统计接口
    • 1 Sugar配置
      • (1)图表配置
      • (2)接口地址
      • (3)数据格式
      • (4)执行SQL
    • 2 数据接口实现
      • (1)创建地区交易额统计实体类ProvinceStats
      • (2)Mapper层:创建ProvinceStatsMapper接口
      • (3)Service层:创建ProvinceStatsService接口
      • (4)Service层:创建ProvinceStatsServiceImpl实现类
      • (5)Controller层:在SugarController中增加方法
      • (6)测试
  • 二 新老访客对比接口
    • 1 Sugar配置
      • (1)图表配置
      • (2)接口地址
      • (3)数据格式
      • (4)执行SQL
    • 2 数据接口实现
      • (1)创建访问流量统计实体类VisitorStats
      • (2)Mapper层:创建VisitorStatsMapper
      • (3)Service层:创建VisitorStatsService接口
      • (4)Service层:创建VisitorStatsServiceImpl实现类
      • (5)Controller层:在SugarController中增加方法
      • (6)测试
  • 三 访客分时统计接口
    • 1 Sugar配置
      • (1)图表配置
      • (2)接口地址
      • (3)数据格式
      • (4)执行SQL
    • 2 数据接口实现
      • (1)Mapper
      • (2)Service
      • (3)ServiceIml
      • (4)Controller
      • (5)测试

一 省份交易额统计接口

1 Sugar配置

(1)图表配置

在这里插入图片描述

(2)接口地址

https://m23o108551.zicp.fun/api/sugar/province?date=20221215

(3)数据格式

{
  "status": 0,
  "data": {
    "mapData": [
      {
        "name": "北京",
        "value": 9350,
      },
      {
        "name": "天津",
        "value": 9317,
      }
    ],
    "valueName": "交易额",
  }
}

(4)执行SQL

province_stats_2022表结构:
在这里插入图片描述

select province_id,province_name,sum(order_amount) order_amount from province_stats_2022 where toYYYYMMDD(stt)=20221215 group by province_id,province_name;

2 数据接口实现

(1)创建地区交易额统计实体类ProvinceStats

package com.hzy.gmall.publisher.beans;
/**
 * Desc: 地区交易额统计实体类
 */
@AllArgsConstructor
@Data
@NoArgsConstructor
public class ProvinceStats {
    private String stt;
    private String edt;
    private String province_id;
    private String province_name;
    private BigDecimal order_amount;
    private String ts;
}

(2)Mapper层:创建ProvinceStatsMapper接口

package com.hzy.gmall.publisher.mapper;
/**
 * 地区统计Mapper
 */
public interface ProvinceStatsMapper {
    @Select("select province_id,province_name,sum(order_amount) order_amount " +
            "from province_stats_2022 " +
            "where toYYYYMMDD(stt)=#{date} " +
            "group by province_id,province_name;")
    List<ProvinceStatsMapper> selectProvinceStats(Integer date);
}

(3)Service层:创建ProvinceStatsService接口

package com.hzy.gmall.publisher.service;
/**
 *地区统计service接口
 */
public interface ProvinceStatsService {
    List<ProvinceStats> getProvinceStats(Integer date);
}

(4)Service层:创建ProvinceStatsServiceImpl实现类

package com.hzy.gmall.publisher.service.impl;
/**
 * 地区统计service实现类
 */
@Service
public class ProvinceStatsServiceImpl implements ProvinceStatsService {

    @Autowired
    private ProvinceStatsMapper provinceStatsMapper;
    @Override
    public List<ProvinceStats> getProvinceStats(Integer date) {
        return provinceStatsMapper.selectProvinceStats(date);
    }
}

(5)Controller层:在SugarController中增加方法

@Autowired
private ProvinceStatsService provinceStatsService;

@RequestMapping("/province")
public String getProvinnceStats(@RequestParam(value = "date",defaultValue = "0") Integer date){
    if (date == 0) {
        date = now();
    }

    List<ProvinceStats> provinceStatsList = provinceStatsService.getProvinceStats(date);

    StringBuilder jsonBuilder = new StringBuilder("{\"status\": 0,\"data\": {\"mapData\": [");

    for (int i = 0; i < provinceStatsList.size(); i++) {
        ProvinceStats provinceStats = provinceStatsList.get(i);
        jsonBuilder.append("{\"name\": \""+provinceStats.getProvince_name()+"\",\"value\": "+provinceStats.getOrder_amount()+"}");

        if (i < provinceStatsList.size() - 1 ){
            jsonBuilder.append(",");
        }
    }

    jsonBuilder.append("],\"valueName\": \"交易额\"}}");

    return jsonBuilder.toString();
}

(6)测试

$API_HOST/api/sugar/province?date=20221215

在这里插入图片描述
在这里插入图片描述

二 新老访客对比接口

1 Sugar配置

(1)图表配置

在这里插入图片描述
在这里插入图片描述

(2)接口地址

https://m23o108551.zicp.fun/api/sugar/visitor?date=20221213

(3)数据格式

{
  "status": 0,
  "data": {
    "columns": [
      {
        "name": "类别",
        "id": "type"
      },
      {
        "name": "新用户",
        "id": "new"
      },
      {
        "name": "老用户",
        "id": "old"
      }
    ],
    "rows": [
      {
        "type": "用户数(人)",
        "new": 200,
        "old": 500
      },
      {
        "type": "总访问页面(次)",
        "new": 200,
        "old": 500
      },
      {
        "type": "跳出率(%)",
        "new": 200,
        "old": 500
      },
      {
        "type": "平均在线时长(秒)",
        "new": 200,
        "old": 500
      },
      {
        "type": "平均访问页面数(次)",
        "new": 200,
        "old": 500
      }
    ]
  }
}

(4)执行SQL

visitor_stats_2022表结构:

在这里插入图片描述

select is_new,sum(uv_ct) uv_ct,sum(pv_ct) pv_ct,sum(sv_ct) sv_ct,sum(uj_ct) uj_ct,sum(dur_sum) dur_sum from visitor_stats_2022 where toYYYYMMDD(stt)=20221213 group by is_new;

2 数据接口实现

(1)创建访问流量统计实体类VisitorStats

package com.hzy.gmall.publisher.beans;
/**
 * Desc: 访客流量统计实体类
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class VisitorStats {

    private String stt;
    private String edt;
    private String vc;
    private String ch;
    private String ar;
    private String is_new;
    private Long uv_ct = 0L;
    private Long pv_ct = 0L;
    private Long sv_ct = 0L;
    private Long uj_ct = 0L;
    private Long dur_sum = 0L;
    private Long new_uv = 0L;
    private Long ts;
    private int hr;

    //计算跳出率  = 跳出次数*100/访问次数
    public BigDecimal getUjRate() {
        if (sv_ct != 0L) {
            return BigDecimal.valueOf(uj_ct)
                    .multiply(BigDecimal.valueOf(100))
                    .divide(BigDecimal.valueOf(sv_ct), 2, RoundingMode.HALF_UP);
        } else {
            return BigDecimal.ZERO;
        }
    }

    //计算每次访问停留时间(秒)  = 当日总停留时间(毫秒)/当日访问次数/1000
    public BigDecimal getDurPerSv() {
        if (sv_ct != 0L) {
            return BigDecimal.valueOf(dur_sum)
                    .divide(BigDecimal.valueOf(sv_ct), 0, RoundingMode.HALF_UP)
                    .divide(BigDecimal.valueOf(1000), 1, RoundingMode.HALF_UP);
        } else {
            return BigDecimal.ZERO;
        }
    }

    //计算每次访问停留页面数 = 当日总访问页面数/当日访问次数
    public BigDecimal getPvPerSv() {
        if (sv_ct != 0L) {
            return BigDecimal.valueOf(pv_ct)
                    .divide(BigDecimal.valueOf(sv_ct), 2, RoundingMode.HALF_UP);
        } else {
            return BigDecimal.ZERO;
        }
    }
}

(2)Mapper层:创建VisitorStatsMapper

package com.hzy.gmall.publisher.mapper;

public interface VisitorStatsMapper {
    @Select("select is_new,sum(uv_ct) uv_ct,sum(pv_ct) pv_ct,sum(sv_ct) sv_ct," +
            "sum(uj_ct) uj_ct,sum(dur_sum) dur_sum " +
            "from visitor_stats_2022 " +
            "where toYYYYMMDD(stt)=#{date} " +
            "group by is_new")
    List<VisitorStats> selectVisitorStats(Integer date);
}

(3)Service层:创建VisitorStatsService接口

package com.hzy.gmall.publisher.service;

public interface VisitorStatsService {
    List<VisitorStats> getVisitorStats(Integer date);
}

(4)Service层:创建VisitorStatsServiceImpl实现类

package com.hzy.gmall.publisher.service.impl;

@Service
public class VisitorStatsServiceImpl implements VisitorStatsService {
    @Autowired
    private VisitorStatsMapper visitorStatsMapper;
    @Override
    public List<VisitorStats> getVisitorStats(Integer date) {
        return visitorStatsMapper.selectVisitorStats(date);
    }
}

(5)Controller层:在SugarController中增加方法

@Autowired
private VisitorStatsService visitorStatsService;

@RequestMapping("visitor")
public String getVisitorStats(@RequestParam(value = "date",defaultValue = "0") Integer date){
    if (date == 0){
        date = now();
    }
    List<VisitorStats> visitorStatsList = visitorStatsService.getVisitorStats(date);
    VisitorStats newVisitorStats = new VisitorStats();
    VisitorStats oldVisitorStats = new VisitorStats();
    for (VisitorStats visitorStats : visitorStatsList) {
        if ("1".equals(visitorStats.getIs_new())){
            // 新访客
            newVisitorStats = visitorStats;
        }else{
            // 老访客
            oldVisitorStats = visitorStats;
        }
    }
    String json = "{\"status\": 0,\"data\": {\"columns\": [" +
            "      {\"name\": \"类别\",\"id\": \"type\"}," +
            "      {\"name\": \"新用户\",\"id\": \"new\"}," +
            "      {\"name\": \"老用户\",\"id\": \"old\"}],\"rows\": [" +
            "      {\"type\": \"用户数(人)\",\"new\": "+newVisitorStats.getUv_ct()+",\"old\": "+oldVisitorStats.getUv_ct()+"}," +
            "      {\"type\": \"总访问页面(次)\",\"new\": "+newVisitorStats.getPv_ct()+",\"old\": "+oldVisitorStats.getPv_ct()+"}," +
            "      {\"type\": \"跳出率(%)\",\"new\": "+newVisitorStats.getUjRate()+",\"old\": "+oldVisitorStats.getUjRate()+"}," +
            "      {\"type\": \"平均在线时长(秒)\",\"new\": "+newVisitorStats.getDurPerSv()+",\"old\": "+oldVisitorStats.getDurPerSv()+"}," +
            "      {\"type\": \"平均访问页面数(次)\",\"new\": "+newVisitorStats.getPvPerSv()+",\"old\": "+oldVisitorStats.getPvPerSv()+"}]}}";
    return json;
}

(6)测试

https://m23o108551.zicp.fun/api/sugar/visitor?date=20221213

在这里插入图片描述

三 访客分时统计接口

统计指标:uv,pv,新访客uv

1 Sugar配置

(1)图表配置

在这里插入图片描述

(2)接口地址

https://m23o108551.zicp.fun/api/sugar/hr?date=20221213

(3)数据格式

{
  "status": 0,
  "data": {
    "categories": [
      "00",
      "01",
      "02",
      "...",
      "23"
    ],
    "series": [
      {
        "name": "UV",
        "data": [
          4919,
          2252,
          ...,
          2537
        ]
      },
      {
        "name": "PV",
        "data": [
          7979,
          10500,
          ...,
          8428
        ]
      },
      {
        "name": "NewUV",
        "data": [
          11291,
          20146,
          ...,
          6257
        ]
      }
    ]
  }
}

(4)执行SQL

select toHour(stt) hr,sum(uv_ct) uv_ct,sum(pv_ct) pv_ct,sum(if(is_new='1',visitor_stats_2022.uv_ct,0)) new_uv from visitor_stats_2022 where toYYYYMMDD(stt)=20221213 group by hr;

2 数据接口实现

(1)Mapper

@Select("select toHour(stt) hr,sum(uv_ct) uv_ct,sum(pv_ct) pv_ct," +
        "sum(if(is_new='1',visitor_stats_2022.uv_ct,0)) new_uv " +
        "from visitor_stats_2022 " +
        "where toYYYYMMDD(stt)=#{date} " +
        "group by hr;")
List<VisitorStats> selectVisitorStatsByHr(Integer date);

(2)Service

List<VisitorStats> getVisitorStatsByHr(Integer date);

(3)ServiceIml

@Override
public List<VisitorStats> getVisitorStatsByHr(Integer date) {
    return visitorStatsMapper.selectVisitorStatsByHr();
}

(4)Controller

@RequestMapping("hr")
public String getVisitorStatsByHr(@RequestParam(value = "date",defaultValue = "0") Integer date){
    if (date == 0){
        date = now();
    }
    // 从service中获取分时访问情况
    List<VisitorStats> visitorStatsList = visitorStatsService.getVisitorStatsByHr(date);
    // 定义数组,存放24小时的分时统计情况
    VisitorStats[] visitorStatsArr = new VisitorStats[24];
    // 从集合中获取结果,赋值给数组中相对应的小时
    for (VisitorStats visitorStats : visitorStatsList) {
        visitorStatsArr[visitorStats.getHr()] = visitorStats;
    }

    // 用于存放24小时的集合
    List hrList = new ArrayList();
    // 用于存放每个小时uv情况的集合
    List uvList = new ArrayList();
    // 用于存放每个小时pv情况的集合
    List pvList = new ArrayList();
    // 用于存放新访客每个小时uv情况的集合
    List newUvList = new ArrayList();

    // 从数组中获取一天24小时的数据
    for (int hr = 0; hr < visitorStatsArr.length; hr++) {
        VisitorStats visitorStats = visitorStatsArr[hr];
        if (visitorStats != null){
            uvList.add(visitorStats.getUv_ct());
            pvList.add(visitorStats.getPv_ct());
            newUvList.add(visitorStats.getNew_uv());
        }else{
            uvList.add(0L);
            pvList.add(0L);
            newUvList.add(0L);
        }
        hrList.add(String.format("%02d",hr));
    }

    String json = "{\"status\": 0,\"data\": {\"categories\": " +
            "[\""+ StringUtils.join(hrList,"\",\"")+"\"]," +
            "\"series\": [" +
            "{\"name\": \"UV\",\"data\":["+StringUtils.join(uvList,",")+"]}," +
            "{\"name\": \"PV\",\"data\":["+StringUtils.join(pvList,",")+"]}," +
            "{\"name\": \"NewUV\",\"data\":["+StringUtils.join(newUvList,",")+"]" +
            "}]}}";

    return json;
}

(5)测试

$API_HOST/api/sugar/hr?date=20221213

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/124953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kafka基础_2

Kafka系列 注&#xff1a;大家觉得博客好的话&#xff0c;别忘了点赞收藏呀&#xff0c;本人每周都会更新关于人工智能和大数据相关的内容&#xff0c;内容多为原创&#xff0c;Python Java Scala SQL 代码&#xff0c;CV NLP 推荐系统等&#xff0c;Spark Flink Kafka Hbase …

18-RocketMQ源码解读

NameServer启动 1、功能回顾 NameServer的核心作用 一是维护Broker的服务地址并进行及时的更新。 二是给Producer和Consumer提供服务获取Broker列表。 2、启动流程-源码重点 整个NameServer的核心就是一个NamesrvController对象。这个controller对象就跟java Web开发中的Contr…

3D可视化大屏是如何实现的?

3D可视化是指拥有3D效果的数据可视化&#xff0c;对于所要展示的数据可视化内容还原出真实场景&#xff0c;并实时接入数据&#xff0c;在面对复杂操作时灵活应对&#xff0c;使得整个场景在大屏上的展示更具立体、更具科技感、更具易用性。 物联网时代&#xff0c;可视化大屏的…

【发表案例】传感器网络及电路类,仅1个月26天录用

【期刊简介】IF&#xff1a;1.0-2.0&#xff0c;JCR4区&#xff0c;中科院4区 【检索情况】SCI 在检&#xff0c;正刊 【征稿领域】自主传感器网络的高级接口电路及其应用 【参考周期】2个月左右录用 【截稿日期】2023.1.31 重要时间节点&#xff1a;仅1个月26天录用 2022/12…

神经网络中常用的权重初始化方法及为何不能全初始化为0

1.权重初始化的重要性 神经网络的训练过程中的参数学习时基于梯度下降算法进行优化的。梯度下降法需要在开始训练时给每个参数赋予一个初始值。这个初始值的选取十分重要。在神经网络的训练中如果将权重全部初始化为0&#xff0c;则第一遍前向传播过程中&#xff0c;所有隐藏层…

深度学习笔记:感知机

感知机&#xff08;perceptron&#xff09;为神经网络的起源算法。感知机接受多个输入信号&#xff0c;输出一个信号。感知机信号只有0和1。 在上图的感知机中&#xff0c;x1和x2两个输入信号会分别乘以其对应权重(weight) w1和w2&#xff0c;传入神经元。神经元计算传来信号综…

Disentangled Face Attribute Editing via Instance-Aware Latent Space Search翻译

论文地址 代码地址 摘要 最近的研究表明&#xff0c;生成对抗网络&#xff08;GAN&#xff09;的潜空间中存在一组丰富的语义方向&#xff0c;这使得各种面部属性编辑应用成为可能。然而&#xff0c;现有的方法可能会遇到属性变化不好的问题&#xff0c;从而导致在更改所需属…

JS中数组对象使用

文章目录一、创建数组对象二、数组翻转1.检测数组2.翻转数组&#xff1a;三、添加数组元素1.push方法2.unshift方法四、删除数组元素1.pop方法2.shift方法&#x1f918;案例1五、数组排序六、数组索引方法1.indexof(数组元素)2.lastIndexOf方法&#x1f91f;案例2七、数组转化为…

数字验证学习笔记——SystemVerilog芯片验证16 ——约束控制块随机函数

一、约束块控制 一个类可以包含多个约束块。可以把不同约束块用于不同测试。一般情况下&#xff0c;各个约束块之间的约束内容是互相协调不违背的&#xff0c;因此通过随机函数产生随机数时可以找到合适的解 如果子类继承父类&#xff0c;也继承了父类的约束&#xff0c;这个时…

基于蒙特卡诺的电动汽车充电负荷曲线研究(充电开始时间,充电电量,充电功率)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【C++】 STL-vector模拟实现

文章目录vector源码的内容:成员变量默认构造函数构造函数1-无参构造构造函数2 -使用n个相同的值构造构造函数3-使用迭代器区间构造拷贝构造函数**传统写法**现代写法赋值重载函数opeartor传统写法现代写法析构函数迭代器begin & end任意类型vector容器迭代器通用遍历方式:容…

paddleOCRv3之四: rec识别部分用 tensorRT(C++)部署

文章目录1. 简介&#xff1a;速度测试2. paddle 模型转onnx3. onnx转为tensorRT的engine模型4. tensorRT在vs2017中的配置5. 源码1. 简介&#xff1a; tensorRT是nvdia GPU模型部署的一个框架&#xff0c;似乎只是部分开源&#xff0c;github地址.大多数时候用这个框架去部署模…

十九、Docker容器监控之CAdvisor+InfluxDB+Granfana

1、概述 Docker自带查询容器状态的命令&#xff1a;docker stats&#xff0c;可以看到容器的ID\名称、占用CPU、内存等信息 但是我们不能时时刻刻的盯着这个命令&#xff0c;并且这个都是实时数据不能留痕&#xff0c;如果这个时候某一个容器挂了&#xff0c;我们想查看下当时…

webpack性能优化

splitChunks webpack splitChunks minSize: 只有到目标文件超过这个minSize时才会分包。cacheGroups: 可以对某个第三方包进行单独分离出来 例如&#xff1a; splitChunks: {minSize: 300 * 1024&#xff0c;chunks: all,name: aaa,cacheGroups: {jquery: {name: jquery,test…

SCADA平台在风电场测量的应用,实现风电场的高效管理

一、应用背景 随着煤碳、石油等能源的逐渐枯竭&#xff0c;人类越来越重视可再生能源的利用。风能作为一种清洁的可再生能源日益受到世界各国的重视。中国风能储量大&#xff0c;分布面广&#xff0c;仅陆地上的风能储量就约2.53亿千瓦。我国的风电发展起步较晚&#xff0c;但…

大数据教学实训沙盘介绍

沙盘的作用主要有3个&#xff1a; 1、采集真实数据&#xff0c;解决教学中缺少真实数据的困扰&#xff1b; 2、形成从数据采集、预处理、挖掘建模、模型部署的业务闭环&#xff0c;可以把构建模型发布到沙盘系统上&#xff0c;根据模型产生真实的反馈不断的修正模型精度&#x…

DoIP协议从入门到精通系列——车辆声明

上篇文章对DoIP中物理连接做了说明和描述,介绍了以太网应用到车载网络中重要的两个组织: IEEE;OPEN联盟。本文主要对物理连接后,车辆进行自属信息声明过程做一个完整描述。 一、基础信息 DoIP协议标准由一个或多个DoIP实体实施,具体取决于车辆的网络架构。如下图是车辆网…

SuperMap iServer在不同系统中设置开机自启动--Windows篇

目录前言1.删除已有的 SuperMap iServer 系统服务2.注册 SuperMap iServer 系统服务3.设置 SuperMap iServer 系统服务开机自启动实例作者&#xff1a;kxj 前言 在成功部署SuperMap iServer之后&#xff0c;每次重启电脑都需要手动去启动iServer&#xff0c;如何能让iServer在…

HTML5 Web Worker(多线程处理)

文章目录HTML5 Web Worker(多线程处理)概述简单使用处理复杂数据HTML5 Web Worker(多线程处理) 概述 JavaScript的执行环境是单线程的&#xff0c;也就是一次只能执行一个任务。如果遇到多个任务时&#xff0c;只能排队依次执行。 在HTML5中&#xff0c;可以使用Web Worker创…

小程序集成Three.js,使用npm安装gsap动画库

0.视频演示 three.js集成gsap创建物体动画gsap作为简单易用的补间动画库&#xff0c;获得开发者一致好评。 在小程序中&#xff0c;我们集成了Three.js第三方库&#xff0c;可以创建和加载模型及场景&#xff0c;但是做动画还是需要第三方库的支持。 下面详细说明如何在小程序…