作者 lyh

Merge branch 'develop' of http://47.244.231.31:8099/zhl/globalso-v6

@@ -18,6 +18,8 @@ use App\Models\Manage\EntryPosition; @@ -18,6 +18,8 @@ use App\Models\Manage\EntryPosition;
18 use App\Models\Manage\ManageHr; 18 use App\Models\Manage\ManageHr;
19 use App\Models\Product\Keyword; 19 use App\Models\Product\Keyword;
20 use App\Models\Product\Product; 20 use App\Models\Product\Product;
  21 +use App\Models\Project\DeployOptimize;
  22 +use App\Models\Project\MinorLanguages;
21 use App\Models\Project\Project; 23 use App\Models\Project\Project;
22 use App\Models\WebSetting\WebSettingService; 24 use App\Models\WebSetting\WebSettingService;
23 use App\Services\ProjectServer; 25 use App\Services\ProjectServer;
@@ -262,74 +264,32 @@ class Demo extends Command @@ -262,74 +264,32 @@ class Demo extends Command
262 // } 264 // }
263 265
264 public function handle(){ 266 public function handle(){
265 -// $projectModel = new Project();  
266 -// $list = $projectModel->list(['delete_status'=>0]);  
267 -// foreach ($list as $v){  
268 - ProjectServer::useProject(150);  
269 - $this->getKeywordImage();  
270 - DB::disconnect('custom_mysql');  
271 -// }  
272 - }  
273 -  
274 - /**  
275 - * @remark :根据关键字获取产品主图  
276 - * @name :getKeywordList  
277 - * @author :lyh  
278 - * @method :post  
279 - * @time :2024/2/23 16:28  
280 - */  
281 - public function getKeywordImage($keyword_id = 1,$project_id = 150){  
282 - $keywordModel = new Keyword();  
283 - $keywordInfo = $keywordModel->read(['id'=>$keyword_id]);  
284 - //TODO::所有产品  
285 - $thumb = $this->getRecommendAndHotProducts($keywordInfo['route'],$project_id);  
286 - $domainModel = new DomainInfo();  
287 - $domainInfo = $domainModel->read(['project_id'=>$project_id]);  
288 - if(!empty($domainInfo)){  
289 - $keywordInfo['route'] = $domainInfo['domain'].'/'.$keywordInfo['route'];  
290 - }  
291 - $data = [  
292 - 'url'=>$keywordInfo['route'],  
293 - 'title'=>$keywordInfo['title'],  
294 - 'keyword_title'=>$keywordInfo['keyword_title'],  
295 - 'keyword_content'=>$keywordInfo['keyword_content'],  
296 - 'product_list'=>$thumb ?? []  
297 - ];  
298 - dd($data);  
299 - return $data;  
300 - }  
301 -  
302 - /**  
303 - * 关键词聚合页-推荐&热门产品  
304 - */  
305 - public function getRecommendAndHotProducts($route,$project_id): ?array  
306 - {  
307 - $productIds = [];  
308 - $productKeyword = Keyword::where("project_id",$project_id)->where("route",$route)->first();  
309 - if (!empty($productKeyword)){  
310 - $productsQuery = Product::where("project_id", $project_id)->where("status",1)->where("keyword_id","like","%,".$productKeyword->id.",%")->limit(7)->get();  
311 - if (!empty($productsQuery)){  
312 - foreach ($productsQuery as $item){  
313 - $productIds[] = $item->id; 267 + $projectModel = new DeployOptimize();
  268 + $list = $projectModel->list();
  269 + foreach ($list as $v){
  270 + echo date('Y-m-d H:i:s') . 'end'.json_encode($v) . PHP_EOL;
  271 + $data = [];
  272 + if(!empty($v['minor_languages'])){
  273 + foreach ($v['minor_languages'] as $k1=> $v1){
  274 + if(!empty($v1['tl']) && !empty($v1['type'])){
  275 + $data[] = [
  276 + 'language'=>$v1['tl'],
  277 + 'type'=>$v1['type'],
  278 + 'keywords'=>$v1['keywords'],
  279 + 'service_day'=>$v1['service_day'],
  280 + 'project_id'=>$v['project_id'],
  281 + 'created_at'=>date('Y-m-d H:i:s'),
  282 + 'updated_at'=>date('Y-m-d H:i:s')
  283 + ];
  284 + }
314 } 285 }
315 - if (count($productIds)<7){  
316 - $randomData = Product::where("project_id", $project_id)->where("status",1)->whereNotIn('id', $productIds)->inRandomOrder()->take(13-count($productIds))->get();  
317 - $products = $productsQuery->merge($randomData);  
318 - }else{  
319 - $products = $productsQuery;  
320 - }  
321 - }else{  
322 - $products = Product::where("project_id", $project_id)->where("status",1)->inRandomOrder()->take(13)->get();  
323 - }  
324 - }  
325 - $data = [];  
326 - if (!empty($products)){  
327 - foreach ($products as $item){  
328 - $data[] = !empty($item->thumb) && $item->thumb['url'] != "" ? getImageUrl($item->thumb['url']) : "";  
329 } 286 }
  287 + $languageModel = new MinorLanguages();
  288 + $languageModel->insert($data);
330 } 289 }
331 - return $data; 290 +
332 } 291 }
  292 +
333 public function printMessage() 293 public function printMessage()
334 { 294 {
335 $client = new Client(); 295 $client = new Client();
@@ -29,7 +29,7 @@ class MinorLanguagesController extends BaseController @@ -29,7 +29,7 @@ class MinorLanguagesController extends BaseController
29 'project_id.required' => 'keyword不能为空', 29 'project_id.required' => 'keyword不能为空',
30 ]); 30 ]);
31 $languageModel = new MinorLanguages(); 31 $languageModel = new MinorLanguages();
32 - $lists = $languageModel->list($this->map); 32 + $lists = $languageModel->list($this->map,'id',['language','type','keywords','service_day']);
33 $this->response('success',Code::SUCCESS,$lists); 33 $this->response('success',Code::SUCCESS,$lists);
34 } 34 }
35 } 35 }
@@ -80,6 +80,11 @@ class LoginController extends BaseController @@ -80,6 +80,11 @@ class LoginController extends BaseController
80 */ 80 */
81 public function autologin(UserLoginLogic $logic, EncryptUtils $encrypt) 81 public function autologin(UserLoginLogic $logic, EncryptUtils $encrypt)
82 { 82 {
  83 + $this->request->validate([
  84 + 'code' => 'required',
  85 + ],[
  86 + 'code.required' => 'code不能为空',
  87 + ]);
83 $serviceSettingModel = new Service(); 88 $serviceSettingModel = new Service();
84 $info = $serviceSettingModel->read(['type'=>4]); 89 $info = $serviceSettingModel->read(['type'=>4]);
85 if($info === false){ 90 if($info === false){
@@ -284,7 +284,7 @@ class ProductController extends BaseController @@ -284,7 +284,7 @@ class ProductController extends BaseController
284 $v = $this->getHandleFileImage($v); 284 $v = $this->getHandleFileImage($v);
285 $template_id = $this->getTemplateId(BTemplate::SOURCE_PRODUCT,BTemplate::IS_DETAIL); 285 $template_id = $this->getTemplateId(BTemplate::SOURCE_PRODUCT,BTemplate::IS_DETAIL);
286 $v['is_renovation'] = $this->getIsRenovation(BTemplate::SOURCE_PRODUCT,BTemplate::IS_DETAIL,$template_id,$v['id'] ?? 0); 286 $v['is_renovation'] = $this->getIsRenovation(BTemplate::SOURCE_PRODUCT,BTemplate::IS_DETAIL,$template_id,$v['id'] ?? 0);
287 - $v['url'] = $this->user['domain'].$v['route']; 287 + $v['url'] = $this->user['domain'].$v['route'] ?? '';
288 //获取当前数据扩展字段及值 288 //获取当前数据扩展字段及值
289 $v['extend'] = $this->getExtendInfo($v['id']); 289 $v['extend'] = $this->getExtendInfo($v['id']);
290 return $v; 290 return $v;
@@ -525,4 +525,21 @@ class ProductController extends BaseController @@ -525,4 +525,21 @@ class ProductController extends BaseController
525 } 525 }
526 $this->response('success',Code::SUCCESS,$info); 526 $this->response('success',Code::SUCCESS,$info);
527 } 527 }
  528 +
  529 + /**
  530 + * @remark :Ai发布新闻
  531 + * @name :sendAiNews
  532 + * @author :lyh
  533 + * @method :post
  534 + * @time :2024/1/26 15:33
  535 + */
  536 + public function sendAiProduct(){
  537 + $this->request->validate([
  538 + 'keyword'=>'required',
  539 + ],[
  540 + 'keyword.required' => 'keyword不能为空',
  541 + ]);
  542 + $data = http_get('http://title.globalso.com/ajax_data_for_web.php?keyword='.$this->param['keyword'],['charset=utf-8']);
  543 + $this->response('success',Code::SUCCESS,$data);
  544 + }
528 } 545 }
@@ -12,6 +12,7 @@ use App\Models\Com\NoticeLog; @@ -12,6 +12,7 @@ use App\Models\Com\NoticeLog;
12 use App\Models\Com\UpdateLog; 12 use App\Models\Com\UpdateLog;
13 use App\Models\Devops\ServerConfig; 13 use App\Models\Devops\ServerConfig;
14 use App\Models\Project\InquiryFilterConfig; 14 use App\Models\Project\InquiryFilterConfig;
  15 +use App\Models\Project\MinorLanguages;
15 use App\Models\Project\ProjectRenew; 16 use App\Models\Project\ProjectRenew;
16 use App\Models\Template\Setting; 17 use App\Models\Template\Setting;
17 use App\Models\User\ProjectMenu; 18 use App\Models\User\ProjectMenu;
@@ -131,8 +132,8 @@ class ProjectLogic extends BaseLogic @@ -131,8 +132,8 @@ class ProjectLogic extends BaseLogic
131 * @time :2023/8/30 11:57 132 * @time :2023/8/30 11:57
132 */ 133 */
133 public function projectSave(){ 134 public function projectSave(){
134 - DB::beginTransaction();  
135 - try { 135 +// DB::beginTransaction();
  136 +// try {
136 $this->param['project_location'] = 0;//TODO::图片文件存储不同地方,上线后删除 137 $this->param['project_location'] = 0;//TODO::图片文件存储不同地方,上线后删除
137 if($this->param['type'] == Project::TYPE_SEVEN){ 138 if($this->param['type'] == Project::TYPE_SEVEN){
138 //错误单直接返回,单独处理 139 //错误单直接返回,单独处理
@@ -150,6 +151,8 @@ class ProjectLogic extends BaseLogic @@ -150,6 +151,8 @@ class ProjectLogic extends BaseLogic
150 $this->saveProjectDeployOptimize($this->param['deploy_optimize']); 151 $this->saveProjectDeployOptimize($this->param['deploy_optimize']);
151 //保存售后信息 152 //保存售后信息
152 $this->saveProjectAfter($this->param['project_after']); 153 $this->saveProjectAfter($this->param['project_after']);
  154 +
  155 + $this->saveMinorLanguages($this->param['minor_language'] ?? []);
153 //保存询盘过滤配置 156 //保存询盘过滤配置
154 // $this->param['inquiry_filter_config']['project_id'] = $this->param['id']; 157 // $this->param['inquiry_filter_config']['project_id'] = $this->param['id'];
155 // $this->saveInquiryFilterConfig($this->param['inquiry_filter_config']); 158 // $this->saveInquiryFilterConfig($this->param['inquiry_filter_config']);
@@ -157,11 +160,11 @@ class ProjectLogic extends BaseLogic @@ -157,11 +160,11 @@ class ProjectLogic extends BaseLogic
157 //创建站点 160 //创建站点
158 // $this->createSite($this->param); 161 // $this->createSite($this->param);
159 (new SyncService())->projectAcceptAddress($this->param['id']); 162 (new SyncService())->projectAcceptAddress($this->param['id']);
160 - }  
161 - DB::commit();  
162 - }catch (\Exception $e){  
163 - DB::rollBack();  
164 - $this->fail('保存失败,请联系管理员'); 163 +// }
  164 +// DB::commit();
  165 +// }catch (\Exception $e){
  166 +// DB::rollBack();
  167 +// $this->fail('保存失败,请联系管理员');
165 } 168 }
166 169
167 return $this->success(); 170 return $this->success();
@@ -210,7 +213,8 @@ class ProjectLogic extends BaseLogic @@ -210,7 +213,8 @@ class ProjectLogic extends BaseLogic
210 } 213 }
211 $param['remain_day'] = $param['deploy_build']['service_duration'] - $param['finish_remain_day']; 214 $param['remain_day'] = $param['deploy_build']['service_duration'] - $param['finish_remain_day'];
212 $param['remain_day'] = ($param['remain_day'] > 0) ? $param['remain_day'] : 0; 215 $param['remain_day'] = ($param['remain_day'] > 0) ? $param['remain_day'] : 0;
213 - unset($param['payment'],$param['deploy_build'],$param['deploy_optimize'],$param['online_check'],$param['project_after'],$param['inquiry_filter_config']); 216 + unset($param['payment'],$param['deploy_build'],$param['deploy_optimize'],
  217 + $param['online_check'],$param['project_after'],$param['inquiry_filter_config'],$param['minor_language']);
214 //文件上传默认值 218 //文件上传默认值
215 if($param['is_upload_manage']){ 219 if($param['is_upload_manage']){
216 $param['upload_config'] = [ 220 $param['upload_config'] = [
@@ -278,7 +282,7 @@ class ProjectLogic extends BaseLogic @@ -278,7 +282,7 @@ class ProjectLogic extends BaseLogic
278 //更改域名 282 //更改域名
279 $this->editDomainStatus($deploy_optimize['domain'],$deploy_optimize['project_id']); 283 $this->editDomainStatus($deploy_optimize['domain'],$deploy_optimize['project_id']);
280 } 284 }
281 - $deploy_optimize['minor_languages'] = Arr::a2s(!empty($deploy_optimize['minor_languages']) ? $deploy_optimize['minor_languages'] : []); 285 + $deploy_optimize['minor_languages'] = Arr::a2s( []);
282 $deploy_optimize['minor_keywords'] = Arr::a2s(!empty($deploy_optimize['minor_keywords']) ? $deploy_optimize['minor_keywords'] : []); 286 $deploy_optimize['minor_keywords'] = Arr::a2s(!empty($deploy_optimize['minor_keywords']) ? $deploy_optimize['minor_keywords'] : []);
283 $deploy_optimize['special'] = !empty($deploy_optimize['special']) ? ','.trim($deploy_optimize['special'],',').',' : ''; 287 $deploy_optimize['special'] = !empty($deploy_optimize['special']) ? ','.trim($deploy_optimize['special'],',').',' : '';
284 //是否更新了api_no 288 //是否更新了api_no
@@ -305,6 +309,27 @@ class ProjectLogic extends BaseLogic @@ -305,6 +309,27 @@ class ProjectLogic extends BaseLogic
305 } 309 }
306 310
307 /** 311 /**
  312 + * @remark :保存小语种配置
  313 + * @name :saveMinorLanguages
  314 + * @author :lyh
  315 + * @method :post
  316 + * @time :2023/8/30 13:57
  317 + */
  318 + protected function saveMinorLanguages($minor_language){
  319 + //查询数据是否存在
  320 + $languageModel = new MinorLanguages();
  321 + $languageModel->del(['project_id'=>$this->param['id']]);
  322 + if(!empty($minor_language)){
  323 + foreach ($minor_language as $k => $v){
  324 + $v['project_id'] = $this->param['id'];
  325 + $minor_language[$k] = $v;
  326 + }
  327 + $languageModel->insert($minor_language);
  328 + }
  329 + return $this->success();
  330 + }
  331 +
  332 + /**
308 * @remark :创建初始数据 333 * @remark :创建初始数据
309 * @name :createProjectData 334 * @name :createProjectData
310 * @author :lyh 335 * @author :lyh
@@ -14,6 +14,7 @@ use App\Http\Logic\Bside\BaseLogic; @@ -14,6 +14,7 @@ use App\Http\Logic\Bside\BaseLogic;
14 use App\Models\Domain\DomainInfo; 14 use App\Models\Domain\DomainInfo;
15 use App\Models\Project\DeployBuild; 15 use App\Models\Project\DeployBuild;
16 use App\Models\Project\DeployOptimize; 16 use App\Models\Project\DeployOptimize;
  17 +use App\Models\Project\MinorLanguages;
17 use App\Models\Project\Project; 18 use App\Models\Project\Project;
18 use App\Models\RankData\ExternalLinks; 19 use App\Models\RankData\ExternalLinks;
19 use App\Models\RankData\ExternalLinks as ExternalLinksModel; 20 use App\Models\RankData\ExternalLinks as ExternalLinksModel;
@@ -83,14 +84,16 @@ class RankDataLogic extends BaseLogic @@ -83,14 +84,16 @@ class RankDataLogic extends BaseLogic
83 $lang_data = $quanqiusou_api->getLangRankData($api_no); 84 $lang_data = $quanqiusou_api->getLangRankData($api_no);
84 $lang_data = Arr::setValueToKey($lang_data, 'language'); 85 $lang_data = Arr::setValueToKey($lang_data, 'language');
85 $data['langs'] = []; 86 $data['langs'] = [];
86 - if(isset($project['deploy_optimize']['minor_languages']) && !empty($project['deploy_optimize']['minor_languages']) && is_array($project['deploy_optimize']['minor_languages'])){  
87 - foreach($project['deploy_optimize']['minor_languages']??[] as $lang){  
88 - $remain_day = $lang_data[$lang['tl']]['dabiao_day'] ?? 0;  
89 - $data['langs'][$lang['tl'] ?? ''] = [ 87 + $languageModel = new MinorLanguages();
  88 + $languageList = $languageModel->list(['project_id'=>$project['id']]);
  89 + if(!empty($languageList) && is_array($languageList)){
  90 + foreach($languageList as $lang){
  91 + $remain_day = $lang_data[$lang['language']]['dabiao_day'] ?? 0;
  92 + $data['langs'][$lang['language'] ?? ''] = [
90 'lang_text' => Translate::getTls($lang['tl'] ?? ''), 93 'lang_text' => Translate::getTls($lang['tl'] ?? ''),
91 'keyword_num' => $lang['keywords'] ?? 0, 94 'keyword_num' => $lang['keywords'] ?? 0,
92 - 'reach_day' => $lang_data[$lang['tl']]['dabiao_day'] ?? 0,  
93 - 'home_cnt' => $lang_data[$lang['tl']]['home_cnt'] ?? 0, 95 + 'reach_day' => $lang_data[$lang['language']]['dabiao_day'] ?? 0,
  96 + 'home_cnt' => $lang_data[$lang['language']]['home_cnt'] ?? 0,
94 'remain_day' => ($lang['type']??0) == 1 ? $data['project']['remain_day'] : $lang['service_day'] - $remain_day, 97 'remain_day' => ($lang['type']??0) == 1 ? $data['project']['remain_day'] : $lang['service_day'] - $remain_day,
95 'type' => $lang['type'] ?? 0, //1 项目关键词 项目天数 2 保证首页关键词 项目达标天数 98 'type' => $lang['type'] ?? 0, //1 项目关键词 项目天数 2 保证首页关键词 项目达标天数
96 ]; 99 ];
@@ -471,7 +474,7 @@ class RankDataLogic extends BaseLogic @@ -471,7 +474,7 @@ class RankDataLogic extends BaseLogic
471 474
472 //关键词达标天数 475 //关键词达标天数
473 $model->is_compliance = 0; 476 $model->is_compliance = 0;
474 - if($model->updated_date != date('Y-m-d') && !$lang){ 477 + if($model->updated_date != date('Y-m-d')){
475 //保证关键词数 478 //保证关键词数
476 $keyword_num = DeployBuild::where('project_id', $project_id)->value('keyword_num'); 479 $keyword_num = DeployBuild::where('project_id', $project_id)->value('keyword_num');
477 $type = Project::where('id', $project_id)->value('type'); 480 $type = Project::where('id', $project_id)->value('type');
@@ -479,8 +482,10 @@ class RankDataLogic extends BaseLogic @@ -479,8 +482,10 @@ class RankDataLogic extends BaseLogic
479 $model->compliance_day = $model->compliance_day + 1; 482 $model->compliance_day = $model->compliance_day + 1;
480 $model->is_compliance = 1; 483 $model->is_compliance = 1;
481 //项目表更新 484 //项目表更新
482 - $compliance_day = Project::where(['id' => $project_id])->value('finish_remain_day') ?: 0;  
483 - Project::where('id', $project_id)->update(['is_remain_today' => 1, 'finish_remain_day' => $compliance_day+1]); 485 + if(!$lang){
  486 + $compliance_day = Project::where(['id' => $project_id])->value('finish_remain_day') ?: 0;
  487 + Project::where('id', $project_id)->update(['is_remain_today' => 1, 'finish_remain_day' => $compliance_day+1]);
  488 + }
484 } 489 }
485 } 490 }
486 491
@@ -25,7 +25,7 @@ class AiCommandRequest extends FormRequest @@ -25,7 +25,7 @@ class AiCommandRequest extends FormRequest
25 { 25 {
26 return [ 26 return [
27 'key'=>'required', 27 'key'=>'required',
28 - 'scene'=>'required', 28 +// 'scene'=>'required',
29 'ai'=>'required', 29 'ai'=>'required',
30 ]; 30 ];
31 } 31 }
@@ -34,7 +34,7 @@ class AiCommandRequest extends FormRequest @@ -34,7 +34,7 @@ class AiCommandRequest extends FormRequest
34 { 34 {
35 return [ 35 return [
36 'key.required'=>'key不能为空', 36 'key.required'=>'key不能为空',
37 - 'scene.required' => '场景不能为空', 37 +// 'scene.required' => '场景不能为空',
38 'ai.required'=>'指令你能为空', 38 'ai.required'=>'指令你能为空',
39 ]; 39 ];
40 } 40 }
@@ -193,8 +193,6 @@ Route::middleware(['aloginauth'])->group(function () { @@ -193,8 +193,6 @@ Route::middleware(['aloginauth'])->group(function () {
193 193
194 Route::prefix('language')->group(function () { 194 Route::prefix('language')->group(function () {
195 Route::any('/', [Aside\Project\MinorLanguagesController::class, 'getMinorLanguageList'])->name('admin.getMinorLanguageList'); 195 Route::any('/', [Aside\Project\MinorLanguagesController::class, 'getMinorLanguageList'])->name('admin.getMinorLanguageList');
196 - Route::any('/save', [Aside\Project\KeywordPrefixController::class, 'save'])->name('admin.keyword_save');  
197 - Route::any('/del', [Aside\Project\KeywordPrefixController::class, 'del'])->name('admin.keyword_del');  
198 }); 196 });
199 //更新项目tdk 197 //更新项目tdk
200 Route::any('/updateSeoTdk', [Aside\Com\UpdateController::class, 'updateSeoTdk'])->name('admin.project_updateSeoTdk'); 198 Route::any('/updateSeoTdk', [Aside\Com\UpdateController::class, 'updateSeoTdk'])->name('admin.project_updateSeoTdk');
@@ -230,6 +230,7 @@ Route::middleware(['bloginauth'])->group(function () { @@ -230,6 +230,7 @@ Route::middleware(['bloginauth'])->group(function () {
230 Route::any('/statusNum', [\App\Http\Controllers\Bside\Product\ProductController::class, 'getStatusNumber'])->name('product_statusNum'); 230 Route::any('/statusNum', [\App\Http\Controllers\Bside\Product\ProductController::class, 'getStatusNumber'])->name('product_statusNum');
231 Route::any('/copyProduct', [\App\Http\Controllers\Bside\Product\ProductController::class, 'copyProduct'])->name('product_copyProduct'); 231 Route::any('/copyProduct', [\App\Http\Controllers\Bside\Product\ProductController::class, 'copyProduct'])->name('product_copyProduct');
232 Route::any('/batchSetCategory', [\App\Http\Controllers\Bside\Product\ProductController::class, 'batchSetCategory'])->name('product_batchSetCategory'); 232 Route::any('/batchSetCategory', [\App\Http\Controllers\Bside\Product\ProductController::class, 'batchSetCategory'])->name('product_batchSetCategory');
  233 + Route::any('/sendAiProduct', [\App\Http\Controllers\Bside\Product\ProductController::class, 'sendAiProduct'])->name('product_sendAiProduct');
233 //产品分类 234 //产品分类
234 Route::get('category', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'index'])->name('product_category'); 235 Route::get('category', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'index'])->name('product_category');
235 Route::get('category/info', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'info'])->name('product_category_info'); 236 Route::get('category/info', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'info'])->name('product_category_info');