LoginFrm.pas 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  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 := '123456';
  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(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. // 无法对PHP返回的字符串进行排版。这里使用Delphi自身的字符串。
  181. sInfo := '尊敬的用户:' + #13#13 +
  182. '系统检测出您是通过SmartCost旧版本程序注册了本帐户(' + Trim(cbUser.Text) +
  183. '),因系统升级,为保障您的帐户安全和更好的为您服务,' + #13#13 +
  184. '我们需要对您的邮箱进行有效性验证,并需要您重置该帐户的密码以保证您的帐号在新程序上能够正常使用。' + #13#13 +
  185. '请点击“确定”按钮打开密码重置页面。';
  186. Application.MessageBox(PChar(sInfo), '升级提示', MB_OK + MB_ICONINFORMATION);
  187. edtPW.SetFocus;
  188. edtPW.SelectAll;
  189. ModalResult := mrNone;
  190. Screen.Cursor := crHourGlass;
  191. try
  192. sURL := ConfigInfo.OldUserResetPwdURL + '?CheckCode=' + sCheckCode;
  193. ShellExecute(Application.Handle, 'open', PChar(sURL), nil, nil, SW_SHOWNORMAL);
  194. finally
  195. Screen.Cursor := crDefault;
  196. end;
  197. end; }
  198. // 升级
  199. begin
  200. if Application.MessageBox(PChar(sInfo), '系统提示', MB_OKCANCEL + MB_ICONQUESTION) = ID_OK then
  201. begin
  202. vFDForm := TFileDownLoadForm.Create(nil);
  203. try
  204. vFDForm.URL := sURL;
  205. vFDForm.ShowModal;
  206. finally
  207. vFDForm.Free;
  208. end;
  209. end;
  210. ModalResult := mrNone;
  211. end;
  212. ltIncomplete:
  213. begin
  214. Application.MessageBox(PChar(sInfo), '系统提示', MB_OK + MB_ICONINFORMATION);
  215. ModalResult := mrNone;
  216. Screen.Cursor := crHourGlass;
  217. try
  218. sMD5PW := GetMD5(edtPW.Text);
  219. sURL := Format('%s?Account=%s&Pwd=%s', [ConfigInfo.WebLoginURL,
  220. cbUser.Text, sMD5PW]);
  221. ShellExecute(Application.Handle, 'open', PChar(sURL), nil, nil, SW_SHOWNORMAL);
  222. finally
  223. Screen.Cursor := crDefault;
  224. end;
  225. end;
  226. ltDisCon:
  227. begin
  228. Application.MessageBox('网络错误,请稍后重试!', '操作提醒', MB_OK + MB_ICONWARNING);
  229. ModalResult := mrNone;
  230. end;
  231. end;
  232. end;
  233. procedure TLoginFrm.img1Click(Sender: TObject);
  234. begin
  235. Close;
  236. end;
  237. procedure TLoginFrm.shpAccountMouseDown(Sender: TObject; Button: TMouseButton;
  238. Shift: TShiftState; X, Y: Integer);
  239. begin
  240. cbUser.SetFocus;
  241. end;
  242. procedure TLoginFrm.shpPWMouseDown(Sender: TObject; Button: TMouseButton;
  243. Shift: TShiftState; X, Y: Integer);
  244. begin
  245. edtPW.SetFocus;
  246. end;
  247. procedure TLoginFrm.btnCloseClick(Sender: TObject);
  248. begin
  249. Close;
  250. end;
  251. procedure TLoginFrm.FormDestroy(Sender: TObject);
  252. begin
  253. FUsersCon.Close;
  254. FUsersCon.Free;
  255. FUsersQry.Free;
  256. end;
  257. procedure TLoginFrm.ReadCloudUser;
  258. var s: string;
  259. begin
  260. FUsersCon := TADOConnection.Create(nil);
  261. FUsersCon.LoginPrompt := False;
  262. s := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=CloudUser.dat;Persist Security Info=False';
  263. FUsersCon.ConnectionString := s;
  264. FUsersQry := TADOQuery.Create(nil);
  265. FUsersQry.Connection := FUsersCon;
  266. FUsersQry.SQL.Text := 'Select Top 15 * From Users Order by LoginTimes Desc';
  267. FUsersQry.Open;
  268. cbUser.Properties.Items.Clear;
  269. if FUsersQry.RecordCount > 0 then
  270. begin
  271. FUsersQry.First;
  272. while not FUsersQry.Eof do
  273. begin
  274. cbUser.Properties.Items.Add(FUsersQry.FieldByName('Account').AsString);
  275. FUsersQry.Next;
  276. end;
  277. end;
  278. FUsersQry.Close;
  279. end;
  280. procedure TLoginFrm.WriteCloudUser;
  281. begin
  282. FUsersQry.Close;
  283. FUsersQry.SQL.Text := Format('Select * From Users where UserID = %d', [PHPWeb.UserID]);
  284. FUsersQry.Open;
  285. if FUsersQry.RecordCount > 0 then
  286. begin
  287. FUsersQry.Close;
  288. FUsersQry.SQL.Text := Format('Update Users Set LoginTimes=LoginTimes+1 where UserID = %d', [PHPWeb.UserID]);
  289. FUsersQry.ExecSQL;
  290. end
  291. else
  292. begin
  293. FUsersQry.Close;
  294. FUsersQry.SQL.Text := Format('Insert into Users(UserID,Account,RealName,LoginTimes) Values(%d,''%s'',''%s'',1)',
  295. [PHPWeb.UserID, PHPWeb.Account, PHPWeb.RealName]);
  296. FUsersQry.ExecSQL;
  297. end;
  298. FUsersQry.Close;
  299. end;
  300. procedure TLoginFrm.cbUserKeyDown(Sender: TObject; var Key: Word;
  301. Shift: TShiftState);
  302. begin
  303. if Key = VK_Return then
  304. begin
  305. edtPW.SetFocus;
  306. edtPW.SelectAll;
  307. end;
  308. end;
  309. procedure TLoginFrm.nClearAccountClick(Sender: TObject);
  310. begin
  311. if Application.MessageBox('确定要清空所有记录的帐户信息吗?', '询问', MB_YESNO + MB_ICONQUESTION) = ID_No then
  312. Exit;
  313. FUsersQry.Close;
  314. FUsersQry.SQL.Text := 'Delete * From Users';
  315. FUsersQry.ExecSQL;
  316. FUsersQry.Close;
  317. cbUser.Properties.Items.Clear;
  318. end;
  319. procedure TLoginFrm.cbUserKeyPress(Sender: TObject; var Key: Char);
  320. begin
  321. {$IFDEF _mDebugView}
  322. if Key = #13 then
  323. edtPW.Text := GetDebugUsers.GetPassword(cbUser.Text);
  324. {$ENDIF}
  325. end;
  326. end.