您的位置:首页 > 数据库

分享一套基于WEB的ERP級專業權限管理繫統

2007-04-10 09:32 295 查看
一直以来权限都是比较难以管理,让人头疼的事,现实如此,WEB应用更是如此,由其是让WEB能适应现实的权限变化更是难上加难!
 

但是今天,我们已经不再需要为WEB权限分配置所困扰了,下面我要向大家介绍一套非常优秀的PHP权限管理系统——HooPower
 

认识它可能是一种缘份,那时正逢域名大减价,通过搜索域米找到的HooPower(HooPower.com),单看名字就有一种说不出来的魅力(谐音:琥珀)。
 

HooPower出道不久,看域名注册日期就知道了:2006年底,而且Google和百度都没有收录,也正因为如此吧,Hoopower网上为了推广免费提供测试版下载。
 

到底是一套什么样的软件呢,下载试试便知!通过一番测试之后,我惊喜的发现我现在遇到的权限管理问题,在Hoopower里面都能找到完美的解决方案,而且处理起来非常简单!
 

惊喜之余,我也不敢独享呀,现将体会与大家一起分享!
 

基本情况
1、数据库:集成ADODB,理论上ADODB几乎支持目前流行的所有数据库,但是HooPower只提供Mssql和Mysql的安装。安装的时候可以自由选择安装的数据库类型,为了区别其它表,支持使用前缀,安装完成一共16个表。前些日子我曾下载过phpgacl,也是一个权限管理系统,但是安装后的表都有二十六个-_-!
 

2、集成XAJAX,使得前台框架显示更美观,由其是它的Windows风格模板,让用户操作整个系统就像是用本地的应用软件一样方便!
 

3、框架模板可扩展,模板使用的是PHPLIB的Template。系统默认已提供了二种风格的模板,WEB风格和Windows风格。当然,如果你不满意,还可以自己定义风格,定义模板完全自由。
 

4、支持简体中文,繁体中文和英文三个版本。
 

权限关系
 

权限:分为三种,页面权限(基本权限:超用户、浏览、增加、修改、删除),页面附加权,全局权限。
 

角色:是一组权限的集合,一对多的关系
 

工作组:是一组角色的集合,一对多的关系,支持为工作组附加权限
 

用户:用户是工作组的成员,一对多的关系,支持为用户附加权限
 

特点(引用官方的说明)
 

1、支持全局或页面权限;页面权限可细分到页面上的某个特定属性(页面附加值)
2、支持由SQL语句生成的动态权限(我还不清楚怎么使用,等学会了再说);支持限下放;支持用户配置
2、设计比较合理,功能设计和权限配置实现分离,程序员设计功能,用户分配权限(通常为组长分配其下的组员权限)
3、完全面向对象,完全功能封装,简单的类扩展,即可实现权限分配
4、支持组长以组员身份登录,支持组长登录后在各组员间自由跳转
5、自带登陆框架,提供系统管理,日志,以及在用户在线交流
 

 

一个功能其实就一个组页面,在需要新功能的时候,首先必须新建一个菜单(页面)项,而且要为这页面分配权限。默认是不对任何人开放的。
菜单就是将功能按一定的顺序排放,在视觉上起到功能分组的做用。
 

举个例子来说,我新建了一个功能菜单,并分配给管理员所有权限
 

1、以管理员身份登陆
2、在菜单管理里面点新建菜单
3、选择文件的网址或输入网址
4、选择绑定到角色,将管理员角色全部选中(表示此页给管理员全部权限)
5、提交
6、编辑PHP文件,输入以下内容
<?
require('../admin.inc.php'); //根据你的目录而有所改变
class myTest extends admin {
       function disp(){
              echo "Hi Power!";
       }
}
$main = new myTest();
$main -> Main();
?>
 

OK!就这样,看起来是不是有点像Java,是的,HooPower是全完面象对象的。
文件就这么简单,程序员只需要实现功能就行了,权限分配由系统来完成。你可
1184c
以通用权限公配指定让哪些用户浏览,哪些用户不可以浏览。
 

当然它的功能远不于此
比如我们读取一个表,然后用户进行修改和删除操作!
<?
require('../admin.inc.php'); //根据你的目录而有所改变
require('mytable.php');           //我的表操作类
class myTest extends admin {
       var $tab = null;
       function __construct(){
              parent::__construct();
              $this -> tab = new mytable();
       }
       function disp(){
              $rs = $this -> tab -> getRow(10);//得到表中前10行记录
              while($rrs = $rs -> FetchRow($rs)){
                     echo 'id:'.$rrs['id'].' testname:'.$rrs['testname'].
 

                     //得到修改字符串,如果没有权限修改,得不到修改字符串,或者得到的是不可点击的按钮
                     $this -> getUpdStr($rrs['userid'],$rrs['id']).' '.
 

                     //得到删除字符串,如果没有权限删除,得不到删除字符串,或者得到的是不可点击的按钮
                     $this -> getDelStr($rrs['userid'],$rrs['id']).
                     '<br>';
              }
 

              //得到增加字符串,如果没有权限得不到增加字符,或者得到的是不可点击的按钮
              echo $this -> getAddStr();  
       }
       function goDelete(){
              $this -> tab -> del($_GET['delid']+1);
              $this -> disp();
       }
       function goAppend(){
              $this -> tab -> app($_POST);
              $this -> disp();
       }
       function goModify(){
              $this -> tab -> mod($_POST);
              $this -> disp();
       }
       function goDispAppend(){
              $this -> goDispModify();
       }
       function goDispModify(){
              if( $this -> isModify ){
                     $this -> tab -> disp($_GET['updid']);
              }else{
                     $this -> tab -> disp();
              }
       }
}
$main = new myTest();
$main -> Main();
?>
 

OK,一个不太漂亮但是功能很全的界面算是已经完成了:),如是你想界面更好看,去修改disp方法,和 mytable 类的 disp 方法
你可能会说,这里面没有权限管理呀,是的,这就是它的强大之外,你几乎看不到有权限处理的部分,这一切都由HooPower来完成。
做为程序员的你,只需要把各模块的代码写完善就OK啦。不过有一点就是,就是disp、goDelete等等这些函数名你不能改变,这是HooPower的一个小小的约定,但是你可以增加参数:)关于admin类的API可以参见官方文档。
 

例三:我们新建一个页面,这个页面有一个下接菜单,是用来选择国家,下面显示的是当前选择的国家下的销售情况
国家的下接菜单,是根据当前用户可以浏览的国家得出的,默认显示的国家是有用户配置得出来的。
<?
require('../admin.inc.php'); //根据你的目录而有所改变
require('mytable.php');           //我的表操作类
class myTest extends admin {
       var $tab = null;
       function __construct(){
              parent::__construct();
              $this -> tab = new mytable();
       }
       function disp(){
              //得到用户可以浏览的国家
              $countrys = $this -> getAttach('countryList');
 

              //得到用户配置的默认国家
              $defaultc = $this -> getValue('defaultCountry');
 

              $sql = 'select * from country where countryid in('.implode(',',$countrys).')';
 

              $rs = $this -> tab -> getSqlData($sql);
 

              echo '<select>';
              while($rrs = $rs -> FetchRow($rs)){
                     echo '<option value='.$rrs['countryid'].
                            ($rrs['countryid']==$defaultc?' selected':'').
                     '>'.$rrs['countryname'].'</option>';
              }
              echo '</select>';
             
              $sql = 'select * from sale where countryid = '.$defaultc;
              ...
              //
              // other code ....
              //
       }
       function goDelete(){..}
       function goAppend(){..}
       function goModify(){..}
       function goDispAppend(){..}
       function goDispModify(){..}
}
$main = new myTest();
$main -> Main();
?>
 

提醒几点让大家注意一下:
 

用户权限分配,以及组权限分配
这里要特别说明的是,在用户权限配置页面里有一个超级开关:允许向下赋权?属于页面附加权,如果组长有此页的浏览、修改以及以许向下赋权的权限后,组长可以给组内任何人赋予他拥用的权限。这是一个很有意思的权限,不过随意赋予用户此权限可能会引起权限混乱。另外,如果组长拥有此页的浏览、修改权,也可以拒绝组内任何人拥有组长的某个权限,即使用户是属于多个组,而且用户另外组也有此权限。
 

解决权限分歧
常常会有这种情况:
  页面P(销售浏览)、
  P的附加权A(默认显示浏览的国家):类型为单选值(1:美,2:英,3:加)、
  组G1(美国销售组)、
  组G2(英国销售组)、
  用户U(小丽)
 

G1:P A = 1 (组G1的P页面的A附加权的值为1)
G2:P A = 2 (组G2的P页面的A附加权的值为2)
U = G1,G2  (用户加入了两个组)
 

那么 U:P A = 1,2  (用户U具用P页面A附加权的两个值,而这违反了P页面A附加权的规定)
 

默认情况下,程序会随机在1,2之间取一个值,同时也会在“用户配置”里面多出一项重复权限,可以让用户自己设置为1还是为2
当用户设置了之后,程序将不再随机取值,而是使用用户配置值了。配置权限不等于放弃权限,只要权限存在,用户仍可通过“用户配置”来选择权限
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息