TP5 實現鏈接分享/幫助,限制每個用戶每天一次幫忙

1、實現思想

1.1、分享人角度
  • 用戶需要將對應生成的鏈接發送給其他用戶
  • 鏈接中必須包含所需要的 當前用戶ID相關ID(例如:視頻ID/商品ID)
  • 用戶需要登錄才能分享,如果沒有登錄則不傳 用戶ID相關ID
  • 分享成功後需要獲得對應的報酬或分享成功的展示
1.2、幫助人角度
  • 用戶需要點擊分享人的鏈接並且需要登錄,否則不算分享成功。
  • 幫助人點擊一次算一次,多次點擊也只算一次

前端在分享前需要調用接口,告訴後端 某某用戶 分享的 相關ID(例如:視頻ID/商品ID)
前端在用戶點擊的鏈接需要去判斷是否帶有分享參數,如果有則需要調取 幫助分享的接口
後端需要將 幫助分享的接口 改成需要登錄狀態的,這樣纔可以讓用戶去登錄後調取該接口。

2、實現代碼

2.1、分享前調用接口
/**
 * @ApiTitle    (分享前調用接口)
 * @ApiMethod   (GET)
 * @ApiHeaders  (name=Authorization, type=string, required=true, description="用戶Token")
 * @ApiParams   (name="id", type="integer", description="呆滯料id")
 * @ApiReturn   ()
 */
public function shareBusiness()
{
    $id = input('id', 0);
    if (!$id) $this->error('參數錯誤!');

    //存入redis
    $redis = RedisService::connect();

    //先刪除後更新
    $key = RedisService::SU_MATERIAL_BUSINESS_SHARE . $this->auth->uid;
    $redis->zrem($key, $id);
    $redis->zadd($key, [$id => time()]);

    $this->success('成功!');
}

1、其中 RedisService 是我自己建立的服務類,主要存redis健和相關操作
2、$this->auth->uid 這個是當前用戶的ID,我這裏用的是有序集合,其實是有無序集合也是可以的,只是考慮到之後可能要看用戶分享的記錄,這裏的score存的是時間。
3、其中值裏面的value存的是 相關ID(例如:視頻ID/商品ID),以便對應操作

2.2、分享後調用接口
/**
 * @ApiTitle    (點擊分享鏈接)
 * @ApiMethod   (GET)
 * @ApiHeaders  (name=Authorization, type=string, required=true, description="用戶Token")
 * @ApiParams   (name="id", type="integer", description="相關id")
 * @ApiParams   (name="share_user_id", type="integer", description="分享人ID")
 * @ApiReturn   ()
 */
public function clickShareLink()
{
    $id = input('id', 0); //相關ID
    $shareUserId = input('share_user_id', 0); //分享人ID
    $userId = $this->auth->uid; //當前用戶ID

    if (!$id || !$shareUserId) $this->error('參數錯誤!');

    $key = RedisService::SU_MATERIAL_BUSINESS_SHARE . $shareUserId;
    $key2 = RedisService::SU_MATERIAL_BUSINESS_SHARE_SUCCESS . $shareUserId . ':' . $id;
    $redis = RedisService::connect();
    //判斷用戶是否分享過
    if ($redis->zscore($key, $id)) {
        //判斷該用戶是否點擊過
        if (!$redis->zscore($key2, $userId)) {
            //記錄保存至當天
            $redis->zadd($key2, [$userId => time()]);
            $expire = strtotime(date('Y-m-d 23:59:59', time())) - time();
            $redis->expire($key2, $expire);

            //執行相關的獎勵操作
            // ....

            $this->success('分享成功!');
        }
    }
    $this->success('分享失敗!');
}

1、RedisService::SU_MATERIAL_BUSINESS_SHARE 這個鍵值主要存分享人ID和相關ID,用於判斷該分享鏈接是否有用
2、RedisService::SU_MATERIAL_BUSINESS_SHARE_SUCCESS 這個健主要存分享人ID、幫助人ID和相關ID,用於限制幫助人只能幫助一次。
3、 這裏需要設置幫助成功鍵的有效期,主要是用於讓幫助人第二天還能幫助一次,如果限制永久只能幫助一次的話,這段$expire = strtotime(date('Y-m-d 23:59:59', time())) - time();$redis->expire($key2, $expire); 都註釋掉。

  • 這樣就達到了分享相關,另外還有一種是根據二維碼和邀請碼的幫助,等下一次我再發布一篇,歡迎有什麼問題都可以發佈評論。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章