#!/usr/bin/perl #┌───────────────────────────────── #│ WEB MART : admin.cgi - 2015/12/30 #│ copyright (c) KentWeb, 1997-2015 #│ http://www.kent-web.com/ #└───────────────────────────────── # モジュール宣言 use strict; use CGI::Carp qw(fatalsToBrowser); use lib "./lib"; use CGI::Minimal; # 設定ファイル取り込み require './init.cgi'; my %cf = set_init(); # データ受理 CGI::Minimal::max_read_size($cf{maxdata}); my $cgi = CGI::Minimal->new; cgi_err('容量オーバー') if ($cgi->truncated); my %in = parse_form($cgi); # 認証 check_passwd(); # 処理分岐 if ($in{data_new}) { data_new(); } if ($in{data_men}) { data_men(); } if ($in{look_log}) { look_log(); } if ($in{data_law}) { data_law(); } if ($in{data_csv}) { data_csv(); } # メニュー画面 menu_html(); #----------------------------------------------------------- # メニュー画面 #----------------------------------------------------------- sub menu_html { header("メニューTOP"); print <

選択ボタンを押してください。

選択 カテゴリーⅠ 処理メニュー
新規商品データ作成
商品データメンテナンス(修正・削除)
CSVダウン/アップロード
ログデータ閲覧
特商法ページメンテナンス
ログアウト
作業先カテゴリー項目 作業名
 カテゴリーⅠ Windows OS商品登録
 カテゴリーⅡAplication Softs 商品登録
 カテゴリーⅢCD/DVD 商品登録
 カテゴリーⅣDI-Kits/Others  商品登録
EOM exit; } #----------------------------------------------------------- # 新規記事作成 #----------------------------------------------------------- sub data_new { # コード,商品名,価格,オプション my @log = @_; # 在庫のとき my $zai = shift(@log) if ($cf{stock}); # 新規商品追加 if ($in{job} eq "new") { data_add(); } # パラメータ指定 my ($mode,$job,$input_code); if ($in{data_new}) { $mode = "data_new"; $job = "new"; $input_code .= qq|(英数字及びアンダーバーのみ)
\n|; $input_code .= qq||; } else { $mode = "data_men"; $job = "edit2"; $input_code .= qq|$log[0] (変更不可)\n|; $input_code .= qq||; } # 税表記 my $tax = $cf{tax_per} == 0 ? $cf{tax_class}[0] : $cf{tax_class}[1]; header("商品登録フォーム"); back_btn(); print <■ 商品登録フォーム

・ 必要項目を入力して、送信ボタンを押してください。
・ 「備考」及び「戻り先URL」は検索結果画面で使用。

商品コード $input_code
商品名
商品単価 円   [$tax]

以下は検索画面(機能)に必要(検索機能を使用しない場合は入力不要)。

EOM # 属性情報 my $i = 4; foreach (@{$cf{options}}) { $i++; my ($key,$nam) = split(/,/); print qq|\n|; print qq|\n|; print qq||; } # 在庫管理オプション if ($cf{stock}) { print qq|\n|; print qq|\n|; print qq||; } print <
属性指定
[$nam]
(複数をスペースで区切る。例:青 赤 黄)
\n|; print qq|
在庫数
備考
戻り先URL (http://から記述)
EOM exit; } #----------------------------------------------------------- # データ追加 #----------------------------------------------------------- sub data_add { # 入力チェック check_input(); # データ追加 my ($flg,@log); open(DAT,"+< $cf{datfile}") or cgi_err("open err: $cf{datfile}"); eval "flock(DAT, 2);"; while() { my ($code) = (split(/<>/))[0]; if ($in{code} eq $code) { $flg++; last; } push(@log,$_); } # コード重複のときはエラー if ($flg) { close(DAT); cgi_err("商品コード($in{code})が重複しています"); } # オプション my $ops; foreach (@{$cf{options}}) { my ($key,undef) = split(/,/); $ops .= qq|$in{"op:$key"}<>|; } seek(DAT, 0, 0); print DAT @log; print DAT "$in{code}<>$in{item}<>$in{price}<>$in{memo}<>$in{back}<>$ops\n"; truncate(DAT, tell(DAT)); close(DAT); # 在庫数 if ($cf{stock}) { open(DAT,">> $cf{stkfile}") or cgi_err("write err: $cf{stkfile}"); eval "flock(DAT, 2);"; print DAT "$in{code}<>$in{zai}<>\n"; close(DAT); } # 元画面フォーム my $btn = < EOM # 完了メッセージ message("新規商品データを追加しました", $btn); } #----------------------------------------------------------- # 商品データメンテナンス #----------------------------------------------------------- sub data_men { # 指示フラグ my $job = $in{job}; # --- 修正フォーム if ($job eq "edit" && $in{code}) { my @log; open(IN,"$cf{datfile}") or cgi_err("open err: $cf{datfile}"); while() { my @data = split(/<>/); if ($in{code} eq $data[0]) { chomp(@data); @log = @data; last; } } # close(IN); # 在庫ファイル if ($cf{stock}) { my $zno; open(IN,"$cf{stkfile}") or cgi_err("open err: $cf{stkfile}"); while() { my ($code,$zan) = split(/<>/); if ($in{code} eq $code) { $zno = $zan; last; } } close(IN); unshift(@log,$zno); } # 修正フォーム data_new(@log); # --- 修正実行 } elsif ($job eq "edit2") { # 入力チェック check_input(); # 更新データ my $new = "$in{code}<>$in{item}<>$in{price}<>$in{memo}<>$in{back}<>"; foreach (@{$cf{options}}) { my ($key,undef) = split(/,/); $new .= qq|$in{"op:$key"}<>|; } # 商品データ修正 my @log; open(DAT,"+< $cf{datfile}") or cgi_err("open err: $cf{datfile}"); eval "flock(DAT, 2);"; while() { my @data = split(/<>/); if ($in{code} eq $data[0]) { $_ = "$new\n"; } push(@log,$_); } seek(DAT, 0, 0); print DAT @log; truncate(DAT, tell(DAT)); close(DAT); # 在庫更新 if ($cf{stock}) { my ($flg,@log); open(DAT,"+< $cf{stkfile}") or cgi_err("open err: $cf{stkfile}"); eval "flock(DAT, 2);"; while() { my ($code,$zai) = split(/<>/); if ($in{code} eq $code) { $flg++; $_ = "$code<>$in{zai}<>\n"; } push(@log,$_); } # 新規追加のとき if (!$flg) { push(@log,"$in{code}<>$in{zai}<>\n"); } seek(DAT, 0, 0); print DAT @log; truncate(DAT, tell(DAT)); close(DAT); } # --- 削除 } elsif ($job eq "dele" && $in{code}) { my @log; open(DAT,"+< $cf{datfile}") or cgi_err("open err: $cf{datfile}"); eval "flock(DAT, 2);"; while() { my ($code) = (split(/<>/))[0]; next if ($in{code} eq $code); push(@log,$_); } seek(DAT, 0, 0); print DAT @log; truncate(DAT, tell(DAT)); close(DAT); # 在庫更新 if ($cf{stock}) { my @log; open(DAT,"+< $cf{stkfile}") or cgi_err("open err: $cf{stkfile}"); eval "flock(DAT, 2);"; while() { my ($code,$zai) = split(/<>/); next if ($in{code} eq $code); push(@log,$_); } seek(DAT, 0, 0); print DAT @log; truncate(DAT, tell(DAT)); close(DAT); } } # 在庫データ認識 my %zai; if ($cf{stock}) { open(DAT,"$cf{stkfile}") or cgi_err("open err: $cf{stkfile}"); while() { my ($code,$zai) = split(/<>/); $zai{$code} = $zai; } close(DAT); } header("メニューTOP >カテゴリーⅠ 商品データメンテナンス"); back_btn(); print <■ 商品データメンテナンス

処理を選択し、送信ボタンを押してください。

処理: EOM print qq|| if ($cf{stock}); print qq|\n|; open(IN,"$cf{datfile}") or cgi_err("open err: $cf{datfile}"); while() { my ($code,$item,$price,$memo,$back,@op) = split(/<>/); $price = comma($price); print qq||; print qq||; print qq||; print qq||; print qq|| if ($cf{stock}); print qq|\n|; } close(IN); print < EOM exit; } #----------------------------------------------------------- # ログデータ閲覧 #----------------------------------------------------------- sub look_log { # 閲覧ボタン確認 my $look; foreach ( keys %in ) { if (/^look:(\d+)$/) { $look = $1; last; } } # 個別閲覧 if ($look) { look_num($look); } # 年月データ my $q_ym = $in{ym}; # 入力内容が規定外の場合は現在の年月 if ($q_ym !~ /^\d{6}$/) { my ($m,$y) = (localtime())[4,5]; $q_ym = sprintf("%04d%02d", $y+1900,$m+1); } header("メニューTOP > ログデータ閲覧"); back_btn(); print <■ ログデータ閲覧

年月を切り替えて閲覧することができます。

年月:
選択 商品コード 商品名 金額在庫
$code$item¥$price$zai{$code}
EOM open(IN,"$cf{logdir}/$q_ym.cgi"); while() { my ($date,$num,$log) = split(/<>/); print qq|\n|; print qq|\n|; print qq|\n|; } close(IN); print < EOM exit; } #----------------------------------------------------------- # 個別ログ閲覧 #----------------------------------------------------------- sub look_num { my $look = shift; # ログデータ名 my $log = ($in{ym} =~ /^(\d{4})(\d{2})$/) && "$1$2.cgi"; # ログオープン my $data; open(IN,"$cf{logdir}/$log") or cgi_err("open err: $log"); while() { my ($date,$num,$body) = split(/<>/); if ($look == $num) { $data = $_; last; } } close(IN); my ($date,$num,$body) = split(/<>/,$data); $body =~ s/\t/
/g; header("メニューTOP > ログデータ閲覧 > 個別ログ"); back_btn('look_log'); print <■ ログデータ閲覧 > 個別ログ

・注文年月: $date
・注文番号: $num

$body EOM exit; } #----------------------------------------------------------- # 特商法メンテ #----------------------------------------------------------- sub data_law { # 更新 if ($in{submit}) { # 改行変換 $in{law_text} =~ s/\t/\n/g; # 上書き open(DAT,"+> $cf{lawfile}") or cgi_err("write err: $cf{lawfile}"); print DAT $in{law_text}; close(DAT); message("特商法を更新しました"); } # データ読み取り open(IN,"$cf{lawfile}") or cgi_err("open err: $cf{lawfile}"); my $data = join('', ); close(IN); header("メニューTOP > 特商法メンテナンス"); back_btn(); print <■ 特商法メンテナンス

変更内容を修正し、送信ボタンを押してください。



EOM exit; } #----------------------------------------------------------- # CSVダウン/アップロード #----------------------------------------------------------- sub data_csv { # ダウンロード if ($in{downld}) { require "lib/jacode.pl"; open(DAT,"$cf{datfile}") or error("open err: $cf{datfile}"); # ダウンロード用ヘッダ print "Content-type: application/octet-stream\n"; print "Content-Disposition: attachment; filename=data.csv\n\n"; # バイナリ出力 (Windowsサーバ環境) binmode(STDOUT); while ( my $log = ) { chomp($log); jcode::convert(\$log,'sjis','utf8'); my $csv; foreach ( split(/<>/,$log) ) { $csv .= "$_,"; } print "$csv\r\n"; } close(DAT); exit; # アップロード } elsif ($in{upload} && $in{upfile}) { require "lib/jacode.pl"; # ファイル名 my $fname = $cgi->param_filename("upfile"); if ($fname !~ /\.csv$/i) { error('CSVファイルのみアップロードできます。'); } my @log; foreach my $log ( split(/\r\n|\r|\n/,$in{upfile}) ) { jcode::convert(\$log,'utf8','sjis'); my $csv; foreach ( split(/,/,$log) ) { $csv .= "$_<>"; } push(@log,"$csv\n"); } # 上書き open(DAT,"+> $cf{datfile}") or error("write err: $cf{datfile}"); print DAT @log; close(DAT); message('CSVをアップ更新しました'); } header("メニューTOP > CSVダウン/アップロード"); back_btn(); print <■ CSVダウン/アップロード

商品データをCSV形式でダウンロードすることができます。

選択 注文日時 注文番号
$date$num
CSVダウンロード

商品データをCSV形式でアップロードすることができます。

CSVアップロード

【参考】CSVフォーマット
商品コード,商品名,単価,備考,戻り先,属性情報1,属性情報2, ... [改行]
↑上記で、属性情報とは「サイズ,カラー」等で、init.cgiで指定する\$cf{options}の個数分が続く。
(例)属性情報が「サイズ,カラー」であれば、商品コード,商品名,単価,備考,戻り先,サイズ,カラー [改行]

EOM exit; } #----------------------------------------------------------- # 入力チェック #----------------------------------------------------------- sub check_input { # 禁止文字排除 $in{code} =~ s/\W//g; $in{price} =~ s/\D//g; # 在庫のとき if ($cf{stock}) { $in{zai} =~ s/\D//g; if ($in{zai} eq "") { $in{zai} = 0; } } # 入力チェック my $err; if ($in{code} eq "") { $err .= "商品コードが未入力です
"; } if ($in{item} eq "") { $err .= "商品名が未入力です
"; } if ($in{price} eq "") { $err .= "商品単価が未入力です
"; } if ($err) { cgi_err($err); } } #----------------------------------------------------------- # パスワード認証 #----------------------------------------------------------- sub check_passwd { # パスワードが未入力の場合は入力フォーム画面 if ($in{pass} eq "") { enter_form(); # パスワード認証 } elsif ($in{pass} ne $cf{password}) { cgi_err("認証できません"); } } #----------------------------------------------------------- # 入室画面 #----------------------------------------------------------- sub enter_form { header("入室画面"); print <
管理パスワード入力


EOM exit; } #----------------------------------------------------------- # HTMLヘッダー #----------------------------------------------------------- sub header { my $ttl = shift; print < $ttl EOM } #----------------------------------------------------------- # 戻りボタン #----------------------------------------------------------- sub back_btn { my $mode = shift; print <
@{[ $mode ? qq|| : "" ]}
EOM } #----------------------------------------------------------- # エラー #----------------------------------------------------------- sub cgi_err { my $msg = shift; header("ERROR!"); print <

ERROR!

$msg


EOM exit; } #----------------------------------------------------------- # メッセージ表示 #----------------------------------------------------------- sub message { my ($msg,$btn) = @_; header("処理完了"); print <■ 処理完了

$msg

$btn
EOM exit; }