需求分析
1、用戶當天登錄商城,只要簽到就直接獎勵一定的積分或者根據用戶本周或者本月內已經連續簽到的天數進行積分獎勵,后台可以設置具體的獎勵規則,這里假設本周內連續登錄三天獎勵 1 積分,五天獎勵 2 積分,七天獎勵 3 積分,每周一簽到次數歸零(歸零方法不一定是每周一簽到次數自動設為零,詳見下文)
2、實現形式:在個人中心放置簽到按鈕或者登錄成功之后進行彈窗提示
3、個人中心,用戶可以看到簽到日志(如果設置日志記錄的話)和積分流水
4、商城后台可以對簽到送積分的規則進行設置,也可以看到簽到日子和積分流水,具體規則包括:1、獎勵模式 2、相應模式配置 3、日志記錄 4、是否開啟等,具體詳見簽到配置表
簽到配置列表,這些配置信息可以格式化以后作為商城的一項配置
type |
簽到模式(當天簽到就有獎勵(1)、連續簽到一定天數會有不同獎勵(2)) |
configs |
type為1時,表示每天簽到獎勵積分數;type為2時,表示連續簽到天數以及獎勵階梯(可以作為數組元素並存) |
open_log |
是否記錄簽到日志 |
save_days |
簽到日志保存天數 |
is_open |
是否開啟簽到機制 |
|
|
數據庫設計相關
1、商城用戶表添加下面兩個字段
last_signin_time 保存用戶上一次簽到時間
cont_days 保存用戶連續簽到天數
2、商城配置表添加一下字段
signin_configs 保存商城簽到功能配置信息(json格式化或者序列化都可以)
3、簽到日志表
表名:pre_signin_log |
功能:用於保存用戶簽到日志記錄 |
|||
字段 |
數據類型 |
屬性 |
約束條件 |
說明 |
id |
int(10) |
無符號、非空、自增 |
主鍵 |
主鍵id |
user_id |
int(10) |
無符號、非空、默認0 |
外鍵、普通索引(signin_user_id) |
用戶id |
integral_num |
int(5) |
無符號、非空、默認0 |
|
簽到獎勵積分 |
add_time |
int(11) |
無符號、非空、默認0 |
|
簽到時間 |
設計思路分析(用戶簽到操作時處理)
1、當天簽到就送積分的簡單模式(無需多言)
2、根據用戶連續簽到天數進行積分獎勵的復雜模式
連續性判斷:這個簡單,判斷昨天有沒有簽到就行
連續簽到次數判斷:根據連續性判斷結果,再判斷當天是不是周一,確定或者重置本周當前連續簽到次數
獎勵積分數實現:確定了連續簽到次數,就可以根據商城簽到配置信息確定當天簽到后該獎勵的積分數量並進行日志記錄和積分流水記錄操作
php 示例代碼(ecshop實現)
/** * 代碼中以文章開頭的假設為思路,具體根據商城配置做修改 */ function userSignin(){ if (!$_SESSION['user_id']) { return false; } $time = getdate(); $today_zero = mktime(0, 0, 0, $time['mon'], $time['mday'], $time['year']); $sql = "select last_signin_time from ".$GLOBALS['ecs']->table('users')." where user_id = '$_SESSION[user_id]'"; $last_signin_time = $GLOBALS['db']->getOne($sql); if($today_zero < $last_signin_time && $last_signin_time < ($today_zero + 24*60*60)){ // 今日已經簽到過了 array('error'=>true, 'msg'=>'你今日已經簽過到咯'); }else{ // 簽到處理 if($time['wday'] == 1){ // 如果是周一,簽到從零算起 $sql = "update ".$GLOBALS['ecs']->table('users')." set cont_days = 1, last_signin_time = ".time()." where user_id = '$_SESSION[user_id]'"; $GLOBALS['db']->query($sql); return array('error'=>false, 'msg'=>'簽到成功'); }else{ // 如果不是周一得判斷有沒有連續簽到,具體方法是判斷昨天有沒有簽到,如果簽到了,連續簽到次數加一,如果沒有簽到,連續次數歸一 if(($today_zero - 24 * 60 *60) < $last_signin_time && $last_signin_time < $today_zero){ // 昨天已經簽過到,連續簽到天數加一 $sql = "update ".$GLOBALS['ecs']->table('users')." set cont_days = cont_days + 1, last_signin_time = ".time()." where user_id = '$_SESSION[user_id]'"; $GLOBALS['db']->query($sql); $cont_days = $GLOBALS['db']->getOne("select cont_days from ".$GLOBALS['ecs']->table('users')." where user_id = '$_SESSION[user_id]'"); // 根據文章開頭的假設確定獎勵積分數量 switch ($cont_days) { case 3: $add_integrals = 1; break; case 5: $add_integrals = 2; break; case 7: $add_integrals = 3; break; default: break; } // code... // 簽到日志記錄操作和積分賬戶處理操作代碼省略…… if($add_integrals){ return array('error'=>false, 'msg'=>'你已經連續簽到 '.$cont_days.' 天,獲得獎勵 '.$add_integrals.' 積分'); }else{ return array('error'=>false, 'msg'=>'簽到成功'); } }else{ // 昨天沒有簽到,連續簽到天數歸一 $sql = "update ".$GLOBALS['ecs']->table('users')." set cont_days = 1, last_signin_time = ".time()." where user_id = '$_SESSION[user_id]'"; $GLOBALS['db']->query($sql); return array('error'=>false, 'msg'=>'簽到成功'); } } } } $signinRes = userSignin(); var_dump($signinRes); // 打印簽到結果