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;
552 procedure TWebModule1.setLastArticle;
554 DataModule1.FDTable2.Last;
557 procedure TWebModule1.strsCheck(var Error: string; var list: TStringList);
564 s := TStringList.Create;
566 s.DelimitedText := DataModule1.FDTable3.FieldByName('ng').AsString;
567 for i := 0 to s.count - 1 do
568 for j := 0 to list.count - 1 do
570 if Pos(s[i], list[j]) > 0 then
572 list[j] := '<p>' + list[j];
578 Error := Error + '<p>
\8bÖ
\8e~
\8cê
\8bå
\82ª
\8aÜ
\82Ü
\82ê
\82Ä
\82¢
\82Ü
\82·.';
581 procedure TWebModule1.tiHTMLTag(Sender: TObject; Tag: TTag;
582 const TagString: string; TagParams: TStrings; var ReplaceText: string);
584 if TagString = 'count' then
585 ReplaceText := DataModule1.FDTable2.RecordCount.ToString
586 else if TagString = 'database' then
587 ReplaceText := DataModule1.FDTable1.FieldByName('database').AsString
588 else if TagString = 'date' then
589 with DataModule1.FDTable2 do
592 ReplaceText := FieldByName('date').AsString;
596 procedure TWebModule1.titleHTMLTag(Sender: TObject; Tag: TTag;
597 const TagString: string; TagParams: TStrings; var ReplaceText: string);
599 if TagString = 'pr' then
600 ReplaceText := promotion
601 else if TagString = 'js' then
602 ReplaceText := detail(TagString, TagParams.Values['id'])
603 else if TagString = 'main' then
608 while (FDQuery1.Eof = false)and(FDTable1.Eof = false) do
610 if FDTable1.FieldByName('dbnum').AsInteger = FDQuery1.FieldByName
611 ('dbnum').AsInteger then
613 ReplaceText := ReplaceText + ti.Content;
616 else if FDTable2.Eof = false then
620 ReplaceText := ReplaceText + ti.Content;
622 ti.DataSet := FDQuery1;
631 procedure TWebModule1.topHTMLTag(Sender: TObject; Tag: TTag;
632 const TagString: string; TagParams: TStrings; var ReplaceText: string);
637 if TagString = 'pr' then
638 ReplaceText := promotion
639 else if TagString = 'list' then
641 i := DataModule1.FDTable3.FieldByName('info').AsInteger;
642 for k := 0 to tcnt do
644 if DataModule1.FDTable1.Eof = true then
647 j := DataModule1.FDTable1.FieldByName('dbnum').AsInteger;
648 s := DataModule1.FDTable1.FieldByName('database').AsString;
649 if (i = j) or (s = 'master') then
651 DataModule1.FDTable1.Next;
654 DataModule1.FDTable2.Last;
655 if (Now - DataModule1.FDTable2.FieldByName('date').AsDateTime < 1) and
656 (DataModule1.FDTable2.RecordCount > 0) then
657 t := 'background-color:aqua;';
658 if DataModule1.FDTable2.RecordCount >= 10 *
659 DataModule1.FDTable3.FieldByName('count').AsInteger then
660 t := t + 'color:red;';
663 ReplaceText := ReplaceText +
664 Format('<p><a%s target=_blank href="/index?db=%d">%s</a><br></p>',
666 DataModule1.FDTable1.Next;
669 else if TagString = 'info' then
670 ReplaceText := DataModule1.FDTable1.Lookup('dbnum',
671 DataModule1.FDTable3.FieldByName('info').AsInteger, 'database')
672 else if TagString = 'dbnum' then
673 ReplaceText := DataModule1.FDTable3.FieldByName('info').AsString
674 else if (TagString = 'css') or (TagString = 'js') then
675 ReplaceText := detail(TagString, TagParams.Values['id'])
676 else if TagString = 'slide' then
678 for i := 1 to (DataModule1.FDTable1.RecordCount div tcnt) + 1 do
679 ReplaceText := ReplaceText +
680 '<div class="slide"><img src="/src?name=slide' + i.ToString +
681 '.jpg" style=float:right;height:465px><#list></div>';
685 procedure TWebModule1.WebModule1admdelAction(Sender: TObject;
686 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
693 DataModule1.FDTable2.RecNo := admin.Tag;
694 for i := 0 to Request.ContentFields.count - 1 do
696 reg := TRegEx.Create('\d+');
697 match := reg.match(Request.ContentFields[i]);
698 if match.Success = true then
700 k := match.Value.ToInteger - j - 1;
701 j := match.Value.ToInteger;
703 DataModule1.FDTable2.Next;
704 DataModule1.FDTable2.Delete;
707 WebModule1adminAction(nil, Request, Response, Handled);
710 procedure TWebModule1.WebModule1adminAction(Sender: TObject;
711 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
716 s := Request.CookieFields.Values['user'];
717 if (s = '') or (loginCheck = false) then
719 WebModule1loginAction(nil, Request, Response, Handled);
722 admin.MaxRows := DataModule1.FDTable3.FieldByName('count').AsInteger;
723 t := Request.QueryFields.Values['db'];
725 DataModule1.FDTable1.Locate('dbnum', t, []);
726 s := Request.QueryFields.Values['num'];
727 i := StrToIntDef(s, -1);
728 pages(DataModule1.FDTable2.RecordCount, i);
731 Self.Tag := Integer(@tagstr);
732 admin.header.Text := adhead.Content;
735 ('<input type=submit value=
\8dí
\8f\9c\82·
\82é><input type=reset value=
\83\8a\83Z
\83b
\83g></form>');
736 admin.footer.Add(footer.Content);
739 admin.footer.Add('<p style=text-align:center><a href="/index' + t +
741 admin.Tag := DataModule1.FDTable2.RecNo;
742 Response.ContentType := 'text/html;charset=utf-8';
743 Response.Content := admin.Content;
746 procedure TWebModule1.WebModule1adminsetAction(Sender: TObject;
747 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
751 s := Request.ContentFields.Values['pass'];
752 with DataModule1.FDTable3 do
755 FieldByName('mente').AsBoolean := Request.ContentFields.Values
760 FieldByName('password').AsString := hash(s);
761 with Response.Cookies.Add do
771 WebModule1adminAction(nil, Request, Response, Handled);
774 procedure TWebModule1.WebModule1alertAction(Sender: TObject;
775 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
777 num1, num2, i: Integer;
780 num1 := DataModule1.FDTable1.FieldByName('dbnum').AsInteger;
781 num2 := StrToIntDef(Request.QueryFields.Values['num'], -1);
784 if Request.MethodType = mtGet then
786 DataModule1.FDTable2.Locate('number', num2, []);
787 Response.ContentType := 'text/html;charset=utf-8';
788 Response.Content := mail.Content;
792 with DataModule1.FDTable4 do
795 i := FieldByName('id').AsInteger + 1;
796 s := Request.ContentFields.Values['request'];
799 AppendRecord([i, num1, num2, Now, s]);
802 Response.SendRedirect(Format('/index?db=%d&num=%d#%d',
805 Response.SendRedirect('/top');
809 procedure TWebModule1.WebModule1deleteAction(Sender: TObject;
810 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
815 s := Request.ContentFields.Values['num'];
819 s := hash(Request.ContentFields.Values['password']);
820 with DataModule1.FDTable2 do
821 if Locate('number;pass', VarArrayOf([num, s])) = true then
824 FieldByName('title').AsString := '';
825 FieldByName('name').AsString := ' - - - ';
826 FieldByName('comment').AsString := '<em>
\93\8a\8de
\8eÒ
\82É
\82æ
\82è
\8dí
\8f\9c\82³
\82ê
\82Ü
\82µ
\82½.</em>';
827 FieldByName('raw').AsString := '';
828 FieldByName('date').AsDateTime := Now;
830 WebModule1jumpAction(nil, Request, Response, Handled);
833 WebModule1indexpageAction(nil, Request, Response, Handled);
836 procedure TWebModule1.WebModule1fileAction(Sender: TObject;
837 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
841 s := Request.QueryFields.Values['type'];
843 Response.ContentType := 'text/javascript'
844 else if s = 'css' then
845 Response.ContentType := 'text/css';
846 Response.Content := detail(s, Request.QueryFields.Values['id']);
849 procedure TWebModule1.WebModule1helpAction(Sender: TObject;
850 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
855 Response.ContentType := 'text/html;charset=utf-8';
856 if Request.MethodType = mtPost then
858 s := Request.ContentFields.Values['help'];
859 DataModule1.FDTable4.Last;
860 k := DataModule1.FDTable4.FieldByName('id').AsInteger + 1;
861 DataModule1.FDTable4.AppendRecord([k, -1, -1, Now, s]);
866 Response.Content := help.Content;
869 procedure TWebModule1.WebModule1imgAction(Sender: TObject; Request: TWebRequest;
870 Response: TWebResponse; var Handled: Boolean);
873 res: TResourceStream;
875 with DataModule1.FDTable5 do
877 s := Request.ContentFields.Values['name'];
878 Response.ContentType := 'image/jpeg';
879 if Locate('name', s) = true then
880 Response.ContentStream := CreateBlobStream(FieldByName('source'), bmRead)
881 else if s = 'sprites.png' then
883 Response.ContentType := 'image/png';
884 res := TResourceStream.Create(HInstance, 'PngImage_1', RT_RCDATA);
885 Response.ContentStream := res;
888 Response.ContentStream := nil;
892 procedure TWebModule1.WebModule1indexpageAction(Sender: TObject;
893 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
898 s := Request.QueryFields.Values['db'];
900 DataModule1.FDTable1.Locate('dbnum', s, []);
901 i := StrToIntDef(Request.QueryFields.Values['num'], -1);
903 pages(DataModule1.FDTable2.RecordCount, i);
906 Self.Tag := Integer(@tagstr);
907 Response.ContentType := 'text/html; charset="utf-8"';
908 if mente = false then
909 Response.Content := index.Content;
912 procedure TWebModule1.WebModule1jumpAction(Sender: TObject;
913 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
918 DB := Request.QueryFields.Values['db'];
919 s := Request.ContentFields.Values['num'];
921 DataModule1.FDTable1.Locate('dbnum', DB.ToInteger, []);
922 DataModule1.FDTable2.Locate('number', s.ToInteger, []);
924 pages(DataModule1.FDTable2.RecNo, page);
925 Response.SendRedirect(Format('/index?db=%s&num=%d#%s', [DB, page, s]));
928 procedure TWebModule1.WebModule1linkAction(Sender: TObject;
929 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
934 s := Request.QueryFields.Values['num'];
938 if DataModule1.FDTable2.Locate('number', num, []) = true then
940 Response.ContentType := 'text/html;charset=utf-8';
941 Response.Content := articles.Content;
945 procedure TWebModule1.WebModule1loginAction(Sender: TObject;
946 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
952 if Request.MethodType = mtGet then
954 Response.ContentType := 'text/html;charset=utf-8';
955 Response.Content := login.Content;
958 s := Request.ContentFields.Values['record'];
959 v := DataModule1.FDTable1.Lookup('database', s, 'dbnum');
960 if VarIsNull(v) = false then
962 with Response.Cookies.Add do
965 Value := hash(Request.ContentFields.Values['password']);
971 Response.SendRedirect('/master')
973 Response.SendRedirect('/admin?db=' + i.ToString);
977 Response.ContentType := 'text/html;charset=utf-8';
978 Response.Content := login.Content;
982 procedure TWebModule1.WebModule1logoutAction(Sender: TObject;
983 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
989 with Response.Cookies.Add do
994 s := Request.QueryFields.Values['db'];
995 i := StrToIntDef(s, -1);
996 x := DataModule1.FDTable1.Locate('dbnum', i);
997 if (x = true) and (DataModule1.FDTable1.FieldByName('database')
998 .AsString = 'master') then
1001 Response.SendRedirect('/')
1003 Response.SendRedirect('/index?db=' + s);
1006 procedure TWebModule1.WebModule1masterAction(Sender: TObject;
1007 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1012 if loginCheck = false then
1014 with DataModule1.FDTable1 do
1015 if Locate('database', 'master') = false then
1018 i := FieldByName('dbnum').AsInteger + 1;
1019 AppendRecord([i, 'master']);
1021 WebModule1loginAction(nil, Request, Response, Handled);
1024 if Request.MethodType = mtPost then
1026 s := Request.ContentFields.Values['delete'];
1028 with DataModule1.FDTable4 do
1029 while (Bof = false) or (Eof = false) do
1033 DataModule1.FDTable4.First;
1034 while DataModule1.FDTable4.Eof = false do
1036 i := DataModule1.FDTable4.FieldByName('dbname').AsInteger;
1037 if DataModule1.FDTable1.Locate('dbnum', i) = true then
1039 i := DataModule1.FDTable4.FieldByName('posnum').AsInteger;
1040 if DataModule1.FDTable2.Locate('number', i) = false then
1041 DataModule1.FDTable4.Delete
1043 DataModule1.FDTable4.Next;
1046 DataModule1.FDTable4.Delete;
1050 Response.ContentType := 'text/html;charset=utf-8';
1051 Response.Content := master.Content;
1054 procedure TWebModule1.WebModule1registAction(Sender: TObject;
1055 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1058 title, na, raw, pass, kotoba, Error: string;
1059 comment: TStringList;
1060 function scan(Text: string): string;
1063 coll: TMatchCollection;
1067 Text := TNetEncoding.HTML.Encode(Text);
1068 s := TNetEncoding.HTML.Encode('>>');
1069 reg := TRegEx.Create(s + '(\d+)');
1070 coll := reg.Matches(Text);
1071 for j := coll.count - 1 downto 0 do
1073 Delete(Text, coll[j].index, coll[j].Length);
1074 t := Copy(coll[j].Value, Length(s) + 1, coll[j].Length);
1076 ('<a class=minpreview data-preview-url=/link?num=%s href=/jump?num=%s>>>%s</a>',
1078 Insert(result, Text, coll[j].index);
1084 kotoba := Request.ContentFields.Values['aikotoba'];
1086 if kotoba <> '
\82°
\82ñ
\82«' then
1087 Error := Error + '<p>
\8d\87\8c¾
\97t
\82ª
\82¿
\82ª
\82¢
\82Ü
\82·.';
1089 number := DataModule1.FDTable2.FieldByName('number').AsInteger + 1;
1090 with Request.ContentFields do
1092 title := Values['title'];
1093 na := Values['name'];
1094 raw := Values['comment'];
1095 pass := hash(Values['password']);
1098 title := '
\83^
\83C
\83g
\83\8b\82È
\82µ.';
1099 with Response.Cookies.Add do
1103 Value := '
\92N
\82©
\82³
\82ñ.'
1106 Expires := Now + 14;
1109 with Response.Cookies.Add do
1113 Expires := Now + 14;
1115 comment := TStringList.Create;
1117 comment.Text := raw;
1118 strsCheck(Error, comment);
1119 Request.ContentFields.Values['raw'] := raw;
1121 Request.ContentFields.Values['preview'] := '<section style=color:red>' +
1122 Error + '</section>'
1123 else if Request.ContentFields.Values['show'] = 'true' then
1125 Error := '<p style=font-size:2.3em;color:blue>
\81«
\81«
\83v
\83\8c\83r
\83\85\81[
\81«
\81«<p>' +
1127 Request.ContentFields.Values['preview'] := Error;
1128 Request.ContentFields.Values['show'] := 'false';
1132 i := DataModule1.FDTable1.FieldByName('dbnum').AsInteger;
1133 DataModule1.FDTable2.AppendRecord([i, number, title, na, comment.Text,
1135 Response.SendRedirect('index?db=' + i.ToString + '#article');
1141 WebModule1indexpageAction(nil, Request, Response, Handled);
1144 procedure TWebModule1.WebModule1searchAction(Sender: TObject;
1145 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1147 Response.ContentType := 'text/html;charset=utf-8';
1148 Response.Content := search.Content;
1151 procedure TWebModule1.WebModule1titleAction(Sender: TObject;
1152 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
1154 Response.ContentType := 'text/html;charset=utf-8';
1155 Response.Content := title.Content;
1158 procedure TWebModule1.WebModule1topAction(Sender: TObject; Request: TWebRequest;
1159 Response: TWebResponse; var Handled: Boolean);
1161 Response.ContentType := 'text/html;charset=utf-8';
1162 DataModule1.FDTable1.First;
1163 if mente = false then
1164 Response.Content := top.ContentFromString(top.Content);
1167 procedure TWebModule1.WebModuleCreate(Sender: TObject);
1175 if FDTable1.Exists = false then
1176 FDTable1.CreateTable;
1177 if FDTable2.Exists = false then
1178 FDTable2.CreateTable;
1179 if FDTable3.Exists = false then
1180 FDTable3.CreateTable;
1181 if FDTable4.Exists = false then
1182 FDTable4.CreateTable;
1183 if FDTable5.Exists = false then
1184 FDTable5.CreateTable;
1194 if DataModule1.FDTable1.Bof and DataModule1.FDTable1.Eof then
1196 DataModule1.FDTable1.AppendRecord([0, 'info']);
1198 DataModule1.FDTable1.AppendRecord([i, '
\8cf
\8e¦
\94Â' + i.ToString]);
1200 if DataModule1.FDTable3.Bof and DataModule1.FDTable3.Eof then
1202 a := DataModule1.FDTable1.Lookup('database', 'info', 'dbnum');
1203 s := '
\88¢
\95Û,
\94n
\8e,
\8e\80\82Ë';
1204 DataModule1.FDTable3.AppendRecord
1205 (['
\82Æ
\82é
\82Ë
\81`
\82Ç
\8d\86',
1206 '<h1 style=color:maron;text-align:center;font-style:italic>
\82Æ
\82é
\82Ë
\81`
\82Ç
\8d\86</h1>',
1207 false, a, 30, hash(hash('admin')), s]);