作者 刘锟

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

... ... @@ -63,6 +63,10 @@ class AiBlogAutoPublish extends Command
foreach ($projects as $project) {
$this->output("项目{$project->id}开始自动发布");
if(!$project->deploy_optimize['is_ai_blog_send']){
$this->output("项目{$project->id}未开启自动发布" . $project->deploy_optimize['start_date']);
continue;
}
if(($project->deploy_optimize['start_date'] > date('Y-m-d')) || !$project->deploy_optimize['start_date']){
$this->output("项目{$project->id}未到推广时间" . $project->deploy_optimize['start_date']);
continue;
... ... @@ -159,6 +163,11 @@ class AiBlogAutoPublish extends Command
if (!AiBlogOpenLog::isOpened($project->id)) {
//开启
$project->is_ai_blog = 1;
//开启自动发布
$project->deploy_optimize->is_ai_blog_send = 1;
$project->deploy_optimize->save();
$project->save();
//创建AI博客项目
$deploy_optimize = $project->deploy_optimize;
... ...
<?php
/**
* @remark :
* @name :GoogleSearchKeyword.php
* @author :lyh
* @method :post
* @time :2025/3/31 11:29
*/
namespace App\Console\Commands\GoogleSearch;
use App\Models\Com\NoticeLog;
use App\Models\Domain\DomainInfo;
use App\Models\GoogleSearch\GoogleSearch;
use App\Models\GoogleSearch\GoogleSearchDetail;
use App\Models\Project\Project;
use App\Services\GoogleSearchService;
use App\Services\ProjectServer;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
/**
* @remark :客户搜索词
* @name :GoogleSearchKeyword
* @author :lyh
* @method :post
* @time :2025/3/31 11:29
*/
class GoogleSearchKeyword extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'search_keyword';
/**
* The console command description.
*
* @var string
*/
protected $description = 'google搜索词';
public $googleService;
public $searchModel;
public $detailModel;
public function __construct()
{
$this->googleService = new GoogleSearchService();
$this->searchModel = new GoogleSearch();
$this->detailModel = new GoogleSearchDetail();
parent::__construct();
}
/**
* @remark :拉取google搜索数据
* @name :handle
* @author :lyh
* @method :post
* @time :2025/3/31 11:37
*/
public function handle(){
$projectModel = new Project();
$lists = $projectModel->list(['delete_status' => 0,'type'=>['!=',$projectModel::TYPE_ONE]], 'id', ['id']);
$domainModel = new DomainInfo();
foreach ($lists as $val) {
echo date('Y-m-d H:i:s') . '开始--项目的id:'. $val['id'] . PHP_EOL;
$domainInfo = $domainModel->read(['project_id'=>$val['id']]);
if($domainInfo === false){
echo '域名不存在。'.PHP_EOL;
continue;
}
$typeData = [1=>'date', 2=>'query', 3=>'page', 4=>'device', 5=>'country'];
foreach ($typeData as $keyT => $valT){
$this->_action($domainInfo['domain'],$valT,$val['id']);
}
}
return true;
}
/**
* @remark :执行的方法
* @name :_action
* @author :lyh
* @method :post
* @time :2025/3/31 11:30
*/
public function _action($domain,$type,$project_id){
$data = $this->googleService->googleSearch($domain,$type);
if(empty($data)){
echo '域名:'.$domain.'拉取数据为空.'.PHP_EOL;
return false;
}
//保存一条主记录诗句
$this->searchModel->addReturnId(['date'=>date('Y-m-d'),'project_id'=>$project_id,'type'=>$type]);
$saveData = [];
$clicksNum = array_sum(array_column($data, 'clicks'));
$impressionsNum = array_sum(array_column($data, 'impressions'));
echo 'clicksNum:'.$clicksNum.PHP_EOL;
echo 'impressionsNum:'.$impressionsNum.PHP_EOL;
foreach ($data as $val){
$saveData[] = [
'date'=>date('Y-m-d'),
'project_id'=>$project_id,
'type'=>$type,
'keys'=>$val['keys'][0],
'clicks'=>$val['clicks'],
'click_rate'=>number_format($val['clicks'] / (($clicksNum == 0) ? 1 : $clicksNum), 2),
'impressions'=>$val['impressions'],
'impressions_rate'=>number_format($val['impressions'] / (($impressionsNum == 0) ? 1 : $impressionsNum), 2),
'ctr'=>$val['ctr'],
'position'=>$val['position'],
];
}
if(!empty($saveData)){
DB::beginTransaction();
try {
//清空以前的数据
$this->detailModel->del(['project_id'=>$project_id,'type'=>$type]);
$this->detailModel->insertAll($saveData);
DB::commit();
}catch (\Exception $e){
DB::rollBack();
echo '重新添加数据失败:project_id'.$project_id.PHP_EOL;
}
}
return true;
}
}
... ...
... ... @@ -369,8 +369,8 @@ class UpdateSeoTdk extends Command
} else if ($table == 'gl_product_keyword' && $field == 'seo_title') {
# TODO 聚合页seo title 特殊处理 前缀_1 . 关键词 . 后缀_2
$seo_title = $v[$this->topic_fields[$table]];;
//只有推广项目才加 前后缀
if($project->type == Project::TYPE_TWO) {
//只有推广项目 且未标记特殊前后缀 才加 前后缀
if($project->type == Project::TYPE_TWO && !in_array(8, explode(',', $project->deploy_optimize->special))) {
$prefix = $this->getPrefixKeyword($project_id, 'prefix', 1);
$suffix = $this->getPrefixKeyword($project_id, 'suffix', 2);
if (empty($prefix) || empty($suffix)) {
... ... @@ -521,11 +521,14 @@ class UpdateSeoTdk extends Command
}
$prompt = str_replace('{company detail}', $company_detail, $prompt);
}
$project = Project::find($project_id);
if (!in_array(8, explode(',', $project->deploy_optimize->special))) {
// 前缀关键词
if(preg_match_all("/\{qz_(\d+)\}/", $prompt, $matches)) {
foreach ($matches[0] as $key=>$val) {
if (preg_match_all("/\{qz_(\d+)\}/", $prompt, $matches)) {
foreach ($matches[0] as $key => $val) {
$keyword = $this->getPrefixKeyword($project_id, 'prefix', $matches[1][$key]);
if(!$keyword){
if (!$keyword) {
echo getmypid() . ' ' . '前缀关键词为空 跳过' . PHP_EOL;
return false;
}
... ... @@ -533,16 +536,17 @@ class UpdateSeoTdk extends Command
}
}
// 后缀关键词
if(preg_match_all("/\{hz_(\d+)\}/", $prompt, $matches)) {
foreach ($matches[0] as $key=>$val) {
if (preg_match_all("/\{hz_(\d+)\}/", $prompt, $matches)) {
foreach ($matches[0] as $key => $val) {
$keyword = $this->getPrefixKeyword($project_id, 'suffix', $matches[1][$key]);
if(!$keyword){
if (!$keyword) {
echo getmypid() . ' ' . '前缀关键词为空 跳过' . PHP_EOL;
return false;
}
$prompt = str_replace($val, $keyword, $prompt);
}
}
}
// 多个核心关键词
if(strpos($prompt, '{core keywords 8}') !== false) {
... ...
... ... @@ -39,7 +39,6 @@ class Kernel extends ConsoleKernel
$schedule->command('sync_ad_cost')->everyThirtyMinutes()->withoutOverlapping(1);
// 优化预设关键词 同步 20点会开始TDK生成
$schedule->command('optimize_set_keyword_sync')->dailyAt('20:00')->withoutOverlapping(1);
$schedule->command('after_count')->dailyAt('01:00')->withoutOverlapping(1); //售后日统计 每天统计一次
}
/**
... ...
... ... @@ -492,6 +492,13 @@ class OptimizeController extends BaseController
$this->processChunkedList($productCategoryModel, ['status' => $productCategoryModel::STATUS_ACTIVE], ['id', 'title', 'route'], $domain, $data, 'product_category');
$productKeywordModel = new Keyword();
$this->processChunkedList($productKeywordModel, ['status' => $productKeywordModel::STATUS_ACTIVE], ['id', 'title', 'route'], $domain, $data, 'product_keyword');
$aiBlogModel = new AiBlog();
$list = $aiBlogModel->list(['route'=>['!=',null]],'id',['route','new_title']);
if(!empty($list)){
foreach ($list as $v){
$data['ai_blog'][] = $domain . 'blog/' . $v['route'] . '/{' . $v['new_title'] . '}';
}
}
DB::disconnect('custom_mysql');
$this->response('success', Code::SUCCESS, $data);
}
... ... @@ -555,20 +562,23 @@ class OptimizeController extends BaseController
], [
'project_id.required' => '项目id不能为空',
]);
$domainModel = new DomainInfo();
$domainInfo = $domainModel->read(['project_id'=>$this->param['project_id']],['domain']);
if($domainInfo === false){
$this->response('success');
}
ProjectServer::useProject($this->param['project_id']);
$aiBlogModel = new AiBlog();
$list = $aiBlogModel->formatQuery(['route'=>['!=',null]])->pluck('route')->toArray();
$list = $aiBlogModel->list(['route'=>['!=',null]],'id',['route','new_title']);
$resultData = [];
if(!empty($list)){
$domainModel = new DomainInfo();
$DomainInfo = $domainModel->read(['project_id'=>$this->param['project_id']]);
$DomainInfo['domain'] = $DomainInfo['domain'] ?? '';
foreach ($list as $k => $v){
$v = ('https://'.$DomainInfo['domain'].'/') . 'blog/' . $v;
$list[$k] = $v;
foreach ($list as $v){
$resultData[] = ('https://'.$DomainInfo['domain'].'/') . 'blog/' . $v['route'] . '/{' . $v['new_title'] . '}';
}
}
DB::disconnect('custom_mysql');
$this->response('success',Code::SUCCESS,$list);
$this->response('success',Code::SUCCESS,$resultData);
}
/**
... ...
... ... @@ -117,6 +117,7 @@ class AdsController extends BaseController
$ad_url = trim($request->input('ad_url'));
$ad_img = trim($request->input('ad_img'));
$num = intval($request->input('num'));
$is_show_fb_source = intval($request->input('is_show_fb_source'));
$status = intval($request->input('status'));
$is_replace_text = intval($request->input('is_replace_text'));
$ai_param = $request->input('ai_param');
... ... @@ -138,7 +139,19 @@ class AdsController extends BaseController
return $this->response('英文缩写参考不能为空!', Code::USER_ERROR, []);
}
}
ReInquiryTask::createTask($id, $title, $industry, $ad_id, $ad_url, $ad_img, $num, $status, $is_replace_text, $ai_param);
$task = ReInquiryTask::createTask($id, $title, $industry, $ad_id, $ad_url, $ad_img, $num, $status, $is_replace_text, $ai_param, $is_show_fb_source);
//是否显示FB标识
foreach ($task['target'] as $target){
if($target['is_v6']){
$project = Project::getProjectByDomain($target['url']);
if($project){
$project->is_show_fb_source = $is_show_fb_source;
$project->save();
}
}
}
return $this->response('success', Code::SUCCESS, []);
}
... ... @@ -183,6 +196,15 @@ class AdsController extends BaseController
}
foreach ($target as $v){
ReInquiryCount::addInquiryNum($id, $v['url'], 0);
//是否显示FB标识
if($v['is_v6']){
$project = Project::getProjectByDomain($v['url']);
if($project){
$project->is_show_fb_source = $task->is_show_fb_source;
$project->save();
}
}
}
//商城
... ... @@ -209,6 +231,7 @@ class AdsController extends BaseController
$task->shop_site = json_encode($shop_site);
$task->fob_pro = json_encode($fob_pro);
$task->save();
return $this->response('success', Code::SUCCESS, []);
}
... ...
<?php
/**
* @remark :
* @name :GoogleKeywordInsightController.php
* @author :lyh
* @method :post
* @time :2025/3/25 14:23
*/
namespace App\Http\Controllers\Bside\GoogleKeyword;
use App\Enums\Common\Code;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\GoogleKeywordInsight\GoogleKeywordInsightLogic;
use App\Models\GoogleKeywordInsight\GoogleKeywordInsightDetail;
use App\Models\Project\ProjectKeyword;
/**
* @remark :谷歌洞察数据
* @name :GoogleKeywordInsightController
* @author :lyh
* @method :post
* @time :2025/3/25 14:24
*/
class GoogleKeywordInsightController extends BaseController
{
/**
* @remark :保存数据
* @name :saveKeywordInsight
* @author :lyh
* @method :post
* @time :2025/3/25 14:30
*/
public function getKeywordInsight(GoogleKeywordInsightLogic $logic){
$this->request->validate([
'keyword' => 'required'
],[
'keyword.required' => '关键词不能为空',
]);
$logic->getGoogleInsight();
$detailModel = new GoogleKeywordInsightDetail();
$data = $detailModel->lists(['search'=>$this->param['keyword']],$this->page,$this->row);
$this->response('success',Code::SUCCESS,$data);
}
/**
* @remark :获取优化关键词列表
* @name :getOptimizeList
* @author :lyh
* @method :post
* @time :2025/4/1 9:12
*/
public function getOptimizeList(){
$projectKeywordModel = new ProjectKeyword();
$info = $projectKeywordModel->read(['project_id'=>$this->user['project_id']],['main_keyword','customer_keywords']);
if($info === false){
$this->response('success');
}
$main_keyword = explode("\r\n", $info['main_keyword']);
$customer_keywords = explode("\r\n", $info['customer_keywords']);
$array = array_merge($main_keyword, $customer_keywords);
$detailModel = new GoogleKeywordInsightDetail();
$resultData = [];
if(!empty($array)){
$resultData = $this->paginateArray($array,$this->page,$this->row);
$detailList = $detailModel->list(['search'=>['in',$resultData['list']]]);
foreach ($resultData['list'] as $key => $item){
$result['keyword'] = $item;
$searchKeyword = $this->getSearchDetail($item,$detailList);
if($searchKeyword === false){
$result['data'] = [];
}else{
$result['data'] = $searchKeyword;
}
$resultData['list'][$key] = $result;
}
}
$this->response('success',Code::SUCCESS,$resultData);
}
/**
* @remark :保存一条关键字数据
* @name :getKeywordInsightDetail
* @author :lyh
* @method :post
* @time :2025/4/1 11:23
*/
public function getKeywordInsightDetail(GoogleKeywordInsightLogic $logic){
$this->request->validate([
'keyword' => 'required'
],[
'keyword.required' => '关键词不能为空',
]);
$result = $logic->getGoogleInsightDetail();
$detailModel = new GoogleKeywordInsightDetail();
$data = $detailModel->read(['id'=>$result['id']]);
$this->response('success',Code::SUCCESS,$data);
}
/**
* @remark :查看当前数据是否存在数组中
* @name :getSearchDetail
* @author :lyh
* @method :post
* @time :2025/4/1 9:56
*/
public function getSearchDetail($keyword,$detailList){
if(!empty($detailList)){
foreach ($detailList as $value){
if($keyword == $value['search']){
return $value;
}
}
}
return [];
}
/**
* @remark :返回分页数据
* @name :paginateArray
* @author :lyh
* @method :post
* @time :2025/4/1 9:41
*/
public function paginateArray($array, $page = 1, $pageSize = 20) {
$totalItems = count($array);
$totalPages = ceil($totalItems / $pageSize);
// 确保页码有效
$page = max(1, min($page, $totalPages));
$offset = ($page - 1) * $pageSize;
$data = array_slice($array, $offset, $pageSize);
return [
'list' => $data,
'page' => $page,
'size' => $pageSize,
'total_page' => $totalPages,
'total' => $totalItems,
];
}
}
... ...
... ... @@ -7,10 +7,13 @@
* @time :2025/3/27 13:53
*/
namespace App\Http\Controllers\Bside\GoogleKeywordInsight;
namespace App\Http\Controllers\Bside\GoogleKeyword;
use App\Enums\Common\Code;
use App\Http\Controllers\Bside\BaseController;
use App\Models\Com\NoticeLog;
use App\Models\GoogleSearch\GoogleSearch;
use App\Models\GoogleSearch\GoogleSearchDetail;
use App\Services\GoogleSearchService;
class GoogleSearchController extends BaseController
... ... @@ -24,14 +27,14 @@ class GoogleSearchController extends BaseController
*/
public function getSearchList(){
$this->request->validate([
'search' => 'required'
'type' => 'required'
],[
'search.required' => '搜索类型不能为空',
'type.required' => '搜索类型不能为空',
]);
//获取当前项目域名
$domain = parse_url($this->user['domain'], PHP_URL_HOST);
$googleService = new GoogleSearchService();
$data = $googleService->googleSearch($domain,$this->param['search']);
//查询详情数据
$searchDetailModel = new GoogleSearchDetail();
$this->map['project_id']= $this->user['project_id'];
$data = $searchDetailModel->lists($this->map,$this->page,$this->row);
$this->response('success',Code::SUCCESS,$data);
}
}
... ...
<?php
/**
* @remark :
* @name :GoogleKeywordInsightController.php
* @author :lyh
* @method :post
* @time :2025/3/25 14:23
*/
namespace App\Http\Controllers\Bside\GoogleKeywordInsight;
use App\Enums\Common\Code;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\GoogleKeywordInsight\GoogleKeywordInsightLogic;
use App\Models\GoogleKeywordInsight\GoogleKeywordInsightDetail;
/**
* @remark :谷歌洞察数据
* @name :GoogleKeywordInsightController
* @author :lyh
* @method :post
* @time :2025/3/25 14:24
*/
class GoogleKeywordInsightController extends BaseController
{
/**
* @remark :保存数据
* @name :saveKeywordInsight
* @author :lyh
* @method :post
* @time :2025/3/25 14:30
*/
public function getKeywordInsight(GoogleKeywordInsightLogic $logic){
$this->request->validate([
'keyword' => 'required'
],[
'keyword.required' => '关键词不能为空',
]);
$logic->getGoogleInsight();
$detailModel = new GoogleKeywordInsightDetail();
$data = $detailModel->lists(['search'=>$this->param['keyword']],$this->page,$this->row);
$this->response('success',Code::SUCCESS,$data);
}
}
... ... @@ -55,4 +55,29 @@ class GoogleKeywordInsightLogic extends BaseLogic
}
return $this->success();
}
/**
* @remark :保存一条数据
* @name :saveGoogleKeywordInsight
* @author :lyh
* @method :post
* @time :2025/3/25 14:36
*/
public function getGoogleInsightDetail(){
$this->service = new GoogleSearchService();
$data = $this->service->requestUrl($this->param['keyword']);
if(!empty($data)){
DB::beginTransaction();
//保存数据库
try {
$detailModel = new GoogleKeywordInsightDetail();
$id = $detailModel->saveInsightDetailOne($this->user['project_id'],$this->param['keyword'],$data[0]);
DB::commit();
}catch (\Exception $e){
DB::rollBack();
$this->fail('保存失败,请联系管理员');
}
}
return $this->success(['id'=>$id ?? 0]);
}
}
... ...
... ... @@ -56,6 +56,7 @@ class InquiryLogic extends BaseLogic
];
if (!empty($list['status']) && $list['status'] == 200) {
foreach ($list['data']['data'] as $item) {
$item['is_fb'] = $project['is_show_fb_source'] && $item['source'] == 5 ? 1 : 0;
$data['list'][] = $item;
}
$data['total'] = $list['data']['total'];
... ...
... ... @@ -20,6 +20,7 @@ class NoticeLog extends Base
const DELETE_NEWS_CATEGORY = 'delete_news_category';
const DELETE_CUSTOM_CATEGORY = 'delete_custom_category';
const GENERATE_PAGE = 'generate_page';//生成页面单独改为守护进程
const GOOGLE_SEARCH = 'google_search';//google搜索任务date
const STATUS_PENDING = 0;
const STATUS_SUCCESS = 1;
const STATUS_FAIL = 2;
... ...
... ... @@ -43,4 +43,28 @@ class GoogleKeywordInsightDetail extends Base
}
return $this->insertAll($saveData);
}
/**
* @remark :保存一条数据
* @name :saveInsightDetailOne
* @author :lyh
* @method :post
* @time :2025/4/1 11:32
*/
public function saveInsightDetailOne($project_id,$keyword,$data){
$transData = Translate::tran($data['text'], 'zh');
$saveData = [
'search'=>$keyword,
'text'=>$data['text'],
'zh_text'=>$transData ?? $data['text'],
'project_id'=>$project_id,
'volume'=>$data['volume'],
'competition_level'=>$data['competition_level'],
'competition_index'=>$data['competition_index'],
'low_bid'=>$data['low_bid'],
'high_bid'=>$data['high_bid'],
'trend'=>$data['trend'],
];
return $this->addReturnId($saveData);
}
}
... ...
<?php
/**
* @remark :
* @name :GoogleSearch.php
* @author :lyh
* @method :post
* @time :2025/3/31 13:36
*/
namespace App\Models\GoogleSearch;
use App\Models\Base;
class GoogleSearch extends Base
{
protected $table = 'gl_google_search';
}
... ...
<?php
/**
* @remark :
* @name :GoogleSearchDetail.php
* @author :lyh
* @method :post
* @time :2025/3/31 13:40
*/
namespace App\Models\GoogleSearch;
use App\Models\Base;
class GoogleSearchDetail extends Base
{
protected $table = 'gl_google_search_detail';
}
... ...
... ... @@ -41,7 +41,7 @@ class ReInquiryTask extends Base
* @param int $status
* @return ReInquiryTask
*/
public static function createTask($id, $title, $industry, $ad_id, $ad_url, $ad_img, $num, $status, $is_replace_text, $ai_param)
public static function createTask($id, $title, $industry, $ad_id, $ad_url, $ad_img, $num, $status, $is_replace_text, $ai_param, $is_show_fb_source)
{
$self = self::where(['id' => $id])->first();
if (empty($self))
... ... @@ -55,6 +55,7 @@ class ReInquiryTask extends Base
$self->status = $status;
$self->is_replace_text = $is_replace_text;
$self->ai_param = $ai_param;
$self->is_show_fb_source = $is_show_fb_source;
$self->save();
return $self;
}
... ...
... ... @@ -74,7 +74,6 @@ class GoogleSearchService
$err = curl_error($curl);
curl_close($curl);
if ($err) {
errorLog("热门关键词cURL Error #:", $url, $err);
return false;
} else {
return json_decode($response,true);
... ... @@ -90,24 +89,13 @@ class GoogleSearchService
* @param :date,query,page,device,country/时间、聚合、前页、设备、国家
*/
public function googleSearch($domain,$search){
$data = [
1=>'date',
2=>'query',
3=>'page',
4=>'device',
5=>'country'
];
$this->url = 'https://www.cmer.site/api/google/search';
$url = $this->url.'?domain='.$domain.'&q='.$data[$search];
$url = $this->url.'?domain='.$domain.'&q='.$search;
$data = http_get($url);
$data = $data['data'] ?? [];
if(!empty($data) && ($search == 5)){
foreach ($data as $key => $val){
$val['keys_country'] = Country::getCountryNameByAlpha3(strtoupper($val['keys'][0]));
$data[$key] = $val;
}
if(!isset($data['status']) || $data['status'] != 200){
return [];
}
$data = $data['data'] ?? [];
return $data;
}
}
... ...
... ... @@ -698,11 +698,14 @@ Route::middleware(['bloginauth'])->group(function () {
//google数据洞察
Route::prefix('google_keyword_insight')->group(function () {
Route::any('/getKeywordInsight', [\App\Http\Controllers\Bside\GoogleKeywordInsight\GoogleKeywordInsightController::class, 'getKeywordInsight'])->name('google_keyword_insight_getKeywordInsight');
Route::any('/getKeywordInsight', [\App\Http\Controllers\Bside\GoogleKeyword\GoogleKeywordInsightController::class, 'getKeywordInsight'])->name('google_keyword_insight_getKeywordInsight');
Route::any('/getOptimizeList', [\App\Http\Controllers\Bside\GoogleKeyword\GoogleKeywordInsightController::class, 'getOptimizeList'])->name('google_keyword_insight_getOptimizeList');
Route::any('/getKeywordInsightDetail', [\App\Http\Controllers\Bside\GoogleKeyword\GoogleKeywordInsightController::class, 'getKeywordInsightDetail'])->name('google_keyword_insight_getKeywordInsightDetail');
});
//google搜索数据
Route::prefix('google_search')->group(function () {
Route::any('/getSearchList', [\App\Http\Controllers\Bside\GoogleKeywordInsight\GoogleSearchController::class, 'getSearchList'])->name('google_search_getSearchList');
Route::any('/getSearchList', [\App\Http\Controllers\Bside\GoogleKeyword\GoogleSearchController::class, 'getSearchList'])->name('google_search_getSearchList');
});
//企业产品库
Route::prefix('enterprise_product')->group(function () {
... ...