半小時(shí)給 dedecms 增加會(huì)員下載授信額度功能

0、緣起

客戶(hù)有個(gè) dede 制作的行業(yè)網(wǎng)站,提供相關(guān)資料下載,作為主要盈利手段的金幣充值業(yè)務(wù)需要接入微信、支付寶等支付方式。但是如果每筆都單獨(dú)進(jìn)行支付的話(huà)手續(xù)費(fèi)會(huì)比較高,因此采用充值某種會(huì)員來(lái)進(jìn)行的話(huà)會(huì)更劃算。
dede 本身提供了會(huì)員產(chǎn)品,可以通過(guò)購(gòu)買(mǎi)會(huì)員產(chǎn)品來(lái)達(dá)到不同的用戶(hù)級(jí)別。那么我們只需要給相應(yīng)的用戶(hù)等級(jí)設(shè)置對(duì)應(yīng)的下載配額就可以控制這一等級(jí)的免費(fèi)額度了。

業(yè)務(wù)邏輯上客戶(hù)要求,用戶(hù)購(gòu)買(mǎi)的等級(jí)可以每月得到規(guī)定的授信次數(shù),用完后繼續(xù)和正常情況一樣充值金幣下載。到下個(gè)月又重新授信。

1、設(shè)置表結(jié)構(gòu)

1.1、用戶(hù)等級(jí)表增加 每月下載授信次數(shù) 字段:

ALTER TABLE `dede_arcrank` ADD `download_credit` INT(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '每月下載授信次數(shù)' AFTER `scores`;

1.2、 用戶(hù)表增加當(dāng)前月授信次數(shù)、更新月份、已用次數(shù)等字段


ALTER TABLE `dede_member`
ADD `download_month` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT '下載授信月份' AFTER `checkmail`,
ADD `download_counter` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT '下載授信使用次數(shù)' AFTER `download_month`,
ADD `download_credit` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT '下載授信次數(shù)' AFTER `download_counter`;

2、后臺(tái)管理界面

后臺(tái)主要在用戶(hù)等級(jí)管理界面進(jìn)行調(diào)整,增刪改查的時(shí)候增加響應(yīng)的界面和處理代碼即可,這里貼出修改的上下文,可以自行對(duì)應(yīng)修改

2.1、dede/member_rank.php


//保存更改
 if($dopost=='save')
 {
@@ -25,11 +32,12 @@ if($dopost=='save')
         $rank = ${"rank_".$startID};
         $money = ${"money_".$startID};
         $scores = ${"scores_".$startID};
+        $download_credit = ${"download_credit_".$startID};
         if(isset(${"check_".$startID}))
         {
             if($rank>0)
             {
-                $query = "UPDATE `#@__arcrank` SET membername='$name',money='$money',rank='$rank',scores='$scores' WHERE id='$id' ";
+                $query = "UPDATE `#@__arcrank` SET membername='$name',money='$money',rank='$rank',scores='$scores',download_credit='$download_credit' WHERE id='$id' ";
             }
         }
         else
@@ -42,7 +50,7 @@ if($dopost=='save')
     {
         if($rank_new > 0 && $name_new != '' && $rank_new > 10)
         {
-            $inquery = "INSERT INTO `#@__arcrank`(`rank`,`membername`,`adminrank`,`money`,`scores`,`purviews`) VALUES('$rank_new','$name_new','5','$money_new','$scores',''); ";
+            $inquery = "INSERT INTO `#@__arcrank`(`rank`,`membername`,`adminrank`,`money`,`scores`,`download_credit`,`purviews`) VALUES('$rank_new','$name_new','5','$money_new','$scores', '$download_credit',''); ";
             $dsql->ExecuteNoneQuery($inquery);
         }
     }

2.2、dede/templets/member_rank.htm


@@ -20,6 +20,7 @@
       <td width="18%">會(huì)員等級(jí)值</td>
       <td width="15%">默認(rèn)金幣</td>
       <td width="15%">默認(rèn)積分</td>
+      <td width="15%">月免費(fèi)下載次數(shù)</td>
       <td width="16%">類(lèi)型</td>
       <td width="16%">狀態(tài)</td>
     </tr>
@@ -29,12 +30,13 @@
        {
          $k++;
        ?>
-
     <tr align="center" bgcolor="#FFFFFF" height="24">
       <td><input type="hidden" name="ID_<?php echo $k?>" value="<?php echo $row->id; ?>"><input name="name_<?php echo $k?>" value="<?php echo $row->membername; ?>" type="text" id="name_<?php echo $k?>" c
lass='autoinput alltxt' /></td>
       <td><input name="rank_<?php echo $k?>" value="<?php echo $row->rank; ?>"  type="text" id="rank_<?php echo $k?>" class='autoinput alltxt' /></td>
       <td><input name="money_<?php echo $k?>"  value="<?php echo $row->money; ?>"  type="text" id="money_<?php echo $k?>" class='autoinput alltxt' /></td>
       <td><input name="scores_<?php echo $k?>"  value="<?php echo $row->scores; ?>"  type="text" id="scores_<?php echo $k?>" class='autoinput alltxt' /></td>
+      <td><input name="download_credit_<?php echo $k?>"  value="<?php echo $row->download_credit; ?>"  type="text" id="download_credit_<?php echo $k?>" class='autoinput alltxt' /></td>
       <td align="center">
       <?php
          if($row->id<=5) { echo "系統(tǒng)"; }
@@ -55,6 +57,7 @@
       <td> 級(jí)別值(待審為0,注冊(cè)會(huì)員為10) </td>
       <td> 默認(rèn)金幣 </td>
       <td> 默認(rèn)積分 </td>
+      <td>默認(rèn)月免費(fèi)下載次數(shù)</td>
       <td> 操作設(shè)置 </td>
       <td>&nbsp;</td>
     </tr>
@@ -63,6 +66,7 @@
       <td><input name="rank_new" type="text" id="rank_new" value='20' class='autoinput alltxt'  /></td>
       <td><input name="money_new" type="text" id="money_new" value='0' class='autoinput alltxt' /></td>
       <td><input name="scores_new" type="text" id="scores_new" value='100' class='autoinput alltxt'  /></td>
+      <td><input name="download_credit_new" type="text" id="download_credit_new" value='0' class='autoinput alltxt'  /></td>
       <td><input name="check_new" type="checkbox" id="check_new" class="np" value="1" checked />
         增加等級(jí) </td>
       <td>&nbsp;</td>

3、前端功能調(diào)整

首先用戶(hù)在自己的控制面板需要能夠查看自己的剩余額度,然后在下載的時(shí)候優(yōu)先使用授信額度,使用完畢后如果繼續(xù)下載則繼續(xù)充值金幣。

3.1、include/memberlogin.class.php

每次實(shí)例化當(dāng)前登錄用戶(hù)信息的時(shí)候,都檢查以下是否需要更新授信額度,然后在展示用戶(hù)等級(jí)的時(shí)候顯示已用額度和總額度。

  //間隔一小時(shí)更新一次用戶(hù)登錄時(shí)間
                 if(time() - $this->M_LoginTime > 3600)
                 {
                     $dsql->ExecuteNoneQuery("update `#@__member` set logintime='".time()."',loginip='".GetIP()."' where mid='".$this->fields['mid']."';");
                     PutCookie("DedeLoginTime",time(),$this->M_KeepTime);
                 }
+                $this->updateDownloadCredit();

             if(!is_array($rs)){
                 if($this->M_Rank>10 && $this->M_HasDay>0) $sta .= " 剩余天數(shù): <font color='red'>".$this->M_HasDay."</font>  天 ";
                 elseif($this->M_Rank>10) $sta .= " <font color='red'>會(huì)員升級(jí)已經(jīng)到期</font> ";
+                $sta .= sprintf('月免費(fèi)下載次數(shù) %d/%d', $this->M_DownloadCounter, $this->M_DownloadCredit);
+
           }
         }
         $sta .= " 擁有金幣:{$this->M_Money} 個(gè), 積分:{$this->M_Scores} 分。";
         return $sta;
     }
-
+    function updateDownloadCredit(){
+        global $dsql;
+        $dc_month = date('Ym');
+        $rank = $dsql->GetOne("Select membername,download_credit From `#@__arcrank` where rank='".$this->M_Rank."'");
+        $this->M_DownloadCredit = $rank['download_credit'];
+        $this->M_DownloadMonth = $this->fields['download_month'];
+        if($this->M_DownloadMonth < $dc_month){
+            $dsql->ExecuteNoneQuery("UPDATE `#@__member`
+                SET download_month=$dc_month,
+                download_credit = {$rank['download_credit']}
+                download_counter = 0
+                WHERE mid='".$this->M_ID."'");
+        }
+        $this->M_DownloadCounter = $this->fields['download_counter'];
+        $this->M_DownloadMonth = $dc_month;
+    }

### 3.2、`plus/download.php`
下載時(shí)在扣除金幣的時(shí)候和之前一樣,如果已經(jīng)購(gòu)買(mǎi)不再重復(fù)購(gòu)買(mǎi)和使用授信額度。當(dāng)需要購(gòu)買(mǎi)時(shí),優(yōu)先使用剩余的授信額度,如果授信額度用完才繼續(xù)進(jìn)入購(gòu)買(mǎi)金幣流程。

```diff
@@ -196,25 +196,40 @@ else if($open==2)
             //未購(gòu)買(mǎi)過(guò)此文章
             if( !is_array($row) )
             {
-                //沒(méi)有足夠的金幣
-                if( $needMoney > $cfg_ml->M_Money || $cfg_ml->M_Money=='')
-                {
-                    $msgtitle = "你沒(méi)有權(quán)限下載軟件:{$arctitle}!";
-                    $moremsg = "這個(gè)軟件需要 <font color='red'>".$needMoney." 金幣</font> 才能下載,你目前擁有金幣:<font color='red'>".$cfg_ml->M_Money." 個(gè)</font> !";
-                    include_once(DEDETEMPLATE.'/plus/view_msg.htm');
-                    exit(0);
+                // 會(huì)員等級(jí)有相應(yīng)的下載授信額度,則直接扣減額度,扣減完畢后才需要購(gòu)買(mǎi)
+                if($cfg_ml->M_Rank && $cfg_ml->M_DownloadCredit && $cfg_ml->M_DownloadCounter < $cfg_ml->M_DownloadCredit){
+                     $inquery = "INSERT INTO `#@__member_operation`(mid,oldinfo,money,mtime,buyid,product,pname,sta)
+                      VALUES ('".$cfg_ml->M_ID."','$arctitle','$needMoney','".time()."', 'ARCHIVE".$id."', 'archive','下載軟件(授信)', 2); ";
+                    //記錄定單
+                    if( !$dsql->ExecuteNoneQuery($inquery) )
+                    {
+                        ShowMsg('記錄定單失敗, 請(qǐng)返回', '-1');
+                        exit(0);
+                    }
+                    //記錄已用授信次數(shù)
+                    $dsql->ExecuteNoneQuery("UPDATE `#@__member` SET download_counter = download_counter + 1 WHERE mid='".$cfg_ml->M_ID."'");
                 }
-                //有足夠金幣,記錄用戶(hù)信息
-                $inquery = "INSERT INTO `#@__member_operation`(mid,oldinfo,money,mtime,buyid,product,pname,sta)
-                  VALUES ('".$cfg_ml->M_ID."','$arctitle','$needMoney','".time()."', 'ARCHIVE".$id."', 'archive','下載軟件', 2); ";
-                //記錄定單
-                if( !$dsql->ExecuteNoneQuery($inquery) )
-                {
-                    ShowMsg('記錄定單失敗, 請(qǐng)返回', '-1');
-                    exit(0);
+                else{
+                    //沒(méi)有足夠的金幣
+                    if( $needMoney > $cfg_ml->M_Money || $cfg_ml->M_Money=='')
+                    {
+                        $msgtitle = "你沒(méi)有權(quán)限下載軟件:{$arctitle}!";
+                        $moremsg = "這個(gè)軟件需要 <font color='red'>".$needMoney." 金幣</font> 才能下載,你目前擁有金幣:<font color='red'>".$cfg_ml->M_Money." 個(gè)</font> !";
+                        include_once(DEDETEMPLATE.'/plus/view_msg.htm');
+                        exit(0);
+                    }
+                    //有足夠金幣,記錄用戶(hù)信息
+                    $inquery = "INSERT INTO `#@__member_operation`(mid,oldinfo,money,mtime,buyid,product,pname,sta)
+                      VALUES ('".$cfg_ml->M_ID."','$arctitle','$needMoney','".time()."', 'ARCHIVE".$id."', 'archive','下載軟件', 2); ";
+                    //記錄定單
+                    if( !$dsql->ExecuteNoneQuery($inquery) )
+                    {
+                        ShowMsg('記錄定單失敗, 請(qǐng)返回', '-1');
+                        exit(0);
+                    }
+                    //扣除金幣
+                    $dsql->ExecuteNoneQuery("UPDATE `#@__member` SET money = money - $needMoney WHERE mid='".$cfg_ml->M_ID."'");
                 }
-                //扣除金幣
-                $dsql->ExecuteNoneQuery("UPDATE `#@__member` SET money = money - $needMoney WHERE mid='".$cfg_ml->M_ID."'");
             }
         }
     }

4、測(cè)試

  • 管理后臺(tái)->會(huì)員產(chǎn)品分類(lèi)->設(shè)置產(chǎn)品定價(jià)
  • 管理后臺(tái)->會(huì)員級(jí)別設(shè)置->設(shè)置對(duì)應(yīng)級(jí)別授信額度
  • 用戶(hù)首頁(yè)(http://mysite.com/member)->消費(fèi)中心(http://mysite.com/member/buy.php)-會(huì)員升級(jí) 完成后可以回到首頁(yè)查看個(gè)人的授信額度使用和剩余情況
  • 下載付費(fèi)資料看是否不在需要付費(fèi),并且出現(xiàn)授信額度使用記錄

5、總結(jié)

從修改開(kāi)始修改代碼到最后完成真心沒(méi)超過(guò)半小時(shí),但是在這之前我就覺(jué)得這個(gè)授信額度的每月重置功能如何設(shè)計(jì)很是鬧心。增加定時(shí)任務(wù)?會(huì)員升級(jí)后馬上處理?總之會(huì)引入各種問(wèn)題,在思前想后想了很久才有這個(gè)辦法:月份不對(duì)馬上更新,授信額度不對(duì)馬上更新,記錄使用次數(shù),比對(duì)時(shí)比對(duì)授信額度和已用次數(shù)即可,簡(jiǎn)單實(shí)用。
這個(gè)功能上上去了客戶(hù)很滿(mǎn)意,但是預(yù)算不多,我也沒(méi)掙到錢(qián),記錄下來(lái)分享給大家,大家看著好的話(huà)打個(gè)賞?如果有效以后我會(huì)給大家分享更多。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容