商城簽到功能的設計與實現

需求分析         

  一、用戶當天登陸商城,只要簽到就直接獎勵必定的積分或者根據用戶本週或者本月內已經連續簽到的天數進行積分獎勵,後臺能夠設置具體的獎勵規則,這裏假設本週內連續登陸三天獎勵 1 積分,五天獎勵 2 積分,七天獎勵 3 積分,每週一簽到次數歸零(歸零方法不必定是每週一簽到次數自動設爲零,詳見下文)php

  二、實現形式:在我的中心放置簽到按鈕或者登陸成功以後進行彈窗提示sql

  三、我的中心,用戶能夠看到簽到日誌(若是設置日誌記錄的話)和積分流水數據庫

  四、商城後臺能夠對簽到送積分的規則進行設置,也能夠看到簽到日子和積分流水,具體規則包括:一、獎勵模式 二、相應模式配置 三、日誌記錄 四、是否開啓等,具體詳見簽到配置表json

簽到配置列表,這些配置信息能夠格式化之後做爲商城的一項配置數組

type數據庫設計

簽到模式(當天簽到就有獎勵(1)、連續簽到必定天數會有不一樣獎勵(2))spa

configs設計

type爲1時,表示天天簽到獎勵積分數;type爲2時,表示連續簽到天數以及獎勵階梯(能夠做爲數組元素並存)日誌

open_logcode

是否記錄簽到日誌

save_days

簽到日誌保存天數

is_open

是否開啓簽到機制

 

 

數據庫設計相關

  一、商城用戶表添加下面兩個字段

    last_signin_time 保存用戶上一次簽到時間

    cont_days 保存用戶連續簽到天數

  二、商城配置表添加一下字段

    signin_configs 保存商城簽到功能配置信息(json格式化或者序列化均可以

  三、簽到日誌表

表名: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

 

簽到時間

設計思路分析(用戶簽到操做時處理

  一、當天簽到就送積分的簡單模式(無需多言)

  二、根據用戶連續簽到天數進行積分獎勵的複雜模式

    連續性判斷:這個簡單,判斷昨天有沒有簽到就行

    連續簽到次數判斷:根據連續性判斷結果,再判斷當天是否是週一,肯定或者重置本週當前連續簽到次數

    獎勵積分數實現:肯定了連續簽到次數,就能夠根據商城簽到配置信息肯定當天簽到後該獎勵的積分數量並進行日誌記錄和積分流水記錄操做

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);  // 打印簽到結果 
相關文章
相關標籤/搜索