在Discuz X3系统中实现自定义用户组的差异化积分策略,可通过以下两种方案实现:
一、原生系统配置方案(适合基础需求)
1. 进入后台【用户】-【用户组】-【编辑目标VIP用户组】
2. 在"积分相关"选项卡中找到"访问网站奖励积分"设置项
3. 设置:
extcredits1 = 5(对应积分)
extcredits2 = 5(对应金币)
4. 其他用户组保持默认值0即可
二、深度定制开发方案(推荐精准控制)
通过插件开发实现更精细化的控制逻辑:
1. 创建插件目录:
/src/plugin/vip_reward/
2. 编写主插件文件(vip_reward.inc.php):
- <?php
- if(!defined('IN_DISCUZ')) exit();
- class plugin_vip_reward {
- public function logging_login_succeed() {
- global $_G;
- $vip_groupid = 6; // 替换为实际VIP组ID
-
- if($_G['groupid'] == $vip_groupid && !$this->_is_rewarded_today($_G['uid'])) {
- $this->_add_credits($_G['uid']);
- }
- }
- private function _add_credits($uid) {
- loadcache('plugin');
- $config = $_G['cache']['plugin']['vip_reward'];
-
- C::t('common_member_count')->increase($uid, array(
- 'extcredits1' => intval($config['credit1']),
- 'extcredits2' => intval($config['credit2'])
- ));
-
- $this->_record_log($uid);
- }
- private function _is_rewarded_today($uid) {
- $lastlog = C::t('#vip_reward#reward_log')->fetch_by_uid($uid);
- return $lastlog && date('Ymd', $lastlog['dateline']) == date('Ymd');
- }
- private function _record_log($uid) {
- C::t('#vip_reward#reward_log')->insert(array(
- 'uid' => $uid,
- 'dateline' => TIMESTAMP
- ));
- }
- }
- class plugin_vip_reward_forum extends plugin_vip_reward {}
复制代码
3. 创建数据库表(install.php):
- $sql = <<<SQL
- CREATE TABLE IF NOT EXISTS `pre_vip_reward_log` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `uid` mediumint(8) unsigned NOT NULL,
- `dateline` int(10) unsigned NOT NULL,
- PRIMARY KEY (`id`),
- KEY `uid` (`uid`)
- );
- SQL;
复制代码
三、实现优势对比
| 方案 | 开发成本 | 灵活度 | 可追溯性 | 防作弊机制 |
|-----------|-------|------|------|-------|
| 原生配置方案 | 低 | 中 | 无 | 无 |
| 插件开发方案 | 中 | 高 | 有 | 有日志记录 |
四、注意事项
1. VIP用户组ID需通过【用户组管理】界面实际查看获取
2. 需在插件配置中设置具体奖励数值
3. 建议配合定时任务清理90天前的日志记录
4. 扩展积分字段需与实际站点配置保持一致
如需完整插件包或技术支持,可前往DZ插件网获取相关开发文档。建议正式环境部署前进行充分测试,避免积分数据异常。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |