LoginFrm.pas 8.7 KB

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