作者 zhl

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

@@ -99,6 +99,9 @@ class RemainDay extends Command @@ -99,6 +99,9 @@ class RemainDay extends Command
99 } 99 }
100 //白帽版本的系统 100 //白帽版本的系统
101 if($deploy_build['seo_plan'] == 1){ 101 if($deploy_build['seo_plan'] == 1){
  102 + if($deploy_build['seo_service_duration'] == 0){
  103 + continue;
  104 + }
102 if($item['uptime']){ 105 if($item['uptime']){
103 $diff = time() - strtotime($item['uptime']); 106 $diff = time() - strtotime($item['uptime']);
104 $seo_remain_day = $deploy_build['seo_service_duration'] - floor($diff / (60 * 60 * 24)); 107 $seo_remain_day = $deploy_build['seo_service_duration'] - floor($diff / (60 * 60 * 24));
@@ -115,6 +118,10 @@ class RemainDay extends Command @@ -115,6 +118,10 @@ class RemainDay extends Command
115 //同时包括白帽版本+默认版本的项目 118 //同时包括白帽版本+默认版本的项目
116 $this->project->edit(['seo_remain_day'=>$seo_remain_day],['id'=>$item['id']]); 119 $this->project->edit(['seo_remain_day'=>$seo_remain_day],['id'=>$item['id']]);
117 } 120 }
  121 + if($deploy_build['service_duration'] == 0){
  122 + //服务时长为0自动跳过
  123 + continue;
  124 + }
118 //默认版本计算剩余服务时常 125 //默认版本计算剩余服务时常
119 if($item['type'] == Project::TYPE_TWO || $item['type'] == Project::TYPE_FOUR){ 126 if($item['type'] == Project::TYPE_TWO || $item['type'] == Project::TYPE_FOUR){
120 if(in_array($item['id'],$this->projectId)){//已开始优化的时间结算 127 if(in_array($item['id'],$this->projectId)){//已开始优化的时间结算
@@ -9,8 +9,10 @@ @@ -9,8 +9,10 @@
9 9
10 namespace App\Console\Commands\LyhTest; 10 namespace App\Console\Commands\LyhTest;
11 11
  12 +use App\Console\Commands\Domain\DomainInfo;
12 use App\Models\Com\NoticeLog; 13 use App\Models\Com\NoticeLog;
13 use App\Models\Project\AiBlogTask; 14 use App\Models\Project\AiBlogTask;
  15 +use App\Models\Project\DeployBuild;
14 use App\Models\Project\Project; 16 use App\Models\Project\Project;
15 use Illuminate\Console\Command; 17 use Illuminate\Console\Command;
16 use Illuminate\Support\Facades\Artisan; 18 use Illuminate\Support\Facades\Artisan;
@@ -33,9 +35,14 @@ class lyhDemo extends Command @@ -33,9 +35,14 @@ class lyhDemo extends Command
33 protected $description = '更新路由'; 35 protected $description = '更新路由';
34 36
35 public function handle(){ 37 public function handle(){
36 - $projectModel = new Project();  
37 - $noticeModel = new NoticeLog();  
38 - $lists = $projectModel->list(['from_order_id'=>null]); 38 + $projectBuildModel = new DeployBuild();
  39 + $projectList = $projectBuildModel->list(['plan'=>0,'seo_plan'=>1],'project_id');
  40 + foreach ($projectList as $val){
  41 + if(!empty($val['service_duration']) && empty($val['seo_service_duration'])){
  42 + $projectBuildModel->edit(['seo_service_duration'=>$val['service_duration']],['id'=>$val['id']]);
  43 + echo '项目id:'.$val['project_id'].PHP_EOL;
  44 + }
  45 + }
39 return true; 46 return true;
40 } 47 }
41 } 48 }
@@ -2,12 +2,11 @@ @@ -2,12 +2,11 @@
2 2
3 namespace App\Console\Commands\RankData; 3 namespace App\Console\Commands\RankData;
4 4
5 -use App\Helper\QuanqiusouApi; 5 +
  6 +use App\Http\Logic\Bside\RankData\RankDataLogic;
6 use App\Models\RankData\RankDataLog as RankDataLogModel; 7 use App\Models\RankData\RankDataLog as RankDataLogModel;
7 -use App\Models\Project\DeployOptimize; 8 +use App\Models\Domain\DomainInfo;
8 use App\Models\Project\Project; 9 use App\Models\Project\Project;
9 -use Illuminate\Support\Facades\Cache;  
10 -use Illuminate\Support\Facades\DB;  
11 use Illuminate\Support\Facades\Log; 10 use Illuminate\Support\Facades\Log;
12 11
13 /** 12 /**
@@ -49,8 +48,7 @@ class RankData extends BaseCommands @@ -49,8 +48,7 @@ class RankData extends BaseCommands
49 Cache::set('clear_remain_today_' . date('Y-m-d'), 1, 24 * 3600); 48 Cache::set('clear_remain_today_' . date('Y-m-d'), 1, 24 * 3600);
50 } 49 }
51 50
52 - $projectModel = new Project();  
53 - $list = $projectModel->leftJoin('gl_project_deploy_optimize', 'gl_project.id', '=', 'gl_project_deploy_optimize.project_id') 51 + $list = Project::leftJoin('gl_project_deploy_optimize', 'gl_project.id', '=', 'gl_project_deploy_optimize.project_id')
54 ->where('gl_project.extend_type',0) 52 ->where('gl_project.extend_type',0)
55 ->where('gl_project.delete_status',0) 53 ->where('gl_project.delete_status',0)
56 ->where('gl_project_deploy_optimize.api_no', '>', 0) 54 ->where('gl_project_deploy_optimize.api_no', '>', 0)
@@ -79,6 +77,22 @@ class RankData extends BaseCommands @@ -79,6 +77,22 @@ class RankData extends BaseCommands
79 RankDataLogModel::addTask($item['project_id'], $item['api_no'], $lang); 77 RankDataLogModel::addTask($item['project_id'], $item['api_no'], $lang);
80 } 78 }
81 } 79 }
  80 +
  81 + //白帽SEO版
  82 + $list = Project::leftJoin('gl_project_deploy_build', 'gl_project.id', '=', 'gl_project_deploy_build.project_id')
  83 + ->where('gl_project.delete_status',0)
  84 + ->where('gl_project_deploy_build.seo_plan', 1)
  85 + ->whereIn('gl_project.type',[2,3,4])
  86 + ->orderBy('gl_project.id', 'asc')
  87 + ->pluck('gl_project.id')->toArray();
  88 + foreach ($list as $project_id){
  89 + $domain = DomainInfo::getCacheInfoByProjectId($project_id);
  90 + $id = RankDataLogic::instance()->getBmSeoProjects($domain['domain']);
  91 + if(!$id){
  92 + continue;
  93 + }
  94 + RankDataLogModel::addTask($project_id, $id . '_bmseo');
  95 + }
82 } catch (\Exception|\Throwable $e) { 96 } catch (\Exception|\Throwable $e) {
83 Log::channel('rank_data')->error('排名数据任务失败 ' . $e->getMessage()); 97 Log::channel('rank_data')->error('排名数据任务失败 ' . $e->getMessage());
84 } 98 }
@@ -13,6 +13,7 @@ use App\Models\Project\Project; @@ -13,6 +13,7 @@ use App\Models\Project\Project;
13 use Illuminate\Support\Facades\Cache; 13 use Illuminate\Support\Facades\Cache;
14 use Illuminate\Support\Facades\Log; 14 use Illuminate\Support\Facades\Log;
15 use Illuminate\Support\Facades\Redis; 15 use Illuminate\Support\Facades\Redis;
  16 +use Illuminate\Support\Str;
16 17
17 /** 18 /**
18 * Class GoogleRank 19 * Class GoogleRank
@@ -76,8 +77,13 @@ class RankDataLog extends BaseCommands @@ -76,8 +77,13 @@ class RankDataLog extends BaseCommands
76 $log->data = Arr::s2a($res); 77 $log->data = Arr::s2a($res);
77 //保存数据 78 //保存数据
78 $this->output('保存排名数据:ID'.$log->project_id . ',APINO' . $log->api_no); 79 $this->output('保存排名数据:ID'.$log->project_id . ',APINO' . $log->api_no);
79 - $is_compliance = (new RankDataLogic())->save_rank($log->project_id, $log->api_no, $res, null, $log->lang);  
80 - $log->is_compliance = $is_compliance; 80 + if(Str::endsWith($log->api_no, '_bmseo')){
  81 + //白帽版
  82 + (new RankDataLogic())->save_rank_bmseo($log->project_id, $log->api_no, $res);
  83 + }else{
  84 + $is_compliance = (new RankDataLogic())->save_rank($log->project_id, $log->api_no, $res, null, $log->lang);
  85 + $log->is_compliance = $is_compliance;
  86 + }
81 $log->status = 1; 87 $log->status = 1;
82 $log->save(); 88 $log->save();
83 89
@@ -74,7 +74,7 @@ class RecommendedSuppliers extends Command @@ -74,7 +74,7 @@ class RecommendedSuppliers extends Command
74 DB::disconnect('custom_mysql'); 74 DB::disconnect('custom_mysql');
75 } 75 }
76 }catch (\Exception $e){ 76 }catch (\Exception $e){
77 - echo date('Y-m-d hH:i:s').'当前项目执行错误:'.$e->getMessage().PHP_EOL; 77 + echo date('Y-m-d H:i:s').'当前项目执行错误:'.$e->getMessage().PHP_EOL;
78 continue; 78 continue;
79 } 79 }
80 } 80 }
@@ -166,7 +166,7 @@ class RecommendedSuppliers extends Command @@ -166,7 +166,7 @@ class RecommendedSuppliers extends Command
166 $saveData = [ 166 $saveData = [
167 'project_id'=>$project_id, 167 'project_id'=>$project_id,
168 'keyword'=>$keyword, 168 'keyword'=>$keyword,
169 - 'data'=>json_encode($res['data'] ?? '') 169 + 'data'=>json_encode($res['data'] ?? [])
170 ]; 170 ];
171 $purchaserModel = new Purchaser(); 171 $purchaserModel = new Purchaser();
172 $purchaserModel->add($saveData); 172 $purchaserModel->add($saveData);
@@ -214,8 +214,6 @@ class RecommendedSuppliers extends Command @@ -214,8 +214,6 @@ class RecommendedSuppliers extends Command
214 $v['mobile'] = json_encode($v['mobile']??[],JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); 214 $v['mobile'] = json_encode($v['mobile']??[],JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
215 $v['social_media'] = json_encode($v['social_media']??[],JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); 215 $v['social_media'] = json_encode($v['social_media']??[],JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
216 $v['image'] = str_replace('admin.hagro.cn','fob.ai.cc',$v['image']??''); 216 $v['image'] = str_replace('admin.hagro.cn','fob.ai.cc',$v['image']??'');
217 -// $v['created_at'] = date('Y-m-d H:i:s');  
218 -// $v['updated_at'] = $v['created_at'];  
219 $param = $v; 217 $param = $v;
220 $info = $purchaserInfoModel->read(['keyword'=>$keyword,'buyer_id'=>$v['buyer_id']??0,'project_id'=>$project_id],['id']); 218 $info = $purchaserInfoModel->read(['keyword'=>$keyword,'buyer_id'=>$v['buyer_id']??0,'project_id'=>$project_id],['id']);
221 if($info === false){ 219 if($info === false){
@@ -6,6 +6,7 @@ namespace App\Helper; @@ -6,6 +6,7 @@ namespace App\Helper;
6 use App\Models\Project\Project; 6 use App\Models\Project\Project;
7 use App\Utils\HttpUtils; 7 use App\Utils\HttpUtils;
8 use GuzzleHttp\Exception\GuzzleException; 8 use GuzzleHttp\Exception\GuzzleException;
  9 +use Illuminate\Support\Facades\Log;
9 10
10 11
11 /** 12 /**
@@ -154,7 +155,7 @@ class FormGlobalsoApi @@ -154,7 +155,7 @@ class FormGlobalsoApi
154 $res = HttpUtils::post($api_url, $data); 155 $res = HttpUtils::post($api_url, $data);
155 $res = Arr::s2a($res); 156 $res = Arr::s2a($res);
156 } catch (\Exception | GuzzleException $e) { 157 } catch (\Exception | GuzzleException $e) {
157 - errorLog('提交询盘信息失败', $data, $e); 158 + Log::channel('inquiry')->info('询盘发送邮件失败' . $e->getMessage(), $data);
158 return false; 159 return false;
159 } 160 }
160 return $res; 161 return $res;
@@ -834,6 +834,16 @@ function ends_with($string, $suffix) @@ -834,6 +834,16 @@ function ends_with($string, $suffix)
834 return substr($string, -strlen($suffix)) === $suffix; 834 return substr($string, -strlen($suffix)) === $suffix;
835 } 835 }
836 836
  837 +function getCustomRouteMap($module_route,$route = '')
  838 +{
  839 + if($module_route == $route){
  840 + $resultRoute = $route;
  841 + }else{
  842 + $resultRoute = $module_route.'_catalog/'.$route;
  843 + }
  844 + return $resultRoute;
  845 +}
  846 +
837 /** 847 /**
838 * @remark :获取二级路由 848 * @remark :获取二级路由
839 * @name :getRouteMap 849 * @name :getRouteMap
@@ -841,11 +851,24 @@ function ends_with($string, $suffix) @@ -841,11 +851,24 @@ function ends_with($string, $suffix)
841 * @method :post 851 * @method :post
842 * @time :2023/11/10 14:29 852 * @time :2023/11/10 14:29
843 */ 853 */
844 -function getRouteMap($source,$source_id){ 854 +function getRouteMap($source,$source_id,$is_upgrade = 0){
845 $route = ''; 855 $route = '';
846 $routeMapModel = new RouteMap(); 856 $routeMapModel = new RouteMap();
847 $info = $routeMapModel->read(['source'=>$source,'source_id'=>$source_id]); 857 $info = $routeMapModel->read(['source'=>$source,'source_id'=>$source_id]);
848 if($info !== false){ 858 if($info !== false){
  859 + if($is_upgrade == 1){
  860 + if($source == $routeMapModel::SOURCE_NEWS_CATE){
  861 + if($info['route'] != 'news'){
  862 + return $routeMapModel::PATH_NEWS_CATE.'/'.$info['route'];
  863 + }
  864 + }elseif ($source == $routeMapModel::SOURCE_BLOG_CATE){
  865 + if($info['route'] != 'blog'){
  866 + return $routeMapModel::PATH_BLOG_CATE.'/'.$info['route'];
  867 + }
  868 + }
  869 + $route = $info['route'];
  870 + return $route;
  871 + }
849 if(!empty($info['path'])){ 872 if(!empty($info['path'])){
850 if($info['path'] == 'blog'){ 873 if($info['path'] == 'blog'){
851 $info['path'] = $info['path'].'s'; 874 $info['path'] = $info['path'].'s';
@@ -147,8 +147,8 @@ class OptimizeController extends BaseController @@ -147,8 +147,8 @@ class OptimizeController extends BaseController
147 $data = APublicModel::getNumByProjectId($item['id']); 147 $data = APublicModel::getNumByProjectId($item['id']);
148 } 148 }
149 $manageModel = new ManageHr(); 149 $manageModel = new ManageHr();
150 - $plan = Project::planMap();  
151 - $seo_plan = Project::seoMap(); 150 +// $plan = Project::planMap();
  151 +// $seo_plan = Project::seoMap();
152 $item['channel'] = Channel::getChannelText($item['channel']['user_id'] ?? 0); 152 $item['channel'] = Channel::getChannelText($item['channel']['user_id'] ?? 0);
153 $item['build_leader'] = $manageModel->getName($item['leader_mid']); 153 $item['build_leader'] = $manageModel->getName($item['leader_mid']);
154 $item['build_manager'] = $manageModel->getName($item['manager_mid']); 154 $item['build_manager'] = $manageModel->getName($item['manager_mid']);
@@ -159,8 +159,6 @@ class OptimizeController extends BaseController @@ -159,8 +159,6 @@ class OptimizeController extends BaseController
159 $item['optimize_assist'] = $manageModel->getName($item['optimize_assist_mid']); 159 $item['optimize_assist'] = $manageModel->getName($item['optimize_assist_mid']);
160 $item['optimize_tech'] = $manageModel->getName($item['optimize_tech_mid']); 160 $item['optimize_tech'] = $manageModel->getName($item['optimize_tech_mid']);
161 $item['quality_mid_name'] = $manageModel->getName($item['quality_mid']); 161 $item['quality_mid_name'] = $manageModel->getName($item['quality_mid']);
162 - $item['plan'] = $plan[$item['plan']] ?? 0;  
163 - $item['seo_plan'] = $seo_plan[$item['plan']] ?? 0;  
164 $item['created_at'] = date('Y年m月d日', strtotime($item['cooperate_date'])); 162 $item['created_at'] = date('Y年m月d日', strtotime($item['cooperate_date']));
165 $item['autologin_code'] = getAutoLoginCode($item['id']); 163 $item['autologin_code'] = getAutoLoginCode($item['id']);
166 $item['domain'] = 'https://'.$item['domain'].'/'; 164 $item['domain'] = 'https://'.$item['domain'].'/';
@@ -194,6 +192,7 @@ class OptimizeController extends BaseController @@ -194,6 +192,7 @@ class OptimizeController extends BaseController
194 'gl_project.finish_remain_day AS finish_remain_day', 192 'gl_project.finish_remain_day AS finish_remain_day',
195 'gl_project.is_remain_today AS is_remain_today', 193 'gl_project.is_remain_today AS is_remain_today',
196 'gl_project.remain_day AS remain_day', 194 'gl_project.remain_day AS remain_day',
  195 + 'gl_project.seo_remain_day AS seo_remain_day',
197 'gl_project.robots AS robots', 196 'gl_project.robots AS robots',
198 'gl_project.is_minor_languages AS is_minor_languages', 197 'gl_project.is_minor_languages AS is_minor_languages',
199 'gl_project.is_translate AS is_translate', 198 'gl_project.is_translate AS is_translate',
@@ -29,7 +29,7 @@ class BlogCategoryController extends BaseController @@ -29,7 +29,7 @@ class BlogCategoryController extends BaseController
29 $template_id = $this->getTemplateId(BTemplate::SOURCE_BLOG,BTemplate::IS_LIST); 29 $template_id = $this->getTemplateId(BTemplate::SOURCE_BLOG,BTemplate::IS_LIST);
30 foreach ($lists as $k => $v){ 30 foreach ($lists as $k => $v){
31 $v['num'] = $blogModel->formatQuery(['category_id'=>['like','%,' . $v['id'] . ',%']])->count(); 31 $v['num'] = $blogModel->formatQuery(['category_id'=>['like','%,' . $v['id'] . ',%']])->count();
32 - $v['url'] = $this->user['domain'] . getRouteMap(RouteMap::SOURCE_BLOG_CATE,$v['id']); 32 + $v['url'] = $this->user['domain'] . getRouteMap(RouteMap::SOURCE_BLOG_CATE,$v['id'],$this->user['is_upgrade']);
33 $v['is_renovation'] = $this->getIsRenovation(BTemplate::SOURCE_BLOG,BTemplate::IS_LIST,$template_id,$v['id']); 33 $v['is_renovation'] = $this->getIsRenovation(BTemplate::SOURCE_BLOG,BTemplate::IS_LIST,$template_id,$v['id']);
34 $lists[$k] = $v; 34 $lists[$k] = $v;
35 } 35 }
@@ -42,12 +42,7 @@ class CustomModuleCategoryController extends BaseController @@ -42,12 +42,7 @@ class CustomModuleCategoryController extends BaseController
42 $template_id = $this->getModuleTemplateId($this->param['module_id']); 42 $template_id = $this->getModuleTemplateId($this->param['module_id']);
43 foreach ($list as $k => $v){ 43 foreach ($list as $k => $v){
44 $v['is_renovation'] = $this->getIsRenovation($v['module_id'],BTemplate::IS_LIST,$template_id,$v['id'],BTemplate::IS_CUSTOM); 44 $v['is_renovation'] = $this->getIsRenovation($v['module_id'],BTemplate::IS_LIST,$template_id,$v['id'],BTemplate::IS_CUSTOM);
45 - $v['url'] = $this->user['domain'].$v['route'];  
46 - if($this->user['is_upgrade'] == 1){  
47 - if($v['route'] != $moduleInfo['route']){  
48 - $v['url'] = $this->user['domain'].$moduleInfo['route']."_catalog/".$v['route'];  
49 - }  
50 - } 45 + $v['url'] = $this->user['domain'].getCustomRouteMap($moduleInfo['route'],$v['route']);
51 $list[$k] = $v; 46 $list[$k] = $v;
52 } 47 }
53 } 48 }
@@ -37,7 +37,7 @@ class GoogleSearchController extends BaseController @@ -37,7 +37,7 @@ class GoogleSearchController extends BaseController
37 //查询详情数据 37 //查询详情数据
38 $searchDetailModel = new GoogleSearchDetail(); 38 $searchDetailModel = new GoogleSearchDetail();
39 $this->map['project_id'] = $this->user['project_id']; 39 $this->map['project_id'] = $this->user['project_id'];
40 - $data = $searchDetailModel->lists($this->map,$this->page,$this->row,'impressions',['keys','click_rate','impressions_rate']); 40 + $data = $searchDetailModel->lists($this->map,$this->page,$this->row,'impressions',['keys','click_rate','position','impressions_rate']);
41 if(!empty($data)){ 41 if(!empty($data)){
42 if($this->param['type'] == 'country'){ 42 if($this->param['type'] == 'country'){
43 $codeCountryModel = new GoogleCodeCountry(); 43 $codeCountryModel = new GoogleCodeCountry();
@@ -29,7 +29,7 @@ class NewsCategoryController extends BaseController @@ -29,7 +29,7 @@ class NewsCategoryController extends BaseController
29 $template_id = $this->getTemplateId(BTemplate::SOURCE_BLOG,BTemplate::IS_LIST); 29 $template_id = $this->getTemplateId(BTemplate::SOURCE_BLOG,BTemplate::IS_LIST);
30 foreach ($lists as $k => $v){ 30 foreach ($lists as $k => $v){
31 $v['num'] = $newsModel->formatQuery(['category_id'=>['like','%,' . $v['id'] . ',%']])->count(); 31 $v['num'] = $newsModel->formatQuery(['category_id'=>['like','%,' . $v['id'] . ',%']])->count();
32 - $v['url'] = $this->user['domain'].getRouteMap(RouteMap::SOURCE_NEWS_CATE,$v['id']); 32 + $v['url'] = $this->user['domain'].getRouteMap(RouteMap::SOURCE_NEWS_CATE,$v['id'],$this->user['is_upgrade']);
33 $v['is_renovation'] = $this->getIsRenovation(BTemplate::SOURCE_NEWS,BTemplate::IS_LIST,$template_id,$v['id']); 33 $v['is_renovation'] = $this->getIsRenovation(BTemplate::SOURCE_NEWS,BTemplate::IS_LIST,$template_id,$v['id']);
34 $lists[$k] = $v; 34 $lists[$k] = $v;
35 } 35 }
@@ -321,6 +321,9 @@ class NewsController extends BaseController @@ -321,6 +321,9 @@ class NewsController extends BaseController
321 'keyword.required' => 'keyword不能为空', 321 'keyword.required' => 'keyword不能为空',
322 ]); 322 ]);
323 $data = curl_get('http://gnews.globalso.com/gnews_news.php?keyword='.$this->param['keyword'],true); 323 $data = curl_get('http://gnews.globalso.com/gnews_news.php?keyword='.$this->param['keyword'],true);
  324 + if(isset($data['data']['p'][0]) && !empty($data['data']['p'][0])){
  325 + $data['data']['p'][0] = str_replace('&nbsp' ,' ',$data['data']['p'][0]);
  326 + }
324 $this->response('success',Code::SUCCESS,$data); 327 $this->response('success',Code::SUCCESS,$data);
325 } 328 }
326 329
@@ -13,6 +13,8 @@ use App\Enums\Common\Code; @@ -13,6 +13,8 @@ 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\Setting\TranslateLogic; 14 use App\Http\Logic\Bside\Setting\TranslateLogic;
15 use App\Models\Blog\Blog; 15 use App\Models\Blog\Blog;
  16 +use App\Models\CustomModule\CustomModule;
  17 +use App\Models\CustomModule\CustomModuleCategory;
16 use App\Models\CustomModule\CustomModuleContent; 18 use App\Models\CustomModule\CustomModuleContent;
17 use App\Models\News\News; 19 use App\Models\News\News;
18 use App\Models\Product\Product; 20 use App\Models\Product\Product;
@@ -279,7 +281,19 @@ class TranslateController extends BaseController @@ -279,7 +281,19 @@ class TranslateController extends BaseController
279 case RouteMap::SOURCE_MODULE_CATE: 281 case RouteMap::SOURCE_MODULE_CATE:
280 $customModel = new CustomModuleContent(); 282 $customModel = new CustomModuleContent();
281 $count = $customModel->formatQuery(['category_id'=>['like','%,'.$v['source_id'].',%']])->count(); 283 $count = $customModel->formatQuery(['category_id'=>['like','%,'.$v['source_id'].',%']])->count();
282 - $this->pageSixList($data,$count,$v,3,10); 284 + //获取module_id
  285 + $customCateModel = new CustomModuleCategory();
  286 + $cateInfo = $customCateModel->read(['route'=>$v['route']],['module_id']);
  287 + if($cateInfo !== false){
  288 + $model = new CustomModule();
  289 + $moduleInfo = $model->read(['id'=>$cateInfo['module_id']],['route']);
  290 + if($moduleInfo !== false){
  291 + if($v['route'] != $moduleInfo['route']){
  292 + $v['route'] = $moduleInfo['route'].'/'.$v['route'];
  293 + }
  294 + }
  295 + }
  296 + $this->pageList($data,$count,$v,3,10);
283 break; 297 break;
284 default: 298 default:
285 $data[] = $v['route']; 299 $data[] = $v['route'];
@@ -393,7 +407,7 @@ class TranslateController extends BaseController @@ -393,7 +407,7 @@ class TranslateController extends BaseController
393 } 407 }
394 408
395 /** 409 /**
396 - * @remark : 410 + * @remark :5.0列表页路由处理
397 * @name :pageList 411 * @name :pageList
398 * @author :lyh 412 * @author :lyh
399 * @method :post 413 * @method :post
@@ -412,6 +426,15 @@ class TranslateController extends BaseController @@ -412,6 +426,15 @@ class TranslateController extends BaseController
412 } 426 }
413 $page = ceil($count / $pageNum);//向上取整 427 $page = ceil($count / $pageNum);//向上取整
414 } 428 }
  429 + if($v['source'] == RouteMap::SOURCE_NEWS_CATE){
  430 + if($v['route'] != 'news'){
  431 + $v['route'] = RouteMap::PATH_NEWS_CATE.'/'.$v['route'];
  432 + }
  433 + }elseif($v['source'] == RouteMap::SOURCE_BLOG_CATE){
  434 + if($v['route'] != 'blog'){
  435 + $v['route'] = RouteMap::PATH_BLOG_CATE.'/'.$v['route'];
  436 + }
  437 + }
415 for ($i = 1;$i <= $page;$i++){ 438 for ($i = 1;$i <= $page;$i++){
416 if($i == 1){ 439 if($i == 1){
417 $data[] = $v['route']; 440 $data[] = $v['route'];
@@ -423,7 +446,7 @@ class TranslateController extends BaseController @@ -423,7 +446,7 @@ class TranslateController extends BaseController
423 } 446 }
424 447
425 /** 448 /**
426 - * @remark : 449 + * @remark :6.0列表路由处理
427 * @name :pageList 450 * @name :pageList
428 * @author :lyh 451 * @author :lyh
429 * @method :post 452 * @method :post
@@ -200,7 +200,22 @@ class DomainInfoLogic extends BaseLogic @@ -200,7 +200,22 @@ class DomainInfoLogic extends BaseLogic
200 $host_array = explode('.',$host); 200 $host_array = explode('.',$host);
201 201
202 if($this->param['type'] == 3){ 202 if($this->param['type'] == 3){
203 - //需要申请通配符证书,判断_acme-challenge是否已经解析 203 + //需要申请通配符证书
  204 +
  205 + //判断*是否已经解析
  206 + $host_array_any = $host_array;
  207 + if (count($host_array_any) <= 2) {
  208 + array_unshift($host_array_any, '*');
  209 + } else {
  210 + $host_array_any[0] = '*';
  211 + }
  212 + $any_domain = implode('.',$host_array_any);
  213 + $rand_str = generateRandomString(3);
  214 + if(!check_domain_record(str_replace('*',$rand_str,$any_domain), $serversIpInfo)){
  215 + $this->fail('域名' . $any_domain . '未解析至目标服务器');
  216 + }
  217 +
  218 + //判断_acme-challenge是否已经解析
204 $host_array_ssl = $host_array; 219 $host_array_ssl = $host_array;
205 if (count($host_array_ssl) <= 2) { 220 if (count($host_array_ssl) <= 2) {
206 array_unshift($host_array_ssl, '_acme-challenge'); 221 array_unshift($host_array_ssl, '_acme-challenge');
@@ -20,6 +20,7 @@ use App\Models\RankData\ExternalLinks as ExternalLinksModel; @@ -20,6 +20,7 @@ use App\Models\RankData\ExternalLinks as ExternalLinksModel;
20 use App\Models\RankData\IndexedPages; 20 use App\Models\RankData\IndexedPages;
21 use App\Models\RankData\IndexedPages as IndexedPagesModel; 21 use App\Models\RankData\IndexedPages as IndexedPagesModel;
22 use App\Models\RankData\RankData; 22 use App\Models\RankData\RankData;
  23 +use App\Models\RankData\RankDataBmseo;
23 use App\Models\RankData\RankWeek; 24 use App\Models\RankData\RankWeek;
24 use App\Models\RankData\RankWeek as RankWeekModel; 25 use App\Models\RankData\RankWeek as RankWeekModel;
25 use App\Models\RankData\RecommDomain; 26 use App\Models\RankData\RecommDomain;
@@ -32,6 +33,7 @@ use Illuminate\Database\Eloquent\Model; @@ -32,6 +33,7 @@ use Illuminate\Database\Eloquent\Model;
32 use Illuminate\Support\Collection; 33 use Illuminate\Support\Collection;
33 use Illuminate\Support\Facades\Cache; 34 use Illuminate\Support\Facades\Cache;
34 use Illuminate\Support\Facades\Log; 35 use Illuminate\Support\Facades\Log;
  36 +use Illuminate\Support\Str;
35 37
36 class RankDataLogic extends BaseLogic 38 class RankDataLogic extends BaseLogic
37 { 39 {
@@ -193,6 +195,11 @@ class RankDataLogic extends BaseLogic @@ -193,6 +195,11 @@ class RankDataLogic extends BaseLogic
193 $data['current_api_no'] = $api_no; 195 $data['current_api_no'] = $api_no;
194 $data['current_api_source'] = $api_no == 10690 ? 'Yandex' : 'Google'; 196 $data['current_api_source'] = $api_no == 10690 ? 'Yandex' : 'Google';
195 } 197 }
  198 + $data['api_no'] = $api_no;
  199 + $bmseo_id = RankDataBmseo::where('project_id', $project_id)->value('id');
  200 + if($bmseo_id){
  201 + $data['bmseo_api_no'] = $bmseo_id . '_bmseo';
  202 + }
196 203
197 return $data; 204 return $data;
198 } 205 }
@@ -226,7 +233,12 @@ class RankDataLogic extends BaseLogic @@ -226,7 +233,12 @@ class RankDataLogic extends BaseLogic
226 $ai_projects = $this->getAiProjects()['data'] ?? []; 233 $ai_projects = $this->getAiProjects()['data'] ?? [];
227 $flg_ai = $this->getAiFlag($ai_projects, $domain); 234 $flg_ai = $this->getAiFlag($ai_projects, $domain);
228 $ai_domain = str_replace('www.', '', $this->getAiProjects($domain)['domain'] ?? ''); 235 $ai_domain = str_replace('www.', '', $this->getAiProjects($domain)['domain'] ?? '');
229 - $list = RankData::where('project_id', $project_id)->where('api_no', $api_no)->where('lang', $lang)->value('data') ?: []; 236 + if (Str::endsWith($api_no, '_bmseo')) {
  237 + $list = RankDataBmseo::where('project_id', $project_id)->where('api_no', $api_no)->where('lang', $lang)->value('data') ?: [];
  238 + } else {
  239 + $list = RankData::where('project_id', $project_id)->where('api_no', $api_no)->where('lang', $lang)->value('data') ?: [];
  240 + }
  241 +
230 $list30 = []; //排名前三十的 242 $list30 = []; //排名前三十的
231 $list30_0 = []; //排名前三十且近三天没有排名的 243 $list30_0 = []; //排名前三十且近三天没有排名的
232 $list100 = []; //排名前100的 244 $list100 = []; //排名前100的
@@ -360,6 +372,34 @@ class RankDataLogic extends BaseLogic @@ -360,6 +372,34 @@ class RankDataLogic extends BaseLogic
360 } 372 }
361 373
362 /** 374 /**
  375 + * 获取白帽seo站点项目
  376 + * @author zbj
  377 + * @date 2023/5/12
  378 + */
  379 + public function getBmSeoProjects($domain = '')
  380 + {
  381 + $key = 'weblist_bm';
  382 + $data = Cache::get($key);
  383 + if (!$data) {
  384 + $api_url = 'http://api.quanqiusou.cn/api/index/weblist_bm';
  385 + try {
  386 + $data = HttpUtils::get($api_url, ['key'=> '289c1fc81c89d79c04ed4fd72822948e']);
  387 + if ($data) {
  388 + $data = Arr::s2a($data);
  389 + Cache::put($key, $data, 4 * 3600);
  390 + }
  391 + } catch (\Exception | GuzzleException $e) {
  392 + errorLog('白帽seo站点项目获取失败', [], $e);
  393 + return false;
  394 + }
  395 + }
  396 + if ($domain) {
  397 + return array_search($domain, $data);
  398 + }
  399 + return $data;
  400 + }
  401 +
  402 + /**
363 * 获取AI站点项目 403 * 获取AI站点项目
364 * 404 *
365 * @author zbj 405 * @author zbj
@@ -622,6 +662,58 @@ class RankDataLogic extends BaseLogic @@ -622,6 +662,58 @@ class RankDataLogic extends BaseLogic
622 return $model->is_compliance; 662 return $model->is_compliance;
623 } 663 }
624 664
  665 + public function save_rank_bmseo($project_id, $api_no, $data){
  666 + $first_num = $first_page_num = $first_three_pages_num = $first_five_pages_num = $first_ten_pages_num = 0;
  667 + $first_page_without_extension_num = 0; //不算扩展词在首页的数量
  668 + $first_page_extension_num = 0; //扩展词在首页的数量
  669 + foreach ($data as &$ranks){
  670 + ksort($ranks);
  671 + $last = Arr::last($ranks);
  672 + //第一名
  673 + if($last['position'] == 1){
  674 + $first_num ++;
  675 + }
  676 + //排名第一页
  677 + if($last['position'] > 0 && $last['position'] <= 10){
  678 + $first_page_num ++;
  679 + $last['g'] == 1 && $first_page_without_extension_num++;
  680 + $last['g'] == 2 && $first_page_extension_num++;
  681 + }
  682 + //排名前三页
  683 + if($last['position'] > 0 && $last['position'] <= 30){
  684 + $first_three_pages_num ++;
  685 + }
  686 + //排名前五页
  687 + if($last['position'] > 0 && $last['position'] <= 50){
  688 + $first_five_pages_num ++;
  689 + }
  690 + //排名前十页
  691 + if($last['position'] > 0 && $last['position'] <= 100){
  692 + $first_ten_pages_num ++;
  693 + }
  694 + }
  695 + $where = [
  696 + 'project_id' => $project_id,
  697 + 'api_no' => $api_no,
  698 + ];
  699 + $model = RankDataBmseo::where($where)->first();
  700 + if(!$model){
  701 + $model = new RankDataBmseo();
  702 + }
  703 + $model->project_id = $project_id;
  704 + $model->api_no = $api_no;
  705 + $model->first_num = $first_num;
  706 + $model->first_page_num = $first_page_num;
  707 + $model->first_three_pages_num = $first_three_pages_num;
  708 + $model->first_five_pages_num = $first_five_pages_num;
  709 + $model->first_ten_pages_num = $first_ten_pages_num;
  710 + $model->data = $data;
  711 + $model->updated_date = date('Y-m-d');
  712 + $model->save();
  713 +
  714 + return true;
  715 + }
  716 +
625 /** 717 /**
626 * @remark :g_top 718 * @remark :g_top
627 * @name :g_top_plan 719 * @name :g_top_plan
@@ -66,19 +66,6 @@ class InquiryFormData extends Base @@ -66,19 +66,6 @@ class InquiryFormData extends Base
66 return 0; 66 return 0;
67 } 67 }
68 68
69 -  
70 - $model = new self();  
71 - $model->form_id = $form_id;  
72 - $model->domain = $domain;  
73 - $model->ip = $ip;  
74 - $model->country = $country;  
75 - $model->referer = $referer;  
76 - $model->user_agent = $user_agent;  
77 - $model->submit_at = $submit_at;  
78 - $model->data = $data;  
79 - $model->sign = $sign;  
80 - $model->save();  
81 -  
82 if(!empty($data['name']) && !empty($data['email']) && !empty($data['message'])){ 69 if(!empty($data['name']) && !empty($data['email']) && !empty($data['message'])){
83 Log::channel('inquiry')->info('开始发邮件' . PHP_EOL); 70 Log::channel('inquiry')->info('开始发邮件' . PHP_EOL);
84 71
@@ -102,8 +89,24 @@ class InquiryFormData extends Base @@ -102,8 +89,24 @@ class InquiryFormData extends Base
102 if(!$has_file) { 89 if(!$has_file) {
103 $res = (new FormGlobalsoApi())->submitInquiry($ip, $referer, $submit_at, $data, $traffic); 90 $res = (new FormGlobalsoApi())->submitInquiry($ip, $referer, $submit_at, $data, $traffic);
104 Log::channel('inquiry')->info('询盘发送邮件', [$data, $res]); 91 Log::channel('inquiry')->info('询盘发送邮件', [$data, $res]);
  92 + if(!$res){
  93 + throw new \Exception('询盘发送邮件失败');
  94 + }
105 } 95 }
106 } 96 }
  97 +
  98 + $model = new self();
  99 + $model->form_id = $form_id;
  100 + $model->domain = $domain;
  101 + $model->ip = $ip;
  102 + $model->country = $country;
  103 + $model->referer = $referer;
  104 + $model->user_agent = $user_agent;
  105 + $model->submit_at = $submit_at;
  106 + $model->data = $data;
  107 + $model->sign = $sign;
  108 + $model->save();
  109 +
107 return $model->id; 110 return $model->id;
108 } 111 }
109 112
  1 +<?php
  2 +
  3 +namespace App\Models\RankData;
  4 +
  5 +
  6 +use App\Helper\Arr;
  7 +use App\Models\Base;
  8 +
  9 +/**
  10 + * Class GoogleRank
  11 + * @package App\Models
  12 + * @author zbj
  13 + * @date 2023/5/6
  14 + */
  15 +class RankDataBmseo extends Base
  16 +{
  17 + //设置关联表名
  18 + protected $table = 'gl_rank_data_bmseo';
  19 +
  20 + public static function gMap(){
  21 + return [
  22 + 1 => '主关键词',
  23 + 2 => '拓展关键词',
  24 + 3 => '小语种关键词',
  25 + ];
  26 + }
  27 +
  28 + public function setDataAttribute($value)
  29 + {
  30 + $this->attributes['data'] = Arr::a2s($value);
  31 + }
  32 +
  33 + public function getDataAttribute($value)
  34 + {
  35 + return Arr::s2a($value);
  36 + }
  37 +
  38 +}
@@ -68,6 +68,11 @@ class SyncSubmitTaskService @@ -68,6 +68,11 @@ class SyncSubmitTaskService
68 $project = $checkIpCountry['project']; 68 $project = $checkIpCountry['project'];
69 $data['project_id'] = $project['id']; 69 $data['project_id'] = $project['id'];
70 70
  71 + if(empty($data['data']['url']) && $task['type'] == 'visit'){
  72 + throw new InquiryFilterException( 'url为空');
  73 + }
  74 +
  75 +
71 //特殊处理 76 //特殊处理
72 if($project['id'] == 455 && !empty($data['email']) && $data['email'] == 'alb@marketingtu.org'){ 77 if($project['id'] == 455 && !empty($data['email']) && $data['email'] == 'alb@marketingtu.org'){
73 throw new InquiryFilterException( '黑名单邮箱'); 78 throw new InquiryFilterException( '黑名单邮箱');
@@ -288,6 +293,7 @@ class SyncSubmitTaskService @@ -288,6 +293,7 @@ class SyncSubmitTaskService
288 $name = empty($data['data']['name']) ? '' : ' ' . $data['data']['name']; 293 $name = empty($data['data']['name']) ? '' : ' ' . $data['data']['name'];
289 MessagePush::addInquiryMessage($id, $data['project_id'], $data['country'], $name, $data['submit_at']); 294 MessagePush::addInquiryMessage($id, $data['project_id'], $data['country'], $name, $data['submit_at']);
290 }catch (\Exception $e){ 295 }catch (\Exception $e){
  296 + Cache::decrement($ip_cache_key);
291 Log::channel('inquiry')->info($task_id . '询盘失败', [$e->getMessage(), $e->getFile(), $e->getLine()]); 297 Log::channel('inquiry')->info($task_id . '询盘失败', [$e->getMessage(), $e->getFile(), $e->getLine()]);
292 LogUtils::error('询盘消息'.$id.'写入企微消息队列失败' . $e->getMessage()); 298 LogUtils::error('询盘消息'.$id.'写入企微消息队列失败' . $e->getMessage());
293 } 299 }