1、實現(xiàn)思想
1.1仓蛆、分享人角度
- 用戶需要將對應(yīng)生成的鏈接發(fā)送給其他用戶
- 鏈接中必須包含所需要的 當(dāng)前用戶ID 和 相關(guān)ID(例如:視頻ID/商品ID)
- 用戶需要登錄才能分享,如果沒有登錄則不傳 用戶ID 和 相關(guān)ID
- 分享成功后需要獲得對應(yīng)的報酬或分享成功的展示
1.2挎春、幫助人角度
- 用戶需要點擊分享人的鏈接并且需要登錄看疙,否則不算分享成功。
- 幫助人點擊一次算一次直奋,多次點擊也只算一次
前端在分享前需要調(diào)用接口能庆,告訴后端 某某用戶 分享的 相關(guān)ID(例如:視頻ID/商品ID)
前端在用戶點擊的鏈接需要去判斷是否帶有分享參數(shù),如果有則需要調(diào)取 幫助分享的接口
后端需要將 幫助分享的接口 改成需要登錄狀態(tài)的脚线,這樣才可以讓用戶去登錄后調(diào)取該接口搁胆。
2、實現(xiàn)代碼
2.1、分享前調(diào)用接口
/**
* @ApiTitle (分享前調(diào)用接口)
* @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('參數(shù)錯誤渠旁!');
//存入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 是我自己建立的服務(wù)類顾腊,主要存redis健和相關(guān)操作
2粤铭、$this->auth->uid 這個是當(dāng)前用戶的ID,我這里用的是有序集合杂靶,其實是有無序集合也是可以的梆惯,只是考慮到之后可能要看用戶分享的記錄,這里的score存的是時間吗垮。
3垛吗、其中值里面的value存的是 相關(guān)ID(例如:視頻ID/商品ID),以便對應(yīng)操作
2.2烁登、分享后調(diào)用接口
/**
* @ApiTitle (點擊分享鏈接)
* @ApiMethod (GET)
* @ApiHeaders (name=Authorization, type=string, required=true, description="用戶Token")
* @ApiParams (name="id", type="integer", description="相關(guān)id")
* @ApiParams (name="share_user_id", type="integer", description="分享人ID")
* @ApiReturn ()
*/
public function clickShareLink()
{
$id = input('id', 0); //相關(guān)ID
$shareUserId = input('share_user_id', 0); //分享人ID
$userId = $this->auth->uid; //當(dāng)前用戶ID
if (!$id || !$shareUserId) $this->error('參數(shù)錯誤怯屉!');
$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)) {
//記錄保存至當(dāng)天
$redis->zadd($key2, [$userId => time()]);
$expire = strtotime(date('Y-m-d 23:59:59', time())) - time();
$redis->expire($key2, $expire);
//執(zhí)行相關(guān)的獎勵操作
// ....
$this->success('分享成功!');
}
}
$this->success('分享失敺辣谩蚀之!');
}
1、
RedisService::SU_MATERIAL_BUSINESS_SHARE
這個鍵值主要存分享人ID和相關(guān)ID捷泞,用于判斷該分享鏈接是否有用
2足删、RedisService::SU_MATERIAL_BUSINESS_SHARE_SUCCESS
這個健主要存分享人ID、幫助人ID和相關(guān)ID锁右,用于限制幫助人只能幫助一次失受。
3、 這里需要設(shè)置幫助成功鍵的有效期咏瑟,主要是用于讓幫助人第二天還能幫助一次拂到,如果限制永久只能幫助一次的話,這段$expire = strtotime(date('Y-m-d 23:59:59', time())) - time();
和$redis->expire($key2, $expire);
都注釋掉码泞。
- 這樣就達(dá)到了分享相關(guān)兄旬,另外還有一種是根據(jù)二維碼和邀請碼的幫助,等下一次我再發(fā)布一篇余寥,歡迎有什么問題都可以發(fā)布評論领铐。