作者 刘锟

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

... ... @@ -8,6 +8,7 @@ use App\Models\Ai\AiBlogOpenLog;
use App\Models\Project\AiBlogTask as AiBlogTaskModel;
use App\Models\Project\Project;
use App\Models\Project\ProjectKeyword;
use App\Models\RankData\RankData;
use App\Models\WebSetting\WebSetting;
use App\Services\AiBlogService;
use App\Services\ProjectServer;
... ... @@ -78,26 +79,38 @@ class AiBlogAutoPublish extends Command
$keywords = array_map('trim', $keywords);
if (empty($keywords)) {
$this->output("项目{$project->id}未获取到关键词");
continue;
}
$last_task = AiBlogTaskModel::where('project_id', $project->id)->where('type', 2)->orderBy('id', 'desc')->first();
//如果没有发布过AI blog任务, 第一次提交3个任务
$compliance = RankData::where(['project_id' => $project->id, 'lang' => ''])->value('is_compliance');
$frequency = Project::typeBlogFrequency($project->deploy_optimize->send_ai_blog_frequency);
$frequency = explode('-', $frequency);
//1、之前测试那批项目,按照正常频率发送;
//2、未达标的项目,开启AIblog, 并立即推送三篇;
//3、其他项目等下下周 1 (2025-03-17)开始推送第一篇, 之后按照正频率发送;
if (!$last_task) {
for ($i = 0; $i < 3; $i++) {
$this->createTask($keywords, $project->id);
if(!$compliance) {
for ($i = 0; $i < 3; $i++) {
$this->createTask($keywords, $project->id, $frequency);
}
}else{
if(date('Y-m-d') >= '2025-03-17'){
$this->createTask($keywords, $project->id, $frequency);
}
}
} else {
$this->createTask($keywords, $project->id);
$this->createTask($keywords, $project->id, $frequency);
}
}
}
public function createTask($keywords, $project_id){
public function createTask($keywords, $project_id, $frequency){
$keyword = $keywords[array_rand($keywords)];
$aiBlogService = new AiBlogService($project_id);
$result = $aiBlogService->setRoute($keyword)->createTask($keyword);
if ($result['status'] == 200) {
$aiBlogTaskModel = new AiBlogTaskModel();
$next_auto_date = date('Y-m-d', strtotime('+' . mt_rand(3,6) . 'days')); //每3-6天自动发布
$next_auto_date = date('Y-m-d', strtotime('+' . mt_rand($frequency[0],$frequency[1]) . 'days')); //每3-6天自动发布
$aiBlogTaskModel->addReturnId(['project_id' => $project_id, 'type' => 2, 'task_id' => $result['data']['task_id'], 'status' => 1, 'next_auto_date' => $next_auto_date]);
ProjectServer::useProject($project_id);
... ... @@ -123,23 +136,26 @@ class AiBlogAutoPublish extends Command
*/
public function auto_open()
{
$this->output('上线的推广项目自动开启');
$projects = Project::whereIn('type', [Project::TYPE_TWO, Project::TYPE_FOUR])
->whereNotNull('uptime')->where('is_ai_blog', 0)
->get();
foreach ($projects as $project) {
//未开启过 自动开启
if (!AiBlogOpenLog::isOpened($project->id)) {
//开启
$project->is_ai_blog = 1;
$project->save();
//创建AI博客项目
(new ProjectLogic())->setAiBlog($project->id, $project->main_lang_id, 1, $project->title);
//开启日志
AiBlogOpenLog::addLog($project->id);
while (true) {
$this->output('上线的推广项目自动开启');
$projects = Project::whereIn('type', [Project::TYPE_TWO, Project::TYPE_FOUR])
->whereNotNull('uptime')->where('is_ai_blog', 0)
->get();
foreach ($projects as $project) {
//未开启过 自动开启
if (!AiBlogOpenLog::isOpened($project->id)) {
//开启
$project->is_ai_blog = 1;
$project->save();
//创建AI博客项目
(new ProjectLogic())->setAiBlog($project->id, $project->main_lang_id, 1, $project->title);
//开启日志
AiBlogOpenLog::addLog($project->id);
$this->output('自动开启项目:' . $project->id);
$this->output('自动开启项目:' . $project->id);
}
}
sleep(60);
}
}
... ...
... ... @@ -148,7 +148,7 @@ class CountProject extends Command
if($inquiry_list == false){
return false;
}
echo date('Y-m-d H:i:s') . '拉取询盘状态:' .json_encode($inquiry_list) . PHP_EOL;
// echo date('Y-m-d H:i:s') . '拉取询盘状态:' .json_encode($inquiry_list) . PHP_EOL;
if($inquiry_list['status'] == self::STATUS_ERROR){
$arr['inquiry_num'] = 0;
$countryArr = [];
... ...
... ... @@ -528,8 +528,8 @@ class RelayInquiry extends Command
$seconds += rand(5,60);
ReInquiryDetailLog::createInquiryLog($re_detail->id, ReInquiryDetailLog::TYPE_VISIT, $pre, $v, date('Y-m-d H:i:s', $start_time + $seconds));
// 最后一次访问询盘 加上询盘
if($is_inquiry && $k+1 == count($urls)){
$this->output('第' . $k+1 . '个链接询盘');
if($is_inquiry && ($k+1) == count($urls)){
$this->output('第' . ($k+1) . '个链接询盘');
$seconds += rand(30,120);
$pre++;
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
* @time :2023/11/20 15:13
*/
public function handle(){
ProjectServer::useProject(3283);
ProjectServer::useProject(2837);
echo date('Y-m-d H:i:s') . 'start' . PHP_EOL;
// $this->importProductCategory('https://ecdn6.globalso.com/upload/p/3283/file/2025-03/zy_boss_pricelistcat_202503131025.csv','3283');
$this->importProduct('https://ecdn6.globalso.com/upload/p/3283/file/2025-03/zy_boss_price_copy1.csv',3283);
$this->importCustomModule('https://ecdn6.globalso.com/upload/p/2837/file/2025-03/2.csv',2837);
DB::disconnect('custom_mysql');
echo date('Y-m-d H:i:s') . 'end' . PHP_EOL;
}
... ... @@ -332,53 +331,72 @@ class LyhImportTest extends Command
* @method :post
* @time :2025/2/24 14:54
*/
public function importCustomModule($text,$project_id = 2837){
public function importCustomModule($url,$project_id){
$line_of_text = [];
$opts = [
'http' => [
'method' => 'GET',
'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'
],
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false
]
];
$file_handle = fopen($url, 'r', null, stream_context_create($opts));
while (!feof($file_handle)) {
$line_of_text[] = fgetcsv($file_handle, 0, ',');
}
fclose($file_handle);
$customContentModel = new CustomModuleContent();
$customCategoryModel = new CustomModuleCategory();;
$customExtendContentTModel = new CustomModuleExtentContent();
$data = explode("\n", $text);
foreach ($data as $k => $item){
$item = trim($item,',');
//按照逗号转为数组
$array = explode(",", $item);
//添加分类
if(empty($array[0])){
continue;
}
//添加内容
$contentId = $customContentModel->addReturnId(['name'=>$array[0],'module_id'=>2,'project_id'=>$project_id]);
echo date('Y-m-d H:i:s') . '当前扩展数据id:'. $contentId . PHP_EOL;
//注册路由
$route = RouteMap::setRoute($array[0], RouteMap::SOURCE_MODULE,
$contentId, $project_id);
$customContentModel->edit(['route'=>$route],['id'=>$contentId]);
if(!empty($array[1])){
$categoryId = ',';
$cateArr = explode('/',$array[1]);
foreach ($cateArr as $cateV){
$cateInfo = $customCategoryModel->read(['name'=>$cateV,'module_id'=>2,'project_id'=>$project_id]);
if($cateInfo !== false){
$categoryId .= $cateInfo['id'].',';
foreach ($line_of_text as $k => $item){
// try {
//添加内容
$contentId = $customContentModel->addReturnId(['name'=>$item[0],'module_id'=>2,'project_id'=>$project_id]);
echo date('Y-m-d H:i:s') . '当前扩展数据id:'. $contentId . PHP_EOL;
//注册路由
$route = RouteMap::setRoute($item[0], RouteMap::SOURCE_MODULE,
$contentId, $project_id);
$customContentModel->edit(['route'=>$route],['id'=>$contentId]);
if(!empty($item[1])){
$categoryId = ',';
$cateArr = explode('/',$item[1]);
foreach ($cateArr as $cateV){
$cateInfo = $customCategoryModel->read(['name'=>$cateV,'module_id'=>2,'project_id'=>$project_id]);
if($cateInfo !== false){
$categoryId .= $cateInfo['id'].',';
}else{
$cateVId = $customCategoryModel->addReturnId(['name'=>$cateV,'module_id'=>2,'project_id'=>$project_id]);
$cateRoute = RouteMap::setRoute($cateV, RouteMap::SOURCE_MODULE_CATE,
$cateVId, $project_id);
$customCategoryModel->edit(['route'=>$cateRoute],['id'=>$cateVId]);
$categoryId .= $cateVId.',';
}
}
$customContentModel->edit(['category_id'=>$categoryId],['id'=>$contentId]);
}
$customContentModel->edit(['category_id'=>$categoryId],['id'=>$contentId]);
}
$saveData = [
['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')],
['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')],
['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')],
['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')],
['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')],
['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')],
['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')],
['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')],
['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')],
['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')],
['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')],
['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')],
['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')],
];
$customExtendContentTModel->insert($saveData);
$saveData = [
['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')],
['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')],
['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')],
['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')],
['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')],
['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')],
['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')],
['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')],
['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')],
['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')],
['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')],
['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')],
['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')],
];
$customExtendContentTModel->insert($saveData);
// }catch (\Exception $e){
// echo date('Y-m-d H:i:s') . '错误name:'. $item[0] . PHP_EOL;
// continue;
// }
}
}
... ...
... ... @@ -90,7 +90,7 @@ class CopyProject extends Command
$data['finish_remain_day'] = 0;
$data['title'] = $data['title'].'-copy';
$data['delete_status'] = 1;
unset($data['id'],$data['robots'],$data['is_translate_tag'],$data['is_translate'],$data['is_minor_languages'],$data['uptime']);
unset($data['id'],$data['exclusive_aicc_day'],$data['aicc'],$data['robots'],$data['is_translate_tag'],$data['is_translate'],$data['is_minor_languages'],$data['uptime']);
$project_id = $projectModel->insertGetId($data);
$hashids = new Hashids($data['from_order_id'], 13, 'abcdefghjkmnpqrstuvwxyz1234567890');
$projectModel->edit(['from_order_id'=>$hashids->encode($project_id)],['id'=>$project_id]);
... ...
... ... @@ -200,7 +200,7 @@ class SyncProject extends Command
'requirement' => $param['remark'],
'cooperate_date' => date('Y-m-d', $param['create_time']),
'from_order_id' => $param['from_order_id'],
'aicc' => $param['exclusive_aicc'],
'aicc' => ($param['exclusive_aicc'] = 0),
"exclusive_aicc_day" => $param['exclusive_aicc_day'],
'hagro' => $param['exclusive_hagro'],
"exclusive_hagro_day" => $param['exclusive_hagro_day'],
... ...
... ... @@ -12,6 +12,7 @@ use App\Models\Domain\DomainInfo;
use App\Models\Mail\Mail;
use App\Models\Project\DeployBuild;
use App\Models\Project\DeployOptimize;
use App\Models\Project\Project;
use App\Models\Project\ProjectKeyword;
use App\Models\Project\ProjectUpdateTdk;
use App\Models\User\User;
... ... @@ -263,6 +264,7 @@ class UpdateSeoTdk extends Command
public function seo_tdk($project_id, $task_id)
{
$notify_master = $notify_keyword = false;
$project = Project::find($project_id);
//更新统计
$update = [];
//AI指令 是否有定制指令
... ... @@ -366,15 +368,37 @@ class UpdateSeoTdk extends Command
}
} else if ($table == 'gl_product_keyword' && $field == 'seo_title') {
# TODO 聚合页seo title 特殊处理 前缀_1 . 关键词 . 后缀_2
$prefix = $this->getPrefixKeyword($project_id, 'prefix', 1);
$suffix = $this->getPrefixKeyword($project_id, 'suffix', 2);
if (empty($prefix) || empty($suffix)){
continue;
$seo_title = '';
//只有推广项目才加 前后缀
if($project->type == Project::TYPE_TWO) {
$prefix = $this->getPrefixKeyword($project_id, 'prefix', 1);
$suffix = $this->getPrefixKeyword($project_id, 'suffix', 2);
if (empty($prefix) || empty($suffix)) {
continue;
}
$title = $v[$this->topic_fields[$table]];
$prefix = $this->getPrefixKeyword($project_id, 'prefix', 1, $title);
//in,for,with,to,near,from 这些介词 只拼前缀,不拼后缀
$suffix_ban = ['in ', 'for ', 'with ', 'to ', 'near ','from ', 'In ', 'For ', 'With ', 'To ', 'Near ','From '];
$suffix = '';
if(Str::contains($title, $suffix_ban)){
// 某些后缀不能并存的情况
$ban_suffix = [];
//services/service 结尾的词,后缀不拼manufacturer,factory
if (Str::endsWith($title, ['services', 'service', 'Services', 'Service'])) {
$ban_suffix = ['manufacturer', 'factory', 'Manufacturer', 'Factory', 'Factories', 'Manufacturers'];
}
//前缀有wholesale或cheap的词,后缀不拼 manufacturer,factory,exporter,company
if (Str::startsWith($title, ['wholesale', 'cheap', 'Wholesale', 'Cheap'])) {
$ban_suffix = array_merge($ban_suffix, ['manufacturer', 'factory', 'exporter', 'company', 'Manufacturer', 'Factory', 'Exporter', 'Company', 'Factories', 'Manufacturers', 'Exporters', 'Companies']);
}
$suffix = $this->getPrefixKeyword($project_id, 'suffix', 2, $title, $ban_suffix);
}
$seo_title = $prefix . ' ' . $title . ' ' . $suffix;
}
$prefix = $this->getPrefixKeyword($project_id, 'prefix', 1, $v[$this->topic_fields[$table]]);
$suffix = $this->getPrefixKeyword($project_id, 'suffix', 2, $v[$this->topic_fields[$table]]);
$seo_title = $prefix . ' ' . $v[$this->topic_fields[$table]] . ' ' . $suffix;
$data[$field] = trim($seo_title);
$update[$table]['title']++;
} else if ($table == 'gl_ai_blog_list' && $field == 'seo_title') {
... ... @@ -539,9 +563,11 @@ class UpdateSeoTdk extends Command
* @param $project_id
* @param $type
* @param $num
* @param string $topic
* @param array $ban 被禁用的前后缀
* @return string
*/
public function getPrefixKeyword($project_id, $type, $num, $topic='')
public function getPrefixKeyword($project_id, $type, $num, $topic='', $ban = [])
{
$str = '';
$info = $this->getDeployOptimize($project_id);
... ... @@ -551,6 +577,10 @@ class UpdateSeoTdk extends Command
//去掉标题存在的词
if ($topic) {
foreach ($fix_keyword as $k=>$keyword) {
// 被禁用的关键词
if (in_array($keyword, $ban)) {
unset($fix_keyword[$k]);
}
// 前后缀如果已经存在, 就不在拼接当前类型
if (FALSE !== strpos($topic, $keyword))
return $str;
... ... @@ -572,7 +602,7 @@ class UpdateSeoTdk extends Command
//随机取
shuffle($fix_keyword);
if (count($fix_keyword) < $num)
return $str;
return implode(", ", $fix_keyword);
$keyword = array_slice($fix_keyword, 0, $num);
$str = implode(", ", $keyword);
... ... @@ -594,7 +624,7 @@ class UpdateSeoTdk extends Command
$info = Cache::get($cache_key);
if(!$info){
$projectOptimizeModel = new DeployOptimize();
$info = $projectOptimizeModel->read(['project_id' => $project_id], ['id', 'company_en_name', 'company_en_description', 'keyword_prefix', 'keyword_suffix']);
$info = $projectOptimizeModel->read(['project_id' => $project_id], ['id', 'company_en_name', 'company_en_description', 'keyword_prefix', 'keyword_suffix', 'brand_keyword']);
$projectKeywordModel = new ProjectKeyword();
$keywordInfo = $projectKeywordModel->read(['project_id'=>$project_id]);
$info['main_keyword'] = '';
... ...
... ... @@ -453,7 +453,7 @@ class PrivateController extends BaseController
return $this->error('未找到当前域名对应的项目!');
}
$json = file_get_contents(storage_path('data/send_product_tag_keyword/' . $project->id . '.json'));
$json = @file_get_contents(storage_path('data/send_product_tag_keyword/' . $project->id . '.json'));
$result = json_decode($json, true) ?: [];
return $this->success($result);
}
... ...
... ... @@ -27,12 +27,15 @@ class MonthReportController extends BaseController
* @author :lyh
* @method :post
* @time :2024/2/2 15:14
* @param :is_upgrade;1->升级项目
*/
public function getMonth(){
$monthCountModel = new MonthCount();
$this->map['project_id'] = $this->user['project_id'];
$this->map['month'] = ['>=',date('Y-m',strtotime($this->user['uptime']))];
$month = $monthCountModel->formatQuery($this->map)->pluck('month')->unique()->toArray();
if($this->user['is_upgrade'] != 1){
$this->map['month'] = ['>=',date('Y-m',strtotime($this->user['uptime']))];
}
$month = $monthCountModel->formatQuery($this->map)->orderBy('month', 'asc')->pluck('month')->unique()->toArray();
$this->response('success',Code::SUCCESS,$month);
}
... ...
... ... @@ -7,12 +7,12 @@
* @time :2025/3/12 17:01
*/
namespace App\Http\Controllers\Bside\Product;
namespace App\Http\Controllers\Bside\SeoSetting;
use App\Enums\Common\Code;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\Product\KeywordUrlLogic;
use App\Models\Product\KeywordUrl;
use App\Http\Logic\Bside\SeoSetting\KeywordUrlLogic;
use App\Models\SeoSetting\KeywordUrl;
/**
* @remark :关键词设置
... ...
<?php
/**
* @remark :
* @name :LinkDataController.php
* @author :lyh
* @method :post
* @time :2025/3/14 16:30
*/
namespace App\Http\Controllers\Bside\SeoSetting;
use App\Enums\Common\Code;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\SeoSetting\LinkDataLogic;
use App\Models\SeoSetting\LinkData;
class LinkDataController extends BaseController
{
/**
* @remark :获取列表页
* @name :lists
* @author :lyh
* @method :post
* @time :2025/3/14 16:33
*/
public function lists(LinkData $linkData){
$lists = $linkData->lists($this->map,$this->page,$this->row);
$this->response('success',Code::SUCCESS,$lists);
}
/**
* @remark :获取详情数据
* @name :info
* @author :lyh
* @method :post
* @time :2025/3/14 17:41
*/
public function info(LinkData $linkData){
$this->request->validate([
'id'=>['required'],
],[
'id.required' => 'id不能为空',
]);
$info = $linkData->read(['id'=>$this->param['id']]);
$this->response('success',Code::SUCCESS,$info);
}
/**
* @remark :批量添加
* @name :batchSave
* @author :lyh
* @method :post
* @time :2025/3/14 16:45
*/
public function batchSave(LinkDataLogic $logic){
$this->request->validate([
'data'=>['required'],
],[
'data.required' => 'da_values不能为空',
]);
$logic->batchSave();
$this->response('success');
}
/**
* @remark :删除
* @name :del
* @author :lyh
* @method :post
* @time :2025/3/14 16:45
*/
public function del(LinkData $linkData){
$this->request->validate([
'id'=>'required|array',
],[
'id.required' => 'id不能为空',
'id.array' => 'id为数组',
]);
$result = $linkData->del(['id'=>['in',$this->param['id']]]);
$this->response('success',Code::SUCCESS,$result);
}
}
... ...
... ... @@ -7,11 +7,11 @@
* @time :2025/3/12 15:36
*/
namespace App\Http\Controllers\Bside\Setting;
namespace App\Http\Controllers\Bside\SeoSetting;
use App\Enums\Common\Code;
use App\Http\Controllers\Bside\BaseController;
use App\Models\WebSetting\WebSettingYoutube;
use App\Models\SeoSetting\WebSettingYoutube;
class WebSettingYoutubeController extends BaseController
{
... ...
... ... @@ -772,6 +772,7 @@ class ProjectLogic extends BaseLogic
$data['special'] = $this->model::specialMap();
$data['search'] = $this->model::searchParam();
$data['plan'] = $this->model::planMap();
$data['blog_frequency'] = $this->model::typeBlogFrequency();
return $this->success($data);
}
... ...
... ... @@ -7,10 +7,10 @@
* @time :2025/3/12 17:06
*/
namespace App\Http\Logic\Bside\Product;
namespace App\Http\Logic\Bside\SeoSetting;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Product\KeywordUrl;
use App\Models\SeoSetting\KeywordUrl;
/**
* @remark :关键词设置
... ...
<?php
/**
* @remark :
* @name :LinkDataLogic.php
* @author :lyh
* @method :post
* @time :2025/3/14 17:20
*/
namespace App\Http\Logic\Bside\SeoSetting;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\SeoSetting\LinkData;
/**
* @remark :获取外链数据
* @name :LinkDataLogic
* @author :lyh
* @method :post
* @time :2025/3/14 17:21
*/
class LinkDataLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->param = $this->requestAll;
$this->model = new LinkData();
}
/**
* @remark :保存数据
* @name :batchSave
* @author :lyh
* @method :post
* @time :2025/3/14 17:22
* @param :url->外链;da_values->da值
*/
public function batchSave(){
$data = [];
foreach ($this->param['data'] as $v){
$data[] = [
'url'=>$v['url'],
'da_values'=>$v['da_values'],
];
}
if(!empty($data)){
$this->model->insertAll($data);
}
return $this->success();
}
}
... ...
... ... @@ -12,13 +12,6 @@ class DeployOptimize extends Base
protected $table = 'gl_project_deploy_optimize';
// public function setMinorLanguagesAttribute($value){
// $this->attributes['minor_languages'] = Arr::a2s($value);
// }
//
// public function getMinorLanguagesAttribute($value){
// return Arr::s2a($value);
// }
public function getGTopPlanAttribute($value){
return Arr::s2a($value);
}
... ...
... ... @@ -55,6 +55,27 @@ class Project extends Base
}
/**
* @remark :aiBlog发布频率
* @name :typeBlogFrequency
* @author :lyh
* @method :post
* @time :2025/3/15 10:29
*/
public static function typeBlogFrequency($val = 0){
$arr = [
1=>'1-2',
2=>'2-3',
3=>'2-4',
4=>'3-5',
5=>'5-7',
];
if($val){
return $arr[$val] ?? '';
}
return $arr;
}
/**
* 项目类型
* @return string[]
* @author zbj
... ... @@ -107,9 +128,10 @@ class Project extends Base
return [
1 => '自建站项目',
2 => '重点跟进',
3 => '推广案例',
4 => '全球搜案例',
5 => '设计师案例',
3 => '经典案例',
4 => '全球搜案例库',
5 => '设计师精美网站',
18 => '多语言案例',
6 => '可登陆后台',
7 => 'T项目',
8 => '特殊前后缀',
... ... @@ -122,6 +144,7 @@ class Project extends Base
15 => 'AI案例',
16 => '6.0广告',
17 => '超哥监控项目',
19 => '商城案例',
];
}
... ...
... ... @@ -7,7 +7,7 @@
* @time :2025/3/12 16:59
*/
namespace App\Models\Product;
namespace App\Models\SeoSetting;
use App\Models\Base;
... ...
<?php
/**
* @remark :
* @name :LinkData.php
* @author :lyh
* @method :post
* @time :2025/3/14 16:30
*/
namespace App\Models\SeoSetting;
use App\Models\Base;
/**
* @remark :外链数据
* @name :LinkData
* @author :lyh
* @method :post
* @time :2025/3/14 16:31
*/
class LinkData extends Base
{
protected $table = 'gl_link_data';
//连接数据库
protected $connection = 'custom_mysql';
}
... ...
... ... @@ -7,7 +7,7 @@
* @time :2025/3/11 15:51
*/
namespace App\Models\WebSetting;
namespace App\Models\SeoSetting;
use App\Models\Base;
... ...
... ... @@ -670,16 +670,24 @@ Route::middleware(['bloginauth'])->group(function () {
//seo白帽 youtube账号密码设置
Route::prefix('youtube')->group(function () {
Route::any('/info', [\App\Http\Controllers\Bside\Setting\WebSettingYoutubeController::class, 'getYoutubeInfo'])->name('youtube_getYoutubeInfo');
Route::any('/save', [\App\Http\Controllers\Bside\Setting\WebSettingYoutubeController::class, 'saveYoutube'])->name('youtube_saveYoutube');
Route::any('/info', [\App\Http\Controllers\Bside\SeoSetting\WebSettingYoutubeController::class, 'getYoutubeInfo'])->name('youtube_getYoutubeInfo');
Route::any('/save', [\App\Http\Controllers\Bside\SeoSetting\WebSettingYoutubeController::class, 'saveYoutube'])->name('youtube_saveYoutube');
});
//seo白帽 关键词设置
Route::prefix('keyword_url')->group(function () {
Route::any('/', [\App\Http\Controllers\Bside\Product\KeywordUrlController::class, 'lists'])->name('keyword_url_lists');
Route::any('/info', [\App\Http\Controllers\Bside\Product\KeywordUrlController::class, 'info'])->name('keyword_url_info');
Route::any('/save', [\App\Http\Controllers\Bside\Product\KeywordUrlController::class, 'save'])->name('keyword_url_save');
Route::any('/del', [\App\Http\Controllers\Bside\Product\KeywordUrlController::class, 'del'])->name('keyword_url_del');
Route::any('/', [\App\Http\Controllers\Bside\SeoSetting\KeywordUrlController::class, 'lists'])->name('keyword_url_lists');
Route::any('/info', [\App\Http\Controllers\Bside\SeoSetting\KeywordUrlController::class, 'info'])->name('keyword_url_info');
Route::any('/save', [\App\Http\Controllers\Bside\SeoSetting\KeywordUrlController::class, 'save'])->name('keyword_url_save');
Route::any('/del', [\App\Http\Controllers\Bside\SeoSetting\KeywordUrlController::class, 'del'])->name('keyword_url_del');
});
//seo白帽 外链设置
Route::prefix('link_data')->group(function () {
Route::any('/', [\App\Http\Controllers\Bside\SeoSetting\LinkDataController::class, 'lists'])->name('link_data_lists');
Route::any('/batchSave', [\App\Http\Controllers\Bside\SeoSetting\LinkDataController::class, 'batchSave'])->name('link_data_batchSave');
Route::any('/info', [\App\Http\Controllers\Bside\SeoSetting\LinkDataController::class, 'info'])->name('link_data_info');
Route::any('/del', [\App\Http\Controllers\Bside\SeoSetting\LinkDataController::class, 'del'])->name('link_data_del');
});
});
//无需登录验证的路由组
... ...