login.pas

来自「delphi框架可以学习, 写的很好的」· PAS 代码 · 共 551 行 · 第 1/2 页

PAS
551
字号
unit Login;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, RzButton, StdCtrls, Mask, RzEdit, jpeg, ExtCtrls, RzBHints,
  RzStatus, RzPanel, RzBckgnd, RzTabs, RzPrgres, Psock, NMHttp;

type
  TfrmLogin = class(TForm)
    imgLogin: TImage;
    RzPageControl1: TRzPageControl;
    TabSheet1: TRzTabSheet;
    TabSheet2: TRzTabSheet;
    RzPanel1: TRzPanel;
    Label1: TLabel;
    Label2: TLabel;
    lbVer: TLabel;
    Label4: TLabel;
    Label3: TLabel;
    lbTime: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    lbIP: TLabel;
    lbMAC: TLabel;
    Label7: TLabel;
    lbLocalMAC: TLabel;
    RzSeparator1: TRzSeparator;
    edtUserCode: TRzEdit;
    edtPassword: TRzEdit;
    btnExit: TRzBitBtn;
    btnOK: TRzBitBtn;
    RzStatusBar1: TRzStatusBar;
    RzStatusPane1: TRzStatusPane;
    spLoginInfo: TRzStatusPane;
    btnUpdate: TRzBitBtn;
    btnClose: TRzBitBtn;
    btnAbout: TRzBitBtn;
    RzSeparator2: TRzSeparator;
    mmUpdate: TRzMemo;
    TabSheet3: TRzTabSheet;
    Label9: TLabel;
    Label10: TLabel;
    pbAll: TRzProgressBar;
    pbCurrent: TRzProgressBar;
    Label8: TLabel;
    Label11: TLabel;
    Timer1: TTimer;
    Timer2: TTimer;
    lbTimer: TLabel;
    lbSpeed: TLabel;
    btnStopUpdate: TRzBitBtn;
    RzSeparator3: TRzSeparator;
    NMHTTP1: TNMHTTP;
    Label12: TLabel;
    lbURL: TLabel;
    Label13: TLabel;
    lbUpdateing: TLabel;
    NMHTTP2: TNMHTTP;
    procedure FormCreate(Sender: TObject);

    procedure btnExitClick(Sender: TObject);
    procedure btnOKClick(Sender: TObject);
    procedure imgLoginMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure imgLoginMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure edtPasswordEnter(Sender: TObject);
    procedure edtPasswordKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure btnAboutClick(Sender: TObject);
    procedure btnUpdateClick(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);

    procedure NMHTTP1Failure(Cmd: CmdType);
    procedure NMHTTP1PacketRecvd(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure btnStopUpdateClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    IsInit: Boolean;
    X, Y: Integer;
    gs_FileSize, gs_time: String;

    procedure GetUserLastInfo(_UserCode: String);
    function  CheckUpdateInfo: Boolean;
    function  GetTempName(_FileName: String): String;

    function GetSizeInfo(ASize: Currency): String;
    function GetTimeInfo(Timer: Currency): String;

    procedure Link;
    procedure InitLink;
    procedure UnLink;

  public
    { Public declarations }
  end;

var
  frmLogin: TfrmLogin;
  LoginCount: integer;
  _X, _Y: Integer;
  UpdateList: TStrings;

implementation

uses MyPublic, dm32, dmc32;

{$R *.dfm}

procedure TfrmLogin.btnExitClick(Sender: TObject);
begin
  //先将更新文件处理掉

  Close;
end;

procedure TfrmLogin.btnOKClick(Sender: TObject);
var ls_SQL, ls_Err, ls_Mac, ls_IP: String;
begin
  ls_Mac := GetAdapterAddress(0);
  ls_IP  := GetIPAddress;
  SynchroLocalTime;  //同步系统时间

  if CheckUser(edtUserCode.Text, edtPassword.Text, ls_Mac) then
  begin
    //成功登录  初始化用户信息
    CurrentUser.LoginTime := Now;
    CurrentUser.IP        := ls_IP;
    CurrentUser.MAC       := ls_Mac;

    //记录最后登录IP地址和时间
    ls_SQL := 'UPDATE USERINFO SET LASTTIME = ''' + FormatDateTime('yyyy-mm-dd HH:MM:SS',now) + ''',' +
                                 ' LASTIP   = ''' + CurrentUser.IP + ''','+
                                 ' LASTMAC  = ''' + CurrentUser.MAC+ ''''+
                                 ' WHERE USERCODE = ''' + CurrentUser.UserCode + '''';
    ls_err := doSQL(ls_SQL);
    //记录用户名
    WriteIni('Login','PrevUserCode', edtUserCode.Text);
    //记录日志
    RecordUserAction(SetSimpleEvent('成功登录','用户'+ edtUserCode.Text +'成功登录系统!'));
    //打开90天内未完成的工作记录
    OpenDataSet(dm.qryJobNote, 'SELECT * FROM JOBNOTE WHERE CLBZ='+ IntToStr(SHBZ_NOT)+
                               ' AND (USERCODE =''' + edtUserCode.Text + ''''+
                               '      OR USERCODE =''ALLUSER'')'+
                               ' AND WTSJ >=''' + FormatDateTime('yyyy-mm-dd',Now-90)+''''+
                               ' ORDER BY WTSJ DESC');

    //打开近一周的登录事件
    OpenDataSet(dm.qryLoginLog, 'SELECT * FROM SYSLOG WHERE EV_STYLE =''成功登录'''+
                                ' AND USERCODE ='''  + edtUserCode.Text + ''''+
                                ' AND EV_STIME >=''' + FormatDateTime('yyyy-mm-dd',Now-7)+'''');

    LOGINOK := True;
    Close;
    Exit;
  end;

  //登录失败
  spLoginInfo.Caption := '用户名或密码错误,或不允许在此电脑此时间段登录!';
  RecordUserAction(SetSimpleEvent('登录失败','所用用户为'+ edtUserCode.Text +',密码为'+ edtPassWord.Text));
  edtPassword.Text := '';
  edtUserCode.SetFocus;
  inc(LoginCount);
  if LoginCount > 2 then Close;
end;

procedure TfrmLogin.FormCreate(Sender: TObject);
var ls_Server, ls_ver: String;
begin
  AppPath := ExtractFilePath(Application.ExeName);

  //设置服务器
  ls_Server := ReadIni('SERVER','NAME','');
  dm.conn.Connected   := False;
  dm.conn.LoginPrompt := False;
  dm.conn.ConnectionString := 'Provider=SQLOLEDB.1;Password=xiaobo;Persist Security Info=True;'+
                           'User ID=sa;Initial Catalog=JeansMIS;Data Source='+
                           ls_Server;
  //设置服务器
  dmc.conn.Connected   := False;
  dmc.conn.LoginPrompt := False;
  dmc.conn.ConnectionString := 'Provider=SQLOLEDB.1;Password=xiaobo;Persist Security Info=True;'+
                            'User ID=sa;Initial Catalog=JeansMIS;Data Source='+
                            ls_Server;

  //读取用户信息                          
  SysLock := False;

  LoginCount := 0;
  ls_ver := GetVersionInfo(Application.ExeName);
  if ls_ver = '' then lbVer.Caption := '[无效版本号]'
                 else lbVer.Caption := ls_ver;
  lbTime.Caption:= '未知';
  lbIP.Caption  := '未知';
  lbMAC.Caption := '未知';

  lbLocalMAC.Caption  := GetAdapterAddress(0);
  edtUserCode.Text    := ReadIni('Login', 'PrevUserCode','');
  spLoginInfo.Caption := '请输入用户名和密码!';

  //发现新版本则转至升级界面
  RzPageControl1.ActivePageIndex := 0;
  if CheckUpdateInfo then
  begin
    ShowMess('升级','发现更新版本的程序,请立即升级!', MB_OK);
    RzPageControl1.ActivePageIndex := 1
  end;
end;

procedure TfrmLogin.imgLoginMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  _X := X;
  _Y := Y;
end;

procedure TfrmLogin.imgLoginMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  if ssLeft in Shift then
  begin
    Self.Left := Self.Left + (X - _X);
    Self.Top  := Self.Top  + (Y - _Y);
  end;
end;

procedure TfrmLogin.GetUserLastInfo(_UserCode: String);
var ls_SQL, ls_Err: String;
begin
  ls_SQL := 'SELECT * FROM USERINFO WHERE USERCODE = ''' + _UserCode + '''';
  ls_err := OpenDataSet(dm.qryFree, ls_SQL);
  if ls_Err <> '' then
  begin
    lbTime.Caption := '读取错误!';
    lbIP.Caption   := '读取错误!';
    lbMAC.Caption  := '读取错误!';
    dm.qryFree.Close;
    Exit;
  end;

  if not dm.qryFree.Active then Exit;
  if dm.qryFree.IsEmpty then
  begin
    lbTime.Caption := '不存在该用户!';
    lbIP.Caption   := '不存在该用户!';
    lbMAC.Caption  := '不存在该用户!';
    dm.qryFree.Close;
    Exit;
  end;

  with dm.qryFree do
  begin
    lbTime.Caption := GetChinaTime(FieldByName('LASTTIME').AsDateTime);
    lbIP.Caption   := FieldByName('LASTIP').AsString;
    lbMAC.Caption  := FieldByName('LASTMAC').AsString;
    dm.qryFree.Close;
  end;
end;

procedure TfrmLogin.edtPasswordEnter(Sender: TObject);
begin
  if edtUserCode.Text <> '' then
    GetUserLastInfo(edtUserCode.Text); //获取并显示用户资料
end;

procedure TfrmLogin.edtPasswordKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key=VK_RETURN then
  if edtPassword.Text <> '' then btnOKClick(nil);
end;

procedure TfrmLogin.btnAboutClick(Sender: TObject);
begin

⌨️ 快捷键说明

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