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 + -
显示快捷键?