哥斯拉 发表于 2022-6-9 17:37:20

附件下载记录,有些用户组下载附件不扣积分,但是下载.....

附件下载记录,有些用户组下载附件不扣积分,但是下载怎么也把记录到里面。
类型图中框架的



怎么修改

Discuz智能体 发表于 2025-3-17 12:30:16

在Discuz!中,附件下载记录的功能通常是通过插件或自定义代码实现的。如果你希望某些用户组在下载附件时不扣积分,但仍然记录下载行为,可以通过以下步骤进行修改:

### 1. 修改下载逻辑
首先,你需要找到处理附件下载的代码部分。通常,这部分代码位于 `source/module/forum/forum_attachment.php` 文件中。

#### 1.1 找到下载扣积分的逻辑
在 `forum_attachment.php` 文件中,找到处理附件下载扣积分的代码部分。通常,这部分代码会检查用户组权限,并根据用户组决定是否扣积分。

if ($_G['group']['allowdownload'] && !$attach['isimage']) {
    // 扣积分的逻辑
    if (!in_array($_G['groupid'], array(1, 2, 3))) { // 假设1,2,3是不扣积分的用户组
      // 扣积分操作
      updatecreditbyaction('download', $_G['uid'], array(), $attach['aid']);
    }
}

#### 1.2 修改代码
你可以修改上述代码,使得某些用户组在下载附件时不扣积分,但仍然记录下载行为。例如:

if ($_G['group']['allowdownload'] && !$attach['isimage']) {
    // 记录下载行为
    C::t('forum_attachment_downloadlog')->insert(array(
      'uid' => $_G['uid'],
      'aid' => $attach['aid'],
      'dateline' => TIMESTAMP,
    ));

    // 扣积分的逻辑
    if (!in_array($_G['groupid'], array(1, 2, 3))) { // 假设1,2,3是不扣积分的用户组
      // 扣积分操作
      updatecreditbyaction('download', $_G['uid'], array(), $attach['aid']);
    }
}

### 2. 修改下载记录逻辑
如果你希望某些用户组的下载行为不被记录,可以在记录下载行为的代码中添加条件判断。

if ($_G['group']['allowdownload'] && !$attach['isimage']) {
    // 记录下载行为
    if (!in_array($_G['groupid'], array(4, 5, 6))) { // 假设4,5,6是不记录下载行为的用户组
      C::t('forum_attachment_downloadlog')->insert(array(
            'uid' => $_G['uid'],
            'aid' => $attach['aid'],
            'dateline' => TIMESTAMP,
      ));
    }

    // 扣积分的逻辑
    if (!in_array($_G['groupid'], array(1, 2, 3))) { // 假设1,2,3是不扣积分的用户组
      // 扣积分操作
      updatecreditbyaction('download', $_G['uid'], array(), $attach['aid']);
    }
}

### 3. 测试修改
完成上述修改后,建议你在测试环境中进行测试,确保修改后的代码能够正常工作,并且不会影响其他功能。

### 4. 部署到生产环境
测试通过后,将修改后的代码部署到生产环境中。

### 5. 注意事项
- 在修改代码之前,建议备份相关文件,以防修改出错导致系统无法正常运行。
- 如果你对代码不熟悉,建议在开发环境中进行测试,或者寻求专业开发人员的帮助。

通过以上步骤,你可以实现某些用户组在下载附件时不扣积分,但仍然记录下载行为的功能。如果你有更多问题,欢迎继续提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。

Discuz智能体 发表于 2025-3-20 21:39:02

关于Discuz附件下载记录的修改方案,需要从用户组权限、积分逻辑及下载触发机制三个方面进行调整。以下是具体实现步骤:

1. 用户组权限二次校验
在`source/module/forum/forum_attachment.php`中找到扣积分逻辑区块(约第320行),增加组权限判断:

// 原扣积分代码
if($attach['price'] > 0 && !$ispaid) {
    // 扣分逻辑
}

// 修改后增加:
$groupid = $_G['groupid']; // 获取当前用户组
$no_record_groups = array(4, 5); // 不记录的用户组ID数组

if(!in_array($groupid, $no_record_groups)) {
    // 记录下载日志
    C::t('forum_attachmentlog')->insert(array(
      'tid' => $attach['tid'],
      'pid' => $attach['pid'],
      'uid' => $_G['uid'],
      'dateline' => TIMESTAMP
    ));
}

2. 积分扣除与记录解耦处理
在`source/function/function_forum.php`中定位`updatecredits`函数,增加前置判断:

function updatecredits($uid, $extcredits, $needcheck = true, $coef = 1, $update = true, $type='') {
    global $_G;
   
    // 新增用户组判断
    if(in_array($_G['groupid'], array(4,5)) && $type == 'attach') {
      return false; // 特定用户组跳过积分操作
    }
   
    // 原积分处理逻辑
}

3. 前端下载触发改造
在`template/default/forum/discuzcode.htm`模板中修改下载按钮事件:

<!--{if $_G['group']['allowgetattach']}-->
    <a href="forum.php?mod=attachment{$is_archive}&aid=$aidencode"
       onclick="return handleDownload({$_G['groupid']}, this)">
      下载附件
    </a>
<!--{/if}-->

<script>
function handleDownload(groupId, link) {
    const noRecordGroups = ;
    const url = new URL(link.href);
   
    if(noRecordGroups.includes(groupId)) {
      url.searchParams.append('nolog', 1);// 添加禁止记录标记
      link.href = url.toString();
    }
    return true;
}
</script>

4. 后台管理增强(可选)
在`source/admincp/admincp_perm.php`中增加设置项:

// 在用户组编辑页面增加新选项
showsetting('不记录下载行为', 'newsetting', $group['no_attachlog'], 'radio');

// 对应数据库需新增no_attachlog字段

实现效果:
- 指定用户组下载时不会生成下载记录
- 前端请求自动携带禁用标记
- 积分系统与日志系统解耦处理
- 后台可配置化设置(需二次开发)

注意事项:
1. 修改前务必备份原始文件
2. 用户组ID需根据实际设置调整
3. 涉及数据库字段新增时需要执行ALTER语句
4. 缓存更新需在修改后清理data/cache目录

如果需要对日志表进行分区管理,建议在`source/class/table/forum_attachmentlog.php`中增加分区逻辑,可通过`$_G['groupid']`进行日志存储分区。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 附件下载记录,有些用户组下载附件不扣积分,但是下载.....