作者 赵彬吉
... ... @@ -296,13 +296,13 @@ class AiBlogTask extends Command
$domain = $domainModel->getProjectIdDomain($project_id);
if (empty($domain)) {
$this->output('send: 域名不存在, project id: ' . $project_id);
return true;
continue;
}
//判断是否是自建站服务器,如果是,不请求C端接口,数据直接入库
$project_info = $project_model->read(['id'=>$project_id],['serve_id']);
if(!$project_info){
$this->output('send: 项目不存在, project id: ' . $project_id);
return true;
continue;
}
$serve_ip_model = new ServersIp();
$serve_ip_info = $serve_ip_model->read(['id'=>$project_info['serve_id']],['servers_id']);
... ...
... ... @@ -79,9 +79,11 @@ class AfterDayCount extends Command
->where('gl_project.delete_status',0)
->where('gl_project.created_at','<=',$todayMidnight)
->where('gl_project.is_remain_today',1)
->where('gl_project_deploy_build.plan','!=',0)
->whereIn('gl_project_deploy_optimize.optimist_mid',$idArr)
->whereIn('gl_project.type',[2,4])
->leftJoin('gl_project_deploy_optimize', 'gl_project.id', '=', 'gl_project_deploy_optimize.project_id')
->leftJoin('gl_project_deploy_build', 'gl_project.id', '=', 'gl_project_deploy_build.project_id')
->whereRaw("FIND_IN_SET('2', gl_project.level) = 0 AND FIND_IN_SET('3', gl_project.level) = 0")
->whereRaw("FIND_IN_SET('7', gl_project_deploy_optimize.special) = 0 AND FIND_IN_SET('8', gl_project_deploy_optimize.special) = 0")
->count();
... ... @@ -102,7 +104,9 @@ class AfterDayCount extends Command
->where('gl_project.created_at','<=',$threeMonthsAgo)
->whereIn('gl_project_deploy_optimize.optimist_mid',$idArr)
->whereIn('gl_project.type',[2,4])
->where('gl_project_deploy_build.plan','!=',0)
->leftJoin('gl_project_deploy_optimize', 'gl_project.id', '=', 'gl_project_deploy_optimize.project_id')
->leftJoin('gl_project_deploy_build', 'gl_project.id', '=', 'gl_project_deploy_build.project_id')
->whereRaw("FIND_IN_SET('2', gl_project.level) = 0 AND FIND_IN_SET('3', gl_project.level) = 0")
->whereRaw("FIND_IN_SET('7', gl_project_deploy_optimize.special) = 0 AND FIND_IN_SET('8', gl_project_deploy_optimize.special) = 0")
->count();
... ...
<?php
/**
* Created by PhpStorm.
* User: zhl
* Date: 2025/4/15
* Time: 10:25
*/
namespace App\Console\Commands\Monitor;
use App\Models\Domain\DomainInfo;
use App\Models\Product\Keyword;
use App\Models\Project\OnlineCheck;
use App\Models\Project\Project;
use App\Repositories\ToolRepository;
use App\Services\DingService;
use App\Services\ProjectServer;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
/**
* Class Supervisory
* @package App\Console\Commands\Monitor
*/
class Supervisory extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'monitor_supervisory';
/**
* The console command description.
*
* @var string
*/
protected $description = '监控脚本';
/**
* Supervisory constructor.
*/
public function __construct()
{
parent::__construct();
}
/**
* @return bool
*/
public function handle()
{
list($robots_ids, $close_ids) = $this->getRobotsProject();
$spot_projects = $this->getSpotCheck();
#TODO robots、 TDK、 top-search、 top-blog
list($error_num, $error, $error_url, $page_404, $tdk_error) = $this->spotCheckPage($spot_projects);
$this->sendMessage($robots_ids, $close_ids, $error_num, $error, $error_url, $page_404, $tdk_error, $spot_projects);
return true;
}
/**
* 抽查数据
* @param $projects
* @return array
*/
public function spotCheckPage($projects)
{
$error_num = 0;
$error = [];
$error_url = [];
$page_404 = [];
$tdk_error = [];
$tdk = [];
foreach ($projects as $project) {
$this->output('抽查项目:' . $project['project_id'] . ', 域名:' . $project['domain']);
$host = 'https://' . $project['domain'] . '/';
// AI blog页面
$blog_url = $host . 'top-blog/';
list($blog_code, $blog_html) = app(ToolRepository::class)->curlRequest($blog_url, [], $method = 'GET', [], 10);
if ($blog_code != 200) {
$error_num++;
array_push($error_url, $blog_url);
} else {
$tdk = $this->analysisHtml($blog_html);
if (FALSE == is_array($tdk)) {
$error_num++;
array_push($error, $blog_url);
} else if (empty($tdk['title'])) {
array_push($tdk_error, $blog_url);
} else if (FALSE !== strpos('404', $tdk['title'])){
array_push($page_404, $blog_url);
}
}
// top search页面
$search_url = $host . 'top-search/';
list($search_code, $search_html) = app(ToolRepository::class)->curlRequest($search_url, [], $method = 'GET', [], 10);
if ($search_code != 200) {
$error_num++;
array_push($error_url, $search_url);
} else {
$tdk = $this->analysisHtml($search_html);
if (FALSE == is_array($tdk)) {
$error_num++;
array_push($error, $search_url);
} else if (empty($tdk['title'])) {
array_push($tdk_error, $search_url);
} else if (FALSE !== strpos('404', $tdk['title'])){
array_push($page_404, $search_url);
}
}
// 关键词聚合页
foreach ($project['keyword'] as $item) {
$keyword_url = $host . $item['route'] . '/';
$this->output('抽查url:' . $keyword_url);
list($keyword_code, $keyword_html) = app(ToolRepository::class)->curlRequest($keyword_url, [], $method = 'GET', [], 10);
if ($keyword_code != 200) {
// 请求失败
$error_num++;
array_push($error_url, $keyword_url);
} else {
$tdk = $this->analysisHtml($keyword_html);
if (FALSE == is_array($tdk)) {
// 解析HTML失败
$error_num++;
array_push($error, $keyword_url);
} else if (empty($tdk['title'])) {
array_push($tdk_error, $keyword_url);
} else {
if (FALSE !== strpos('404', $tdk['title'])) {
// 404页面
array_push($page_404, $keyword_url);
} else {
// TDK验证
$tdk = array_filter(array_unique($tdk));
if (count($tdk) < 3)
array_push($tdk_error, $keyword_url);
}
}
}
}
}
return [$error_num, $error, $error_url, $page_404, $tdk_error];
}
/**
* 获取robots信息
* @return array
*/
public function getRobotsProject()
{
$this->output('统计robots start');
$ids = Project::where(['robots' => 1])->pluck('id')->toArray();
file_put_contents(storage_path('data/robots/' . date('Ymd'). '.json'), json_encode($ids, 256));
if (FALSE == is_file(storage_path('data/robots/' . date('Ymd', strtotime('-1 day')). '.json')))
return [$ids, []];
$string = file_get_contents(storage_path('data/robots/' . date('Ymd', strtotime('-1 day')). '.json'));
$yesterday_robots_ids = json_decode($string, true) ?: [];
$close_ids = [];
foreach ($yesterday_robots_ids as $id) {
if (FALSE == in_array($id, $ids)) {
array_push($close_ids, $id);
}
}
return [$ids, $close_ids];
}
/**
* 随机获取抽查项目
* @return array|int|string
*/
public function getRandProject()
{
$this->output('随机获取项目抽查');
$ids = Project::leftJoin('gl_project_deploy_optimize as b', 'gl_project.id', '=', 'b.project_id')
->leftJoin('gl_project_online_check as c', 'gl_project.id', '=', 'c.project_id')
->leftJoin('gl_domain_info as d', 'gl_project.id', '=', 'd.project_id')
->where('gl_project.type', Project::TYPE_TWO)
->where('gl_project.extend_type', 0) // 是否续费是由extend_type字段控制
->where('gl_project.delete_status', Project::IS_DEL_FALSE)
->where(function ($subQuery) {
$subQuery->orwhere('c.qa_status', OnlineCheck::STATUS_ONLINE_TRUE)->orwhere('gl_project.is_upgrade', Project::IS_UPGRADE_TRUE);
})
->pluck('gl_project.id')
->toArray();
$project_ids = array_rand($ids, 10);
return $project_ids;
}
/**
* 获取抽查项目数据
* @return mixed
*/
public function getSpotCheck()
{
$project_ids = $this->getRandProject();
$projects = DomainInfo::whereIn('project_id', $project_ids)->get(['project_id', 'domain'])->toArray();
foreach ($projects as &$project) {
ProjectServer::useProject($project['project_id']);
$keyword = Keyword::where(['project_id' => $project['project_id'], 'status' => Keyword::STATUS_ACTIVE])->inRandomOrder()->take(10)->get(['id', 'title', 'seo_title', 'seo_keywords', 'seo_description', 'route']);
DB::disconnect('custom_mysql');
if ($keyword->isEmpty()) {
$keyword = [];
} else {
$keyword = $keyword->toArray();
}
$project['keyword'] = $keyword;
}
return $projects;
}
/**
* 获取页面TDK 分析请求数据
* @param $html
* @return array|string
*/
public function analysisHtml($html)
{
$result = [];
if (empty($html))
return $result;
try {
$dom = new \DOMDocument();
@$dom->loadHTML($html);
$title = $dom->getElementsByTagName('title');
$metas = $dom->getElementsByTagName('meta');
$result['title'] = $title->length > 0 ? trim($title->item(0)->nodeValue) : '';
foreach ($metas as $meta) {
$name = strtolower($meta->getAttribute('name'));
$content = $meta->getAttribute('content');
if ($name === 'description') {
$result['description'] = trim($content);
} elseif ($name === 'keywords') {
$result['keywords'] = trim($content);
}
}
// 解析页面, 使用完成, 手动释放内存变量
unset($title);
unset($metas);
unset($dom);
return $result;
} catch (\Exception $e) {
return '解析HTML失败:' . $e->getMessage();
}
}
public function sendMessage($robots_ids, $close_ids, $error_num, $error, $error_url, $page_404, $tdk_error, $spot_projects)
{
$tmp = compact('robots_ids', 'close_ids', 'error_num', 'error', 'error_url', 'page_404', 'tdk_error', 'spot_projects');
file_put_contents(storage_path('data/robots/' . date('Ymd'). 'log.json'), json_encode($tmp, 256));
unset($tmp);
$domain = array_column($spot_projects, 'domain');
$domain = array_unique(array_filter($domain));
$message[] = '开启robots项目数:' . count($robots_ids);
$message[] = '关闭robots项目:' . ($close_ids ? implode(',', $close_ids) : '无');
$message[] = '抽查项目数量: ' . count($domain);
$message[] = 'top-blog: ' . count($domain);
$message[] = 'top-search: ' . count($domain);
$message[] = '抽查错误次数:' . $error_num;
$message[] = '抽查项目域名: ' . implode(' 、 ', $domain);
$message[] = '请求失败链接: ' . implode(' 、 ', $error_url);
$message[] = '页面失败链接: ' . implode(' 、 ', $error);
$message[] = '404页面链接: ' . implode(' 、 ', $page_404);
$message[] = 'TDK错误链接: ' . implode(' 、 ', $tdk_error);
$msg = implode(PHP_EOL, $message);
$link = 'https://oapi.dingtalk.com/robot/send?access_token=3927b42d072972fcf572e7b01728bf3e1390e08094d6f77c5f28bfd85b19f09f';
$dingService = new DingService();
$body = [
'keyword' => '项目数据推送',
'msg' => $msg,
'isAtAll' => false, // 是否@所有人
];
$dingService->handle($body, $link);
}
public function output($message)
{
echo date('Y-m-d H:i:s') . ' ' . $message . PHP_EOL;
}
}
\ No newline at end of file
... ...
<?php
/**
* @remark :
* @name :CheckListController.php
* @author :lyh
* @method :post
* @time :2025/4/17 9:25
*/
namespace App\Http\Controllers\Aside\Optimize;
use App\Enums\Common\Code;
use App\Http\Controllers\Aside\BaseController;
use App\Models\Project\OptimizeCheckList;
use Illuminate\Http\Request;
/**
* @remark :保存清单
* @name :CheckListController
* @author :lyh
* @method :post
* @time :2025/4/17 9:25
*/
class CheckListController extends BaseController
{
public function __construct(Request $request)
{
parent::__construct($request);
$this->model = new OptimizeCheckList();
}
/**
* @remark :获取分页检查清单数据
* @name :lists
* @author :lyh
* @method :post
* @time :2025/4/17 9:31
*/
public function lists(){
$field = ['id','status','sort','text','created_at'];
$data = $this->model->lists($this->map,$this->page,$this->row,'id',$field);
$this->response('success',Code::SUCCESS,$data);
}
/**
* @remark :获取数据详情
* @name :info
* @author :lyh
* @method :post
* @time :2025/4/17 16:18
*/
public function info(){
$this->request->validate([
'id'=>'required',
],[
'id.required' => '主键不能为空',
]);
$data = $this->model->read($this->map);
$this->response('success',Code::SUCCESS,$data);
}
/**
* @remark :保存检查清单
* @name :save
* @author :lyh
* @method :post
* @time :2025/4/17 9:32
*/
public function save(){
if(isset($this->param['id']) && !empty($this->param['id'])){
$id = $this->param['id'];
$this->model->edit($this->param,['id'=>$this->param['id']]);
}else{
$id = $this->model->addReturnId($this->param);
}
$this->response('success',Code::SUCCESS,['id'=>$id]);
}
/**
* @remark :修改状态
* @name :status
* @author :lyh
* @method :post
* @time :2025/4/17 9:48
*/
public function status(){
$this->request->validate([
'id'=>'required',
'status'=>'required'
],[
'id.required' => '主键不能为空',
'status.required' => '状态不能为空',
]);
$data = $this->model->edit(['status'=>$this->param['status']],['id'=>$this->param['id']]);
$this->response('success',Code::SUCCESS,$data);
}
/**
* @remark :删除数据
* @name :del
* @author :lyh
* @method :post
* @time :2025/4/17 9:48
*/
public function del(){
$this->request->validate([
'id'=>'required',
],[
'id.required' => '主键不能为空',
]);
if(!is_array($this->param['id'])){
$this->param['id'] = ['in',[$this->param['id']]];
}
$data = $this->model->del($this->map);
$this->response('success',Code::SUCCESS,$data);
}
}
... ...
<?php
/**
* @remark :
* @name :CheckLogController.php
* @author :lyh
* @method :post
* @time :2025/4/17 10:07
*/
namespace App\Http\Controllers\Aside\Optimize;
use App\Enums\Common\Code;
use App\Http\Controllers\Aside\BaseController;
use App\Models\Project\OptimizeCheckLog;
use Illuminate\Http\Request;
/**
* @remark :检查日志
* @name :CheckLogController
* @author :lyh
* @method :post
* @time :2025/4/17 10:15
*/
class CheckLogController extends BaseController
{
public function __construct(Request $request)
{
parent::__construct($request);
$this->model = new OptimizeCheckLog();
}
/**
* @remark :检查日志列表
* @name :lists
* @author :lyh
* @method :post
* @time :2025/4/17 10:17
*/
public function lists(){
$this->request->validate([
'project_id'=>'required',
],[
'project_id.required' => 'project_id不能为空',
]);
$field = ['id','check_id','date','status','images','result','created_at'];
$this->map['status'] = 1;
$lists = $this->model->lists($this->map,$this->page,$this->row,'id',$field);
$this->response('success',Code::SUCCESS,$lists);
}
/**
* @remark :获取数据详情
* @name :info
* @author :lyh
* @method :post
* @time :2025/4/17 16:18
*/
public function info(){
$this->request->validate([
'id'=>'required',
],[
'id.required' => '主键不能为空',
]);
$data = $this->model->read($this->map);
$this->response('success',Code::SUCCESS,$data);
}
/**
* @remark :保存数据
* @name :save
* @author :lyh
* @method :post
* @time :2025/4/17 10:27
*/
public function save(){
$this->request->validate([
'project_id'=>'required', 'check_id'=>'required',
'date'=>'required', 'result'=>'required',
],[
'project_id.required' => 'project_id不能为空', 'check_id.required' => '问题id不能为空',
'date.required' => '时间不能为空', 'result.required' => '检查结果不能为空',
]);
$this->param = $this->model->saveHandleParam($this->param,$this->manage['id']);
if(isset($this->param['id']) && !empty($this->param['id'])){
$id = $this->param['id'];
$this->model->edit($this->param,['id'=>$this->param['id']]);
}else{
$id = $this->model->addReturnId($this->param);
}
$this->response('success',Code::SUCCESS,['id'=>$id]);
}
/**
* @remark :修改状态
* @name :status
* @author :lyh
* @method :post
* @time :2025/4/17 10:43
*/
public function status(){
$this->request->validate([
'id'=>'required',
'status'=>'required',
],[
'id.required' => '主键不能为空',
'status.required' => 'status不能为空',
]);
$data = $this->model->edit(['status'=>$this->param['status']],['id'=>$this->param['id']]);
$this->response('success',Code::SUCCESS,$data);
}
/**
* @remark :删除数据
* @name :del
* @author :lyh
* @method :post
* @time :2025/4/17 10:52
*/
public function del(){
$this->request->validate([
'id'=>'required',
],[
'id.required' => '主键不能为空',
]);
if(!is_array($this->param['id'])){
$this->param['id'] = ['in',[$this->param['id']]];
}
$data = $this->model->del($this->map);
$this->response('success',Code::SUCCESS,$data);
}
}
... ...
... ... @@ -29,7 +29,7 @@ class PackDirController extends BaseController
$serverModel = new Servers();
$domainModel = new DomainInfo();
foreach ($lists['list'] as $k => $v) {
$lists['list'][$k]['operator_name'] = $manageModel->getName($v['user_id']);
$lists['list'][$k]['operator_name'] = $v['user_id'] ? $manageModel->getName($v['user_id']) : '系统';
$lists['list'][$k]['project_name'] = $projectModel->getProjectName($v['project_id']);
$download_url = '';
... ...
... ... @@ -82,12 +82,8 @@ class CustomModuleContentController extends BaseController
* @time :2024/1/31 15:48
*/
public function getHandleImageFile($v){
if(!empty($v['image'])){
$v['image_link'] = getImageUrl($v['image'],$this->user['storage_type'] ?? 0,$this->user['project_location']);
}
if(!empty($v['og_image'])){
$v['og_image'] = getImageUrl($v['og_image'],$this->user['storage_type'] ?? 0,$this->user['project_location']);
}
$v['image_link'] = getImageUrl($v['image'] ?? '',$this->user['storage_type'] ?? 0,$this->user['project_location']);
$v['og_image'] = getImageUrl(empty($v['og_image']) ? $v['image'] : $v['og_image'],$this->user['storage_type'],$this->user['project_location']);
if(!empty($v['video'])){
$v['video']['url'] = getFileUrl($v['video']['url'],$this->user['storage_type'] ?? 0,$this->user['project_location'],$this->user['file_cdn'] ?? 0);
$v['video']['video_image'] = getImageUrl($v['video']['video_image'],$this->user['storage_type'] ?? 0,$this->user['project_location']);
... ...
... ... @@ -295,4 +295,21 @@ class KeywordController extends BaseController
$logic->delAllKeyword();
$this->response('success');
}
/**
* @remark :删除关键词所有关联产品
* @name :delRelatedProductId
* @author :lyh
* @method :post
* @time :2025/4/17 11:01
*/
public function delRelatedProductId(KeywordLogic $logic){
$this->request->validate([
'keyword_id'=>'required',
],[
'keyword_id.required' => '关键词ID不能为空',
]);
$logic->delAllRelated($this->param['keyword_id']);
$this->response('success');
}
}
... ...
... ... @@ -826,4 +826,5 @@ class ProductController extends BaseController
}
return $keyword_name;
}
}
... ...
... ... @@ -1025,7 +1025,7 @@ class ProjectLogic extends BaseLogic
public function saveOtherProject(){
//获取当前数据详情
$projectInfo = $this->getProjectInfo($this->param['id']);
if(($projectInfo['created_at'] >= '2014-12-01 00:00:00')){//12月1号过后默认不开启
if(($projectInfo['created_at'] >= '2024-12-01 00:00:00')){//12月1号过后默认不开启
$this->param['aicc'] = Project::TYPE_ZERO;
}
if($this->param['aicc'] == Project::TYPE_ONE && !empty($this->param['exclusive_aicc_day'])){
... ...
... ... @@ -100,7 +100,7 @@ class BlogLogic extends BaseLogic
$blogLabelLogic = new BlogLabelLogic();
$info['label_name'] = $blogLabelLogic->getLabelName($info['label_id']);
$info['image_link'] = getImageUrl($info['image'],$this->user['storage_type'],$this->user['project_location']);
$info['og_image'] = getImageUrl($info['og_image'],$this->user['storage_type'],$this->user['project_location']);
$info['og_image'] = getImageUrl(empty($info['og_image']) ? $info['image'] : $info['og_image'],$this->user['storage_type'],$this->user['project_location']);
return $this->success($info);
}
... ...
... ... @@ -147,6 +147,7 @@ class NewsLogic extends BaseLogic
}
$info['category_id'] = explode(',',trim($info['category_id'],','));
$info['image_link'] = getImageUrl($info['image'],$this->user['storage_type'],$this->user['project_location']);
$info['og_image'] = getImageUrl(empty($info['og_image']) ? $info['image'] : $info['og_image'],$this->user['storage_type'],$this->user['project_location']);
return $this->success($info);
}
... ...
... ... @@ -298,6 +298,23 @@ class KeywordLogic extends BaseLogic
}
/**
* @remark :对应删除关联关系
* @name :delRelated
* @author :lyh
* @method :post
* @time :2024/11/28 9:46
*/
public function delAllRelated($keyword_id){
$productModel = new Product();
$productModel->update(['keyword_id' => DB::raw("REPLACE(keyword_id, ',$keyword_id,' , ',')"),'keyword_video_id' => DB::raw("REPLACE(keyword_video_id, ',$keyword_id,' , ',')")]);
$productModel->where('keyword_id',',')->orWhere('keyword_video_id',',')
->update(['keyword_id' => DB::raw("REPLACE(keyword_id, ',' , '')"),'keyword_video_id' => DB::raw("REPLACE(keyword_video_id, ',' , '')")]);
$keywordRelatedModel = new KeywordRelated();
$keywordRelatedModel->del(['keyword_id'=>$keyword_id]);
return $this->success();
}
/**
* @remark :删除所有的关键字
* @name :delAllKeyword
* @author :lyh
... ...
... ... @@ -51,7 +51,6 @@ class RankDataLogic extends BaseLogic
}else{
$api_no = $project['deploy_optimize']['api_no'] ?? 0;
}
$domain_info = (new DomainInfoLogic)->getDomainInfo($project_id);
$rank = RankData::where('project_id', $project_id)->where('api_no', $api_no)->first();
if(empty($rank) && ($project['deploy_optimize']['api_no'] != 0)){
... ...
... ... @@ -23,6 +23,7 @@ class AutoPullNotify extends Base
8 => '香港服务器',
17 => '解析IP专用服务器',
22 => '白帽专属服务器01',
24 => '白帽专属服务器02',
23 => '西班牙服务器',
];
}
... ...
... ... @@ -11,6 +11,13 @@ namespace App\Models\Project;
use App\Models\Base;
/**
* @remark :售后数据统计
* @name :After
* @author :lyh
* @method :post
* @time :2025/4/17 9:26
*/
class After extends Base
{
protected $table = 'gl_project_after';
... ...
<?php
/**
* @remark :
* @name :OptimizeCheckList.php
* @author :lyh
* @method :post
* @time :2025/4/17 9:27
*/
namespace App\Models\Project;
use App\Models\Base;
/**
* @remark :优化检查清单
* @name :OptimizeCheckList
* @author :lyh
* @method :post
* @time :2025/4/17 9:27
*/
class OptimizeCheckList extends Base
{
protected $table = 'gl_optimize_check_list';
}
... ...
<?php
/**
* @remark :
* @name :OptimizeCheckList.php
* @author :lyh
* @method :post
* @time :2025/4/17 9:27
*/
namespace App\Models\Project;
use App\Helper\Arr;
use App\Models\Base;
/**
* @remark :优化检查日志
* @name :OptimizeCheckList
* @author :lyh
* @method :post
* @time :2025/4/17 9:27
*/
class OptimizeCheckLog extends Base
{
protected $table = 'gl_optimize_check_log';
/**
* @remark :获取器图片数据
* @name :getImagesAttribute
* @author :lyh
* @method :post
* @time :2025/4/17 10:26
*/
public function getImagesAttribute($value){
return Arr::s2a($value);
}
/**
* @remark :保存数据设置参数
* @name :handleParam
* @author :lyh
* @method :post
* @time :2025/4/17 10:35
*/
public function saveHandleParam($param,$manage_id){
if(isset($param['images'])){
$param['images'] = Arr::a2s($param['images'] ?? []);
}
$this->param['operator_id'] = $manage_id;
$this->param['date'] = date('Y-m-d hH:i:s');
return $param;
}
}
... ...
... ... @@ -23,14 +23,14 @@ class DingService
/**
* @remark :钉钉发送错误信息
* @name :handle
* @author :lyh
* @method :post
* @time :2025/3/19 18:03
* 钉钉发送错误信息
* @param array $body
* @param string $link
* @return int
*/
public function handle(array $body)
public function handle(array $body, $link = '')
{
$link = $link ?: self::LINK;
$msgKey = mb_substr($body['msg'], 50);
if (!$this->getData(RedisKey::DING_MSG . $msgKey)) {
$arr = [
... ... @@ -44,7 +44,7 @@ class DingService
'isAtAll' => $body['isAtAll'],
]
];
$re = json_decode(HttpUtils::post(self::LINK, $arr), true);
$re = json_decode(HttpUtils::post($link, $arr), true);
$this->setData(RedisKey::DING_MSG . $msgKey, true, 60);
return $re['errcode'] ?? 0;
}
... ...
... ... @@ -306,6 +306,22 @@ Route::middleware(['aloginauth'])->group(function () {
Route::any('/getAnchorLink', [Aside\Optimize\OptimizeController::class, 'getAnchorLink'])->name('admin.optimize_getAnchorLink');//设置robots开关
Route::any('/getAfterCount', [Aside\Optimize\AfterCountController::class, 'getAfterCount'])->name('admin.optimize_getAfterCount');//售后统计数据
Route::any('/getAfterCountInfo', [Aside\Optimize\AfterCountController::class, 'getAfterCountInfo'])->name('admin.optimize_getAfterCountInfo');//售后统计数据详情
//检查列表
Route::prefix('check_list')->group(function () {
Route::any('/', [Aside\Optimize\CheckListController::class, 'lists'])->name('admin.check_list');
Route::any('/info', [Aside\Optimize\CheckListController::class, 'info'])->name('admin.check_list_info');
Route::any('/save', [Aside\Optimize\CheckListController::class, 'save'])->name('admin.check_list_save');
Route::any('/del', [Aside\Optimize\CheckListController::class, 'del'])->name('admin.check_list_del');
});
//检查记录
Route::prefix('check_log')->group(function () {
Route::any('/', [Aside\Optimize\CheckLogController::class, 'lists'])->name('admin.check_log');
Route::any('/info', [Aside\Optimize\CheckLogController::class, 'info'])->name('admin.check_log_info');
Route::any('/save', [Aside\Optimize\CheckLogController::class, 'save'])->name('admin.check_log_save');
Route::any('/del', [Aside\Optimize\CheckLogController::class, 'del'])->name('admin.check_log_del');
});
});
//生成关键字
Route::prefix('create_keyword')->group(function () {
... ... @@ -551,6 +567,7 @@ Route::middleware(['aloginauth'])->group(function () {
Route::any('/save', [Aside\Project\AggregateKeywordController::class, 'save'])->name('admin.aggregateKeyword_save');
Route::any('/del', [Aside\Project\AggregateKeywordController::class, 'del'])->name('admin.aggregateKeyword_del');
});
});
//无需登录验证的路由组
... ...
... ... @@ -283,6 +283,7 @@ Route::middleware(['bloginauth'])->group(function () {
Route::any('/delProductType', [\App\Http\Controllers\Bside\Product\ProductController::class, 'delProductType'])->name('product_delProductType');
Route::any('/getButton', [\App\Http\Controllers\Bside\Product\ProductController::class, 'getButton'])->name('product_getButton');
Route::any('/batchSetKeyword', [\App\Http\Controllers\Bside\Product\ProductController::class, 'batchSetKeyword'])->name('product_batchSetKeyword');
//产品分类batchSetKeyword
Route::get('category', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'index'])->name('product_category');
Route::get('category/info', [\App\Http\Controllers\Bside\Product\CategoryController::class, 'info'])->name('product_category_info');
... ... @@ -304,6 +305,7 @@ Route::middleware(['bloginauth'])->group(function () {
Route::any('keyword/batchUpdateKeyword', [\App\Http\Controllers\Bside\Product\KeywordController::class, 'batchUpdateKeyword'])->name('product_keyword_batchUpdateKeyword');
Route::any('keyword/batchKeywordIsVideo', [\App\Http\Controllers\Bside\Product\KeywordController::class, 'batchKeywordIsVideo'])->name('product_keyword_batchKeywordIsVideo');
Route::any('keyword/batchKeywordFiled', [\App\Http\Controllers\Bside\Product\KeywordController::class, 'batchKeywordFiled'])->name('product_keyword_batchKeywordFiled');
Route::any('keyword/delRelatedProductId', [\App\Http\Controllers\Bside\Product\KeywordController::class, 'delRelatedProductId'])->name('product_keyword_delRelatedProductId');
//产品参数
Route::get('attr', [\App\Http\Controllers\Bside\Product\AttrController::class, 'index'])->name('product_attr');
Route::get('attr/info', [\App\Http\Controllers\Bside\Product\AttrController::class, 'info'])->name('product_attr_info');
... ...