dedecms織夢增加會員下載授權額度功能教程


客戶有個 dede 制作的行業網站,提供相關資料下載,作為主要盈利手段的金幣充值業務需要接入微信、支付寶等支付方式。但是如果每筆都單獨進行支付的話手續費會比較高,因此采用充值某種會員來進行的話會更划算。
dede 本身提供了會員產品,可以通過購買會員產品來達到不同的用戶級別。那么我們只需要給相應的用戶等級設置對應的下載配額就可以控制這一等級的免費額度了。

業務邏輯上客戶要求,用戶購買的等級可以每月得到規定的授信次數,用完后繼續和正常情況一樣充值金幣下載。到下個月又重新授信。


1、設置表結構

1.1、用戶等級表增加 每月下載授信次數 字段:

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

1.2、 用戶表增加當前月授信次數、更新月份、已用次數等字段

1 ALTER TABLE `dede_member`
2 ADD `download_month` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT '下載授信月份' AFTER `checkmail`,
3 ADD `download_counter` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT '下載授信使用次數' AFTER `download_month`,
4 ADD `download_credit` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT '下載授信次數'AFTER `download_counter`;

2、后台管理界面

后台主要在用戶等級管理界面進行調整,增刪改查的時候增加響應的界面和處理代碼即可,這里貼出修改的上下文,可以自行對應修改

2.1、dede/member_rank.php

01 //保存更改
02  if($dopost=='save')
03  {
04 @@ -25,11 +32,12 @@ if($dopost=='save')
05          $rank = ${"rank_".$startID};
06          $money = ${"money_".$startID};
07          $scores = ${"scores_".$startID};
08 +        $download_credit = ${"download_credit_".$startID};
09          if(isset(${"check_".$startID}))
10          {
11              if($rank>0)
12              {
13 -                $query = "UPDATE `qm_arcrank` SET membername='$name',money='$money',rank='$rank',scores='$scores' WHERE id='$id' ";
14 +                $query = "UPDATE `qm_arcrank` SET membername='$name',money='$money',rank='$rank',scores='$scores',download_credit='$download_credit' WHERE id='$id' ";
15              }
16          }
17          else
18 @@ -42,7 +50,7 @@ if($dopost=='save')
19      {
20          if($rank_new > 0 && $name_new != '' && $rank_new > 10)
21          {
22 -            $inquery = "INSERT INTO `qm_arcrank`(`rank`,`membername`,`adminrank`,`money`,`scores`,`purviews`) VALUES('$rank_new','$name_new','5','$money_new','$scores',''); ";
23 +            $inquery = "INSERT INTO `qm_arcrank`(`rank`,`membername`,`adminrank`,`money`,`scores`,`download_credit`,`purviews`) VALUES('$rank_new','$name_new','5','$money_new','$scores', '$download_credit',''); ";
24              $dsql->ExecuteNoneQuery($inquery);
25          }
26      }

2.2、dede/templets/member_rank.htm

01 @@ -20,6 +20,7 @@
02        <td width="18%">會員等級值</td>
03        <td width="15%">默認金幣</td>
04        <td width="15%">默認積分</td>
05 +      <td width="15%">月免費下載次數</td>
06        <td width="16%">類型</td>
07        <td width="16%">狀態</td>
08      </tr>
09 @@ -29,12 +30,13 @@
10         {
11           $k++;
12         ?>
13 -
14      <tr align="center" bgcolor="#FFFFFF" height="24">
15        <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
16 lass='autoinput alltxt' /></td>
17        <td><input name="rank_<?php echo $k?>" value="<?php echo $row->rank; ?>"  type="text" id="rank_<?php echo $k?>" class='autoinput alltxt' /></td>
18        <td><input name="money_<?php echo $k?>"  value="<?php echo $row->money; ?>"  type="text" id="money_<?php echo $k?>" class='autoinput alltxt' /></td>
19        <td><input name="scores_<?php echo $k?>"  value="<?php echo $row->scores; ?>"  type="text" id="scores_<?php echo $k?>" class='autoinput alltxt' /></td>
20 +      <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>
21        <td align="center">
22        <?php
23           if($row->id<=5) { echo "系統"; }
24 @@ -55,6 +57,7 @@
25        <td> 級別值(待審為0,注冊會員為10) </td>
26        <td> 默認金幣 </td>
27        <td> 默認積分 </td>
28 +      <td>默認月免費下載次數</td>
29        <td> 操作設置 </td>
30        <td>&nbsp;</td>
31      </tr>
32 @@ -63,6 +66,7 @@
33        <td><input name="rank_new" type="text" id="rank_new" value='20' class='autoinput alltxt'  /></td>
34        <td><input name="money_new" type="text" id="money_new" value='0' class='autoinput alltxt' /></td>
35        <td><input name="scores_new" type="text" id="scores_new" value='100' class='autoinput alltxt'  /></td>
36 +      <td><input name="download_credit_new" type="text" id="download_credit_new" value='0' class='autoinput alltxt'  /></td>
37        <td><input name="check_new" type="checkbox" id="check_new" class="np" value="1" checked />
38          增加等級 </td>
39        <td>&nbsp;</td>

3、前端功能調整

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

3.1、include/memberlogin.class.php

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

01 //間隔一小時更新一次用戶登錄時間
02                  if(time() - $this->M_LoginTime > 3600)
03                  {
04                      $dsql->ExecuteNoneQuery("update `qm_member` set logintime='".time()."',loginip='".GetIP()."' where mid='".$this->fields['mid']."';");
05                      PutCookie("DedeLoginTime",time(),$this->M_KeepTime);
06                  }
07 +                $this->updateDownloadCredit();
08  
09              if(!is_array($rs)){
10                  if($this->M_Rank>10 && $this->M_HasDay>0) $sta .= " 剩余天數: <font color='red'>".$this->M_HasDay."</font>  天 ";
11                  elseif($this->M_Rank>10) $sta .= " <font color='red'>會員升級已經到期</font> ";
12 +                $sta .= sprintf('月免費下載次數 %d/%d', $this->M_DownloadCounter, $this->M_DownloadCredit);
13 +
14            }
15          }
16          $sta .= " 擁有金幣:{$this->M_Money} 個, 積分:{$this->M_Scores} 分。";
17          return $sta;
18      }
19 -
20 +    function updateDownloadCredit(){
21 +        global $dsql;
22 +        $dc_month = date('Ym');
23 +        $rank = $dsql->GetOne("Select membername,download_credit From `qm_arcrank` where rank='".$this->M_Rank."'");
24 +        $this->M_DownloadCredit = $rank['download_credit'];
25 +        $this->M_DownloadMonth = $this->fields['download_month'];
26 +        if($this->M_DownloadMonth < $dc_month){
27 +            $dsql->ExecuteNoneQuery("UPDATE `qm_member`
28 +                SET download_month=$dc_month,
29 +                download_credit = {$rank['download_credit']}
30 +                download_counter = 0
31 +                WHERE mid='".$this->M_ID."'");
32 +        }
33 +        $this->M_DownloadCounter = $this->fields['download_counter'];
34 +        $this->M_DownloadMonth = $dc_month;
35 +    }
36  
37 ### 3.2、`plus/download.php`
38 下載時在扣除金幣的時候和之前一樣,如果已經購買不再重復購買和使用授信額度。當需要購買時,優先使用剩余的授信額度,如果授信額度用完才繼續進入購買金幣流程。
39  
40 ```diff
41 @@ -196,25 +196,40 @@ else if($open==2)
42              //未購買過此文章
43              if( !is_array($row) )
44              {
45 -                //沒有足夠的金幣
46 -                if( $needMoney > $cfg_ml->M_Money || $cfg_ml->M_Money=='')
47 -                {
48 -                    $msgtitle = "你沒有權限下載軟件:{$arctitle}!";
49 -                    $moremsg = "這個軟件需要 <font color='red'>".$needMoney." 金幣</font> 才能下載,你目前擁有金幣:<font color='red'>".$cfg_ml->M_Money." 個</font> !";
50 -                    include_once(DEDETEMPLATE.'/plus/view_msg.htm');
51 -                    exit(0);
52 +                // 會員等級有相應的下載授信額度,則直接扣減額度,扣減完畢后才需要購買
53 +                if($cfg_ml->M_Rank && $cfg_ml->M_DownloadCredit && $cfg_ml->M_DownloadCounter < $cfg_ml->M_DownloadCredit){
54 +                     $inquery = "INSERT INTO `qm_member_operation`(mid,oldinfo,money,mtime,buyid,product,pname,sta)
55 +                      VALUES ('".$cfg_ml->M_ID."','$arctitle','$needMoney','".time()."''ARCHIVE".$id."''archive','下載軟件(授信)', 2); ";
56 +                    //記錄定單
57 +                    if( !$dsql->ExecuteNoneQuery($inquery) )
58 +                    {
59 +                        ShowMsg('記錄定單失敗, 請返回''-1');
60 +                        exit(0);
61 +                    }
62 +                    //記錄已用授信次數
63 +                    $dsql->ExecuteNoneQuery("UPDATE `qm_member` SET download_counter = download_counter + 1 WHERE mid='".$cfg_ml->M_ID."'");
64                  }
65 -                //有足夠金幣,記錄用戶信息
66 -                $inquery = "INSERT INTO `qm_member_operation`(mid,oldinfo,money,mtime,buyid,product,pname,sta)
67 -                  VALUES ('".$cfg_ml->M_ID."','$arctitle','$needMoney','".time()."''ARCHIVE".$id."''archive','下載軟件', 2); ";
68 -                //記錄定單
69 -                if( !$dsql->ExecuteNoneQuery($inquery) )
70 -                {
71 -                    ShowMsg('記錄定單失敗, 請返回''-1');
72 -                    exit(0);
73 +                else{
74 +                    //沒有足夠的金幣
75 +                    if( $needMoney > $cfg_ml->M_Money || $cfg_ml->M_Money=='')
76 +                    {
77 +                        $msgtitle = "你沒有權限下載軟件:{$arctitle}!";
78 +                        $moremsg = "這個軟件需要 <font color='red'>".$needMoney." 金幣</font> 才能下載,你目前擁有金幣:<font color='red'>".$cfg_ml->M_Money." 個</font> !";
79 +                        include_once(DEDETEMPLATE.'/plus/view_msg.htm');
80 +                        exit(0);
81 +                    }
82 +                    //有足夠金幣,記錄用戶信息
83 +                    $inquery = "INSERT INTO `qm_member_operation`(mid,oldinfo,money,mtime,buyid,product,pname,sta)
84 +                      VALUES ('".$cfg_ml->M_ID."','$arctitle','$needMoney','".time()."''ARCHIVE".$id."''archive','下載軟件', 2); ";
85 +                    //記錄定單
86 +                    if( !$dsql->ExecuteNoneQuery($inquery) )
87 +                    {
88 +                        ShowMsg('記錄定單失敗, 請返回''-1');
89 +                        exit(0);
90 +                    }
91 +                    //扣除金幣
92 +                    $dsql->ExecuteNoneQuery("UPDATE `qm_member` SET money = money - $needMoney WHERE mid='".$cfg_ml->M_ID."'");
93                  }
94 -                //扣除金幣
95 -                $dsql->ExecuteNoneQuery("UPDATE `qm_member` SET money = money - $needMoney WHERE mid='".$cfg_ml->M_ID."'");
96              }
97          }
98      }

4、測試

  • 管理后台->會員產品分類->設置產品定價
  • 管理后台->會員級別設置->設置對應級別授信額度
  • 用戶首頁(http://mysite.com/member)->消費中心(http://mysite.com/member/buy.php)-會員升級 完成后可以回到首頁查看個人的授信額度使用和剩余情況
  • 下載付費資料看是否不在需要付費,並且出現授信額度使用記錄

5、總結

從修改開始修改代碼到最后完成真心沒超過半小時,但是在這之前我就覺得這個授信額度的每月重置功能如何設計很是鬧心。增加定時任務?會員升級后馬上處理?總之會引入各種問題,在思前想后想了很久才有這個辦法:月份不對馬上更新,授信額度不對馬上更新,記錄使用次數,比對時比對授信額度和已用次數即可,簡單實用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM