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

📄 unitlogin.~pas

📁 在delphi下基于MapX5.0的GIS程序
💻 ~PAS
字号:
unit UnitLogin;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons, ShellAPI, ScktComp, IdWinsock, Winsock,
  DB;

type
  TFrmLogin = class(TForm)
    RGroupUserType: TRadioGroup;
    GBoxLoginInfo: TGroupBox;
    LEditUser: TLabeledEdit;
    LEditPassword: TLabeledEdit;
    BBtnOK: TBitBtn;
    BBtnCancel: TBitBtn;
    LEditDataSourse: TLabeledEdit;
    CSocket: TClientSocket;
    SSocket: TServerSocket;
    procedure RGroupUserTypeClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure BBtnOKClick(Sender: TObject);
    procedure BBtnCancelClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure CSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure CSocketConnecting(Sender: TObject; Socket: TCustomWinSocket);
    procedure CSocketLookup(Sender: TObject; Socket: TCustomWinSocket);
    procedure CSocketError(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure CSocketRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure SSocketClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure SSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FrmLogin: TFrmLogin;
  LoginStr: String;

implementation

uses UnitDataModule, UnitCommonModule, UnitMain, UnitWait;

{$R *.dfm}

// returns ISP assigned IP
function LocalIP : string;
type
    TaPInAddr = array [0..10] of PInAddr;
    PaPInAddr = ^TaPInAddr;
var
    phe  : PHostEnt;
    pptr : PaPInAddr;
    Buffer : array [0..63] of char;
    I    : Integer;
    GInitData      : TWSADATA; 
begin
    WSAStartup($101, GInitData);
    Result := '';
    GetHostName(Buffer, SizeOf(Buffer));
    phe :=GetHostByName(buffer);
    if phe = nil then Exit;
    pptr := PaPInAddr(Phe^.h_addr_list);
    I := 0;
    while pptr^[I] <> nil do begin
      result:=StrPas(inet_ntoa(pptr^[I]^));
      Inc(I);
    end;
    WSACleanup;
end;

procedure TFrmLogin.RGroupUserTypeClick(Sender: TObject);
begin
  ClearEdit(FrmLogin);
  case RGroupUserType.ItemIndex of
    0:
    begin
      GBoxLoginInfo.Visible := False;
      Height := 116;
      BBtnOK.Top := 63;
      BBtnCancel.Top := 63;
    end;
    1:
    begin
      GBoxLoginInfo.Visible := True;
      GBoxLoginInfo.Height := 70;
      Height := 196;
      BBtnOK.Top := 143;
      BBtnCancel.Top := 143;
      LEditDataSourse.Visible := False;
    end;
    2:
    begin
      GBoxLoginInfo.Visible := True;
      GBoxLoginInfo.Height := 94;
      Height := 218;
      BBtnOK.Top := 165;
      BBtnCancel.Top := 165;
      LEditDataSourse.Visible := True;
    end;
  end;
end;

procedure TFrmLogin.FormShow(Sender: TObject);
begin
  Height := 116;
  BBtnOK.Top := 63;
  BBtnCancel.Top := 63; 
  RGroupUserType.ItemIndex := 0;
  RGroupUserTypeClick(Sender);
end;

procedure TFrmLogin.BBtnOKClick(Sender: TObject);
begin
  case RGroupUserType.ItemIndex of
    0:
    begin
      CSocket.Host := ServerHost;
      if Not CSocket.Active then CSocket.Active := True;
      if CanLogin then
      begin
        // 重新登入
        //  普通用户:R101<202.198.168.168>0+15:57:10#
        LoginStr := 'R'+ IntToStr(CSocket.Socket.SocketHandle) +
                    '<' + CSocket.Socket.LocalAddress +'>'+
                    IntToStr(RGroupUserType.ItemIndex) + '+'+
                    CLoginTimeStr + '#';
        CSocket.Socket.SendText(LoginStr);
      end;
    end;
    1:
    begin
      if LEditUser.Text = ''
      then Application.MessageBox('用户名不能为空!','提示',0)
      else
      begin
        CSocket.Host := ServerHost;
        if Not CSocket.Active then CSocket.Active := True;
        if CanLogin then
        begin
          // 重新登入
          //  高级用户:R102<202.198.168.168>1Andy*6666+15:57:10#
          LoginStr := 'R'+ IntToStr(CSocket.Socket.SocketHandle) +
                      '<' + CSocket.Socket.LocalAddress +'>'+
                      IntToStr(RGroupUserType.ItemIndex) +
                      LEditUser.Text + '*'+ LEditPassword.Text + '+'+
                      CLoginTimeStr + '#';
          CSocket.Socket.SendText(LoginStr);
        end;
      end;
    end;
    2:
    begin
      if LEditUser.Text = ''
      then Application.MessageBox('用户名不能为空!','提示',0)
      else
      begin
        try
          if Not DM.ADOConnection1.Connected then
          begin
            DM.ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Password=' +
              LEditPassword.Text +';Persist Security Info=True;User ID=' +
              LEditUser.Text + ';Data Source=' +
              LEditDataSourse.Text;
            DM.ADOConnection1.Connected := True;
          end;
        except
          Application.MessageBox('登入服务器失败!','提示',0);
          ClearEdit(FrmLogin);
          LEditUser.SetFocus;
          Exit;
        end;
        SUser := LEditUser.Text;
        SPassword := LEditPassword.Text;
        SDataS := LEditDataSourse.Text;
        SSocket.Active := True;
        IsServer := True;
        CanLogin := True;
        Application.MessageBox('登入服务器成功!','提示',0);
        // 根据不通的用户设置窗体及权限
        SetUserForm(2);
        // 写日志
        FillRecord('管理员', '成功');
        // 写状态栏
        FrmMain.SBar.Panels[3].Text := '管理员';
        FrmMain.SBar.Panels[5].Text := FormatDateTime('hh:nn  AM/PM', Now);
        Close;
      end;
    end;
  end;
end;

procedure TFrmLogin.BBtnCancelClick(Sender: TObject);
begin
  Close;
end;

procedure TFrmLogin.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Not CanLogin then
  begin
    SSocket.Active := False;
    CSocket.Active := False;
    Application.Terminate;
  end;
end;

procedure TFrmLogin.CSocketConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
//  正在验证用户和密码,请稍等...
//  普通用户:L101<202.198.168.168>0#
//  高级用户:L102<202.198.168.168>1Andy*6666#
  LoginStr := 'L'+ IntToStr(Socket.SocketHandle) +
              '<' + Socket.LocalAddress +'>'+
              IntToStr(RGroupUserType.ItemIndex);
  if RGroupUserType.ItemIndex = 1 then
    LoginStr := LoginStr + LEditUser.Text + '*'
                + LEditPassword.Text + '#'
  else LoginStr := LoginStr + '#';
  Socket.SendText(LoginStr);
end;

procedure TFrmLogin.CSocketConnecting(Sender: TObject;
  Socket: TCustomWinSocket);
begin
//  PanelInfo.Caption := '正在连接,请稍等...';
end;

procedure TFrmLogin.CSocketLookup(Sender: TObject;
  Socket: TCustomWinSocket);
begin
//  PanelInfo.Caption := '正在查找服务器,请稍等...';
end;

procedure TFrmLogin.CSocketError(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
//  PanelInfo.Caption := '通信出现错误!';
end;

procedure TFrmLogin.CSocketRead(Sender: TObject; Socket: TCustomWinSocket);
var
  ServerStr: String;
  Useri, Passwordi, DataSoursei, LoginTimei: Integer;
begin
  ServerStr := Socket.ReceiveText;
  if ServerStr[1] = 'O' then
  begin
    Application.MessageBox('验证失败,不存在此用户!', '提示', 0);
    ClearEdit(FrmLogin);
    if Not CanLogin then CSocket.Active := False; // 新用户
  end
  else
  if ServerStr[1] = 'N' then
  begin
    Application.MessageBox('验证失败,密码错误!', '提示', 0);
    LEditPassword.Text := '';
    LEditPassword.SetFocus;
    if Not CanLogin then CSocket.Active := False;  // 新用户
  end
  else
  if ServerStr[1] = 'Y' then
  begin
    if CanLogin then  // 重新登入成功  发出上次用户的退出信息
      CSocket.Socket.SendText('E'+CUser+'<'+CSocketID+'>'+CLoginTimeStr);
  // 成功:Ygis<gis>FEIYANG*20:44:30#
  // 从服务器发来的数据中得到连接服务器的信息
    SUser := ''; SPassword := ''; SDataC := ''; CLoginTimeStr := '';
    for Useri := 2 to Length(ServerStr) do
    begin
      if ServerStr[Useri] <> '<' then
        SUser := SUser + ServerStr[Useri]
      else Break;
    end;
    for Passwordi := Useri+1 to Length(ServerStr) do
    begin
      if ServerStr[Passwordi] <> '>' then
        SPassword := SPassword + ServerStr[Passwordi]
      else Break;
    end;
    for DataSoursei := Passwordi+1 to Length(ServerStr) do
    begin
      if ServerStr[DataSoursei] <> '*' then
        SDataC := SDataC + ServerStr[DataSoursei]
      else Break;
    end;
    for LoginTimei := DataSoursei+1 to Length(ServerStr) do
    begin
      if ServerStr[LoginTimei] <> '#' then
        CLoginTimeStr := CLoginTimeStr + ServerStr[LoginTimei]
      else Break;
    end;
    try
      if Not DM.ADOConnection1.Connected then
      begin
        DM.ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Password=' +
          SPassword +';Persist Security Info=True;User ID=' +
          SUser + ';Data Source=' +
          SDataC;
        DM.ADOConnection1.Connected := True;
      end;
    except
      Application.MessageBox('登入服务器失败!','提示',0);
      ClearEdit(FrmLogin);
      LEditUser.SetFocus;
      Exit;
    end;
    if RGroupUserType.ItemIndex = 0 then CUser := '普通用户'
      else  CUser := LEditUser.Text;
    CSocketID := IntToStr(CSocket.Socket.SocketHandle);
    IsServer := False;
    CanLogin := True;
    Application.MessageBox('登入服务器成功!','提示',0);
    // 根据不通的用户设置窗体及权限
    SetUserForm(RGroupUserType.ItemIndex);
    // 写状态栏
    FrmMain.SBar.Panels[3].Text := CUser;
    FrmMain.SBar.Panels[5].Text := FormatDateTime('hh:nn  AM/PM', Now);
    Close;
  end
  else
  if ServerStr[1] = 'S' then
  begin
    CSocket.Active := False;
    DeleteMap();
    Application.MessageBox('服务器端终止与你的连接!','提示',0);
    Application.Terminate;
  end;
end;

procedure TFrmLogin.SSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
// 添日志
//  FillRecord();
end;

procedure TFrmLogin.SSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var 
  Socketi, Ipi, Useri, Passwordi, LoginTimei: Integer;
  SendS: String;
begin
  ClientStr := Socket.ReceiveText;
  if (ClientStr[1] = 'L') or (ClientStr[1] = 'R')  // 登入请求
  then
  begin
//  普通用户:L101<202.198.168.168>0#
//  高级用户:L102<202.198.168.168>1Andy*6666#
//  普通用户:R101<202.198.168.168>0+15:57:10#
//  高级用户:R102<202.198.168.168>1Andy*6666+15:57:10#
    CSocketID := ''; CIp := '';  CUser := '';  CPassword := '';
    CLoginTimeStr := '';
    for Socketi := 2 to Length(ClientStr) do
    begin
      if ClientStr[Socketi] <> '<' then
        CSocketID := CSocketID + ClientStr[Socketi]
      else Break;
    end;
    for Ipi := Socketi+1 to Length(ClientStr) do
    begin
      if ClientStr[Ipi] <> '>' then
        CIp := CIp + ClientStr[Ipi]
      else Break;
    end;
    CLevel := StrToInt(ClientStr[Ipi+1]);
    if (ClientStr[1] = 'R') then   // 重新登入的
    if (CLevel = 0) then  // 普通用户
    begin
      for LoginTimei := Ipi+3 to Length(ClientStr) do
      begin
        if ClientStr[LoginTimei] <> '#' then
          CLoginTimeStr := CLoginTimeStr + ClientStr[LoginTimei]
        else Break;
      end;
    end;
                                 
    if CLevel = 1  // 高级用户
    then
    begin
      for Useri := Ipi+2 to Length(ClientStr) do
      begin
        if ClientStr[Useri] <> '*' then
          CUser := CUser + ClientStr[Useri]
        else Break;
      end;
      for PassWordi := Useri+1 to Length(ClientStr) do
      begin
       if (ClientStr[PassWordi] <> '+') and
          (ClientStr[PassWordi] <> '#') then
          CPassword := CPassword + ClientStr[PassWordi]
        else Break;
      end;
      if (ClientStr[1] = 'R') then   // 重新登入的
      begin
        for LoginTimei := PassWordi+1 to Length(ClientStr) do
        begin
          if ClientStr[LoginTimei] <> '#' then
            CLoginTimeStr := CLoginTimeStr + ClientStr[LoginTimei]
          else Break;
        end;
      end;
    end;

  // 成功:Ygis[gis]FEIYANG#
    SendS := 'Y' + SUser +'<'+ SPassword +'>'+ SDataS;
    if CLevel = 0 then  // 普通用户
    begin
      FillRecord('普通用户', '成功');
      SendS := SendS + '*' + CLoginTimeStr + '#';
      SSocket.Socket.Connections[SendUserNum].SendText(SendS);
    end;
    if CLevel = 1 then  // 高级用户
    begin
      if Not DM.ADOQueryUsers.Active then DM.ADOQueryUsers.Open;
      if DM.ADOQueryUsers.Locate('UserName', CUser, [loCaseInsensitive]) then
      begin
        if DM.ADOQueryUsers.FieldByName('Password').AsString = CPassword then
        begin
          FillRecord('高级用户', '成功');
          SendS := SendS + '*' + CLoginTimeStr + '#';
          SSocket.Socket.Connections[SendUserNum].SendText(SendS);
        end
        else
        begin
          FillRecord('高级用户', '失败');
          SSocket.Socket.Connections[SendUserNum].SendText('N');
        end;
      end else
          begin
            FillRecord('高级用户', '失败');
            SSocket.Socket.Connections[SendUserNum].SendText('O'); 
          end;
    end;
  end
  else if ClientStr[1] = 'E'  // 客户端退出
  then
  begin
    //  Efeiyang<133>10:38:10#
    CUser := '';  CSocketID := '';  CLoginTimeStr := '';
    for Useri := 2 to Length(ClientStr) do
    begin
      if ClientStr[Useri] <> '<' then
        CUser := CUser + ClientStr[Useri]
      else Break;
    end;
    for Socketi := Useri+1 to Length(ClientStr) do
    begin
      if ClientStr[Socketi] <> '>' then
        CSocketID := CSocketID + ClientStr[Socketi]
      else Break;
    end;
    for LoginTimei := Socketi+1 to Length(ClientStr) do
    begin
      if ClientStr[LoginTimei] <> '#' then
        CLoginTimeStr := CLoginTimeStr + ClientStr[LoginTimei]
      else Break;
    end;
    // 填写客户端退出日志
    FillRecordE(CUser, CSocketID, CLoginTimeStr);
  end;
end;

end.

⌨️ 快捷键说明

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