dbh = self::connectDB(); // 获取数据库版本 $version = self::getMysqlVersion($this->dbh); // 获取数据库SQL文件路径 $dbFile = dirname(__DIR__) . '/db/tenant.sql'; // 检查文件是否存在,若不存在,直接返回错误 if (!file_exists($dbFile)) { throw new Exception("SQL file not found: $dbFile"); } // 读取并规范化SQL文件内容 $content = str_replace(";\r\n", ";\n", file_get_contents($dbFile)); // 对数据库中的脚本进行租户唯一标识替换 $content = str_replace("{tenantSn}", $tenantSn, $content); // 分割SQL语句 $tables = explode(";\n", $content); // 初始化安装时间戳 $installTime = microtime(true) * 10000; // 循环处理每个SQL语句 foreach ($tables as $table) { // 去除前后空白字符 $table = trim($table); // 跳过空的SQL语句 if (empty($table)) continue; // 处理数据库版本兼容性问题(版本<=4.1时移除CHARSET) if (strpos($table, 'CREATE') !== false && $version <= 4.1) { $table = str_replace('DEFAULT CHARSET=utf8', '', $table); } // 跳过注释的SQL语句 if (strpos($table, '--') === 0) continue; // 替换表前缀 $table = str_replace('`la_', env('database.database', 'likeadmin_saas') . '.`la_', $table); $table = str_replace('`la_', '`' . env('database.prefix', 'la_'), $table); // 如果是创建表的SQL,记录表名和时间戳 // if (strpos($table, 'CREATE') !== false) { // $tableName = explode('`', $table)[1]; // $installTime += random_int(3000, 7000); // 随机递增安装时间 // $successTable[] = [$tableName, date('Y-m-d H:i:s', $installTime / 10000)]; // } // 执行SQL语句 try { if (!$this->dbh->query($table)) { throw new Exception("SQL execution failed: $table"); } } catch (Exception $e) { // 捕获异常并输出详细错误信息 echo 'Error executing SQL: ' . htmlspecialchars($table) . "
"; echo 'Error message: ' . $e->getMessage() . "
"; return false; } } return true; } /** * @notes 初始化租户数据 * @param $tenantSn * @return bool * @throws \Random\RandomException * @author yfdong * @date 2024/10/01 15:43 */ public function initializationTenantData($tenantId, $tenantSn, $param) { // 创建数据库链接 $this->dbh = self::connectDB(); // 获取数据库版本 $version = self::getMysqlVersion($this->dbh); // 获取数据库SQL文件路径 $dbFile = dirname(__DIR__) . '/db/tenantData.sql'; // 检查文件是否存在,若不存在,直接返回错误 if (!file_exists($dbFile)) { throw new Exception("SQL file not found: $dbFile"); } // 读取并规范化SQL文件内容 $content = str_replace(";\r\n", ";\n", file_get_contents($dbFile)); // 对数据库中的脚本进行租户唯一标识替换 $content = str_replace("{tenantSn}", $tenantSn, $content); // 对数据库中的脚本进行租户唯一标识替换 $content = str_replace("{tenantId}", $tenantId, $content); // 分割SQL语句 $tables = explode(";\n", $content); // 初始化安装时间戳 $installTime = microtime(true) * 10000; // 创建管理员账号 $tables[] = $this->initAccount($tenantId, $tenantSn, $param); // 循环处理每个SQL语句 foreach ($tables as $table) { // 去除前后空白字符 $table = trim($table); // 跳过空的SQL语句 if (empty($table)) continue; // 处理数据库版本兼容性问题(版本<=4.1时移除CHARSET) if (strpos($table, 'CREATE') !== false && $version <= 4.1) { $table = str_replace('DEFAULT CHARSET=utf8', '', $table); } // 跳过注释的SQL语句 if (strpos($table, '--') === 0) continue; // 替换表前缀 $table = str_replace('`la_', env('database.database', 'likeadmin_saas') . '.`la_', $table); $table = str_replace('`la_', '`' . env('database.prefix', 'la_'), $table); // 执行SQL语句 try { if (!$this->dbh->query($table)) { throw new Exception("SQL execution failed: $table"); } } catch (Exception $e) { // 捕获异常并输出详细错误信息 echo "初始化租户初始数据失败"; echo 'Error executing SQL: ' . htmlspecialchars($table) . "
"; echo 'Error message: ' . $e->getMessage() . "
"; return false; } } return true; } /** * @notes 检查数据库版本 * @return string * @author yfdong * @date 2024/10/01 13:39 */ public function getMysqlVersion($dbh) { $sql = "SELECT VERSION() AS version"; $result = $dbh->query($sql)->fetch(); return substr($result->version, 0, 3); } /** * @notes 创建数据库链接 * @return PDO|string * @author yfdong * @date 2024/10/01 13:39 */ public function connectDB() { // 获取数据库链接 $host = env('database.hostname', ''); $port = env('database.hostport', ''); $user = env('database.username', ''); $password = env('database.password', ''); $dsn = "mysql:host={$host}; port={$port}"; try { $this->dbh = new PDO($dsn, $user, $password); $this->dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->dbh->exec("SET NAMES 'utf8mb4'"); $this->dbh->exec("SET NAMES 'utf8mb4'"); try { $this->dbh->exec("SET GLOBAL sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';"); } catch (Exception $e) { } return $this->dbh; } catch (PDOException $exception) { return $exception->getMessage(); } } /** * @notes 创建管理员账号 * @param $post * @return string * @author yfdong * @date 2024/10/01 16:02 */ public function initAccount($tenantId, $tenantSn, $param) { $time = time(); $salt = Config::get('project.unique_identification'); $defaultPassword = Config::get('project.default_password'); global $uniqueSalt; $uniqueSalt = $salt; // 账号 if (isset($param['account'])) { $account = $param['account']; } else { $account = 'admin'; } //设置密码 if (isset($param['password'])) { $password = md5($salt . md5($param['password'] . $salt)); } else { $password = $defaultPassword; } // 超级管理员 $sql = "INSERT INTO `la_tenant_admin_{$tenantSn}`(`id`, `tenant_id`,`root`, `name`, `avatar`, `account`, `password`, `login_time`, `login_ip`, `multipoint_login`, `disable`, `create_time`, `update_time`, `delete_time`) VALUES (1, {$tenantId},1, '超级管理员', '', '{$account}', '{$password}','{$time}', '', 1, 0, '{$time}', '{$time}', NULL);"; // 超级管理员关联部门 $sql .= "INSERT INTO `la_tenant_admin_dept_{$tenantSn}` (`admin_id`, `dept_id`) VALUES (1, 1);"; return $sql; } }