Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

Discuz!多用户组分析(2007-1-18 更新)

[复制链接]
heyond 发表于 2007-1-18 13:55:12 | 显示全部楼层 |阅读模式
Discuz!自4.0以后,引入了强大的多用户组体系,并且和完善的积分体系挂钩,使站长可以非常的灵活的定制适合站点的规则。但是往往有利
弊是一对弈生兄弟,完善的东西往往也是非常复杂的东西,很多站长对用户组不甚理解,以下我的分析,欢迎大家指正。

从类型(cdb_usergroup.type)上分为:

系统用户组(system): 包括,管理员,超版,版主,禁止发言,禁止访问,IP被禁,游客,等待验证,这个是程序从功能的角度出发设置的用
户组,不允许用户增添。
会员用户组(member): 可以根据积分将会员分组,系统会自动调整用户的用户组,比如: 新手上路,初级会员,中级会员,高级会员,骨灰级
会员,这个可以由站长任意定制。
特殊用户组(system): 这个用户组即不属于system, member,是一个独立的用户组,比如: 重大贡献会员(您不想给他管理员的权限,又想让
他和普通会员区会开,那么可以设置此组)

Discuz!用户组从开放程度(cdb_usergroup.system)上又可分为:

免费公共组(public):可以允许用户组的会员切换过来的组,前提是需要有“多用户组权限(allowmultigroup)”
收费公共组(sell):切换到这个组后,需要每日进行付费,在一些收费电影网站可以设置此组,允许其他会员通过付交易积分来获得此组的权
限。
私有组(private):不允许其他组加入该组。

其中管理员,超版,版主,都是属于管理组的(cdb_admingroups)。

关于关联管理组(cdb_usergroups.radminid):

1. 如果当前用户组关联了管理组,那么也即拥有的管理员的权限。
2. 只有特殊用户组,并且为非公众用户组才可以关联管理组

关于扩展用户组(cdb_members.extgroupids):

除了拥有当前用户组的权限,还可以拥有多重身份,此功能可应用于设置某些版块限定用户组可以浏览。

关于用户组过期(cdb_members.groupexpiry, cdb_memberfields.groupteams):

可以设置某用户所在组和扩展用户组的过期时间。




==================================================================
下面为写插件的朋友可能会有一些帮助。
==================================================================


以下为相关字段说明

members.adminid            : 用户管理组id, 0表示非管理组,>0表示管理组,1表示管理员。
members.groupid            : 用户所在的用户组。,如: 7。
members.groupexpiry      : 当前用户组过期时间,如: 1123456789。
members.extgroupids      : 扩展用户组ids,如: 11 18。在浏览论坛时,有的论坛设置了某些用户组才能浏览,除了会查看论坛用     户组权限之外,还 会查看扩展用户组权限
memberfields.groupterms  : 用户组信息,其数据为一序列化存放的数据。数据结构类似于如下:

Array
(
    [main] => Array
        (
            [time] => 1169049600 //过期时间。
            [adminid] => 1  //过期后自动调整管理组id。
            [groupid] => 19  //过期后自动调整用户组id。
        )
    [ext] => Array
        (
            [14] => 1169049600  //扩展用户组14过期时间。
            [19] => 1169136000  //扩展用户组19过期时间。
            [25] => 1169049600  //扩展用户组15过期时间。
        )
)


usergroups.system        :
public  公共免费
private 私有
另外一种里面存的是字符串,两个数字,以\t隔开,表示公共收费用户组格式为: 每日价格\t最少可购买天数

在 login 和 viewthread 时 会按照站长后台设置的积分公式计算会员总积分,进行自动调整用户用户组。
在 global.func.php 中,会判断用户组是否过期,相关函数为 getgroupid(),在浏览帖子(viewthread)的时候也会调用该函数检查用户组是否过期。

用户可以切换的组有以下几种(前提为所在用户组必须有切换的权限)
1: 特殊用户组,并且公开,并且没有关联管理组
2: 普通用户组,并且积分上下限满足其条件。
3: 所在的扩展用户组

如果用户组过期,会在common.inc.php中检查,并且跳转到 member.php?action=groupexpiry, 更新用户组的groupid, adminid, 为$groupterm[main][groupid], $groupterm[main][adminid]
检查扩展用户组是否过期,$groupterms['main'],过期一次后,这个变量将会被清空。如果不存在$groupterms['main'],则按照积分等级对用户组进行调整

注:在common.inc.php中,有关于管理组权限相关的变量的初始化,如果你写插件或者进行二次开发时增加了某管理权限,一定要记得加上,否则可会造成外部提交伪造。
  1. if(!in_array($adminid, array(1, 2, 3))) {
  2. $alloweditpost = $alloweditpoll = $allowstickthread = $allowmodpost = $allowdelpost = $allowmassprune
  3.   = $allowrefund = $allowcensorword = $allowviewip = $allowbanip = $allowedituser = $allowmoduser
  4.   = $allowbanuser = $allowpostannounce = $allowviewlog = $disablepostctrl = $supe_allowpushthread = 0;
  5. } elseif(isset($radminid) && $adminid != $radminid && $adminid != $groupid) {
  6. $cachelost .= (@include DISCUZ_ROOT.'./forumdata/cache/admingroup_'.intval($adminid).'.php') ? '' : ' admingroup_'.$groupid;
  7. }
复制代码


希望大家多多交流,共同成长。

[ 本帖最后由 heyond 于 2007-1-19 22:55 编辑 ]
coinyang 发表于 2007-1-18 14:01:30 | 显示全部楼层
一不留神又坐个沙发,回头再来仔细研究。
回复

使用道具 举报

lele521 发表于 2007-1-18 14:04:43 | 显示全部楼层
前排 不容易啊
回复

使用道具 举报

 楼主| heyond 发表于 2007-1-18 14:04:48 | 显示全部楼层
汗。我还没有发完,正在写。
回复

使用道具 举报

云淡风清 发表于 2007-1-18 14:05:41 | 显示全部楼层
哈哈,回贴的速度可真快
回复

使用道具 举报

xixitj 发表于 2007-1-18 14:09:48 | 显示全部楼层
回复

使用道具 举报

xixitj 发表于 2007-1-18 14:10:31 | 显示全部楼层
啥时候发布
回复

使用道具 举报

2xy 发表于 2007-1-18 14:14:43 | 显示全部楼层
:) :) :)
最近还正在考虑这个用户组权限的问题呢!

[ 本帖最后由 2xy 于 2007-1-18 14:18 编辑 ]
回复

使用道具 举报

xpibm 发表于 2007-1-18 14:24:40 | 显示全部楼层
:) :) :)
回复

使用道具 举报

小蜜蜂呀 发表于 2007-1-18 15:07:18 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-12-23 08:44 , Processed in 0.036395 second(s), 4 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表