半小时给 dedecms 增加会员下载授信额度功能

0、缘起

客户有个 dede 制作的行业网站,提供相关资料下载,作为主要盈利手段的金币充值业务需要接入微信、支付宝等支付方式。但是如果每笔都单独进行支付的话手续费会比较高,因此采用充值某种会员来进行的话会更划算。
dede 本身提供了会员产品,可以通过购买会员产品来达到不同的用户级别。那么我们只需要给相应的用户等级设置对应的下载配额就可以控制这一等级的免费额度了。

业务逻辑上客户要求,用户购买的等级可以每月得到规定的授信次数,用完后继续和正常情况一样充值金币下载。到下个月又重新授信。

1、设置表结构

1.1、用户等级表增加 每月下载授信次数 字段:

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

1.2、 用户表增加当前月授信次数、更新月份、已用次数等字段


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 '下载授信使用次数' AFTER `download_month`,
ADD `download_credit` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT '下载授信次数' AFTER `download_counter`;

2、后台管理界面

后台主要在用户等级管理界面进行调整,增删改查的时候增加响应的界面和处理代码即可,这里贴出修改的上下文,可以自行对应修改

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 @@
       会员等级值
       默认金币
       默认积分
+      月免费下载次数
       类型
       状态
     
@@ -29,12 +30,13 @@
        {
          $k++;
        ?>
-
     
       
       
       
       
+      
       
       id<=5) { echo "系统"; }
@@ -55,6 +57,7 @@
        级别值(待审为0,注册会员为10) 
        默认金币 
        默认积分 
+      默认月免费下载次数
        操作设置 
        
     
@@ -63,6 +66,7 @@
       
       
       
+      
       
         增加等级 
        

3、前端功能调整

首先用户在自己的控制面板需要能够查看自己的剩余额度,然后在下载的时候优先使用授信额度,使用完毕后如果继续下载则继续充值金币。

3.1、include/memberlogin.class.php

每次实例化当前登录用户信息的时候,都检查以下是否需要更新授信额度,然后在展示用户等级的时候显示已用额度和总额度。

  //间隔一小时更新一次用户登录时间
                 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 .= " 剩余天数: ".$this->M_HasDay."  天 ";
                 elseif($this->M_Rank>10) $sta .= " 会员升级已经到期 ";
+                $sta .= sprintf('月免费下载次数 %d/%d', $this->M_DownloadCounter, $this->M_DownloadCredit);
+
           }
         }
         $sta .= " 拥有金币:{$this->M_Money} 个, 积分:{$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`
下载时在扣除金币的时候和之前一样,如果已经购买不再重复购买和使用授信额度。当需要购买时,优先使用剩余的授信额度,如果授信额度用完才继续进入购买金币流程。

```diff
@@ -196,25 +196,40 @@ else if($open==2)
             //未购买过此文章
             if( !is_array($row) )
             {
-                //没有足够的金币
-                if( $needMoney > $cfg_ml->M_Money || $cfg_ml->M_Money=='')
-                {
-                    $msgtitle = "你没有权限下载软件:{$arctitle}!";
-                    $moremsg = "这个软件需要 ".$needMoney." 金币 才能下载,你目前拥有金币:".$cfg_ml->M_Money." 个 !";
-                    include_once(DEDETEMPLATE.'/plus/view_msg.htm');
-                    exit(0);
+                // 会员等级有相应的下载授信额度,则直接扣减额度,扣减完毕后才需要购买
+                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('记录定单失败, 请返回', '-1');
+                        exit(0);
+                    }
+                    //记录已用授信次数
+                    $dsql->ExecuteNoneQuery("UPDATE `#@__member` SET download_counter = download_counter + 1 WHERE mid='".$cfg_ml->M_ID."'");
                 }
-                //有足够金币,记录用户信息
-                $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('记录定单失败, 请返回', '-1');
-                    exit(0);
+                else{
+                    //没有足够的金币
+                    if( $needMoney > $cfg_ml->M_Money || $cfg_ml->M_Money=='')
+                    {
+                        $msgtitle = "你没有权限下载软件:{$arctitle}!";
+                        $moremsg = "这个软件需要 ".$needMoney." 金币 才能下载,你目前拥有金币:".$cfg_ml->M_Money." 个 !";
+                        include_once(DEDETEMPLATE.'/plus/view_msg.htm');
+                        exit(0);
+                    }
+                    //有足够金币,记录用户信息
+                    $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('记录定单失败, 请返回', '-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、测试

  • 管理后台->会员产品分类->设置产品定价
  • 管理后台->会员级别设置->设置对应级别授信额度
  • 用户首页(http://mysite.com/member)->消费中心(http://mysite.com/member/buy.php)-会员升级 完成后可以回到首页查看个人的授信额度使用和剩余情况
  • 下载付费资料看是否不在需要付费,并且出现授信额度使用记录

5、总结

从修改开始修改代码到最后完成真心没超过半小时,但是在这之前我就觉得这个授信额度的每月重置功能如何设计很是闹心。增加定时任务?会员升级后马上处理?总之会引入各种问题,在思前想后想了很久才有这个办法:月份不对马上更新,授信额度不对马上更新,记录使用次数,比对时比对授信额度和已用次数即可,简单实用。
这个功能上上去了客户很满意,但是预算不多,我也没挣到钱,记录下来分享给大家,大家看着好的话打个赏?如果有效以后我会给大家分享更多。

你可能感兴趣的:(半小时给 dedecms 增加会员下载授信额度功能)