LoginFrm.pas 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. {*******************************************************************************
  2. 单元名称: ScLoginFrm.pas
  3. 单元说明: 网络版PHP Web页面登录方式。
  4. 作者时间: Chenshilong, 2012-5-13
  5. *******************************************************************************}
  6. unit LoginFrm;
  7. interface
  8. uses
  9. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  10. Dialogs, JimCombos, ExtCtrls, StdCtrls, cxLookAndFeelPainters,
  11. cxTextEdit, cxButtons, cxControls, cxEdit,
  12. cxMaskEdit, cxDropDownEdit, HookEdit, cxContainer, XPMenu, cslLabel,
  13. IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
  14. CslButton, OleCtrls, SHDocVw, DB, ADODB, Menus;
  15. type
  16. TLoginFrm = class(TForm)
  17. edtPW: TEdit;
  18. lblForgetPW: TcslLabel;
  19. lblVer: TLabel;
  20. shpAccount: TShape;
  21. imgBG: TImage;
  22. btnLogin: TCslButton;
  23. lblReg: TCslLabel;
  24. btnClose: TCslButton;
  25. lblProductName: TLabel;
  26. shpPW: TShape;
  27. wbLogin: TWebBrowser;
  28. pnlLocalServer: TPanel;
  29. btnLocalLogin: TCslButton;
  30. lblLocalHelp: TCslLabel;
  31. lblLocalServer: TCslLabel;
  32. cbUser: TcxComboBox;
  33. pmLogin: TPopupMenu;
  34. nClearAccount: TMenuItem;
  35. lblHint: TLabel;
  36. procedure edtPWKeyDown(Sender: TObject; var Key: Word;
  37. Shift: TShiftState);
  38. procedure FormCreate(Sender: TObject);
  39. procedure btnLoginClick(Sender: TObject);
  40. procedure img1Click(Sender: TObject);
  41. procedure shpAccountMouseDown(Sender: TObject; Button: TMouseButton;
  42. Shift: TShiftState; X, Y: Integer);
  43. procedure shpPWMouseDown(Sender: TObject; Button: TMouseButton;
  44. Shift: TShiftState; X, Y: Integer);
  45. procedure btnCloseClick(Sender: TObject);
  46. procedure FormDestroy(Sender: TObject);
  47. procedure cbUserKeyDown(Sender: TObject; var Key: Word;
  48. Shift: TShiftState);
  49. procedure nClearAccountClick(Sender: TObject);
  50. procedure cbUserKeyPress(Sender: TObject; var Key: Char);
  51. private
  52. { Private declarations }
  53. FUsersCon: TADOConnection;
  54. FUsersQry: TADOQuery;
  55. procedure ReadCloudUser;
  56. procedure WriteCloudUser;
  57. public
  58. { Public declarations }
  59. end;
  60. function LoginForm: Boolean;
  61. implementation
  62. uses
  63. ScUtils, ShellAPI, IniFiles, ScConfig, Md5, PHPWebDm, ConstUnit, DebugUsers;
  64. {$R *.dfm}
  65. function LoginForm: Boolean;
  66. var
  67. Form: TLoginFrm;
  68. begin
  69. Result := False;
  70. Form := TLoginFrm.Create(nil);
  71. try
  72. if Form.ShowModal = mrOK then
  73. begin
  74. Result := True;
  75. Form.WriteCloudUser;
  76. end;
  77. finally
  78. Form.Free;
  79. end;
  80. end;
  81. { TLoginFrm }
  82. procedure TLoginFrm.edtPWKeyDown(Sender: TObject; var Key: Word;
  83. Shift: TShiftState);
  84. begin
  85. if Key = VK_Return then
  86. btnLoginClick(Sender);
  87. end;
  88. procedure TLoginFrm.FormCreate(Sender: TObject);
  89. var SL: TStringList;
  90. ini: TIniFile;
  91. begin
  92. lblHint.Caption := '';
  93. SetClassLong(Handle, GCL_STYLE, GetClassLong(Handle, GCL_STYLE) or CS_DROPSHADOW);
  94. Set8087CW(Default8087CW or $0004);
  95. Set8087CW(Longword($133f));
  96. ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Cloud.ini');
  97. try
  98. G_Server := ini.ReadString('URL', 'Server', '');
  99. G_ServerType := ini.ReadString('URL', 'ServerType', '');
  100. G_CompanyName := ini.ReadString('URL', 'CompanyName', '');
  101. G_GuideURL := ini.ReadString('URL', 'GuideURL', '');
  102. G_MeasureURL := 'http://' + G_Server + ini.ReadString('URL', 'MeasureURL', '');
  103. finally
  104. ini.Free;
  105. end;
  106. if Trim(G_CompanyName) <> '' then
  107. lblProductName.Caption := G_CompanyName
  108. else
  109. lblProductName.Caption := G_ProductName;
  110. // 服务器:1公有 2私有
  111. if G_ServerType = '2' then
  112. begin
  113. pnlLocalServer.Visible := True;
  114. lblLocalServer.URL := G_Server;
  115. lblLocalServer.Hint := G_Server;
  116. lblLocalHelp.URL := G_GuideURL;
  117. lblLocalHelp.Hint := G_GuideURL;
  118. end
  119. else if G_ServerType = '1' then
  120. begin
  121. pnlLocalServer.Visible := False;
  122. end;
  123. lblReg.URL := PHPWeb.RegURL;
  124. lblForgetPW.URL := PHPWeb.PwdURL;
  125. lblVer.Caption := G_ProductName + ' ' + ScGetVersion;
  126. // lblVer.Left := lblProductName.Left + lblProductName.Width + 7;
  127. ReadCloudUser;
  128. SL := TStringList.Create;
  129. try
  130. SL.Clear;
  131. SL.Add('about: <body><font size=4 color=Green>') ;
  132. SL.Add('正在打开网页请稍候...');
  133. SL.Add('</font></body>');
  134. wbLogin.Navigate(SL.Text);
  135. wbLogin.Navigate(PHPWeb.LoginBannerURL);
  136. finally
  137. end;
  138. if G_IsTest then
  139. begin
  140. cbUser.Text := '1835082984@qq.com';
  141. edtPW.Text := '654321';
  142. end;
  143. end;
  144. procedure TLoginFrm.btnLoginClick(Sender: TObject);
  145. var sInfo, sURL, sMD5PW: string;
  146. begin
  147. lblHint.Caption := '';
  148. lblHint.Update;
  149. if Trim(cbUser.Text) = '' then
  150. begin
  151. lblHint.Caption := '请您输入账号后再登录';
  152. lblHint.Update;
  153. cbUser.SetFocus;
  154. Exit;
  155. end;
  156. if Trim(edtPW.Text) = '' then
  157. begin
  158. lblHint.Caption := '请您输入密码后再登录';
  159. lblHint.Update;
  160. edtPW.SetFocus;
  161. Exit;
  162. end;
  163. case PHPWeb.Login(Trim(cbUser.Text), edtPW.Text, 1, sInfo, sURL) of
  164. ltCon:
  165. begin
  166. ModalResult := mrOk;
  167. end;
  168. ltLoginFail:
  169. begin
  170. lblHint.Caption := sInfo;
  171. lblHint.Update;
  172. edtPW.SetFocus;
  173. edtPW.SelectAll;
  174. ModalResult := mrNone;
  175. end;
  176. ltIncomplete:
  177. begin
  178. Application.MessageBox(PChar(sInfo), '系统提示', MB_OK + MB_ICONINFORMATION);
  179. ModalResult := mrNone;
  180. Screen.Cursor := crHourGlass;
  181. try
  182. sMD5PW := GetMD5(edtPW.Text);
  183. sURL := Format('%s?Account=%s&Pwd=%s', [ConfigInfo.WebLoginURL,
  184. cbUser.Text, sMD5PW]);
  185. ShellExecute(Application.Handle, 'open', PChar(sURL), nil, nil, SW_SHOWNORMAL);
  186. finally
  187. Screen.Cursor := crDefault;
  188. end;
  189. end;
  190. ltDisCon:
  191. begin
  192. Application.MessageBox('网络错误,请稍后重试!', '操作提醒', MB_OK + MB_ICONWARNING);
  193. ModalResult := mrNone;
  194. end;
  195. end;
  196. end;
  197. procedure TLoginFrm.img1Click(Sender: TObject);
  198. begin
  199. Close;
  200. end;
  201. procedure TLoginFrm.shpAccountMouseDown(Sender: TObject; Button: TMouseButton;
  202. Shift: TShiftState; X, Y: Integer);
  203. begin
  204. cbUser.SetFocus;
  205. end;
  206. procedure TLoginFrm.shpPWMouseDown(Sender: TObject; Button: TMouseButton;
  207. Shift: TShiftState; X, Y: Integer);
  208. begin
  209. edtPW.SetFocus;
  210. end;
  211. procedure TLoginFrm.btnCloseClick(Sender: TObject);
  212. begin
  213. Close;
  214. end;
  215. procedure TLoginFrm.FormDestroy(Sender: TObject);
  216. begin
  217. FUsersCon.Close;
  218. FUsersCon.Free;
  219. FUsersQry.Free;
  220. end;
  221. procedure TLoginFrm.ReadCloudUser;
  222. var s: string;
  223. begin
  224. FUsersCon := TADOConnection.Create(nil);
  225. FUsersCon.LoginPrompt := False;
  226. s := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=CloudUser.dat;Persist Security Info=False';
  227. FUsersCon.ConnectionString := s;
  228. FUsersQry := TADOQuery.Create(nil);
  229. FUsersQry.Connection := FUsersCon;
  230. FUsersQry.SQL.Text := 'Select Top 15 * From Users Order by LoginTimes Desc';
  231. FUsersQry.Open;
  232. cbUser.Properties.Items.Clear;
  233. if FUsersQry.RecordCount > 0 then
  234. begin
  235. FUsersQry.First;
  236. while not FUsersQry.Eof do
  237. begin
  238. cbUser.Properties.Items.Add(FUsersQry.FieldByName('Account').AsString);
  239. FUsersQry.Next;
  240. end;
  241. end;
  242. FUsersQry.Close;
  243. end;
  244. procedure TLoginFrm.WriteCloudUser;
  245. begin
  246. FUsersQry.Close;
  247. FUsersQry.SQL.Text := Format('Select * From Users where UserID = %d', [PHPWeb.UserID]);
  248. FUsersQry.Open;
  249. if FUsersQry.RecordCount > 0 then
  250. begin
  251. FUsersQry.Close;
  252. FUsersQry.SQL.Text := Format('Update Users Set LoginTimes=LoginTimes+1 where UserID = %d', [PHPWeb.UserID]);
  253. FUsersQry.ExecSQL;
  254. end
  255. else
  256. begin
  257. FUsersQry.Close;
  258. FUsersQry.SQL.Text := Format('Insert into Users(UserID,Account,RealName,LoginTimes) Values(%d,''%s'',''%s'',1)',
  259. [PHPWeb.UserID, PHPWeb.Account, PHPWeb.RealName]);
  260. FUsersQry.ExecSQL;
  261. end;
  262. FUsersQry.Close;
  263. end;
  264. procedure TLoginFrm.cbUserKeyDown(Sender: TObject; var Key: Word;
  265. Shift: TShiftState);
  266. begin
  267. if Key = VK_Return then
  268. begin
  269. edtPW.SetFocus;
  270. edtPW.SelectAll;
  271. end;
  272. end;
  273. procedure TLoginFrm.nClearAccountClick(Sender: TObject);
  274. begin
  275. if Application.MessageBox('确定要清空所有记录的帐户信息吗?', '询问', MB_YESNO + MB_ICONQUESTION) = ID_No then
  276. Exit;
  277. FUsersQry.Close;
  278. FUsersQry.SQL.Text := 'Delete * From Users';
  279. FUsersQry.ExecSQL;
  280. FUsersQry.Close;
  281. cbUser.Properties.Items.Clear;
  282. end;
  283. procedure TLoginFrm.cbUserKeyPress(Sender: TObject; var Key: Char);
  284. begin
  285. {$IFDEF _mDebugView}
  286. if Key = #13 then
  287. edtPW.Text := GetDebugUsers.GetPassword(cbUser.Text);
  288. {$ENDIF}
  289. end;
  290. end.