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

📄 authgrantfrm.pas

📁 delphi 编制的服务器程序
💻 PAS
字号:
unit AuthGrantFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ChildFrm, Buttons, ComCtrls, StdCtrls, ExtCtrls, ImgList, DB,
  ADODB;

  type
  PAuthItem = ^TAuthItem;
  TAuthItem = record
    AuthID: string;
    aUTHnAME: STRING;
    ParentID: string;
  end;

  TAuthGrantForm = class(TChildForm)
    Panel1: TPanel;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    Panel2: TPanel;
    tvNone: TTreeView;
    tvHave: TTreeView;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    SpeedButton4: TSpeedButton;
    Panel3: TPanel;
    lblUser: TLabel;
    Panel4: TPanel;
    Panel5: TPanel;
    SpeedButton5: TSpeedButton;
    SpeedButton6: TSpeedButton;
    SpeedButton7: TSpeedButton;
    SpeedButton8: TSpeedButton;
    QueryPublic: TADOQuery;
    ImageList1: TImageList;
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
    procedure SpeedButton4Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure QueryPublicPostError(DataSet: TDataSet; E: EDatabaseError;
      var Action: TDataAction);
    procedure QueryPublicAfterPost(DataSet: TDataSet);
    procedure QueryPublicBeforePost(DataSet: TDataSet);
  private
    { Private declarations }
    UserID: string;
    procedure CreateTreeNone;
    procedure CreateTreeHave;
    procedure CreateTreeSub(Kind: Integer; tv: TTreeView; parentNode: TTreeNode; AuthID:string);
    procedure AddChild_AuthQuery(tv: TTreeView; parentNode: TTreeNode; Q:TAdoQuery);
    procedure GetAuthItemFormRecord(Q: TAdoQuery; var Item: PAuthItem);
    function GetAuthID(Node: TTreeNode): string;
    function AddChild_Auth(tv: TTreeView; parentNode: TTreeNode; AuthItem: PAuthItem): TTreeNode;
    function ExistAuthNode(ATv: TTreeView; Item: pAuthItem): boolean;
    procedure SelectIn;
    procedure SelectOut;
    procedure SelectAllin;
    procedure SelectAllOut;
    procedure InsertAuthItem(AuthItem: pAuthItem);
    function GetNodeFromAuthID(ATv: TTreeView;  Item: pAuthItem): TTreeNode;
    procedure DeleteAllAuthedItem;
    procedure DeleteAuthedItem(AuthItem: pAuthItem;Scope:string);
    procedure ClearAuthRoleTree;
  public
    { Public declarations }
  end;

var
  AuthGrantForm: TAuthGrantForm;
  procedure CallAuthGrantForm(aUserId,aUserName:string);
implementation

{$R *.DFM}

{ TAuthGrantForm }
uses Maindm,PublicFunc;
procedure CallAuthGrantForm(aUserId,aUserName:string);
begin
  if AuthGrantForm = nil then
  begin
    AuthGrantForm:= TAuthGrantForm.Create(Application);
    AuthGrantForm.UserID := aUserID;
    AuthGrantForm.CreateTreeNone;
    AuthGrantForm.CreateTreeHave;
    AuthGrantForm.lblUser.Caption := '用户:'+aUserName;
  end;
  AuthGrantForm.ShowModal;
  AuthGrantForm.Free;
  AuthGrantForm := nil;
end;

procedure TAuthGrantForm.CreateTreeHave;
const
  Sql1 = 'SELECT * FROM Auth_item WHERE Parent_ID is null';
  Sql2 = 'SELECT * FROM AUTH_ITEM WHERE Parent_ID =%s';
  Sql3 = 'SELECT * FROM User_Auths WHERE Auth_ID =%s and User_id=%s';
var
  Root: TTreeNode;
  s,ParentID: string;
  AuthItem: PAuthItem;
begin
  //创建已有的权限树
  //创建根节点
  AuthItem := New(pAuthItem);
  s := Sql1;
  OpenQuery(DmMain.QueryPublic,S);
  with DmMain.QueryPublic do
  begin
    ParentID := FieldByName('Auth_id').Asstring;
    AuthItem^.AuthID := ParentID;
    AuthItem^.AuthName := FieldByName('Auth_Name').Asstring;
    AuthItem^.ParentID := FieldByName('Parent_id').Asstring;
  end;
  root := AddChild_Auth(tvHave,nil,AuthItem);
  s := Format(Sql3,[ParentId,UserId]);
  OpenQuery(DmMain.QueryPublic,S);
  if DmMain.QueryPublic.RecordCount = 0 then
    InsertAuthItem(pAuthItem(Root.Data));
  //2、从根节点开始,创建所有子节点;
  CreateTreeSub(1,tvHave,root,AuthItem^.AuthID);
end;

procedure TAuthGrantForm.CreateTreeSub(Kind: Integer; tv: TTreeView; parentNode: TTreeNode; AuthID: string);
const
  CON_SQL2 = 'select * from auth_item where parent_id = %s';
  CON_SQL1 = 'select * from auth_item where parent_id = %s and '+
             ' Auth_id in (select Auth_id from User_Auths where User_id=%s)';
var
  Node: TTreeNode;
  s: string;
begin
  if kind = 2 then
    s := Format(CON_SQL2,[authID])
  else
    s := Format(CON_SQL1,[authID,UserId]);

  OpenQuery(DmMain.QueryPublic,s);

  AddChild_AuthQuery(tv,parentNode,DmMain.QueryPublic);

  if not parentNode.HasChildren then Exit;

  node := parentNode.getFirstChild;
  while node <> nil do
  begin
    CreateTreeSub(Kind,tv,Node,GetAuthID(node));
    node := parentNode.GetNextChild(node);
  end;
end;


procedure TAuthGrantForm.CreateTreeNone;
const
  Sql1 = 'SELECT * FROM AUTH_ITEM WHERE Parent_ID is null';
  Sql2 = 'SELECT * FROM AUTH_ITEM WHERE Parent_ID = %s';
var
  Root: TTreeNode;
  s,ParentID: string;
  AuthItem: PAuthItem;
begin
  //创建已有的权限树
  //创建根节点
  AuthItem := New(pAuthItem);
  s := Sql1;
  OpenQuery(DmMain.QueryPublic,S);
  with DmMain.QueryPublic do
  begin
    ParentID := FieldByName('Auth_id').Asstring;
    AuthItem^.AuthID := ParentID;
    AuthItem^.AuthName := FieldByName('Auth_Name').Asstring;
    AuthItem^.ParentID := FieldByName('Parent_id').Asstring;
  end;
  root := AddChild_Auth(tvNone,nil,AuthItem);
  //2、从根节点开始,创建所有子节点;
  CreateTreeSub(2,tvNone,root,AuthItem^.AuthID);
end;

procedure TAuthGrantForm.AddChild_AuthQuery(tv: TTreeView;
  parentNode: TTreeNode; Q: TAdoQuery);
var
  Item: pAuthItem;
begin
  while not Q.Eof do
  begin
    Item := New(PAuthItem);
    GetAuthItemFormRecord(Q,Item);
    AddChild_Auth(tv,parentNode,Item);
    Q.Next;
  end;
end;

procedure TAuthGrantForm.GetAuthItemFormRecord(Q: TaDOQuery;
  var Item: pAuthItem);
begin
  Item^.AuthID := Q.FieldByName('AUTH_ID').AsString;
  Item^.parentid := Q.FieldByName('parent_id').AsString;
  Item^.AuthName := Q.FieldByName('Auth_Name').Asstring;
end;

function TAuthGrantForm.GetAuthID(Node: TTreeNode): string;
begin
  Result := PAuthItem(Node.Data)^.AuthId;
end;

function TAuthGrantForm.AddChild_Auth(tv: TTreeView; parentNode: TTreeNode;
  AuthItem: PAuthItem): TTreeNode;
begin
  Result := tv.Items.AddChild(parentNode,AuthItem^.AuthName);
  Result.Data := AuthItem;
//  Result.ImageIndex := StrToInt(AuthItem.AuthType)-1;
//  Result.SelectedIndex := Result.ImageIndex;
end;

procedure TAuthGrantForm.SpeedButton1Click(Sender: TObject);
begin
  inherited;
  SelectIn;
end;

procedure TAuthGrantForm.SpeedButton3Click(Sender: TObject);
begin
  inherited;
  SelectOut;
end;

procedure TAuthGrantForm.SelectIn;
var
  AuthItem: pAuthItem;
  parentNode: TTreeNode;
begin
  //判断父节点是否存在
  if tvNone.Selected.Level > 0 then
    if not ExistAuthNode(tvHave,pAuthItem(tvNone.Selected.Parent.Data)) then
      Raise Exception.Create('父节点不存在,请先选择父节点!');

  //判断节点是否已经存在
  if ExistAuthNode(tvHave,pAuthItem(tvNone.Selected.Data)) then
    Raise Exception.Create('节点已经存在!');

  InsertAuthItem(pAuthItem(tvNone.Selected.Data));

  AuthItem:= New(pAuthItem);
  AuthItem^.AuthID := pAuthItem(tvNone.Selected.Data)^.AuthID;
  AuthItem^.AuthName := pAuthItem(tvNone.Selected.Data)^.AuthName;


  if tvNone.Selected.Parent <> nil then
  begin
    parentNode := GetNodeFromAuthID(tvHave,pAuthItem(tvNone.Selected.Parent.Data));
  end
  else
    parentNode := nil;
  AddChild_Auth(tvHave,parentNode,AuthItem);
end;

procedure TAuthGrantForm.SelectOut;
begin
  if tvHave.Selected = nil then Exit;

  if MessageBoxQuery('您确认要收回选择的权利吗?') <> MrYes then Exit;

  DeleteAuthedItem(pAuthItem(tvHave.Selected.Data),'SELECTEDALL');
  if tvHave.Selected.HasChildren then
  begin
//    for i := 0 to tvHave.Selected.Count - 1 do
//    begin
//      aNode := tvHave.Selected.Item[i];
//      if aNode.HasChildren then
//        for j := 0 to aNode.Count - 1 do
//          aNode.Item[j].Data.Free;
//      pAuthItem(aNode.Data)^.Free;
//    end;
    tvHave.Selected.DeleteChildren;
    tvHave.Selected.Delete;
  end
  else
  begin
//    pAuthItem(tvHave.Selected.Data)^.Free;
    tvHave.Selected.Delete;
  end;
end;

procedure TAuthGrantForm.SpeedButton4Click(Sender: TObject);
begin
  inherited;
  SelectAllIn;
end;

procedure TAuthGrantForm.SpeedButton2Click(Sender: TObject);
begin
  inherited;
  SelectAllOut;
end;

procedure TAuthGrantForm.SelectAllin;
var
  AuthItem: pAuthItem;
  parentNode,Node,ChildNode: TTreeNode;
begin
  //判断父节点是否存在
  if tvNone.Selected.Level > 0 then
    if not ExistAuthNode(tvHave,pAuthItem(tvNone.Selected.Parent.Data)) then
      Raise Exception.Create('父节点不存在,请先选择父节点!');

  //判断节点是否已经存在
  if not ExistAuthNode(tvHave,pAuthItem(tvNone.Selected.Data)) then
  begin
    InsertAuthItem(pAuthItem(tvNone.Selected.Data));

    AuthItem:= New(pAuthItem);
    AuthItem^.AuthID := pAuthItem(tvNone.Selected.Data)^.AuthID;
    AuthItem^.AuthName := pAuthItem(tvNone.Selected.Data)^.AuthName;

    if tvNone.Selected.Parent<>nil then
      parentNode := GetNodeFromAuthID(tvHave,pAuthItem(tvNone.Selected.Parent.Data))
    else
      ParentNode := nil;

    AddChild_Auth(tvHave,parentNode,AuthItem);
  end;

  Node := tvNone.Selected;
  ChildNode := Node.GetFirstChild;
  while ChildNode <> nil do
  begin
    if  ExistAuthNode(tvHave,pAuthItem(ChildNode.Data)) then
    begin
      ChildNode := Node.GetNextChild(ChildNode);
      Continue;
    end;
    InsertAuthItem(pAuthItem(ChildNode.Data));

    AuthItem:= new(pAuthItem);
    AuthItem^.AuthID := pAuthItem(ChildNode.Data)^.AuthID;
    AuthItem^.AuthName := pAuthItem(ChildNode.Data)^.AuthName;

    parentNode := GetNodeFromAuthID(tvHave,pAuthItem(ChildNode.Parent.Data));
    AddChild_Auth(tvHave,parentNode,AuthItem);

    ChildNode := Node.GetNextChild(ChildNode);
  end;

end;

procedure TAuthGrantForm.SelectAllOut;
begin
  if MessageBoxQuery('您确认要所有节点吗?') <> MrYes then Exit;

  DeleteAllAuthedItem;

  ClearAuthRoleTree;

end;

function TAuthGrantForm.ExistAuthNode(ATv: TTreeView;
  Item: pAuthItem): boolean;
var
  I: integer;
begin
  Result := False;
  for I := 0 to ATv.Items.Count-1 do
  begin
    if (pAuthItem(ATv.Items[I].Data)^.AuthID = Item^.AuthID) then
    begin
      Result := True;
      Break;
    end;
  end;
end;

procedure TAuthGrantForm.InsertAuthItem(AuthItem: pAuthItem);
const CON_SQL5 = 'insert into User_Auths(Auth_id,User_id)'+
'  values(%s,%s)';
const CON_SQL52 = 'delete from User_Auths where auth_id=%s and User_id=%s';
var
  s,s2: string;
begin
  with AuthItem^ do
  begin
    s := Format(CON_SQL5,[AuthID,UserId]);
    s2 := Format(CON_SQL52,[AuthID,UserId]);
  end;
  ExecuteQuery(QueryPublic,s2);
  ExecuteQuery(QueryPublic,s);
end;

function TAuthGrantForm.GetNodeFromAuthID(ATv: TTreeView;
  Item: pAuthItem): TTreeNode;
var
  I: integer;
begin
  Result := nil;
  for I := 0 to ATv.Items.Count-1 do
  begin
    if pAuthItem(ATv.Items[I].Data)^.AuthID = Item^.AuthID then
    begin
      Result := ATv.Items[I];
      Break;
    end;
  end;
end;

procedure TAuthGrantForm.DeleteAuthedItem(AuthItem: pAuthItem;
  Scope: string);
const CON_SQL6 = 'delete from User_Auths where auth_id=%s and user_id=%s ';
const CON_SQL7 = 'delete from User_auths where user_id=%s '+
' and auth_id in (select auth_id from auth_item where parent_id =%s)';
var
  s: string;
begin
  //下级节点
  if UpperCase(Scope)='SELECTEDALL' then
  with AuthItem^ do
  begin
    s := Format(CON_SQL7,[systemInfo.UserID,AuthID]);
    ExecuteQuery(QueryPublic,s);
  end;

  //被选择节点
  with AuthItem^ do
  begin
    s := Format(CON_SQL6,[AuthID,systemInfo.UserID]);
    ExecuteQuery(QueryPublic,s);
  end;

end;

procedure TAuthGrantForm.DeleteAllAuthedItem;
const CON_SQL8 = 'delete from User_auths where User_id=%s ';
var
  s: string;
begin
  //删除所有节点
  s := Format(CON_SQL8,[SystemInfo.UserID]);
  ExecuteQuery(QueryPublic,s);
end;

procedure TAuthGrantForm.ClearAuthRoleTree;
begin
//  for I := 0 to tvHave.Items.Count-1 do
//    TAuthItem(tvHave.Items[I].Data).Free;
  tvHave.Items.Clear;
end;

procedure TAuthGrantForm.QueryPublicPostError(DataSet: TDataSet;
  E: EDatabaseError; var Action: TDataAction);
begin
  inherited;
  DmMain.ADOConnection1.RollbackTrans;
  Action := DaAbort;
end;

procedure TAuthGrantForm.QueryPublicAfterPost(DataSet: TDataSet);
begin
  inherited;
  DmMain.ADOConnection1.CommitTrans;
end;

procedure TAuthGrantForm.QueryPublicBeforePost(DataSet: TDataSet);
begin
  inherited;
  DmMain.ADOConnection1.BeginTrans;
end;

end.

⌨️ 快捷键说明

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