ProjectServer.php 8.3 KB
<?php
/**
 * Created by PhpStorm.
 * User: zhl
 * Date: 2023/4/17
 * Time: 15:16
 */

namespace App\Services;

use App\Models\CustomModule\CustomModule;
use App\Models\Project\Project;
use App\Models\RouteMap\RouteMap;
use App\Models\Template\BCustomTemplate;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;

/**
 * Class ProjectServer
 * @package App\Services
 */
class ProjectServer
{
    /**
     * @param $project_id
     * @return Project|false
     */
    public static function useProject($project_id)
    {
        $project = Project::where(['id' => $project_id])->first();
        if (empty($project)){
            return false;
        }
        if(!$project->mysqlConfig){
            return false;
        }
        // 设置 database.connections.custom_mysql 配置
        config(['database.connections.custom_mysql.host' => $project->mysqlConfig->host]);
        config(['database.connections.custom_mysql.port' => $project->mysqlConfig->port]);
        config(['database.connections.custom_mysql.database' => $project->databaseName()]);
        config(['database.connections.custom_mysql.username' => $project->mysqlConfig->user]);
        config(['database.connections.custom_mysql.password' => $project->mysqlConfig->password]);

        //清除现有的数据库连接配置
        DB::purge('custom_mysql');
        //重连
        DB::connection('custom_mysql')->reconnect();

        // 设置 redis 配置
        return $project;
    }


    /**
     * 创建数据库
     * @param $project
     * @return bool
     * @author zbj
     * @date 2023/4/23
     */
    public static function createDatabase($project)
    {
        $conn = new \mysqli(
            $project->mysqlConfig->host,
            $project->mysqlConfig->user,
            $project->mysqlConfig->password,
            '',
            $project->mysqlConfig->port
        );
        $conn->query("CREATE DATABASE IF NOT EXISTS {$project->databaseName()}");
        return true;
    }


    /**
     * @param $project
     * @return bool
     * @author zbj
     * @date 2023/4/23
     */
    public static function initTable()
    {
        $database_name = DB::connection('custom_tmp_mysql')->getDatabaseName();
        $table = Schema::connection('custom_tmp_mysql')->getAllTables();
        $table = array_column($table, 'Tables_in_' . $database_name);
        foreach ($table as $v) {
            $has_table = Schema::connection('custom_mysql')->hasTable($v);
            if ($has_table) {
                continue;
            }
            $sql = DB::connection('custom_tmp_mysql')->select("SHOW CREATE TABLE {$v}");
            DB::connection('custom_mysql')->statement(get_object_vars($sql[0])['Create Table']);
        }
        return true;
    }

    /**
     * @remark :执行初始数据
     * @name   :saveInitParam
     * @author :lyh
     * @method :post
     * @time   :2023/9/19 14:45
     */
    public static function saveInitParam($project_id){
        self::initGroup($project_id);
        //初始化单页
        self::init404Page($project_id);
        //初始化模块数据
        self::initModule($project_id);
        DB::disconnect('custom_mysql');
        return true;
    }

    /**
     * @remark :初始化模块
     * @name   :initModule
     * @author :lyh
     * @method :post
     * @time   :2023/12/29 9:34
     */
    public static function initModule($project_id){
        $info = DB::connection('custom_mysql')->table('gl_custom_module')->first();
        if(empty($info)){
            $data = [
                'name'=>'视频模块',
                'project_id'=>$project_id,
                'route'=>'video',
                'created_at' => date('Y-m-d H:i:s'),
                'updated_at' => date('Y-m-d H:i:s')
            ];
            DB::connection('custom_mysql')->table('gl_custom_module')->insert($data);
        }
        return true;
    }
    /**
     * @remark :菜单
     * @name   :initGroup
     * @author :lyh
     * @method :post
     * @time   :2023/12/29 9:30
     */
    public static function initGroup($project_id){
        $time = date('Y-m-d H:i:s');
        $info = DB::connection('custom_mysql')->table('gl_web_nav')->first();
        if(empty($info)) {
            $data = [
                ['project_id' => $project_id, 'name' => 'Home', 'url' => 'Home', 'location' => 'header', 'group_id' => 1, 'created_at' => $time, 'updated_at' => $time],
                ['project_id' => $project_id, 'name' => 'Products', 'url' => 'Products', 'location' => 'header', 'group_id' => 1, 'created_at' => $time, 'updated_at' => $time],
                ['project_id' => $project_id, 'name' => 'News', 'url' => 'News', 'location' => 'header', 'group_id' => 1, 'created_at' => $time, 'updated_at' => $time],
                ['project_id' => $project_id, 'name' => 'ABOUT US', 'url' => 'about-us', 'location' => 'footer', 'group_id' => 2, 'created_at' => $time, 'updated_at' => $time],
                ['project_id' => $project_id, 'name' => 'Contact Us', 'url' => 'contact-us', 'location' => 'footer', 'group_id' => 2, 'created_at' => $time, 'updated_at' => $time],
                ['project_id' => $project_id, 'name' => 'FAQ', 'url' => 'faq', 'location' => 'footer', 'group_id' => 2, 'created_at' => $time, 'updated_at' => $time],
            ];
            DB::connection('custom_mysql')->table('gl_web_nav')->insert($data);
        }
        //菜单组
        $info = DB::connection('custom_mysql')->table('gl_web_nav_group')->first();
        if(empty($info)) {
            $data = [
                ['id' => 1, 'project_id' => $project_id, 'name' => '全局顶部菜单', 'created_at' => $time, 'updated_at' => $time],
                ['id' => 2, 'project_id' => $project_id, 'name' => '底部菜单', 'created_at' => $time, 'updated_at' => $time],
            ];
            DB::connection('custom_mysql')->table('gl_web_nav_group')->insert($data);
        }
        return true;
    }

    /**
     * @remark :初始化404页面
     * @name   :init404Page
     * @author :lyh
     * @method :post
     * @time   :2023/12/29 9:32
     */
    public function init404Page($project_id){
        $time = date('Y-m-d H:i:s');
        $info = DB::connection('custom_mysql')->table('gl_web_custom_template')->first();
        if(empty($info)) {
            $main_404_html = '<main>
        <section data-section="section" data-screen="screen-large" class="section-404-wrap-block section-block-error404"
            id="sectionIdyxqu938">
            <div class="layout" data-unable="demo01-error404">
                <img src="https://ecdn6.globalso.com/upload/m/image_other/2023-10/6528a87e594db30162.png" />
            </div>
            <p style="text-align: center">SORRY. THE PAGE HAS EITHER MOVED OR CANNOT BE FOUND.</p>
            <style>
                .section-block-error404 .layout {
                    height: 700px;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                }
                .section-block-error404 img {
                    width: 400px;
                }
                @media only screen and (max-width:500) {
                    .section-block-error404 img {
                        max-width: 100%;
                    }
                }
            </style>
            <script>
            </script>
        </section>
    </main>';
            $data = [
                'project_id' => $project_id,
                'name' => BCustomTemplate::NOT_FOUND_PAGE_URL,
                'status' => 1,
                'url' => BCustomTemplate::NOT_FOUND_PAGE_URL,
                'html' => $main_404_html,
                'html_style' => '<style id="globalsojs-styles"></style>',
                'title' => '404-Page not found',
                'description' => 'Sorry. The page has either moved or cannot be found.',
                'created_at' => $time, 'updated_at' => $time];
            $id = DB::connection('custom_mysql')->table('gl_web_custom_template')->insertGetId($data);
            //路由
            $info = DB::connection('custom_mysql')->table('gl_route_map')->first();
            if(empty($info)) {
                $data = ['project_id' => $project_id, 'source' => RouteMap::SOURCE_PAGE, 'source_id' => $id, 'route' => BCustomTemplate::NOT_FOUND_PAGE_URL, 'created_at' => $time, 'updated_at' => $time];
                DB::connection('custom_mysql')->table('gl_route_map')->insert($data);
            }
        }
    }
}