> 以下代碼只針對 V6.0 以上版本
## 需求調研
近日收到求助需要優化文章模塊的url地址
優化前:/index/information/17.html
優化后:/17.html
## 需求分析
1、/index是應用的名稱,我們可以通過域名綁定應用的方式來隱藏
2、系統的每個模塊是獨立的表,如文章模塊和產品模塊的id可能存在重復所以這里需要做取舍
## 思路
通過需求分析我們能明確,如果想得到`/17.html`這種`url`我們只能給一個模塊來做優化,如果多個模塊的話需要加以區分比如叫做`news_17.html`,`product_17.html`等。
我們需要通過url確定是哪個表的數據,這樣我們就能反推出當前的模型和表名稱,剩下的自然就好處理了。
## 路由部分修改
1、只給其中一個模塊做優化,其他的放棄(以下代碼基于此)
```
// 這里我們匹配所有數字到Article控制器的infoArticle方法
Route::any('<id>$', 'Article/infoArticle')->pattern(['id' => '\d+']);
```
2、多個模塊做優化
~~~
Route::any('news_<id>$', 'Article/infoArticle')->pattern(['id' => '\d+']);
Route::any('product_<id>$', 'Article/infoArticle')->pattern(['id' => '\d+']);
~~~
## 控制器部分的修改
1、由于我們并沒有`Article`控制器,所以會調用默認的`Error`空控制器,我們在該控制器中添加新的方法(基本等同于復制一份`info`方法)
~~~
public function infoArticle(string $id)
{
// 獲取欄目ID
$catId = getCateId();
// 當前模型ID
$this->moduleId = Cate::where('id', '=', $catId)->value('module_id');
// 當前表名稱
$this->tableName = Module::where('id', '=', $this->moduleId)->value('table_name');
// 當前模型字段列表
$this->fields = Field::getFieldList($this->moduleId);
if (empty($catId)) {
$this->error('未找到對應欄目');
}
// 獲取欄目信息
$cate = Cms::getCateInfo($catId);
// 更新點擊數
Cms::addHits($id, $this->tableName);
// 查找內容詳情
$info = Cms::getInfo($id, $this->tableName);
// 跳轉
if (isset($info['url']) && !empty($info['url'])) {
return redirect($info['url']);
}
// 當前地址
$info['url'] = getShowUrl($info);
// tdk
$tdk = Cms::getInfoTdk($info, $cate, $this->system);
// 模板
$template = Cms::getInfoView($info, $cate, $this->tableName);
$view = [
'cate' => $cate, // 欄目信息
'fields' => $this->fields, // 字段列表
'info' => $info, // 詳情信息
'system' => $this->system, // 系統信息
'public' => $this->public, // 公共目錄
'title' => $tdk['title'],
'keywords' => $tdk['keywords'],
'description' => $tdk['description'],
];
View::assign($view);
return View::fetch($template);
}
~~~
## 公共方法的修改
common.php 中修改以下兩個方法
~~~
/***
* 獲取當前欄目ID
* @return mixed
*/
function getCateId()
{
if (\think\facade\Request::has('cate')) {
$result = (int)\think\facade\Request::param('cate');
} else {
$result = \app\common\model\Cate::where('cate_folder', '=', \think\facade\Request::controller())
->value('id');
if (!$result) {
$article = \app\common\model\Article::find(request()['id']);
if ($article) {
$result = $article->cate_id;
}
}
}
return $result;
}
getShowUrl 需要根據具體情況做調整,具體做法就是根據模塊id做處理
~~~
- 介紹
- 安裝與部屬
- 5.1版本安裝部署
- 6.1版本安裝部署
- 隱藏index.php
- 目錄結構
- 5.1版本目錄
- 6.1版本目錄
- 前端組件
- 彈層使用
- 消息提示
- 彈出提示
- 確認提示
- 打開彈窗
- 自定義彈窗
- 彈出層全屏
- 重新加載
- 快速開發
- 模塊管理
- 字段管理
- 快速構建器
- 表單構建器
- 添加表單項
- 單行文本框
- 多行文本框
- 單選
- 多選
- 日期
- 時間
- 日期時間
- 日期范圍
- 標簽
- 數字框
- 密碼框
- 普通下拉菜單
- Select2下拉菜單
- 多級聯動菜單
- 單圖片上傳
- 多圖片上傳
- 單文件上傳
- 多文件上傳
- 編輯器
- 按鈕
- 隱藏域
- 取色器
- 自定義Html
- 分組
- 添加表單項通用方法
- 設置表單數據
- 設置頁面標題
- 設置頁面提示信息
- 設置表單提交地址
- 設置表單提交方式
- 模板變量賦值
- 設置頁面空表單項提示
- 隱藏按鈕
- 設置按鈕標題
- 添加按鈕
- 設置額外HTML代碼
- 設置額外JS代碼
- 設置額外CSS樣式
- 設置表單提交確認框
- 隱藏<顯示全部>按鈕
- 表格構建器
- 設置表格的主鍵
- 設置頁面標題
- 設置頁面提示信息
- 設置表格的地址
- 設置新增的地址
- 設置修改的地址
- 設置刪除的地址
- 設置額外JS代碼
- 設置額外CSS樣式
- 設置額外HTML代碼
- 添加一列
- text
- status
- yesno
- link
- image
- select
- 添加多列
- 添加一個右側按鈕
- 添加多個右側按鈕
- 添加一個頂部按鈕
- 添加多個頂部按鈕
- 設置搜索的字段
- 設置表格的行數
- 設置空數據提示信息
- 設置固定左列
- 設置固定右列
- 模板制作
- 模板目錄及設置
- 標簽手冊
- V5版本
- 系統標簽
- TDK標簽
- 列表標簽
- 詳情標簽
- 上下篇標簽
- 導航標簽
- 欄目標簽
- 位置標簽
- 友情鏈接標簽
- 廣告標簽
- 碎片標簽
- 通用列表標簽
- 搜索列表標簽
- 獲取字段
- V6版本
- 模板目錄及文件命名
- 系統標簽
- TDK標簽
- 列表標簽
- 詳情標簽
- 上下篇標簽
- 導航標簽
- 欄目標簽
- 位置標簽
- 友情鏈接標簽
- 廣告標簽
- 碎片標簽
- 通用列表標簽
- 搜索列表標簽
- 字典標簽
- 標簽云
- 插件模塊
- 插件說明
- 常見問題
- 模型字段新增報錯
- 數據庫無法備份
- 如何修改后臺目錄
- 綁定手機端域名
- 左側菜單點擊自動隱藏
- 前臺為何只有4個控制器
- 為何廣告管理的內容不顯示
- 后臺編輯器無法上傳圖片
- 表類型選擇CMS和后臺的區別
- 精簡文件和數據庫
- 后臺密碼初始化
- 常用函數
- textareaBr 文本域換行
- send_email 郵件發送
- 更新日志
- 二開示例
- 關聯文章的實現
- 文章模塊優化詳情頁URL
- api文檔
- 保存內容中第一張圖片到縮略圖