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

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

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

方案一:直接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索引设置

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

评论2
回复 · 2
刘涛桂
刘涛桂 初级 · #2 ·
同求,期待更新
唐凯婷
唐凯婷 初级 · #1 ·
同求,期待更新
微信客服 微信客服 QQ官方交流群 QQ官方交流群