多应用+插件架构,代码干净,支持一键云编译,码云点赞13K star,4.8-4.12 预售价格198元 广告
> 以下代码只针对 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做处理 ~~~