社区积分奖励插件实战:精准触发用户行为的3种监听方案

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
插件开发 99 浏览 18 回复

最近在开发社区积分奖励插件时,发现很多开发者对行为触发的精度控制不到位。分享下我们在用户发帖/回帖时精准奖励积分的三种实现方案:

方案一:直接Hook主题发布事件

Hook::add('thread_after_create', function($thread) {
    // 校验是否首次发帖
    if(!UserExtra::where('user_id', $thread->user_id)->exists()) {
        Credit::add($thread->user_id, 'first_post');
    }
    Credit::add($thread->user_id, 'normal_post');
});
优点:响应速度快,适合简单场景

方案二:异步队列+事务完成监听

@receiver(post_save, sender=Post)
def on_post_save(sender, instance, created, **kwargs):
    if created and instance.approved:  # 确保通过审核
        tasks.add_credit.delay(
            user_id=instance.user_id,
            action='approved_post'
        )
优势:避免重复奖励,适合需要审核的社区

方案三:全行为日志+定时核对

// 前端埋点
trackAction('post_create', { 
    post_id: 12345,
    is_first: user.firstPost 
});

// 后端每小时跑核对任务
const uncreditedPosts = await Logs.find({
    action: 'post_create',
    credited: false
}).limit(1000);
适用场景:需要防止作弊的高安全需求

实际开发中遇到的坑: 1. 直接Hook可能错过审核后状态变更 2. 异步方案要注意消息队列的消费延迟 3. 全量日志要注意MongoDB的TTL索引设置

你们更倾向哪种方案?欢迎分享实际项目中的经验~

评论18
回复 · 18
徐敏
徐敏 初级麟宫绮梦 · #18 ·
已解决,谢谢楼主
知夏45
知夏45 初级清瑶问鼎 · #17 ·
学到了,顶一下
朱娜丽
朱娜丽 新手时梦乐园 · #16 ·
支持了~
安然77
安然77 初级清瑶问鼎 · #15 ·
写得很清楚,收藏了
韩琳博
韩琳博 初级清瑶问鼎 · #14 ·
写得很清楚,收藏了
CoolKid🌸
CoolKid🌸 初级璃梦花海 · #13 ·
已解决,谢谢楼主
杨涛
杨涛 新手赤羽栖云 · #12 ·
支持了~
IvySky
IvySky 初级 · #11 ·
写得很清楚,收藏了
HelenLin
HelenLin 初级赤羽栖云 · #10 ·
已解决,谢谢楼主
🐱汽水🎐
🐱汽水🎐 初级星灿心语 · #9 ·
支持了~
孙超宁
孙超宁 新手暖弦漫旋 · #8 ·
已解决,谢谢楼主
自由的海盐
自由的海盐 初级心屿荧途 · #7 ·
支持了~
发光的柚子
发光的柚子 初级璃海华章 · #6 ·
已解决,谢谢楼主
懒懒的星星
懒懒的星星 初级星灿心语 · #5 ·
已解决,谢谢楼主
迷路的星星
迷路的星星 初级赤羽栖云 · #4 ·
写得很清楚,收藏了
蔡凯
蔡凯 初级 · #3 ·
写得很清楚,收藏了
刘涛桂
刘涛桂 初级清瑶问鼎 · #2 ·
同求,期待更新
唐凯婷
唐凯婷 初级 · #1 ·
同求,期待更新
微信客服 微信客服 QQ官方交流群 QQ官方交流群