LoginFrm.pas 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  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. FileDownLoadFrm;
  65. {$R *.dfm}
  66. function LoginForm: Boolean;
  67. var
  68. Form: TLoginFrm;
  69. begin
  70. Result := False;
  71. Form := TLoginFrm.Create(nil);
  72. try
  73. if Form.ShowModal = mrOK then
  74. begin
  75. Result := True;
  76. Form.WriteCloudUser;
  77. end;
  78. finally
  79. Form.Free;
  80. end;
  81. end;
  82. { TLoginFrm }
  83. procedure TLoginFrm.edtPWKeyDown(Sender: TObject; var Key: Word;
  84. Shift: TShiftState);
  85. begin
  86. if Key = VK_Return then
  87. btnLoginClick(Sender);
  88. end;
  89. procedure TLoginFrm.FormCreate(Sender: TObject);
  90. var SL: TStringList;
  91. ini: TIniFile;
  92. begin
  93. lblHint.Caption := '';
  94. SetClassLong(Handle, GCL_STYLE, GetClassLong(Handle, GCL_STYLE) or CS_DROPSHADOW);
  95. Set8087CW(Default8087CW or $0004);
  96. Set8087CW(Longword($133f));
  97. ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Cloud.ini');
  98. try
  99. G_Server := ini.ReadString('URL', 'Server', '');
  100. G_ServerType := ini.ReadString('URL', 'ServerType', '');
  101. G_CompanyName := ini.ReadString('URL', 'CompanyName', '');
  102. G_GuideURL := ini.ReadString('URL', 'GuideURL', '');
  103. G_MeasureURL := 'http://' + G_Server + ini.ReadString('URL', 'MeasureURL', '');
  104. finally
  105. ini.Free;
  106. end;
  107. if Trim(G_CompanyName) <> '' then
  108. lblProductName.Caption := G_CompanyName
  109. else
  110. lblProductName.Caption := G_ProductName;
  111. // 服务器:1公有 2私有
  112. if G_ServerType = '2' then
  113. begin
  114. pnlLocalServer.Visible := True;
  115. lblLocalServer.URL := G_Server;
  116. lblLocalServer.Hint := G_Server;
  117. lblLocalHelp.URL := G_GuideURL;
  118. lblLocalHelp.Hint := G_GuideURL;
  119. end
  120. else if G_ServerType = '1' then
  121. begin
  122. pnlLocalServer.Visible := False;
  123. end;
  124. lblReg.URL := PHPWeb.RegURL;
  125. lblForgetPW.URL := PHPWeb.PwdURL;
  126. lblVer.Caption := G_ProductName + ' ' + ScGetVersion;
  127. // lblVer.Left := lblProductName.Left + lblProductName.Width + 7;
  128. ReadCloudUser;
  129. SL := TStringList.Create;
  130. try
  131. SL.Clear;
  132. SL.Add('about: <body><font size=4 color=Green>') ;
  133. SL.Add('正在打开网页请稍候...');
  134. SL.Add('</font></body>');
  135. wbLogin.Navigate(SL.Text);
  136. wbLogin.Navigate(PHPWeb.LoginBannerURL);
  137. finally
  138. end;
  139. if G_IsTest then
  140. begin
  141. cbUser.Text := '1971614655@qq.com';
  142. edtPW.Text := '3850888';
  143. end;
  144. end;
  145. procedure TLoginFrm.btnLoginClick(Sender: TObject);
  146. var sInfo, sURL, sMD5PW: string;
  147. vFDForm: TFileDownLoadForm;
  148. begin
  149. lblHint.Caption := '';
  150. lblHint.Update;
  151. if Trim(cbUser.Text) = '' then
  152. begin
  153. lblHint.Caption := '请您输入账号后再登录';
  154. lblHint.Update;
  155. cbUser.SetFocus;
  156. Exit;
  157. end;
  158. if Trim(edtPW.Text) = '' then
  159. begin
  160. lblHint.Caption := '请您输入密码后再登录';
  161. lblHint.Update;
  162. edtPW.SetFocus;
  163. Exit;
  164. end;
  165. case PHPWeb.Login(Trim(cbUser.Text), edtPW.Text, 1, sInfo, sURL) of
  166. ltCon:
  167. begin
  168. ModalResult := mrOk;
  169. end;
  170. ltLoginFail:
  171. begin
  172. lblHint.Caption := sInfo;
  173. lblHint.Update;
  174. edtPW.SetFocus;
  175. edtPW.SelectAll;
  176. ModalResult := mrNone;
  177. end;
  178. ltUpdate:
  179. begin
  180. if Application.MessageBox(PChar(sInfo), '系统提示', MB_OKCANCEL + MB_ICONQUESTION) = ID_OK then
  181. begin
  182. vFDForm := TFileDownLoadForm.Create(nil);
  183. try
  184. vFDForm.URL := sURL;
  185. vFDForm.ShowModal;
  186. finally
  187. vFDForm.Free;
  188. end;
  189. end;
  190. Application.Terminate;
  191. end;
  192. ltIncomplete:
  193. begin
  194. Application.MessageBox(PChar(sInfo), '系统提示', MB_OK + MB_ICONINFORMATION);
  195. ModalResult := mrNone;
  196. Screen.Cursor := crHourGlass;
  197. try
  198. sMD5PW := GetMD5(edtPW.Text);
  199. sURL := Format('%s?Account=%s&Pwd=%s', [ConfigInfo.WebLoginURL,
  200. cbUser.Text, sMD5PW]);
  201. ShellExecute(Application.Handle, 'open', PChar(sURL), nil, nil, SW_SHOWNORMAL);
  202. finally
  203. Screen.Cursor := crDefault;
  204. end;
  205. end;
  206. ltDisCon:
  207. begin
  208. Application.MessageBox('网络错误,请稍后重试!', '操作提醒', MB_OK + MB_ICONWARNING);
  209. ModalResult := mrNone;
  210. end;
  211. end;
  212. end;
  213. procedure TLoginFrm.img1Click(Sender: TObject);
  214. begin
  215. Close;
  216. end;
  217. procedure TLoginFrm.shpAccountMouseDown(Sender: TObject; Button: TMouseButton;
  218. Shift: TShiftState; X, Y: Integer);
  219. begin
  220. cbUser.SetFocus;
  221. end;
  222. procedure TLoginFrm.shpPWMouseDown(Sender: TObject; Button: TMouseButton;
  223. Shift: TShiftState; X, Y: Integer);
  224. begin
  225. edtPW.SetFocus;
  226. end;
  227. procedure TLoginFrm.btnCloseClick(Sender: TObject);
  228. begin
  229. Close;
  230. end;
  231. procedure TLoginFrm.FormDestroy(Sender: TObject);
  232. begin
  233. FUsersCon.Close;
  234. FUsersCon.Free;
  235. FUsersQry.Free;
  236. end;
  237. procedure TLoginFrm.ReadCloudUser;
  238. var s: string;
  239. begin
  240. FUsersCon := TADOConnection.Create(nil);
  241. FUsersCon.LoginPrompt := False;
  242. s := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=CloudUser.dat;Persist Security Info=False';
  243. FUsersCon.ConnectionString := s;
  244. FUsersQry := TADOQuery.Create(nil);
  245. FUsersQry.Connection := FUsersCon;
  246. FUsersQry.SQL.Text := 'Select Top 15 * From Users Order by LoginTimes Desc';
  247. FUsersQry.Open;
  248. cbUser.Properties.Items.Clear;
  249. if FUsersQry.RecordCount > 0 then
  250. begin
  251. FUsersQry.First;
  252. while not FUsersQry.Eof do
  253. begin
  254. cbUser.Properties.Items.Add(FUsersQry.FieldByName('Account').AsString);
  255. FUsersQry.Next;
  256. end;
  257. end;
  258. FUsersQry.Close;
  259. end;
  260. procedure TLoginFrm.WriteCloudUser;
  261. begin
  262. FUsersQry.Close;
  263. FUsersQry.SQL.Text := Format('Select * From Users where UserID = %d', [PHPWeb.UserID]);
  264. FUsersQry.Open;
  265. if FUsersQry.RecordCount > 0 then
  266. begin
  267. FUsersQry.Close;
  268. FUsersQry.SQL.Text := Format('Update Users Set LoginTimes=LoginTimes+1 where UserID = %d', [PHPWeb.UserID]);
  269. FUsersQry.ExecSQL;
  270. end
  271. else
  272. begin
  273. FUsersQry.Close;
  274. FUsersQry.SQL.Text := Format('Insert into Users(UserID,Account,RealName,LoginTimes) Values(%d,''%s'',''%s'',1)',
  275. [PHPWeb.UserID, PHPWeb.Account, PHPWeb.RealName]);
  276. FUsersQry.ExecSQL;
  277. end;
  278. FUsersQry.Close;
  279. end;
  280. procedure TLoginFrm.cbUserKeyDown(Sender: TObject; var Key: Word;
  281. Shift: TShiftState);
  282. begin
  283. if Key = VK_Return then
  284. begin
  285. edtPW.SetFocus;
  286. edtPW.SelectAll;
  287. end;
  288. end;
  289. procedure TLoginFrm.nClearAccountClick(Sender: TObject);
  290. begin
  291. if Application.MessageBox('确定要清空所有记录的帐户信息吗?', '询问', MB_YESNO + MB_ICONQUESTION) = ID_No then
  292. Exit;
  293. FUsersQry.Close;
  294. FUsersQry.SQL.Text := 'Delete * From Users';
  295. FUsersQry.ExecSQL;
  296. FUsersQry.Close;
  297. cbUser.Properties.Items.Clear;
  298. end;
  299. procedure TLoginFrm.cbUserKeyPress(Sender: TObject; var Key: Char);
  300. begin
  301. {$IFDEF _mDebugView}
  302. if Key = #13 then
  303. edtPW.Text := GetDebugUsers.GetPassword(cbUser.Text);
  304. {$ENDIF}
  305. end;
  306. end.