作者 赵彬吉

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

... ... @@ -4,12 +4,15 @@ namespace App\Console\Commands\DayCount;
use App\Helper\Common;
use App\Helper\FormGlobalsoApi;
use App\Models\Domain\DomainInfo;
use App\Models\Project\DeployBuild;
use App\Models\Project\DeployOptimize;
use App\Models\Project\Project;
use App\Services\ProjectServer;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class Count extends Command
{
... ... @@ -28,6 +31,7 @@ class Count extends Command
* @var string
*/
protected $description = '统计昨日数据';
/**
* @name :(定时执行生成昨日数据统计)handle
* @author :lyh
... ... @@ -39,35 +43,48 @@ class Count extends Command
$list = DB::table('gl_project')->where('gl_project.extend_type','!=',5)
->leftJoin('gl_project_deploy_build', 'gl_project.id', '=', 'gl_project_deploy_build.project_id')
->leftJoin('gl_project_deploy_optimize', 'gl_project.id', '=', 'gl_project_deploy_optimize.project_id')
->select($this->selectParam())->get()->toArray();
$data = [];
$yesterday = Carbon::yesterday()->toDateString();
foreach ($list as $v){
$v = (array)$v;
if($v['domain'] != ''){
$v['test_domain'] = $v['domain'];
->select($this->selectParam())->get();
try {
if(!empty($list)){
$list = $list->toArray();
$data = [];
$yesterday = Carbon::yesterday()->toDateString();
$domainInfo = new DomainInfo();
foreach ($list as $v){
$v = (array)$v;
if(!empty($v['domain'])){
$info = $domainInfo->read(['id'=>$v['domain']]);
if($info !== false){
$v['test_domain'] = $info['domain'];
}
}
$arr = [];
//统计时间
$arr['date'] = $yesterday;
ProjectServer::useProject($v['id']);
//pv统计
$arr['pv_num'] = $this->pv_num($yesterday,$v['test_domain']);
//ip统计
$arr['ip_num'] = $this->ip_num($yesterday,$v['test_domain']);
DB::disconnect('custom_mysql');
//服务达标天数
$arr['compliance_day'] = $this->compliance_day($v['id']);
//剩余服务时常
$arr['service_day'] = ((int)$v['service_duration'] - (int)$arr['compliance_day']) > 0 ? ((int)$v['service_duration'] - (int)$arr['compliance_day']) : 0;
//项目id
$arr['project_id'] = $v['project_id'];
$arr['created_at'] = date('Y-m-d H:i:s');
$arr['updated_at'] = date('Y-m-d H:i:s');
//询盘统计
$arr = $this->inquiry($arr,$v['test_domain']);
$data[] = $arr;
}
//判断数据是否存在
DB::table('gl_count')->insert($data);
}
$arr = [];
//统计时间
$arr['date'] = $yesterday;
//pv统计
$arr['pv_num'] = $this->pv_num($yesterday,$v['test_domain']);
//ip统计
$arr['ip_num'] = $this->ip_num($yesterday,$v['test_domain']);
//服务达标天数
$arr['compliance_day'] = $this->compliance_day($v['test_domain']);
//剩余服务时常
$arr['service_day'] = ((int)$v['service_duration'] - (int)$arr['compliance_day']) > 0 ? ((int)$v['service_duration'] - (int)$arr['compliance_day']) : 0;
//项目id
$arr['project_id'] = $v['project_id'];
$arr['created_at'] = date('Y-m-d H:i:s');
$arr['updated_at'] = date('Y-m-d H:i:s');
//询盘统计
$arr = $this->inquiry($arr,$v['test_domain']);
$data[] = $arr;
}catch (\Exception $e){
Log::error('同步数据执行失败');
}
//判断数据是否存在
DB::table('gl_count')->insert($data);
echo $this->error;
}
... ... @@ -78,7 +95,7 @@ class Count extends Command
* @time :2023/6/14 15:40
*/
public function pv_num($yesterday,$domain){
$pv = DB::table('gl_customer_visit_item')->whereDate('updated_date', $yesterday)->where('domain',$domain)->count();
$pv = DB::connection('custom_mysql')->table('gl_customer_visit_item')->whereDate('updated_date', $yesterday)->where('domain',$domain)->count();
return $pv;
}
... ... @@ -89,7 +106,7 @@ class Count extends Command
* @time :2023/6/14 15:40
*/
public function ip_num($yesterday,$domain){
$ip = DB::table('gl_customer_visit')->whereDate('updated_date', $yesterday)->where('domain',$domain)->count();
$ip = DB::connection('custom_mysql')->table('gl_customer_visit')->whereDate('updated_date', $yesterday)->where('domain',$domain)->count();
return $ip;
}
... ... @@ -150,7 +167,7 @@ class Count extends Command
*/
public function selectParam(){
$select = [
'gl_project.id AS user_id',
'gl_project.id AS id',
'gl_project.extend_type AS extend_type',
'gl_project_deploy_build.test_domain AS test_domain',
'gl_project_deploy_optimize.domain AS domain',
... ...
... ... @@ -38,7 +38,7 @@ class InquiryDelay extends Command
{
$inquiryInfoModel = new InquiryInfo();
$param = $inquiryInfoModel->formatQuery(['status'=>$inquiryInfoModel::STATUS_FOUR])->orderBy('send_time','asc')->first();
if($param !== false){
if(!empty($param)){
$time = date('Y-m-d H:i:s');
if($time >= $param['send_time']){
$data = [];
... ...
... ... @@ -3,6 +3,8 @@
namespace App\Console\Commands\MonthlyCount;
use App\Helper\FormGlobalsoApi;
use App\Models\Domain\DomainInfo;
use App\Services\ProjectServer;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
... ... @@ -41,16 +43,22 @@ class InquiryMonthlyCount extends Command
$startTime = Carbon::now()->subMonth()->startOfMonth()->toDateString();
// 获取上个月的结束时间
$endTime = Carbon::now()->subMonth()->endOfMonth()->toDateString();
$domainInfo = new DomainInfo();
foreach ($list as $value){
$value = (array)$value;
if($value['domain'] != ''){
$value['test_domain'] = $value['domain'];
if(!empty($value['domain'])){
$info = $domainInfo->read(['id'=>$value['domain']]);
if($info !== false){
$value['test_domain'] = $value['domain'];
}
}
$arr = [];
//按月统计询盘记录
$arr = $this->inquiryCount($arr,$startTime,$endTime,$value['test_domain']);
$arr = $this->flowCount($arr,$startTime,$endTime,$value['project_id']);
ProjectServer::useProject($value['project_id']);
$arr = $this->sourceCount($arr,$value['test_domain'],$startTime,$endTime);
DB::disconnect('custom_mysql');
$arr['created_at'] = date('Y-m-d H:i:s');
$arr['updated_at'] = date('Y-m-d H:i:s');
$arr['project_id'] = $value['project_id'];
... ... @@ -128,21 +136,21 @@ class InquiryMonthlyCount extends Command
*/
public function sourceCount(&$arr,$domain,$startTime,$endTime){
//访问来源前10
$source = DB::table('gl_customer_visit')
$source = DB::connection('custom_mysql')->table('gl_customer_visit')
->select('referrer_url', DB::raw('COUNT(*) as count'))
->groupBy('referrer_url')->where(['domain'=>$domain])
->whereBetween('updated_date', [$startTime,$endTime])
->orderByDesc('count')->limit(10)->get()->toArray();
$arr['source'] = json_encode($source);
//访问国家前15
$source_country = DB::table('gl_customer_visit')
$source_country = DB::connection('custom_mysql')->table('gl_customer_visit')
->select('country',DB::raw('COUNT(*) as ip'),DB::raw('SUM(depth) as pv'))
->groupBy('country')->where(['domain'=>$domain])
->whereBetween('updated_date', [$startTime,$endTime])
->orderBy('ip','desc')->limit(15)->get()->toArray();
$arr['source_country'] = json_encode($source_country);
//受访界面前15
$referrer_url = DB::table('gl_customer_visit')
$referrer_url = DB::connection('custom_mysql')->table('gl_customer_visit')
->select('url',DB::raw('COUNT(*) as num'))
->orderBy('num','desc')->where(['domain'=>$domain])
->whereBetween('updated_date', [$startTime,$endTime])
... ... @@ -150,7 +158,7 @@ class InquiryMonthlyCount extends Command
->limit(15)->get()->toArray();
$arr['referrer_url'] = json_encode($referrer_url);
//访问端口
$referrer_port = DB::table('gl_customer_visit')
$referrer_port = DB::connection('custom_mysql')->table('gl_customer_visit')
->select('device_port',DB::raw('COUNT(*) as num'))
->orderBy('num','desc')->where(['domain'=>$domain])
->whereBetween('updated_date', [$startTime,$endTime])
... ... @@ -168,7 +176,7 @@ class InquiryMonthlyCount extends Command
*/
public function selectParam(){
$select = [
'gl_project.id AS user_id',
'gl_project.id AS id',
'gl_project.extend_type AS extend_type',
'gl_project_deploy_build.test_domain AS test_domain',
'gl_project_deploy_optimize.domain AS domain',
... ...
... ... @@ -46,6 +46,8 @@ class Demo extends Command
*/
public function handle()
{
$domain = parse_url('https//:dev.golbalso.site/');
dd($domain);
echo time() . PHP_EOL;
$blogModel = new Image();
$list = $blogModel->list();
... ...
... ... @@ -44,8 +44,7 @@ class TaskController extends BaseController
$map = $this->searchParam($task,$taskOwnerModel);
$manager_list = $taskOwnerModel->formatQuery($map)->select('manage_id', DB::raw('COUNT(*) as count'))
->groupBy('manage_id')->get()->toArray();
var_dump($manager_list);
die();
$managerModel = new Manage();
foreach ($manager_list as $k => $v){
$ids = $taskOwnerModel->where('manage_id', $v['manage_id'])->pluck('task_id')->toArray();
... ... @@ -76,19 +75,23 @@ class TaskController extends BaseController
$map['manage_id'] = $this->map['manage_id'];
}
}
}elseif (isset($this->map['content']) && !empty($this->map['content'])){
$ids = $task->where('content', 'like','%'.$this->map['content'].'%')->pluck('id')->toArray();
$manage_ids = $taskOwnerModel->formatQuery(['task_id'=>['in',$ids]])->pluck('manage_id')->toArray();
$map['manage_id'] = ['in',$manage_ids];
}elseif (isset($this->map['search_type']) && !empty($this->map['search_type'])){
if(isset($this->map['search']) && !empty($this->map['search'])) {
$projectModel = new Project();
$ids = $projectModel->where('title', 'like', '%' . $this->map['search'] . '%')->pluck('id')->toArray();
$manage_ids = $taskOwnerModel->formatQuery(['project'=>['in',$ids]])->pluck('manage_id')->toArray();
$map['manage_id'] = ['in',$manage_ids];
if($this->map['search_type'] == 'project'){
$ids = $projectModel->where('title', 'like', '%' . $this->map['search'] . '%')->pluck('id')->toArray();
$manage_ids = $taskOwnerModel->formatQuery(['project'=>['in',$ids]])->pluck('manage_id')->toArray();
$map['manage_id'] = ['in',$manage_ids];
}else{
$ids = $task->where('content', 'like','%'.$this->map['search'].'%')->pluck('id')->toArray();
$manage_ids = $taskOwnerModel->formatQuery(['task_id'=>['in',$ids]])->pluck('manage_id')->toArray();
$map['manage_id'] = ['in',$manage_ids];
}
}
}else{
$map['manage_id'] = $this->map['manage_id'];
if(isset($this->map['search_type']) && !empty($this->map['search_type'])){
$map['manage_id'] = $this->map['manage_id'];
}
}
return $map;
... ...
... ... @@ -30,8 +30,8 @@ class ProjectMenuController extends BaseController
* @time :2023/6/21 17:24
*/
public function lists(ProjectMenuLogic $projectMenuLogic){
$this->order = 'sort';
$lists = $projectMenuLogic->MenuList($this->map,$this->order);
$lists = $projectMenuLogic->MenuList($this->map);
$this->response('success',Code::SUCCESS,$lists);
}
... ...
... ... @@ -29,11 +29,17 @@ class ComController extends BaseController
$projectRoleModel = new ProjectRoleModel();
$info = $projectRoleModel->read(['id'=>$this->user['role_id']]);
$info['role_menu'] = trim($info['role_menu'],',');
$lists = $projectMenuModel->where(['status'=>0,'is_role'=>0])->whereIn('id',explode(',',$info['role_menu']))->get();
$this->map = [
'status'=>0,
'is_role'=>0,
'id'=>['in',explode(',',$info['role_menu'])]
];
}else{
$lists = $projectMenuModel->where(['is_role'=>0])->get();
$this->map = [
'status'=>0,
];
}
$lists = $lists->toArray();
$lists = $projectMenuModel->list($this->map,'sort');
$menu = array();
foreach ($lists as $k => $v){
$v = (array)$v;
... ... @@ -73,7 +79,7 @@ class ComController extends BaseController
]);
$userLogic = new UserLogic();
$this->param['id'] = $this->uid;
$userLogic->edits($this->param);
$userLogic->edits();
$this->response('编辑成功');
}
... ...
... ... @@ -7,6 +7,7 @@ use App\Helper\Common;
use App\Http\Controllers\Controller;
use App\Http\Logic\Aside\Project\ProjectLogic;
use App\Http\Requests\Scene;
use App\Models\Domain\DomainInfo;
use App\Models\File\File;
use App\Models\File\Image;
use App\Models\User\User as UserModel;
... ...
... ... @@ -184,7 +184,8 @@ class LoginController extends BaseController
$message = simplexml_load_string($message, 'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOERROR);
$jsonData = json_encode($message);
$arrayData = json_decode($jsonData, true);
$data = $this->setWechat($arrayData['ToUserName'],$arrayData['EventKey']);
//gh_27174ac5c9d8,gh_27174ac5c9d8
$data = $this->setWechat($arrayData['FromUserName'],$arrayData['EventKey']);
if($data['code'] == 0){//登录失败,请先绑定
$resMessage = $data['message'];
}elseif($data['code'] == 1){
... ... @@ -296,21 +297,4 @@ class LoginController extends BaseController
return $data;
}
public function ceshi(){
$templateModel = new TemplateModule();
$list = $templateModel->list();
$imageModel = new ImageModel();
foreach ($list as $k=>$v){
if (strpos($v['image'], '.') !== false) {
$v['image'] = '/upload'.$v['image'];
}else{
$info = $imageModel->read(['hash'=>$v['image']]);
if($info !== false){
$v['image'] = $info['path'];
}
}
$templateModel->edit(['image'=>$v['image']],['id'=>$v['id']]);
}
$this->response('success');
}
}
... ...
... ... @@ -54,7 +54,7 @@ class UserController extends BaseController
* @author :liyuhang
* @method
*/
public function edit(UserRequest $request,UserLogic $userLogic){
public function edit(Request $request,UserLogic $userLogic){
$request->validate([
'id'=>['required']
],[
... ...
... ... @@ -31,6 +31,10 @@ class DomainInfoLogic extends BaseLogic
*/
public function saveDomain()
{
$domain = parse_url($this->param['domain'], PHP_URL_HOST);
if(!empty($domain)){
$this->param['domain'] = $domain['host'];
}
//验证域名
$this->verifyDomain($this->param['domain'],isset($this->param['id']) ?? '');
if(isset($this->param['id']) && !empty($this->param['id'])){
... ...
... ... @@ -2,6 +2,7 @@
namespace App\Http\Logic\Aside\Project;
use App\Models\Devops\ServerConfig;
use Illuminate\Support\Arr as SupArr;
use App\Helper\Arr;
use App\Helper\Common;
... ... @@ -178,8 +179,9 @@ class ProjectLogic extends BaseLogic
protected function saveProjectDeployOptimize($deploy_optimize){
$deployOptimizeModel = new DeployOptimize();
if(isset($deploy_optimize['domain']) && !empty($deploy_optimize['domain'])){
if (!preg_match('/http/', $deploy_optimize['domain'])) {
$deploy_optimize['domain'] = 'https://'.trim($deploy_optimize['domain'],'/').'/';
//更改域名
if(isset($deploy_optimize['domain']) && !empty($deploy_optimize['domain'])){
$this->editDomainStatus($deploy_optimize['domain'],$deploy_optimize['project_id']);
}
}
if(isset($deploy_optimize['minor_languages']) && !empty($deploy_optimize['minor_languages'])){
... ... @@ -258,8 +260,8 @@ class ProjectLogic extends BaseLogic
* @time :2023/8/28 10:50
*/
public function updateServe($serve_id){
$domainModel = new DomainInfo();
$domainModel->edit(['status'=>$domainModel::STATUS_ONE],['id'=>$serve_id]);
$serverModel = new ServerConfig();
$serverModel->edit(['status'=>$serverModel::STATUS_ONE],['id'=>$serve_id]);
return $this->success();
}
... ... @@ -355,7 +357,24 @@ class ProjectLogic extends BaseLogic
}
/**
* @remark :修改域名时,同时更改其状态
* @name :domainStatus
* @author :lyh
* @method :post
* @time :2023/9/4 14:29
*/
public function editDomainStatus($domain,$project_id){
$domainModel = new DomainInfo();
//先清空上一次所绑定的域名
$info = $domainModel->read(['project_id'=>$project_id]);
if($info !== false){
$domainModel->edit(['project_id'=>'','status'=>DomainInfo::STATUS_ZERO],['id'=>$info['id']]);
}
//重新设置域名
$domainModel->edit(['status'=>DomainInfo::STATUS_ONE,'project_id'=>$project_id],['id'=>$domain]);
return $this->success();
}
... ...
... ... @@ -74,7 +74,7 @@ class UserLogic extends BaseLogic
}
$this->param['type'] = 1;
$this->param['operator_id'] = $this->user['id'];
$this->edits($this->param);
$this->edits();
return $this->success();
}
... ... @@ -116,20 +116,24 @@ class UserLogic extends BaseLogic
* @method :post
* @time :2023/6/17 16:41
*/
public function edits($param){
//查看密码是否修改
$info = $this->model->read(['id'=>$param['id']]);
$param['password'] = base64_encode(md5($param['password']));
if($param['password'] == $info['password']){
unset($param['password']);
public function edits(){
if(!isset($this->param['password']) || empty($this->param['password'])){
unset($this->param['password']);
}else{
$this->param['password'] = base64_encode(md5($this->param['password']));
}
$info = $this->model->read(['mobile'=>$this->param['mobile'],
'project_id'=>$this->user['project_id'],'id'=>['!=',$this->param['id']]]);
if($info !== false){
$this->fail('当前手机号码已注册');
}
//密码加密
$rs = $this->model->edit($param,['id'=>$param['id']]);
$rs = $this->model->edit($this->param,['id'=>$this->param['id']]);
if($rs === false){
$this->fail('系统错误,请联系管理员');
}
//清空当前用户登录缓存
Cache::pull($info['token']);
Cache::pull($this->user['token']);
return $this->success();
}
}
... ...
... ... @@ -6,6 +6,7 @@ use App\Enums\Common\Code;
use App\Exceptions\AsideGlobalException;
use App\Exceptions\BsideGlobalException;
use App\Helper\Common;
use App\Models\Domain\DomainInfo;
use App\Models\Project\Project;
use App\Models\Sms\SmsLog;
use App\Models\User\ProjectRole as ProjectRoleModel;
... ... @@ -55,6 +56,8 @@ class UserLoginLogic
}
$projectModel = new Project();
$project_list = $projectModel->list(['id'=>['in',$projectArr]],'id',['id','title']);
//登录选择项目的有效时间
Cache::add('login-project-'.$this->param['mobile'],1,300);
return $this->success($project_list);
}
... ... @@ -66,11 +69,15 @@ class UserLoginLogic
* @time :2023/6/17 16:43
*/
public function projectLogin(){
if(!Cache::get('login-project-'.$this->param['mobile'])){
$this->fail('当前用户选择项目有限时间已过期');
}
//获取项目详情
$info = $this->assembleParam($this->param['mobile'],$this->param['project_id']);
if(isset($info['token']) && !empty($info['token'])){
//清除上一次用户缓存
Cache::pull($info['token']);
Cache::pull('login-project-'.$this->param['mobile']);
}
//生成新token
$token = md5(uniqid().$info['id']);
... ... @@ -157,7 +164,7 @@ class UserLoginLogic
$info['hagro'] = $project['hagro'] ?? '';
$info['plan'] = Project::planMap()[$project['deploy_build']['plan']];
$info['domain'] = (!empty($project['deploy_optimize']['domain']) ?
$project['deploy_optimize']['domain'] : ($project['deploy_build']['test_domain'] ?? ''));
((new DomainInfo())->getDomain($project['deploy_optimize']['domain'])) : ($project['deploy_build']['test_domain'] ?? ''));
//保存项目缓存
Cache::put('user-'.$info['project_id'],$project,$minutes = null);
return $this->success($info);
... ... @@ -171,7 +178,7 @@ class UserLoginLogic
* @time :2023/8/29 15:26
*/
public function assembleParam($mobile,$project_id){
$info = $this->model->read(['mobile'=>$mobile,'project_id'=>$project_id],['id','mobile','status','role_id','token','name','project_id']);
$info = $this->model->read(['mobile'=>$mobile,'project_id'=>$project_id],['id','mobile','status','role_id','token','name','wechat','project_id']);
//获取项目详情
$project = $this->getProjectInfo($project_id);
$info['title'] = $project['title'] ?? '';
... ... @@ -181,13 +188,14 @@ class UserLoginLogic
$info['hagro'] = $project['hagro'] ?? '';
$info['plan'] = Project::planMap()[$project['deploy_build']['plan']];
$info['domain'] = (!empty($project['deploy_optimize']['domain']) ?
$project['deploy_optimize']['domain'] : ($project['deploy_build']['test_domain'] ?? ''));
((new DomainInfo())->getDomain($project['deploy_optimize']['domain'])) : ($project['deploy_build']['test_domain'] ?? ''));
//保存项目缓存
Cache::put('user-'.$info['project_id'],$project,$minutes = null);
return $this->success($info);
}
/**
* @remark :获取项目数据详情
* @name :getProjectInfo
... ...
... ... @@ -9,6 +9,8 @@
namespace App\Models\ASide;
use App\Helper\AyrShare as AyrShareHelper;
use App\Models\AyrShare\AyrShare as AyrShareModel;
use App\Models\Base;
use App\Services\ProjectServer;
use Illuminate\Support\Facades\DB;
... ... @@ -38,5 +40,4 @@ class APublicModel extends Base
return ['product'=>$productNumber,'blog'=>$blogNumber,'news'=>$newsNumber];
}
}
... ...
... ... @@ -7,7 +7,4 @@ use App\Models\Base;
class AyrRelease extends Base
{
protected $table = 'gl_ayr_release';
//连接数据库
protected $connection = 'custom_mysql';
}
... ...
... ... @@ -7,9 +7,6 @@ use App\Models\Base;
class AyrShare extends Base
{
protected $table = 'gl_ayr_share';
//连接数据库
protected $connection = 'custom_mysql';
const COUNT = 3;
... ...
... ... @@ -15,7 +15,7 @@ use App\Models\Base;
class DomainInfo extends Base
{
const STATUS_ONE = 1;
const STATUS_ZERO = 0;
public $btAction = [
'create_site' => '/site?action=AddSite',
];
... ... @@ -51,7 +51,20 @@ class DomainInfo extends Base
}
/**
* @remark :获取域名信息
* @name :getDomain
* @author :lyh
* @method :post
* @time :2023/9/4 17:05
*/
public function getDomain($domain){
$info = $this->read(['id'=>$domain]);
if($info === false){
return '';
}
return 'https://'.$info['domain'].'/';
}
}
... ...
... ... @@ -16,7 +16,8 @@ class Visit extends Base
//设置关联表名
protected $table = 'gl_customer_visit';
//连接数据库
protected $connection = 'custom_mysql';
protected $appends = ['device_text'];
public static function deviceMap(){
... ...
... ... @@ -14,4 +14,6 @@ class VisitItem extends Base
{
//设置关联表名
protected $table = 'gl_customer_visit_item';
//连接数据库
protected $connection = 'custom_mysql';
}
... ...
... ... @@ -35,7 +35,6 @@ Route::middleware(['aloginauth'])->group(function () {
//栏目管理
Route::prefix('menu')->group(function () {
Route::any('/', [Aside\User\ProjectMenuController::class, 'lists'])->name('admin.user_menu_lists');
Route::any('/list', [Aside\User\ProjectMenuController::class, 'list'])->name('admin.user_menu_list');
Route::any('/info', [Aside\User\ProjectMenuController::class, 'info'])->name('admin.user_menu_info');
Route::any('/add', [Aside\User\ProjectMenuController::class, 'add'])->name('admin.user_menu_add');
Route::any('/edit', [Aside\User\ProjectMenuController::class, 'edit'])->name('admin.user_menu_edit');
... ...