123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- <?php
- function isAjaxRequest()
- {
- if (isset($_SERVER['HTTP_REFERER'])) {
- return true;
- } else {
- return false;
- }
- }
- if (file_exists("./installed.lock")) {
- if (isAjaxRequest()) {
- echo json_encode(['code' => 1000, 'msg' => '系统已安装,请勿重复安装!'], JSON_UNESCAPED_UNICODE);
- exit;
- }
- header("Location: /");
- exit;
- }
- class Install
- {
- protected $defError = [
- 1045 => [
- 'reason' => '用户名或密码错误,或用户没有访问权限。'
- ],
- 2002 => [
- 'reason' => '数据库服务器未运行或无法连接到指定的主机和端口。'
- ],
- 1049 => [
- 'reason' => '指定的数据库不存在。'
- ],
- 1044 => [
- 'reason' => '用户没有访问指定数据库的权限。'
- ],
- 2003 => [
- 'reason' => '无法连接到 MySQL 服务器,可能是防火墙阻止了连接。'
- ]
- ];
- function __construct() {}
- function json($arr)
- {
- return json_encode($arr, JSON_UNESCAPED_UNICODE);
- }
- function index(): string
- {
- $var = [
- 'title' => 'mTab新标签页安装程序',
- 'customHead|raw' => '',
- 'keywords' => '',
- 'description' => '',
- 'favicon' => '/static/mtab.png',
- 'version' => time()
- ];
- //正则替换模板变量{$title},{$customHead|raw}
- $template = file_get_contents(__DIR__ . '/dist/index.html');
- return preg_replace_callback('/{\$([\w|]+)}/', function ($matches) use ($var) {
- $key = $matches[1];
- return $var[$key] ?? '';
- }, $template);
- }
- function connect($form, $tableName = null): mysqli
- {
- //将上面的值提取到数据库配置中
- $db_host = $form['db_host'];
- $db_username = $form['db_username'];
- $db_password = $form['db_password'];
- $db_port = $form['db_port'];
- $conn = @new mysqli($db_host, $db_username, $db_password, $tableName, $db_port);
- if ($conn->connect_error) {
- $errorCode = $conn->connect_errno; // 获取错误代码
- // 检查 defError 中是否存在该错误代码
- $errorMessage = isset($this->defError[$errorCode])
- ? $this->defError[$errorCode]['reason']
- : $conn->connect_error; // 如果不存在,返回原始错误信息
- throw new Exception($errorMessage, 500);
- }
- return $conn;
- }
- function ext()
- {
- $phpVersion = phpversion();
- $php_version = false;
- if (version_compare($phpVersion, '7.4', '>')) {
- $php_version = true;
- }
- $fileinfo_ext = false;
- if (extension_loaded('fileinfo')) {
- $fileinfo_ext = true;
- }
- $zip_ext = false;
- if (extension_loaded('zip')) {
- $zip_ext = true;
- }
- $mysqli_ext = false;
- if (extension_loaded('mysqli')) {
- $mysqli_ext = true;
- }
- $curl_ext = false;
- if (extension_loaded('curl')) {
- $curl_ext = true;
- }
- return $this->json(['code' => 200, 'data' => [
- 'php_version' => $php_version,
- 'fileinfo_ext' => $fileinfo_ext,
- 'zip_ext' => $zip_ext,
- 'mysqli_ext' => $mysqli_ext,
- 'curl_ext' => $curl_ext
- ]]);
- }
- function testDb()
- {
- $data = json_decode(file_get_contents('php://input'), true);
- try {
- $conn = $this->connect($data);
- $conn->close();
- return $this->json(['code' => 200, 'msg' => '连接成功']);
- } catch (Exception $e) {
- return $this->json(['code' => 500, 'msg' => $e->getMessage()]);
- }
- }
- function install()
- {
- $form = json_decode(file_get_contents('php://input'), true);
- $database_type = $form['database_type'];
- $table_name = $form['table_name'];
- $db_host = $form['db_host'];
- $db_username = $form['db_username'];
- $db_password = $form['db_password'];
- $db_port = $form['db_port'];
- $admin_password = $form['admin_password'];
- $admin_email = $form['admin_email'];
- try {
- $conn = $this->connect($form);
- } catch (\Exception $e) {
- return $this->json(['code' => 500, 'msg' => $e->getMessage()]);
- }
- if ($database_type == 1) { //全新安装
- $sql = "DROP DATABASE $table_name"; //删除原来的
- $conn->query($sql);
- $sql = "CREATE DATABASE $table_name"; //创建新的
- if ($conn->query($sql) !== TRUE) {
- return $this->json(['code' => 500, 'msg' => '数据表创建失败']);
- }
- $conn->close();
- $conn = $this->connect($form, $table_name);
- //数据库的格式内容数据
- $sql_file_content = file_get_contents('../install.sql');
- // 解析SQL文件内容并执行
- $sql_statements = explode(';', trim($sql_file_content));
- foreach ($sql_statements as $sql_statement) {
- if (!empty($sql_statement)) {
- try {
- $conn->query($sql_statement);
- } catch (Exception $exception) {
- }
- }
- }
- //默认的一些基础数据
- $sql_file_content = file_get_contents('../defaultData.sql');
- // 解析SQL文件内容并执行
- $sql_statements = explode(';', trim($sql_file_content));
- foreach ($sql_statements as $sql_statement) {
- if (!empty($sql_statement)) {
- try {
- $conn->query($sql_statement);
- } catch (Exception $exception) {
- }
- }
- }
- $admin_password = md5($admin_password);
- //添加默认管理员
- $AdminSql = ("
- INSERT INTO user (mail, password, create_time, login_ip, register_ip, manager, login_fail_count, login_time)
- VALUES ('$admin_email', '$admin_password', null, null, null, 1, DEFAULT, null);
- ");
- $conn->query($AdminSql);
- $conn->close();
- }
- $env = <<<EOF
- APP_DEBUG = false
-
- [APP]
-
- [DATABASE]
- TYPE = mysql
- HOSTNAME = {$db_host}
- DATABASE = {$table_name}
- USERNAME = {$db_username}
- PASSWORD = {$db_password}
- HOSTPORT = {$db_port}
- CHARSET = utf8mb4
- DEBUG = false
-
- [CACHE]
- DRIVER = file
-
- EOF;
- file_put_contents('../.env', $env);
- file_put_contents('./installed.lock', 'installed');
- return $this->json(['code' => 200, 'msg' => '安装成功']);
- }
- }
- $handle = new Install();
- $path = $_GET['s'];
- switch ($path):
- case '/testDb':
- echo $handle->testDb();
- break;
- case '/install':
- echo $handle->install();
- break;
- case '/ext':
- echo $handle->ext();
- break;
- default:
- echo $handle->index();
- break;
- endswitch;
- exit;
|