⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.pas

📁 权限管理
💻 PAS
📖 第 1 页 / 共 3 页
字号:
    showErrMsg('数据库读写错误!');
  end;
end;

//根据权限字符Pur读出相应的不包含权限列表到数据集ADODS中
procedure TFrmMain.ReadPurExStr(var ADODS:TADODataSet;PurStr:string);
var
  IncIDs: array of Integer;
  SQLStr: string;
  i: Integer;
begin
  if length(PurStr) = 0 then
  begin
  //权限字符串是空字符串,则读出所有的功能
    SQLStr := 'select gn_i,gn_mc,gn_ms from PMgsgn ';
  end
  else
  begin
    SetLength(IncIDs,length(PurStr) * 6 );
    MenuIDs(PurStr , IncIDs);//将Purstr指定的功能转化到整型数组中
    SQLStr := 'select gn_i,gn_mc,gn_ms from PMgsgn where not (gn_i = -1';
    for i := 1 to length(IncIDs) - 1 do
    begin
      if IncIDs[i] > 0 then
      begin
        SQLStr := SQLStr + ' or gn_i = ' + IntToStr(i);
      end;
    end;
    SQLStr := SQLStr + ')';
  end; //if length(PurStr) = 0
  try
    ExecQuery(ADODS, SQLStr);
  except
    showErrMsg('数据库读写错误!');
  end;
end;

//权限字符PurStr对应的权限映射到数组IncIds中
procedure TFrmMain.MenuIDs(PurStr: string; var IncIDs: array of Integer);
var
  i,No:Integer;
  j,k,count:Shortint ;
begin
  for i := 1 to length(PurStr)  do //循环读出权限字符串中每一字符进行处理
  begin
    k := ord(Purstr[i]);//字符转化为整数
    j := 1;
    for count := 1 to 6 do  //循环判断字符的低六位的值
    begin
      if (k and j) <> 0 then // k的第count位为1
      begin
        //设置权限数组的相应元素大于0
        No := i* 6 + count - 6;
        IncIDs[No]:= IncIDs[No] + 1;
      end;
      j := j * 2 ;
    end;
  end;
end;

//在PurStr字符串指定的权限功能组中加入MenuID指明的功能
procedure TFrmMain.AddPur(var PurStr: string; MenuID: Integer);
var
 StrCN, Offset,i: Integer;
begin
  //首先计算MenuId对应的字符和在字符中的偏移位置
  StrCN := MenuID div 6 + 1 ;
  Offset := MenuID mod 6;
  if Offset = 0 then
  begin
    StrCN := StrCN -1 ;
    Offset := 6;
  end;
  //如果权限字符串长度小于strCN,则在后面添加 chr($40)补足
  for i := length(PurStr) to strCN  do
    PurStr := PurStr +  chr($40);
  //将权限字符串中相应位置设为1,并保证最高两位为01
  PurStr[strCn] := chr((Ord(PurStr[strCn]) or
    ( 1 shl (Offset-1) )) and $7F);
end;

//从PurStr字符串指定的权限功能组中删除MenuID指明的功能
procedure TFrmMain.DeductPur(var PurStr: string; MenuID: Integer);
var
  StrCN, Offset,i: Integer;
begin
  //首先计算MenuId对应的字符和在字符中的偏移位置
  StrCN := MenuID div 6 + 1;
  Offset := MenuID mod 6;
  if Offset = 0 then
  begin
    StrCN := StrCN -1 ;
    Offset := 6;
  end;
  //如果权限字符串长度小于strCN,则在后面添加 chr($40)补足
  for i := length(PurStr) to strCN  do
    PurStr := PurStr +  chr($40);
  //将权限字符串中相应位置设为0,并保证最高两位为01
  PurStr[strCn] := chr((Ord(PurStr[strCn]) and
      not ( 1 shl (Offset-1) )) and $7F);
end;

//加入新的角色
procedure TFrmMain.AddNewPost;
begin
  try
    FrmDPurNewPost := TFrmDPurNewPost.Create(nil);
    FrmDPurNewPost.TypeOfNewPost := tnpNew ;
    FrmDPurNewPost.PostMc := '';
    FrmDPurNewPost.PostMs := '';
    //显示新建角色窗体
    if FrmDPurNewPost.ShowModal = mrOK then
    begin
      ReadPostInfo;
      DM.DSetPost.Last;
    end;
  finally
    FrmDPurNewPost.Free;
  end;
end;

//更新角色名称和描述
procedure TFrmMain.UpdatePost;
var
  recNo:integer;
begin
 try
    FrmDPurNewPost := TFrmDPurNewPost.Create(nil);
    FrmDPurNewPost.TypeOfNewPost := tnpModify ;
    FrmDPurNewPost.PostMc := DM.DSetPost.fieldByName('js_mc').AsString ;
    FrmDPurNewPost.PostMs := DM.DSetPost.fieldByName('js_ms').AsString ;
    FrmDPurNewPost.PostID := DM.DSetPost.fieldByName('js_i').AsInteger;
    //显示新建功能组窗体
//    FrmDPurNewPost.ShowModal;
    if FrmDPurNewPost.ShowModal = mrOK then  //用户选择确定
    begin
      RecNo := DM.DSetPost.RecNo;
      ReadPostInfo ;
      DM.DSetPost.RecNo := RecNo;
    end;
  finally
    FrmDPurNewPost.Free;
  end;
end;

procedure TFrmMain.DelPost;
var
  sSQL: string;
  Posti,recNo: Integer;
  ArrayOfSQL:TStrings;
begin
  ArrayOfSQL := nil;
  if DM.DSetPost.RecordCount > 0 then
  begin
    if showConfirmDlg('删除角色吗?')  then
    begin
      recNo := DM.DSetPost.RecNo ; 
      Posti := DM.DSetPost.FieldByName('js_i').AsInteger;
      try
        ArrayOfSQL := TStringList.Create ;
        //删除岗位
        sSQL := 'delete from PMjs where js_i = ' + IntToStr(Posti);
        ArrayOfSQL.Add(sSQL);
        //删除“公司人员与岗位关系表”中的岗位
        sSQL := 'delete from PMryjs where ryjs_jsi = ' + IntToStr(Posti);
        ArrayOfSQL.Add(sSQL);
        //删除“岗位与权限组关系表”中的岗位
        sSQL := 'delete from PMjsgn where jsgn_jsi = ' + IntToStr(Posti);
        ArrayOfSQL.Add(sSQL);
        try
          BatchSQL(ArrayOfSQL);
        except
          showErrMsg('数据库读写错误!');
        end;
        ReadPostInfo ;
        if not DM.DSetPost.IsEmpty then
        begin
          if RecNo > DM.DSetPost.RecordCount then
            RecNo := DM.DSetPost.RecordCount;
          DM.DSetPost.RecNo := RecNo;
        end;
        ShowPostIncPur;
        ShowUserIncPost;
        ShowUserExPost;
        ShowUserIncPur ;
      finally
        ArrayOfSQL.Free ;
      end;
    end;
  end;
end;

//从数据库中读取所有角色信息
procedure TFrmMain.ReadPostInfo;
var
  SQLStr: string;
begin
  try
    SQLStr :=  'select * from PMjs order by js_i';
    ExecQuery( DM.DSetPost, SQLStr );
  except
    showErrMsg('数据库读写错误!');
  end;
end;

//显示角色包含的权限组
procedure TFrmMain.ShowPostIncGroup;
begin
  if DM.DSetPost.Active and ( DM.DSetPost.RecordCount > 0)  then
  begin
    ReadGroupInPost(DM.DSetPostIncGroup,
      DM.DSetPost.fieldbyname('js_i').AsInteger);
  end
  else
  begin
    DM.DSetPostIncGroup.Active := False ;
  end;
end;

//显示角色不包含的权限组
procedure TFrmMain.ShowPostExGroup;
begin
  if DM.DSetPost.Active and ( DM.DSetPost.RecordCount > 0 )  then
  begin
    ReadGroupExPost(DM.DSetPostExGroup,DM.DSetPost.
      fieldbyname('js_i').AsInteger);
  end
  else
  begin
    DM.DSetPostExGroup.Active := False ;
  end;
end;

//显示角色包含的所有权限
procedure TFrmMain.ShowPostIncPur;
var
  PurStr,tempStr:string;
  i,j:integer;
begin
  PurStr := '';
  with DM.DSetPostIncGroup do
  begin
    if Active and (RecordCount > 0)  then
    begin
      First;
      while not Eof do
      begin
        tempStr := fieldByName('gnz_gn').AsString ;
        j := min(length(PurStr),length(tempStr));
        for i := 1 to j do
        begin
          PurStr[i] := chr(ord(PurStr[i]) or ord(tempStr[i]));
        end;
        if j<Length(tempStr) then
        begin
          Purstr := PurStr + copy(tempStr,j+1,length(tempStr)-j);
        end;
        Next;
      end;
    end
    else
    begin
      DM.DSetPostIncPur.Active := False ;
    end;
  end;
  ReadPurInStr(DM.DSetPostIncPur,PurStr);
end;

//向角色中增加权限组
procedure TFrmMain.PostAddGroup;
var
  sSQL: string;
  i,RecNo: Integer;
  ArrayOfSQL : TStrings ;
begin
  RecNo := DM.DSetPostExGroup.RecNo ;
  ArrayOfSQL := nil;
  if DBGridPostExGroup.Focused and (DM.DSetPostExGroup.RecordCount > 0)
  then
  begin
    if DBGridPostExGroup.SelectedRows.Count > 1 then
    begin
      try
        ArrayOfSQL := TStringList.Create ;
        for i := 0 to DBGridPostExGroup.SelectedRows.Count - 1 do
        begin
          DBGridPostExGroup.DataSource.DataSet.
            GotoBookmark(pointer(DBGridPostExGroup.SelectedRows.Items[i]));
          sSQL := 'insert into PMjsgn(jsgn_jsi,jsgn_gni) values(';
          sSQL := sSQL + DM.DSetPost.FieldByName('js_i').AsString + ',';
          sSQL := sSQL + DM.DSetPostExGroup.FieldByName('gnz_i').AsString
            + ')';
          ArrayOfSQL.Add(sSQL);
        end;
        try
          BatchSQL(ArrayOfSQL);
        except
          showErrMsg('数据库读写错误!');
        end;
      finally
        ArrayOfSQL.Free ; 
      end;
    end
    else
    begin
      sSQL := 'insert into PMJsgn(jsgn_jsi,jsgn_gni) values(';
      sSQL := sSQL + DM.DSetPost.FieldByName('js_i').AsString + ',';
      sSQL := sSQL + DM.DSetPostExGroup.FieldByName('gnz_i').AsString + ')';
      try
        ExecQuery2(sSQL);
      except
        showErrMsg('数据库读写错误!');
      end;
    end;
    ShowPostIncGroup;
    ShowPostExGroup;
    ShowPostIncPur;
    ShowUserIncPur ;
    if RecNo > DM.DSetPostExGroup.RecordCount  then dec(recNo);
    if  not DM.DSetPostExGroup.IsEmpty then
      DM.DSetPostExGroup.RecNo := RecNo ;
  end;
end;

//删除角色中的权限组
procedure TFrmMain.PostDelGroup;
var
  sSQL: string;
  i,RecNo: Integer;
  ArrayOfSQL : TStrings;
begin
  RecNo := DM.DSetPostIncGroup.RecNo ;
  ArrayOfSQL := nil;
  if DBGridPostIncGroup.Focused and (DM.DSetPostIncGroup.RecordCount > 0)
  then
  begin
    if DBGridPostIncGroup.SelectedRows.Count > 1 then
    begin
      try
        ArrayOfSQL := TStringList.Create;
        for i := 0 to DBGridPostIncGroup.SelectedRows.Count - 1 do
        begin
          DBGridPostIncGroup.DataSource.DataSet.GotoBookmark
            (pointer(DBGridPostIncGroup.SelectedRows.Items[i]));
          sSQL := 'delete from PMjsgn where jsgn_jsi = ';
          sSQL := sSQL + DM.DSetPost.FieldByName('js_i').AsString
            + ' and jsgn_gni = ';
          sSQL := sSQL + DM.DSetPostIncGroup.FieldByName('gnz_i').AsString;
          ArrayOfSQL.Add(sSQL);
        end;
        try
          BatchSQL(ArrayOfSQL);
        except
          showErrMsg('数据库读写错误!');
        end;
      finally
        ArrayOfSQL.Free ;
      end;
    end
    else
    begin
      sSQL := 'delete from PMJsgn where jsgn_jsi = ';
      sSQL := sSQL + DM.DSetPost.FieldByName('js_i').AsString
        + ' and jsgn_gni = ';
      sSQL := sSQL + DM.DSetPostIncGroup.FieldByName('gnz_i').AsString;
      try
        ExecQuery2(sSQL);
      except
        showErrMsg('数据库读写错误!');
      end;
    end;
    ShowPostIncGroup;
    ShowPostExGroup;
    ShowPostIncPur;
    ShowUserIncPur ;
    if RecNo > DM.DSetPostIncGroup.RecordCount  then dec(recNo);
    if  not DM.DSetPostIncGroup.IsEmpty then
      DM.DSetPostIncGroup.RecNo := RecNo ;
  end;
end;

//根据角色ID读出相应的权限组列表到数据集ADODS中
procedure TFrmMain.ReadGroupInPost(var ADODS:TADODataSet;PostID:integer);
var
  sSQL: string;
begin
  try
    sSQL := 'select a.* from PMgnz a,PMjsgn b '
       + 'where b.jsgn_jsi = ' + IntToStr(PostID)  + ' and '
       + 'b.jsgn_gni = a.gnz_i '
       + 'order by a.gnz_mc';
    ExecQuery(ADODS, sSQL);
  except
    showErrMsg('数据库读写错误!');
  end;
end;

//根据角色ID读出相应的不包含权限组列表到数据集ADODS中
procedure TFrmMain.ReadGroupExPost(var ADODS:TADODataSet;PostID:integer);
var
  sSQL: string;
begin
  try
     sSQL := 'select * from PMgnz where  gnz_i not'
       + ' in (select jsgn_gni from PMjsgn  '
       + 'where jsgn_jsi = ' + IntToStr(PostID)
       + ' ) order by gnz_mc';
    ExecQuery(ADODS, sSQL);
  except
    showerrMsg('数据库读写错误!');
  end;
end;

procedure TFrmMain.AddNewUser;
begin
  try
    FrmDPurNewUser := TFrmDPurNewUser.Create(nil);
    FrmDPurNewUser.TypeOfNewUser := tnuNew;
//    FrmDPurNewUser.ShowModal;
    if FrmDPurNewUser.ShowModal = mrOK then
    begin
      ReadUserInfo ;
      DM.DSetUser.Last;
    end;

  finally
    FrmDPurNewUser.Free;
  end;
end;

procedure TFrmMain.UpdateUser;
begin
  try
    FrmDPurNewUser := TFrmDPurNewUser.Create(nil);
    FrmDPurNewUser.TypeOfNewUser := tnuModify;
    FrmDPurNewUser.UserID := DM.DSetUser.FieldByName('Per_i').AsInteger;
    FrmDPurNewUser.ShowModal;
  finally
    FrmDPurNewUser.Free;
  end;
end;

procedure TFrmMain.DelUser;
var
  sSQL: string;
  ArrayOfSQL: TStrings;
  Useri,recNo: Integer;
begin
  ArrayOfSQL := nil;
  if DM.DSetUser.RecordCount > 0 then
  begin
    if showConfirmDlg('删除用户吗?')  then
    begin
      recNo := DM.DSetUser.RecNo ;
      Useri := DM.DSetUser.FieldByName('Per_i').AsInteger;
      try
         //删除用户
        ArrayOfSQL := TStringList.Create ;
        sSQL := 'update PMPerson set Per_dlmz ='''' , Per_dlmm = '''' where ' +
              ' Per_i = ' + IntToStr(Useri);
        ArrayOfSQL.Add (sSQL);
        //删除“公司人员与岗位关系表”中的用户
        sSQL := 'delete from PMryjs where ryjs_ryi = ' + trim(IntToStr(Useri));
        ArrayOfSQL.Add (sSQL);
        try
          BatchSQL(ArrayOfSQL);
        except
          showErrMsg('数据库读写错误!');
        end;
      finally
        ArrayOfSQL.Free;
      end;
      ReadUserInfo ;
      if not DM.DSetUser.IsEmpty then
      begin
        if RecNo > DM.DSetUser.RecordCount then
          RecNo := DM.DSetUser.RecordCount;
        DM.DSetGroup.RecNo := RecNo;
      end;
      ShowUserIncPost ;
      ShowUserExPost ;
      ShowUserIncPur ;
    end;
  end;
end;


//从数据库中读取所有已经分配权限的用户信息
procedure TFrmMain.ReadUserInfo;
var
  SQLStr: string;
begin
  try
//    SQLStr :=  'select Per_i,Per_Name,Per_dlmz,Per_dlmm,Per_mzms from PMPerson ';

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -