作者 刘锟

Merge remote-tracking branch 'origin/master' into akun

@@ -8,6 +8,7 @@ use App\Models\Ai\AiBlogOpenLog; @@ -8,6 +8,7 @@ use App\Models\Ai\AiBlogOpenLog;
8 use App\Models\Project\AiBlogTask as AiBlogTaskModel; 8 use App\Models\Project\AiBlogTask as AiBlogTaskModel;
9 use App\Models\Project\Project; 9 use App\Models\Project\Project;
10 use App\Models\Project\ProjectKeyword; 10 use App\Models\Project\ProjectKeyword;
  11 +use App\Models\RankData\RankData;
11 use App\Models\WebSetting\WebSetting; 12 use App\Models\WebSetting\WebSetting;
12 use App\Services\AiBlogService; 13 use App\Services\AiBlogService;
13 use App\Services\ProjectServer; 14 use App\Services\ProjectServer;
@@ -78,26 +79,38 @@ class AiBlogAutoPublish extends Command @@ -78,26 +79,38 @@ class AiBlogAutoPublish extends Command
78 $keywords = array_map('trim', $keywords); 79 $keywords = array_map('trim', $keywords);
79 if (empty($keywords)) { 80 if (empty($keywords)) {
80 $this->output("项目{$project->id}未获取到关键词"); 81 $this->output("项目{$project->id}未获取到关键词");
  82 + continue;
81 } 83 }
82 $last_task = AiBlogTaskModel::where('project_id', $project->id)->where('type', 2)->orderBy('id', 'desc')->first(); 84 $last_task = AiBlogTaskModel::where('project_id', $project->id)->where('type', 2)->orderBy('id', 'desc')->first();
83 - //如果没有发布过AI blog任务, 第一次提交3个任务 85 + $compliance = RankData::where(['project_id' => $project->id, 'lang' => ''])->value('is_compliance');
  86 + $frequency = Project::typeBlogFrequency($project->deploy_optimize->send_ai_blog_frequency);
  87 + $frequency = explode('-', $frequency);
  88 + //1、之前测试那批项目,按照正常频率发送;
  89 + //2、未达标的项目,开启AIblog, 并立即推送三篇;
  90 + //3、其他项目等下下周 1 (2025-03-17)开始推送第一篇, 之后按照正频率发送;
84 if (!$last_task) { 91 if (!$last_task) {
85 - for ($i = 0; $i < 3; $i++) {  
86 - $this->createTask($keywords, $project->id); 92 + if(!$compliance) {
  93 + for ($i = 0; $i < 3; $i++) {
  94 + $this->createTask($keywords, $project->id, $frequency);
  95 + }
  96 + }else{
  97 + if(date('Y-m-d') >= '2025-03-17'){
  98 + $this->createTask($keywords, $project->id, $frequency);
  99 + }
87 } 100 }
88 } else { 101 } else {
89 - $this->createTask($keywords, $project->id); 102 + $this->createTask($keywords, $project->id, $frequency);
90 } 103 }
91 } 104 }
92 } 105 }
93 106
94 - public function createTask($keywords, $project_id){ 107 + public function createTask($keywords, $project_id, $frequency){
95 $keyword = $keywords[array_rand($keywords)]; 108 $keyword = $keywords[array_rand($keywords)];
96 $aiBlogService = new AiBlogService($project_id); 109 $aiBlogService = new AiBlogService($project_id);
97 $result = $aiBlogService->setRoute($keyword)->createTask($keyword); 110 $result = $aiBlogService->setRoute($keyword)->createTask($keyword);
98 if ($result['status'] == 200) { 111 if ($result['status'] == 200) {
99 $aiBlogTaskModel = new AiBlogTaskModel(); 112 $aiBlogTaskModel = new AiBlogTaskModel();
100 - $next_auto_date = date('Y-m-d', strtotime('+' . mt_rand(3,6) . 'days')); //每3-6天自动发布 113 + $next_auto_date = date('Y-m-d', strtotime('+' . mt_rand($frequency[0],$frequency[1]) . 'days')); //每3-6天自动发布
101 $aiBlogTaskModel->addReturnId(['project_id' => $project_id, 'type' => 2, 'task_id' => $result['data']['task_id'], 'status' => 1, 'next_auto_date' => $next_auto_date]); 114 $aiBlogTaskModel->addReturnId(['project_id' => $project_id, 'type' => 2, 'task_id' => $result['data']['task_id'], 'status' => 1, 'next_auto_date' => $next_auto_date]);
102 115
103 ProjectServer::useProject($project_id); 116 ProjectServer::useProject($project_id);
@@ -123,23 +136,26 @@ class AiBlogAutoPublish extends Command @@ -123,23 +136,26 @@ class AiBlogAutoPublish extends Command
123 */ 136 */
124 public function auto_open() 137 public function auto_open()
125 { 138 {
126 - $this->output('上线的推广项目自动开启');  
127 - $projects = Project::whereIn('type', [Project::TYPE_TWO, Project::TYPE_FOUR])  
128 - ->whereNotNull('uptime')->where('is_ai_blog', 0)  
129 - ->get();  
130 - foreach ($projects as $project) {  
131 - //未开启过 自动开启  
132 - if (!AiBlogOpenLog::isOpened($project->id)) {  
133 - //开启  
134 - $project->is_ai_blog = 1;  
135 - $project->save();  
136 - //创建AI博客项目  
137 - (new ProjectLogic())->setAiBlog($project->id, $project->main_lang_id, 1, $project->title);  
138 - //开启日志  
139 - AiBlogOpenLog::addLog($project->id); 139 + while (true) {
  140 + $this->output('上线的推广项目自动开启');
  141 + $projects = Project::whereIn('type', [Project::TYPE_TWO, Project::TYPE_FOUR])
  142 + ->whereNotNull('uptime')->where('is_ai_blog', 0)
  143 + ->get();
  144 + foreach ($projects as $project) {
  145 + //未开启过 自动开启
  146 + if (!AiBlogOpenLog::isOpened($project->id)) {
  147 + //开启
  148 + $project->is_ai_blog = 1;
  149 + $project->save();
  150 + //创建AI博客项目
  151 + (new ProjectLogic())->setAiBlog($project->id, $project->main_lang_id, 1, $project->title);
  152 + //开启日志
  153 + AiBlogOpenLog::addLog($project->id);
140 154
141 - $this->output('自动开启项目:' . $project->id); 155 + $this->output('自动开启项目:' . $project->id);
  156 + }
142 } 157 }
  158 + sleep(60);
143 } 159 }
144 } 160 }
145 161
@@ -148,7 +148,7 @@ class CountProject extends Command @@ -148,7 +148,7 @@ class CountProject extends Command
148 if($inquiry_list == false){ 148 if($inquiry_list == false){
149 return false; 149 return false;
150 } 150 }
151 - echo date('Y-m-d H:i:s') . '拉取询盘状态:' .json_encode($inquiry_list) . PHP_EOL; 151 +// echo date('Y-m-d H:i:s') . '拉取询盘状态:' .json_encode($inquiry_list) . PHP_EOL;
152 if($inquiry_list['status'] == self::STATUS_ERROR){ 152 if($inquiry_list['status'] == self::STATUS_ERROR){
153 $arr['inquiry_num'] = 0; 153 $arr['inquiry_num'] = 0;
154 $countryArr = []; 154 $countryArr = [];
@@ -528,8 +528,8 @@ class RelayInquiry extends Command @@ -528,8 +528,8 @@ class RelayInquiry extends Command
528 $seconds += rand(5,60); 528 $seconds += rand(5,60);
529 ReInquiryDetailLog::createInquiryLog($re_detail->id, ReInquiryDetailLog::TYPE_VISIT, $pre, $v, date('Y-m-d H:i:s', $start_time + $seconds)); 529 ReInquiryDetailLog::createInquiryLog($re_detail->id, ReInquiryDetailLog::TYPE_VISIT, $pre, $v, date('Y-m-d H:i:s', $start_time + $seconds));
530 // 最后一次访问询盘 加上询盘 530 // 最后一次访问询盘 加上询盘
531 - if($is_inquiry && $k+1 == count($urls)){  
532 - $this->output('第' . $k+1 . '个链接询盘'); 531 + if($is_inquiry && ($k+1) == count($urls)){
  532 + $this->output('第' . ($k+1) . '个链接询盘');
533 $seconds += rand(30,120); 533 $seconds += rand(30,120);
534 $pre++; 534 $pre++;
535 ReInquiryDetailLog::createInquiryLog($re_detail->id, ReInquiryDetailLog::TYPE_INQUIRY, $pre, $v, date('Y-m-d H:i:s', $start_time + $seconds)); 535 ReInquiryDetailLog::createInquiryLog($re_detail->id, ReInquiryDetailLog::TYPE_INQUIRY, $pre, $v, date('Y-m-d H:i:s', $start_time + $seconds));
@@ -52,10 +52,9 @@ class LyhImportTest extends Command @@ -52,10 +52,9 @@ class LyhImportTest extends Command
52 * @time :2023/11/20 15:13 52 * @time :2023/11/20 15:13
53 */ 53 */
54 public function handle(){ 54 public function handle(){
55 - ProjectServer::useProject(3283); 55 + ProjectServer::useProject(2837);
56 echo date('Y-m-d H:i:s') . 'start' . PHP_EOL; 56 echo date('Y-m-d H:i:s') . 'start' . PHP_EOL;
57 -// $this->importProductCategory('https://ecdn6.globalso.com/upload/p/3283/file/2025-03/zy_boss_pricelistcat_202503131025.csv','3283');  
58 - $this->importProduct('https://ecdn6.globalso.com/upload/p/3283/file/2025-03/zy_boss_price_copy1.csv',3283); 57 + $this->importCustomModule('https://ecdn6.globalso.com/upload/p/2837/file/2025-03/2.csv',2837);
59 DB::disconnect('custom_mysql'); 58 DB::disconnect('custom_mysql');
60 echo date('Y-m-d H:i:s') . 'end' . PHP_EOL; 59 echo date('Y-m-d H:i:s') . 'end' . PHP_EOL;
61 } 60 }
@@ -332,53 +331,72 @@ class LyhImportTest extends Command @@ -332,53 +331,72 @@ class LyhImportTest extends Command
332 * @method :post 331 * @method :post
333 * @time :2025/2/24 14:54 332 * @time :2025/2/24 14:54
334 */ 333 */
335 - public function importCustomModule($text,$project_id = 2837){ 334 + public function importCustomModule($url,$project_id){
  335 + $line_of_text = [];
  336 + $opts = [
  337 + 'http' => [
  338 + 'method' => 'GET',
  339 + 'header' => 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246'
  340 + ],
  341 + 'ssl' => [
  342 + 'verify_peer' => false,
  343 + 'verify_peer_name' => false
  344 + ]
  345 + ];
  346 + $file_handle = fopen($url, 'r', null, stream_context_create($opts));
  347 + while (!feof($file_handle)) {
  348 + $line_of_text[] = fgetcsv($file_handle, 0, ',');
  349 + }
  350 + fclose($file_handle);
336 $customContentModel = new CustomModuleContent(); 351 $customContentModel = new CustomModuleContent();
337 $customCategoryModel = new CustomModuleCategory();; 352 $customCategoryModel = new CustomModuleCategory();;
338 $customExtendContentTModel = new CustomModuleExtentContent(); 353 $customExtendContentTModel = new CustomModuleExtentContent();
339 - $data = explode("\n", $text);  
340 - foreach ($data as $k => $item){  
341 - $item = trim($item,',');  
342 - //按照逗号转为数组  
343 - $array = explode(",", $item);  
344 - //添加分类  
345 - if(empty($array[0])){  
346 - continue;  
347 - }  
348 - //添加内容  
349 - $contentId = $customContentModel->addReturnId(['name'=>$array[0],'module_id'=>2,'project_id'=>$project_id]);  
350 - echo date('Y-m-d H:i:s') . '当前扩展数据id:'. $contentId . PHP_EOL;  
351 - //注册路由  
352 - $route = RouteMap::setRoute($array[0], RouteMap::SOURCE_MODULE,  
353 - $contentId, $project_id);  
354 - $customContentModel->edit(['route'=>$route],['id'=>$contentId]);  
355 - if(!empty($array[1])){  
356 - $categoryId = ',';  
357 - $cateArr = explode('/',$array[1]);  
358 - foreach ($cateArr as $cateV){  
359 - $cateInfo = $customCategoryModel->read(['name'=>$cateV,'module_id'=>2,'project_id'=>$project_id]);  
360 - if($cateInfo !== false){  
361 - $categoryId .= $cateInfo['id'].','; 354 + foreach ($line_of_text as $k => $item){
  355 +// try {
  356 + //添加内容
  357 + $contentId = $customContentModel->addReturnId(['name'=>$item[0],'module_id'=>2,'project_id'=>$project_id]);
  358 + echo date('Y-m-d H:i:s') . '当前扩展数据id:'. $contentId . PHP_EOL;
  359 + //注册路由
  360 + $route = RouteMap::setRoute($item[0], RouteMap::SOURCE_MODULE,
  361 + $contentId, $project_id);
  362 + $customContentModel->edit(['route'=>$route],['id'=>$contentId]);
  363 + if(!empty($item[1])){
  364 + $categoryId = ',';
  365 + $cateArr = explode('/',$item[1]);
  366 + foreach ($cateArr as $cateV){
  367 + $cateInfo = $customCategoryModel->read(['name'=>$cateV,'module_id'=>2,'project_id'=>$project_id]);
  368 + if($cateInfo !== false){
  369 + $categoryId .= $cateInfo['id'].',';
  370 + }else{
  371 + $cateVId = $customCategoryModel->addReturnId(['name'=>$cateV,'module_id'=>2,'project_id'=>$project_id]);
  372 + $cateRoute = RouteMap::setRoute($cateV, RouteMap::SOURCE_MODULE_CATE,
  373 + $cateVId, $project_id);
  374 + $customCategoryModel->edit(['route'=>$cateRoute],['id'=>$cateVId]);
  375 + $categoryId .= $cateVId.',';
  376 + }
362 } 377 }
  378 + $customContentModel->edit(['category_id'=>$categoryId],['id'=>$contentId]);
363 } 379 }
364 - $customContentModel->edit(['category_id'=>$categoryId],['id'=>$contentId]);  
365 - }  
366 - $saveData = [  
367 - ['key'=>'pd_extended_field_1', 'type'=>1, 'values'=>$array[2], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
368 - ['key'=>'pd_extended_field_2', 'type'=>1, 'values'=>$array[4], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
369 - ['key'=>'pd_extended_field_3', 'type'=>1, 'values'=>$array[5], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
370 - ['key'=>'pd_extended_field_4', 'type'=>1, 'values'=>$array[3], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
371 - ['key'=>'pd_extended_field_5', 'type'=>1, 'values'=>$array[8], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
372 - ['key'=>'pd_extended_field_6', 'type'=>1, 'values'=>$array[6], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
373 - ['key'=>'pd_extended_field_7', 'type'=>1, 'values'=>$array[9], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
374 - ['key'=>'pd_extended_field_8', 'type'=>1, 'values'=>$array[10], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
375 - ['key'=>'pd_extended_field_9', 'type'=>1, 'values'=>$array[11], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
376 - ['key'=>'pd_extended_field_10', 'type'=>1, 'values'=>$array[12], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
377 - ['key'=>'pd_extended_field_11', 'type'=>1, 'values'=>$array[13], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
378 - ['key'=>'pd_extended_field_12', 'type'=>1, 'values'=>$array[14] ?? '', 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
379 - ['key'=>'pd_extended_field_13', 'type'=>1, 'values'=>$array[7], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],  
380 - ];  
381 - $customExtendContentTModel->insert($saveData); 380 + $saveData = [
  381 + ['key'=>'pd_extended_field_1', 'type'=>1, 'values'=>$item[2], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
  382 + ['key'=>'pd_extended_field_2', 'type'=>1, 'values'=>$item[4], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
  383 + ['key'=>'pd_extended_field_3', 'type'=>1, 'values'=>$item[5], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
  384 + ['key'=>'pd_extended_field_4', 'type'=>1, 'values'=>$item[3], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
  385 + ['key'=>'pd_extended_field_5', 'type'=>1, 'values'=>$item[8], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
  386 + ['key'=>'pd_extended_field_6', 'type'=>1, 'values'=>$item[6], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
  387 + ['key'=>'pd_extended_field_7', 'type'=>1, 'values'=>$item[9], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
  388 + ['key'=>'pd_extended_field_8', 'type'=>1, 'values'=>$item[10], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
  389 + ['key'=>'pd_extended_field_9', 'type'=>1, 'values'=>$item[11], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
  390 + ['key'=>'pd_extended_field_10', 'type'=>1, 'values'=>$item[12], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
  391 + ['key'=>'pd_extended_field_11', 'type'=>1, 'values'=>$item[13], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
  392 + ['key'=>'pd_extended_field_12', 'type'=>1, 'values'=>$item[14] ?? '', 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
  393 + ['key'=>'pd_extended_field_13', 'type'=>1, 'values'=>$item[7], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
  394 + ];
  395 + $customExtendContentTModel->insert($saveData);
  396 +// }catch (\Exception $e){
  397 +// echo date('Y-m-d H:i:s') . '错误name:'. $item[0] . PHP_EOL;
  398 +// continue;
  399 +// }
382 } 400 }
383 } 401 }
384 402
@@ -90,7 +90,7 @@ class CopyProject extends Command @@ -90,7 +90,7 @@ class CopyProject extends Command
90 $data['finish_remain_day'] = 0; 90 $data['finish_remain_day'] = 0;
91 $data['title'] = $data['title'].'-copy'; 91 $data['title'] = $data['title'].'-copy';
92 $data['delete_status'] = 1; 92 $data['delete_status'] = 1;
93 - unset($data['id'],$data['robots'],$data['is_translate_tag'],$data['is_translate'],$data['is_minor_languages'],$data['uptime']); 93 + unset($data['id'],$data['exclusive_aicc_day'],$data['aicc'],$data['robots'],$data['is_translate_tag'],$data['is_translate'],$data['is_minor_languages'],$data['uptime']);
94 $project_id = $projectModel->insertGetId($data); 94 $project_id = $projectModel->insertGetId($data);
95 $hashids = new Hashids($data['from_order_id'], 13, 'abcdefghjkmnpqrstuvwxyz1234567890'); 95 $hashids = new Hashids($data['from_order_id'], 13, 'abcdefghjkmnpqrstuvwxyz1234567890');
96 $projectModel->edit(['from_order_id'=>$hashids->encode($project_id)],['id'=>$project_id]); 96 $projectModel->edit(['from_order_id'=>$hashids->encode($project_id)],['id'=>$project_id]);
@@ -200,7 +200,7 @@ class SyncProject extends Command @@ -200,7 +200,7 @@ class SyncProject extends Command
200 'requirement' => $param['remark'], 200 'requirement' => $param['remark'],
201 'cooperate_date' => date('Y-m-d', $param['create_time']), 201 'cooperate_date' => date('Y-m-d', $param['create_time']),
202 'from_order_id' => $param['from_order_id'], 202 'from_order_id' => $param['from_order_id'],
203 - 'aicc' => $param['exclusive_aicc'], 203 + 'aicc' => ($param['exclusive_aicc'] = 0),
204 "exclusive_aicc_day" => $param['exclusive_aicc_day'], 204 "exclusive_aicc_day" => $param['exclusive_aicc_day'],
205 'hagro' => $param['exclusive_hagro'], 205 'hagro' => $param['exclusive_hagro'],
206 "exclusive_hagro_day" => $param['exclusive_hagro_day'], 206 "exclusive_hagro_day" => $param['exclusive_hagro_day'],
@@ -12,6 +12,7 @@ use App\Models\Domain\DomainInfo; @@ -12,6 +12,7 @@ use App\Models\Domain\DomainInfo;
12 use App\Models\Mail\Mail; 12 use App\Models\Mail\Mail;
13 use App\Models\Project\DeployBuild; 13 use App\Models\Project\DeployBuild;
14 use App\Models\Project\DeployOptimize; 14 use App\Models\Project\DeployOptimize;
  15 +use App\Models\Project\Project;
15 use App\Models\Project\ProjectKeyword; 16 use App\Models\Project\ProjectKeyword;
16 use App\Models\Project\ProjectUpdateTdk; 17 use App\Models\Project\ProjectUpdateTdk;
17 use App\Models\User\User; 18 use App\Models\User\User;
@@ -263,6 +264,7 @@ class UpdateSeoTdk extends Command @@ -263,6 +264,7 @@ class UpdateSeoTdk extends Command
263 public function seo_tdk($project_id, $task_id) 264 public function seo_tdk($project_id, $task_id)
264 { 265 {
265 $notify_master = $notify_keyword = false; 266 $notify_master = $notify_keyword = false;
  267 + $project = Project::find($project_id);
266 //更新统计 268 //更新统计
267 $update = []; 269 $update = [];
268 //AI指令 是否有定制指令 270 //AI指令 是否有定制指令
@@ -366,15 +368,37 @@ class UpdateSeoTdk extends Command @@ -366,15 +368,37 @@ class UpdateSeoTdk extends Command
366 } 368 }
367 } else if ($table == 'gl_product_keyword' && $field == 'seo_title') { 369 } else if ($table == 'gl_product_keyword' && $field == 'seo_title') {
368 # TODO 聚合页seo title 特殊处理 前缀_1 . 关键词 . 后缀_2 370 # TODO 聚合页seo title 特殊处理 前缀_1 . 关键词 . 后缀_2
369 - $prefix = $this->getPrefixKeyword($project_id, 'prefix', 1);  
370 - $suffix = $this->getPrefixKeyword($project_id, 'suffix', 2);  
371 - if (empty($prefix) || empty($suffix)){  
372 - continue; 371 + $seo_title = '';
  372 + //只有推广项目才加 前后缀
  373 + if($project->type == Project::TYPE_TWO) {
  374 + $prefix = $this->getPrefixKeyword($project_id, 'prefix', 1);
  375 + $suffix = $this->getPrefixKeyword($project_id, 'suffix', 2);
  376 + if (empty($prefix) || empty($suffix)) {
  377 + continue;
  378 + }
  379 +
  380 + $title = $v[$this->topic_fields[$table]];
  381 +
  382 + $prefix = $this->getPrefixKeyword($project_id, 'prefix', 1, $title);
  383 + //in,for,with,to,near,from 这些介词 只拼前缀,不拼后缀
  384 + $suffix_ban = ['in ', 'for ', 'with ', 'to ', 'near ','from ', 'In ', 'For ', 'With ', 'To ', 'Near ','From '];
  385 + $suffix = '';
  386 + if(Str::contains($title, $suffix_ban)){
  387 + // 某些后缀不能并存的情况
  388 + $ban_suffix = [];
  389 + //services/service 结尾的词,后缀不拼manufacturer,factory
  390 + if (Str::endsWith($title, ['services', 'service', 'Services', 'Service'])) {
  391 + $ban_suffix = ['manufacturer', 'factory', 'Manufacturer', 'Factory', 'Factories', 'Manufacturers'];
  392 + }
  393 + //前缀有wholesale或cheap的词,后缀不拼 manufacturer,factory,exporter,company
  394 + if (Str::startsWith($title, ['wholesale', 'cheap', 'Wholesale', 'Cheap'])) {
  395 + $ban_suffix = array_merge($ban_suffix, ['manufacturer', 'factory', 'exporter', 'company', 'Manufacturer', 'Factory', 'Exporter', 'Company', 'Factories', 'Manufacturers', 'Exporters', 'Companies']);
  396 + }
  397 + $suffix = $this->getPrefixKeyword($project_id, 'suffix', 2, $title, $ban_suffix);
  398 + }
  399 + $seo_title = $prefix . ' ' . $title . ' ' . $suffix;
373 } 400 }
374 401
375 - $prefix = $this->getPrefixKeyword($project_id, 'prefix', 1, $v[$this->topic_fields[$table]]);  
376 - $suffix = $this->getPrefixKeyword($project_id, 'suffix', 2, $v[$this->topic_fields[$table]]);  
377 - $seo_title = $prefix . ' ' . $v[$this->topic_fields[$table]] . ' ' . $suffix;  
378 $data[$field] = trim($seo_title); 402 $data[$field] = trim($seo_title);
379 $update[$table]['title']++; 403 $update[$table]['title']++;
380 } else if ($table == 'gl_ai_blog_list' && $field == 'seo_title') { 404 } else if ($table == 'gl_ai_blog_list' && $field == 'seo_title') {
@@ -539,9 +563,11 @@ class UpdateSeoTdk extends Command @@ -539,9 +563,11 @@ class UpdateSeoTdk extends Command
539 * @param $project_id 563 * @param $project_id
540 * @param $type 564 * @param $type
541 * @param $num 565 * @param $num
  566 + * @param string $topic
  567 + * @param array $ban 被禁用的前后缀
542 * @return string 568 * @return string
543 */ 569 */
544 - public function getPrefixKeyword($project_id, $type, $num, $topic='') 570 + public function getPrefixKeyword($project_id, $type, $num, $topic='', $ban = [])
545 { 571 {
546 $str = ''; 572 $str = '';
547 $info = $this->getDeployOptimize($project_id); 573 $info = $this->getDeployOptimize($project_id);
@@ -551,6 +577,10 @@ class UpdateSeoTdk extends Command @@ -551,6 +577,10 @@ class UpdateSeoTdk extends Command
551 //去掉标题存在的词 577 //去掉标题存在的词
552 if ($topic) { 578 if ($topic) {
553 foreach ($fix_keyword as $k=>$keyword) { 579 foreach ($fix_keyword as $k=>$keyword) {
  580 + // 被禁用的关键词
  581 + if (in_array($keyword, $ban)) {
  582 + unset($fix_keyword[$k]);
  583 + }
554 // 前后缀如果已经存在, 就不在拼接当前类型 584 // 前后缀如果已经存在, 就不在拼接当前类型
555 if (FALSE !== strpos($topic, $keyword)) 585 if (FALSE !== strpos($topic, $keyword))
556 return $str; 586 return $str;
@@ -572,7 +602,7 @@ class UpdateSeoTdk extends Command @@ -572,7 +602,7 @@ class UpdateSeoTdk extends Command
572 //随机取 602 //随机取
573 shuffle($fix_keyword); 603 shuffle($fix_keyword);
574 if (count($fix_keyword) < $num) 604 if (count($fix_keyword) < $num)
575 - return $str; 605 + return implode(", ", $fix_keyword);
576 $keyword = array_slice($fix_keyword, 0, $num); 606 $keyword = array_slice($fix_keyword, 0, $num);
577 $str = implode(", ", $keyword); 607 $str = implode(", ", $keyword);
578 608
@@ -594,7 +624,7 @@ class UpdateSeoTdk extends Command @@ -594,7 +624,7 @@ class UpdateSeoTdk extends Command
594 $info = Cache::get($cache_key); 624 $info = Cache::get($cache_key);
595 if(!$info){ 625 if(!$info){
596 $projectOptimizeModel = new DeployOptimize(); 626 $projectOptimizeModel = new DeployOptimize();
597 - $info = $projectOptimizeModel->read(['project_id' => $project_id], ['id', 'company_en_name', 'company_en_description', 'keyword_prefix', 'keyword_suffix']); 627 + $info = $projectOptimizeModel->read(['project_id' => $project_id], ['id', 'company_en_name', 'company_en_description', 'keyword_prefix', 'keyword_suffix', 'brand_keyword']);
598 $projectKeywordModel = new ProjectKeyword(); 628 $projectKeywordModel = new ProjectKeyword();
599 $keywordInfo = $projectKeywordModel->read(['project_id'=>$project_id]); 629 $keywordInfo = $projectKeywordModel->read(['project_id'=>$project_id]);
600 $info['main_keyword'] = ''; 630 $info['main_keyword'] = '';
@@ -453,7 +453,7 @@ class PrivateController extends BaseController @@ -453,7 +453,7 @@ class PrivateController extends BaseController
453 return $this->error('未找到当前域名对应的项目!'); 453 return $this->error('未找到当前域名对应的项目!');
454 } 454 }
455 455
456 - $json = file_get_contents(storage_path('data/send_product_tag_keyword/' . $project->id . '.json')); 456 + $json = @file_get_contents(storage_path('data/send_product_tag_keyword/' . $project->id . '.json'));
457 $result = json_decode($json, true) ?: []; 457 $result = json_decode($json, true) ?: [];
458 return $this->success($result); 458 return $this->success($result);
459 } 459 }
@@ -27,12 +27,15 @@ class MonthReportController extends BaseController @@ -27,12 +27,15 @@ class MonthReportController extends BaseController
27 * @author :lyh 27 * @author :lyh
28 * @method :post 28 * @method :post
29 * @time :2024/2/2 15:14 29 * @time :2024/2/2 15:14
  30 + * @param :is_upgrade;1->升级项目
30 */ 31 */
31 public function getMonth(){ 32 public function getMonth(){
32 $monthCountModel = new MonthCount(); 33 $monthCountModel = new MonthCount();
33 $this->map['project_id'] = $this->user['project_id']; 34 $this->map['project_id'] = $this->user['project_id'];
34 - $this->map['month'] = ['>=',date('Y-m',strtotime($this->user['uptime']))];  
35 - $month = $monthCountModel->formatQuery($this->map)->pluck('month')->unique()->toArray(); 35 + if($this->user['is_upgrade'] != 1){
  36 + $this->map['month'] = ['>=',date('Y-m',strtotime($this->user['uptime']))];
  37 + }
  38 + $month = $monthCountModel->formatQuery($this->map)->orderBy('month', 'asc')->pluck('month')->unique()->toArray();
36 $this->response('success',Code::SUCCESS,$month); 39 $this->response('success',Code::SUCCESS,$month);
37 } 40 }
38 41
@@ -7,12 +7,12 @@ @@ -7,12 +7,12 @@
7 * @time :2025/3/12 17:01 7 * @time :2025/3/12 17:01
8 */ 8 */
9 9
10 -namespace App\Http\Controllers\Bside\Product; 10 +namespace App\Http\Controllers\Bside\SeoSetting;
11 11
12 use App\Enums\Common\Code; 12 use App\Enums\Common\Code;
13 use App\Http\Controllers\Bside\BaseController; 13 use App\Http\Controllers\Bside\BaseController;
14 -use App\Http\Logic\Bside\Product\KeywordUrlLogic;  
15 -use App\Models\Product\KeywordUrl; 14 +use App\Http\Logic\Bside\SeoSetting\KeywordUrlLogic;
  15 +use App\Models\SeoSetting\KeywordUrl;
16 16
17 /** 17 /**
18 * @remark :关键词设置 18 * @remark :关键词设置
  1 +<?php
  2 +/**
  3 + * @remark :
  4 + * @name :LinkDataController.php
  5 + * @author :lyh
  6 + * @method :post
  7 + * @time :2025/3/14 16:30
  8 + */
  9 +
  10 +namespace App\Http\Controllers\Bside\SeoSetting;
  11 +
  12 +use App\Enums\Common\Code;
  13 +use App\Http\Controllers\Bside\BaseController;
  14 +use App\Http\Logic\Bside\SeoSetting\LinkDataLogic;
  15 +use App\Models\SeoSetting\LinkData;
  16 +
  17 +class LinkDataController extends BaseController
  18 +{
  19 + /**
  20 + * @remark :获取列表页
  21 + * @name :lists
  22 + * @author :lyh
  23 + * @method :post
  24 + * @time :2025/3/14 16:33
  25 + */
  26 + public function lists(LinkData $linkData){
  27 + $lists = $linkData->lists($this->map,$this->page,$this->row);
  28 + $this->response('success',Code::SUCCESS,$lists);
  29 + }
  30 +
  31 + /**
  32 + * @remark :获取详情数据
  33 + * @name :info
  34 + * @author :lyh
  35 + * @method :post
  36 + * @time :2025/3/14 17:41
  37 + */
  38 + public function info(LinkData $linkData){
  39 + $this->request->validate([
  40 + 'id'=>['required'],
  41 + ],[
  42 + 'id.required' => 'id不能为空',
  43 + ]);
  44 + $info = $linkData->read(['id'=>$this->param['id']]);
  45 + $this->response('success',Code::SUCCESS,$info);
  46 + }
  47 +
  48 + /**
  49 + * @remark :批量添加
  50 + * @name :batchSave
  51 + * @author :lyh
  52 + * @method :post
  53 + * @time :2025/3/14 16:45
  54 + */
  55 + public function batchSave(LinkDataLogic $logic){
  56 + $this->request->validate([
  57 + 'data'=>['required'],
  58 + ],[
  59 + 'data.required' => 'da_values不能为空',
  60 + ]);
  61 + $logic->batchSave();
  62 + $this->response('success');
  63 + }
  64 +
  65 + /**
  66 + * @remark :删除
  67 + * @name :del
  68 + * @author :lyh
  69 + * @method :post
  70 + * @time :2025/3/14 16:45
  71 + */
  72 + public function del(LinkData $linkData){
  73 + $this->request->validate([
  74 + 'id'=>'required|array',
  75 + ],[
  76 + 'id.required' => 'id不能为空',
  77 + 'id.array' => 'id为数组',
  78 + ]);
  79 + $result = $linkData->del(['id'=>['in',$this->param['id']]]);
  80 + $this->response('success',Code::SUCCESS,$result);
  81 + }
  82 +}
@@ -7,11 +7,11 @@ @@ -7,11 +7,11 @@
7 * @time :2025/3/12 15:36 7 * @time :2025/3/12 15:36
8 */ 8 */
9 9
10 -namespace App\Http\Controllers\Bside\Setting; 10 +namespace App\Http\Controllers\Bside\SeoSetting;
11 11
12 use App\Enums\Common\Code; 12 use App\Enums\Common\Code;
13 use App\Http\Controllers\Bside\BaseController; 13 use App\Http\Controllers\Bside\BaseController;
14 -use App\Models\WebSetting\WebSettingYoutube; 14 +use App\Models\SeoSetting\WebSettingYoutube;
15 15
16 class WebSettingYoutubeController extends BaseController 16 class WebSettingYoutubeController extends BaseController
17 { 17 {
@@ -772,6 +772,7 @@ class ProjectLogic extends BaseLogic @@ -772,6 +772,7 @@ class ProjectLogic extends BaseLogic
772 $data['special'] = $this->model::specialMap(); 772 $data['special'] = $this->model::specialMap();
773 $data['search'] = $this->model::searchParam(); 773 $data['search'] = $this->model::searchParam();
774 $data['plan'] = $this->model::planMap(); 774 $data['plan'] = $this->model::planMap();
  775 + $data['blog_frequency'] = $this->model::typeBlogFrequency();
775 return $this->success($data); 776 return $this->success($data);
776 } 777 }
777 778
@@ -7,10 +7,10 @@ @@ -7,10 +7,10 @@
7 * @time :2025/3/12 17:06 7 * @time :2025/3/12 17:06
8 */ 8 */
9 9
10 -namespace App\Http\Logic\Bside\Product; 10 +namespace App\Http\Logic\Bside\SeoSetting;
11 11
12 use App\Http\Logic\Bside\BaseLogic; 12 use App\Http\Logic\Bside\BaseLogic;
13 -use App\Models\Product\KeywordUrl; 13 +use App\Models\SeoSetting\KeywordUrl;
14 14
15 /** 15 /**
16 * @remark :关键词设置 16 * @remark :关键词设置
  1 +<?php
  2 +/**
  3 + * @remark :
  4 + * @name :LinkDataLogic.php
  5 + * @author :lyh
  6 + * @method :post
  7 + * @time :2025/3/14 17:20
  8 + */
  9 +
  10 +namespace App\Http\Logic\Bside\SeoSetting;
  11 +
  12 +use App\Http\Logic\Bside\BaseLogic;
  13 +use App\Models\SeoSetting\LinkData;
  14 +
  15 +/**
  16 + * @remark :获取外链数据
  17 + * @name :LinkDataLogic
  18 + * @author :lyh
  19 + * @method :post
  20 + * @time :2025/3/14 17:21
  21 + */
  22 +class LinkDataLogic extends BaseLogic
  23 +{
  24 + public function __construct()
  25 + {
  26 + parent::__construct();
  27 + $this->param = $this->requestAll;
  28 + $this->model = new LinkData();
  29 + }
  30 +
  31 + /**
  32 + * @remark :保存数据
  33 + * @name :batchSave
  34 + * @author :lyh
  35 + * @method :post
  36 + * @time :2025/3/14 17:22
  37 + * @param :url->外链;da_values->da值
  38 + */
  39 + public function batchSave(){
  40 + $data = [];
  41 + foreach ($this->param['data'] as $v){
  42 + $data[] = [
  43 + 'url'=>$v['url'],
  44 + 'da_values'=>$v['da_values'],
  45 + ];
  46 + }
  47 + if(!empty($data)){
  48 + $this->model->insertAll($data);
  49 + }
  50 + return $this->success();
  51 + }
  52 +}
@@ -12,13 +12,6 @@ class DeployOptimize extends Base @@ -12,13 +12,6 @@ class DeployOptimize extends Base
12 protected $table = 'gl_project_deploy_optimize'; 12 protected $table = 'gl_project_deploy_optimize';
13 13
14 14
15 -// public function setMinorLanguagesAttribute($value){  
16 -// $this->attributes['minor_languages'] = Arr::a2s($value);  
17 -// }  
18 -//  
19 -// public function getMinorLanguagesAttribute($value){  
20 -// return Arr::s2a($value);  
21 -// }  
22 public function getGTopPlanAttribute($value){ 15 public function getGTopPlanAttribute($value){
23 return Arr::s2a($value); 16 return Arr::s2a($value);
24 } 17 }
@@ -55,6 +55,27 @@ class Project extends Base @@ -55,6 +55,27 @@ class Project extends Base
55 } 55 }
56 56
57 /** 57 /**
  58 + * @remark :aiBlog发布频率
  59 + * @name :typeBlogFrequency
  60 + * @author :lyh
  61 + * @method :post
  62 + * @time :2025/3/15 10:29
  63 + */
  64 + public static function typeBlogFrequency($val = 0){
  65 + $arr = [
  66 + 1=>'1-2',
  67 + 2=>'2-3',
  68 + 3=>'2-4',
  69 + 4=>'3-5',
  70 + 5=>'5-7',
  71 + ];
  72 + if($val){
  73 + return $arr[$val] ?? '';
  74 + }
  75 + return $arr;
  76 + }
  77 +
  78 + /**
58 * 项目类型 79 * 项目类型
59 * @return string[] 80 * @return string[]
60 * @author zbj 81 * @author zbj
@@ -107,9 +128,10 @@ class Project extends Base @@ -107,9 +128,10 @@ class Project extends Base
107 return [ 128 return [
108 1 => '自建站项目', 129 1 => '自建站项目',
109 2 => '重点跟进', 130 2 => '重点跟进',
110 - 3 => '推广案例',  
111 - 4 => '全球搜案例',  
112 - 5 => '设计师案例', 131 + 3 => '经典案例',
  132 + 4 => '全球搜案例库',
  133 + 5 => '设计师精美网站',
  134 + 18 => '多语言案例',
113 6 => '可登陆后台', 135 6 => '可登陆后台',
114 7 => 'T项目', 136 7 => 'T项目',
115 8 => '特殊前后缀', 137 8 => '特殊前后缀',
@@ -122,6 +144,7 @@ class Project extends Base @@ -122,6 +144,7 @@ class Project extends Base
122 15 => 'AI案例', 144 15 => 'AI案例',
123 16 => '6.0广告', 145 16 => '6.0广告',
124 17 => '超哥监控项目', 146 17 => '超哥监控项目',
  147 + 19 => '商城案例',
125 ]; 148 ];
126 } 149 }
127 150
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 * @time :2025/3/12 16:59 7 * @time :2025/3/12 16:59
8 */ 8 */
9 9
10 -namespace App\Models\Product; 10 +namespace App\Models\SeoSetting;
11 11
12 use App\Models\Base; 12 use App\Models\Base;
13 13
  1 +<?php
  2 +/**
  3 + * @remark :
  4 + * @name :LinkData.php
  5 + * @author :lyh
  6 + * @method :post
  7 + * @time :2025/3/14 16:30
  8 + */
  9 +
  10 +namespace App\Models\SeoSetting;
  11 +
  12 +use App\Models\Base;
  13 +
  14 +/**
  15 + * @remark :外链数据
  16 + * @name :LinkData
  17 + * @author :lyh
  18 + * @method :post
  19 + * @time :2025/3/14 16:31
  20 + */
  21 +class LinkData extends Base
  22 +{
  23 + protected $table = 'gl_link_data';
  24 + //连接数据库
  25 + protected $connection = 'custom_mysql';
  26 +}
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 * @time :2025/3/11 15:51 7 * @time :2025/3/11 15:51
8 */ 8 */
9 9
10 -namespace App\Models\WebSetting; 10 +namespace App\Models\SeoSetting;
11 11
12 use App\Models\Base; 12 use App\Models\Base;
13 13
@@ -670,16 +670,24 @@ Route::middleware(['bloginauth'])->group(function () { @@ -670,16 +670,24 @@ Route::middleware(['bloginauth'])->group(function () {
670 670
671 //seo白帽 youtube账号密码设置 671 //seo白帽 youtube账号密码设置
672 Route::prefix('youtube')->group(function () { 672 Route::prefix('youtube')->group(function () {
673 - Route::any('/info', [\App\Http\Controllers\Bside\Setting\WebSettingYoutubeController::class, 'getYoutubeInfo'])->name('youtube_getYoutubeInfo');  
674 - Route::any('/save', [\App\Http\Controllers\Bside\Setting\WebSettingYoutubeController::class, 'saveYoutube'])->name('youtube_saveYoutube'); 673 + Route::any('/info', [\App\Http\Controllers\Bside\SeoSetting\WebSettingYoutubeController::class, 'getYoutubeInfo'])->name('youtube_getYoutubeInfo');
  674 + Route::any('/save', [\App\Http\Controllers\Bside\SeoSetting\WebSettingYoutubeController::class, 'saveYoutube'])->name('youtube_saveYoutube');
675 }); 675 });
676 676
677 //seo白帽 关键词设置 677 //seo白帽 关键词设置
678 Route::prefix('keyword_url')->group(function () { 678 Route::prefix('keyword_url')->group(function () {
679 - Route::any('/', [\App\Http\Controllers\Bside\Product\KeywordUrlController::class, 'lists'])->name('keyword_url_lists');  
680 - Route::any('/info', [\App\Http\Controllers\Bside\Product\KeywordUrlController::class, 'info'])->name('keyword_url_info');  
681 - Route::any('/save', [\App\Http\Controllers\Bside\Product\KeywordUrlController::class, 'save'])->name('keyword_url_save');  
682 - Route::any('/del', [\App\Http\Controllers\Bside\Product\KeywordUrlController::class, 'del'])->name('keyword_url_del'); 679 + Route::any('/', [\App\Http\Controllers\Bside\SeoSetting\KeywordUrlController::class, 'lists'])->name('keyword_url_lists');
  680 + Route::any('/info', [\App\Http\Controllers\Bside\SeoSetting\KeywordUrlController::class, 'info'])->name('keyword_url_info');
  681 + Route::any('/save', [\App\Http\Controllers\Bside\SeoSetting\KeywordUrlController::class, 'save'])->name('keyword_url_save');
  682 + Route::any('/del', [\App\Http\Controllers\Bside\SeoSetting\KeywordUrlController::class, 'del'])->name('keyword_url_del');
  683 + });
  684 +
  685 + //seo白帽 外链设置
  686 + Route::prefix('link_data')->group(function () {
  687 + Route::any('/', [\App\Http\Controllers\Bside\SeoSetting\LinkDataController::class, 'lists'])->name('link_data_lists');
  688 + Route::any('/batchSave', [\App\Http\Controllers\Bside\SeoSetting\LinkDataController::class, 'batchSave'])->name('link_data_batchSave');
  689 + Route::any('/info', [\App\Http\Controllers\Bside\SeoSetting\LinkDataController::class, 'info'])->name('link_data_info');
  690 + Route::any('/del', [\App\Http\Controllers\Bside\SeoSetting\LinkDataController::class, 'del'])->name('link_data_del');
683 }); 691 });
684 }); 692 });
685 //无需登录验证的路由组 693 //无需登录验证的路由组