WebInfoService.php 14.8 KB
<?php


namespace App\Services\Html;

use App\Console\Commands\ProjectService;
use App\Helper\Str;
use App\Helper\Translate;
use App\Models\Com\UpdateProgress;
use App\Models\Devops\ServerConfig;
use App\Models\Domain\DomainInfo;
use App\Models\Project\DeployOptimize;
use App\Models\Project\Project;
use App\Models\Project\UpdateMasterWebsiteModel;
use App\Models\Project\UpdateMinorLanguagesModel;
use App\Models\Project\UpdateProgressModel;
use App\Models\WebSetting\WebSetting;
use App\Utils\EncryptUtils;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redis;

/**
 * WebInfo服务
 */
class WebInfoService{
    const SUCCESS = 200;
    const ERROR = 400;
    protected $header = [];//设置请求头参数

    /**
     * 手动清除网站缓存
     */
    public function clearCache(Request $request,$domain='')
    {
        $project = null;
        if ($domain == ''){
            $domain = $request->getHost();
        }
        $projectDomain = Project::getProjectByDomain($domain);
        if (!empty($projectDomain)){
            $project = Project::where("id",$projectDomain->project_id)->first();
            if (isset($projectDomain->test_domain)){
                $project->domain = $projectDomain->test_domain;
            }
            if (empty($project)){
                return $this->response("success",WebSetting::$errStatus,"no project");
            }
        }

        if(Str::contains($domain, 'globalso.site')){
            $domainTop = $domain;
        }else{
            $domainTop = Str::getTopDomain($domain);
            $domain = 'www.'.$domainTop;
        }

        $cache_key = $domainTop."_project_info";
        Cache::forget($cache_key);
        //dump("已清除项目缓存");
        Redis::del($domain."_project");
//        dump("已清除项目缓存");

        Redis::del($domain."_public_template");
//        dump("已清除公共模板缓存");

        Redis::del($project->id."_project_origin_head_footer");
//        dump("已清除原始公共head+footer缓存");

        Redis::del($domain."_project_mysql_config");
//        dump("已清除mysql配置缓存");

        Redis::del("project_".$project->id."_web_setting");
//        dump("已清除网站设置缓存");

        Redis::del($project->id."_header_nav");
//        dump("已清除顶部导航缓存");

        Redis::del($domain."_footer_nav");
//        dump("已清除顶部底部缓存");

        Redis::del($domain."_all_nav");
//        dump("已清除顶部底部缓存");

        Redis::del("project_".$project->id."_country");
//        dump("已清除项目国家缓存");

        Redis::del($project->id . "_recommend_and_hot_products");
//        dump("已清除关键词聚合页推荐和热门产品");

        Redis::del($project->id."_products_keyword_default");
//        dump("已清除关键词聚合页默认产品产品");

        Redis::del($project->id."_product_keywords_blog");
//        dump("已清除关键词聚合页博客数据");

        Redis::del("project_".$project->id."_third_party_code");
//        dump("已清除第三方代码缓存");

        Redis::del("project_".$project->id."_web_setting_text");
//        dump("已清除网站锚文本缓存");

        Redis::del($project->id."_product_category");
//        dump("已清除网站产品分类缓存");

        Redis::del($project->id."_news_category");
//        dump("已清除网站新闻分类缓存");

        Redis::del($project->id."_blog_category");
//        dump("已清除网站博客分类缓存");

        Redis::del("project_".$project->id."_all_project_domain");
//        dump("已清除网站所有项目域名缓存");

        Redis::del($domain."_translation_proofread");
//        dump("已清除网站翻译校对缓存");
    }

    /**
     * 清空站点所有页面
     */
    public function clearWebsite($request,$data)
    {
        $project = $request->get("project");
        $domainInfo = DomainInfo::where("project_id",$project->id)->first();
        $this->response("error",WebSetting::$errStatus,"api not used");
//        if (!empty($domainInfo) && $project->id != 1){
//            $this->response("error",WebSetting::$errStatus,"The project has been launched!");
//        }

        $domain = $request->getHost();
        $this->clearCache($request,$domain);
        $path = public_path($domain);
        if (file_exists($path)){
            $deletePageService = new DeletePageService();
            $deletePageService->deleteDirectory($path);
        }
        $this->response("success",WebSetting::$okStatus,"clear website success , please visit again !");
    }

    /**
     * 翻译测试
     */
    public function fanYi($request,$data)
    {
        $data = $request->all();
        $res = Translate::tran($data["text"], $data["lang"]);
        $this->response("success",WebSetting::$okStatus,$res);

    }

    public function getProject($request,$data)
    {
        $domain = $request->getHost();
        //项目
        if (Redis::get($domain."_project") != null){
            $project = json_decode(Redis::get($domain."_project"));
        }else{
            $projectDomain = Project::getProjectByDomain($domain);
            $project = Project::where("id",$projectDomain->project_id)->first();
            if (isset($projectDomain->test_domain)){
                $project->domain = $projectDomain->test_domain;
            }else{
                $project->domain = $projectDomain->domain;
            }
            if (empty($project)){
                return $this->response("error",WebSetting::$errStatus,"no project");
            }
            Redis::set($domain."_project", json_encode($project->toArray()));
            Redis::expire($domain."_project", WebSetting::$redisExpireTime);
        }
        dump($project);
    }

    /**
     * 获取国家语言
     */
    public function getCountryLang($request,$data)
    {
        $project = $request->get('project');
        $pageService = new PageService();
        $webCountry = $pageService->getCountryList($project->id);
        foreach ($webCountry as $item){
            dump($item);
        }

    }

    /**
     * 根据域名创建sitemap
     */
    public function createSitemap($request): \Illuminate\Http\JsonResponse
    {
        $domain = $request->getHost();
        Redis::lpush('create_sitemap',$domain);
        return $this->response("success",WebSetting::$okStatus);
    }

    /**
     * 创建所有上线sitemap
     */
    public function createAllSitemap()
    {
        $project = DomainInfo::where(['status' => 1])->pluck('domain', 'project_id')->toArray();
        foreach ($project as $k=>$v) {
            Redis::lpush('create_sitemap',$v);
            dump("sitemap生成提供成功:".$v);
        }
        dd("全部提交成功");
    }

    /**
     * 响应
     * @throws HttpResponseException
     */
    public function response($msg = null,string $code = self::SUCCESS,$data = [],$result_code = 200,$type = 'application/json'): JsonResponse
    {
        $result = [
            'msg' => $msg,
            'code' => $code,
            'data' => $data,
        ];
        $this->header['Content-Type'] = $type;
        $response =  response($result,$result_code,$this->header);
        throw new HttpResponseException($response);
    }

    /**
     * 检查所有项目更新进度并处理
     */
    public function checkProgressHandle()
    {
        //所有项目
        $projectInfo = $this->getTotalProject();
        //链接对应项目的数据库,并查找需要处理的产品关键词的数据
        if (!empty($projectInfo)){
            foreach ($projectInfo as $item){
                //连接数据库
                $this->connectMysql($item);

                //主站
                $updateProgressModel = UpdateProgress::where("project_id",$item["project_id"])->where("type",1)->orderBy("id","desc")->first();
                if (!empty($updateProgressModel)){
                    $totalNum = $updateProgressModel->total_num;
                    $currentNum = $updateProgressModel->current_num;
                    if ((int)$currentNum < (int)$totalNum){
                        UpdateProgress::where('id', $updateProgressModel->id)->update(['current_num' => $totalNum]);
                    }
                }

                //小语种
                $updateProgressModel = UpdateProgress::where("project_id",$item["project_id"])->where("type",2)->orderBy("id","desc")->first();
                if (!empty($updateProgressModel)){
                    $totalNum = $updateProgressModel->total_num;
                    $currentNum = $updateProgressModel->current_num;
                    if ((int)$currentNum < (int)$totalNum){
                        UpdateProgress::where('id', $updateProgressModel->id)->update(['current_num' => $totalNum]);
                    }
                }

                UpdateMasterWebsiteModel::select("id")->delete();
                UpdateMinorLanguagesModel::select("id")->delete();
                //关闭数据库连接
                DB::disconnect('custom_mysql');
            }
        }
        $this->response("success",WebSetting::$okStatus,"success");
    }

    /**
     * 根据域名创建sitemap
     */
    public function createSitemapZhiFang($domain): bool
    {
        $projectInfo = [];
        //获取项目
        $projectByDomain = Project::getProjectByDomain($domain);
        if (!empty($projectByDomain)){
            $projectInfo["domain"] =  $domain;
            $projectInfo["project_id"] =  $projectByDomain->project_id;
            $project = Project::where("id",$projectByDomain->project_id)->first();
            if (!empty($project)){
                $projectInfo["mysql_id"] =  $project->mysql_id;
                $projectInfo["main_lang_id"] =  $project->main_lang_id;
                $serverConfig = ServerConfig::where("id",$project->mysql_id)->first();
                if (!empty($serverConfig)){
                    $encrypt = new EncryptUtils();
                    $projectInfo["host"] =  $serverConfig->host;
                    $projectInfo["port"] =  (int)$encrypt->unlock_url($serverConfig->port);
                    $projectInfo["database"] =  "gl_data_".$projectByDomain->project_id;
                    $projectInfo["username"] =  $encrypt->unlock_url($serverConfig->user);
                    $projectInfo["password"] =  $encrypt->unlock_url($serverConfig->password);
                }
            }
        }

        //连数据库
        if (!empty($projectInfo)){
            //连接数据库
            $this->connectMysql($projectInfo);
            //数据处理
            $routeMapQuery = RouteMap::where("project_id",$projectInfo["project_id"]);
            $routerCount = $routeMapQuery->count();
            if ($routerCount > 0){
                //获取所有路由,分类,生成sitemap
                //获取各类型路由及分页信息
                $createSitemapService = new CreateSitemapService();
                $allTypeRouteCountAndPageInfo = $createSitemapService->getAllTypeRouteCountAndPageInfo($projectInfo["project_id"]);
                //生成sitemap.xml页面
                $createSitemapService->createSitemapPage($projectInfo,$allTypeRouteCountAndPageInfo);
            }

            //关闭数据库连接
            DB::disconnect('custom_mysql');
        }
        return true;
    }

    /**
     * 查询所有项目(所有)
     */
    public function getTotalProject(): array
    {
        $projectInfo = [];
        //正式项目
        $allProject = Project::get();
        $projectService = new ProjectService();
        if (!empty($allProject)){
            foreach ($allProject as $key => $item){
                $projectInfo[$key]["project_id"] =  $item->id;
                //查数据库信息
                $projectInfo[$key]["mysql_id"] =  $item->mysql_id;
                $serverConfig = ServerConfig::where("id",$item->mysql_id)->first();
                if (!empty($serverConfig)){
                    $projectInfo[$key]["host"] =  $serverConfig->host;
                    $projectInfo[$key]["port"] =  (int)$projectService::unlock_url($serverConfig->port);
                    $projectInfo[$key]["database"] =  "gl_data_".$item->project_id;
                    $projectInfo[$key]["username"] =  $projectService::unlock_url($serverConfig->user);
                    $projectInfo[$key]["password"] =  $projectService::unlock_url($serverConfig->password);
                }
            }
        }
        return $projectInfo;
    }

    /**
     * 连接数据库
     */
    public function connectMysql($data)
    {
        // 设置 database.connections.custom_mysql 配置
        config(['database.connections.custom_mysql.host' => $data['host']]);
        config(['database.connections.custom_mysql.port' => $data['port']]);
        config(['database.connections.custom_mysql.database' => $data['database']]);
        config(['database.connections.custom_mysql.username' => $data['username']]);
        config(['database.connections.custom_mysql.password' => $data['password']]);
    }

    /**
     * 查询所有项目,包括数据库信息
     */
    public function getAllProject(): array
    {
        $projectInfo = [];
        //正式项目
        $onlineProject = DeployOptimize::whereNotNull("domain")->get();
        $projectService = new ProjectService();
        if (!empty($onlineProject)){
            foreach ($onlineProject as $key => $item){
                //查域名信息
                $domainInfo = DomainInfo::where("id",$item->domain)->first();
                if (!empty($domainInfo)){
                    $projectInfo[$key]["domain"] =  $domainInfo->domain;
                    $projectInfo[$key]["project_id"] =  $item->project_id;
                }

                //查数据库信息
                $project = Project::where("id",$item->project_id)->first();
                if (!empty($project)){
                    $projectInfo[$key]["mysql_id"] =  $project->mysql_id;
                    $projectInfo[$key]["main_lang_id"] =  (int)$project->main_lang_id;
                    $serverConfig = ServerConfig::where("id",$project->mysql_id)->first();
                    if (!empty($serverConfig)){
                        $projectInfo[$key]["host"] =  $serverConfig->host;
                        $projectInfo[$key]["port"] =  (int)$projectService::unlock_url($serverConfig->port);
                        $projectInfo[$key]["database"] =  "gl_data_".$item->project_id;
                        $projectInfo[$key]["username"] =  $projectService::unlock_url($serverConfig->user);
                        $projectInfo[$key]["password"] =  $projectService::unlock_url($serverConfig->password);
                    }
                }
            }
        }

        return $projectInfo;
    }

}