社区积分奖励插件实战:精准触发用户行为的3种监听方案
最近在开发社区积分奖励插件时,发现很多开发者对行为触发的精度控制不到位。分享下我们在用户发帖/回帖时精准奖励积分的三种实现方案:
方案一:直接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索引设置
你们更倾向哪种方案?欢迎分享实际项目中的经验~
最新打赏


QQ官方交流群