使用织梦做过下载站点的朋友可能知道,织梦的下载站会员是可以如果满足条件一日内是可以无限制下载的,这个对于某些“不太地道的”用户可 能会给服务器早成非常大的压力,这个时候我们一般是希望通过二次开发实现这样一种功能,对单用户会员实现单日下载次数的限制。说得直白一点就是限制会员每天的下载次数。说干就干,下面是361源码给大家分享的实现办法,如果对您有帮助请给个赞或者给我们技术一些狗粮打赏,如果您觉得没什么实际的意义也感谢您的访问:
1、首先在数据表dede_member增加一个字段记录日期和当日下载的软件的ID组成的一个字串,例如:“201701113|1##2##3”,这个样子我用的是varchar类型长度255,默认值就是“201701113|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 `dede_member` WHERE `mid`='{$cfg_ml->M_ID}'"; $dt = $dsql->GetOne($dtSql); if($dt['dtime'] == ''){ #没有对应记录,构建并记录更新用户记录 $dtStr = date('Ymd')."|".$id; $updtsql = "UPDATE `dede_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 `dede_member` SET `dtime`='{$dtNew}' WHERE `mid`='{$cfg_ml->M_ID}'"; $dsql->ExecNoneQuery($dtInsert); } } }else{ //echo 7; #不是今天,那么构建 $dtStr = date('Ymd')."|".$id; $updtsql = "UPDATE `dede_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 `dede_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); ?> 即可显示剩余的次数。
到这里就完成了改造,有需求的朋友可以自己尝试一下,处理前注意备份文件和数据库,防止出错!
以上就是织梦实现会员限制用户单日下载软件资源的上限方法的全部内容,希望对大家的学习和解决疑问有所帮助,也希望大家多多支持武林网。新闻热点
疑难解答