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

📄 loginfrm.pas

📁 供水营销打印程序源码
💻 PAS
字号:
unit LoginFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, SJCustomProperty, cxLookAndFeelPainters, PropStorageEh,
  StdCtrls, cxButtons, ExtCtrls, cxControls, cxContainer, cxEdit, Registry,
  cxTextEdit, cxMaskEdit, cxDropDownEdit, cxLookupEdit, cxDBLookupEdit,
  cxDBLookupComboBox, cxDBEdit, fcLabel;

type
  TfrmPropertyLogin = class(TSJCustomPropertyForm)
    Label1: TLabel;
    Label2: TLabel;
    edtUser: TcxLookupComboBox;
    edtPassword: TcxMaskEdit;
    btnChangePassword: TcxButton;
    labHint: TfcLabel;
    Timer: TTimer;
    Image1: TImage;
    fcLabel39: TfcLabel;
    procedure FormShow(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
    procedure btnOKClick(Sender: TObject);
    procedure btnChangePasswordClick(Sender: TObject);
    procedure edtUserPropertiesEditValueChanged(Sender: TObject);
  private
    FIsFirstLogin: Boolean;
    Fflag: Boolean;
    FLoginCount: Integer;
  public
    { Public declarations }
  end;

var
  frmPropertyLogin: TfrmPropertyLogin;

implementation

uses InvPrintDM, MainFrm, SJInvPrintGlobal, Encryption, sjUtils,
  ChangePasswordFrm;

{$R *.dfm}

procedure TfrmPropertyLogin.FormShow(Sender: TObject);
// 显示最后一次登录的用户名
begin
  inherited;
  with TRegistry.Create do
  try
    RootKey := HKEY_LOCAL_MACHINE;
    if OpenKey(GREGsysPath, False) then
      if ValueExists('Default User') then
      begin
        edtUser.EditValue := ReadString('Default User');
        edtPassword.SetFocus;
      end;
    CloseKey;
  finally
    Free;
  end;
  // 默认为超级用户
  if edtUser.EditText = '' then
    edtUser.EditValue := '00000';
    
  FLoginCount := 1;
  //edtUserPropertiesEditValueChanged(Sender);
  edtPassword.SetFocus;
end;

procedure TfrmPropertyLogin.TimerTimer(Sender: TObject);
// 提示用户更改密码
begin
  inherited;
  Fflag := not Fflag;
  if Fflag then
    btnChangePassword.Font.Style := btnChangepassword.Font.Style + [fsBold]
  else
    btnChangePassword.Font.Style := btnChangepassword.Font.Style - [fsBold];
end;

procedure TfrmPropertyLogin.btnOKClick(Sender: TObject);
var
  APassword: string;
begin
  inherited;
    // 对用户输入密码进行校验计数
    if FLoginCount < gLoginCount then with dmInvPrint do
    begin
      Inc(FLoginCount);
      // 检查是否是系统默认的密码或密码为空
      if (edtPassword.Text = GDefaultPassword) and FIsFirstLogin then
      begin
        ModalResult := mrOK;
        Exit;
      end;

      // 校验用户密码
      try
        if (Length(edtPassword.Text) = 0) and (Length(AtabUsers['Pwd']) = 0) then
        begin
          ModalResult := mrOK;
          Exit;
        end;

        if edtPassword.Text = '' then
          Apassword := '      '
        else
          Apassword := edtPassword.Text;

        AtabUsers.Refresh;
        if SimpleEnDecrypt(APassword, gKey) = AtabUsers['Pwd'] then
        begin
          // 用户输入了正确的密码,退出登录控制过程
          ModalResult := mrOK;
          Exit;
        end else
        // 用户终止程序的运行
        begin
          ShowMessage('您输入的口令不正确。');
          edtPassword.SetFocus;
          Exit;
        end;
      except
        edtPassword.SetFocus;
        Exit;
      end;
    end else // 非法用户
    begin
      ShowMessage('你没有取得正确的口令,请与系统管理员联系。');
      Application.Terminate;
    end;
end;

procedure TfrmPropertyLogin.btnChangePasswordClick(Sender: TObject);
// 用户修改密码
var
  APassword: string;
begin
  inherited;
  with TfrmPropertyChangePassword.Create(Application) do
  try
    labUser.Caption := edtUser.EditText;
    UserID := dmInvPrint.AtabUsers['UserID'];
    if ShowModal = mrOK then
    begin
      APassword := '';
      if edtNewPassword.Text <> '' then
      begin
        APassword := SimpleEnDecrypt(edtNewPassword.Text, GKey);
      end;
      // 如果用户输入的密码为空,则不对其进行加密转换
      dmInvPrint.ChangePassword(edtUser.EditValue, APassword);
      Timer.Enabled   := False;
      labHint.Caption := '';
      btnChangePassword.Font.Style := btnChangepassword.Font.Style - [fsBold];
    end;
  finally
    Free;
  end;

end;

procedure TfrmPropertyLogin.edtUserPropertiesEditValueChanged(
  Sender: TObject);
// 检查用户密码和用户当前状态
var
  Avaliddays: Integer;
begin
  inherited;
  FIsFirstLogin   := False;
  Timer.Enabled   := False;
  labHint.Visible := False;
  btnChangePassword.Font.Style := [];

  if not dmInvPrint.AtabUsers.Locate('UserID', edtUser.EditValue, []) then
    Exit;

  // Check if the user has been locked
  with dmInvPrint do
  begin
    if AtabUsers['Locked'] = True then
    begin
      ShowMessage('您的帐户已经被锁定,请与系统管理员联系解除锁定状态!');
      btnChangePassword.Enabled := False;
      btnOk.Enabled := False;
      Application.Terminate;
    end;

    // If a user is the first use this system, hint him change password
    if (AtabUsers['Createdate'] = AtabUsers['LastChangedate'])
      and (AtabUsers['LoginChange'] = True) then
    begin
      labHint.Visible := True;
      labHint.Caption := '您是第一次使用系统,建议修改密码';
      FisFirstLogin   := True;
      Fflag := False;
      Timer.Enabled   := FIsFirstLogin;
      Exit;
    end;

    // 检查用户密码是否需要更新了
    Avaliddays := AtabUsers['Validday'];  // 如果密码有效时间为0天则是永不过期设置
    if Avaliddays = 0 then
      Exit;

    Avaliddays := AtabUsers['Validday'] - (Date - AtabUsers['LastChangedate']);
    if Avaliddays < 0 then
    begin
      labHint.Visible := True;
      labHint.Caption := '您的密码已经过期,建议您修改密码';
      Fflag := False;
      //btnChangePassword.Enabled := False;
      //btnOk.Enabled := False;
      Timer.Enabled := True;
    end else if Avaliddays <= 7 then
    begin
      labHint.Visible := True;
      labHint.Caption := Format('您的密码还有%d天就要过期了', [Avaliddays]);
      Fflag := False;
      Timer.Enabled   := True;
    end;

    // 更新用户当前登录时间
    try
      AtabUsers.Edit;
      AtabUsers['LastLogindate'] := Now;
      AtabUsers['LoginChange']   := False;
      AtabUsers.Post;
    except
      // 保存失败
    end;
  end;
end;

end.

⌨️ 快捷键说明

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