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

📄 uuserattr.pas

📁 用户权限管理系统
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit uUserAttr;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, RzTabs, RzButton, StdCtrls, RzLabel, Grids, DBGridEh,
  cxControls, cxContainer, cxEdit, cxTextEdit, cxMemo, ExtCtrls, RzPanel,
  cxMaskEdit, cxDropDownEdit, cxCalendar, cxRadioGroup, cxCheckBox,
  XP_IpEdit, ComCtrls, RzTreeVw, fcTreeView,
  untUser, DB, DBClient, ImgList, cxLookupEdit, cxDBLookupEdit,
  cxDBLookupComboBox, ActiveX;

type
  TfrmUserAttr = class(TForm)
    RzPageControl1: TRzPageControl;
    TabSheet1: TRzTabSheet;
    TabSheet2: TRzTabSheet;
    RzButton1: TRzButton;
    RzButton2: TRzButton;
    lab_Title: TRzLabel;
    RzLabel1: TRzLabel;
    TabSheet3: TRzTabSheet;
    TabSheet4: TRzTabSheet;
    Bevel1: TBevel;
    lab_Name: TRzLabel;
    RzLabel2: TRzLabel;
    lab_LoginName: TRzLabel;
    RzLabel4: TRzLabel;
    lab_LoginType: TRzLabel;
    RzLabel6: TRzLabel;
    lab_UseStat: TRzLabel;
    RzLabel8: TRzLabel;
    lab_LimitDate: TRzLabel;
    RzLabel10: TRzLabel;
    lab_CreateDate: TRzLabel;
    RzLabel12: TRzLabel;
    lab_BeginDate: TRzLabel;
    RzLabel14: TRzLabel;
    lab_LastDate: TRzLabel;
    RzLabel16: TRzLabel;
    lab_UseSysNum: TRzLabel;
    RzLabel18: TRzLabel;
    lab_ManageSysNum: TRzLabel;
    RzGroupBox1: TRzGroupBox;
    RzLabel3: TRzLabel;
    cxTextEdit1: TcxTextEdit;
    RzLabel5: TRzLabel;
    cxTextEdit2: TcxTextEdit;
    RzLabel7: TRzLabel;
    cxMemo1: TcxMemo;
    RzGroupBox2: TRzGroupBox;
    RzGroupBox3: TRzGroupBox;
    RzLabel9: TRzLabel;
    cxTextEdit3: TcxTextEdit;
    RzLabel11: TRzLabel;
    cxTextEdit4: TcxTextEdit;
    RzButton3: TRzButton;
    RzButton4: TRzButton;
    Panel1: TPanel;
    cxRadioButton1: TcxRadioButton;
    cxRadioButton2: TcxRadioButton;
    cxRadioButton3: TcxRadioButton;
    cxRadioButton4: TcxRadioButton;
    cxDateEdit1: TcxDateEdit;
    Bevel2: TBevel;
    RzGroupBox4: TRzGroupBox;
    cxTextEdit5: TcxTextEdit;
    cxRadioButton5: TcxRadioButton;
    cxRadioButton6: TcxRadioButton;
    cxRadioButton7: TcxRadioButton;
    cxCheckBox1: TcxCheckBox;
    cxTextEdit6: TcxTextEdit;
    XP_IpEdit1: TXP_IpEdit;
    RzButton5: TRzButton;
    RzButton6: TRzButton;
    TabSheet5: TRzTabSheet;
    RzGroupBox5: TRzGroupBox;
    cxRadioButton8: TcxRadioButton;
    cxRadioButton9: TcxRadioButton;
    RzButton7: TRzButton;
    TV_Sub: TfcTreeView;
    RzLabel13: TRzLabel;
    RzLabel15: TRzLabel;
    TV_SubRight: TfcTreeView;
    cds_SubSys: TClientDataSet;
    cds_SubMod: TClientDataSet;
    ImageList1: TImageList;
    cxLookupComboBox1: TcxLookupComboBox;
    cds_Sd: TClientDataSet;
    cds_SdV01: TStringField;
    cds_SdV02: TStringField;
    ds_SD: TDataSource;
    cds_Card: TClientDataSet;
    procedure RzButton2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure cxRadioButton1Click(Sender: TObject);
    procedure cxRadioButton2Click(Sender: TObject);
    procedure RzButton7Click(Sender: TObject);
    procedure cxLookupComboBox1PropertiesChange(Sender: TObject);
    procedure cxRadioButton9Click(Sender: TObject);
    procedure cxRadioButton8Click(Sender: TObject);
    procedure TV_SubRightToggleCheckbox(TreeView: TfcCustomTreeView;
      Node: TfcTreeNode);
    procedure TV_SubRightMouseDown(TreeView: TfcCustomTreeView;
      Node: TfcTreeNode; Button: TMouseButton; Shift: TShiftState; X,
      Y: Integer);
    procedure TV_SubRightMouseUp(TreeView: TfcCustomTreeView;
      Node: TfcTreeNode; Button: TMouseButton; Shift: TShiftState; X,
      Y: Integer);
    procedure RzButton1Click(Sender: TObject);
    procedure cxTextEdit2Exit(Sender: TObject);
    procedure cxTextEdit3Exit(Sender: TObject);
    procedure RzPageControl1Click(Sender: TObject);
    procedure cxRadioButton6Click(Sender: TObject);
    procedure cxRadioButton7Click(Sender: TObject);
    procedure cxRadioButton3Click(Sender: TObject);
    procedure cxRadioButton4Click(Sender: TObject);
    procedure RzButton4Click(Sender: TObject);
    procedure RzButton3Click(Sender: TObject);
    procedure cxRadioButton5Click(Sender: TObject);
    procedure RzButton5Click(Sender: TObject);
    procedure RzButton6Click(Sender: TObject);
    procedure XP_IpEdit1Exit(Sender: TObject);
  private
    { Private declarations }
    // TV_SubRightToggleCheckbox 勾选事件可以由 鼠标点选 和 设置节点的 Node.Checked引起
    // 设置Clicked 变量是为了表明 ToggleCheckbox 是因为鼠标而触发,节点的 Node.Checked
    // 被置之不理
    Clicked: boolean;

    //动态IP控件数组
    EditAry: array of TXP_IpEdit;

    //动态生成IP编辑控件
    procedure NewIpEdit;

    //初始化数据
    procedure InitData;

    //初始化权限树
    procedure InitTree;

    //设置权限组下拉列表框
    procedure FillCombobox;

    //根据 登陆方式的变化 设置控件的状态
    procedure ChangeLoginStat;

    //根据子系统ID取得子系统节点,不限定哪个树控件,现有2个树控件
    function GetSysNode(TV: TfcTreeView; const SysId: string): TfcTreeNode;

    //根据子系统ID和模块ID,取得子系统模块节点
    function GetRightNode(const SysId, ModId: string): TfcTreeNode;
    //根据子系统ID取得子系统管理员节点
    function GetSysAdminNode(const SysId: string): TfcTreeNode;

    //设置子系统管理员权限树
    procedure SetSysAdminTree;

    //根据独立权限表设置用户的权限
    procedure SetRightTreeFromUser(const UserId: string);
    //根据组权限设置用户权限
    procedure SetRightTreeFromUserGrp(const GrpId: string);

    //清除子系统模块权限树勾选标记
    procedure ClearRightTreeChecked;

    //由权限树设置用户的权限
    procedure SetUserRightFromTree(const UserId: string);

    //设置子系统管理员的权限
    procedure SetAdminRight(const UserId: string);

    // 将用户添加到组
    procedure SetUserToGrp(const UserId, GrpId: string);

  public
    { Public declarations }
    CurUser: TUser;
  end;

  //使用线程 初始化 用户数据
  TInitThread = class(TThread)
  protected
    procedure Execute; override;
  end;

var
  frmUserAttr: TfrmUserAttr;

implementation

uses untDM, uRightGrp, untPublic, uChangePwd, uUserLog, uChangePwdCard,
  untCustomReport;

{$R *.dfm}

procedure TfrmUserAttr.RzButton2Click(Sender: TObject);
begin
  ModalResult := mrCancel;
  close;
end;

procedure TfrmUserAttr.FormCreate(Sender: TObject);
begin
  lab_Name.Caption := '';
  lab_LoginName.Caption := '';
  lab_LoginType.Caption := '';
  lab_UseStat.Caption := '';
  lab_LimitDate.Caption := '';
  lab_CreateDate.Caption := '';
  lab_BeginDate.Caption := '';
  lab_LastDate.Caption := '';
  lab_UseSysNum.Caption := '';
  lab_ManageSysNum.Caption := '';
  Clicked := false;
  setlength(EditAry, 1);
  EditAry[0] := XP_IpEdit1;
  RzPageControl1.ActivePageIndex := 0;
end;

procedure TfrmUserAttr.FormShow(Sender: TObject);
var
  i: smallint;
begin
  if CurUser.IsNew then
  begin
    RzButton3.Enabled := false;
    RzButton4.Enabled := false;
  end;

  TInitThread.Create(False);

  if CurUser.IpCount >= 1 then
  begin
    XP_IpEdit1.IP := CurUser.IpAry[0];

    for i := 1 to CurUser.IpCount - 1 do
    begin
      NewIpEdit;
      EditAry[i].IP := CurUser.IpAry[i];
    end;
  end;

end;

procedure TfrmUserAttr.cxRadioButton1Click(Sender: TObject);
begin
  cxRadioButton3.Enabled := true;
  cxRadioButton4.Enabled := true;
  cxDateEdit1.Enabled := true;
  CurUser.V08 := 1;
  lab_UseStat.Caption := CurUser.V33;
end;

procedure TfrmUserAttr.cxRadioButton2Click(Sender: TObject);
begin
  cxRadioButton3.Enabled := false;
  cxRadioButton4.Enabled := false;
  cxDateEdit1.Enabled := false;
  CurUser.V08 := 0;
  lab_UseStat.Caption := CurUser.V33;

end;

{ TInitThread }

procedure TInitThread.Execute;
begin
  inherited;
  FreeOnTerminate := true;
  CoInitialize(nil);
  frmUserAttr.FillCombobox;
  frmUserAttr.InitTree;
  frmUserAttr.InitData;
  frmUserAttr.SetSysAdminTree;
  CoUninitialize;
end;

procedure TfrmUserAttr.InitData;
begin
  //从用户对象信息设置 用户信息摘要
  lab_Name.Caption := CurUser.V03;
  lab_LoginName.Caption := CurUser.V02;
  lab_LoginType.Caption := CurUser.V35;
  lab_UseStat.Caption := CurUser.V33;
  lab_LimitDate.Caption := CurUser.V34;
  lab_CreateDate.Caption := CurUser.V05;
  lab_BeginDate.Caption := CurUser.V06;
  lab_LastDate.Caption := CurUser.V07;
  lab_UseSysNum.Caption := inttostr(CurUser.V18);
  lab_ManageSysNum.Caption := inttostr(CurUser.V19);

  //设置单位信息
  cxTextEdit1.Text := CurUser.V11;
  //设置用户姓名
  cxTextEdit2.Text := CurUser.V03;
  //设置备注
  cxMemo1.Text := CurUser.V20;
  //设置登陆名
  cxTextEdit3.Text := CurUser.V02;
  //设置密码
  cxTextEdit4.Text := CurUser.V04;

  //开通状态: 1 为开通,0 为关闭
  if CurUser.V08 = 1 then
  begin
    //开通状态下
    cxRadioButton1.Checked := true;
    cxRadioButton3.Enabled := true;
    cxRadioButton4.Enabled := true;
    cxDateEdit1.Enabled := true;
    //开通期限类别: 1永久,0 截止到一日期
    if CurUser.V09 = 1 then
      cxRadioButton3.Checked := true
    else
    begin
      cxRadioButton4.Checked := true;
      cxDateEdit1.EditText := CurUser.V10;
    end;
  end
  else
  begin
    //关闭状态
    cxRadioButton2.Checked := true;
    cxRadioButton3.Checked := false;
    cxRadioButton4.Checked := false;
    cxRadioButton3.Enabled := false;
    cxRadioButton4.Enabled := false;
    cxDateEdit1.Enabled := false;
    cxDateEdit1.EditText := '';
  end;

  // 登陆方式
  case CurUser.V12 of
    0: cxRadioButton5.Checked := true;
    1: cxRadioButton6.Checked := true;
    2: cxRadioButton7.Checked := true;
  end;
  //根据登陆方式改变相关控件状态
  ChangeLoginStat;

  //如果用户有口令卡,则设置口令卡控件
  if CurUser.PCard <> nil then
    cxTextEdit5.Text := CurUser.PCard.V01;

  //IP网址绑定
  if CurUser.V13 = 1 then
    cxCheckBox1.Checked := true
  else
    cxCheckBox1.Checked := false;

  // 权限设置方式:1 独立设置,0 同组权限
  if CurUser.V16 = 1 then
  begin
    //独立设置
    cxRadioButton9.Checked := true;

    //如果用户不是新用户(新用户编号在存盘前为空),则设置用户的独立权限
    if not CurUser.IsNew then
      SetRightTreeFromUser(CurUser.V01);
  end
  else
  begin
    cxRadioButton8.Checked := true;

    //如果用户不是新用户(新用户编号在存盘前为空),则根据组权限设置用户权限
    if not CurUser.IsNew then
    begin
      cxLookupComboBox1.EditValue := CurUser.V17;
      SetRightTreeFromUserGrp(CurUser.V17);
    end;
  end;

end;

procedure TfrmUserAttr.InitTree;
var
  Node: TfcTreeNode;
begin
  with cds_SubSys do
  begin
    if Active then
      Active := false;
    XMLData := DM.FreeQuery('select * from T_005 order by V01');
    Active := true;
  end;

  with cds_SubMod do
  begin
    if Active then
      Active := false;
    XMLData := DM.FreeQuery('select * from T_005_L order by V01,V02');
    Active := true;
  end;

  //初始化权限树
  with cds_SubSys do
  begin
    first;
    while not eof do
    begin
      //生成子系统权限树中子系统节点
      Node := TV_Sub.Items.AddChild(nil, trim(fieldbyname('V02').AsString));
      Node.StringData := trim(fieldbyname('V01').AsString);
      Node.ImageIndex := 0;

      //生成管理员权限树中子系统节点
      Node := TV_SubRight.Items.AddChild(nil,
        trim(fieldbyname('V02').AsString));
      Node.StringData := trim(fieldbyname('V01').AsString);
      Node.StringData2 := trim(fieldbyname('V02').AsString);
      Node.ImageIndex := 0;

      //生成管理员权限树中子系统管理员节点
      Node := TV_SubRight.Items.AddChild(Node, '子系统管理员');
      Node.StringData := trim(fieldbyname('V01').AsString);
      Node.CheckboxType := tvctCheckbox;
      Node.ImageIndex := -1;

      next;
    end;
  end;
  TV_SubRight.FullExpand;

  //生成子系统权限树的子系统模块节点
  with cds_SubMod do
  begin
    first;
    while not eof do
    begin
      Node := TV_Sub.Items.AddChild(
        GetSysNode(TV_Sub, trim(fieldbyname('V01').AsString)),
        trim(fieldbyname('V03').AsString));
      Node.StringData := trim(fieldbyname('V02').AsString);
      Node.StringData2 := trim(fieldbyname('V01').AsString);
      Node.CheckboxType := tvctCheckbox;
      Node.ImageIndex := -1;

      next;
    end;
  end;
  TV_Sub.FullExpand;
end;

function TfrmUserAttr.GetSysNode(TV: TfcTreeView; const SysId: string):
  TfcTreeNode;
var
  i: integer;
begin
  result := nil;
  for i := 0 to TV.Items.Count - 1 do
  begin
    if TV.Items[i].Level = 0 then
      if TV.Items[i].StringData = SysId then
      begin
        result := TV.Items[i];
        break;
      end;
  end;
end;

procedure TfrmUserAttr.FillCombobox;
begin
  if cds_Sd.Active then
    cds_Sd.Close;
  cds_Sd.XMLData := DM.FreeQuery('select V01,V02 from T_004 order by V01');
  cds_Sd.Active := true;
end;

procedure TfrmUserAttr.RzButton7Click(Sender: TObject);
var
  V01: string;
begin
  if trim(cxLookupComboBox1.Text) = '' then
    V01 := ''
  else
    V01 := trim(cxLookupComboBox1.EditValue);

  frmRightGrp := TfrmRightGrp.Create(nil);
  frmRightGrp.ShowModal;
  frmRightGrp.Free;
  FillCombobox;
  cxLookupComboBox1.EditValue := V01;
end;

procedure TfrmUserAttr.SetRightTreeFromUser(const UserId: string);
var
  Node: TfcTreeNode;
  cSqlStr: string;
begin
  cSqlStr := 'select * from T_004_L2 where V01=' + QuotedStr(UserId) +
    ' order by V02,V03';
  with cds_SubMod do
  begin
    if Active then
      Active := false;
    XMLData := DM.FreeQuery(cSqlStr);
    Active := true;
  end;

  with cds_SubMod do
  begin
    first;
    while not eof do
    begin
      Node := GetRightNode(trim(fieldbyname('V02').AsString),
        trim(fieldbyname('V03').AsString));
      if Node <> nil then
        Node.Checked := true;
      next;
    end;
  end;
end;

procedure TfrmUserAttr.SetRightTreeFromUserGrp(const GrpId: string);
var
  Node: TfcTreeNode;
  cSqlStr: string;
begin
  if trim(GrpId) = '' then
    exit;

⌨️ 快捷键说明

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