首先申明:我是做公司原有软件的一个外挂程序,所以每个用户权限可以在原系统中定义,主要分为:
1、超级用户:享有自己开发的外挂程序的所有使用权限;
2、本人权限:可以分为:新增、查询、修改、删除、审核、撤消审核、打印等权限控制,但只能处理本人的业务单据;
2、本人所属组权限:可以分为:新增、查询、修改、删除、审核、撤消审核等权限控制,可以处理本人所属组其他成员的业务单据;
2、本人所属组组之外权限:可以分为:新增、查询、修改、删除、审核、撤消审核等权限控制,可以处理所属组组之外的其他成员的业务单据;
在数据库表中这样存储着权限:
用户编号    程序编号       本人权限            本人所属组权限                 本人所属组组之外权限            控制权     是否超级用户
 001        A001          YYYYYYY              YYYYYY                      YYYYYY                    N          N
 001       A002         YYYYYYY              YYYYYY                      YYYYYY                    Y          N
 002       A001         YYYYYYY              YYYYYY                      YYYYYY                    N          N
 003       A001         YYYYYYY              YYYYYY                      YYYYYY                    N          N
 003       A002         YYYYYYY              YYYYYY                      YYYYYY                    Y          N
 003       A003         YYYYYYY              YYYYYY                      YYYYYY                    N          N
 004                                                                                                          Y
说明:
1、当超级用户为Y时,权限设置就为空,享有自己开发的外挂程序的所有使用权限;
2、YYYYYYY(表示用户有新增、查询、修改、删除、审核、撤消审核、打印),YYYYNNY(表示用户只有新增、查询、修改、删除、打印权,没有审核、撤消审核权);
3、控制权为N时,无论组权限与本人所属组组之外权限是什么值都不作用,只有当控制权为Y时,本人所属组权限与本人所属组组之外权限才起效!要求就是:我自己写的外挂系统如何根据上述的要求,实现相应的权限功能?暂时先抛出50分求解,如果能满足要求,分数可以任意加!   

解决方案 »

  1.   

    这个操作权限判断不难吧,根据你的需求,程序逻辑不复杂撒:1、根据当前用户编号和你的外挂程序的程序编号,读取当前用户的权限记录
    2、如果是超级用户,直接返回YYYYYYY
    3、如果没有控制权,直接返回当前用户的个人权限
    4、返回 本人权限 | 本人所属组权限 | 本人所属组组之外权限(这里是做类似二进制位的“或”操作。但是权限设置做成字符串“YY”的形式,实现起来就麻烦一点了,不过应该有现成的函数可调用吧)。
      

  2.   

    我是刚才开始学Delphi,而且是在自学,所以需要的是代码!高手能不能支持一下?
      

  3.   

    到www.2ccc.com去看看,那里有你想要的。
      

  4.   

    type
      TRight=(rModule,rInsert,rModify,rDelete,rPrint,rReadAll,rApprove,rBack,rBatch);function TBase_f.HaveRight(ModuleID,UserID: string; aRight: TRight): Boolean;
    begin
      with qry_BaseTemp do
      begin
        Close;
        SQL.Text := 'select * from SYS_RIGHT where 用户编号='''+
          UserID+''' and 程序编号='''+ModuleID+'''';
        Open;
        case aRight of
          rModule: Result := FieldByName('ModuleRight').AsInteger=1;
          rInsert: Result := FieldByName('InsertRight').AsInteger=1;
          rModify: Result := FieldByName('ModifyRight').AsInteger=1;
          rDelete: Result := FieldByName('DeleteRight').AsInteger=1;
          rPrint: Result := FieldByName('PrintRight').AsInteger=1;
          rReadAll: Result := FieldByName('ReadAll').AsInteger=1;
          rApprove: Result := FieldByName('ApproveRight').AsInteger=1;
          rBack: Result := FieldByName('BackRight').AsInteger=1;
          
          else Result := False;
        end;
        Close;
      end;
    end;
    自己把TRight改一下.
      

  5.   

    [Quote=引用 6 楼 zhao_yong 的回复:]
    偶太笨了,没有办法搬到自己的程序里面去,请问没有详细的实现例子之类的?
      

  6.   


    type
      TRight=(rModule,rInsert,rModify,rDelete,rPrint,rReadAll,rApprove,rBack,rBatch);function TBase_f.HaveRight(ModuleID,UserID: string; aRight: TRight): Boolean;
    begin
      with qry_BaseTemp do
      begin
        Close;
        SQL.Text := 'select * from SYS_RIGHT where 用户编号='''+
          UserID+''' and 程序编号='''+ModuleID+'''';
        Open;
        case aRight of
          rModule: Result := FieldByName('ModuleRight').AsInteger=1;
          rInsert: Result := FieldByName('InsertRight').AsInteger=1;
          rModify: Result := FieldByName('ModifyRight').AsInteger=1;
          rDelete: Result := FieldByName('DeleteRight').AsInteger=1;
          rPrint: Result := FieldByName('PrintRight').AsInteger=1;
          rReadAll: Result := FieldByName('ReadAll').AsInteger=1;
          rApprove: Result := FieldByName('ApproveRight').AsInteger=1;
          rBack: Result := FieldByName('BackRight').AsInteger=1;
          
          else Result := False;
        end;
        Close;
      end;
    end;
    是对单个用户设置权限,可以改为组用户的权限:
    rModule--打开,rInsert--新增,rModify--修改,rDelete--删除,rPrint--打印,rReadAll--读取所有,rApprove--核准,rBack--取消核准,把正这些都是你要定义的权限,在表中为字段。
      

  7.   

    type
      TRight=(rModule,rInsert,rModify,rDelete,rPrint,rReadAll,rApprove,rBack,rBatch);
    这句是否在单元文件的实现部份,在{$R *.dfm}之后?
    function TBase_f.HaveRight(ModuleID,UserID: string; aRight: TRight): Boolean;
    begin
      with qry_BaseTemp do
    这段在运行时,TBase_f.地方有错,qry_BaseTemp也有问题,不知道如何处理!