5 uses System.SysUtils, System.Classes, Web.HTTPApp, Web.DSProd, Web.HTTPProd,
6 Web.DBWeb, System.Variants, System.NetEncoding, System.RegularExpressions,
7 Data.DB, Web.DBXpressWeb, System.Types, FireDAC.Stan.Intf,
8 FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS,
9 FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt,
10 FireDAC.Comp.DataSet, FireDAC.Comp.Client, FireDAC.UI.Intf, FireDAC.Stan.Def,
11 FireDAC.Stan.Pool, FireDAC.Phys, FireDAC.Phys.FB, FireDAC.Phys.FBDef,
12 FireDAC.Phys.MySQL, FireDAC.Phys.MySQLDef;
15 TWebModule1 = class(TWebModule)
16 articles: TDataSetPageProducer;
17 index: TDataSetPageProducer;
18 admin: TDataSetTableProducer;
19 search: TPageProducer;
20 items: TDataSetPageProducer;
23 master: TPageProducer;
24 alert: TDataSetPageProducer;
30 header: TDataSetPageProducer;
35 adhead: TPageProducer;
38 ti: TDataSetPageProducer;
40 FDTable2DBNUM: TIntegerField;
41 FDTable2NUMBER: TIntegerField;
42 FDTable2TITLE: TWideStringField;
43 FDTable2NAME: TWideStringField;
44 FDTable2COMMENT: TWideMemoField;
45 FDTable2RAW: TWideMemoField;
46 FDTable2DATE: TDateField;
47 FDTable2PASS: TWideStringField;
51 FDTable4ID: TIntegerField;
52 FDTable4DBNAME: TIntegerField;
53 FDTable4POSNUM: TIntegerField;
54 FDTable4DATE: TDateField;
55 FDTable4REQUEST: TWideMemoField;
56 DataSource1: TDataSource;
58 FDTable3TITLE: TWideStringField;
59 FDTable3TITLE2: TWideStringField;
60 FDTable3INFO: TIntegerField;
61 FDTable3COUNT: TIntegerField;
62 FDTable3password: TWideStringField;
63 FDTable3ng: TWideStringField;
64 FDConnection1: TFDConnection;
66 FDTable1DBNUM: TIntegerField;
67 FDTable1DATABASE: TWideStringField;
68 FDTable5ID: TIntegerField;
69 FDTable5NAME: TWideStringField;
70 FDTable5SOURCE: TBlobField;
72 footer: TPageProducer;
73 FDTable3mente: TBooleanField;
74 procedure indexHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
75 TagParams: TStrings; var ReplaceText: string);
76 procedure WebModule1indexpageAction(Sender: TObject; Request: TWebRequest;
77 Response: TWebResponse; var Handled: Boolean);
78 procedure WebModule1registAction(Sender: TObject; Request: TWebRequest;
79 Response: TWebResponse; var Handled: Boolean);
80 procedure WebModuleCreate(Sender: TObject);
81 procedure WebModule1adminAction(Sender: TObject; Request: TWebRequest;
82 Response: TWebResponse; var Handled: Boolean);
83 procedure WebModule1topAction(Sender: TObject; Request: TWebRequest;
84 Response: TWebResponse; var Handled: Boolean);
85 procedure itemsHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
86 TagParams: TStrings; var ReplaceText: string);
87 procedure topHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
88 TagParams: TStrings; var ReplaceText: string);
89 procedure WebModule1searchAction(Sender: TObject; Request: TWebRequest;
90 Response: TWebResponse; var Handled: Boolean);
91 procedure WebModule1helpAction(Sender: TObject; Request: TWebRequest;
92 Response: TWebResponse; var Handled: Boolean);
93 procedure searchHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
94 TagParams: TStrings; var ReplaceText: string);
95 procedure masterHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
96 TagParams: TStrings; var ReplaceText: string);
97 procedure articlesHTMLTag(Sender: TObject; Tag: TTag;
98 const TagString: string; TagParams: TStrings; var ReplaceText: string);
99 procedure footerHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
100 TagParams: TStrings; var ReplaceText: string);
101 procedure WebModule1alertAction(Sender: TObject; Request: TWebRequest;
102 Response: TWebResponse; var Handled: Boolean);
103 procedure WebModule1masterAction(Sender: TObject; Request: TWebRequest;
104 Response: TWebResponse; var Handled: Boolean);
105 procedure mailHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
106 TagParams: TStrings; var ReplaceText: string);
107 procedure alertHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
108 TagParams: TStrings; var ReplaceText: string);
109 procedure WebModule1deleteAction(Sender: TObject; Request: TWebRequest;
110 Response: TWebResponse; var Handled: Boolean);
111 procedure WebModule1jumpAction(Sender: TObject; Request: TWebRequest;
112 Response: TWebResponse; var Handled: Boolean);
113 procedure WebModule1linkAction(Sender: TObject; Request: TWebRequest;
114 Response: TWebResponse; var Handled: Boolean);
115 procedure headerHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
116 TagParams: TStrings; var ReplaceText: string);
117 procedure adminFormatCell(Sender: TObject; CellRow, CellColumn: Integer;
118 var BgColor: THTMLBgColor; var Align: THTMLAlign; var VAlign: THTMLVAlign;
119 var CustomAttrs, CellData: string);
120 procedure WebModule1admdelAction(Sender: TObject; Request: TWebRequest;
121 Response: TWebResponse; var Handled: Boolean);
122 procedure WebModule1loginAction(Sender: TObject; Request: TWebRequest;
123 Response: TWebResponse; var Handled: Boolean);
124 procedure WebModule1adminsetAction(Sender: TObject; Request: TWebRequest;
125 Response: TWebResponse; var Handled: Boolean);
126 procedure adheadHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
127 TagParams: TStrings; var ReplaceText: string);
128 procedure WebModule1logoutAction(Sender: TObject; Request: TWebRequest;
129 Response: TWebResponse; var Handled: Boolean);
130 procedure WebModule1imgAction(Sender: TObject; Request: TWebRequest;
131 Response: TWebResponse; var Handled: Boolean);
132 procedure WebModule1fileAction(Sender: TObject; Request: TWebRequest;
133 Response: TWebResponse; var Handled: Boolean);
134 procedure titleHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
135 TagParams: TStrings; var ReplaceText: string);
136 procedure WebModule1titleAction(Sender: TObject; Request: TWebRequest;
137 Response: TWebResponse; var Handled: Boolean);
138 procedure tiHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
139 TagParams: TStrings; var ReplaceText: string);
140 procedure helpHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
141 TagParams: TStrings; var ReplaceText: string);
142 procedure loginHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
143 TagParams: TStrings; var ReplaceText: string);
144 procedure css1HTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
145 TagParams: TStrings; var ReplaceText: string);
146 procedure WebModule1usrdelAction(Sender: TObject; Request: TWebRequest;
147 Response: TWebResponse; var Handled: Boolean);
152 procedure pages(count: Integer; var page: Integer);
153 procedure strsCheck(var Error: string; list: TStringList);
154 procedure setLastArticle;
155 function isInfo: Boolean;
156 function loginCheck: Boolean;
157 function hash(str: string): string;
158 function mente: Boolean;
159 function detail(ts, pid: string): string;
160 function scan(text: string): string;
166 WebModuleClass: TComponentClass = TWebModule1;
170 { %CLASSGROUP 'Vcl.Controls.TControl' }
172 uses IdHashSHA, IdGlobal, IdHash, IdHashMessageDigest, Jpeg, Graphics;
177 promotion = '
\8dL
\8d\90:';
180 procedure TWebModule1.adheadHTMLTag(Sender: TObject; Tag: TTag;
181 const TagString: string; TagParams: TStrings; var ReplaceText: string);
183 if TagString = 'pr' then
184 ReplaceText := promotion
185 else if TagString = 'uri' then
186 ReplaceText := Request.ScriptName
187 else if (TagString = 'mente') and
188 (FDTable3.FieldByName('mente').AsBoolean = true) then
189 ReplaceText := 'checked="checked"'
190 else if TagString = 'database' then
191 ReplaceText := Request.QueryFields.Values['db'];
194 procedure TWebModule1.adminFormatCell(Sender: TObject;
195 CellRow, CellColumn: Integer; var BgColor: THTMLBgColor;
196 var Align: THTMLAlign; var VAlign: THTMLVAlign;
197 var CustomAttrs, CellData: string);
199 if (CellColumn = 0) and (CellRow > 0) then
200 CellData := Format('<input name=check%d type=checkbox>', [CellRow]);
203 procedure TWebModule1.alertHTMLTag(Sender: TObject; Tag: TTag;
204 const TagString: string; TagParams: TStrings; var ReplaceText: string);
209 if (TagString = 'plus') and (alert.Tag = 0) then
210 ReplaceText := '<a href=' + Request.ScriptName +
211 '/jump?db=<#dbname>&num=<#posnum>>[ <#dbname>-<#posnum> ]</a>'
212 else if TagString = 'article' then
214 i := FDTable4.FieldByName('dbname').AsInteger;
215 j := FDTable4.FieldByName('posnum').AsInteger;
216 if FDTable2.Locate('dbnum;number', VarArrayOf([i, j])) = false then
218 ReplaceText := '<p>
\83\8a\83N
\83G
\83X
\83g';
221 s := TStringList.Create;
223 s.text := articles.Content;
226 for i := s.count - 1 downto 0 do
227 if Copy(s[i], 1, 18) = '<section id=master' then
232 ReplaceText := s.text;
239 procedure TWebModule1.articlesHTMLTag(Sender: TObject; Tag: TTag;
240 const TagString: string; TagParams: TStrings; var ReplaceText: string);
242 if TagString = 'uri' then
243 ReplaceText := Request.ScriptName
244 else if TagString = 'comment' then
245 ReplaceText := FDTable2.FieldByName('comment').AsString;
248 procedure TWebModule1.css1HTMLTag(Sender: TObject; Tag: TTag;
249 const TagString: string; TagParams: TStrings; var ReplaceText: string);
251 if TagString = 'uri' then
252 ReplaceText := Request.ScriptName;
255 function TWebModule1.detail(ts, pid: string): string;
259 for i := 0 to ComponentCount - 1 do
260 if Components[i].Name = ts + pid then
261 result := (Components[i] as TPageProducer).Content;
264 procedure TWebModule1.footerHTMLTag(Sender: TObject; Tag: TTag;
265 const TagString: string; TagParams: TStrings; var ReplaceText: string);
269 if TagString = 'link' then
272 if i = index.Tag then
273 ReplaceText := ReplaceText + ' ' + i.ToString + ' '
275 ReplaceText := ReplaceText +
276 Format(' <a style=text-decoration-line:none href="%s?db=%d&num=%d">%d</a> ',
277 [Request.ScriptName + PString(Self.Tag)^,
278 FDTable1.FieldByName('dbnum').AsInteger, i, i]);
280 else if TagString = 'recent' then
281 if index.Tag = -1 then
282 ReplaceText := TagString
284 ReplaceText := '<a style=text-decoration-line:none href="' +
285 Request.ScriptName + PString(Self.Tag)^ + '?db=' +
286 FDTable1.FieldByName('dbnum').AsString + '">recent</a>';
289 function TWebModule1.hash(str: string): string;
291 with TIdHashSHA1.Create do
294 result := HashStringAsHex(str);
301 procedure TWebModule1.headerHTMLTag(Sender: TObject; Tag: TTag;
302 const TagString: string; TagParams: TStrings; var ReplaceText: string);
306 if TagString = 'uri' then
307 ReplaceText := Request.ScriptName
308 else if TagString = 'cookie' then
310 s := TagParams.Values['param'];
311 ReplaceText := TNetEncoding.URL.Decode(Request.CookieFields.Values[s]);
313 else if (TagString = 'check') and
314 (Request.ContentFields.Values['show'] <> 'false') then
315 ReplaceText := 'checked'
316 else if TagString = 'preview' then
317 ReplaceText := Request.ContentFields.Values['preview']
318 else if TagString = 'raw' then
319 ReplaceText := Request.ContentFields.Values['raw']
320 else if TagString = 'pass' then
321 ReplaceText := Request.ContentFields.Values['password']
322 else if TagString = 'title' then
323 ReplaceText := Request.ContentFields.Values['title'];
326 procedure TWebModule1.helpHTMLTag(Sender: TObject; Tag: TTag;
327 const TagString: string; TagParams: TStrings; var ReplaceText: string);
329 if TagString = 'pr' then
330 ReplaceText := promotion
331 else if TagString = 'uri' then
332 ReplaceText := Request.ScriptName
333 else if TagString = 'area' then
336 ss := TStringList.Create;
338 ss.Add('<form action=' + Request.ScriptName +
339 '/help method=post><p>
\82¨
\96â
\82¢
\8d\87\82í
\82¹<
\8dí
\8f\9c\88Ë
\97\8a\82È
\82Ç
\89½
\82Å
\82à></p>');
340 ss.Add('<textarea name=help style=height:100px;width:250px>
\93\8a\8de
\8eÒ
\96¼
\82È
\82Ç
\81F');
341 ss.Add('
\91\8a\92k
\93à
\97e
\81F');
342 ss.Add('
\82»
\82Ì
\91¼
\81F</textarea><br>');
343 ss.Add('<input type=submit value="
\91\97\90M"></form>');
344 ReplaceText := ss.text;
351 '<p style=color:yellow;background-color:aqua>
\82²
\95ñ
\8d\90\82 \82è
\82ª
\82Æ
\82¤
\82²
\82´
\82¢
\82Ü
\82·.';
354 procedure TWebModule1.indexHTMLTag(Sender: TObject; Tag: TTag;
355 const TagString: string; TagParams: TStrings; var ReplaceText: string);
359 if TagString = 'pr' then
360 ReplaceText := promotion
361 else if TagString = 'uri' then
362 ReplaceText := Request.ScriptName
363 else if TagString = 'article' then
365 for i := 1 to FDTable3.FieldByName('count').AsInteger do
367 if FDTable2.Eof = true then
369 if isInfo = false then
370 ReplaceText := ReplaceText + articles.Content
372 ReplaceText := articles.Content + ReplaceText;
376 else if TagString = 'footer' then
377 ReplaceText := footer.Content
378 else if TagString = 'header' then
379 if (FDTable1.FieldByName('dbnum').AsInteger = FDTable3.FieldByName('info')
380 .AsInteger) and (loginCheck = false) then
381 ReplaceText := '<h1 style=text-align:center>
\8aÇ
\97\9d\90l
\82©
\82ç
\82¨
\92m
\82ç
\82¹
\82ª
\82 \82è
\82Ü
\82·.</h1>'
384 i := FDTable3.FieldByName('count').AsInteger;
385 if 10 * i <= FDTable2.RecordCount then
386 ReplaceText := '<h1>
\82±
\82ê
\88È
\8fã
\93\8a\8de
\82Å
\82«
\82Ü
\82¹
\82ñ.</h1>'
388 ReplaceText := header.Content;
390 else if (TagString = 'css') or (TagString = 'js') then
391 ReplaceText := detail(TagString, TagParams.Values['id'])
392 else if TagString = 'dbnum' then
393 ReplaceText := FDTable1.FieldByName('dbnum').AsString
394 else if TagString = 'database' then
395 ReplaceText := FDTable1.FieldByName('database').AsString;
398 function TWebModule1.isInfo: Boolean;
400 result := FDTable1.FieldByName('dbnum').AsInteger = FDTable3.FieldByName
404 procedure TWebModule1.itemsHTMLTag(Sender: TObject; Tag: TTag;
405 const TagString: string; TagParams: TStrings; var ReplaceText: string);
411 if TagString = 'item' then
413 s := TStringList.Create;
415 s.text := FDTable2.FieldByName('raw').AsString;
416 for i := 0 to s.count - 1 do
417 for j := 0 to ss.count - 1 do
418 if Pos(ss[j], s[i]) > 0 then
420 s[i] := '<p style=background-color:aqua>' + s[i]
422 s[i] := '<p style=background-color:yellow>' + s[i];
425 i := FieldByName('dbnum').AsInteger;
426 j := FieldByName('number').AsInteger;
427 str := Request.QueryFields.Values['db'];
429 t := Format('<a href="%s/jump?db=%d&num=%d">[ %d-%d ]</a>',
430 [Request.ScriptName, i, j, i, j])
432 t := Format('<a href="%s/jump?db=%s&num=%d">[ %d ]</a>',
433 [Request.ScriptName, str, j, j]);
435 ReplaceText := t + s.text;
442 function TWebModule1.loginCheck: Boolean;
444 result := hash(Request.CookieFields.Values['user']) = FDTable3.FieldByName
445 ('password').AsString;
448 procedure TWebModule1.loginHTMLTag(Sender: TObject; Tag: TTag;
449 const TagString: string; TagParams: TStrings; var ReplaceText: string);
453 if TagString = 'pr' then
454 ReplaceText := promotion
455 else if TagString = 'uri' then
456 ReplaceText := Request.ScriptName
457 else if TagString = 'database' then
459 i := StrToIntDef(Request.QueryFields.Values['db'],
460 FDTable3.FieldByName('info').AsInteger);
461 if FDTable1.Locate('dbnum', i) = true then
462 ReplaceText := FDTable1.FieldByName('database').AsString;
466 procedure TWebModule1.masterHTMLTag(Sender: TObject; Tag: TTag;
467 const TagString: string; TagParams: TStrings; var ReplaceText: string);
471 if TagString = 'pr' then
472 ReplaceText := promotion
473 else if TagString = 'uri' then
474 ReplaceText := Request.ScriptName
475 else if TagString = 'request' then
481 ReplaceText := ReplaceText + alert.ContentFromString(alert.Content);
484 if ReplaceText <> '' then
485 ReplaceText := '<table border=1 align=center>' + ReplaceText +
490 function TWebModule1.mente: Boolean;
492 if FDTable3.FieldByName('mente').AsBoolean = true then
496 '<p><br><h1 style=text-align:center>
\82½
\82¾
\82¢
\82Ü
\83\81\83\93\83e
\83i
\83\93\83X
\92\86\82Å
\82·^_^</h1>' +
497 Format('<p style=text-align:center><a href=%s/admin>
\8aÇ
\97\9d\8eÒ
\97p
\83\8d\83O
\83C
\83\93</a>',
498 [Request.ScriptName]);
504 procedure TWebModule1.pages(count: Integer; var page: Integer);
508 max := FDTable3.FieldByName('count').AsInteger;
509 if (page > -1) and (count < max * (page - 1)) then
511 page := (count div max) + 1;
512 if count mod max = 0 then
519 FDTable2.MoveBy(1 - max);
523 FDTable2.MoveBy(max * (page - 1));
527 procedure TWebModule1.mailHTMLTag(Sender: TObject; Tag: TTag;
528 const TagString: string; TagParams: TStrings; var ReplaceText: string);
530 if TagString = 'pr' then
531 ReplaceText := promotion
532 else if TagString = 'uri' then
533 ReplaceText := Request.ScriptName
534 else if TagString = 'content' then
535 ReplaceText := articles.Content
536 else if TagString = 'query' then
537 ReplaceText := '?' + Request.Query
538 else if TagString = 'number' then
539 ReplaceText := Request.QueryFields.Values['num'];
542 function TWebModule1.scan(text: string): string;
545 coll: TMatchCollection;
549 i := Request.QueryFields.Values['db'].ToInteger;
550 s := Request.ScriptName;
551 text := TNetEncoding.HTML.Encode(text);
552 str := TNetEncoding.HTML.Encode('>>');
553 reg := TRegEx.Create(str + '(\d+)');
554 coll := reg.Matches(text);
555 for j := coll.count - 1 downto 0 do
557 Delete(text, coll[j].index, coll[j].Length);
558 t := Copy(coll[j].Value, Length(str) + 1, coll[j].Length);
560 ('<a class=minpreview data-preview-url=%s/link?db=%d&num=%s href=%s/jump?db=%d&num=%s>>>%s</a>',
561 [s, i, t, s, i, t, t]);
562 Insert(result, text, coll[j].index);
567 procedure TWebModule1.searchHTMLTag(Sender: TObject; Tag: TTag;
568 const TagString: string; TagParams: TStrings; var ReplaceText: string);
579 while FDTable2.Eof = false do
581 s.text := FDTable2.FieldByName('raw').AsString;
582 ss.DelimitedText := Request.ContentFields.Values['word1'];
583 for j := 0 to ss.count - 1 do
584 for i := 0 to s.count - 1 do
585 if Pos(ss[j], s[i]) > 0 then
588 ReplaceText := ReplaceText + items.Content;
593 if j = ss.count - 1 then
595 ReplaceText := ReplaceText + items.Content;
601 else if i = s.count - 1 then
609 if TagString = 'pr' then
610 ReplaceText := promotion
611 else if TagString = 'uri' then
612 ReplaceText := Request.ScriptName
613 else if TagString = 'select' then
615 str := Request.QueryFields.Values['db'];
617 ReplaceText := Request.ScriptName + '/'
619 ReplaceText := Request.ScriptName + '/index?db=' + str;
621 else if (Request.MethodType = mtPost) and (TagString = 'items') then
623 if Request.ContentFields.Values['type'] = 'OR' then
627 s := TStringList.Create;
628 ss := TStringList.Create;
631 ss.StrictDelimiter := false;
632 if Request.QueryFields.Values['db'] = '' then
635 while FDTable1.Eof = false do
648 else if TagString = 'query' then
650 ReplaceText := Request.Query;
651 if ReplaceText <> '' then
652 ReplaceText := '?' + ReplaceText;
654 else if TagString = 'css' then
655 ReplaceText := css2.Content
656 else if TagString = 'dbnum' then
657 ReplaceText := Request.QueryFields.Values['dbnum'];
660 procedure TWebModule1.setLastArticle;
665 procedure TWebModule1.strsCheck(var Error: string; list: TStringList);
672 s := TStringList.Create;
674 s.DelimitedText := FDTable3.FieldByName('ng').AsString;
675 for i := 0 to s.count - 1 do
676 for j := 0 to list.count - 1 do
677 if Pos(s[i], list[j]) > 0 then
682 for i := 0 to list.count - 1 do
683 list[i] := '<p>' + scan(list[i]);
688 Error := Error + '<p>
\8bÖ
\8e~
\8cê
\8bå
\82ª
\8aÜ
\82Ü
\82ê
\82Ä
\82¢
\82Ü
\82·.';
691 procedure TWebModule1.tiHTMLTag(Sender: TObject; Tag: TTag;
692 const TagString: string; TagParams: TStrings; var ReplaceText: string);
694 if TagString = 'uri' then
695 ReplaceText := Request.ScriptName
696 else if TagString = 'count' then
697 ReplaceText := FDTable2.RecordCount.ToString
698 else if TagString = 'database' then
699 ReplaceText := FDTable1.FieldByName('database').AsString
700 else if TagString = 'date' then
704 ReplaceText := FieldByName('date').AsString;
708 procedure TWebModule1.titleHTMLTag(Sender: TObject; Tag: TTag;
709 const TagString: string; TagParams: TStrings; var ReplaceText: string);
711 if TagString = 'pr' then
712 ReplaceText := promotion
713 else if TagString = 'uri' then
714 ReplaceText := Request.ScriptName
715 else if TagString = 'js' then
716 ReplaceText := detail(TagString, TagParams.Values['id'])
717 else if TagString = 'main' then
721 while (FDQuery1.Eof = false) and (FDTable1.Eof = false) do
723 if FDTable1.FieldByName('dbnum').AsInteger = FDQuery1.FieldByName('dbnum')
726 ReplaceText := ReplaceText + ti.Content;
729 else if FDTable2.Eof = false then
730 ReplaceText := ReplaceText + ti.Content;
737 procedure TWebModule1.topHTMLTag(Sender: TObject; Tag: TTag;
738 const TagString: string; TagParams: TStrings; var ReplaceText: string);
743 if TagString = 'pr' then
744 ReplaceText := promotion
745 else if TagString = 'uri' then
746 ReplaceText := Request.ScriptName
747 else if TagString = 'list' then
749 i := FDTable3.FieldByName('info').AsInteger;
750 for k := 0 to tcnt do
752 if FDTable1.Eof = true then
755 j := FDTable1.FieldByName('dbnum').AsInteger;
756 s := FDTable1.FieldByName('database').AsString;
757 if (i = j) or (s = 'master') then
763 if (Now - FDTable2.FieldByName('date').AsDateTime < 1) and
764 (FDTable2.RecordCount > 0) then
765 t := 'background-color:aqua;';
766 if FDTable2.RecordCount >= 10 * FDTable3.FieldByName('count').AsInteger
768 t := t + 'color:red;';
771 ReplaceText := ReplaceText +
772 Format('<p><a%s target=_blank href="%s/index?db=%d">%s</a><br></p>',
773 [t, Request.ScriptName, j, s]);
777 else if TagString = 'info' then
778 ReplaceText := FDTable1.Lookup('dbnum', FDTable3.FieldByName('info')
779 .AsInteger, 'database')
780 else if TagString = 'dbnum' then
781 ReplaceText := FDTable3.FieldByName('info').AsString
782 else if (TagString = 'css') or (TagString = 'js') then
783 ReplaceText := detail(TagString, TagParams.Values['id'])
784 else if TagString = 'slide' then
786 for i := 1 to (FDTable1.RecordCount div tcnt) + 1 do
787 ReplaceText := ReplaceText +
788 Format('<div class="slide"><img src="%s/src?name=slide%d.jpg"',
789 [Request.ScriptName, i]) +
790 ' style=float:right;height:465px><#list></div>';
794 procedure TWebModule1.WebModule1admdelAction(Sender: TObject;
795 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
802 FDTable1.Locate('dbnum', Request.QueryFields.Values['db']);
803 for i := 0 to Request.ContentFields.count - 1 do
805 reg := TRegEx.Create('\d+');
806 match := reg.match(Request.ContentFields[i]);
807 if match.Success = true then
809 k := match.Value.ToInteger - j - 1;
810 j := match.Value.ToInteger;
816 WebModule1adminAction(nil, Request, Response, Handled);
819 procedure TWebModule1.WebModule1adminAction(Sender: TObject;
820 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
825 s := Request.CookieFields.Values['user'];
826 if (s = '') or (loginCheck = false) then
828 WebModule1loginAction(nil, Request, Response, Handled);
831 admin.MaxRows := FDTable3.FieldByName('count').AsInteger;
832 t := Request.QueryFields.Values['db'];
834 FDTable1.Locate('dbnum', t, []);
835 s := Request.QueryFields.Values['num'];
836 i := StrToIntDef(s, -1);
837 pages(FDTable2.RecordCount, i);
840 Self.Tag := Integer(@tagstr);
841 admin.header.text := adhead.Content;
844 ('<input type=submit value=
\8dí
\8f\9c\82·
\82é><input type=reset value=
\83\8a\83Z
\83b
\83g></form>');
845 admin.footer.Add(footer.Content);
849 (Format('<p style=text-align:center><a href="%s/index%s">
\96ß
\82é</a>',
850 [Request.ScriptName, t]));
851 Response.ContentType := 'text/html;charset=utf-8';
852 Response.Content := admin.Content;
855 procedure TWebModule1.WebModule1adminsetAction(Sender: TObject;
856 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
860 s := Request.ContentFields.Values['pass'];
864 FieldByName('mente').AsBoolean := Request.ContentFields.Values
869 FieldByName('password').AsString := hash(s);
870 with Response.Cookies.Add do
880 WebModule1adminAction(nil, Request, Response, Handled);
883 procedure TWebModule1.WebModule1alertAction(Sender: TObject;
884 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
886 num1, num2, i: Integer;
889 num1 := Request.QueryFields.Values['db'].ToInteger;
890 num2 := StrToIntDef(Request.QueryFields.Values['num'], -1);
893 if Request.MethodType = mtGet then
895 FDTable1.Locate('dbnum', num1);
896 FDTable2.Locate('number', num2);
897 Response.ContentType := 'text/html;charset=utf-8';
898 Response.Content := mail.Content;
905 i := FieldByName('id').AsInteger + 1;
906 s := Request.ContentFields.Values['request'];
909 AppendRecord([i, num1, num2, Now, s]);
911 Response.SendRedirect(Format('%s/index?db=%d&num=%d#%d',
912 [Request.ScriptName, num1, num2, num2]))
916 procedure TWebModule1.WebModule1deleteAction(Sender: TObject;
917 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
922 s := Request.ContentFields.Values['num'];
926 s := hash(Request.ContentFields.Values['password']);
928 if Locate('number;pass', VarArrayOf([num, s])) = true then
931 FieldByName('title').AsString := '';
932 FieldByName('name').AsString := ' - - - ';
933 FieldByName('comment').AsString := '<em>
\93\8a\8de
\8eÒ
\82É
\82æ
\82è
\8dí
\8f\9c\82³
\82ê
\82Ü
\82µ
\82½.</em>';
934 FieldByName('raw').AsString := '';
935 FieldByName('date').AsDateTime := Now;
937 WebModule1jumpAction(nil, Request, Response, Handled);
940 WebModule1indexpageAction(nil, Request, Response, Handled);
943 procedure TWebModule1.WebModule1fileAction(Sender: TObject;
944 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
948 s := Request.QueryFields.Values['type'];
950 Response.ContentType := 'text/javascript'
951 else if s = 'css' then
952 Response.ContentType := 'text/css';
953 Response.Content := detail(s, Request.QueryFields.Values['id']);
956 procedure TWebModule1.WebModule1helpAction(Sender: TObject;
957 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
962 Response.ContentType := 'text/html;charset=utf-8';
963 if Request.MethodType = mtPost then
965 s := Request.ContentFields.Values['help'];
967 k := FDTable4.FieldByName('id').AsInteger + 1;
968 FDTable4.AppendRecord([k, -1, -1, Now, s]);
973 Response.Content := help.Content;
976 procedure TWebModule1.WebModule1imgAction(Sender: TObject; Request: TWebRequest;
977 Response: TWebResponse; var Handled: Boolean);
984 s := Request.QueryFields.Values['name'];
985 Response.ContentType := 'image/jpeg';
986 if Locate('name', s) = true then
988 res := CreateBlobStream(FieldByName('source'), bmRead);
989 Response.ContentStream := res;
991 else if s = 'sprites.png' then
993 Response.ContentType := 'image/png';
994 res := TResourceStream.Create(HInstance, 'PngImage_1', RT_RCDATA);
995 Response.ContentStream := res;
998 Response.ContentStream := nil;
1002 procedure TWebModule1.WebModule1indexpageAction(Sender: TObject;
1003 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1008 s := Request.QueryFields.Values['db'];
1010 FDTable1.Locate('dbnum', s, []);
1011 i := StrToIntDef(Request.QueryFields.Values['num'], -1);
1013 pages(FDTable2.RecordCount, i);
1016 Self.Tag := Integer(@tagstr);
1017 Response.ContentType := 'text/html; charset="utf-8"';
1018 if mente = false then
1019 Response.Content := index.Content;
1022 procedure TWebModule1.WebModule1jumpAction(Sender: TObject;
1023 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1028 DB := Request.QueryFields.Values['db'];
1029 s := Request.QueryFields.Values['num'];
1031 s := Request.ContentFields.Values['num'];
1033 pages(s.ToInteger, i);
1034 Response.SendRedirect(Format('%s/index?db=%s&num=%d#%s', [Request.ScriptName,
1038 procedure TWebModule1.WebModule1linkAction(Sender: TObject;
1039 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1043 s := Request.QueryFields.Values['db'];
1044 if (s = '') or (FDTable1.Locate('dbnum', s.ToInteger) = false) then
1046 s := Request.QueryFields.Values['num'];
1047 if (s <> '') and (FDTable2.Locate('number', s.ToInteger) = true) then
1049 Response.ContentType := 'text/html;charset=utf-8';
1050 Response.Content := articles.Content;
1054 procedure TWebModule1.WebModule1loginAction(Sender: TObject;
1055 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1061 if Request.MethodType = mtGet then
1063 Response.ContentType := 'text/html;charset=utf-8';
1064 Response.Content := login.Content;
1067 s := Request.ContentFields.Values['record'];
1068 v := FDTable1.Lookup('database', s, 'dbnum');
1069 t := hash(Request.ContentFields.Values['password']);
1070 if (VarIsNull(v) = false) and (hash(t) = FDTable3.FieldByName('password')
1073 with Response.Cookies.Add do
1077 Expires := Now + 14;
1081 if s = 'master' then
1082 Response.SendRedirect(Request.ScriptName + '/master')
1084 Response.SendRedirect(Request.ScriptName + '/admin?db=' + i.ToString);
1086 else if VarIsNull(v) = false then
1089 Response.SendRedirect(Request.ScriptName + '/login?db=' + t);
1092 Response.SendRedirect(Request.ScriptName + '/login');
1095 procedure TWebModule1.WebModule1logoutAction(Sender: TObject;
1096 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1102 with Response.Cookies.Add do
1107 s := Request.QueryFields.Values['db'];
1108 i := StrToIntDef(s, -1);
1109 x := FDTable1.Locate('dbnum', i);
1110 if (x = true) and (FDTable1.FieldByName('database').AsString = 'master') then
1113 Response.SendRedirect(Request.ScriptName + '/')
1115 Response.SendRedirect(Request.ScriptName + '/index?db=' + s);
1118 procedure TWebModule1.WebModule1masterAction(Sender: TObject;
1119 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1124 if loginCheck = false then
1126 Request.QueryFields.Values['db'] := FDTable1.Lookup('database',
1128 WebModule1loginAction(nil, Request, Response, Handled);
1131 if Request.MethodType = mtPost then
1133 s := Request.ContentFields.Values['delete'];
1138 until (Bof = true) and (Eof = true)
1142 while FDTable4.Eof = false do
1144 i := FDTable4.FieldByName('dbname').AsInteger;
1145 if FDTable1.Locate('dbnum', i) = true then
1147 i := FDTable4.FieldByName('posnum').AsInteger;
1148 if FDTable2.Locate('number', i) = false then
1158 Response.ContentType := 'text/html;charset=utf-8';
1159 Response.Content := master.Content;
1162 procedure TWebModule1.WebModule1registAction(Sender: TObject;
1163 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1166 title, na, raw, pass, kotoba, Error, temp: string;
1167 comment: TStringList;
1171 temp := Request.ContentFields.Values['preview'];
1174 kotoba := Request.ContentFields.Values['aikotoba'];
1175 if kotoba <> '
\82°
\82ñ
\82«' then
1176 Error := Error + '<p>
\8d\87\8c¾
\97t
\82ª
\82¿
\82ª
\82¢
\82Ü
\82·.';
1177 with Request.ContentFields do
1179 title := Values['title'];
1180 na := Values['name'];
1181 raw := Values['comment'];
1182 Values['comment'] := '';
1183 pass := hash(Values['password']);
1186 title := '
\83^
\83C
\83g
\83\8b\82È
\82µ.';
1187 with Response.Cookies.Add do
1191 Value := '
\92N
\82©
\82³
\82ñ.'
1194 Expires := Now + 14;
1197 with Response.Cookies.Add do
1201 Expires := Now + 14;
1203 comment := TStringList.Create;
1205 comment.text := raw;
1206 strsCheck(Error, comment);
1207 temp := comment.text;
1215 Request.ContentFields.Values['raw'] := raw;
1217 Request.ContentFields.Values['preview'] := '<section style=color:red>' +
1218 Error + '</section>'
1219 else if Request.ContentFields.Values['show'] = 'true' then
1221 if review = false then
1222 Error := '<p style=font-size:2.3em;color:blue>
\81«
\81«
\83v
\83\8c\83r
\83\85\81[
\81«
\81«<p>' + temp
1225 Request.ContentFields.Values['preview'] := Error;
1226 Request.ContentFields.Values['show'] := 'false';
1230 i := StrToIntDef(Request.QueryFields.Values['db'], -1);
1231 if FDTable1.Locate('dbnum', i) = false then
1232 Response.SendRedirect(Request.ScriptName + '/')
1236 number := FDTable2.FieldByName('number').AsInteger + 1;
1237 FDTable2.AppendRecord([i, number, title, na, temp, raw, Now, pass]);
1238 Response.SendRedirect(Request.ScriptName + '/index?db=' + i.ToString +
1243 WebModule1indexpageAction(nil, Request, Response, Handled);
1246 procedure TWebModule1.WebModule1searchAction(Sender: TObject;
1247 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1249 Response.ContentType := 'text/html;charset=utf-8';
1250 Response.Content := search.Content;
1253 procedure TWebModule1.WebModule1titleAction(Sender: TObject;
1254 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1256 Response.ContentType := 'text/html;charset=utf-8';
1257 Response.Content := title.Content;
1260 procedure TWebModule1.WebModule1topAction(Sender: TObject; Request: TWebRequest;
1261 Response: TWebResponse; var Handled: Boolean);
1263 Response.ContentType := 'text/html;charset=utf-8';
1265 if mente = false then
1266 Response.Content := top.ContentFromString(top.Content);
1269 procedure TWebModule1.WebModule1usrdelAction(Sender: TObject;
1270 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1274 s := Request.QueryFields.Values['db'];
1275 t := Request.ContentFields.Values['num'];
1276 p := Request.ContentFields.Values['password'];
1277 if FDTable2.Locate('dbnum;number;pass',
1278 VarArrayOf([s.ToInteger, t.ToInteger, p])) = true then
1280 WebModule1indexpageAction(nil, Request, Response, Handled);
1283 procedure TWebModule1.WebModuleCreate(Sender: TObject);
1288 if FDTable1.Exists = false then
1289 FDTable1.CreateTable;
1290 if FDTable2.Exists = false then
1291 FDTable2.CreateTable;
1292 if FDTable3.Exists = false then
1293 FDTable3.CreateTable;
1294 if FDTable4.Exists = false then
1295 FDTable4.CreateTable;
1296 if FDTable5.Exists = false then
1297 FDTable5.CreateTable;
1307 if (FDTable1.Bof = true) and (FDTable1.Eof = true) then
1309 FDTable1.AppendRecord([0, 'info']);
1310 FDTable1.AppendRecord([1, 'master']);
1312 FDTable1.AppendRecord([i + 1, '
\8cf
\8e¦
\94Â' + i.ToString]);
1314 if (FDTable3.Bof = true) and (FDTable3.Eof = true) then
1316 i := FDTable1.Lookup('database', 'info', 'dbnum');
1317 s := '
\88¢
\95Û,
\94n
\8e,
\8e\80\82Ë';
1318 FDTable3.AppendRecord
1319 (['
\82Æ
\82é
\82Ë
\81`
\82Ç
\8d\86',
1320 '<h1 style=color:maron;text-align:center;font-style:italic>
\82Æ
\82é
\82Ë
\81`
\82Ç
\8d\86</h1>',
1321 false, i, 30, hash(hash('admin')), s]);