LoginFrm.pas 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  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 cbUserClick(Sender: TObject);
  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. end;
  141. procedure TLoginFrm.btnLoginClick(Sender: TObject);
  142. var sInfo, sURL, sMD5PW: string;
  143. vFDForm: TFileDownLoadForm;
  144. begin
  145. lblHint.Caption := '';
  146. lblHint.Update;
  147. if Trim(cbUser.Text) = '' then
  148. begin
  149. lblHint.Caption := '请您输入账号后再登录';
  150. lblHint.Update;
  151. cbUser.SetFocus;
  152. Exit;
  153. end;
  154. if Trim(edtPW.Text) = '' then
  155. begin
  156. lblHint.Caption := '请您输入密码后再登录';
  157. lblHint.Update;
  158. edtPW.SetFocus;
  159. Exit;
  160. end;
  161. case PHPWeb.Login(cbUser.Text, edtPW.Text, sInfo, sURL) of
  162. ltCon:
  163. begin
  164. ModalResult := mrOk;
  165. end;
  166. ltLoginFail:
  167. begin
  168. lblHint.Caption := sInfo;
  169. lblHint.Update;
  170. edtPW.SetFocus;
  171. edtPW.SelectAll;
  172. ModalResult := mrNone;
  173. end;
  174. ltUpdate:
  175. { begin
  176. // 无法对PHP返回的字符串进行排版。这里使用Delphi自身的字符串。
  177. sInfo := '尊敬的用户:' + #13#13 +
  178. '系统检测出您是通过SmartCost旧版本程序注册了本帐户(' + Trim(cbUser.Text) +
  179. '),因系统升级,为保障您的帐户安全和更好的为您服务,' + #13#13 +
  180. '我们需要对您的邮箱进行有效性验证,并需要您重置该帐户的密码以保证您的帐号在新程序上能够正常使用。' + #13#13 +
  181. '请点击“确定”按钮打开密码重置页面。';
  182. Application.MessageBox(PChar(sInfo), '升级提示', MB_OK + MB_ICONINFORMATION);
  183. edtPW.SetFocus;
  184. edtPW.SelectAll;
  185. ModalResult := mrNone;
  186. Screen.Cursor := crHourGlass;
  187. try
  188. sURL := ConfigInfo.OldUserResetPwdURL + '?CheckCode=' + sCheckCode;
  189. ShellExecute(Application.Handle, 'open', PChar(sURL), nil, nil, SW_SHOWNORMAL);
  190. finally
  191. Screen.Cursor := crDefault;
  192. end;
  193. end; }
  194. // 升级
  195. begin
  196. if Application.MessageBox(PChar(sInfo), '系统提示', MB_OKCANCEL + MB_ICONQUESTION) = ID_OK then
  197. begin
  198. vFDForm := TFileDownLoadForm.Create(nil);
  199. try
  200. vFDForm.URL := sURL;
  201. vFDForm.ShowModal;
  202. finally
  203. vFDForm.Free;
  204. end;
  205. end;
  206. ModalResult := mrNone;
  207. end;
  208. ltIncomplete:
  209. begin
  210. Application.MessageBox(PChar(sInfo), '系统提示', MB_OK + MB_ICONINFORMATION);
  211. ModalResult := mrNone;
  212. Screen.Cursor := crHourGlass;
  213. try
  214. sMD5PW := GetMD5(edtPW.Text);
  215. sURL := Format('%s?Account=%s&Pwd=%s', [ConfigInfo.WebLoginURL,
  216. cbUser.Text, sMD5PW]);
  217. ShellExecute(Application.Handle, 'open', PChar(sURL), nil, nil, SW_SHOWNORMAL);
  218. finally
  219. Screen.Cursor := crDefault;
  220. end;
  221. end;
  222. ltDisCon:
  223. begin
  224. Application.MessageBox('网络错误,请稍后重试!', '操作提醒', MB_OK + MB_ICONWARNING);
  225. ModalResult := mrNone;
  226. end;
  227. end;
  228. end;
  229. procedure TLoginFrm.img1Click(Sender: TObject);
  230. begin
  231. Close;
  232. end;
  233. procedure TLoginFrm.shpAccountMouseDown(Sender: TObject; Button: TMouseButton;
  234. Shift: TShiftState; X, Y: Integer);
  235. begin
  236. cbUser.SetFocus;
  237. end;
  238. procedure TLoginFrm.shpPWMouseDown(Sender: TObject; Button: TMouseButton;
  239. Shift: TShiftState; X, Y: Integer);
  240. begin
  241. edtPW.SetFocus;
  242. end;
  243. procedure TLoginFrm.btnCloseClick(Sender: TObject);
  244. begin
  245. Close;
  246. end;
  247. procedure TLoginFrm.FormDestroy(Sender: TObject);
  248. begin
  249. FUsersCon.Close;
  250. FUsersCon.Free;
  251. FUsersQry.Free;
  252. end;
  253. procedure TLoginFrm.ReadCloudUser;
  254. var s: string;
  255. begin
  256. FUsersCon := TADOConnection.Create(nil);
  257. FUsersCon.LoginPrompt := False;
  258. s := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=CloudUser.dat;Persist Security Info=False';
  259. FUsersCon.ConnectionString := s;
  260. FUsersQry := TADOQuery.Create(nil);
  261. FUsersQry.Connection := FUsersCon;
  262. FUsersQry.SQL.Text := 'Select Top 15 * From Users Order by LoginTimes Desc';
  263. FUsersQry.Open;
  264. cbUser.Properties.Items.Clear;
  265. if FUsersQry.RecordCount > 0 then
  266. begin
  267. FUsersQry.First;
  268. while not FUsersQry.Eof do
  269. begin
  270. cbUser.Properties.Items.Add(FUsersQry.FieldByName('Account').AsString);
  271. FUsersQry.Next;
  272. end;
  273. end;
  274. FUsersQry.Close;
  275. end;
  276. procedure TLoginFrm.WriteCloudUser;
  277. begin
  278. FUsersQry.Close;
  279. FUsersQry.SQL.Text := Format('Select * From Users where UserID = %d', [PHPWeb.UserID]);
  280. FUsersQry.Open;
  281. if FUsersQry.RecordCount > 0 then
  282. begin
  283. FUsersQry.Close;
  284. FUsersQry.SQL.Text := Format('Update Users Set LoginTimes=LoginTimes+1 where UserID = %d', [PHPWeb.UserID]);
  285. FUsersQry.ExecSQL;
  286. end
  287. else
  288. begin
  289. FUsersQry.Close;
  290. FUsersQry.SQL.Text := Format('Insert into Users(UserID,Account,RealName,LoginTimes) Values(%d,''%s'',''%s'',1)',
  291. [PHPWeb.UserID, PHPWeb.Account, PHPWeb.RealName]);
  292. FUsersQry.ExecSQL;
  293. end;
  294. FUsersQry.Close;
  295. end;
  296. procedure TLoginFrm.cbUserKeyDown(Sender: TObject; var Key: Word;
  297. Shift: TShiftState);
  298. begin
  299. if Key = VK_Return then
  300. begin
  301. edtPW.SetFocus;
  302. edtPW.SelectAll;
  303. end;
  304. end;
  305. procedure TLoginFrm.cbUserClick(Sender: TObject);
  306. // For Test Quickly. chenshilong, 2015-09-30
  307. //const
  308. // AccArr: array[1..11, 1..3] of string = (
  309. // ('1', '2636698008@qq.com', 'smartcost3850887'), // 纵横销售演示服务器
  310. // ('2', '1971614655@qq.com', '357134933..'),
  311. // ('3', '1835082984@qq.com', '123456'),
  312. // ('4', '2417587264@qq.com', 'koukou0708'),
  313. // ('5', '2609827960@qq.com', 'missling'),
  314. // ('6', '1240621850@qq.com', '87654321'),
  315. // ('7', '1014149875@qq.com', 'zhbwoai'),
  316. // ('8', '1525739553@qq.com', '123456'),
  317. // ('9', '1391010261@qq.com', 'missling'),
  318. // ('10', '916960227@qq.com', '123456'),
  319. // ('11', '916960227@qq.com', '12345678') // 测试服务器
  320. // );
  321. //
  322. //var
  323. // i: Integer;
  324. // bEx: Boolean;
  325. begin
  326. // if G_IsTest then
  327. // begin
  328. // bEx := False;
  329. // for i := Low(AccArr) to High(AccArr) do
  330. // begin
  331. // if AccArr[i, 1] = cbUser.Text then
  332. // begin
  333. // cbUser.Text := AccArr[i, 2];
  334. // edtPW.Text := AccArr[i, 3];
  335. // bEx := True;
  336. // Break;
  337. // end;
  338. // end;
  339. // if not bEx then
  340. // begin
  341. // cbUser.Clear;
  342. // edtPW.Clear;
  343. // end;
  344. // end;
  345. {$IFDEF _mDebugView}
  346. edtPW.Text := GetDebugUsers.GetPassword(cbUser.Text);
  347. {$ENDIF}
  348. end;
  349. procedure TLoginFrm.nClearAccountClick(Sender: TObject);
  350. begin
  351. if Application.MessageBox('确定要清空所有记录的帐户信息吗?', '询问', MB_YESNO + MB_ICONQUESTION) = ID_No then
  352. Exit;
  353. FUsersQry.Close;
  354. FUsersQry.SQL.Text := 'Delete * From Users';
  355. FUsersQry.ExecSQL;
  356. FUsersQry.Close;
  357. cbUser.Properties.Items.Clear;
  358. end;
  359. procedure TLoginFrm.cbUserKeyPress(Sender: TObject; var Key: Char);
  360. begin
  361. {$IFDEF _mDebugView}
  362. if Key = #13 then
  363. edtPW.Text := GetDebugUsers.GetPassword(cbUser.Text);
  364. {$ENDIF}
  365. end;
  366. end.