お知らせ
#!/usr/local/bin/perl #------------# # 基本設定 # #------------# # 外部ファイル取り込み require './cgi-lib.pl'; require './jcode.pl'; #会社名 $corp_name = "アンサーケースペック"; $page_title = "最新情報"; # 本体ファイルURL $script = './index.html'; # ログファイル $logfile = './topics.dat'; # テンプレート $tmpfile = './tmp.html'; #トップページ用のタイトル一覧表示用テンプレート ※index.html?mode=list で表示(PHPインクルード用) $tmpfile_top = './tmp_headline.html'; #ニュース記事一覧表示用テンプレート ※index.htmlで記事一覧表示(tmp.htmlを利用して表示) $tmp_box = './tmp_news_line.html'; #ニュース記事一覧のページタイトル先頭部分 $ichiran_title = "ニュース一覧"; # 管理パスワード $pass = ''; # 画像ディレクトリとそのURL $imgdir = './img/'; $imgurl = './img/'; # 投稿受理最大サイズ (bytes) # → 例 : 102400 = 100KB $cgi_lib'maxdata = 102400000; # 画像ファイルの最大表示の大きさ(単位:ピクセル) # → これを超える画像は縮小表示します $MaxW = 900; # 横幅 $MaxH = 900; # 縦幅 # 1ページあたり表示件数 $pagelog = 15; # トップページ用のタイトル一覧表示件数。 $pagelog_top = 3; # 戻り先URL $home = './index.html'; # URLの自動リンク (0=no 1=yes) $autolink = 1; # 最大記事数 # → これを超える記事は古い順に自動削除されます $max = 9999; #ナビボタンの表示(0:非表示、1:表示) $nv_home = 0; $nv_top = 0; $nv_back = 1; $nv_next = 1; #ナビボタンの画像 $backImg = 'img/back.jpg'; $nextImg = 'img/next.jpg'; #▼モジュール読み込み用パス PSK-NET 2013.11.26 追加 #※★★★★★【新しくモジュールを追加する場合】★★★★★ # 1.(*1)にモジュールパスを追加 # 2.(*2)に代替え変数を追加 # 3.(*3)[記事表示」部にテンプレートファイルのモジュール置き換え処理を追加 $PCt=0; $htmp[$PCt++] = "../modules/analytics.html"; #グーグルアナリティクス $htmp[$PCt++] = "../modules/header.html"; #ヘッダー $htmp[$PCt++] = "../modules/side_menu.html"; #サイドメニュー $htmp[$PCt++] = "../modules/footer.html"; #フッター $htmp[$PCt++] = "(パスを記入)"; #★★★★★↑(*1)ここに新しいModule FileのPathを追加★★★★★ #《注意》モジュールの追加があってもこのfor分の中身は変更する必要はありません。 $i=0; foreach $tg (@htmp) { if (-f $tg) { @tag_in=(); open(HTTAG_IN, "$tg") || &error("Open Error: $tg"); @tag_in = ; close(HTTAG_IN); $module[$i]=""; foreach (@tag_in) { $module[$i] .= $_; } } $i++; } #配列をわかりやすく変数に代入 #※新しく読み込むモジュールを追加した時は、 # $変数名 = $module[$PCt++]; # このようにして一覧の下に追加してください。 # =(イコール)の右側はすべて同じですので触らないでください。 $PCt=0; $Google = $module[$PCt++]; #グーグルアナリティクス $Header = $module[$PCt++]; #ヘッダー $Sidemn = $module[$PCt++]; #サイドメニュー $Footer = $module[$PCt++]; #フッター #$(変数名) = $module[$PCt++]; #追加モジュール名 #★★★★★↑(*2)ここに新しいModule FileのPathを追加★★★★★ #▲モジュール読み込み用パス追加(ここまで) #------------# # 設定完了 # #------------# &decode; if ($mode eq "admin") { &admin; } elsif ($mode eq "check") { ✓ } elsif ($mode eq "list") { &list; } &logfile; #------------# # 記事表示 # #------------# sub logfile { local($flag,$msg,$i,$next,$back,$loop,@head,@loop,@foot); # HTMLヘッダ print "Content-type: text/html\n\n"; # ▼テンプレート読み込み ---------------------------------------------------- $loop=""; @head=(); @foot=(); $flag=0; # テンプレートファイルの読み込み open(IN,"$tmpfile") || &error("Open Error: $tmpfile"); # テンプレートファイルからモジュールがあれば置き換える while () { s//$Google/g if(//); #グーグルアナリティクス s//$Header/g if(//); #ヘッダー s//$Sidemn/g if(//); #サイドメニュー s//$Footer/g if(//); #フッター #s//$(*2で設定した変数名)/g if(//); #★★★★★↑(*3)ここに新しいModule Fileの置き換え命令を追加★★★★★ push(@template, $_) ; } close(IN); # ▲------------------------------------------------------------------------- # ▼データ読み込み→配列に逆順で代入 ---------------------------------------- open(INN,"$logfile") || &error("Open Error: $logfile"); @inn = ; close(INN); #レコード数取得 $hcount=@inn; #配列の中身を逆順にする。 #@inn = reverse(@inn); # ▲------------------------------------------------------------------------- # ▼ループして必要な記事だけを配列に代入(記事用配列は @loop)-------------- @loop=(); $i=0; require "./$tmp_box"; foreach (@inn) { $i++; #ループ内で必要な分だけループにかかり、不要な分はループを通さないようにしているらしい。 next if ($i < $page + 1); #$pageは&decord内で定義されている。 next if ($i > $page + $pagelog); #記事部分のテンプレHTMLを表示用に代入 $msg = $news_section; ($no,$date,$sub,$com,$t[0],$w[0],$h[0],$t[1],$w[1],$h[1],$t[2],$w[2],$h[2]) = split(/<>/); # 記事内容の中に、リンクが存在するときは、URLリンク付に置き換える &auto_link($com) if ($autolink); $msg =~ s//$no/i; $msg =~ s//$sub/i; $msg =~ s//$date/i; $msg =~ s//$date/i; $msg =~ s//$com/i; # 画像 foreach $i (0 .. 2) { $j = $i + 1; $image = ""; if (!$t[$i]) { $msg =~ s/$image//i; next; } if ($h[$i] >= $w[$i]) { $smb_w=$w[$i]*53/$h[$i]; $wh = qq| width="$smb_w" height="53"|; } else { $smb_h=$h[$i]*80/$w[$i]; $wh = qq| width="80" height="$smb_h"|; } $msg =~ s|$image||i; } push(@loop,$msg); } close(IN); # ▲------------------------------------------------------------------------- # ▼ページ繰越ボタン -------------------------------------------------------- $next = $page + $pagelog; $back = $page - $pagelog; if ($back >= 0) { $bflag=1; if ($pageBtn) { $backBtn = "
\n"; $backBtn .= "\n"; $backBtn .= "
\n"; } else { $backBtn = "\"←"; } } else { $bflag=0; if ($pageBtn) { $backBtn = ""; } else { $backBtn = "\"←"; } } if ($next < $i) { $nflag=1; if ($pageBtn) { $nextBtn = "
\n"; $nextBtn .= "\n"; $nextBtn .= "
\n"; } else { $nextBtn = "\"NEXT"; } } else { $nflag=0; if ($pageBtn) { $nextBtn = ""; } else { $nextBtn = "\"NEXT"; } } # ▲------------------------------------------------------------------------- # ▼ヘッダ表示→《ページ全体を表示》に変更 ---------------------------------- foreach (@template) { s//$backBtn/ if($nv_back == 1); s//$nextBtn/ if($nv_next == 1); s//HOMEページ<\/a>/ if($nv_home == 1); if ($pageBtn) { s///; } else { s//TOPページ<\/a>/ if($nv_top == 1); } if(//) { s//$ichiran_title/g; } if(//) { s//@loop/g; } print; } # ▲------------------------------------------------------------------------- exit; } #--------------------------------# # トップページタイトル一覧表示 # #--------------------------------# sub list { # HTMLヘッダ print "Content-type: text/html\n\n"; # ▼データ読み込み→配列に逆順で代入 ---------------------------------------- open(INN,"$logfile") || &error("Open Error: $logfile"); @inn = ; close(INN); #レコード数取得 $hcount=@inn; #配列の中身を逆順にする。 #@inn = reverse(@inn); # ▲------------------------------------------------------------------------- # ▼ループして必要な記事だけを配列に代入(記事用配列は @loop)-------------- @loop=(); $i=0; require "./$tmpfile_top"; foreach (@inn) { $i++; #ループ内で必要な分だけループにかかり、不要な分はループを通さないようにしているらしい。 next if ($i > $pagelog_top); #記事部分のテンプレHTMLを表示用に代入 $msg = $tmp_headline; ($no,$date,$sub,$com,$t[0],$w[0],$h[0],$t[1],$w[1],$h[1],$t[2],$w[2],$h[2]) = split(/<>/); # 記事内容の中に、リンクが存在するときは、URLリンク付に置き換える &auto_link($com) if ($autolink); $msg =~ s//$no/g; $msg =~ s//$sub/g; $msg =~ s//$date/g; $msg =~ s//$com/g; push(@loop,$msg); } # ▲------------------------------------------------------------------------- # ▼ヘッダ表示→《ページ全体を表示》に変更 ---------------------------------- foreach (@loop) { print; } # ▲------------------------------------------------------------------------- exit; } #------------# # 管理画面 # #------------# sub admin { local($no,$dat,$sub,$com,$f,$del); # 認証 if ($in{'pass'} ne $pass) { &error("パスワードが違います"); } #●----------------------------------------------------------- #並べ替え処理(●●●PSK-NET 2013.11.25●●●追加) if ($in{'job'} eq "並べ替え処理" or $in{'job'} eq "並べ替え実行") { &header; require "sort.cgi"; print ""; exit; } #●----------------------------------------------------------- # 投稿フォーム if ($in{'job'} eq "form") { &form; # 投稿処理 } elsif ($in{'job'} eq "form2") { local($no,$t1,$w1,$h1,$t2,$w2,$h2,$t3,$w3,$h3,@file); if (!$in{'date'}) { &error("日付が未入力です"); } if (!$in{'sub'}) { &error("タイトルが未入力です"); } if (!$in{'comment'}) { &error("メッセージが未入力です"); } # タグ復元 if ($in{'tag'} == 1) { $in{'comment'} =~ s/
//g; $in{'comment'} = &tag($in{'comment'}); } open(IN,"$logfile") || &error("Open Error: $logfile"); @file = ; close(IN); # 採番 ($no) = split(/<>/, $file[0]); $no++; # 画像アップ if ($in{'upfile1'} || $in{'upfile2'} || $in{'upfile3'}) { ($t1,$w1,$h1,$t2,$w2,$h2,$t3,$w3,$h3) = &upload($no); } # 最大記事数調整 while ($max-1 <= @file) { $del = pop(@file); local($no,$date,$sub,$com,$t[0],$w[0],$h[0], $t[1],$w[1],$h[1],$t[2],$w[2],$h[2],$tag) = split(/<>/, $del); unlink("$imgdir$no-1$t[0]") if ($t[0]); unlink("$imgdir$no-2$t[1]") if ($t[1]); unlink("$imgdir$no-3$t[2]") if ($t[2]); } # 更新 unshift(@file,"$no<>$in{'date'}<>$in{'sub'}<>$in{'comment'}<>$t1<>$w1<>$h1<>$t2<>$w2<>$h2<>$t3<>$w3<>$h3<>$in{'tag'}\n"); open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @file; close(OUT); # 削除 } elsif ($in{'job'} eq "dele" && $in{'no'}) { local($i,$j,$f); local(@new)=(); open(IN,"$logfile") || &error("Open Error: $logfile"); while () { $f=0; ($no,$date,$sub,$com,$t[0],$w[0],$h[0], $t[1],$w[1],$h[1],$t[2],$w[2],$h[2],$tag) = split(/<>/); foreach $del ( split(/\0/, $in{'no'}) ) { if ($no == $del) { $f++; foreach $i (0 .. 2) { $j = $i+1; unlink("$imgdir$no-$j$t[$i]"); } last; } } if (!$f) { push(@new,$_); } } close(IN); # 更新 open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @new; close(OUT); # 修正フォーム } elsif ($in{'job'} eq "edit" && $in{'no'}) { local(@no) = split(/\0/, $in{'no'}); open(IN,"$logfile") || &error("Open Error: $logfile"); while () { ($no,$dat,$sub,$com,$t1,$w1,$h1, $t2,$w2,$h2,$t3,$w3,$h3,$tag) = split(/<>/); last if ($no[0] == $no); } close(IN); # 修正画面 &form($no,$dat,$sub,$com,$t1,$w1,$h1,$t2,$w2,$h2,$t3,$w3,$h3,$tag); # 修正実行 } elsif ($in{'job'} eq "edit2" && $in{'no'}) { # タグ復元 if ($in{'tag'} == 1) { $in{'comment'} =~ s/
//ig; $in{'comment'} = &tag($in{'comment'}); } # 画像アップ if ($in{'upfile1'} || $in{'upfile2'} || $in{'upfile3'}) { ($t1,$w1,$h1,$t2,$w2,$h2,$t3,$w3,$h3) = &upload($in{'no'}); } local(@new)=(); open(IN,"$logfile") || &error("Open Error: $logfile"); while () { s/\n$//; ($no,$dat,$sub,$com,$t01,$w01,$h01, $t02,$w02,$h02,$t03,$w03,$h03,$tag) = split(/<>/); if ($in{'no'} == $no) { if ($in{'del1'}) { unlink("$imgdir$no-1$t01"); $t01 = $w01 = $h01 = ""; } if ($in{'del2'}) { unlink("$imgdir$no-2$t02"); $t02 = $w02 = $h02 = ""; } if ($in{'del3'}) { unlink("$imgdir$no-3$t03"); $t03 = $w03 = $h03 = ""; } if ($t1) { $t01=$t1; $w01=$w1; $h01=$h1; } if ($t2) { $t02=$t2; $w02=$w2; $h02=$h2; } if ($t3) { $t03=$t3; $w03=$w3; $h03=$h3; } $_ = "$no<>$in{'date'}<>$in{'sub'}<>$in{'comment'}<>$t01<>$w01<>$h01<>$t02<>$w02<>$h02<>$t03<>$w03<>$h03<>$in{'tag'}<>"; } push(@new,"$_\n"); } close(IN); # 更新 open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @new; close(OUT); } &header; print <<"EOM";

$corp_name - $page_title 投稿・修正・削除 管理画面

・プルダウンメニューを選択して各種操作を行います。

1.
新規投稿処理の「新規」を選択後、実行ボタンを押してください。
2.
記事修正修正したい記事にチェックを入れ、処理の「修正」を選択後、実行ボタンを押してください。
3.
記事削除削除したい記事にチェックを入れ、処理の「削除」を選択後、実行ボタンを押してください。
         ※削除すると元に戻せませんので慎重に行ってください。
管理画面トップに戻る

処理: EOM # ログ展開 open(IN,"$logfile") || &error("Open Error: $logfile"); while () { ($no,$dat,$sub,$com,$t[0],$w[0],$h[0], $t[1],$w[1],$h[1],$t[2],$w[2],$h[2],$tag) = split(/<>/); $com =~ s/<([^>]|\n)*>//g; if (length($com) > 60) { $com = substr($com,0,60); $com .= "・・・"; } print "
$sub"; print "- $dat
$com
\n"; foreach $i (0 .. 2) { $j = $i + 1; next if (!$t[$i]); print "[画像$j]\n"; } } close(IN); print "
\n"; print &HtmlBot; exit; } #----------------# # 投稿フォーム # #----------------# sub form { local($no,$dat,$sub,$com,$t[0],$w[0],$h[0], $t[1],$w[1],$h[1],$t[2],$w[2],$h[2],$tag) = @_; if ($tag == 1) { # 改行はそのまま $com =~ s/
/
\r/ig; $checked = " checked"; } else { # 改行は復元 $com =~ s/
/\r/ig; $checked = ""; } # パラメータ定義 local($job) = $in{'job'} . '2'; # 新規投稿時は年月日を取得 if ($dat eq "") { $ENV{'TZ'} = "JST-9"; local($mday,$mon,$year) = (localtime(time))[3..5]; $dat = sprintf("%04d.%02d.%02d", $year+1900,$mon+1,$mday); } # フォーム表示 &header; print <<"EOM";

$corp_name - $page_title 投稿・修正・削除 管理画面

・HTMLタグを「有効」にする場合は、改行する部分で <br> と記述すること。
・画像のアップロードは最大3枚まで。アップロードしなくてもかまいません。
・画像は縦・横とも900ピクセル未満でアップロードして下さい。
管理画面トップに戻る

EOM local($i,$j); foreach $i (0 .. 2) { $j = $i+1; print "\n"; } print <



     
年月日
件名
本文 HTMLタグを有効にする
画像$j"; if ($t[$i]) { print "  削除\n"; print "[画像$j]"; } print "
EOM print &HtmlBot; exit; } #----------------# # デコード処理 # #----------------# sub decode { local($key,$val); &ReadParse; while ( ($key,$val) = each %in ) { if ($key !~ /^upfile/) { # シフトJISコード変換 &jcode'convert(*val, 'sjis'); # タグ処理 $val =~ s/<>/<>/g; $val =~ s/&/&/g; $val =~ s/"/"/g; $val =~ s//>/g; # 改行処理 if ($key eq "comment") { $val =~ s/\r\n/
/g; $val =~ s/\r/
/g; $val =~ s/\n/
/g; } else { $val =~ s/\r//g; $val =~ s/\n//g; } } $in{$key} = $val; } $mode = $in{'mode'}; $page = $in{'page'}; } #--------------# # HTMLヘッダ # #--------------# sub header { if ($headflag) { return; } print "Content-type: text/html\n\n"; print <<"EOM"; $ver EOM $headflag=1; } #--------------# # エラー処理 # #--------------# sub error { &header; print <<"EOM";

ERROR !

$_[0]

EOM print &HtmlBot; exit; } #--------------------# # 画像アップロード # #--------------------# sub upload { local($no) = @_; local($tail,$fnam,$macbin,$f,$i,$flag,$imgfile, $upfile,$length,$W,$H,$W2,$H2,@tail,@fnam,@name,@upfile); # 画像処理 $macbin=0; @tail=(); @fnam=(); @name=(); foreach (@in) { if (/(.*)Content-type:(.*)/i) { $tail = $2; $tail =~ s/\r//g; $tail =~ s/\n//g; push(@tail,$tail); } if (/.*name=\"(.*)\";.*filename=\"(.*)\"/i) { $fnam = $2; $fnam =~ s/\r//g; $fnam =~ s/\n//g; push(@fnam,$fnam); push(@name,$1); } if (/application\/x-macbinary/i) { $macbin=1; } } # ファイル形式を認識 $f=0; $i=0; @upfile=(); foreach (0 .. $#tail) { $i++; $flag=0; if ($tail[$_] =~ /image\/gif/i) { $tail=".gif"; $flag=1; } elsif ($tail[$_] =~ /image\/jpeg/i) { $tail=".jpg"; $flag=1; } elsif ($tail[$_] =~ /image\/x-png/i) { $tail=".png"; $flag=1; } if (!$flag) { if ($fnam[$_] =~ /\.gif$/i) { $tail=".gif"; $flag=1; } elsif ($fnam[$_] =~ /\.jpe?g$/i) { $tail=".jpg"; $flag=1; } elsif ($fnam[$_] =~ /\.png$/i) { $tail=".png"; $flag=1; } } if ($name[$_] eq "upfile$i") { $upfile = $in{"upfile$i"}; $imgfile = "$imgdir/$no-$i$tail"; } # アップロード結果 if ($flag) { $f++; } else { push(@upfile,("","","")); next; } # マックバイナリ対策 if ($macbin) { $length = substr($upfile,83,4); $length = unpack("%N",$length); $upfile = substr($upfile,128,$length); } # データ書込み open(OUT,">$imgfile") || &error("画像アップ失敗"); binmode(OUT); binmode(STDOUT); print OUT $upfile; close(OUT); chmod (0666,$imgfile); # 画像サイズ取得 if ($tail eq ".jpg") { ($W, $H) = &j_size($imgfile); } elsif ($tail eq ".gif") { ($W, $H) = &g_size($imgfile); } elsif ($tail eq ".png") { ($W, $H) = &p_size($imgfile); } # 画像表示縮小 if ($W > $MaxW || $H > $MaxH) { $W2 = $MaxW / $W; $H2 = $MaxH / $H; if ($W2 < $H2) { $key = $W2; } else { $key = $H2; } $W = int ($W * $key) || 1; $H = int ($H * $key) || 1; } push(@upfile,($tail,$W,$H)); } return @upfile; } #------------------# # JPEGサイズ認識 # #------------------# sub j_size { local($jpeg) = @_; local($t, $m, $c, $l, $W, $H); open(JPEG, "$jpeg") || return (0,0); binmode JPEG; read(JPEG, $t, 2); while (1) { read(JPEG, $t, 4); ($m, $c, $l) = unpack("a a n", $t); if ($m ne "\xFF") { $W = $H = 0; last; } elsif ((ord($c) >= 0xC0) && (ord($c) <= 0xC3)) { read(JPEG, $t, 5); ($H, $W) = unpack("xnn", $t); last; } else { read(JPEG, $t, ($l - 2)); } } close(JPEG); return ($W, $H); } #-----------------# # GIFサイズ認識 # #-----------------# sub g_size { local($gif) = @_; local($data); open(GIF,"$gif") || return (0,0); binmode(GIF); sysread(GIF,$data,10); close(GIF); if ($data =~ /^GIF/) { $data = substr($data,-4); } $W = unpack("v",substr($data,0,2)); $H = unpack("v",substr($data,2,2)); return ($W, $H); } #-----------------# # PNGサイズ認識 # #-----------------# sub p_size { local($png) = @_; local($data); open(PNG, "$png") || return (0,0); binmode(PNG); read(PNG, $data, 24); close(PNG); $W = unpack("N", substr($data, 16, 20)); $H = unpack("N", substr($data, 20, 24)); return ($W, $H); } #-----------------# # 自動URLリンク # #-----------------# sub auto_link { $_[0] =~ s/([^=^\"]|^)(https?\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1$2<\/a>/g; } #------------# # タグ復元 # #------------# sub tag { local($_) = @_; s/<//g; s/&/&/g; s/"/"/g; $_; } #------------------# # チェックモード # #------------------# sub check { &header; print <Check Mode
    EOM # ログファイル if (-e $logfile) { print "
  • ログファイル:パスOK!\n"; if (-r $logfile && -w $logfile) { print "
  • ログパーミッション:OK!\n"; } else { print "
  • ログパーミッションが不正です。\n"; } } else { print "
  • ログファイルのパスが不正です: $logfile\n"; } # 画像ディレクトリ if (-d $imgdir) { print "
  • 画像ディレクトリ:パスOK!\n"; if (-r $imgdir && -w $imgdir && -x $imgdir) { print "
  • 画像ディレクトリのパーミッション:OK!\n"; } else { print "
  • 画像ディレクトリのパーミッションが不正です。\n"; } } else { print "
  • 画像ディレクトリのパスが不正です: $imgdir\n"; } print <バージョン:$ver
EOM exit; } __END__