📄 authgrantfrm.~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;
GroupBox3: TGroupBox;
TreeView1: TTreeView;
GroupBox4: TGroupBox;
TreeView2: TTreeView;
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 + -