PHP実践戦闘_PHPチュートリアル3日目

WBOY
リリース: 2016-07-14 10:10:48
オリジナル
868 人が閲覧しました



レイアウトを新しくして、以前より快適になりました

jquery の特殊効果も変更され、テキストの色が美しい青色に変更されます。

[javascript] // JavaScript ドキュメント
$(document).ready(function(e) {
$user=$("div .user"); $text=$("div .text");
$("div .content").each(function(index){
$(this).mousemove(function(){

$user.eq(index).css("color","#0A8CD2");
// $user.eq(index).css("background","#FFE6AD"); // $text.eq(index).css("背景","#FFFDF6");
}).mouseout(function(){

$user.eq(index).css("color","#000");
// $user.eq(index).css("背景","#E6F0F9"); // $text.eq(index).css("背景","#F8FBFD"); }); });

});
//JavaScript ドキュメント
$(document).ready(function(e) {
$user=$("div .user");
$text=$("div .text");

$("div .content").each(function(index){
$(this).mousemove(function(){

$user.eq(index).css("color","#0A8CD2");

// $user.eq(index).css("background","#FFE6AD");

// $text.eq(index).css("background","#FFFDF6");


}).mouseout(function(){

$user.eq(index).css("color","#000");

// $user.eq(index).css("background","#E6F0F9");
// $text.eq(index).css("background","#F8FBFD");
});
});


});

型が int、長さが 11 の時刻フィールドがデータベースに追加されました。

メッセージを追加するときは、time() 関数を呼び出して ux タイムスタンプを返します。

データベースから読み取るときは、date()関数を呼び出します


[php] date('Y-m-d H:i:s',$value['time']);//タイムスタンプを日付に変換します

date('Y-m-d H:i:s',$value['time']);//タイムスタンプを日付に変換します
次に、ページングコードも追加しました


[php] 関数インデックス() {

「page.class.php」を含めます
                                          $rows = $this->db->count('select * from data');
$page = 新しいページ($rows, 5, "");
$page -> set("ヘッド", "メッセージ"); $page -> set("最初", "ホームページ")
-> set("前", "前のページ")
-> set("次", "次のページ")
-> set("最後のページ", "最後のページ");
$list=$this->db
->order('id DESC')
->limit($page->getLimit())
->select();
$this->assign("ページ",$page->fpage(0,3,4,5,6)); $this->assign("リスト",$リスト); $this->assign("title", "My Message Board") //タイトル変数をヘッダー テンプレート header.tpl に割り当てます


$this->display(); //テンプレート内の変数の置換とテンプレートページの出力を含みます
}

関数インデックス() {

「page.class.php」をインクルードします;

$rows = $this->db->count('select * from data');

$page = 新しいページ($rows, 5, "");

$page -> set("ヘッド", "メッセージ");

$page -> set("最初", "ホームページ")

-> set("前", "前のページ")
-> set("次", "次のページ")
-> set("最後のページ", "最後のページ");

$list=$this->db

->order('id DESC')
->limit($page->getLimit())
->select();

$this->assign("ページ",$page->fpage(0,3,4,5,6));
$this->assign("リスト",$リスト);
$this->assign("title", "My Message Board") //タイトル変数をヘッダーテンプレート header.tpl
に代入します。

$this->display(); //テンプレート内の変数の置換とテンプレートページの出力を含みます
}
効果はかなり良いです

page.class.phpのソースコードを添付します

[php] /**
ファイル: page.class.php
完璧なページングタイプのページ
@Weiliang QQ496928838 ​*/
クラスページ {
プライベート $total; プライベート $listRows; Private $ Limit; // SQL ステートメントはレコード数を制限するために limit 句を使用します
private $uri // URL のリクエストアドレスを自動取得します
; プライベート $pageNum; プライベート $page; private $config = array(
「ヘッド」=>「記録」、
'prev' => "前のページ"、
'next' => "次のページ"、
'first'=>「ホーム」、
「last」 => 「最後のページ」
                                                                                                                Private $ listnum = 10 // デフォルトのレイアウトリストで表示される番号
;
/**
コンストラクターメソッドでは、ページングクラスのプロパティを設定できます
@Param INT $ Total 計算中のページの合計レコード数
's's's 'to' t 't。 @Param Mixed $ Query は、配列またはクエリ文字列形式のターゲット ページへのパラメーターを選択できます
@param bool $ord オプション、デフォルト値は true、ページは最初のページから表示され、false は最後のページになります
                     */
public function __construct($total, $listRows=25, $query="", $ord=true){
$this->total = $total;            $this->listRows = $listRows; 
            $this->uri = $this->getUri($query); 
            $this->pageNum = ceil($this->total / $this->listRows); 
            /*以下判断用来設置当前面*/
            if(!empty($_GET["page"])) {
                $page = $_GET["ページ"]; 
            }その他{
                if($ord)
                    $ページ = 1; 
                その他
                    $page = $this->pageNum; 
            }
 
            if($total > 0) {
                if(preg_match('/D/', $page) ){
                    $this->ページ = 1; 
                }その他{
                    $this->page = $page; 
                }
            }その他{
                $this->ページ = 0; 
            }
             
            $this->limit = "LIMIT ".$this->getLimit(); 
        }
 
        /**
ページングを表示するための情報を設定するために使用され、一貫した操作を実行できます
@param string $param はメンバー属性配列 config の添字です
@param string $value は、構成の添字に対応する要素の値を設定するために使用されます
@Return Object このオブジェクト自体に戻ります $ this、操作に接続するために使用されます
                     */
        関数セット($param, $value){
            if(array_key_exists($param, $this->config)){
                $this->config[$param] = $value; 
            }
            $this を返します。 
        }
         
        /* 直接去调用ではなく、この方法により、オブジェクト外部で直接取得できるプロパティ制限とページの値を使用できます */
        関数 __get($args){
            if($args == "制限" || $args == "ページ")
                $this->$args; を返します。 
            その他
                null を返します。 
        } 
         
        /**
            按指定的格式输出分页
            @param  int 0-7的数字分别作为参数,用于自定义输出分页结构和调整结构的顺序,默认输出全部结构
            @return string  分页信息内容
         */ 
        function fpage(){ 
            $arr = func_get_args(); 
 
            $html[0] = " 共 {$this->total} {$this->config["head"]} "; 
            $html[1] = " 本页 ".$this->disnum()." 条 "; 
            $html[2] = " 本页从 {$this->start()}-{$this->end()} 条 "; 
            $html[3] = " {$this->page}/{$this->pageNum}页 "; 
            $html[4] = $this->firstprev(); 
            $html[5] = $this->pageList(); 
            $html[6] = $this->nextlast(); 
            $html[7] = $this->goPage(); 
 
            $fpage = '

'; 
            if(count($arr) < 1)
$arr = array(0, 1,2,3,4,5,6,7);

for($i = 0; $i < count($arr); $i++)
$fpage .= $html[$arr[$i]];

$fpage .= '
'; $fpage を返す
}

/* 形式は 1,5,*/
関数 getLimit(){
If($this->ページ > 0)
return ($this->page-1)*$this->listRows.", {$this->listRows}"; その他
0 を返す
}

/* オブジェクト内で使用されるプライベート メソッド。アクセスされた現在の URL を自動的に取得するために使用されます */
プライベート関数 getUri($query){
$request_uri = $_SERVER["REQUEST_URI"]; $url = strstr($request_uri,'?') $request_uri : $request_uri.'?';                                           if(is_array($query))
$url .= http_build_query($query); else if($query != "")
$url .= "&".trim($query, "?&");
$arr = parse_url($url);
If(isset($arr["クエリ"])){
parse_str($arr["query"], $arrs); unset($arrs["page"]); $url = $arr["path"].'?'.http_build_query($arrs);                                                                                                                  If(strstr($url, '?')) {
If(substr($url, -1)!='?')
$url = $url.'&'; }その他{
$url = $url.'?';                                                                                                                  $url を返します
}

/* オブジェクト内で使用されるプライベート メソッド。現在のページの先頭にあるレコード数を取得するために使用されます */
プライベート関数 start(){
If($this->total == 0)
0 を返す
その他
return ($this->page-1) * $this->listRows+1; }

/* 現在のページの末尾のレコード数を取得するためにオブジェクト内で使用されるプライベート メソッド */
プライベート関数 end(){
return min($this->page * $this->listRows, $this->total
); }

/* オブジェクト内で使用されるプライベートメソッド。前のページとホームページの操作情報を取得するために使用されます */
プライベート関数 firstprev(){
If($this->ページ > 1) {
$str = " {$this->config["first"]} "; $str .= "{$this->config["prev"] };
$str; を返します。                                                                       
}

/* ページ番号リスト情報を取得するためにオブジェクト内で使用されるプライベート メソッド */
プライベート関数 pageList(){
$linkPage = " ";                                           $inum = フロア($this->listNum/2); /*現在のページの前にリスト
for($i = $inum; $i >= 1; $i--){
$page = $this->page-$i;
if($ page&gt; = 1)
$linkPage .= "{$page} ";                                                                        /*現在のページの情報*/
If($this->pageNum > 1)
$linkPage .= "{$this->page} ";                                           / *現在のページの後ろにあるリスト * /
for($i=1; $i $page = $this->page+$i; If($page pageNum)
$linkPage .= "{$page} "; それ以外 休憩
                                                                       $linkPage .= '
'; $linkPage を返す
}

/* 次のページと最後のページの操作情報を取得するためにオブジェクト内で使用されるプライベート メソッド */
プライベート関数 nextlast(){
            if($this->page != $this->pageNum) {
                $str = " {$this->config["next"]}  
                $str .= " {$this->config["last"]}< ;/a> "; 
                $str を返します。 
            }
        }
 
        /* オブジェクト内部で使用される、表の表示と処理に使用される私有メソッド */
        プライベート関数 goPage(){
                if($this->pageNum > 1) {
                return ' '; 
            }
        }
 
        /* オブジェクトの内部で使用される私有メソッド、本表示の记录条数を取得するために使用されます */
        プライベート関数 disnum(){
            if($this->total > 0){
                return $this->end()-$this->start()+1; 
            }その他{
                0を返します。 
            }
        }
    }
 
     
     
     

 /**
ファイル: page.class.php
完璧なページングタイプのページ
@微クールQQ496928838
​*/
 クラスページ{
  プライベート $total;          //データ表中总记录数
  プライベート $listRows;       //每页显表示行数
  プライベート $limit;          //SQL 句句使用制限、制限获取记录个数
  プライベート $uri;            //自動获取urlの请求地址
  プライベート $pageNum;        //总页数
  プライベート$ページ;       //当前页
  private $config = array(
       '頭' => "条记录"、
       '前' => "上一页"、
       '次' => "次の一页"、
       '最初'=> "首页"、
       '最後' => 「末页」
      );       //分別情報に表示されるコンテンツは、set() メソッドによって設定できます
  プライベート $listNum = 10;      //默认分页列表に表示される数

  /**
   构造方法,可以设置分页类的属性
   @param int $total  计算分页的总记录数
   @param int $listRows 可选的,设置每页需要显示的记录数,默认为25条
   @param mixed $query 可选的,为向目标页面传递参数,可以是数组,也可以是查询字符串格式
   @param  bool $ord 可选的,默认值为true, 页面从第一页开始显示,false则为最后一页
   */
  public function __construct($total, $listRows=25, $query="", $ord=true){
   $this->total = $total;
   $this->listRows = $listRows;
   $this->uri = $this->getUri($query);
   $this->pageNum = ceil($this->total / $this->listRows);
   /*以下判断用来设置当前面*/
   if(!empty($_GET["page"])) {
    $page = $_GET["page"];
   }else{
    if($ord)
     $page = 1;
    else
     $page = $this->pageNum;
   }

   if($total > 0) {
    if(preg_match('/\D/', $page) ){
     $this->page = 1;
    }else{
     $this->page = $page;
    }
   }else{
    $this->page = 0;
   }
   
   $this->limit = "LIMIT ".$this->getLimit();
  }

  /**
   用于设置显示分页的信息,可以进行连贯操作
   @param string $param 是成员属性数组config的下标
   @param string $value 用于设置config下标对应的元素值
   @return object   返回本对象自己$this, 用于连惯操作
   */
  function set($param, $value){
   if(array_key_exists($param, $this->config)){
    $this->config[$param] = $value;
   }
   return $this;
  }
  
  /* 不是直接去调用,通过该方法,可以使用在对象外部直接获取私有成员属性limit和page的值 */
  function __get($args){
   if($args == "limit" || $args == "page")
    return $this->$args;
   else
    return null;
  }
  
  /**
   按指定的格式输出分页
   @param int 0-7的数字分别作为参数,用于自定义输出分页结构和调整结构的顺序,默认输出全部结构
   @return string 分页信息内容
   */
  function fpage(){
   $arr = func_get_args();

   $html[0] = " 共 {$this->total} {$this->config["head"]} ";
   $html[1] = " 本页 ".$this->disnum()." 条 ";
   $html[2] = " 本页从 {$this->start()}-{$this->end()} 条 ";
   $html[3] = " {$this->page}/{$this->pageNum}页 ";
   $html[4] = $this->firstprev();
   $html[5] = $this->pageList();
   $html[6] = $this->nextlast();
   $html[7] = $this->goPage();

   $fpage = '

';
   if(count($arr) < 1)
$arr = array(0, 1,2,3,4,5,6,7);

for($i = 0; $i < count($arr); $i++)
$fpage .= $html[$arr[$i]];

$fpage .= '
';
$fpage を返します;
}

/* 形式は 1,5,*/
関数 getLimit(){
if($this->ページ > 0)
Return ($this->page-1)*$this->listRows.", {$this->listRows}";
それ以外
0 を返す;
}

/* アクセスした現在の URL を自動的に取得するためにオブジェクト内で使用されるプライベート メソッド */
プライベート関数 getUri($query){
$request_uri = $_SERVER["REQUEST_URI"]
$url = strstr($request_uri,'?') ? $request_uri : $request_uri.'?';

If(is_array($query))
$url .= http_build_query($query);
else if($query != "")
$url .= "&".trim($query, "?&");

$arr = parse_url($url);

if(isset($arr["query"])){
Parse_str($arr["クエリ"], $arrs);
unset($arrs["ページ"]);
$url = $arr["path"].'?'.http_build_query($arrs);
}

if(strstr($url, '?')) {
If(substr($url, -1)!='?')
$url = $url.'&';
}その他{
$url = $url.'?';
}

$url を返します;
}

/* 現在のページから始まるレコード数を取得するためにオブジェクト内で使用されるプライベート メソッド */
プライベート関数 start(){
if($this->total == 0)
0 を返す;
それ以外
Return ($this->page-1) * $this->listRows+1;
}

/* 現在のページの末尾にあるレコード数を取得するためにオブジェクト内で使用されるプライベート メソッド */
プライベート関数 end(){
Return min($this->page * $this->listRows, $this->total);
}

/* 前ページとホームページの操作情報を取得するためにオブジェクト内で使用されるプライベートメソッド */
プライベート関数 firstprev(){
if($this->ページ > 1) {
$str = "
{$this->config["first"]} ";
$str .= "{$this->config["prev"] }
; $str;
を返します }

}

/* ページリスト情報を取得するためにオブジェクト内で使用されるプライベートメソッド */
プライベート関数 pageList(){
$linkPage = " ";

$inum = フロア($this->listNum/2);
/*現在のページの前のリスト */
for($i = $inum; $i >= 1; $i--){
$page = $this->page-$i;

if($page >= 1)
$linkPage .= "{$page} ";
}
/*現在のページの情報*/
if($this->pageNum > 1)
$linkPage .= "{$this->page} ";

/*現在のページの後ろにあるリスト */
for($i=1; $i $page = $this->page+$i;
If($page pageNum)
$linkPage .= "{$page} ";
それ以外
休憩
}
$linkPage .= '
';
$linkPage を返します;
}

/* 次のページと最後のページの操作情報を取得するためにオブジェクト内で使用されるプライベート メソッド */
プライベート関数 nextlast(){
if($this->page != $this->pageNum) {
$str = " {$this->config["next"]} ;
$str .= " {$this->config["last"]}< ;/a> ";
$str;
を返します }
}

/* フォームジャンプページを表示および処理するためにオブジェクト内で使用されるプライベートメソッド */
プライベート関数 goPage(){
If($this->pageNum > 1) {
return ' ';
}
}

/* このページに表示されるレコード数を取得するためにオブジェクト内で使用されるプライベート メソッド */
プライベート関数 disnum(){
if($this->合計 > 0){
$this->end()-$this->start()+1;
を返す }その他{
0 を返す;
}
}
}




これは非常に強力なページング クラスですが、見た目は少し悪くなりますが、変更することができます

Mysql.class.php 1 つのパラメータと 2 つのパラメータをサポートできるように、limit メソッドを変更しました。これにより、操作がより便利になります


[php] パブリック関数limit($offset,$length=null){
If (is_null($length)) {
$this->query_list['limit']='limit '.$offset;
$this を返します。 }その他{
If(!isset($length)){
$length = $offset; $offset = 0; }
$this->query_list['limit'] = '制限 '.$offset.','.$length; $this を返します。 }

パブリック関数制限($offset,$length=null){
if (is_null($length)) {
$this->query_list['limit']='limit '.$offset;
$this を返します;

}その他{

If(!isset($length)){
$length = $offset;
$オフセット = 0;
}
$this->query_list['limit'] = '制限 '.$offset.','.$length;
$this を返します;
}




タイムゾーンの設定方法も学びました。

[php] date_default_timezone_set("PRC") //タイムゾーンを設定します (中国

)

date_default_timezone_set("PRC") //タイムゾーンを設定します (中国

)


mytpl.class.php テンプレート エンジンは、オーバーフローなどを引き起こさないように変更されました


[php] /**
ファイル: mytpl.class.php クラス名はMyTpl、カスタムテンプレートエンジンです
このタイプのオブジェクトを通じてテンプレート ファイルをロードして解析し、解析結果を出力します
@WeiliangQQ496928838 ​*/
クラス MyTpl {
Public $template_dir = 'view' //テンプレートファイルを保存するディレクトリを定義します
; Public $compile_dir = 'view_c' //テンプレートエンジンで結合後のファイル格納ディレクトリを定義します
; Public $left_delimiter = '<{' //動的データ変数の左区切り文字をテンプレートに埋め込みます
; Public $right_delimiter = '}>' //動的データ変数の右区切り文字をテンプレートに埋め込みます
Private $ tpl_vars = array () // 内部で使用される一時変数
;
/**
PHP で割り当てられた値はメンバー属性 $tpl_vars に保存され、ボード内の対応する変数を置き換えるために使用されます
@Param String $ TPL_VAR には、テンプレート内の変数名に対応する、関連付けられた配列入札として文字列パラメータが必要です @Param Mixed $ Value には、テンプレート内の変数の値を割り当てるために使用される値型の値が必要です
​​​​*/
関数 assign($tpl_var, $value = null) {
If ($tpl_var != ''){
$GLOBALS[$tpl_var] = $value; ​​​​​​​​​                                                                                                                        


}

/**
指定したディレクトリにテンプレートファイルをロードし、置き換えた内容を保存して、別の指定したディレクトリに結合ファイルを生成します
@param string $fileName テンプレート ファイルのファイル名を提供します ​​​​*/
関数表示($fileName) {
/* 指定されたディレクトリでテンプレート ファイルを検索します */
$tplFile = $this->template_dir.'/'.$fileName; /* 処理対象のテンプレート ファイルが存在しない場合は、終了してエラーを報告します */
If(!file_exists($tplFile)) { die("テンプレート ファイル {$tplFile} が存在しません!");                                                                       /* 結合されたテンプレート ファイルを取得します。このファイルの内容は置き換えられています */
$fileNameMd5 = md5($fileName);
$comFileName = $this->compile_dir."/com_".$fileNameMd5.'.php'; / * 置換後のファイルが存在するか、存在するが変更されているかを判断し、再作成する必要があります * /
If(!file_exists($comFileName) || filemtime($comFileName) < filemtime($tplFile)) {
/* 内部置換テンプレートメソッドを呼び出します */ $repContent = $this->tpl_replace(file_get_contents($tplFile)); / * システム結合後にスクリプトファイルを保存 * /
file_put_contents($comFileName, $repContent);                                                                        /* 処理されたテンプレート ファイルが含まれ、クライアントに出力されます */
include($comFileName); }

/**
正規表現を使用してテンプレート ファイル '<{ }>' 内のステートメントを対応する値または PHP コードに置き換える、内部で使用されるプライベート メソッド
@param string $content テンプレート ファイルから読み取られたコンテンツ文字列全体を提供します
@Return $ repcontent 置換文字列に戻ります
​​​​*/
プライベート関数 tpl_replace($content) {
/* 左右の区切り記号のうち、通常の効果を持つ特殊記号をエスケープします。たとえば、<{ }>Escape<{ }> $left = preg_quote($this->left_delimiter, '/'); $right = preg_quote($this->right_delimiter, '/');
/* テンプレート内のさまざまな識別子に一致する正規表現のパターン配列 */
$pattern = array( / * テンプレート内の一致する変数 (例: "& lt; {$ var} & gt;" * /
) '/'.$left.'s*$([a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)s*'.$right.'/i', / * テンプレート内の IF 識別子と一致します。「& lt; {if $ color ==" sex "} & gt; & lt; { /if} & gt; * /

」 '/'.$left.'s*ifs*(.+?)s*'.$right.'(.+?)'.$left.'s*/ifs*'.$right.'/ies' 、
/ * 「& lt; {elseif $ color ==" sex "} & gt;」などの elseif 識別子と一致します。 '/'.$left.'s*elses*ifs*(.+?)s*'.$right.'/ies',
/ * 「& lt; {else} & gt;」などの Else 識別子と一致します * /
'/'.$left.'s*elses*'。 /* テンプレート内のループ識別子と一致するために使用され、配列内の値を走査するために使用されます。例: "<{ loop $arrs $value }> <{ /loop}>" */
'/'.$left.'s*loops+$(S+)s+$([a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)s*'.$right.'(. +?)'.$left.'s*/loops*'.$right.'/is',
/* 「<{ loop $arrs $key => $value }> <{ /loop}>」 など、配列内のキーと値を走査するために使用されます。 '/'.$left.'s*loops+$(S+)s+$([a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)s*=>s*$(S+ )s*'.$right.'(.+?)'.$left.'s*/loop s*'.$right.'/is',
/ * インクルード識別子と一致します。例: '& lt; {include "header.html"} & gt;' 「 );
                                          /* 正規表現を使用して、テンプレートから一致した文字列配列を置き換えます */
$replacement = array(
/ * テンプレート内の変数を置き換えます & lt;? PHP Echo $ this-& gt; /
; 'tpl_vars["${1}"]; /* テンプレート内の if 文字列を置き換えます ‘$this->stripvtags('','${2}')', / * Elseif の文字列を置き換えます & lt;? elseif ($ color == "sex") {? ‘$this->stripvtags('',"")',
/* else 文字列を置き換えます '', /* 次の 2 つの項目は、テンプレート内のループ識別子を foreach 形式に置き換えるために使用されます */
'tpl_vars["${1}"] as $this->tpl_vars["${2}"]) { ?>${3}'、
'tpl_vars["${1}"] as $this->tpl_vars["${2}"] =>$this->tpl_vars["${3 }"]) { ?>${4}',
/*インクルード文字列を置き換えます*/
'file_get_contents($this->template_dir."/'.$GLOBALS['className'].'/${1}")'
                                                                 );
                                          通常の置換機能によって処理される */
$s_content=$content;
$repContent = preg_replace($pattern, $replacement, $content); /* 置換する識別子がまだある場合は、再帰的に自分自身を呼び出して再度置換します */
If(preg_match('/'.$left.'([^('.$right.')]{1,})'.$right.'/', $repContent)) { If($s_content==$content) {
$repContent = $this->tpl_replace($repContent);                                                                                                                                                   /* 置換された文字列を返します */

$repContent を返します。 }

/**
内部で使用されるプライベート メソッドは、条件ステートメントで使用される変数を対応する値に置き換えるために使用されます
使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用するアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトアウトオーバー                              

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート