systemloginfm.pas
来自「一个电力企业的后台管理程序」· PAS 代码 · 共 382 行
PAS
382 行
unit systemLoginFM;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, Buttons, StdCtrls,db,dbtables,dbctrls, ScktComp;
type
Tfrm_Login = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Label2: TLabel;
EdPwd: TEdit;
Bevel1: TBevel;
btncancel: TSpeedButton;
btnModify: TSpeedButton;
Label3: TLabel;
EdWorkNo: TEdit;
OverLoginTimer: TTimer;
btnReceiveMsg: TButton;
sbtnConfirm: TSpeedButton;
Bevel3: TBevel;
Panel3: TPanel;
TmOnLine: TTimer;
btnIslogin: TButton;
StoredProc1: TStoredProc;
procedure FormActivate(Sender: TObject);
procedure btncancelClick(Sender: TObject);
procedure btnModifyClick(Sender: TObject);
procedure OverLoginTimerTimer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure EdPwdKeyPress(Sender: TObject; var Key: Char);
procedure sbtnConfirmClick(Sender: TObject);
procedure TmOnLineTimer(Sender: TObject);
procedure EdWorkNoKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
Wait_100ms : Integer;
Wait_Times : Integer;
procedure cover(cover_mode:Integer;MessageStr:String);
public
{ Public declarations }
BLogin:Boolean;
end;
const
MaxLoginWaitSecond=30; //登录超时时间30秒
LoginCoverOpen=0;
LoginCoverClose=1;
LoginCoverChangeMsg = 99;
var
Exit_Flag : Boolean;
ReloginFlag : Boolean = False; //在程序内重新登录标志
implementation
uses
systemPH, systemDM, systemModiPwdFM;
const MaxLoginNum=3;
{$R *.DFM}
procedure Tfrm_Login.FormActivate(Sender: TObject);
begin
EdWorkNo.Text :=ReadIni('System','UserName','');
EdPwd.Text :='';
if Length(EdWorkNo.Text)>0 then
EdPwd.SetFocus
else
Edworkno.SetFocus;
with Panel3 do
begin
Top := 0;
Left := 0;
Width := self.ClientWidth;
Height := 0; //FormLogin.ClientHeight;
Visible := False;
end;
//如果是测试状态,就直接进入,以 8888/6666工号/口令
if SystemConst_Debugstate then
begin
if FileExists(sysDM.ExePath+'debug.ini') then
begin
EdWorkno.Text := 'wen';
EdPwd.text := '1';
sbtnConfirm.Click;
end;
end;
end;
procedure Tfrm_Login.btncancelClick(Sender: TObject);
begin
BLogin:=False;
Close;
end;
procedure Tfrm_Login.btnModifyClick(Sender: TObject);
begin
sysDM.ShowModalForm(Tfrm_ModiPwd);
end;
procedure Tfrm_Login.OverLoginTimerTimer(Sender: TObject);
begin
{ OverLoginTimer.Enabled :=False;
if Application.MessageBox('登录超时,是否重新登录?','超时提示',mb_Yesno)=idYes then
begin
If not LoginMsgCen(MsgSocket) then
begin
Application.MessageBox('向消息中心发送登录消息失败,请重新登录。','提示',mb_ok);
cover(LoginCoverClose,'向消息中心发送登录消息失败,请重新登录。');
exit;
end;
end else
begin
BLogin:=False;
FormLogin.Close;
end;
}
end;
procedure Tfrm_Login.FormCreate(Sender: TObject);
begin
Wait_100ms := 0;
Wait_times := 100;
Position :=poDeskTopCenter;
OverLoginTimer.Enabled :=False;
// OverLoginTimer.Interval :=OverT_Login*1000;
TmOnLine.Enabled :=False;
//TmOnLine.Interval :=OverT_OnLine*1000;
end;
procedure Tfrm_Login.EdPwdKeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
begin
EdWorkNo.SetFocus;
sbtnconfirm.Click;
end;
end;
procedure Tfrm_Login.sbtnConfirmClick(Sender: TObject);
var
WorkID,WorkPwd:string;
tempappnamestr,AppName,AppVer : string;
begin
//Cover(LoginCoverOpen,'正在与服务器进行通信,以确认身份....');
//完成的任务
{
在调用此窗体之前,应先赋值
APPNAME 应用程序名
AAPVER 应用程序版本号
LOGINAUTHBIT 进入权限基本数据位
从 SYSLOGIN 中取出用户权限,确认身份是否合法
要 设置以下变量
WORKID 表示登录员工工号
WORKNAME 表示登录员工姓名
WORKAUTHSTR 表示登录员工的权限码串
APPNAEM 应用程序名
HOSTNAME 应用程序运行主机名
HOSTIP 应用程序运行主机IP地址
1、确认登录者口令是否正确
2、确认登录者的权限串是对应的权限位是否有权
3、发消息到消息中心,确认网络访问合法性。
}
//测试用代码
BLogin := False;
//从本机取出本机设置,检查应用程序名是否一至
AppName := UpperCase(sysDM.AppName);
AppVer := Trim(sysDM.AppVer);
tempappnamestr := UpperCase(sysDM.ExeName) ;
//the code bellow is maske dby Jimmy
{ IF Not (UpperCase(AppName) = tempappnamestr ) THEN
begin
ShowMessage('应用程序名不可改变!,' + AppName + ' <> ' + tempappnamestr);
cover(LoginCoverClose,'应用程序名不可改变!');
exit;
end;}
WorkID := UpperCase(Trim(Edworkno.text));
WorkPwd := Trim(EdPwd.text);
//从数据库取出用户的基本信息,确认口令与用户名的一致性
IF sysDM.SQL_Querys(sysDM.Qr_sysTemp,'Select A.*,B.RoleAuth RoleAuth from ECSC_SA.SysLogin A,ECSC_SA.SysRole B Where Upper(WorkID)='
+#39+WorkID+#39+' and Pwd='+#39+WorkPwd+#39+' and A.RoleName=B.RoleName') THEN
BEGIN
with sysDM.Qr_sysTemp do
begin
sysDM.WorkAuthStr := FieldByName('RoleAuth').AsString;
sysDM.WorkRole := FieldByName('RoleName').AsString;
sysDM.WorkName := FieldByName('WorkName').AsString;
end;
sysDM.WorkId:=WorkID;
sysDM.WorkPwd:=WorkPwd;
END ELSE
BEGIN
sysDM.Logs.Add('用户登录...');
sysDM.Logs.Add('用户名或口令不正确: 用户名为'+WorkID+',口令为'+WorkPwd+'.');
sysDM.Write_log;
ShowMessage('用户名或口令不正确!');
cover(LoginCoverClose,'用户名或口令不正确');
Exit;
END;
//*******************************************
//检测是否有权进入此应用模块
{IF ((Length(Trim(sysDM.WorkAuthStr)) < 0) OR (Copy(WorkAuthStr,WorkAuthBit,1) ='0')) THEN
BEGIN
Application.MessageBox(Pchar('您所用的工号无权进入'+sysDm.AppExplain+'!'),'电信客户服务中心',mb_ok);
//ShowMessage('您所用的工号无权进入此应用程序!' + IntToStr(WorkauthBit) +'\'+IntToStr(Length(Trim(WorkAuthStr))));
cover(LoginCoverClose, '您所用的工号无权进入'+sysDM.AppExplain+'!');
Exit;
END; }
//写一些数据到本地的日志文件
sysDM.Logs.Add('用户登录...');
sysDM.Logs.Add('主机名:'+sysDM.HostName+'; '+'应用程序名:'+Appname+'. '+'版本号:'+Appver);
sysDm.Logs.Add('用户:'+sysDM.WorkRole+' — '+sysDM.WorkName+'('+WorkID+').');
sysDm.Write_log;
Blogin:=True;
WriteIni('System','UserName',EdWorkNo.Text);
Close;
end;
PROCEDURE Tfrm_Login.cover(Cover_Mode:Integer;MessageStr:String);
VAR
m0top,m0left,m0width,m0height: Integer;
m1top,m1left,m1width,m1height: Integer;
step_i ,step_max : Integer;
Step_rate : real;
BEGIN
With self.Panel3 DO
BEGIN
Caption := MessageStr;
CASE Cover_Mode OF
0:
//显示封面
BEGIN
Step_max := 15;
m1top :=0;
m1left :=0;
m1Width :=self.ClientWidth;
m1height :=self.ClientHeight;
m0top := round(m1height/2);
m0left := round(m1width/2);
m0Width := 0;
m0height := 0;
top := m0top;
left := m0left;
width := m0Width;
height := m0Height;
VISIBLE:= TRUE;
for step_i := 1 to step_Max do
begin
Step_Rate := step_i / step_max;
top := m0top + round((m1top - m0top) * Step_Rate) ;
left := m0left + round((m1left - m0left) * step_rate);
Width := m0width + round((m1width - m0width) * step_rate);
Height := m0height + round((m1height -m0height) * step_rate);
//Refresh;
end;
top := m1top;
left := m1left;
width := m1width;
height := m1height;
END;
1:
//关闭封面
BEGIN
Step_max := 15;
m0top :=0;
m0left :=0;
m0Width :=self.ClientWidth;
m0height :=self.ClientHeight;
m1top := round(m0height/2);
m1left := round(m0width/2);
m1Width := 0;
m1height := 0;
top := m0top;
left := m0left;
width := m0Width;
height := m0Height;
VISIBLE:= TRUE;
for step_i := 1 to step_Max do
begin
Step_Rate := step_i / step_max;
top := m0top + round((m1top - m0top) * Step_Rate) ;
left := m0left + round((m1left - m0left) * step_rate);
Width := m0width + round((m1width - m0width) * step_rate);
Height := m0height + round((m1height -m0height) * step_rate);
//Refresh;
end;
top := m1top;
left := m1left;
width := m1width;
height := m1height;
END;
2:
//更换提示字串
BEGIN
END;
END;
END;
END;
procedure Tfrm_Login.TmOnLineTimer(Sender: TObject);
begin
{ TmOnLine.Enabled :=False;
WITH StoredProc1 DO
BEGIN
Params[0].AsString:='强行添加';
Params[1].AsString:=WorkID;
Params[2].AsString:=WorkRole;
Params[3].AsString:=AgentNO;
Params[4].AsString:=AppName;
Params[5].AsString:=AppVer;
Params[6].AsString:=HostName;
Params[7].AsString:=HostIP;
Prepare;
Execproc;
//ShowMessage(trim(Params[8].AsString));
IF trim(Params[8].AsString)='添加成功' THEN
BEGIN
//添加成功,可以进入系统
BLogin:=True;
FormLogin.Close;
END;
IF trim(Params[8].AsString)='记录已存在' THEN
BEGIN
//记录已存在,应询问是否可强行插入
//检测是否为本机及本应用程序
//Application.MessageBox('有其他员工正在用此工号存在
SetLength(SendMsgParam,0);
Msg_P.SendToAnyUser(MsgSocket,Params[6].Asstring,
Params[4].AsString,S_IsOnLine,SendMsgParam);
TmOnLine.Interval :=OverT_OnLine*1000;
TmOnLine.Enabled :=True;
END;
IF trim(Params[8].AsString)='申请ID错' THEN
BEGIN
//这是一个系统错误,一般不会发生,应考虑以下意外是否发生
//1、表 RDS_DEF 是否正确 2、存贮过程 GetLoginID 是否正确
//应退出系统!!!
END;
END;
//WaitTime(2000);
}
end;
procedure Tfrm_Login.EdWorkNoKeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
begin
if EdWorkNo.Text <>'' then
EdPwd.SetFocus;
end;
end;
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?