LoginFrm.pas 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  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. 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;
  64. {$R *.dfm}
  65. function LoginForm: Boolean;
  66. var
  67. Form: TLoginFrm;
  68. begin
  69. Result := False;
  70. Form := TLoginFrm.Create(nil);
  71. try
  72. if Form.ShowModal = mrOK then
  73. begin
  74. Result := True;
  75. Form.WriteCloudUser;
  76. end;
  77. finally
  78. Form.Free;
  79. end;
  80. end;
  81. { TLoginFrm }
  82. procedure TLoginFrm.edtPWKeyDown(Sender: TObject; var Key: Word;
  83. Shift: TShiftState);
  84. begin
  85. if Key = VK_Return then
  86. btnLoginClick(Sender);
  87. end;
  88. procedure TLoginFrm.FormCreate(Sender: TObject);
  89. var SL: TStringList;
  90. ini: TIniFile;
  91. begin
  92. lblHint.Caption := '';
  93. SetClassLong(Handle, GCL_STYLE, GetClassLong(Handle, GCL_STYLE) or CS_DROPSHADOW);
  94. Set8087CW(Default8087CW or $0004);
  95. Set8087CW(Longword($133f));
  96. ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Cloud.ini');
  97. try
  98. G_Server := ini.ReadString('URL', 'Server', '');
  99. G_ServerType := ini.ReadString('URL', 'ServerType', '');
  100. G_CompanyName := ini.ReadString('URL', 'CompanyName', '');
  101. G_GuideURL := ini.ReadString('URL', 'GuideURL', '');
  102. G_MeasureURL := 'http://' + G_Server + ini.ReadString('URL', 'MeasureURL', '');
  103. finally
  104. ini.Free;
  105. end;
  106. if Trim(G_CompanyName) <> '' then
  107. lblProductName.Caption := G_CompanyName
  108. else
  109. lblProductName.Caption := G_ProductName;
  110. // 服务器:1公有 2私有
  111. if G_ServerType = '2' then
  112. begin
  113. pnlLocalServer.Visible := True;
  114. lblLocalServer.URL := G_Server;
  115. lblLocalServer.Hint := G_Server;
  116. lblLocalHelp.URL := G_GuideURL;
  117. lblLocalHelp.Hint := G_GuideURL;
  118. end
  119. else if G_ServerType = '1' then
  120. begin
  121. pnlLocalServer.Visible := False;
  122. end;
  123. lblReg.URL := PHPWeb.RegURL;
  124. lblForgetPW.URL := PHPWeb.PwdURL;
  125. lblVer.Caption := G_ProductName + ' ' + ScGetVersion;
  126. // lblVer.Left := lblProductName.Left + lblProductName.Width + 7;
  127. ReadCloudUser;
  128. SL := TStringList.Create;
  129. try
  130. SL.Clear;
  131. SL.Add('about: <body><font size=4 color=Green>') ;
  132. SL.Add('正在打开网页请稍候...');
  133. SL.Add('</font></body>');
  134. wbLogin.Navigate(SL.Text);
  135. wbLogin.Navigate(PHPWeb.LoginBannerURL);
  136. finally
  137. end;
  138. end;
  139. procedure TLoginFrm.btnLoginClick(Sender: TObject);
  140. var sInfo, sURL, sCheckCode, sMD5PW: string;
  141. begin
  142. lblHint.Caption := '';
  143. lblHint.Update;
  144. if Trim(cbUser.Text) = '' then
  145. begin
  146. lblHint.Caption := '请您输入账号后再登录';
  147. lblHint.Update;
  148. cbUser.SetFocus;
  149. Exit;
  150. end;
  151. if Trim(edtPW.Text) = '' then
  152. begin
  153. lblHint.Caption := '请您输入密码后再登录';
  154. lblHint.Update;
  155. edtPW.SetFocus;
  156. Exit;
  157. end;
  158. case PHPWeb.Login(cbUser.Text, edtPW.Text, sInfo, sCheckCode) of
  159. ltCon:
  160. begin
  161. if Trim(sInfo) <> '' then
  162. Application.MessageBox(PChar(sInfo), '新版本提示', MB_OK + MB_ICONINFORMATION);
  163. ModalResult := mrOk;
  164. end;
  165. ltLoginFail:
  166. begin
  167. lblHint.Caption := sInfo;
  168. lblHint.Update;
  169. edtPW.SetFocus;
  170. edtPW.SelectAll;
  171. ModalResult := mrNone;
  172. end;
  173. ltUpdate:
  174. begin
  175. // 无法对PHP返回的字符串进行排版。这里使用Delphi自身的字符串。
  176. sInfo := '尊敬的用户:' + #13#13 +
  177. '系统检测出您是通过SmartCost旧版本程序注册了本帐户(' + Trim(cbUser.Text) +
  178. '),因系统升级,为保障您的帐户安全和更好的为您服务,' + #13#13 +
  179. '我们需要对您的邮箱进行有效性验证,并需要您重置该帐户的密码以保证您的帐号在新程序上能够正常使用。' + #13#13 +
  180. '请点击“确定”按钮打开密码重置页面。';
  181. Application.MessageBox(PChar(sInfo), '升级提示', MB_OK + MB_ICONINFORMATION);
  182. edtPW.SetFocus;
  183. edtPW.SelectAll;
  184. ModalResult := mrNone;
  185. Screen.Cursor := crHourGlass;
  186. try
  187. sURL := ConfigInfo.OldUserResetPwdURL + '?CheckCode=' + sCheckCode;
  188. ShellExecute(Application.Handle, 'open', PChar(sURL), nil, nil, SW_SHOWNORMAL);
  189. finally
  190. Screen.Cursor := crDefault;
  191. end;
  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 := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=CloudUser.dat;Persist Security Info=False';
  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.cbUserClick(Sender: TObject);
  291. // For Test Quickly. chenshilong, 2015-09-30
  292. //const
  293. // AccArr: array[1..11, 1..3] of string = (
  294. // ('1', '2636698008@qq.com', 'smartcost3850887'), // 纵横销售演示服务器
  295. // ('2', '1971614655@qq.com', '357134933..'),
  296. // ('3', '1835082984@qq.com', '123456'),
  297. // ('4', '2417587264@qq.com', 'koukou0708'),
  298. // ('5', '2609827960@qq.com', 'missling'),
  299. // ('6', '1240621850@qq.com', '87654321'),
  300. // ('7', '1014149875@qq.com', 'zhbwoai'),
  301. // ('8', '1525739553@qq.com', '123456'),
  302. // ('9', '1391010261@qq.com', 'missling'),
  303. // ('10', '916960227@qq.com', '123456'),
  304. // ('11', '916960227@qq.com', '12345678') // 测试服务器
  305. // );
  306. //
  307. //var
  308. // i: Integer;
  309. // bEx: Boolean;
  310. begin
  311. // if G_IsTest then
  312. // begin
  313. // bEx := False;
  314. // for i := Low(AccArr) to High(AccArr) do
  315. // begin
  316. // if AccArr[i, 1] = cbUser.Text then
  317. // begin
  318. // cbUser.Text := AccArr[i, 2];
  319. // edtPW.Text := AccArr[i, 3];
  320. // bEx := True;
  321. // Break;
  322. // end;
  323. // end;
  324. // if not bEx then
  325. // begin
  326. // cbUser.Clear;
  327. // edtPW.Clear;
  328. // end;
  329. // end;
  330. end;
  331. procedure TLoginFrm.nClearAccountClick(Sender: TObject);
  332. begin
  333. if Application.MessageBox('确定要清空所有记录的帐户信息吗?', '询问', MB_YESNO + MB_ICONQUESTION) = ID_No then
  334. Exit;
  335. FUsersQry.Close;
  336. FUsersQry.SQL.Text := 'Delete * From Users';
  337. FUsersQry.ExecSQL;
  338. FUsersQry.Close;
  339. cbUser.Properties.Items.Clear;
  340. end;
  341. end.