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中,有关于管理组权限相关的变量的初始化,如果你写插件或者进行二次开发时增加了某管理权限,一定要记得加上,否则可会造成外部提交伪造。
- if(!in_array($adminid, array(1, 2, 3))) {
- $alloweditpost = $alloweditpoll = $allowstickthread = $allowmodpost = $allowdelpost = $allowmassprune
- = $allowrefund = $allowcensorword = $allowviewip = $allowbanip = $allowedituser = $allowmoduser
- = $allowbanuser = $allowpostannounce = $allowviewlog = $disablepostctrl = $supe_allowpushthread = 0;
- } elseif(isset($radminid) && $adminid != $radminid && $adminid != $groupid) {
- $cachelost .= (@include DISCUZ_ROOT.'./forumdata/cache/admingroup_'.intval($adminid).'.php') ? '' : ' admingroup_'.$groupid;
- }
复制代码
希望大家多多交流,共同成长。
[ 本帖最后由 heyond 于 2007-1-19 22:55 编辑 ] |