Graent.Hu 的博客

新浪微薄腾讯微薄

最新碎语:最近感觉有些迷茫,怎么办~

您的位置:Graent.Hu 的博客 >PHP编程> DEDECMS实现会员限制单用户单日下载软件资源的上限方法

DEDECMS实现会员限制单用户单日下载软件资源的上限方法

    这个功能本来是一个客户需要的,其实想一下逻辑还是很清晰的,就是在现在的时候对用户的会员级别还有相关的软件资源的设置进行处理,我是这么处理的,如果对您有帮助请给个赞,如果您觉得没什么实际的意义也感谢您的访问:

    1,首先在数据表#@__member增加一个字段记录日期和当日下载的软件的ID组成的一个字串,例如:“20170407|1##2##3”,这个样子我用的是varchar类型长度255,默认值就是“20170407|1##2##3”

    2,在后台-系统-系统基本参数-增加一个系统参数,我选择分类是站点设置,这里主要是设置下载的上限值,类型数字型,说明“单用户单日下载次数上限”,名称是“cfg_dlimit”,测试期间我设置的是3

    3,在plus目录下找到download.php在如下位置增加下面一段代码(大约190行之下,会员级别判断之下):


//判断下载次数是否达到当日上限
        if($cfg_ml->M_Rank > $needRank && $needMoney > 0){
            if(isset($GLOBALS['cfg_dlimit']) && $GLOBALS['cfg_dlimit'] > 0 ){
                $dtSql = "SELECT `dtime` FROM `#@__member` WHERE `mid`='{$cfg_ml->M_ID}'";
                $dt = $dsql->GetOne($dtSql);
                if($dt['dtime'] == ''){
                    #没有对应记录,构建并记录更新用户记录
                    $dtStr = date('Ymd')."|".$id;
                    $updtsql = "UPDATE `#@__member` SET `dtime`='{$dtStr}' WHERE `mid`='{$cfg_ml->M_ID}'";
                    $dsql->ExecuteNoneQuery($updtsql);
                }else{
                    #有记录,开始拆分判断并且进行计算处理
                    $tmp = explode('|', $dt['dtime']);
                    #判断记录日期是否是今天,是则返回剩余次数,不是则返回系统限制上限
                    $today = date('Ymd');
                    if($today == $tmp[0]){
                        $arr = explode('##',$tmp[1]);
                        #判断当前id是否包含在内
                        if(!in_array($id, $arr)){
                            #判断总下载次数
                            if(count($arr) >=  $GLOBALS['cfg_dlimit']){
                                #超限,不予下载
                                $msgtitle = "你不能下载软件:{$arctitle}!";
                                $moremsg = "你今日的下载上限 <font color='red'>".$GLOBALS['cfg_dlimit']." 次</font> 已满!";
                                include_once(DEDETEMPLATE.'/plus/view_msg.htm');
                                exit(0);
                            }else{
                                $newArr = array_merge($arr,[$id]);
                                // echo $id;
                                // print_r($arr);
                                // print_r($newArr);
                                // //echo $a = implode(',', $newArr);
                                $dtNew = date('Ymd')."|".implode('##', $newArr);
                                #未超限,更新下载id记录
                                $dtInsert = "UPDATE `#@__member` SET `dtime`='{$dtNew}' WHERE `mid`='{$cfg_ml->M_ID}'";
                                $dsql->ExecNoneQuery($dtInsert);
                            }
                        }
                    }else{
                        //echo 7;
                        #不是今天,那么构建
                        $dtStr = date('Ymd')."|".$id;
                        $updtsql = "UPDATE `#@__member` SET `dtime`='{$dtStr}' WHERE `mid`='{$cfg_ml->M_ID}'";
                        $dsql->ExecuteNoneQuery($updtsql);
                    }
                }
            }//-----
        }

  逻辑是,指定下载权限以上的用户受限,小于或者等于权限的用户不受限,免费资源不受限,重复下载不计次数。

    4,如果亲想在后台显示用户当日剩余的下载次数,那么修改如下两个文件,dede/member_main.php和dede/templets/member_main.htm

dede/member_main.php 文件最下面增加:


//
function GetDtime($dt){
    if($dt == ''){
        return $GLOBALS['cfg_dlimit'];
    }else{
        $tmp = explode('|', $dt);
        #判断记录日期是否是今天,是则返回剩余次数,不是则返回系统限制上限
        $today = date('Ymd');
        if($today == $tmp[0]){
            $arr = explode('##',$tmp[1]);
            return is_array($arr) ? $GLOBALS['cfg_dlimit'] - count($arr) : $GLOBALS['cfg_dlimit'];
        }else{
            return $GLOBALS['cfg_dlimit'];
        }
    }
}
dede/templets/member_main.htm 文件修改第130行:



金币:{dede:field.money /} 积分:{dede:field.scores /}
  为:



金币:{dede:field.money /} 积分:{dede:field.scores /} 剩下:{dede:field.dtime function="GetDtime(@me)" /}
  后台在注册会员别变即可查看到需要的值


    5,如果想在用户中心显示当前登录会员的当日下载剩余次数,那么修改 include/memberlogin.class.php,在第390行之下(重置用户信息之下),增加如下代码:


/**
        获取当前用户当然下载限制剩余量
    */
    function GetDtime($dsql){
        $mid = $this->M_ID;
        $dt = $dsql->GetOne("Select `dtime` from `#@__member` where mid='$mid' ");
        if($dt['dtime'] == ''){
            return $GLOBALS['cfg_dlimit'];
        }else{
            $tmp = explode('|', $dt['dtime']);
            #判断记录日期是否是今天,是则返回剩余次数,不是则返回系统限制上限
            $today = date('Ymd');
            if($today == $tmp[0]){
                $arr = explode('##',$tmp[1]);
                return is_array($arr) ? $GLOBALS['cfg_dlimit'] - count($arr) : $GLOBALS['cfg_dlimit'];
            }else{
                return $GLOBALS['cfg_dlimit'];
            }
        }
    }
  然后在用户中心使用 <?php echo $cfg_ml->GetDtime($dsql); ?> 即可显示剩余的次数。



  原创文章,转载请注明出处


我的微信:graent_hu

欢迎扫码加我和微信好友,有什么问题我们可以一起探讨,有什么需要也随时欢迎发消息给我~

转载请注明出处:

本文标题:DEDECMS实现会员限制单用户单日下载软件资源的上限方法

本文链接:https://www.wlyc.cn/post-73.html

发表评论

路人甲 表情
看不清楚?点图切换

网友评论(7)

我在数据库字段直接添加比如20170707|1##2##3 数字类型
奥利奥 2年前 (2017-07-07) 回复
@奥利奥:不是数字类型 这个是一个字串  字段名 dtime varchar(255) default '20170407|1##2##3'
9ra3nt 2年前 (2017-07-08) 回复
这代码是你写的吗?我用了之后只看到后台减少下载次数,比如我限制单日1次,都成-2还是可以下载另外的软件ID文章。完全没有提升不可以下载。当我切换 PHP5.2的时候会出现 Parse error: syntax error, unexpected '[' in plus\download.php on line 239 。查到 $newArr = array_merge($arr,[$id]);
奥利奥 2年前 (2017-07-07) 回复
@奥利奥:数组的 $array = []; 用法要在5.3以上  之前的版本是不支持的 包括namespace这些5.2都是不支持的,php现在都已经到7了 所以建议还是考虑用高版本的,如果用高版本的提示 DedeCMS错误(PHP 5.3 and above) Please set 'request_order'的解决办法 可以参考 https://www.wlyc.cn/post-66.html 使用高版本的
9ra3nt 2年前 (2017-07-08) 回复
@奥利奥:至于为什么不提示 并且减少到了负数,是因为你下载判断还有减少数字的逻辑不正确,要么位置不对,要么就是判断条件不正确  仔细检查一下,如果你是之前做过二开的程序可能行数有区别,主要看具体位置 行数主要是参考
9ra3nt 2年前 (2017-07-08) 回复
请问记录日期和下载次数据库中语法应该怎么写?
奥利奥 2年前 (2017-07-06) 回复
@奥利奥:如果按照上面的方法的话,只需要在记录下载的地方加上两句记录下载次数就可以了,字段也自己加就行
9ra3nt 2年前 (2017-07-07) 回复