LoginFrm.pas 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  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 := '1835082984@qq.com';
  142. edtPW.Text := '654321';
  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. end;
  191. ltIncomplete:
  192. begin
  193. Application.MessageBox(PChar(sInfo), '系统提示', MB_OK + MB_ICONINFORMATION);
  194. ModalResult := mrNone;
  195. Screen.Cursor := crHourGlass;
  196. try
  197. sMD5PW := GetMD5(edtPW.Text);
  198. sURL := Format('%s?Account=%s&Pwd=%s', [ConfigInfo.WebLoginURL,
  199. cbUser.Text, sMD5PW]);
  200. ShellExecute(Application.Handle, 'open', PChar(sURL), nil, nil, SW_SHOWNORMAL);
  201. finally
  202. Screen.Cursor := crDefault;
  203. end;
  204. end;
  205. ltDisCon:
  206. begin
  207. Application.MessageBox('网络错误,请稍后重试!', '操作提醒', MB_OK + MB_ICONWARNING);
  208. ModalResult := mrNone;
  209. end;
  210. end;
  211. end;
  212. procedure TLoginFrm.img1Click(Sender: TObject);
  213. begin
  214. Close;
  215. end;
  216. procedure TLoginFrm.shpAccountMouseDown(Sender: TObject; Button: TMouseButton;
  217. Shift: TShiftState; X, Y: Integer);
  218. begin
  219. cbUser.SetFocus;
  220. end;
  221. procedure TLoginFrm.shpPWMouseDown(Sender: TObject; Button: TMouseButton;
  222. Shift: TShiftState; X, Y: Integer);
  223. begin
  224. edtPW.SetFocus;
  225. end;
  226. procedure TLoginFrm.btnCloseClick(Sender: TObject);
  227. begin
  228. Close;
  229. end;
  230. procedure TLoginFrm.FormDestroy(Sender: TObject);
  231. begin
  232. FUsersCon.Close;
  233. FUsersCon.Free;
  234. FUsersQry.Free;
  235. end;
  236. procedure TLoginFrm.ReadCloudUser;
  237. var s: string;
  238. begin
  239. FUsersCon := TADOConnection.Create(nil);
  240. FUsersCon.LoginPrompt := False;
  241. s := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=CloudUser.dat;Persist Security Info=False';
  242. FUsersCon.ConnectionString := s;
  243. FUsersQry := TADOQuery.Create(nil);
  244. FUsersQry.Connection := FUsersCon;
  245. FUsersQry.SQL.Text := 'Select Top 15 * From Users Order by LoginTimes Desc';
  246. FUsersQry.Open;
  247. cbUser.Properties.Items.Clear;
  248. if FUsersQry.RecordCount > 0 then
  249. begin
  250. FUsersQry.First;
  251. while not FUsersQry.Eof do
  252. begin
  253. cbUser.Properties.Items.Add(FUsersQry.FieldByName('Account').AsString);
  254. FUsersQry.Next;
  255. end;
  256. end;
  257. FUsersQry.Close;
  258. end;
  259. procedure TLoginFrm.WriteCloudUser;
  260. begin
  261. FUsersQry.Close;
  262. FUsersQry.SQL.Text := Format('Select * From Users where UserID = %d', [PHPWeb.UserID]);
  263. FUsersQry.Open;
  264. if FUsersQry.RecordCount > 0 then
  265. begin
  266. FUsersQry.Close;
  267. FUsersQry.SQL.Text := Format('Update Users Set LoginTimes=LoginTimes+1 where UserID = %d', [PHPWeb.UserID]);
  268. FUsersQry.ExecSQL;
  269. end
  270. else
  271. begin
  272. FUsersQry.Close;
  273. FUsersQry.SQL.Text := Format('Insert into Users(UserID,Account,RealName,LoginTimes) Values(%d,''%s'',''%s'',1)',
  274. [PHPWeb.UserID, PHPWeb.Account, PHPWeb.RealName]);
  275. FUsersQry.ExecSQL;
  276. end;
  277. FUsersQry.Close;
  278. end;
  279. procedure TLoginFrm.cbUserKeyDown(Sender: TObject; var Key: Word;
  280. Shift: TShiftState);
  281. begin
  282. if Key = VK_Return then
  283. begin
  284. edtPW.SetFocus;
  285. edtPW.SelectAll;
  286. end;
  287. end;
  288. procedure TLoginFrm.nClearAccountClick(Sender: TObject);
  289. begin
  290. if Application.MessageBox('确定要清空所有记录的帐户信息吗?', '询问', MB_YESNO + MB_ICONQUESTION) = ID_No then
  291. Exit;
  292. FUsersQry.Close;
  293. FUsersQry.SQL.Text := 'Delete * From Users';
  294. FUsersQry.ExecSQL;
  295. FUsersQry.Close;
  296. cbUser.Properties.Items.Clear;
  297. end;
  298. procedure TLoginFrm.cbUserKeyPress(Sender: TObject; var Key: Char);
  299. begin
  300. {$IFDEF _mDebugView}
  301. if Key = #13 then
  302. edtPW.Text := GetDebugUsers.GetPassword(cbUser.Text);
  303. {$ENDIF}
  304. end;
  305. end.