> 以下代码只针对 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文档
- 保存内容中第一张图片到缩略图