usermanager.pas
来自「delphi框架可以学习, 写的很好的」· PAS 代码 · 共 398 行
PAS
398 行
unit UserManager;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, BasicFind, Menus, ActnList, ImgList, StdCtrls, RzLstBox,
RzBckgnd, RzButton, RzEdit, RzLabel, Mask, RzRadChk, RzPanel, ExtCtrls,
Grids, DBGridEh, ComCtrls, RzTreeVw, RzDBEdit, RzRadGrp, RzDBRGrp, DB,
ppEndUsr, ppBands, ppCache, ppClass, ppProd, ppReport, ppDB, ppComm,
ppRelatv, ppDBPipe;
type
TfrmUserManager = class(TfrmBasicFind)
RzPanel8: TRzPanel;
RzPanel9: TRzPanel;
dbgridList: TDBGridEh;
ctreePower: TRzCheckTree;
Splitter1: TSplitter;
procedure FormCreate(Sender: TObject);
procedure ctreePowerStateChange(Sender: TObject; Node: TTreeNode;
NewState: TRzCheckState);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
procedure doAfterScroll(DataSet: TDataSet);
procedure doAfterPost(DataSet: TDataSet);
procedure doMyOpen(Sender: TObject; var _EventNote, _State: String); override;
procedure doNewData(Sender: TObject; var _EventNote, _State: String); override;
procedure doSave(Sender: TObject; var _EventNote, _State: String); override;
procedure doCancel(Sender: TObject; var _EventNote, _State: String); override;
procedure doDelete(Sender: TObject; var _EventNote, _State: String); override;
function SelfWhereSQL: String; override;
public
{ Public declarations }
procedure MakePowerTree;
procedure ShowUserPowerTree;
end;
var
frmUserManager: TfrmUserManager;
implementation
uses MyPublic, dm32, md5;
{$R *.dfm}
procedure TfrmUserManager.doCancel(Sender: TObject; var _EventNote, _State: String);
begin
//取消用户资料修改(1、取消UserInfo数据集,2、恢复权限树)
if UseDataSet.State in [dsEdit, dsInsert] then
begin
UseDataSet.Cancel;
doAfterScroll(UseDataSet);
end;
end;
procedure TfrmUserManager.doDelete(Sender: TObject; var _EventNote, _State: String);
var SQLs: TStrings;
ls_User, ls_Err: String;
begin
//删除用户
ls_User := UseDataSet.FieldByName('USERCODE').AsString;
if not ShowMess('提示','确定要删除用户'+ls_User+'吗?', MB_OKCANCEL) then Exit;
_State := EV_OK;
_EventNote := '删除用户' + ls_user;
SQLs := TStringList.Create;
try
if UseDataSet.State in [dsEdit, dsInsert] then
UseDataSet.Post;
//清理界面
UseDataSet.Delete;
//开始删除
SQLs.Add('DELETE FROM USERINFO WHERE USERCODE='''+ ls_User +'''');
SQLs.Add('DELETE FROM USERPOWER WHERE USERCODE='''+ ls_User +'''');
ls_Err := doBatchSQL(SQLs);
if ls_Err <> '' then
begin
ShowMess('系统错误', '删除用户'+ ls_User+'资料时出错,具体为:'+ ls_Err, MB_ICONERROR);
_State := EV_FAIL;
Exit;
end;
ShowMess('提示','成功删除用户'+ ls_User, MB_OK);
finally
SQLs.Free;
end;
end;
procedure TfrmUserManager.doMyOpen(Sender: TObject; var _EventNote, _State: String);
var ls_SQL, ls_where, ls_Err: String;
begin
_State := EV_OK;
ls_where := WhereSQL;
if ls_where = '' then Exit;
ls_SQL := 'SELECT * FROM USERINFO WHERE '+ ls_where;
ls_Err := OpenDataSet(UseDataSet, ls_SQL);
if ls_Err <> '' then
begin
ShowMess('系统错误','打开用户资料时出错,具体为:'+ ls_Err, MB_ICONERROR);
_State := EV_FAIL;
end;
_EventNote := '打开系统日志,条件:'+ls_where;
end;
procedure TfrmUserManager.doNewData(Sender: TObject; var _EventNote, _State: String);
var ls_SQL, ls_Err: String;
begin
_EventNote := '新增用户资料';
_State := EV_OK;
if not UseDataSet.Active then
begin
ls_SQL := 'SELECT * FROM USERINFO WHERE 0=1';
ls_Err := OpenDataSet(UseDataSet, ls_SQL);
if ls_Err <> '' then
begin
ShowMess('系统错误','打开用户资料框架表出错,具体为:'+ ls_Err, MB_ICONERROR);
_State := EV_FAIL;
Exit;
end;
end;
if UseDataSet.State in [dsEdit, dsInsert] then
UseDataSet.Post;
UseDataSet.Append;
end;
procedure TfrmUserManager.doSave(Sender: TObject; var _EventNote, _State: String);
var ls_Code, ls_UserCode, ls_SQL, ls_Err: String;
li_Count, li_Power : Integer;
begin
ls_UserCode := dm.qryUserInfo.FieldByName('USERCODE').AsString;
_EventNote := '保存用户'+ ls_UserCode +'权限数据';
_State := EV_OK;
//先清除原有权限
ls_SQL := 'DELETE FROM USERPOWER WHERE USERCODE='''+ ls_UserCode+'''';
ls_Err := doSQL(ls_SQL);
if ls_Err <> '' then
begin
ShowMess('系统错误','准备用户权限资料库时失败,具体为:'+ ls_Err, MB_ICONERROR);
_State := EV_FAIL;
Exit;
end;
ls_SQL := 'SELECT * FROM POWERINFO';
ls_Err := OpenDataSet(dm.qryFree, ls_SQL);
if ls_Err <> '' then
begin
ShowMess('系统错误','打开备用权限资料库时出错!具体为:'+ ls_Err, MB_ICONERROR);
_State := EV_FAIL;
Exit;
end;
for li_Count :=0 to ctreePower.Items.Count-1 do
if ctreePower.Items.Item[li_Count].Parent <> nil then
begin
//确认是否有该项权限
if ctreePower.ItemState[li_Count] in [csChecked, csPartiallyChecked] then
li_Power := POWER_YES
else
li_Power := POWER_NO;
//确认权限名称,并且定位权限库
ls_Code := ctreePower.Items.Item[li_Count].Text;
if (Pos('[', ls_Code)=0) and (Pos(']', ls_Code)=0) then
ls_Code := GetKeyValue(ctreePower.Items.Item[li_Count].Text, 1)
else
ls_Code := Copy(ls_Code, 2, Pos(']', ls_Code)-2);
if not dm.qryFree.Locate('CODE', ls_Code,[]) then
begin
ShowMess('提示','在权限库中找不到你所选择的权限['+ctreePower.Items.Item[li_Count].Text+']!保存动作中止!', MB_OK);
_State := EV_FAIL;
Exit;
end;
ls_SQL := 'INSERT INTO USERPOWER (USERCODE, NAME, CODE, WINNAME, ACTNAME, DJ, VALID) VALUES ('+
'''' + ls_UserCode + ''','+
'''' + dm.qryFree.FieldByName('NAME').AsString + ''','+
'''' + dm.qryFree.FieldByName('CODE').AsString + ''','+
'''' + dm.qryFree.FieldByName('WINNAME').AsString + ''','+
'''' + dm.qryFree.FieldByName('ACTNAME').AsString + ''','+
dm.qryFree.FieldByName('DJ').AsString + ','+
IntToStr(li_Power) + ')';
ls_Err := doSQL(ls_SQL);
if ls_Err <> '' then
begin
ShowMess('系统错误','保存用户权限资料时失败,具体为:'+ ls_Err, MB_ICONERROR);
_State := EV_FAIL;
Exit;
end;
end;
if dm.qryUserInfo.State in [dsEdit, dsInsert] then
dm.qryUserInfo.Post;
ShowMess('提示','用户'+ls_UserCode+'的资料成功保存!注:新增用户默认密码为“qianjin”。', MB_OK);
end;
procedure TfrmUserManager.FormCreate(Sender: TObject);
begin
inherited;
FindFields[1] := 'USERCODE='''+REPLACEKEY+'''';
FindFields[2] := 'GROUPNAME='''+REPLACEKEY+'''';
FindFields[3] := 'EMPNAME='''+REPLACEKEY+'''';
FindFields[4] := '((MAC1='''+REPLACEKEY+''') OR '+'(MAC2='''+REPLACEKEY+''') OR '+'(MAC3='''+REPLACEKEY+'''))' ;
FindFields[13]:= 'SRRQ';
//设置界面
BtnCheck.Visible := False;
BtnUnCheck.Visible := False;
RzSpacer3.Visible := False;
_CurrentModule := Name;
UseDataSet := dm.qryUserInfo;
with UseDataSet do
begin
AfterPost := doAfterPost;
AfterScroll := doAfterScroll;
BeforeEdit := doBeforeEdit;
end;
//设置权限树
MakePowerTree;
end;
procedure TfrmUserManager.MakePowerTree;
var ls_SQL, ls_Err: String;
tn0, tn1, tn2, tn3: TTreeNode;
i: integer;
begin
//生成权限树,这里写死了,三层权限。没有使用递归
//在这里生成权限树,除了SYSTEM用户以外,其它用户只能将自己已有的权限进行下放。
ctreePower.Items.Clear;
if UpperCase(CurrentUser.UserCode) = 'SYSTEM' then
ls_SQL := 'SELECT DJ, CODE, NAME FROM POWERINFO ORDER BY LEFT(CODE,2), LEFT(CODE,5), LEFT(CODE,8), DJ'
else
ls_SQL := 'SELECT * FROM USERPOWER '+
'WHERE USERCODE= ''' + CurrentUser.UserCode + ''''+
' ORDER BY LEFT(CODE,2), LEFT(CODE,5), LEFT(CODE,8), DJ';;
ls_err := OpenDataSet(dm.qryPowerTree, ls_SQL);
if ls_Err <> '' then
begin
ShowMess('系统错误','打开系统功能数据集失败,具体为:'+ ls_Err, MB_ICONERROR);
Exit;
end;
if not dm.qryPowerTree.Active then Exit;
if dm.qryPowerTree.IsEmpty then Exit;
//开始生成
tn0 := ctreePower.Items.Add(nil, '系统功能');
with dm.qryPowerTree do
while Not Eof do
begin
if FieldByName('DJ').AsInteger = 1 then
begin
tn1 := ctreePower.Items.AddChild(tn0, FieldByName('NAME').AsString); //一级权限
tn1.StateIndex := FieldByName('CODE').AsInteger;
tn1.ImageIndex := 32;
tn1.SelectedIndex := 26;
end;
if FieldByName('DJ').AsInteger = 2 then
begin
tn2 := ctreePower.Items.AddChild(tn1, FieldByName('CODE').AsString + ' = '+ FieldByName('NAME').AsString); //二级权限
tn2.ImageIndex := 11;
tn2.SelectedIndex := 10;
end;
if FieldByName('DJ').AsInteger = 3 then
begin
tn3 := ctreePower.Items.AddChild(tn2, FieldByName('CODE').AsString + ' = '+ FieldByName('NAME').AsString); //三级权限
tn3.ImageIndex := 3;
tn3.SelectedIndex := 2;
if UpperCase(CurrentUser.UserCode) <> 'SYSTEM' then
if FieldByName('VALID').AsInteger = POWER_YES then
ctreePower.ChangeNodeCheckState(tn3, csChecked);
end;
Next;
end;
//全部展开
for i:=0 to ctreePower.Items.Count-1 do
if ctreePower.Items.Item[i].HasChildren then
ctreePower.Items.Item[i].Expanded := True
else
begin
//主要为了显示问题。
ctreePower.ChangeNodeCheckState(ctreePower.Items.Item[i], csChecked);
ctreePower.ChangeNodeCheckState(ctreePower.Items.Item[i], csUnchecked);
end;
end;
function TfrmUserManager.SelfWhereSQL: String;
begin
//限制不能修改自己的权限以及管理员的权限
//这里还要处理一个用户等级的问题。比较复杂
if not (UpperCase(CurrentUser.UserCode) = 'SYSTEM') then
Result := 'NOT USERCODE IN (''' + CurrentUser.UserCode + ''', ''SYSTEM'')';
end;
procedure TfrmUserManager.doAfterScroll(DataSet: TDataSet);
var ls_User, ls_SQL, ls_Err: String;
begin
//滚动时显示用户权限
ls_User:= dm.qryUserInfo.FieldByName('USERCODE').AsString;
ls_SQL := 'SELECT * FROM USERPOWER WHERE USERCODE='''+ ls_User+''''+
' AND VALID='+ IntToStr(POWER_YES)+
' ORDER BY LEFT(CODE,2), LEFT(CODE,5), LEFT(CODE,8), DJ';
ls_Err := OpenDataSet(dm.qryUserPower, ls_SQL);
if ls_Err <> '' then
begin
ShowMess('系统错误','打开用户 ['+ ls_user +'] 权限时出错,具体为:'+ls_Err, MB_ICONERROR);
Exit;
end;
//将用户的权限显示在权限树上
if dm.qryUserPower.IsEmpty then Exit;
ShowUserPowerTree;
end;
procedure TfrmUserManager.ShowUserPowerTree;
var tn_tmp: TTreeNode;
i: integer;
begin
//显示用户权限树
if not dm.qryUserPower.Active then Exit;
if dm.qryUserPower.IsEmpty then Exit;
//开始生成
with dm.qryUserPower do
for i:=0 to cTreePower.Items.Count-1 do
begin
if Locate('DJ;CODE', VarArrayof(['3', GetKeyValue(cTreePower.Items.Item[i].Text,1)]), []) then
cTreePower.ChangeNodeCheckState(cTreePower.Items.Item[i], csChecked)
else
cTreePower.ChangeNodeCheckState(cTreePower.Items.Item[i], csUnChecked);
end;
end;
procedure TfrmUserManager.doAfterPost(DataSet: TDataSet);
begin
//保存规则
with DataSet do
try
AfterPost := nil;
Edit;
if FieldByName('PASSWORD').isNull then
FieldByName('PASSWORD').AsString := sMd5.md5('qianjin');
FieldByName('SRRQ').AsDateTime := now;
FieldByName('CZY').AsString := CurrentUser.EmpName;
Post;
finally
AfterPost := doAfterPost;
end;
end;
procedure TfrmUserManager.ctreePowerStateChange(Sender: TObject;
Node: TTreeNode; NewState: TRzCheckState);
begin
if not UseDataSet.Active then Exit;
if UseDataSet.IsEmpty then Exit;
UseDataSet.Edit;
SetButtonState(UseDataSet);
end;
procedure TfrmUserManager.FormDestroy(Sender: TObject);
begin
dm.qryPowerTree.Close;
dm.qryUserPower.Close;
inherited;
end;
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?