Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
  • 如何设计一个短链系统
  • 新Get的开发技巧
  • 项目通用工具

  • 用户模块

  • 短链模块

    • 短链接分组

    • 短链接管理

    • 回收站管理

    • 短链接监控

      • 持久层
      • 基础访问监控
      • 单个短链访问监控详情
      • 访问记录监控
        • 接口层
        • 持久层
      • 短链接记录变更分组
      • 削峰短链接监控
      • 消费队列幂等性
  • 流量风控
  • 如何获取用户IP?
  • SaaS短链接系统
  • 短链模块
  • 短链接监控
Nreal
2024-01-28
目录

访问记录监控

# 接口层

接口:

/**
 * 访问单个短链接指定时间内访问记录监控数据
 */
@GetMapping("/api/short-link/v1/stats/access-record")
public Result<IPage<ShortLinkStatsAccessRecordRespDTO>> shortLinkStatsAccessRecord(ShortLinkStatsAccessRecordReqDTO requestParam) {
    return Results.success(shortLinkStatsService.shortLinkStatsAccessRecord(requestParam));
}
1
2
3
4
5
6
7
@Override
public IPage<ShortLinkStatsAccessRecordRespDTO> shortLinkStatsAccessRecord(ShortLinkStatsAccessRecordReqDTO requestParam) {
    LambdaQueryWrapper<LinkAccessLogsDO> queryWrapper = Wrappers.lambdaQuery(LinkAccessLogsDO.class)
            .eq(LinkAccessLogsDO::getGid, requestParam.getGid())
            .eq(LinkAccessLogsDO::getFullShortUrl, requestParam.getFullShortUrl())
            .between(LinkAccessLogsDO::getCreateTime, requestParam.getStartDate(), requestParam.getEndDate())
            .eq(LinkAccessLogsDO::getDelFlag, 0)
            .orderByDesc(LinkAccessLogsDO::getCreateTime);
    IPage<LinkAccessLogsDO> linkAccessLogsDOIPage = linkAccessLogsMapper.selectPage(requestParam, queryWrapper);
    IPage<ShortLinkStatsAccessRecordRespDTO> actualResult = linkAccessLogsDOIPage.convert(each -> BeanUtil.toBean(each, ShortLinkStatsAccessRecordRespDTO.class));
    List<String> userAccessLogsList = actualResult.getRecords().stream()
            .map(ShortLinkStatsAccessRecordRespDTO::getUser)
            .toList();
    List<Map<String, Object>> uvTypeList = linkAccessLogsMapper.selectUvTypeByUsers(
            requestParam.getGid(),
            requestParam.getFullShortUrl(),
            requestParam.getStartDate(),
            requestParam.getEndDate(),
            userAccessLogsList
    );
    actualResult.getRecords().forEach(each -> {
        String uvType = uvTypeList.stream()
                .filter(item -> Objects.equals(each.getUser(), item.get("user")))
                .findFirst()
                .map(item -> item.get("UvType"))
                .map(Object::toString)
                .orElse("旧访客");
        each.setUvType(uvType);
    });
    return actualResult;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# 持久层

/**
 * 获取用户信息是否新老访客
 */
@Select("<script> " +
        "SELECT " +
        "    user, " +
        "    CASE " +
        "        WHEN MIN(create_time) BETWEEN #{startDate} AND #{endDate} THEN '新访客' " +
        "        ELSE '老访客' " +
        "    END AS uvType " +
        "FROM " +
        "    t_link_access_logs " +
        "WHERE " +
        "    full_short_url = #{fullShortUrl} " +
        "    AND gid = #{gid} " +
        "    AND user IN " +
        "    <foreach item='item' index='index' collection='userAccessLogsList' open='(' separator=',' close=')'> " +
        "        #{item} " +
        "    </foreach> " +
        "GROUP BY " +
        "    user;" +
        "    </script>"
)
List<Map<String, Object>> selectUvTypeByUsers(
        @Param("gid") String gid,
        @Param("fullShortUrl") String fullShortUrl,
        @Param("startDate") String startDate,
        @Param("endDate") String endDate,
        @Param("userAccessLogsList") List<String> userAccessLogsList
);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
单个短链访问监控详情
短链接记录变更分组

← 单个短链访问监控详情 短链接记录变更分组→

Theme by Vdoing | Copyright © 2021-2024
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式