作者 张关杰

Merge branch 'develop' of http://47.244.231.31:8099/zhl/globalso-v6 into bate

... ... @@ -33,8 +33,9 @@ class UpgradeProjectCount extends Command
protected $description = '升级项目统计';
public function handle(){
ProjectServer::useProject(439);
$this->count();
$project_id = 555;
ProjectServer::useProject($project_id);
$this->count($project_id);
DB::disconnect('custom_mysql');
}
... ... @@ -45,18 +46,18 @@ class UpgradeProjectCount extends Command
* @method :post
* @time :2024/1/8 9:05
*/
public function count(){
public function count($project_id){
$list = DB::connection('custom_mysql')->table('gl_customer_visit')->select('updated_date')
->groupBy('updated_date')->get()->toArray();
$project = new Project();
$projectInfo = $project->read(['id'=>439]);
$projectInfo = $project->read(['id'=>$project_id]);
if(!empty($list)){
$arr = [];
foreach ($list as $k=>$v){
$v = (array)$v;
echo date('Y-m-d H:i:s') . '时间:'.$v['updated_date'] . PHP_EOL;
$count = new Count();
$arr['project_id'] = 439;
$arr['project_id'] = $project_id;
$arr['date'] = $v['updated_date'];
$arr['pv_num'] = $this->pv_num($v['updated_date']);
$arr['ip_num'] = $this->ip_num($v['updated_date']);
... ... @@ -65,9 +66,9 @@ class UpgradeProjectCount extends Command
$arr['compliance_day'] = $projectInfo['finish_remain_day'];
//剩余服务时常
$arr['service_day'] = $projectInfo['remain_day'];
$arr['country'] = '{"也门": 4, "印度": 3, "埃及": 4, "巴西": 1, "约旦": 2, "美国": 3, "伊拉克": 4, "利比亚": 2, "墨西哥": 5, "摩洛哥": 8, "新加坡": 1, "突尼斯": 3, "巴勒斯坦": 2, "巴基斯坦": 1, "罗马尼亚": 1, "非洲地区": 2, "马来西亚": 5, "印度尼西亚": 2, "沙特阿拉伯": 3, "阿尔及利亚": 2}';
$arr['country'] = json_encode([]);
//查询当天数据是否存在 存在则更新
$info = $count->read(['date'=>$v['updated_date']]);
$info = $count->read(['date'=>$v['updated_date'],'project_id'=>$project_id]);
if($info === false){
$arr['created_at'] = $v['updated_date'].' 01:00:00';
$arr['updated_at'] = $v['updated_date'].' 01:00:00';
... ...
... ... @@ -2,21 +2,17 @@
namespace App\Console\Commands;
use App\Http\Logic\Aside\Project\ProjectLogic;
use App\Models\Com\NoticeLog;
use App\Models\Product\Keyword;
use App\Models\Project\Project;
use App\Models\RouteMap\RouteMap;
use App\Services\ProjectServer;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redis;
/**
* 初始化项目
* Class InitProject
* Class InitKeyword
* @package App\Console\Commands
* @author zbj
* @date 2023/10/8
*/
class InitKeyword extends Command
{
... ... @@ -50,29 +46,79 @@ class InitKeyword extends Command
public function handle()
{
while (true){
$list = NoticeLog::where('type', NoticeLog::TYPE_INIT_KEYWORD)->where('status', NoticeLog::STATUS_PENDING)->get();
if(!empty($list)){
foreach ($list as $item){
echo 'start:' . $item['data']['project_id'] . PHP_EOL;
ProjectServer::useProject($item['data']['project_id']);
$keywordModel = new Keyword();
$list = $keywordModel->list(['route'=>'']);
echo 'start:' . json_encode($list) . PHP_EOL;
foreach ($list as $v){
$route = RouteMap::setRoute($v['title'],RouteMap::SOURCE_PRODUCT_KEYWORD,$v['id'],$item['data']['project_id']);
if(empty($route)){
$keywordModel->del(['id'=>$v['id']]);
continue;
}
$keywordModel->edit(['route'=>$route],['id'=>$v['id']]);
}
$item->status = NoticeLog::STATUS_SUCCESS;
$item->save();
DB::disconnect('custom_mysql');
}
$notice_id = $this->getTask();
if (empty($notice_id)) {
sleep(30);
continue;
}
try {
$this->output(' taskID: ' . $notice_id . ' start');
$this->bind($notice_id);
$this->output(' taskID: ' . $notice_id . ' end');
} catch (\Exception $e) {
$this->output(' taskID: ' . $notice_id . ', error: ' . $e->getMessage());
}
sleep(2);
}
return true;
}
/**
* 处理子任务
* @param $notice_id
* @return bool
* @throws \Exception
*/
public function bind($notice_id)
{
$notice = NoticeLog::where(['id' => $notice_id])->first();
if (empty($notice) || $notice->type != NoticeLog::TYPE_INIT_KEYWORD || $notice->status != NoticeLog::STATUS_PENDING){
return true;
}
ProjectServer::useProject($notice['data']['project_id']);
$keyword = Keyword::whereNull('route')->get();
foreach ($keyword as $val) {
$this->output(' keywordID: ' . $val->id . ', title: ' . $val->title);
try {
$route = RouteMap::setRoute($val['title'],RouteMap::SOURCE_PRODUCT_KEYWORD, $val->id, $notice['data']['project_id']);
$val->route = $route;
$val->save();
} catch (\Exception $e) {
$this->output(' keywordID: ' . $val->id . ', title: ' . $val->title . ', error: ' . $e->getMessage());
}
}
$notice->status = NoticeLog::STATUS_SUCCESS;
$notice->save();
DB::disconnect('custom_mysql');
return true;
}
/**
* 获取需要处理的任务
* @return mixed
*/
public function getTask()
{
$key = 'notice_log_type_keyword';
$notice_id = Redis::rpop($key);
if ($notice_id){
return $notice_id;
}
$ids = NoticeLog::where('type', NoticeLog::TYPE_INIT_KEYWORD)->where('status', NoticeLog::STATUS_PENDING)->limit(100)->pluck('id');
foreach ($ids as $id) {
Redis::lpush($key, $id);
}
$notice_id = Redis::rpop($key);
return $notice_id;
}
/**
* 输出message
* @param $message
*/
public function output($message)
{
echo date('Y-m-d H:i:s') . ' ' . $message . PHP_EOL;
}
}
... ...
... ... @@ -35,8 +35,10 @@ class UpgradeProjectCount extends Command
protected $description = '升级项目统计';
public function handle(){
ProjectServer::useProject(439);
$this->count();
$project_id = 555;
$url = 'www.sincoherenaesthetics.com';
ProjectServer::useProject($project_id);
$this->count($project_id,$url);
DB::disconnect('custom_mysql');
}
... ... @@ -48,35 +50,36 @@ class UpgradeProjectCount extends Command
* @method :post
* @time :2024/1/8 9:05
*/
public function count(){
public function count($project_id,$url){
$list = DB::connection('custom_mysql')->table('gl_customer_visit')
->select(DB::raw('DATE_FORMAT(updated_date, "%Y-%m") as month'))
->groupBy('month')->get()->toArray();
foreach ($list as $k=>$v){
$v = (array)$v;
$monthCountModel = new MonthCount();
$info = $monthCountModel->read(['month'=>$v['month']]);
$info = $monthCountModel->read(['month'=>$v['month'],'project_id'=>$project_id]);
// 获取当月开始时间
$start = date('Y-m-01', strtotime($v['month']));
// 获取当月结束时间
$end = date('Y-m-t', strtotime($v['month']));
$arr['project_id'] = 439;
$res = $this->inquiry('www.cnzyl.com',$v['month']);
$arr['project_id'] = $project_id;
$res = $this->inquiry($url,$v['month']);
$arr['month_total'] = 0;
if(isset($res['data']['count'])){
$arr['month_total'] = $res['data']['count'];
}
if(isset($res['data']['data'])){
$arr['country'] = $res['data']['data'];
$arr['country'] = json_encode($res['data']['data']);
}
$arr['month'] = $v['month'];
$arr = $this->pv_ip($arr,$start,$end);
$arr = $this->pv_ip($arr,$start,$end,$project_id);
$arr = $this->sourceCount($arr,$start,$end);
if($info === false){
$selectedDate = $start;
$firstDayOfNextMonth = date('Y-m-01 01:00:00', strtotime("$selectedDate +1 month"));
$arr['created_at'] = $firstDayOfNextMonth;
$arr['updated_at'] = $firstDayOfNextMonth;
// echo date('Y-m-d H:i:s') . '数据:'.json_encode($arr) . PHP_EOL;
$monthCountModel->insert($arr);
}else{
$monthCountModel->edit($arr,['id'=>$info['id']]);
... ... @@ -92,9 +95,9 @@ class UpgradeProjectCount extends Command
* @method :post
* @time :2024/1/8 11:02
*/
public function pv_ip(&$arr,$start,$end){
public function pv_ip(&$arr,$start,$end,$project_id){
$pv_ip = DB::table('gl_count')
->where(['project_id'=>439])
->where(['project_id'=>$project_id])
->where('date','>=',$start.' 00:00:00')
->where('date','<=',$end.' 23:59:59')
->select(DB::raw('SUM(pv_num) as pv_num'), DB::raw('SUM(ip_num) as ip_num'),DB::raw('SUM(inquiry_num) as inquiry_num'))
... ...
... ... @@ -3,14 +3,17 @@
namespace App\Console\Commands;
use App\Helper\Arr;
use App\Models\Product\Category;
use App\Models\Product\Product;
use App\Models\Domain\DomainInfo;
use App\Models\Project\DeployOptimize;
use App\Models\Project\Project;
use App\Models\RouteMap\RouteMap;
use App\Services\ProjectServer;
use Carbon\Carbon;
use GuzzleHttp\Client;
use GuzzleHttp\Promise\Utils;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
/**
... ... @@ -143,60 +146,71 @@ class WebTraffic extends Command
*/
public function handle()
{
$type = $this->argument('type');
try {
$type = $this->argument('type');
$this->sleep($type);
$this->sleep($type);
$project_list = $this->getProjectList($type);
$project_chunk = array_chunk($project_list,500,true);
foreach ($project_chunk as $chunk) {
$need_project = [];
foreach ($chunk as $project) {
//随机引流间隔
$res_sjjg = $this->get_rand($this->sjjg);
if ($res_sjjg == 1) {
continue;
$page = 1;
while (true){
$project_list = $this->getProjectList($type, $page);
if(!$project_list){
break;
}
$need_project = [];
foreach ($project_list as $project) {
//随机引流间隔
$res_sjjg = $this->get_rand($this->sjjg);
if ($res_sjjg == 1) {
continue;
}
$project_urls = $this->getProductUrls($project['project_id']);
$project_urls['home'] = $project['domain'];
//随机访问页面
$project['visit_urls'] = $this->getVisitUrls($project_urls);
//随机客户端
$project['device_port'] = $this->get_rand($this->yddzb);
$project['user_agent'] = $project['device_port'] == 1 ? Arr::random($this->pc_ua) : Arr::random($this->mobile_ua);
$project_urls = $this->getProductUrls($project['project_id']);
$project_urls['home'] = $project['domain'];
//随机访问页面
$project['visit_urls'] = $this->getVisitUrls($project_urls);
//随机客户端
$project['device_port'] = $this->get_rand($this->yddzb);
$project['user_agent'] = $project['device_port'] == 1 ? Arr::random($this->pc_ua) : Arr::random($this->mobile_ua);
$need_project[] = $project;
}
//随机访问ip
$ips = $this->getIpAreas(count($need_project));
//最多10层深度
$client = new Client(['verify' => false]);
for ($j = 0; $j < 10; $j++) {
$need_project[] = $project;
}
//随机访问ip
$ips = $this->getIpAreas(count($need_project));
//最多10层深度
$client = new Client(['verify' => false]);
for ($j = 0; $j < 10; $j++) {
//并发请求
$promises = [];
foreach ($need_project as $project_key => $project) {
if (empty($project['visit_urls'][$j])) {
continue;
for ($j = 0; $j < 10; $j++) {
//并发请求
$promises = [];
foreach ($need_project as $project_key => $project) {
if (empty($project['visit_urls'][$j])) {
continue;
}
$data = [
'ip' => $ips[$project_key]['ip'],
'referrer_url' => $this->getReferer($ips[$project_key]['ip_area']),
'url' => $project['visit_urls'][$j],
'device_port' => $project['device_port'],
'domain' => $project['domain'],
];
Log::channel('traffic')->info('traffic project_id:' . $project['project_id'], $data);
$promises[] = $client->postAsync($project['domain'] . 'api/customerVisit', ['form_params' => $data]);
}
$data = [
'ip' => $ips[$project_key]['ip'],
'referer' => $this->getReferer($ips[$project_key]['ip_area']),
'url' => $project['visit_urls'][$j],
'device_port' => $this->get_rand($this->yddzb)
];
$promises[] = $client->postAsync($project['domain'] . 'api/customerVisit', ['form_params' => $data]);
if($promises){
Utils::settle($promises)->wait();
//每个深度随机等待
sleep(rand(2, 10));
}
}
Utils::settle($promises)->wait();
//每个深度随机等待
sleep(rand(2, 10));
}
$page++;
}
}catch (\Exception $e){
Log::channel('traffic')->error($e->getMessage());
}
}
... ... @@ -216,35 +230,76 @@ class WebTraffic extends Command
/**
* 引流的项目
*/
protected function getProjectList($type){
//todo 根据type获取需要引流的项目
return [
[
'project_id' => 1,
'domain' => 'https://demomark.globalso.com/',
]
];
protected function getProjectList($type, $page){
//推广项目
$list = Project::with('domainInfo')
->leftJoin('gl_project_deploy_optimize', 'gl_project_deploy_optimize.project_id', '=', 'gl_project.id')
->where('gl_project_deploy_optimize.domain', '>', 0)
->whereIn('gl_project.type', [Project::TYPE_TWO, Project::TYPE_FOUR])
->whereIn('gl_project_deploy_optimize.project_id', [6,25]) //todo 测试两个项目 后面删掉
->where(function ($query) use ($type){
if($type == 1){
//1-3个月项目
$startTime = Carbon::now()->addMonths(-4)->toDateString();
$endTime = Carbon::now()->addMonths(-1)->toDateString();
$query->whereBetween('gl_project_deploy_optimize.start_date', [$startTime,$endTime]);
}elseif($type == 2){
//4-8个月项目
$startTime = Carbon::now()->addMonths(-9)->startOfDay()->toDateTimeString();
$endTime = Carbon::now()->addMonths(-4)->endOfDay()->toDateTimeString();
$query->whereBetween('gl_project_deploy_optimize.start_date', [$startTime,$endTime]);
}else{
//大于9个月项目
$startTime = Carbon::now()->addMonths(-9)->startOfDay()->toDateTimeString();
$query->whereBetween('gl_project_deploy_optimize.start_date', '<', $startTime);
}
})->select('gl_project_deploy_optimize.project_id')->forPage($page, 500)->get();
//其他地方在引流的域名
$other = DB::connection('projects_mysql')->table('projects')->where('switch', 1)->pluck('domain')->toArray();
$data = [];
foreach ($list as $project) {
//其他地方在引流就不再引流了
if(in_array($project->domainInfo['domain'], $other)){
continue;
}
$data[] = [
'project_id' => $project['project_id'],
'domain' => 'https://' . $project->domainInfo['domain'] . '/',
];
}
return $data;
}
/**
* 获取产品分类、单页和详情链接
*/
protected function getProductUrls($project_id){
//产品分类页面
ProjectServer::useProject($project_id);
//产品分类页面
$product_cate_ids = DB::connection('custom_mysql')->table('gl_product_category')
->where('project_id', $project_id)->where('status', 1)->pluck('id')->toArray();
//只查发布的分类路由
$data['urls_cats'] = DB::connection('custom_mysql')->table('gl_route_map')
->where('project_id', $project_id)->where('source', 'product_category')->whereIn('source_id', $product_cate_ids)->get()->toArray();
->where('project_id', $project_id)->where('source', RouteMap::SOURCE_PRODUCT_CATE)
->whereIn('source_id', $product_cate_ids)->get()->toArray();
//单页面
//todo 发布状态的单页面id
$page_ids = DB::connection('custom_mysql')->table('gl_web_custom_template')
->where('project_id', $project_id)->where('status', 1)->pluck('id')->toArray();
//只查发布的单页面
$data['urls_page'] = DB::connection('custom_mysql')->table('gl_route_map')
->where('project_id', $project_id)->where('source', 'page')->get()->toArray();
->where('project_id', $project_id)->where('source', RouteMap::SOURCE_PAGE)
->whereIn('source_id', $page_ids)->get()->toArray();
//产品详情页
$product_ids = DB::connection('custom_mysql')->table('gl_product_category')
$product_ids = DB::connection('custom_mysql')->table('gl_product')
->where('project_id', $project_id)->where('status', 1)->pluck('id')->toArray();
$data['urls_details'] = DB::connection('custom_mysql')->table('gl_route_map')
->where('project_id', $project_id)->where('source', 'product')->whereIn('source_id', $product_ids)->get()->toArray();
->where('project_id', $project_id)->where('source', RouteMap::SOURCE_PRODUCT)
->whereIn('source_id', $product_ids)->get()->toArray();
$data['urls_cats'] = array_merge($data['urls_cats'], $data['urls_page']);
if(empty($data['urls_cats'])){
... ...
... ... @@ -26,9 +26,9 @@ class Kernel extends ConsoleKernel
$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('web_traffic 1')->everyThirtyMinutes(); // 引流 1-3个月的项目,半小时一次
$schedule->command('web_traffic 2')->cron('*/18 * * * *'); // 引流 4-8个月的项目,18分钟一次
$schedule->command('web_traffic 3')->cron('*/12 * * * *'); // 引流 大于9个月的项目,12分钟一次
// $schedule->command('web_traffic 1')->everyThirtyMinutes(); // 引流 1-3个月的项目,半小时一次
// $schedule->command('web_traffic 2')->cron('*/18 * * * *'); // 引流 4-8个月的项目,18分钟一次
// $schedule->command('web_traffic 3')->cron('*/12 * * * *'); // 引流 大于9个月的项目,12分钟一次
$schedule->command('sync_channel')->dailyAt('06:00')->withoutOverlapping(1); // 渠道信息,每天执行一次
$schedule->command('month_count')->monthlyOn(1,'01:00')->withoutOverlapping(1);//没月月初1号执行月统计记录
$schedule->command('forward_count')->monthlyOn(1,'01:00')->withoutOverlapping(1);//没月月初1号执行月统计转发询盘记录
... ...
... ... @@ -7,8 +7,13 @@
*/
namespace App\Http\Controllers\Api;
use App\Models\Domain\DomainInfo;
use App\Models\Product\Category;
use App\Models\Product\Product;
use App\Models\Project\OnlineCheck;
use App\Models\Project\Project;
use App\Models\RouteMap\RouteMap;
use App\Services\ProjectServer;
use Illuminate\Http\Request;
/**
... ... @@ -35,4 +40,60 @@ class PrivateController extends BaseController
->toArray();
return $this->success($result);
}
/**
* 获取项目链接
* FIXME 当前直接获取的产品和产品分类, 后期需要封装到内部, 需要添加完整的链接规则
* @param Request $request
* @return false|string
*/
public function getProjectRoute(Request $request)
{
$project_id = intval($request->input('project_id'));
// $type = $request->input('type');
$type = [RouteMap::SOURCE_PRODUCT, RouteMap::SOURCE_PRODUCT_CATE];
$project = Project::where(['id' => $project_id])->first();
if (empty($project))
return $this->error('未发现需要查找的项目!');
$project = ProjectServer::useProject($project_id);
$domain = DomainInfo::where(['project_id' => $project_id])->first();
$host = FALSE == empty($domain) ? 'https://' . $domain->domain . '/' : $project->deploy_build->test_domain;
// 需要标题, 不能直接查询map表
// $list = RouteMap::where(['project_id' => $project_id])
// ->when($type, function ($query) use ($type) {
// return $query->whereIn('source', $type);
// })
// ->get();
//
// $result = [];
// foreach ($list as $val) {
// // 排除首页
// if ($val->source == RouteMap::SOURCE_PAGE && in_array($val->route, ['index', '']))
// continue;
// $result[$val->source][] = $host . $val->route;
// }
$result = [];
$product = Product::where(['status' => Product::STATUS_ON])->get(['title', 'route'])->toArray();
foreach ($product as $val) {
$val['route'] = $host . $val['route'];
// FALSE == preg_match('/(\.html|\.htm)$/', $val['route'])
if (FALSE === strpos($val['route'], '.htm')) {
$val['route'] .= '/';
}
$result[RouteMap::SOURCE_PRODUCT][] = $val;
}
$product_category= Category::get(['title', 'route'])->toArray();
foreach ($product_category as $val) {
$val['route'] = $host . $val['route'];
if (FALSE === strpos($val['route'], '.htm')) {
$val['route'] .= '/';
}
$result[RouteMap::SOURCE_PRODUCT_CATE][] = $val;
}
return $this->success($result);
}
}
\ No newline at end of file
... ...
... ... @@ -100,11 +100,11 @@ class KeywordController extends BaseController
}
/**
* @remark :批量添加
* @name :batchAdd
* @author :lyh
* @method :post
* @time :2023/8/28 14:25
* 批量添加关键词
* FIXME 添加通知, 异步处理任务
* @param KeywordLogic $logic
* @throws \App\Exceptions\AsideGlobalException
* @throws \App\Exceptions\BsideGlobalException
*/
public function batchAdd(KeywordLogic $logic){
$this->request->validate([
... ... @@ -115,7 +115,7 @@ class KeywordController extends BaseController
'title.max' => '批量操作不能超过1000条数据'
]);
$logic->batchAdd();
$this->response('路由生成中,请稍后刷新查看');
$this->response('关键词后台异步添加中,请稍后刷新查看!');
}
/**
... ...
... ... @@ -130,11 +130,10 @@ class KeywordLogic extends BaseLogic
}
/**
* @remark :批量添加数据
* @name :batchAdd
* @author :lyh
* @method :post
* @time :2023/8/28 14:03
* 批量添加关键词任务, 异步处理
* @return array
* @throws BsideGlobalException
* @throws \App\Exceptions\AsideGlobalException
*/
public function batchAdd(){
try {
... ... @@ -154,7 +153,7 @@ class KeywordLogic extends BaseLogic
}
NoticeLog::createLog(NoticeLog::TYPE_INIT_KEYWORD, ['project_id' => $this->user['project_id']]);
}catch (\Exception $e){
$this->fail('error');
$this->fail('创建任务添加关键词任务失败,请稍后重试!');
}
return $this->success();
}
... ...
... ... @@ -275,6 +275,15 @@ class ProductLogic extends BaseLogic
$param['gallery'] = Arr::a2s([]);
$param['thumb'] = Arr::a2s([]);
}
if(isset($param['video']) && !empty($param['video'])){
foreach ($param['video'] as $k => $v){
$v = str_replace_url($v);
$param['video'][$k] = $v;
}
$param['video'] = Arr::a2s($param['video'] ?? []);
}else{
$param['video'] = Arr::a2s([]);
}
$param['attrs'] = Arr::a2s($param['attrs'] ?? []);
$param['attr_id'] = Arr::arrToSet($param['attr_id'] ?? '');
if(isset($param['keyword_id']) && !empty($param['keyword_id'])){
... ...
... ... @@ -22,8 +22,8 @@ class Project extends Base
const STATUS_ONE = 1;//审核通过
const TYPE_ZERO = 0;//初始导入项目
const TYPE_ONE = 1;//建站中
const TYPE_TWO = 2;//建站完成
const TYPE_THREE = 3;//建站完成(推广)
const TYPE_TWO = 2;//建站完成(推广)
const TYPE_THREE = 3;//建站完成
const TYPE_FOUR = 4;//推广续费
const TYPE_FIVE = 5;//未续费网站
const TYPE_SIX = 6;//特殊推广项目
... ... @@ -202,6 +202,16 @@ class Project extends Base
return self::hasOne(After::class, 'project_id', 'id');
}
/**
* 域名
* @return \Illuminate\Database\Eloquent\Relations\HasOne
* @author zbj
*/
public function domainInfo()
{
return self::hasOne(\App\Models\Domain\DomainInfo::class, 'project_id', 'project_id')->select('project_id', 'domain');;
}
public function setLevelAttribute($value)
{
$this->attributes['level'] = Arr::arrToSet($value);
... ...
... ... @@ -60,6 +60,12 @@ return [
'via' => \App\Factory\LogFormatterFactory::class,
'prefix' => 'bside',
],
//自定义引流日志
'traffic' => [
'driver' => 'custom',
'via' => \App\Factory\LogFormatterFactory::class,
'prefix' => 'traffic',
],
'wechatside' => [
'driver' => 'custom',
'via' => \App\Factory\LogFormatterFactory::class,
... ...
... ... @@ -19,4 +19,5 @@ Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
});
Route::any('traffic_visit', [\App\Http\Controllers\Api\NoticeController::class, 'trafficVisit'])->name('api.traffic_visit');
Route::get('optimize_project_list', [\App\Http\Controllers\Api\PrivateController::class, 'optimizeProjectList'])->name('api.optimize_project_list');
\ No newline at end of file
Route::get('optimize_project_list', [\App\Http\Controllers\Api\PrivateController::class, 'optimizeProjectList'])->name('api.optimize_project_list');
Route::get('get_project_route', [\App\Http\Controllers\Api\PrivateController::class, 'getProjectRoute'])->name('api.get_project_route');
\ No newline at end of file
... ...