【实时数仓】Sugar拉取数据展示、品牌销售排行接口、品类销售占比接口和热门商品SPU排名接口的实现

news2025/1/13 5:57:51

文章目录

  • 一 Sugar拉取数据展示
    • 1 内网穿透
      • (1)作用
      • (2)工具
      • (3)本机ip地址
      • (4)花生壳配置
    • 2 配置组件
  • 二 品牌销售排行接口
    • 1 Sugar配置
      • (1)图表配置
      • (2)接口地址
      • (3)数据格式
      • (4)执行SQL
    • 2 数据接口实现
      • (1)创建商品交易额统计实体类ProductStats
      • (2)Mapper层:在ProductStatsMapper中添加方法
      • (3)Service层:在ProductStatsService中增加方法
      • (4)Service层:在ProductStatsServiceImpl增加方法实现
      • (5)Controller层:在SugarCongroller添加方法
      • (6)本地接口测试
    • 3 修改Sugar配置
      • (1)地址
      • (2)修改排序规则
      • (3)结果展示
      • (4)定义宏变量
  • 三 品类销售占比接口
    • 1 Sugar配置
      • (1)图表配置
      • (2)接口地址
      • (3)数据格式
      • (4)执行SQL
    • 2 数据接口实现
      • (1)Mapper
      • (2)Service
      • (3)Serviceiml
      • (4)Controller
      • (5)接口测试
    • 3 通过面向对象的方式返回JSON格式字符串
      • (1)格式说明
      • (2)功能实现
      • (3)测试结果
  • 四 热门商品SPU排名接口
    • 1 Sugar配置
      • (1)图表配置
      • (2)接口地址
      • (3)数据格式
      • (4)执行SQL
    • 2 数据接口实现
      • (1)Mapper
      • (2)Service
      • (3)ServiceIml
      • (4)Controller
      • (5)接口测试

一 Sugar拉取数据展示

1 内网穿透

(1)作用

通常个人电脑无论是连接WIFI上网还是用网线上网,都是属于局域网里边的,外网无法直接访问到你的电脑,内网穿透可以让你的局域网中的电脑实现被外网访问功能。

(2)工具

目前国内网穿透工具很多,常见的比如花生壳、Ngrok、网云穿等。

官网:

花生壳。

[Ngrok。](: http://www.ngrok.cc)

网云穿。

本文以介绍花生壳为主。

(3)本机ip地址

在这里插入图片描述

(4)花生壳配置

在这里插入图片描述

配置完成后启动Gmall2022PublisherApplication.java服务,进行【映射诊断】,如下图穿透成功。

在这里插入图片描述

复制上图中的外网地址,修改地址(https://m23o108551.zicp.fun/api/sugar/gmv?date=20221215),查看是否可以正常获取数据信息。

在这里插入图片描述

2 配置组件

点击组件,在右侧的菜单中选择【数据】,绑定方式改为【API拉取】。

下方的路径填写 https://m23o108551.zicp.fun/api/sugar/gmv?date=20221215。

这个就是sugar会周期性访问的数据接口地址,可以自定义,点击【刷新列表】,结果如下图。

在这里插入图片描述

二 品牌销售排行接口

1 Sugar配置

(1)图表配置

在这里插入图片描述

(2)接口地址

https://m23o108551.zicp.fun/api/sugar/tm?date=20221215&limit=5

(3)数据格式

使用【静态JSON】的【数据绑定方式】查看数据格式,如下

{
  "status": 0,
  "data": {
    "categories": [
      "苹果",
      "三星",
      "华为",
      "oppo",
      "vivo",
      "小米94"
    ],
    "series": [
      {
        "name": "商品品牌",
        "data": [
          8949,
          7224,
          7279,
          5783,
          7957,
          7012
        ]
      }
    ]
  }
}

(4)执行SQL

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

select tm_id,tm_name,sum(order_amount) order_amount from product_stats_2022 where toYYYYMMDD(stt)=20221215 group by tm_id,tm_name having order_amount > 0 order by order_amount desc limit 5;

2 数据接口实现

(1)创建商品交易额统计实体类ProductStats

package com.hzy.gmall.publisher.beans;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;

/**
 * Desc: 商品交易额统计实体类
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ProductStats {
    String stt;
    String edt;
    Long sku_id;
    String sku_name;
    BigDecimal sku_price;
    Long spu_id;
    String spu_name;
    Long tm_id ;
    String tm_name;
    Long category3_id ;
    String category3_name ;
    @Builder.Default
    Long  display_ct=0L;
    @Builder.Default
    Long  click_ct=0L;
    @Builder.Default
    Long  cart_ct=0L;
    @Builder.Default
    Long  order_sku_num=0L;
    @Builder.Default
    BigDecimal order_amount=BigDecimal.ZERO;
    @Builder.Default
    Long  order_ct=0L;
    @Builder.Default
    BigDecimal  payment_amount=BigDecimal.ZERO;
    @Builder.Default
    Long  refund_ct=0L;
    @Builder.Default
    BigDecimal  refund_amount=BigDecimal.ZERO;
    @Builder.Default
    Long  comment_ct=0L;
    @Builder.Default
    Long  good_comment_ct=0L ;
    Long ts;
}

(2)Mapper层:在ProductStatsMapper中添加方法

// 获取某天商品销售额品牌排行
@Select("select tm_id,tm_name,sum(order_amount) order_amount from product_stats_2022 " +
        "where toYYYYMMDD(stt)=#{date} " +
        "group by tm_id,tm_name " +
        "having order_amount > 0 " +
        "order by order_amount desc limit #{limit}")
List<ProductStats> selectProductStatsByTm(@Param("date") Integer date, @Param("limit") Integer limit);

(3)Service层:在ProductStatsService中增加方法

// 获取品牌对应交易额
List<ProductStats> getProductStatsByTm(Integer date, Integer limit);

(4)Service层:在ProductStatsServiceImpl增加方法实现

@Override
public List<ProductStats> getProductStatsByTm(Integer date, Integer limit) {
    return productStatsMapper.selectProductStatsByTm(date,limit);
}

(5)Controller层:在SugarCongroller添加方法

注意:Controller方法的定义必须依照定义好的接口访问路径和返回值格式。

@RequestMapping("/tm")
public String getProductStatsByTm(
        @RequestParam(value = "date",defaultValue = "0") Integer date,
        @RequestParam(value = "limit",defaultValue = "20") Integer limit){
    if (date == 0){
        date = now();
    }
    // 调用service方法,获取品牌交易额
    List<ProductStats> productStats = productStatsService.getProductStatsByTm(date, limit);

    //对查询结果进行遍历,获取品牌以及品牌交易额,将其分别封装到独立的list集合中
    List<String> tmList = new ArrayList<>();
    List<BigDecimal> amountList = new ArrayList<>();
    for (ProductStats productStat : productStats) {
        tmList.add(productStat.getTm_name());
        amountList.add(productStat.getOrder_amount());
    }

    String json = "{\"status\": 0,\"data\": " +
            "{\"categories\": [\""+ StringUtils.join(tmList,"\",\"") +"\"]," +
            "\"series\": [{\"name\": \"商品品牌\",\"data\": ["+StringUtils.join(amountList,",")+"]}]}}";

    return json;
}

(6)本地接口测试

输入:http://localhost:8070/api/sugar/tm?date=20221215&limit=5

显示结果:

在这里插入图片描述

3 修改Sugar配置

(1)地址

https://m23o108551.zicp.fun/api/sugar/tm?date=20221215&limit=5

(2)修改排序规则

在这里插入图片描述

(3)结果展示

在这里插入图片描述

(4)定义宏变量

在这里插入图片描述

以上两个功能的地址可以重新编写为:

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

$API_HOST/api/sugar/tm?date=20221215&limit=5

三 品类销售占比接口

1 Sugar配置

(1)图表配置

在这里插入图片描述

(2)接口地址

https://m23o108551.zicp.fun/api/sugar/category3?date=20221215&limit=5

(3)数据格式

{
  "status": 0,
  "data": [
    {
      "name": "PC",
      "value": 97
    },
    {
      "name": "iOS",
      "value": 50
    }
  ]
}

(4)执行SQL

在这里插入图片描述

select category3_id,category3_name,sum(order_amount) order_amount from product_stats_2022 where toYYYYMMDD(stt)=20221215 group by category3_id,category3_name having order_amount > 0 order by order_amount desc limit 5;

2 数据接口实现

(1)Mapper

    // 获取某天品类销售额品牌排行
    @Select("select category3_id,category3_name,sum(order_amount) order_amount " +
            "from product_stats_2022 " +
            "where toYYYYMMDD(stt)=#{date} " +
            "group by category3_id,category3_name " +
            "having order_amount > 0 " +
            "order by order_amount desc limit #{limit};")
    List<ProductStats> selectProductStatsByCategory3(@Param("date") Integer date, @Param("limit") Integer limit);

(2)Service

// 获取品类对应交易额
List<ProductStats> getProductStatsByCategory3(Integer date, Integer limit);

(3)Serviceiml

@Override
public List<ProductStats> getProductStatsByCategory3(Integer date, Integer limit) {
    return productStatsMapper.selectProductStatsByCategory3(date,limit);
}

(4)Controller

@RequestMapping("/category3")
public String getProductStatsByCategory3(
        @RequestParam(value = "date",defaultValue = "0") Integer date,
        @RequestParam(value = "limit",defaultValue = "20") Integer limit) {
    if (date == 0) {
        date = now();
    }

    //调用service方法,获取品类销售排名情况
    List<ProductStats> productStatsList = productStatsService.getProductStatsByCategory3(date, limit);

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

    // 遍历集合,获取每一个品类的销售情况
    for (int i = 0; i < productStatsList.size(); i++) {
        ProductStats productStats = productStatsList.get(i);
        jsonBuilder.append("{\"name\": \""+productStats.getCategory3_name()+"\"," +
                "\"value\": "+productStats.getOrder_amount()+"}");
        if(i < productStatsList.size() - 1){
            jsonBuilder.append(",");
        }
    }

    jsonBuilder.append("]}");
    return jsonBuilder.toString();
}

(5)接口测试

https://m23o108551.zicp.fun/api/sugar/category3?date=20221215&limit=5

在这里插入图片描述

3 通过面向对象的方式返回JSON格式字符串

(1)格式说明

在java语言中,会将JSON对象封装成一个Map集合,将JSON数组封装成一个List集合。

在这里插入图片描述

(2)功能实现

@RequestMapping("/category3")
public Object getProductStatsByCategory3(
        @RequestParam(value = "date",defaultValue = "0") Integer date,
        @RequestParam(value = "limit",defaultValue = "20") Integer limit) {
    if (date == 0) {
        date = now();
    }

    //调用service方法,获取品类销售排名情况
    List<ProductStats> productStatsList = productStatsService.getProductStatsByCategory3(date, limit);

    Map resMap = new HashMap();
    List dataList = new ArrayList();
    for (ProductStats productStats : productStatsList) {
        HashMap dataMap = new HashMap();
        dataMap.put("name",productStats.getCategory3_name());
        dataMap.put("value",productStats.getOrder_amount());
        dataList.add(dataMap);
    }
    resMap.put("status",0);
    resMap.put("data",dataList);

    return resMap;
}

(3)测试结果

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

四 热门商品SPU排名接口

1 Sugar配置

(1)图表配置

在这里插入图片描述

(2)接口地址

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

(3)数据格式

{
  "status": 0,
  "data": {
    "columns": [
      {
        "name": "商品名称",
        "id": "name"
      },
      {
        "name": "交易额",
        "id": "anount"
      },
      {
        "name": "订单数",
        "id": "ct"
      }
    ],
    "rows": [
      {
        "name": "北京总部",
        "anounnt": "市场部",
        "ct": "第一小分队"
      },
      {
        "name": "北京总部",
        "anounnt": "市场部",
        "ct": "第一小分队"
      }
    ]
  }
}

(4)执行SQL

select spu_id,spu_name,sum(order_amount) order_amount,sum(order_ct) order_ct from product_stats_2022 where toYYYYMMDD(stt)=20221215 group by spu_id,spu_name having order_amount > 0 order by order_amount desc limit 5;

2 数据接口实现

(1)Mapper

@Select("select spu_id,spu_name,sum(order_amount) order_amount,sum(order_ct) order_ct " +
        "from product_stats_2022 " +
        "where toYYYYMMDD(stt)=#{date} " +
        "group by spu_id,spu_name " +
        "having order_amount > 0 " +
        "order by order_amount desc limit #{limit};")
List<ProductStats> selectProductStatsBySPU(@Param("date") Integer date, @Param("limit") Integer limit);

(2)Service

// 获取品类对应交易额
List<ProductStats> getProductStatsBySPU(Integer date, Integer limit);

(3)ServiceIml

@Override
public List<ProductStats> getProductStatsBySPU(Integer date, Integer limit) {
    return productStatsMapper.selectProductStatsBySPU(date,limit);
}

(4)Controller

@RequestMapping("/spu")
public Object getProductStatsBySPU(
        @RequestParam(value = "date",defaultValue = "0") Integer date,
        @RequestParam(value = "limit",defaultValue = "20") Integer limit) {
    if (date == 0) {
        date = now();
    }

    List<ProductStats> productStatsList = productStatsService.getProductStatsBySPU(date, limit);

    StringBuilder jsonBuilder = new StringBuilder("{\"status\": 0,\"data\": {\"columns\": [{\"name\": \"商品名称\",\"id\": \"name\"},{\"name\": \"交易额\",\"id\":\"anount\"},{\"name\": \"订单数\",\"id\": \"ct\"}],\"rows\": [");

    for (int i = 0; i < productStatsList.size(); i++) {
        ProductStats productStats = productStatsList.get(i);
        jsonBuilder.append("{\"name\": \""+productStats.getSpu_name()+"\",\"anount\": "+productStats.getOrder_amount()+",\"ct\": "+productStats.getOrder_ct()+"}");
        if (i < productStatsList.size() - 1){
            jsonBuilder.append(",");
        }
    }

    jsonBuilder.append("]}}");

    return jsonBuilder.toString();
}

(5)接口测试

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

2022《粤语好声音-乐队风暴》全国总决赛圆满收官!

2022年12月17日&#xff0c;由广东珠江、盛娱星汇海选联合主办的2022《粤语好声音-乐队风暴》全国总决赛在广州增城1978电影小镇正式拉开帷幕。从海选到全国总决赛&#xff0c;2022《粤语好声音-乐队风暴》在21座城市中&#xff0c;通过线上线下双模式开展&#xff0c;历时6个月…

OpManager 虚拟化管理

什么是虚拟化 虚拟化是创建计算资源的虚拟形式&#xff0c;如计算机、服务器或其他硬件组件&#xff0c;或基于软件的资源&#xff08;如操作系统&#xff09;。虚拟化最常见的示例是在操作系统安装期间对硬盘进行分区&#xff0c;其中物理硬盘驱动器被拆分为多个逻辑磁盘以提…

重点 |中级软件设计师易混淆知识点 (1)

本文章总结了软件设计师考试易混淆知识点&#xff01;&#xff01;&#xff01; 帮助大家更好的复习&#xff0c;希望能对大家有所帮助 比较长&#xff0c;放了部分&#xff0c;需要可私信&#xff01;&#xff01; 易混淆点1&#xff1a;原、反、补码的运算 1、原码&#x…

Технокубок 2021 - Финал C. Basic Diplomacy

翻译&#xff1a; Aleksey有&#x1d45b;个朋友。他现在也在度假&#xff0c;所以他有&#x1d45a;天来玩这款新的病毒式合作游戏!但由于它是合作的&#xff0c;阿列克谢将需要一个队友在每个&#x1d45a;天。 在这些日子里&#xff0c;每天都有一些朋友可以玩&#xff0c…

Spring 依赖注入

文章目录流程图依赖注入的方式手动注入自动注入XML的autowire自动注入autowire BY_NAME 与 BY_TYPE(已过时)执行时机&#xff1a;AUTOWIRE_BY_NAMEAUTOWIRE_BY_TYPEAutowired注解的处理(含Value&#xff0c;Inject)AutowiredAnnotationBeanPostProcessorresolveDependencyfindA…

机器学习——线性模型学习

线性回归 主要目标确定 如何确定w和b呢&#xff1f;关键在于如何衡量f(x)与y的差别 此种衡量误差的方法称为均方误差也称为欧式距离 求解w和b使上述方程最小化的过程称为线性回归模型的最小二乘”参数估计“ 多元线性回归 针对多个属性的数据集D&#xff0c;此时试图学得 …

DHCP学习

目录 DHCP基本认识和原理 场景一、同网段DHCP 场景二、不同段DHCP&#xff08;中继DHCP&#xff09; DHCP基本认识和原理 DHCP&#xff08;Dynamic Host Configuration Protocol动态主机协议&#xff09;。 作用&#xff1a;为局域网络中主机动态分发地址&#xff0c;以及…

INMP441麦克风芯片--支持I2S、ESP32

1.简介 INMP441是InvenSense公司推出的一款具有底部端口的高信噪比、低功耗、数字输出的全向MEMS麦克风&#xff0c;信噪比高达61dB&#xff0c;使其成为近场应用的绝佳选择。INMP441的电路结构如图所示&#xff0c;包括MEMS声音传感器、模数转换器&#xff08;ADC&#xff09…

人工智能的2022:技术的价值在于生产力

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

孤独的照片(思维)

Farmer John 最近购入了 NN 头新的奶牛&#xff0c;每头奶牛的品种是更赛牛&#xff08;Guernsey&#xff09;或荷斯坦牛&#xff08;Holstein&#xff09;之一。 奶牛目前排成一排&#xff0c;Farmer John 想要为每个连续不少于三头奶牛的序列拍摄一张照片。 然而&#xff0…

初识Kubernetes:(2)Kubernetes环境搭建

初识Kubernetes&#xff1a;&#xff08;2&#xff09;Kubernetes环境搭建1 环境规划1.1 集群类型1.2 安装方式2 环境搭建2.1 minikube安装2.2 启动集群3 服务部署1 环境规划 1.1 集群类型 Kubernetes集群大致分为两类&#xff1a;一主多从和多主多从。 一主多从&#xff1a…

UE4 shader编程 基础学习笔记 --- 熟悉各个节点

Texture Sample&#xff1a;用所需要的纹理覆盖到Mesh上&#xff0c;展示效果&#xff0c;Mesh上存在漫反射 高光 环境变量的和制造出了左上角的纹理光照效果 该节点只能设置其黑白效果 0为黑&#xff0c;1为白 该节点可以调节R、G两个参数 该节点可以调节RGB三个参数 该节…

C#---第十八课:Debug调试技巧--Debug类、pin 、add watch、拖动断点、修改变量、两个断点的联动

文章目录1. 在output窗口中输出变量的内容----Debug类2. Pin变量 / add watch 实时监控变量的变化(1) pin to sources(2) add watch3. 自由拖动黄色箭头图标4. 直接修改变量的值5. 两个断点的联动&#xff08;当一个断点触发&#xff0c;另一个断点才会触发debug&#xff09;1.…

变革:区块链上的政府和企业应用

发表时间&#xff1a;2022年5月12日 信息来源&#xff1a;coingeek.com 区块链只与数字货币和金融交易挂钩的时代已经过去了。这项技术在过去十年中不断发展&#xff0c;今天&#xff0c;它为游戏、社交媒体应用、医疗保健以及供应链管理等多个领域提供着支持。相比其它领域&am…

SpringBoot 整合【Mybatis-Plus实现分页查询】

目录 1. 添加pom.xml依赖 2. 配置application.yml文件 3. mybatis-plus插件配置核心类 4. 启动类配置 5. 测试数据Sql脚本 6. mybatis-plus代码生成 7. 测试分页查询 1. 添加pom.xml依赖 <!--mybatis-plus--><dependency><groupId>com.baomidou</g…

Weighted Logistic Regression和Youtube时长预估

前段时间阅读了youtube的经典论文《Deep Neural Networks for YouTube Recommendations》&#xff0c;其通过weighted LR来实现时长预估&#xff0c;在其原文中对实现的描述非常短&#xff0c;大概意思是在损失函数中&#xff0c;对正例&#xff08;点击&#xff09;的交叉熵项…

中断的分类,中断指令,中断类型码,中断向量表,中断优先级

目录 PC机的中断系统 中断的分类 内部中断&#xff08;软件中断&#xff09; 故障 陷阱 异常终止 中断指令 指令类型中断指令 INT N 溢出中断指令 INTO 中断返回指令 IRET 外部中断&#xff08;硬件中断&#xff09; 非屏蔽中断&#xff08;NMI&#xff09; 可…

Springboot实现定时任务调度

前言 今天给大家分享一下&#xff0c;如何使用springboot快速实现简单的定时调度任务&#xff1f;有两种方法&#xff1a;基于注解的声明式调度任务注册&#xff1b;另外一种是基于实现SchedulingConfigurer的编程式的调度任务注册。 1. 基于注解&#xff08;Scheduled&#…

Problem Set 2

Regularized Normal Equation for Linear Re-gression Given a data set {ar(), y()}i1,.-.,m with x()∈ R" and g(∈ R, the generalform of regularized linear regression is as follows n (he(zr)- g)3入>0号 (1) ” 2m i1 j1 Derive the normal equation. 设 X[(…

P7 PyTorch 属性统计

目录 Norm min max argmax argmin prod sum dim keepdim topk & kthvalue eq&equal一 Norm 作用&#xff1a; 求范数 1.1 1阶范数 # -*- coding: utf-8 -*- """ Created on Thu Dec 22 21:48:02 2022author: cxf """ import torc…