实现步骤:
一 、数据库字段设计:
大体可分为三个数据表(权限表,角色表 和 管理员表),在角色表中有权限id列表字段,这个字段可再细分(也就是说可以和管理员表的id字段组成另一个表)。
权限表字段包括:id,权限名称,模块名称,控制器名称,方法名称,父级id,level字段(为了实现树状结构),全路径字段(和id连接,实现相同父级的id排序一起)。
角色表字段包括:id,角色名称 和 角色拥有的权限列表。
管理员表字段包括:id,管理员名称,管理员密码,和角色id ,加密密钥(salt)。
注:字段的设计类型选择最小类型。所有字段都加上not null ,可为空则default设置。给搜索频繁的字段加上索引。并给每个字段和表都注释。
二、在权限模块中,获取树状结构数据
//调用tp中 $_validate 方法 对表单进行验证
protected $_validate = array(
array('pri_name','require','权限名称不能为空!'),
array('module_name','require','模块名称不能为空'),
array('controller_name','require','控制器名不能为空'),
array('action_name','require','方法名不能为空'),
);
//获取树形结果的数据
public function getPriTree($pri_level = 2)
{
$sql = 'SELECT * FROM sh_privilege WHERE pri_level <= '.$pri_level.' ORDER BY CONCAT(pri_path,"-",id) ASC';
return $this->query($sql);
}
//添加插入数据时的,前置钩子
public function _before_insert(&$data,$option)
{
//对pri_level和pri_path 数据的拼装
//pri_level 的值 是上个pri_level值+1 ,pri_path 的值为上父级的pri_path+id,若是为顶级则pri_level和pri_path都为0
if($data['parent_id'] != 0)
{
//取出上级父id 的 pri_level 和 pri_