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