5 uses System.SysUtils, System.Classes, Web.HTTPApp, FireDAC.Stan.Intf,
6 FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS,
7 FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt,
8 FireDAC.UI.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Phys,
9 FireDAC.Phys.SQLite, FireDAC.Phys.SQLiteDef, FireDAC.Stan.ExprFuncs, Data.DB,
10 FireDAC.Comp.Client, FireDAC.Comp.DataSet, Web.HTTPProd, Web.DSProd,
11 AnsiStrings, System.DateUtils;
14 TWebModule1 = class(TWebModule)
16 FDConnection1: TFDConnection;
18 FDTable2home: TWideMemoField;
19 FDTable2title: TWideMemoField;
20 FDTable2title2: TWideMemoField;
21 FDTable2pass: TWideMemoField;
22 PageProducer1: TPageProducer;
23 DataSetPageProducer2: TDataSetPageProducer;
24 FDTable1name: TWideMemoField;
25 FDTable1no: TIntegerField;
26 FDTable1date: TWideMemoField;
27 FDTable1sub: TWideMemoField;
28 FDTable1com: TWideMemoField;
29 FDTable1pass: TWideMemoField;
30 adminDS: TDataSetPageProducer;
31 FDTable2ngwords: TWideMemoField;
33 FDTable3link: TIntegerField;
34 FDTable3count: TIntegerField;
35 procedure WebModule1DefaultHandlerAction(Sender: TObject;
36 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
37 procedure PageProducer1HTMLTag(Sender: TObject; Tag: TTag;
38 const TagString: string; TagParams: TStrings; var ReplaceText: string);
39 procedure WebModule1registAction(Sender: TObject; Request: TWebRequest;
40 Response: TWebResponse; var Handled: Boolean);
41 procedure DataSetPageProducer2HTMLTag(Sender: TObject; Tag: TTag;
42 const TagString: string; TagParams: TStrings; var ReplaceText: string);
43 procedure WebModule1userdelAction(Sender: TObject; Request: TWebRequest;
44 Response: TWebResponse; var Handled: Boolean);
45 procedure WebModule1adminAction(Sender: TObject; Request: TWebRequest;
46 Response: TWebResponse; var Handled: Boolean);
47 procedure WebModule1admindelAction(Sender: TObject; Request: TWebRequest;
48 Response: TWebResponse; var Handled: Boolean);
49 procedure WebModule1loginAction(Sender: TObject; Request: TWebRequest;
50 Response: TWebResponse; var Handled: Boolean);
51 procedure WebModuleBeforeDispatch(Sender: TObject; Request: TWebRequest;
52 Response: TWebResponse; var Handled: Boolean);
53 procedure WebModule1setupAction(Sender: TObject; Request: TWebRequest;
54 Response: TWebResponse; var Handled: Boolean);
55 procedure WebModule1searchAction(Sender: TObject; Request: TWebRequest;
56 Response: TWebResponse; var Handled: Boolean);
57 procedure WebModuleCreate(Sender: TObject);
58 procedure WebModuleDestroy(Sender: TObject);
68 function footer(const path: string): string;
72 WebModuleClass: TComponentClass = TWebModule1;
76 { %CLASSGROUP 'Vcl.Controls.TControl' }
81 path = '';// 'C:\Users\fuke masasi\Documents\Embarcadero\Studio\Projects\pbbs\';
83 procedure TWebModule1.DataSetPageProducer2HTMLTag(Sender: TObject; Tag: TTag;
84 const TagString: string; TagParams: TStrings; var ReplaceText: string);
86 if TagString = 'home' then
88 ReplaceText := FDTable2.FieldByName('home').AsString;
92 ReplaceText := FDTable1.FieldByName(TagString).AsString;
96 function TWebModule1.footer(const path: string): string;
98 s1, s2, t1, t2: string;
100 function linkcontent: string;
105 link := FDTable3.FieldByName('link').AsInteger;
106 if pos > link div 2 then
108 if (FDTable1.RecordCount - 1) div count < pos + link div 2 then
110 i := FDTable1.RecordCount div count - link - pos;
117 else if pos = -1 then
119 i := -pos + FDTable1.RecordCount div count - link;
125 for j := 0 to link do
127 if FDTable1.RecordCount <= (pos + i + j) * count then
129 if pos + i + j < 0 then
133 result := result + ' ' + IntToStr(pos + 1) + ' ';
137 result := result + Format(' <a href="' + FDTable2.FieldByName('home')
138 .AsString + path + '?pos=%d">%d</a> ',
139 [pos + i + j, pos + 1 + i + j]);
145 count := FDTable3.FieldByName('count').AsInteger;
148 s1 := '
\8dÅ
\90V%d
\8c\8f\82Ì
\8bL
\8e\96\82ð
\95\
\8e¦<br><center>Pages : [<b>';
149 s2 := '<<' + linkcontent + '>>]
\8dÅ
\90V</b><br></center>';
150 result := Format(s1, [count]) + s2;
160 t1 := '?pos=' + IntToStr(pos - 1);
162 i := (FDTable1.RecordCount - 1) div count;
167 t2 := '?pos=' + IntToStr(pos);
168 k := FDTable1.RecordCount;
172 t2 := '?pos=' + IntToStr(pos + 1);
173 k := (pos + 1) * count;
175 s1 := '%d
\8c\8f\92\86 %d
\8c\8f\82©
\82ç %d
\8c\8f\82Ü
\82Å
\95\
\8e¦<br><center>Page : [<b>';
176 s2 := '<a href="' + FDTable2.FieldByName('home').AsString + path + t1 +
177 '"><<</a>' + linkcontent + '<a href="' + FDTable2.FieldByName('home')
178 .AsString + path + t2 + '">>></a>] <a href="' +
179 FDTable2.FieldByName('home').AsString + path + '">
\8dÅ
\90V</a></b></center>';
180 result := Format(s1, [FDTable1.RecordCount, pos * count + 1, k]) + s2;
184 procedure TWebModule1.PageProducer1HTMLTag(Sender: TObject; Tag: TTag;
185 const TagString: string; TagParams: TStrings; var ReplaceText: string);
187 i, j, count: integer;
188 s: TDataSetPageProducer;
191 if (TagString = 'home') or (TagString = 'title') or (TagString = 'title2')
193 ReplaceText := FDTable2.FieldByName(TagString).AsString;
194 if TagString = 'username' then
196 if TagString = 'main' then
198 t := ExtractFileName(PageProducer1.HTMLFile);
199 if FDTable1.RecordCount = 0 then
201 if t = 'index.htm' then
202 ReplaceText := '
\82Ü
\82¾
\93\8a\8de
\82ª
\82 \82è
\82Ü
\82¹
\82ñ.';
206 count := FDTable3.FieldByName('count').AsInteger;
207 if t = 'admin.htm' then
213 s := DataSetPageProducer2;
217 if (pos + 1) * count > FDTable1.RecordCount then
218 pos := (FDTable1.RecordCount - 1) div count;
221 if FDTable1.RecordCount < count then
223 j := FDTable1.RecordCount mod count;
230 else if FDTable1.RecordCount < (pos + 1) * count then
232 j := FDTable1.RecordCount - pos * count;
244 FDTable1.RecNo := (pos + 1) * count;
248 ReplaceText := ReplaceText + s.Content;
253 if TagString = 'footer' then
254 if TagParams.Values['refer'] = 'true' then
260 t := ExtractFileName(PageProducer1.HTMLFile);
261 foo := footer(ChangeFileExt(t, ''));
264 if TagString = 'text' then
265 if FDTable1.Filter = '' then
267 ReplaceText := '
\8c\9f\8dõ
\82µ
\82Ü
\82·';
271 ReplaceText := '
\8aY
\93\96\8c\8b\89Ê ' + IntToStr(FDTable1.RecordCount) + '
\8c\8f' +
276 procedure TWebModule1.WebModule1adminAction(Sender: TObject;
277 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
284 FDTable1.Filtered := false;
285 PageProducer1.HTMLFile := path + 'admin.htm';
286 Response.ContentType := 'text/html; charset=utf-8;';
287 Response.Content := PageProducer1.Content;
292 s := Request.ContentFields.Values['password'];
293 pos := StrToIntDef(Request.QueryFields.Values['pos'], -1);
296 with Response.Cookies.Add do
298 path := FDTable2.FieldByName('home').AsAnsiString + 'admin';
301 Value := AnsiString(s);
304 if s = FDTable2.FieldByName('pass').AsString then
307 else if Request.CookieFields.Values['psw'] = FDTable2.FieldByName('pass').AsString
311 Response.SendRedirect(FDTable2.FieldByName('home').AsAnsiString + 'login');
314 procedure TWebModule1.WebModule1admindelAction(Sender: TObject;
315 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
319 for i := 0 to Request.ContentFields.count - 1 do
320 if FDTable1.Locate('no', Request.ContentFields.ValueFromIndex[i], []) = true
323 Response.SendRedirect(FDTable2.FieldByName('home').AsAnsiString + 'admin');
326 procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
327 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
329 pos := StrToIntDef(Request.QueryFields.Values['pos'], -1);
330 FDTable1.Filtered := false;
331 user := Request.CookieFields.Values['UID'];
332 PageProducer1.HTMLFile := path + 'index.htm';
333 Response.ContentType := 'text/html; charset=utf-8;';
334 Response.Content := PageProducer1.Content;
337 procedure TWebModule1.WebModule1loginAction(Sender: TObject;
338 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
340 PageProducer1.HTMLFile := path + 'login.htm';
341 Response.ContentType := 'text/html; charset=utf-8;';
342 Response.Content := PageProducer1.Content;
345 procedure TWebModule1.WebModule1registAction(Sender: TObject;
346 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
348 na, sub, com, pass: string;
353 with Request.ContentFields do
355 na := Values['name'];
356 sub := Values['title'];
357 com := Values['comment'];
358 pass := Values['password'];
361 na := '
\92N
\82©
\82³
\82ñ';
363 sub := '
\83^
\83C
\83g
\83\8b\82È
\82µ';
366 Response.Content := '
\96{
\95¶
\82ª
\82 \82è
\82Ü
\82¹
\82ñ.'#$D#$A;
370 s := ReplaceText(AnsiString(com), #$D#$A, '<br>');
372 for i := 0 to words.count - 1 do
373 if ContainsText(s, AnsiString(words[i])) = true then
375 Response.Content := Response.Content + '
\8bÖ
\8e~
\8cê
\8bå
\82ª
\8aÜ
\82Ü
\82ê
\82Ü
\82·.';
378 if FDTable1.RecordCount = 0 then
385 no := FDTable1.FieldByName('no').AsInteger + 1;
386 if SecondsBetween(Now, StrToDateTime(FDTable1.FieldByName('date').AsString))
388 Response.Content := '
\8d¬
\82Ý
\8d\87\82Á
\82Ä
\82¢
\82Ü
\82·.';
390 if Response.Content <> '' then
392 Response.ContentType := 'text/plain;';
395 FDTable1.AppendRecord([na, no, DateTimeToStr(Now), sub, s, pass]);
396 with Response.Cookies.Add do
398 path := FDTable2.FieldByName('home').AsAnsiString;
400 Value := AnsiString(na);
403 Response.SendRedirect(FDTable2.FieldByName('home').AsAnsiString);
406 procedure TWebModule1.WebModule1searchAction(Sender: TObject;
407 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
413 t1 := Request.ContentFields.Values['filter'];
415 s := TStringList.Create;
417 s.DelimitedText := Request.ContentFields.Values['word1'];
418 for i := 0 to s.count - 1 do
425 t3 := t3 + t1 + ' LIKE ''%' + t2 + '%''';
430 FDTable1.Filter := t3;
431 FDTable1.Filtered := true;
432 PageProducer1.HTMLFile := path + 'search.htm';
433 Response.ContentType := 'text/html; charset=utf-8;';
434 Response.Content := PageProducer1.ContentFromString(PageProducer1.Content);
437 procedure TWebModule1.WebModule1setupAction(Sender: TObject;
438 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
443 for i := 0 to Request.ContentFields.count - 1 do
445 s := Request.ContentFields.Names[i];
447 FDTable2.FieldByName(s).AsString :=
448 Request.ContentFields.ValueFromIndex[i];
453 procedure TWebModule1.WebModule1userdelAction(Sender: TObject;
454 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
459 i := StrToIntDef(Request.ContentFields.Values['number'], 0);
460 if (i > 0) and (FDTable1.Locate('no', i, []) = true) then
462 s := FDTable1.FieldByName('pass').AsString;
463 if (s <> '') and (s = Request.ContentFields.Values['password']) then
469 procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject;
470 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
474 if FDTable1.Exists = false then
475 FDTable1.CreateTable(false, [tpTable]);
476 if FDTable2.Exists = false then
478 FDTable2.CreateTable(false, [tpTable]);
479 FDTable2.Active := true;
480 if Request.ServerPort = 80 then
482 s := 'http://' + String(Request.Host);
486 s := 'http://' + String(Request.Host) + ':' +
487 IntToStr(Request.ServerPort);
489 if Request.ScriptName <> '' then
491 s := s + String(Request.ScriptName) + '/';
497 FDTable2.AppendRecord([s, 'pbbs clone',
498 '<center><font size=5 face=Verdana color=gray><b>P-BBS CLONE</b></font></center>',
499 'admin', '
\82 \82Ù,
\82Î
\82©,
\8e\80\82Ë']);
500 PageProducer1.HTMLFile := path + 'setup.htm';
501 Response.ContentType := 'text/html; charset=utf-8;';
502 Response.Content := PageProducer1.Content;
507 FDTable2.Active := true;
509 if FDTable3.Exists = false then
511 FDTable3.CreateTable(false, [tpTable]);
512 FDTable3.Active := true;
513 FDTable3.AppendRecord([5, 20]);
517 FDTable3.Active := true;
519 words.DelimitedText := FDTable2.FieldByName('ngwords').AsString;
520 FDTable1.Active := true;
521 if FileExists(path + 'maintenance.htm') = true then
523 PageProducer1.HTMLFile := path + 'maintenance.htm';
524 Response.ContentType := 'text/html; charset=utf-8;';
525 Response.Content := PageProducer1.Content;
530 procedure TWebModule1.WebModuleCreate(Sender: TObject);
533 words := TStringList.Create;
536 procedure TWebModule1.WebModuleDestroy(Sender: TObject);