作者 刘锟

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

... ... @@ -220,17 +220,24 @@ class VideoTask extends Command
if (count($productIds)<7){
$product_all_id = Product::where("project_id", $project_id)->whereNotIn('id', $productIds)->where("status",Product::STATUS_ON)->pluck('id')->toArray();
$number = 40;
$product_id = array_rand($product_all_id, min(count($product_all_id, $number-count($productIds))));
$randomData = Product::where("project_id", $project_id)->whereIn("id", $product_id)->get();
$products = $productsQuery->merge($randomData);
$array_count = count($product_all_id);
if ($array_count > 0) {
$product_id = array_rand($product_all_id, min($array_count, $number - count($productIds)));
$randomData = Product::where("project_id", $project_id)->whereIn("id", $product_id)->get();
$products = $productsQuery->merge($randomData);
}
}else{
$products = $productsQuery;
}
}else{
$product_all_id = Product::where("project_id", $project_id)->where("status",Product::STATUS_ON)->pluck('id')->toArray();
$number = 40;
$product_id = array_rand($product_all_id, min(count($product_all_id, $number-count($productIds))));
$products = Product::where("project_id", $project_id)->whereIn("id", $product_id)->get();
$array_count = count($product_all_id);
if ($array_count > 0)
{
$product_id = array_rand($product_all_id, min($array_count, $number-count($productIds)));
$products = Product::where("project_id", $project_id)->whereIn("id", $product_id)->get();
}
}
}
$data = [];
... ... @@ -242,10 +249,11 @@ class VideoTask extends Command
if(count($data) > 13){
break;
}
if (strpos($item->keyword_id, ','.$productKeyword->id.',') === false) {
$keyword_id = implode(',',$item->keyword_id);
if (strpos(','.$keyword_id.',', ','.$productKeyword->id.',') === false) {
//不包含
$productModel = new Product();
$keyword_id = $item->keyword_id . $productKeyword->id.',';
$keyword_id = $keyword_id . $productKeyword->id.',';
$productModel->edit(['keyword_id'=>$keyword_id],['id'=>$item->id]);
}
$data[] = ['url'=>getImageUrl($item->thumb['url']),'title'=>$item->title];
... ...
... ... @@ -19,13 +19,13 @@ class Kernel extends ConsoleKernel
$schedule->command('remain_day')->dailyAt('08:00')->withoutOverlapping(1); // 项目剩余服务时长
$schedule->command('rank_data_task')->everyMinute()->withoutOverlapping(1); // 排名数据更新任务
$schedule->command('rank_data')->dailyAt('07:00')->withoutOverlapping(1); // 排名数据,每天凌晨执行一次
$schedule->command('rank_data_speed')->dailyAt('01:00')->withoutOverlapping(1); // 排名数据-测速数据,每周一凌晨执行一次
$schedule->command('rank_data_external_links')->dailyAt('01:00')->withoutOverlapping(1); // 排名数据-外链,每周一凌晨执行一次
$schedule->command('rank_data_indexed_pages')->dailyAt('01:00')->withoutOverlapping(1); // 排名数据-页面收录,每周一凌晨执行一次
$schedule->command('rank_data_recomm_domain')->dailyAt('01:00')->withoutOverlapping(1); // 排名数据-引荐域名,每周一凌晨执行一次
$schedule->command('rank_data_speed')->dailyAt('01:10')->withoutOverlapping(1); // 排名数据-测速数据,每周一凌晨执行一次
$schedule->command('rank_data_external_links')->dailyAt('01:20')->withoutOverlapping(1); // 排名数据-外链,每周一凌晨执行一次
$schedule->command('rank_data_indexed_pages')->dailyAt('01:30')->withoutOverlapping(1); // 排名数据-页面收录,每周一凌晨执行一次
$schedule->command('rank_data_recomm_domain')->dailyAt('01:40')->withoutOverlapping(1); // 排名数据-引荐域名,每周一凌晨执行一次
$schedule->command('rank_data_week')->dailyAt('01:00')->withoutOverlapping(1); // 排名数据,每周一凌晨执行一次
// $schedule->command('share_user')->dailyAt('01:00')->withoutOverlapping(1); // 清除用户ayr_share数据,每天凌晨1点执行一次
$schedule->command('count')->dailyAt('01:00')->withoutOverlapping(1); //每天凌晨1点执行一次
$schedule->command('count')->dailyAt('00:30')->withoutOverlapping(1); //每天凌晨1点执行一次
$schedule->command('service_count')->dailyAt('01:00')->withoutOverlapping(1); //服务器使用情况,每天凌晨1点执行一次
$schedule->command('web_traffic 1')->everyThirtyMinutes(); // 引流 1-3个月的项目,半小时一次
$schedule->command('web_traffic 2')->cron('*/18 * * * *'); // 引流 4-8个月的项目,18分钟一次
... ... @@ -35,7 +35,7 @@ class Kernel extends ConsoleKernel
$schedule->command('forward_count')->monthlyOn(1,'01:00')->withoutOverlapping(1);//没月月初1号执行月统计转发询盘记录
$schedule->command('inquiry_delay')->everyMinute()->withoutOverlapping(1);//TODO::上线放开,转发询盘,每分钟执行一次
$schedule->command('inquiry_count')->dailyAt('01:00')->withoutOverlapping(1); // 询盘统计数据,每天凌晨执行一次
$schedule->command('domain_info')->dailyAt('01:00')->withoutOverlapping(1);// 更新域名|证书结束时间,每天凌晨1点执行一次
$schedule->command('domain_info')->dailyAt('01:20')->withoutOverlapping(1);// 更新域名|证书结束时间,每天凌晨1点执行一次
$schedule->command('last_inquiry')->dailyAt('04:00')->withoutOverlapping(1);// 最近一次询盘信息
// $schedule->command('update_progress')->everyThirtyMinutes()->withoutOverlapping(1);//监控更新
$schedule->command('update_seo_tdk_crontab')->dailyAt('00:00')->withoutOverlapping(1); //更新上线项目TDK
... ... @@ -43,8 +43,12 @@ class Kernel extends ConsoleKernel
// $schedule->command('project_file_pdf')->dailyAt('00:00')->withoutOverlapping(1); // 网站项目数据,生成PDF文件
$schedule->command('sync_manager')->dailyAt('01:00')->withoutOverlapping(1); //TODO::手机号码同步 每天执行一次
$schedule->command('recommended_suppliers')->dailyAt('01:00')->withoutOverlapping(1); //每天凌晨1点执行一次生成推荐商
$schedule->command('recommended_suppliers')->dailyAt('03:00')->withoutOverlapping(1); //每天凌晨1点执行一次生成推荐商
$schedule->command('notice_c')->dailyAt('02:00')->withoutOverlapping(1); //每天凌晨1点执行一次生成推荐商
// 每日推送视频任务
$schedule->command('video_task')->dailyAt('01:30')->withoutOverlapping(1);
// 每日推送已完成视频任务项目生成对应界面
$schedule->command('notice_c')->dailyAt('02:00')->withoutOverlapping(1);
}
/**
... ...
... ... @@ -13,8 +13,10 @@ use App\Models\Product\Product;
use App\Models\Project\OnlineCheck;
use App\Models\Project\Project;
use App\Models\RouteMap\RouteMap;
use App\Models\User\User;
use App\Services\ProjectServer;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
/**
* Class PrivateController
... ... @@ -98,4 +100,46 @@ class PrivateController extends BaseController
}
return $this->success($result);
}
/**
* 验证当前用户是否存在
* TODO 查询手机号码是否是项目用户, 如果升级项目未上线项目return false;
* @param Request $request
* @return false|string
*/
public function hasUser(Request $request)
{
// 获取数据,初始化信息
$mobile = trim($request->input('mobile'));
$result = ['mobile' => $mobile, 'v6_user' => false];
// 获取用户,验证用户
$project_ids = User::where(['mobile' => $mobile])->pluck('project_id')->toArray();
if (empty($project_ids))
return $this->success($result);
$projects = Project::whereIn('id', $project_ids)->where('delete_status', 0)->get();
foreach ($projects as $project) {
// 如果是升级项目 并且未上线状态,不算做有效用户
if ($project->is_upgrade == Project::IS_UPGRADE_TRUE && $project->type <= Project::TYPE_ONE)
continue;
$result['v6_user'] = true;
}
return $this->success($result);
}
/**
* v6 有效用户
* @param Request $request
* @return false|string
*/
public function validUser(Request $request)
{
// 排除演示项目数据
$valid_user = User::select(['gl_project_user.mobile'])->leftJoin('gl_project', 'gl_project.id', '=', 'gl_project_user.project_id')->where(['delete_status' => 0, 'is_upgrade' => Project::IS_UPGRADE_FALSE])->where('gl_project.id', '>', 1)->pluck('mobile')->toArray();
$upgrade_user = User::select(['gl_project_user.mobile'])->leftJoin('gl_project', 'gl_project.id', '=', 'gl_project_user.project_id')->where(['delete_status' => 0, 'is_upgrade' => Project::IS_UPGRADE_TRUE])->where('gl_project.type', '>', Project::TYPE_ONE)->pluck('mobile')->toArray();
$user = array_unique(array_merge($valid_user, $upgrade_user));
return $this->success($user);
}
}
\ No newline at end of file
... ...
... ... @@ -235,9 +235,15 @@ class LoginController extends BaseController
* @time :2023/8/24 17:37
*/
public function globalSo_v6_login(UserLoginLogic $logic){
$common = new Common();
$arr = $common->decrypt(urldecode($this->param['token']));
if(empty($arr)){
$this->param = $this->request->validate([
'token' => 'required',
],[
'token.required' => 'token不能为空',
]);
try {
$common = new Common();
$arr = $common->decrypt(urldecode($this->param['token']));
}catch (\Exception $e){
$this->response('非法请求!',Code::USER_ERROR);
}
if (empty($arr['timestamp']) || time() - $arr['timestamp'] > 60) {
... ...
... ... @@ -54,7 +54,7 @@ class TranslateLogic extends BaseLogic
if($info !== false){
$data_read = json_decode($info['data'],JSON_UNESCAPED_UNICODE);
foreach ($data_read as $k => $v){
$old_key[] = $k;
$old_key[] = trim($k);
$data[] = [$k => $v];
}
}
... ... @@ -83,30 +83,9 @@ class TranslateLogic extends BaseLogic
}
}
$data = $this->unique_multidimensional_array($data);
return $this->success($data);
}
/**
* @remark :多维数组去重
* @name :unique_multidimensional_array
* @author :lyh
* @method :post
* @time :2024/3/8 16:38
*/
public function unique_multidimensional_array($array) {
$tempArray = [];
$uniqueArray = [];
foreach ($array as $value) {
// 使用键作为临时数组的键,如果不存在则添加到去重后的数组中
$key = key($value);
if (!isset($tempArray[$key])) {
$tempArray[$key] = true;
$uniqueArray[] = $value;
}
}
return $uniqueArray;
}
/**
* @remark :获取图片列表
... ... @@ -203,10 +182,11 @@ class TranslateLogic extends BaseLogic
if(FALSE !== strpos($country_class, 'country-flag')) {
continue;
}
$need_tran[] = htmlspecialchars_decode(html_entity_decode($string));
$need_tran[] = trim(htmlspecialchars_decode(html_entity_decode($string)));
}
$need_tran[] = $description ? $description->attr['content'] : '';
$need_tran[] = $keywords ? $keywords->attr['content'] : '';
$need_tran = array_unique($need_tran);
return $need_tran;
}
... ...
... ... @@ -2,11 +2,12 @@
namespace App\Listeners;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Enums\Common\Common;
use Illuminate\Database\Events\QueryExecuted;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Str;
/**
* 监听数据库sql执行事件
... ... @@ -47,6 +48,33 @@ class QueryListener
$log = $log.' [ RunTime:'.$event->time.'ms ] ';
Log::debug($log);
}
//监听9644这个api_no是TM咋个被改的
if (in_array(9644, $event->bindings) && Str::contains($event->sql, 'update') && Str::contains($event->sql, '`api_no` =')) {
//记录debug 根据这个溯源
$trace = debug_backtrace();
$traces = [];
foreach ($trace as $index => $caller) {
if ($index === 0) {
continue; // 跳过当前方法的调用信息
}
$file = $caller['file'];
$line = $caller['line'];
$class = $caller['class'];
$method = $caller['function'];
$traces[] = "Method $method called from $class in file $file at line $line\n";
}
//用户信息 哪个改的 还是脚本跑的
$token = request()->header('token');
Log::channel('test')->info('api_no updated', [
'sql' => $event->sql,
'bindings' => $event->bindings,
'route' => Route::current(),
'request' => request()->all(),
'a_info' => Cache::get(Common::MANAGE_TOKEN . $token),
'b_info' => Cache::get($token),
'trace' => $traces
]);
}
}catch (\Exception $exception){
Log::error('log sql error:'.$exception->getMessage());
}
... ...
... ... @@ -72,6 +72,12 @@ return [
'via' => \App\Factory\LogFormatterFactory::class,
'prefix' => 'rank_data',
],
//测试数据日志
'test' => [
'driver' => 'custom',
'via' => \App\Factory\LogFormatterFactory::class,
'prefix' => 'test',
],
'wechatside' => [
'driver' => 'custom',
'via' => \App\Factory\LogFormatterFactory::class,
... ...
... ... @@ -24,4 +24,9 @@ Route::get('get_project_route', [\App\Http\Controllers\Api\PrivateController::cl
Route::any('get_product_images', [\App\Http\Controllers\Api\ProductController::class, 'getImages'])->name('api.get_product_images');
Route::post('inquiry_submit', [\App\Http\Controllers\Api\InquiryController::class, 'submit'])->name('api.inquiry_submit');
Route::any('getOptimizationReport', [\App\Http\Controllers\Api\OptimizationReportController::class, 'getOptimizationReport'])->name('api.getOptimizationReport');
// 视频任务回调信息
Route::post('video_task_callback', [\App\Http\Controllers\Api\NoticeController::class, 'videoTaskCallback'])->name('api.video_task_callback');
// 验证是否为6.0用户
Route::any('has_user', [\App\Http\Controllers\Api\PrivateController::class, 'hasUser'])->name('api.has_user');
// 6.0有效用户用户
Route::any('valid_user', [\App\Http\Controllers\Api\PrivateController::class, 'validUser'])->name('api.valid_user');
... ...