Logo花火漫画开发文档
RPC 函数详情

章节阅读计数

get_chapter_and_count_view(匿名计数)与 count_chapter_view_if_new(登录用户去重计数)

概述

项目有两个阅读计数函数,分别服务匿名用户和登录用户。两者都会同时递增 comics 表的四个维度:view_count(总)、popularity_daily(日)、popularity_weekly(周)、popularity_monthly(月)。

函数适用场景去重
get_chapter_and_count_view匿名用户无,每次调用必定 +1
count_chapter_view_if_new登录用户有,基于冷却时间去重

两个函数均为 SECURITY DEFINER,以函数定义者身份执行,绕过 RLS 直接操作 comicschapter_view_logs 表。


get_chapter_and_count_view

该函数暂时没有使用,未来视情况删去或改造

获取章节数据的同时无条件递增漫画阅读量。适用于匿名用户——无法记录 user_id,因此不做去重。

属性
返回类型SETOF chapters(完整章节行)
安全级别SECURITY DEFINER

参数

Prop

Type

执行流程

  1. 根据 p_chapter_id 查出所属 comic_id
  2. 递增 comics 表的 view_countpopularity_dailypopularity_weeklypopularity_monthly 各 +1
  3. 返回该章节的完整行数据

调用示例

val chapter = supabase.postgrest
    .rpc("get_chapter_and_count_view") {
        parameter("p_chapter_id", chapterId)
    }
    .decodeSingle<Chapter>()
const { data } = await supabase
  .rpc('get_chapter_and_count_view', {
    p_chapter_id: chapterId,
  })

count_chapter_view_if_new

登录用户的去重阅读计数。通过 chapter_view_logs 表记录每个用户对每个章节的最近浏览时间,在冷却期内重复访问不计数。

属性
返回类型booleantrue = 计数成功,false = 冷却期内跳过)
安全级别SECURITY DEFINER

参数

Prop

Type

执行流程

  1. 查询 chapter_view_logs 中该用户对该章节的最近浏览时间
  2. 如果在冷却期内(viewed_at > now() - cooldown),返回 false
  3. 否则,UPSERT chapter_view_logs 记录(ON CONFLICT DO UPDATE
  4. 递增 comics 表的四个维度计数各 +1
  5. 返回 true

去重表结构

chapter_view_logs 表通过 (user_id, chapter_id) 联合唯一约束实现每用户每章节只保留一条记录:

字段类型说明
user_iduuid用户 ID
chapter_idbigint章节 ID
viewed_attimestamptz最近浏览时间

调用示例

// 默认 120 秒冷却
val counted = supabase.postgrest
    .rpc("count_chapter_view_if_new") {
        parameter("p_user_id", userId)
        parameter("p_chapter_id", chapterId)
    }
    .decodeSingle<Boolean>()

// 自定义冷却时间
val counted = supabase.postgrest
    .rpc("count_chapter_view_if_new") {
        parameter("p_user_id", userId)
        parameter("p_chapter_id", chapterId)
        parameter("p_cooldown_seconds", 300)
    }
    .decodeSingle<Boolean>()
const { data: counted } = await supabase
  .rpc('count_chapter_view_if_new', {
    p_user_id: userId,
    p_chapter_id: chapterId,
    // p_cooldown_seconds: 300  // 可选
  })

选择策略

客户端根据登录状态选择调用哪个函数:

用户状态调用函数原因
未登录get_chapter_and_count_view无 user_id,无法去重,同时需要返回章节数据
已登录count_chapter_view_if_new有 user_id,120 秒冷却去重,防止刷量

On this page