当前位置: 首页>>代码示例>>PHP>>正文


PHP SC_Helper_DB_Ex::sfRankDown方法代码示例

本文整理汇总了PHP中SC_Helper_DB_Ex::sfRankDown方法的典型用法代码示例。如果您正苦于以下问题:PHP SC_Helper_DB_Ex::sfRankDown方法的具体用法?PHP SC_Helper_DB_Ex::sfRankDown怎么用?PHP SC_Helper_DB_Ex::sfRankDown使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在SC_Helper_DB_Ex的用法示例。


在下文中一共展示了SC_Helper_DB_Ex::sfRankDown方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的PHP代码示例。

示例1: process

 /**
  * Page のプロセス.
  *
  * @return void
  */
 function process()
 {
     $conn = new SC_DBConn();
     $objView = new SC_AdminView();
     $objSess = new SC_Session();
     $objDb = new SC_Helper_DB_Ex();
     // 認証可否の判定
     SC_Utils_Ex::sfIsSuccess($objSess);
     if (!isset($_POST['mode'])) {
         $_POST['mode'] = "";
     }
     switch ($_POST['mode']) {
         case 'delete':
             // ランク付きレコードの削除
             $objDb->sfDeleteRankRecord("dtb_payment", "payment_id", $_POST['payment_id']);
             // 再表示
             $this->reload();
             break;
         case 'up':
             $objDb->sfRankUp("dtb_payment", "payment_id", $_POST['payment_id']);
             // 再表示
             $this->reload();
             break;
         case 'down':
             $objDb->sfRankDown("dtb_payment", "payment_id", $_POST['payment_id']);
             // 再表示
             $this->reload();
             break;
     }
     $this->arrDelivList = $objDb->sfGetIDValueList("dtb_deliv", "deliv_id", "service_name");
     $this->arrPaymentListFree = $this->lfGetPaymentList(2);
     $objView->assignobj($this);
     $objView->display(MAIN_FRAME);
 }
开发者ID:khrisna,项目名称:eccubedrm,代码行数:39,代码来源:LC_Page_Admin_Basis_Payment.php

示例2: process

 /**
  * Page のプロセス.
  *
  * @return void
  */
 function process()
 {
     $conn = new SC_DBConn();
     $objView = new SC_AdminView();
     $objSess = new SC_Session();
     $objDb = new SC_Helper_DB_Ex();
     // 認証可否の判定
     SC_Utils_Ex::sfIsSuccess($objSess);
     $this->tpl_pageno = isset($_POST['pageno']) ? $_POST['pageno'] : "";
     // 通常時は親カテゴリを0に設定する。
     $this->arrForm['parent_category_id'] = isset($_POST['parent_category_id']) ? $_POST['parent_category_id'] : 0;
     if (!isset($_POST['mode'])) {
         $_POST['mode'] = "";
     }
     switch ($_POST['mode']) {
         case 'up':
             $where = "category_id = " . SC_Utils_Ex::sfQuoteSmart($_POST['parent_category_id']);
             $objDb->sfRankUp("dtb_product_categories", "product_id", $_POST['product_id'], $where);
             break;
         case 'down':
             $where = "category_id = " . SC_Utils_Ex::sfQuoteSmart($_POST['parent_category_id']);
             $objDb->sfRankDown("dtb_product_categories", "product_id", $_POST['product_id'], $where);
             break;
         case 'move':
             $key = "pos-" . $_POST['product_id'];
             $input_pos = mb_convert_kana($_POST[$key], "n");
             if (SC_Utils_Ex::sfIsInt($input_pos)) {
                 $where = "category_id = " . SC_Utils_Ex::sfQuoteSmart($_POST['parent_category_id']);
                 $objDb->sfMoveRank("dtb_product_categories", "product_id", $_POST['product_id'], $input_pos, $where);
             }
             break;
         case 'tree':
             // カテゴリの切替は、ページ番号をクリアする。
             $this->tpl_pageno = "";
             break;
         default:
             break;
     }
     $this->arrTree = $objDb->sfGetCatTree($this->arrForm['parent_category_id']);
     $this->arrProductsList = $this->lfGetProduct($this->arrForm['parent_category_id']);
     $objView->assignobj($this);
     $objView->display(MAIN_FRAME);
 }
开发者ID:khrisna,项目名称:eccubedrm,代码行数:48,代码来源:LC_Page_Admin_Products_ProductRank.php

示例3: process

 /**
  * Page のプロセス.
  *
  * @return void
  */
 function process()
 {
     $conn = new SC_DBConn();
     $objView = new SC_AdminView();
     $objSess = new SC_Session();
     $objQuery = new SC_Query();
     $objDb = new SC_Helper_DB_Ex();
     // 認証可否の判定
     SC_Utils_Ex::sfIsSuccess($objSess);
     if (!isset($_POST['mode'])) {
         $_POST['mode'] = "";
     }
     switch ($_POST['mode']) {
         case 'delete':
             // ランク付きレコードの削除
             $objDb->sfDeleteRankRecord("dtb_deliv", "deliv_id", $_POST['deliv_id']);
             // 再表示
             SC_Utils_Ex::sfReload();
             break;
         case 'up':
             $objDb->sfRankUp("dtb_deliv", "deliv_id", $_POST['deliv_id']);
             // 再表示
             SC_Utils_Ex::sfReload();
             break;
         case 'down':
             $objDb->sfRankDown("dtb_deliv", "deliv_id", $_POST['deliv_id']);
             // 再表示
             SC_Utils_Ex::sfReload();
             break;
         default:
             break;
     }
     // 配送業者一覧の取得
     $col = "deliv_id, name, service_name";
     $where = "del_flg = 0";
     $table = "dtb_deliv";
     $objQuery->setorder("rank DESC");
     $this->arrDelivList = $objQuery->select($col, $table, $where);
     $objView->assignobj($this);
     $objView->display(MAIN_FRAME);
 }
开发者ID:khrisna,项目名称:eccubedrm,代码行数:46,代码来源:LC_Page_Admin_Basis_Delivery.php

示例4: rankDown

 /**
  * 支払方法の表示順をひとつ下げる.
  *
  * @param  integer $payment_id 支払方法ID
  * @return void
  */
 public function rankDown($payment_id)
 {
     $objDb = new SC_Helper_DB_Ex();
     $objDb->sfRankDown('dtb_payment', 'payment_id', $payment_id);
 }
开发者ID:casan,项目名称:eccube-2_13,代码行数:11,代码来源:SC_Helper_Payment.php

示例5: action

 /**
  * Page のアクション.
  *
  * @return void
  */
 function action()
 {
     $objFormParam = new SC_FormParam_Ex();
     $this->lfInitParam($objFormParam);
     $objFormParam->setParam($_POST);
     $objFormParam->convParam();
     $objQuery =& SC_Query_Ex::getSingletonInstance();
     $objDb = new SC_Helper_DB_Ex();
     switch ($this->getMode()) {
         case 'down':
             //商品の並び替えをする。おすすめはデータベースの登録が昇順なので、Modeを逆にする。
             $arrRet = $objQuery->select('best_id', 'dtb_best_products', 'rank = ?', array($_POST['rank']));
             //おすすめidの取得
             $best_id = $arrRet[0]['best_id'];
             $objDb->sfRankUp('dtb_best_products', 'best_id', $best_id);
             $arrPost = $objFormParam->getHashArray();
             $arrItems = $this->getRecommendProducts();
             break;
         case 'up':
             //商品の並び替えをする。おすすめのみデータベースの登録が昇順なので、Modeを逆にする。
             $arrRet = $objQuery->select('best_id', 'dtb_best_products', 'rank = ?', array($_POST['rank']));
             //おすすめidの取得
             $best_id = $arrRet[0]['best_id'];
             $objDb->sfRankDown('dtb_best_products', 'best_id', $best_id);
             $arrPost = $objFormParam->getHashArray();
             $arrItems = $this->getRecommendProducts();
             break;
         case 'regist':
             // 商品を登録する。
             $this->arrErr = $this->lfCheckError($objFormParam);
             $arrPost = $objFormParam->getHashArray();
             // 登録処理にエラーがあった場合は商品選択の時と同じ処理を行う。
             if (SC_Utils_Ex::isBlank($this->arrErr)) {
                 $member_id = $_SESSION['member_id'];
                 $this->insertRecommendProduct($arrPost, $member_id);
                 $arrItems = $this->getRecommendProducts();
             } else {
                 $arrItems = $this->setProducts($arrPost, $arrItems);
                 $this->checkRank = $arrPost['rank'];
             }
             $this->tpl_onload = "window.alert('編集が完了しました');";
             break;
         case 'delete':
             // 商品を削除する。
             $this->arrErr = $this->lfCheckError($objFormParam);
             $arrPost = $objFormParam->getHashArray();
             if (SC_Utils_Ex::isBlank($this->arrErr)) {
                 $this->deleteProduct($arrPost);
                 $arrItems = $this->getRecommendProducts();
             }
             $this->tpl_onload = "window.alert('削除しました');";
             break;
         case 'set_item':
             // 商品を選択する。
             $this->arrErr = $this->lfCheckError($objFormParam);
             $arrPost = $objFormParam->getHashArray();
             if (SC_Utils_Ex::isBlank($this->arrErr['rank']) && SC_Utils_Ex::isBlank($this->arrErr['product_id'])) {
                 $arrItems = $this->setProducts($arrPost, $this->getRecommendProducts());
                 $this->checkRank = $arrPost['rank'];
             }
             break;
         default:
             $arrItems = $this->getRecommendProducts();
             break;
     }
     $this->category_id = intval($arrPost['category_id']);
     $this->arrItems = $arrItems;
     // カテゴリ取得
     $objDb = new SC_Helper_DB_Ex();
     $this->arrCatList = $objDb->sfGetCategoryList('level = 1');
 }
开发者ID:nassos9090,项目名称:plugin,代码行数:76,代码来源:LC_Page_Admin_Contents_Recommend.php

示例6: action

 /**
  * Page のアクション.
  *
  * @return void
  */
 function action()
 {
     $servername = "localhost";
     $username = "root";
     $password = "1234";
     $dbname = "rise_up_shop";
     // Create connection
     $conn = new mysqli($servername, $username, $password, $dbname);
     // Check connection
     if ($conn) {
         $sql = "SELECT * FROM dtb_brand";
         $result = mysqli_query($conn, $sql);
         $arr = [];
         $i = 0;
         while ($row = mysqli_fetch_object($result)) {
             $arr[$i]['brand_id'] = $row->brand_id;
             $arr[$i]['name'] = $row->name;
             $arr[$i]['image_path'] = $row->image_path;
             $arr[$i]['description'] = $row->description;
             $arr[$i]['email'] = $row->email;
             $arr[$i]['address'] = $row->address;
             $arr[$i]['website'] = $row->website;
             $i++;
         }
         $this->arrResults = $arr;
     }
     $objDb = new SC_Helper_DB_Ex();
     $objDate = new SC_Date_Ex();
     $this->arrMonth = $objDate->getMonth();
     $this->arrDay = $objDate->getDay();
     $mode = $this->getMode();
     if (!empty($_POST)) {
         $objFormParam = new SC_FormParam_Ex();
         $objFormParam->setParam($_POST);
         $objFormParam->convParam();
         $brand_id = $objFormParam->getValue('brand_id');
         if (!empty($this->arrErr['brand_id'])) {
             trigger_error('', E_USER_ERROR);
             return;
         }
         $post = $objFormParam->getHashArray();
     }
     // 要求判定
     switch ($mode) {
         // 編集処理
         case 'edit':
             // POST値の引き継ぎ
             $this->arrForm = $this->arrForm = $_POST;
             if (count($this->arrErr) <= 0) {
                 // 新規作成
                 if ($post['brand_id'] == '') {
                     $this->lfInsertClass($this->arrForm, $_SESSION['member_id']);
                 } else {
                     $this->lfUpdateClass($this->arrForm, $post['brand_id']);
                 }
                 // 再表示
                 $this->objDisplay->reload();
             } else {
                 // POSTデータを引き継ぐ
                 $this->tpl_brand_id = $post['brand_id'];
             }
             break;
         case 'down':
             $objDb->sfRankDown('dtb_brand', 'brand_id', $post['brand_id']);
             // 再表示
             $this->objDisplay->reload();
             break;
         case 'up':
             $objDb->sfRankUp('dtb_brand', 'brand_id', $post['brand_id']);
             // 再表示
             $this->objDisplay->reload();
             break;
         default:
             break;
     }
     $this->tpl_brand_id = $brand_id;
 }
开发者ID:Rise-Up-Cambodia,项目名称:Rise-Up,代码行数:82,代码来源:LC_Page_Admin_Brand_brand.php

示例7: action

 /**
  * Page のアクション.
  *
  * @return void
  */
 function action()
 {
     $objDb = new SC_Helper_DB_Ex();
     $mode = $this->getMode();
     if (!empty($_POST)) {
         $objFormParam = new SC_FormParam_Ex();
         $objFormParam->addParam('配送業者ID', 'payment_id', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
         $objFormParam->setParam($_POST);
         $objFormParam->convParam();
         $arrErr = $objFormParam->checkError();
         if (!empty($this->arrErr['payment_id'])) {
             trigger_error('', E_USER_ERROR);
             return;
         }
         $post = $objFormParam->getHashArray();
     }
     switch ($this->getMode()) {
         case 'delete':
             // ランク付きレコードの削除
             $objDb->sfDeleteRankRecord('dtb_payment', 'payment_id', $post['payment_id']);
             // 再表示
             $this->objDisplay->reload();
             break;
         case 'up':
             $objDb->sfRankUp('dtb_payment', 'payment_id', $post['payment_id']);
             // 再表示
             $this->objDisplay->reload();
             break;
         case 'down':
             $objDb->sfRankDown('dtb_payment', 'payment_id', $post['payment_id']);
             // 再表示
             $this->objDisplay->reload();
             break;
     }
     $this->arrDelivList = $objDb->sfGetIDValueList('dtb_deliv', 'deliv_id', 'service_name');
     $this->arrPaymentListFree = $this->lfGetPaymentList();
 }
开发者ID:nassos9090,项目名称:plugin,代码行数:42,代码来源:LC_Page_Admin_Basis_Payment.php

示例8: process

 /**
  * Page のプロセス.
  *
  * @return void
  */
 function process()
 {
     $conn = new SC_DBConn();
     $objView = new SC_AdminView();
     $objQuery = new SC_Query();
     $objDb = new SC_Helper_DB_Ex();
     // 認証可否の判定
     $objSess = new SC_Session();
     SC_Utils_Ex::sfIsSuccess($objSess);
     $get_check = false;
     // 規格IDのチェック
     if (SC_Utils_Ex::sfIsInt($_GET['class_id'])) {
         // 規格名の取得
         $this->tpl_class_name = $objQuery->get("dtb_class", "name", "class_id = ?", array($_GET['class_id']));
         if ($this->tpl_class_name != "") {
             // 規格IDの引き継ぎ
             $this->arrHidden['class_id'] = $_GET['class_id'];
             $get_check = true;
         }
     }
     if (!$get_check) {
         // 規格登録ページに飛ばす。
         $this->sendRedirect($this->getLocation(URL_CLASS_REGIST));
         exit;
     }
     if (!isset($_POST['mode'])) {
         $_POST['mode'] = "";
     }
     if (isset($_POST['class_id'])) {
         if (!SC_Utils_Ex::sfIsInt($_POST['class_id'])) {
             SC_Utils_Ex::sfDispError("");
         }
     }
     // 新規作成 or 編集
     switch ($_POST['mode']) {
         // 登録ボタン押下
         case 'edit':
             // POST値の引き継ぎ
             $this->arrForm = $_POST;
             // 入力文字の変換
             $_POST = $this->lfConvertParam($_POST);
             // エラーチェック
             $this->arrErr = $this->lfErrorCheck();
             if (count($this->arrErr) <= 0) {
                 if ($_POST['classcategory_id'] == "") {
                     $this->lfInsertClass();
                     // DBへの書き込み
                 } else {
                     $this->lfUpdateClass();
                     // DBへの書き込み
                 }
                 // 再表示
                 $this->reload($_GET['class_id']);
                 //sfReload("class_id=" . $_GET['class_id']);
             } else {
                 // POSTデータを引き継ぐ
                 $this->tpl_classcategory_id = $_POST['classcategory_id'];
             }
             break;
             // 削除
         // 削除
         case 'delete':
             // ランク付きレコードの削除
             $where = "class_id = " . SC_Utils_Ex::sfQuoteSmart($_POST['class_id']);
             $objDb->sfDeleteRankRecord("dtb_classcategory", "classcategory_id", $_POST['classcategory_id'], $where, true);
             break;
             // 編集前処理
         // 編集前処理
         case 'pre_edit':
             // 編集項目をDBより取得する。
             $where = "classcategory_id = ?";
             $name = $objQuery->get("dtb_classcategory", "name", $where, array($_POST['classcategory_id']));
             // 入力項目にカテゴリ名を入力する。
             $this->arrForm['name'] = $name;
             // POSTデータを引き継ぐ
             $this->tpl_classcategory_id = $_POST['classcategory_id'];
             break;
         case 'down':
             $where = "class_id = " . SC_Utils_Ex::sfQuoteSmart($_POST['class_id']);
             $objDb->sfRankDown("dtb_classcategory", "classcategory_id", $_POST['classcategory_id'], $where);
             break;
         case 'up':
             $where = "class_id = " . SC_Utils_Ex::sfQuoteSmart($_POST['class_id']);
             $objDb->sfRankUp("dtb_classcategory", "classcategory_id", $_POST['classcategory_id'], $where);
             break;
         default:
             break;
     }
     // 規格分類の読込
     $where = "del_flg <> 1 AND class_id = ?";
     $objQuery->setorder("rank DESC");
     $this->arrClassCat = $objQuery->select("name, classcategory_id", "dtb_classcategory", $where, array($_GET['class_id']));
     $objView->assignobj($this);
     $objView->display(MAIN_FRAME);
 }
开发者ID:khrisna,项目名称:eccubedrm,代码行数:100,代码来源:LC_Page_Admin_Products_ClassCategory.php

示例9: lfRankChange

 /**
  * メーカー情報順番変更.
  *
  * @param  integer $maker_id メーカーID
  * @param  string  $mode up か down のモードを示す文字列
  * @return void
  */
 function lfRankChange($maker_id, $mode)
 {
     $objDb = new SC_Helper_DB_Ex();
     switch ($mode) {
         case 'up':
             $objDb->sfRankUp("dtb_maker", "maker_id", $maker_id);
             break;
         case 'down':
             $objDb->sfRankDown("dtb_maker", "maker_id", $maker_id);
             break;
         default:
             break;
     }
 }
开发者ID:nanasess,项目名称:ec-azure,代码行数:21,代码来源:LC_Page_Admin_Products_Maker.php

示例10: lfDownRank

 /**
  * 並び順を下げる
  *
  * @param integer $class_id 規格ID
  * @return void
  */
 function lfDownRank($class_id)
 {
     $objDb = new SC_Helper_DB_Ex();
     $objDb->sfRankDown("dtb_class", "class_id", $class_id);
 }
开发者ID:nanasess,项目名称:ec-azure,代码行数:11,代码来源:LC_Page_Admin_Products_Class.php

示例11: action

 /**
  * Page のアクション.
  *
  * @return void
  */
 function action()
 {
     $objDb = new SC_Helper_DB_Ex();
     $objFormParam = new SC_FormParam_Ex();
     $this->lfInitParam($objFormParam);
     $objFormParam->setParam($_POST);
     $objFormParam->convParam();
     $news_id = $objFormParam->getValue('news_id');
     //---- 新規登録/編集登録
     switch ($this->getMode()) {
         case 'regist':
             $arrPost = $objFormParam->getHashArray();
             $this->arrErr = $this->lfCheckError($objFormParam);
             if (SC_Utils_Ex::isBlank($this->arrErr)) {
                 // ニュースIDの値がPOSTされて来た場合は既存データの編集とみなし、
                 // 更新メソッドを呼び出す。
                 // ニュースIDが存在しない場合は新規登録を行う。
                 $arrPost['link_method'] = $this->checkLinkMethod($arrPost['link_method']);
                 $arrPost['news_date'] = $this->getRegistDate($arrPost);
                 $member_id = $_SESSION['member_id'];
                 if (strlen($news_id) > 0 && is_numeric($news_id)) {
                     $this->lfNewsUpdate($arrPost, $member_id);
                 } else {
                     $this->lfNewsInsert($arrPost, $member_id);
                 }
                 $news_id = '';
                 $this->tpl_onload = "window.alert('編集が完了しました');";
             } else {
                 $this->arrForm = $arrPost;
             }
             break;
         case 'search':
             if (is_numeric($news_id)) {
                 list($this->arrForm) = $this->getNews($news_id);
                 list($this->arrForm['year'], $this->arrForm['month'], $this->arrForm['day']) = $this->splitNewsDate($this->arrForm['cast_news_date']);
                 $this->edit_mode = 'on';
             }
             break;
         case 'delete':
             //---- データ削除
             if (is_numeric($news_id)) {
                 $pre_rank = $this->getRankByNewsId($news_id);
                 $this->computeRankForDelete($news_id, $pre_rank);
                 SC_Response_Ex::reload();
                 //自分にリダイレクト(再読込による誤動作防止)
             }
             break;
         case 'move':
             //---- 表示順位移動
             if (strlen($news_id) > 0 && is_numeric($news_id) == true) {
                 $term = $objFormParam->getValue('term');
                 if ($term == 'up') {
                     $objDb->sfRankUp('dtb_news', 'news_id', $news_id);
                 } else {
                     if ($term == 'down') {
                         $objDb->sfRankDown('dtb_news', 'news_id', $news_id);
                     }
                 }
                 $this->objDisplay->reload();
             }
             break;
         case 'moveRankSet':
             //---- 指定表示順位移動
             $input_pos = $this->getPostRank($news_id);
             if (SC_Utils_Ex::sfIsInt($input_pos)) {
                 $objDb->sfMoveRank('dtb_news', 'news_id', $news_id, $input_pos);
                 $this->objDisplay->reload();
             }
             break;
         default:
             break;
     }
     $this->arrNews = $this->getNews();
     $this->tpl_news_id = $news_id;
     $this->line_max = count($this->arrNews);
     $this->max_rank = $this->getRankMax();
 }
开发者ID:nanasess,项目名称:eccube-WindowsAzureBlob-plugin,代码行数:82,代码来源:LC_Page_Admin_Contents.php

示例12: rankDown

 /**
  * ニュースの表示順をひとつ下げる.
  *
  * @param  integer $news_id ニュースID
  * @return void
  */
 public function rankDown($news_id)
 {
     $objDb = new SC_Helper_DB_Ex();
     $objDb->sfRankDown('dtb_news', 'news_id', $news_id);
 }
开发者ID:casan,项目名称:eccube-2_13,代码行数:11,代码来源:SC_Helper_News.php

示例13: rankDown

 /**
  * 休日の表示順をひとつ下げる.
  *
  * @param  integer $holiday_id 休日ID
  * @return void
  */
 public function rankDown($holiday_id)
 {
     $objDb = new SC_Helper_DB_Ex();
     $objDb->sfRankDown('dtb_holiday', 'holiday_id', $holiday_id);
 }
开发者ID:ryoogata,项目名称:eccube-SQLAzureSupport-plugin,代码行数:11,代码来源:SC_Helper_Holiday.php

示例14: lfRankDown

 /**
  * @param SC_Helper_DB_Ex $objDb
  */
 public function lfRankDown(&$objDb, $parent_category_id, $product_id)
 {
     $where = 'category_id = ' . SC_Utils_Ex::sfQuoteSmart($parent_category_id);
     $objDb->sfRankDown('dtb_product_categories', 'product_id', $product_id, $where);
 }
开发者ID:rateon,项目名称:twhk-ec,代码行数:8,代码来源:LC_Page_Admin_Products_ProductRank.php

示例15: rankDown

 /**
  * 配送方法の表示順をひとつ下げる.
  *
  * @param  integer $deliv_id 配送方法ID
  * @return void
  */
 public function rankDown($deliv_id)
 {
     $objDb = new SC_Helper_DB_Ex();
     $objDb->sfRankDown('dtb_deliv', 'deliv_id', $deliv_id);
 }
开发者ID:ryoogata,项目名称:eccube-SQLAzureSupport-plugin,代码行数:11,代码来源:SC_Helper_Delivery.php


注:本文中的SC_Helper_DB_Ex::sfRankDown方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。