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;
13 TWebModule1 = class(TWebModule)
14 articles: TDataSetPageProducer;
15 index: TDataSetPageProducer;
16 admin: TDataSetTableProducer;
17 search: TPageProducer;
18 items: TDataSetPageProducer;
21 master: TPageProducer;
22 alert: TDataSetPageProducer;
23 footer: TDataSetPageProducer;
29 header: TDataSetPageProducer;
30 login: TDataSetPageProducer;
35 adhead: TPageProducer;
38 ti: TDataSetPageProducer;
39 procedure indexHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
40 TagParams: TStrings; var ReplaceText: string);
41 procedure WebModule1indexpageAction(Sender: TObject; Request: TWebRequest;
42 Response: TWebResponse; var Handled: Boolean);
43 procedure WebModule1registAction(Sender: TObject; Request: TWebRequest;
44 Response: TWebResponse; var Handled: Boolean);
45 procedure WebModuleCreate(Sender: TObject);
46 procedure WebModule1adminAction(Sender: TObject; Request: TWebRequest;
47 Response: TWebResponse; var Handled: Boolean);
48 procedure WebModule1topAction(Sender: TObject; Request: TWebRequest;
49 Response: TWebResponse; var Handled: Boolean);
50 procedure itemsHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
51 TagParams: TStrings; var ReplaceText: string);
52 procedure topHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
53 TagParams: TStrings; var ReplaceText: string);
54 procedure WebModule1searchAction(Sender: TObject; Request: TWebRequest;
55 Response: TWebResponse; var Handled: Boolean);
56 procedure WebModule1helpAction(Sender: TObject; Request: TWebRequest;
57 Response: TWebResponse; var Handled: Boolean);
58 procedure searchHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
59 TagParams: TStrings; var ReplaceText: string);
60 procedure masterHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
61 TagParams: TStrings; var ReplaceText: string);
62 procedure articlesHTMLTag(Sender: TObject; Tag: TTag;
63 const TagString: string; TagParams: TStrings; var ReplaceText: string);
64 procedure footerHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
65 TagParams: TStrings; var ReplaceText: string);
66 procedure WebModule1alertAction(Sender: TObject; Request: TWebRequest;
67 Response: TWebResponse; var Handled: Boolean);
68 procedure WebModule1masterAction(Sender: TObject; Request: TWebRequest;
69 Response: TWebResponse; var Handled: Boolean);
70 procedure mailHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
71 TagParams: TStrings; var ReplaceText: string);
72 procedure alertHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
73 TagParams: TStrings; var ReplaceText: string);
74 procedure WebModule1deleteAction(Sender: TObject; Request: TWebRequest;
75 Response: TWebResponse; var Handled: Boolean);
76 procedure WebModule1jumpAction(Sender: TObject; Request: TWebRequest;
77 Response: TWebResponse; var Handled: Boolean);
78 procedure WebModule1linkAction(Sender: TObject; Request: TWebRequest;
79 Response: TWebResponse; var Handled: Boolean);
80 procedure headerHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
81 TagParams: TStrings; var ReplaceText: string);
82 procedure adminFormatCell(Sender: TObject; CellRow, CellColumn: Integer;
83 var BgColor: THTMLBgColor; var Align: THTMLAlign; var VAlign: THTMLVAlign;
84 var CustomAttrs, CellData: string);
85 procedure WebModule1admdelAction(Sender: TObject; Request: TWebRequest;
86 Response: TWebResponse; var Handled: Boolean);
87 procedure WebModule1loginAction(Sender: TObject; Request: TWebRequest;
88 Response: TWebResponse; var Handled: Boolean);
89 procedure WebModule1adminsetAction(Sender: TObject; Request: TWebRequest;
90 Response: TWebResponse; var Handled: Boolean);
91 procedure adheadHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
92 TagParams: TStrings; var ReplaceText: string);
93 procedure WebModule1logoutAction(Sender: TObject; Request: TWebRequest;
94 Response: TWebResponse; var Handled: Boolean);
95 procedure WebModule1imgAction(Sender: TObject; Request: TWebRequest;
96 Response: TWebResponse; var Handled: Boolean);
97 procedure WebModule1fileAction(Sender: TObject; Request: TWebRequest;
98 Response: TWebResponse; var Handled: Boolean);
99 procedure titleHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
100 TagParams: TStrings; var ReplaceText: string);
101 procedure WebModule1titleAction(Sender: TObject; Request: TWebRequest;
102 Response: TWebResponse; var Handled: Boolean);
103 procedure tiHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
104 TagParams: TStrings; var ReplaceText: string);
105 procedure helpHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
106 TagParams: TStrings; var ReplaceText: string);
107 procedure loginHTMLTag(Sender: TObject; Tag: TTag; const TagString: string;
108 TagParams: TStrings; var ReplaceText: string);
113 procedure pages(count: Integer; var page: Integer);
114 procedure strsCheck(var Error: string; var list: TStringList);
115 procedure setLastArticle;
116 function isInfo: Boolean;
117 function loginCheck: Boolean;
118 function hash(str: string): string;
119 function mente: Boolean;
120 function detail(ts, pid: string): string;
126 WebModuleClass: TComponentClass = TWebModule1;
130 { %CLASSGROUP 'Vcl.Controls.TControl' }
132 uses Unit1, IdHashSHA, IdGlobal, IdHash, IdHashMessageDigest;
137 promotion = '
\8dL
\8d\90:';
140 procedure TWebModule1.adheadHTMLTag(Sender: TObject; Tag: TTag;
141 const TagString: string; TagParams: TStrings; var ReplaceText: string);
143 if TagString = 'pr' then
144 ReplaceText := promotion
145 else if (TagString = 'mente') and
146 (DataModule1.FDTable3.FieldByName('mente').AsBoolean = true) then
147 ReplaceText := 'checked'
148 else if TagString = 'database' then
149 ReplaceText := Request.QueryFields.Values['db'];
152 procedure TWebModule1.adminFormatCell(Sender: TObject;
153 CellRow, CellColumn: Integer; var BgColor: THTMLBgColor;
154 var Align: THTMLAlign; var VAlign: THTMLVAlign;
155 var CustomAttrs, CellData: string);
157 if (CellColumn = 0) and (CellRow > 0) then
158 CellData := Format('<input name=check%d type=checkbox>', [CellRow]);
161 procedure TWebModule1.alertHTMLTag(Sender: TObject; Tag: TTag;
162 const TagString: string; TagParams: TStrings; var ReplaceText: string);
167 if (TagString = 'plus') and (alert.Tag = 0) then
169 '<a href=/jump?db=<#dbname>&num=<#posnum>>[ <#dbname>-<#posnum> ]</a>'
170 else if TagString = 'article' then
173 if (FDTable1.Locate('dbnum', FDTable4.FieldByName('dbname').AsInteger)
174 = false) or (FDTable2.Locate('number', FDTable4.FieldByName('posnum')
175 .AsInteger) = false) then
177 ReplaceText := '<p>
\83\8a\83N
\83G
\83X
\83g';
180 s := TStringList.Create;
182 s.Text := articles.Content;
185 for i := s.count - 1 downto 0 do
186 if Copy(s[i], 1, 18) = '<section id=master' then
191 ReplaceText := s.Text;
196 else if TagString = 'request' then
197 ReplaceText := DataModule1.FDTable4.FieldByName('request').AsString;
200 procedure TWebModule1.articlesHTMLTag(Sender: TObject; Tag: TTag;
201 const TagString: string; TagParams: TStrings; var ReplaceText: string);
203 if TagString = 'comment' then
204 ReplaceText := DataModule1.FDTable2.FieldByName('comment').AsString;
207 function TWebModule1.detail(ts, pid: string): string;
211 for i := 0 to ComponentCount - 1 do
212 if Components[i].Name = ts + pid then
213 result := (Components[i] as TPageProducer).Content;
216 procedure TWebModule1.footerHTMLTag(Sender: TObject; Tag: TTag;
217 const TagString: string; TagParams: TStrings; var ReplaceText: string);
221 if TagString = 'link' then
224 if i = index.Tag then
225 ReplaceText := ReplaceText + ' ' + i.ToString + ' '
227 ReplaceText := ReplaceText +
228 Format(' <a style=text-decoration-line:none href="%s?db=%d&num=%d">%d</a> ',
229 [PString(Self.Tag)^, DataModule1.FDTable1.FieldByName('dbnum')
232 else if TagString = 'recent' then
233 if index.Tag = -1 then
234 ReplaceText := TagString
236 ReplaceText := '<a style=text-decoration-line:none href="' +
237 PString(Self.Tag)^ + '?db=' + DataModule1.FDTable1.FieldByName('dbnum')
238 .AsString + '">recent</a>';
241 function TWebModule1.hash(str: string): string;
243 with TIdHashSHA1.Create do
246 result := HashStringAsHex(str);
253 procedure TWebModule1.headerHTMLTag(Sender: TObject; Tag: TTag;
254 const TagString: string; TagParams: TStrings; var ReplaceText: string);
258 if TagString = 'cookie' then
260 s := TagParams.Values['param'];
261 ReplaceText := TNetEncoding.URL.Decode(Request.CookieFields.Values[s]);
263 else if (TagString = 'check') and
264 (Request.ContentFields.Values['show'] <> 'false') then
265 ReplaceText := 'checked'
266 else if TagString = 'preview' then
267 ReplaceText := Request.ContentFields.Values['preview']
268 else if TagString = 'raw' then
269 ReplaceText := Request.ContentFields.Values['raw']
270 else if TagString = 'pass' then
271 ReplaceText := Request.ContentFields.Values['password']
272 else if TagString = 'title' then
273 ReplaceText := Request.ContentFields.Values['title'];
276 procedure TWebModule1.helpHTMLTag(Sender: TObject; Tag: TTag;
277 const TagString: string; TagParams: TStrings; var ReplaceText: string);
279 if TagString = 'pr' then
280 ReplaceText := promotion
281 else if TagString = 'area' then
284 ss := TStringList.Create;
286 ss.Add('<form action=/help method=post><p>
\82¨
\96â
\82¢
\8d\87\82í
\82¹<
\8dí
\8f\9c\88Ë
\97\8a\82È
\82Ç
\89½
\82Å
\82à></p>');
287 ss.Add('<textarea name=help style=height:100px;width:250px>
\93\8a\8de
\8eÒ
\96¼
\82È
\82Ç
\81F');
288 ss.Add('
\91\8a\92k
\93à
\97e
\81F');
289 ss.Add('
\82»
\82Ì
\91¼
\81F</textarea><br>');
290 ss.Add('<input type=submit value="
\91\97\90M"></form>');
291 ReplaceText := ss.Text;
298 '<p style=color:yellow;background-color:aqua>
\82²
\95ñ
\8d\90\82 \82è
\82ª
\82Æ
\82¤
\82²
\82´
\82¢
\82Ü
\82·.';
301 procedure TWebModule1.indexHTMLTag(Sender: TObject; Tag: TTag;
302 const TagString: string; TagParams: TStrings; var ReplaceText: string);
306 if TagString = 'pr' then
307 ReplaceText := promotion
308 else if TagString = 'article' then
310 for i := 1 to DataModule1.FDTable3.FieldByName('count').AsInteger do
312 if DataModule1.FDTable2.Eof = true then
314 if isInfo = false then
315 ReplaceText := ReplaceText + articles.Content
317 ReplaceText := articles.Content + ReplaceText;
318 DataModule1.FDTable2.Next;
321 else if TagString = 'footer' then
322 ReplaceText := footer.Content
323 else if TagString = 'header' then
324 if (DataModule1.FDTable1.FieldByName('dbnum')
325 .AsInteger = DataModule1.FDTable3.FieldByName('info').AsInteger) and
326 (loginCheck = false) then
327 ReplaceText := '<h1 style=text-align:center>
\8aÇ
\97\9d\90l
\82©
\82ç
\82¨
\92m
\82ç
\82¹
\82ª
\82 \82è
\82Ü
\82·.</h1>'
330 i := DataModule1.FDTable3.FieldByName('count').AsInteger;
331 if 10 * i <= DataModule1.FDTable2.RecordCount then
332 ReplaceText := '<h1>
\82±
\82ê
\88È
\8fã
\93\8a\8de
\82Å
\82«
\82Ü
\82¹
\82ñ.</h1>'
334 ReplaceText := header.Content;
336 else if (TagString = 'css') or (TagString = 'js') then
337 ReplaceText := detail(TagString, TagParams.Values['id'])
338 else if TagString = 'dbnum' then
339 ReplaceText := DataModule1.FDTable1.FieldByName('dbnum').AsString
340 else if TagString = 'database' then
341 ReplaceText := DataModule1.FDTable1.FieldByName('database').AsString;
344 function TWebModule1.isInfo: Boolean;
346 result := DataModule1.FDTable1.FieldByName('dbnum')
347 .AsInteger = DataModule1.FDTable3.FieldByName('info').AsInteger;
350 procedure TWebModule1.itemsHTMLTag(Sender: TObject; Tag: TTag;
351 const TagString: string; TagParams: TStrings; var ReplaceText: string);
357 if TagString = 'item' then
359 s := TStringList.Create;
361 s.Text := DataModule1.FDTable2.FieldByName('raw').AsString;
362 for i := 0 to s.count - 1 do
363 for j := 0 to ss.count - 1 do
364 if Pos(ss[j], s[i]) > 0 then
366 s[i] := '<p style=background-color:aqua>' + s[i]
368 s[i] := '<p style=background-color:yellow>' + s[i];
369 with DataModule1.FDTable2 do
371 i := FieldByName('dbnum').AsInteger;
372 j := FieldByName('number').AsInteger;
373 str := Request.QueryFields.Values['db'];
375 t := Format('<a href="/jump?db=%d&num=%d">[ %d-%d ]</a>',
378 t := Format('<a href="/jump?db=%s&num=%d">[ %d ]</a>', [str, j, j]);
380 ReplaceText := t + s.Text;
387 function TWebModule1.loginCheck: Boolean;
389 result := hash(Request.CookieFields.Values['user'])
390 = DataModule1.FDTable3.FieldByName('password').AsString;
393 procedure TWebModule1.loginHTMLTag(Sender: TObject; Tag: TTag;
394 const TagString: string; TagParams: TStrings; var ReplaceText: string);
396 if TagString = 'pr' then
397 ReplaceText := promotion;
400 procedure TWebModule1.masterHTMLTag(Sender: TObject; Tag: TTag;
401 const TagString: string; TagParams: TStrings; var ReplaceText: string);
403 if TagString = 'pr' then
404 ReplaceText := promotion
405 else if TagString = 'request' then
406 with DataModule1.FDTable4 do
409 ReplaceText := '<table border=1 align=center>';
412 if FieldByName('posnum').AsInteger = -1 then
416 ReplaceText := ReplaceText + alert.ContentFromString(alert.Content);
419 ReplaceText := ReplaceText + '</table>';
423 function TWebModule1.mente: Boolean;
425 if DataModule1.FDTable3.FieldByName('mente').AsBoolean = true then
429 '<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>' +
430 '<p style=text-align:center><a href=/admin>
\8aÇ
\97\9d\8eÒ
\97p
\83\8d\83O
\83C
\83\93</a>'
436 procedure TWebModule1.pages(count: Integer; var page: Integer);
440 max := DataModule1.FDTable3.FieldByName('count').AsInteger;
441 if (page > -1) and (count < max * (page - 1)) then
443 page := (count div max) + 1;
444 if count mod max = 0 then
450 DataModule1.FDTable2.Last;
451 DataModule1.FDTable2.MoveBy(1 - max);
454 DataModule1.FDTable2.First;
455 DataModule1.FDTable2.MoveBy(max * (page - 1));
459 procedure TWebModule1.mailHTMLTag(Sender: TObject; Tag: TTag;
460 const TagString: string; TagParams: TStrings; var ReplaceText: string);
462 if TagString = 'pr' then
463 ReplaceText := promotion
464 else if TagString = 'content' then
465 ReplaceText := articles.Content
466 else if TagString = 'query' then
467 ReplaceText := '?' + Request.Query
468 else if TagString = 'number' then
469 ReplaceText := Request.QueryFields.Values['num'];
472 procedure TWebModule1.searchHTMLTag(Sender: TObject; Tag: TTag;
473 const TagString: string; TagParams: TStrings; var ReplaceText: string);
482 DataModule1.FDTable2.First;
483 while DataModule1.FDTable2.Eof = false do
485 s.Text := DataModule1.FDTable2.FieldByName('raw').AsString;
486 ss.DelimitedText := Request.ContentFields.Values['word1'];
487 for j := 0 to ss.count - 1 do
488 for i := 0 to s.count - 1 do
489 if Pos(ss[j], s[i]) > 0 then
492 ReplaceText := ReplaceText + items.Content;
497 if j = ss.count - 1 then
499 ReplaceText := ReplaceText + items.Content;
505 else if i = s.count - 1 then
508 DataModule1.FDTable2.Next;
513 if TagString = 'pr' then
514 ReplaceText := promotion
515 else if (Request.MethodType = mtPost) and (TagString = 'items') then
517 if Request.ContentFields.Values['type'] = 'OR' then
521 s := TStringList.Create;
522 ss := TStringList.Create;
525 ss.StrictDelimiter := false;
526 if Request.QueryFields.Values['db'] = '' then
528 DataModule1.FDTable1.First;
529 while DataModule1.FDTable1.Eof = false do
532 DataModule1.FDTable1.Next;
542 else if TagString = 'query' then
544 ReplaceText := Request.Query;
545 if ReplaceText <> '' then
546 ReplaceText := '?' + ReplaceText;
548 else if TagString = 'css' then
549 ReplaceText := css2.Content
550 else if TagString = 'dbnum' then
551 Replacetext := Request.QueryFields.Values['dbnum'];
554 procedure TWebModule1.setLastArticle;
556 DataModule1.FDTable2.Last;
559 procedure TWebModule1.strsCheck(var Error: string; var list: TStringList);
566 s := TStringList.Create;
568 s.DelimitedText := DataModule1.FDTable3.FieldByName('ng').AsString;
569 for i := 0 to s.count - 1 do
570 for j := 0 to list.count - 1 do
572 if Pos(s[i], list[j]) > 0 then
574 list[j] := '<p>' + list[j];
580 Error := Error + '<p>
\8bÖ
\8e~
\8cê
\8bå
\82ª
\8aÜ
\82Ü
\82ê
\82Ä
\82¢
\82Ü
\82·.';
583 procedure TWebModule1.tiHTMLTag(Sender: TObject; Tag: TTag;
584 const TagString: string; TagParams: TStrings; var ReplaceText: string);
586 if TagString = 'count' then
587 ReplaceText := DataModule1.FDTable2.RecordCount.ToString
588 else if TagString = 'database' then
589 ReplaceText := DataModule1.FDTable1.FieldByName('database').AsString
590 else if TagString = 'date' then
591 with DataModule1.FDTable2 do
594 ReplaceText := FieldByName('date').AsString;
598 procedure TWebModule1.titleHTMLTag(Sender: TObject; Tag: TTag;
599 const TagString: string; TagParams: TStrings; var ReplaceText: string);
601 if TagString = 'pr' then
602 ReplaceText := promotion
603 else if TagString = 'js' then
604 ReplaceText := detail(TagString, TagParams.Values['id'])
605 else if TagString = 'main' then
610 while (FDQuery1.Eof = false)and(FDTable1.Eof = false) do
612 if FDTable1.FieldByName('dbnum').AsInteger = FDQuery1.FieldByName
613 ('dbnum').AsInteger then
615 ReplaceText := ReplaceText + ti.Content;
618 else if FDTable2.Eof = false then
622 ReplaceText := ReplaceText + ti.Content;
624 ti.DataSet := FDQuery1;
633 procedure TWebModule1.topHTMLTag(Sender: TObject; Tag: TTag;
634 const TagString: string; TagParams: TStrings; var ReplaceText: string);
639 if TagString = 'pr' then
640 ReplaceText := promotion
641 else if TagString = 'list' then
643 i := DataModule1.FDTable3.FieldByName('info').AsInteger;
644 for k := 0 to tcnt do
646 if DataModule1.FDTable1.Eof = true then
649 j := DataModule1.FDTable1.FieldByName('dbnum').AsInteger;
650 s := DataModule1.FDTable1.FieldByName('database').AsString;
651 if (i = j) or (s = 'master') then
653 DataModule1.FDTable1.Next;
656 DataModule1.FDTable2.Last;
657 if (Now - DataModule1.FDTable2.FieldByName('date').AsDateTime < 1) and
658 (DataModule1.FDTable2.RecordCount > 0) then
659 t := 'background-color:aqua;';
660 if DataModule1.FDTable2.RecordCount >= 10 *
661 DataModule1.FDTable3.FieldByName('count').AsInteger then
662 t := t + 'color:red;';
665 ReplaceText := ReplaceText +
666 Format('<p><a%s target=_blank href="/index?db=%d">%s</a><br></p>',
668 DataModule1.FDTable1.Next;
671 else if TagString = 'info' then
672 ReplaceText := DataModule1.FDTable1.Lookup('dbnum',
673 DataModule1.FDTable3.FieldByName('info').AsInteger, 'database')
674 else if TagString = 'dbnum' then
675 ReplaceText := DataModule1.FDTable3.FieldByName('info').AsString
676 else if (TagString = 'css') or (TagString = 'js') then
677 ReplaceText := detail(TagString, TagParams.Values['id'])
678 else if TagString = 'slide' then
680 for i := 1 to (DataModule1.FDTable1.RecordCount div tcnt) + 1 do
681 ReplaceText := ReplaceText +
682 '<div class="slide"><img src="/src?name=slide' + i.ToString +
683 '.jpg" style=float:right;height:465px><#list></div>';
687 procedure TWebModule1.WebModule1admdelAction(Sender: TObject;
688 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
695 DataModule1.FDTable2.RecNo := admin.Tag;
696 for i := 0 to Request.ContentFields.count - 1 do
698 reg := TRegEx.Create('\d+');
699 match := reg.match(Request.ContentFields[i]);
700 if match.Success = true then
702 k := match.Value.ToInteger - j - 1;
703 j := match.Value.ToInteger;
705 DataModule1.FDTable2.Next;
706 DataModule1.FDTable2.Delete;
709 WebModule1adminAction(nil, Request, Response, Handled);
712 procedure TWebModule1.WebModule1adminAction(Sender: TObject;
713 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
718 s := Request.CookieFields.Values['user'];
719 if (s = '') or (loginCheck = false) then
721 WebModule1loginAction(nil, Request, Response, Handled);
724 admin.MaxRows := DataModule1.FDTable3.FieldByName('count').AsInteger;
725 t := Request.QueryFields.Values['db'];
727 DataModule1.FDTable1.Locate('dbnum', t, []);
728 s := Request.QueryFields.Values['num'];
729 i := StrToIntDef(s, -1);
730 pages(DataModule1.FDTable2.RecordCount, i);
733 Self.Tag := Integer(@tagstr);
734 admin.header.Text := adhead.Content;
737 ('<input type=submit value=
\8dí
\8f\9c\82·
\82é><input type=reset value=
\83\8a\83Z
\83b
\83g></form>');
738 admin.footer.Add(footer.Content);
741 admin.footer.Add('<p style=text-align:center><a href="/index' + t +
743 admin.Tag := DataModule1.FDTable2.RecNo;
744 Response.ContentType := 'text/html;charset=utf-8';
745 Response.Content := admin.Content;
748 procedure TWebModule1.WebModule1adminsetAction(Sender: TObject;
749 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
753 s := Request.ContentFields.Values['pass'];
754 with DataModule1.FDTable3 do
757 FieldByName('mente').AsBoolean := Request.ContentFields.Values
762 FieldByName('password').AsString := hash(s);
763 with Response.Cookies.Add do
773 WebModule1adminAction(nil, Request, Response, Handled);
776 procedure TWebModule1.WebModule1alertAction(Sender: TObject;
777 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
779 num1, num2, i: Integer;
782 num1 := DataModule1.FDTable1.FieldByName('dbnum').AsInteger;
783 num2 := StrToIntDef(Request.QueryFields.Values['num'], -1);
786 if Request.MethodType = mtGet then
788 DataModule1.FDTable2.Locate('number', num2, []);
789 Response.ContentType := 'text/html;charset=utf-8';
790 Response.Content := mail.Content;
794 with DataModule1.FDTable4 do
797 i := FieldByName('id').AsInteger + 1;
798 s := Request.ContentFields.Values['request'];
801 AppendRecord([i, num1, num2, Now, s]);
804 Response.SendRedirect(Format('/index?db=%d&num=%d#%d',
807 Response.SendRedirect('/top');
811 procedure TWebModule1.WebModule1deleteAction(Sender: TObject;
812 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
817 s := Request.ContentFields.Values['num'];
821 s := hash(Request.ContentFields.Values['password']);
822 with DataModule1.FDTable2 do
823 if Locate('number;pass', VarArrayOf([num, s])) = true then
826 FieldByName('title').AsString := '';
827 FieldByName('name').AsString := ' - - - ';
828 FieldByName('comment').AsString := '<em>
\93\8a\8de
\8eÒ
\82É
\82æ
\82è
\8dí
\8f\9c\82³
\82ê
\82Ü
\82µ
\82½.</em>';
829 FieldByName('raw').AsString := '';
830 FieldByName('date').AsDateTime := Now;
832 WebModule1jumpAction(nil, Request, Response, Handled);
835 WebModule1indexpageAction(nil, Request, Response, Handled);
838 procedure TWebModule1.WebModule1fileAction(Sender: TObject;
839 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
843 s := Request.QueryFields.Values['type'];
845 Response.ContentType := 'text/javascript'
846 else if s = 'css' then
847 Response.ContentType := 'text/css';
848 Response.Content := detail(s, Request.QueryFields.Values['id']);
851 procedure TWebModule1.WebModule1helpAction(Sender: TObject;
852 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
857 Response.ContentType := 'text/html;charset=utf-8';
858 if Request.MethodType = mtPost then
860 s := Request.ContentFields.Values['help'];
861 DataModule1.FDTable4.Last;
862 k := DataModule1.FDTable4.FieldByName('id').AsInteger + 1;
863 DataModule1.FDTable4.AppendRecord([k, -1, -1, Now, s]);
868 Response.Content := help.Content;
871 procedure TWebModule1.WebModule1imgAction(Sender: TObject; Request: TWebRequest;
872 Response: TWebResponse; var Handled: Boolean);
875 res: TResourceStream;
877 with DataModule1.FDTable5 do
879 s := Request.ContentFields.Values['name'];
880 Response.ContentType := 'image/jpeg';
881 if Locate('name', s) = true then
882 Response.ContentStream := CreateBlobStream(FieldByName('source'), bmRead)
883 else if s = 'sprites.png' then
885 Response.ContentType := 'image/png';
886 res := TResourceStream.Create(HInstance, 'PngImage_1', RT_RCDATA);
887 Response.ContentStream := res;
890 Response.ContentStream := nil;
894 procedure TWebModule1.WebModule1indexpageAction(Sender: TObject;
895 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
900 s := Request.QueryFields.Values['db'];
902 DataModule1.FDTable1.Locate('dbnum', s, []);
903 i := StrToIntDef(Request.QueryFields.Values['num'], -1);
905 pages(DataModule1.FDTable2.RecordCount, i);
908 Self.Tag := Integer(@tagstr);
909 Response.ContentType := 'text/html; charset="utf-8"';
910 if mente = false then
911 Response.Content := index.Content;
914 procedure TWebModule1.WebModule1jumpAction(Sender: TObject;
915 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
920 DB := Request.QueryFields.Values['db'];
921 s := Request.ContentFields.Values['num'];
923 DataModule1.FDTable1.Locate('dbnum', DB.ToInteger, []);
924 DataModule1.FDTable2.Locate('number', s.ToInteger, []);
926 pages(DataModule1.FDTable2.RecNo, page);
927 Response.SendRedirect(Format('/index?db=%s&num=%d#%s', [DB, page, s]));
930 procedure TWebModule1.WebModule1linkAction(Sender: TObject;
931 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
936 s := Request.QueryFields.Values['num'];
940 if DataModule1.FDTable2.Locate('number', num, []) = true then
942 Response.ContentType := 'text/html;charset=utf-8';
943 Response.Content := articles.Content;
947 procedure TWebModule1.WebModule1loginAction(Sender: TObject;
948 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
954 if Request.MethodType = mtGet then
956 Response.ContentType := 'text/html;charset=utf-8';
957 Response.Content := login.Content;
960 s := Request.ContentFields.Values['record'];
961 v := DataModule1.FDTable1.Lookup('database', s, 'dbnum');
962 if VarIsNull(v) = false then
964 with Response.Cookies.Add do
967 Value := hash(Request.ContentFields.Values['password']);
973 Response.SendRedirect('/master')
975 Response.SendRedirect('/admin?db=' + i.ToString);
979 Response.ContentType := 'text/html;charset=utf-8';
980 Response.Content := login.Content;
984 procedure TWebModule1.WebModule1logoutAction(Sender: TObject;
985 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
991 with Response.Cookies.Add do
996 s := Request.QueryFields.Values['db'];
997 i := StrToIntDef(s, -1);
998 x := DataModule1.FDTable1.Locate('dbnum', i);
999 if (x = true) and (DataModule1.FDTable1.FieldByName('database')
1000 .AsString = 'master') then
1003 Response.SendRedirect('/')
1005 Response.SendRedirect('/index?db=' + s);
1008 procedure TWebModule1.WebModule1masterAction(Sender: TObject;
1009 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1014 if loginCheck = false then
1016 with DataModule1.FDTable1 do
1017 if Locate('database', 'master') = false then
1020 i := FieldByName('dbnum').AsInteger + 1;
1021 AppendRecord([i, 'master']);
1023 WebModule1loginAction(nil, Request, Response, Handled);
1026 if Request.MethodType = mtPost then
1028 s := Request.ContentFields.Values['delete'];
1030 with DataModule1.FDTable4 do
1031 while (Bof = false) or (Eof = false) do
1035 DataModule1.FDTable4.First;
1036 while DataModule1.FDTable4.Eof = false do
1038 i := DataModule1.FDTable4.FieldByName('dbname').AsInteger;
1039 if DataModule1.FDTable1.Locate('dbnum', i) = true then
1041 i := DataModule1.FDTable4.FieldByName('posnum').AsInteger;
1042 if DataModule1.FDTable2.Locate('number', i) = false then
1043 DataModule1.FDTable4.Delete
1045 DataModule1.FDTable4.Next;
1048 DataModule1.FDTable4.Delete;
1052 Response.ContentType := 'text/html;charset=utf-8';
1053 Response.Content := master.Content;
1056 procedure TWebModule1.WebModule1registAction(Sender: TObject;
1057 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1060 title, na, raw, pass, kotoba, Error: string;
1061 comment: TStringList;
1062 function scan(Text: string): string;
1065 coll: TMatchCollection;
1069 Text := TNetEncoding.HTML.Encode(Text);
1070 s := TNetEncoding.HTML.Encode('>>');
1071 reg := TRegEx.Create(s + '(\d+)');
1072 coll := reg.Matches(Text);
1073 for j := coll.count - 1 downto 0 do
1075 Delete(Text, coll[j].index, coll[j].Length);
1076 t := Copy(coll[j].Value, Length(s) + 1, coll[j].Length);
1078 ('<a class=minpreview data-preview-url=/link?num=%s href=/jump?num=%s>>>%s</a>',
1080 Insert(result, Text, coll[j].index);
1086 kotoba := Request.ContentFields.Values['aikotoba'];
1088 if kotoba <> '
\82°
\82ñ
\82«' then
1089 Error := Error + '<p>
\8d\87\8c¾
\97t
\82ª
\82¿
\82ª
\82¢
\82Ü
\82·.';
1091 number := DataModule1.FDTable2.FieldByName('number').AsInteger + 1;
1092 with Request.ContentFields do
1094 title := Values['title'];
1095 na := Values['name'];
1096 raw := Values['comment'];
1097 pass := hash(Values['password']);
1100 title := '
\83^
\83C
\83g
\83\8b\82È
\82µ.';
1101 with Response.Cookies.Add do
1105 Value := '
\92N
\82©
\82³
\82ñ.'
1108 Expires := Now + 14;
1111 with Response.Cookies.Add do
1115 Expires := Now + 14;
1117 comment := TStringList.Create;
1119 comment.Text := raw;
1120 strsCheck(Error, comment);
1121 Request.ContentFields.Values['raw'] := raw;
1123 Request.ContentFields.Values['preview'] := '<section style=color:red>' +
1124 Error + '</section>'
1125 else if Request.ContentFields.Values['show'] = 'true' then
1127 Error := '<p style=font-size:2.3em;color:blue>
\81«
\81«
\83v
\83\8c\83r
\83\85\81[
\81«
\81«<p>' +
1129 Request.ContentFields.Values['preview'] := Error;
1130 Request.ContentFields.Values['show'] := 'false';
1134 i := DataModule1.FDTable1.FieldByName('dbnum').AsInteger;
1135 DataModule1.FDTable2.AppendRecord([i, number, title, na, comment.Text,
1137 Response.SendRedirect('index?db=' + i.ToString + '#article');
1143 WebModule1indexpageAction(nil, Request, Response, Handled);
1146 procedure TWebModule1.WebModule1searchAction(Sender: TObject;
1147 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1149 Response.ContentType := 'text/html;charset=utf-8';
1150 Response.Content := search.Content;
1153 procedure TWebModule1.WebModule1titleAction(Sender: TObject;
1154 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1156 Response.ContentType := 'text/html;charset=utf-8';
1157 Response.Content := title.Content;
1160 procedure TWebModule1.WebModule1topAction(Sender: TObject; Request: TWebRequest;
1161 Response: TWebResponse; var Handled: Boolean);
1163 Response.ContentType := 'text/html;charset=utf-8';
1164 DataModule1.FDTable1.First;
1165 if mente = false then
1166 Response.Content := top.ContentFromString(top.Content);
1169 procedure TWebModule1.WebModuleCreate(Sender: TObject);
1177 if FDTable1.Exists = false then
1178 FDTable1.CreateTable;
1179 if FDTable2.Exists = false then
1180 FDTable2.CreateTable;
1181 if FDTable3.Exists = false then
1182 FDTable3.CreateTable;
1183 if FDTable4.Exists = false then
1184 FDTable4.CreateTable;
1185 if FDTable5.Exists = false then
1186 FDTable5.CreateTable;
1196 if DataModule1.FDTable1.Bof and DataModule1.FDTable1.Eof then
1198 DataModule1.FDTable1.AppendRecord([0, 'info']);
1200 DataModule1.FDTable1.AppendRecord([i, '
\8cf
\8e¦
\94Â' + i.ToString]);
1202 if DataModule1.FDTable3.Bof and DataModule1.FDTable3.Eof then
1204 a := DataModule1.FDTable1.Lookup('database', 'info', 'dbnum');
1205 s := '
\88¢
\95Û,
\94n
\8e,
\8e\80\82Ë';
1206 DataModule1.FDTable3.AppendRecord
1207 (['
\82Æ
\82é
\82Ë
\81`
\82Ç
\8d\86',
1208 '<h1 style=color:maron;text-align:center;font-style:italic>
\82Æ
\82é
\82Ë
\81`
\82Ç
\8d\86</h1>',
1209 false, a, 30, hash(hash('admin')), s]);