mirror of
https://github.com/lkddi/nexusphp.git
synced 2026-04-03 14:10:57 +08:00
Update
This commit is contained in:
@@ -6,11 +6,11 @@ use Nexus\Database\DB;
|
||||
|
||||
class Install
|
||||
{
|
||||
private $currentStep;
|
||||
protected $currentStep;
|
||||
|
||||
private $minimumPhpVersion = '7.2.0';
|
||||
protected $minimumPhpVersion = '7.2.0';
|
||||
|
||||
private $progressKeyPrefix = '__step';
|
||||
protected $progressKeyPrefix = '__step';
|
||||
|
||||
protected $steps = ['环境检测', '添加 .env 文件', '创建数据表', '导入数据', '创建管理员账号'];
|
||||
|
||||
@@ -97,7 +97,6 @@ class Install
|
||||
|
||||
public function listExistsTable()
|
||||
{
|
||||
dbconn(false, false);
|
||||
$sql = 'show tables';
|
||||
$res = sql_query($sql);
|
||||
$data = [];
|
||||
|
||||
77
nexus/Install/Update.php
Normal file
77
nexus/Install/Update.php
Normal file
@@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
namespace Nexus\Install;
|
||||
|
||||
class Update extends Install
|
||||
{
|
||||
|
||||
protected $steps = ['环境检测', '添加 .env 文件', '修改&创建数据表', '导入数据'];
|
||||
|
||||
protected $initializeTables = [
|
||||
'adminpanel', 'agent_allowed_exception', 'agent_allowed_family', 'allowedemails', 'audiocodecs', 'avps', 'bannedemails', 'categories',
|
||||
'caticons', 'codecs', 'countries', 'downloadspeed', 'faq', 'isp', 'language', 'media', 'modpanel', 'processings', 'rules', 'schools',
|
||||
'searchbox', 'secondicons', 'sources', 'standards', 'stylesheets', 'sysoppanel', 'teams', 'torrents_state', 'uploadspeed', 'agent_allowed_family',
|
||||
];
|
||||
|
||||
|
||||
public function getLogFile()
|
||||
{
|
||||
return sprintf('%s/nexus_update_%s.log', sys_get_temp_dir(), date('Ymd'));
|
||||
}
|
||||
|
||||
public function getUpdateDirectory()
|
||||
{
|
||||
return ROOT_PATH . 'public/update';
|
||||
}
|
||||
|
||||
|
||||
public function listShouldAlterTableTableRows()
|
||||
{
|
||||
$tables = $this->listExistsTable();
|
||||
$data = [];
|
||||
foreach ($tables as $table) {
|
||||
$sql = "desc $table";
|
||||
$res = sql_query($sql);
|
||||
while ($row = mysql_fetch_assoc($res)) {
|
||||
if ($row['Type'] == 'datetime' && $row['Default'] == '0000-00-00 00:00:00') {
|
||||
$data[$table][] = $row['Field'];
|
||||
$data[] = [
|
||||
'label' => "$table." . $row['Field'],
|
||||
'required' => 'default null',
|
||||
'current' => '0000-00-00 00:00:00',
|
||||
'result' => 'NO',
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
public function importInitialData($sqlFile = '')
|
||||
{
|
||||
if (empty($sqlFile)) {
|
||||
$sqlFile = ROOT_PATH . '_db/dbstructure_v1.6.sql';
|
||||
}
|
||||
$string = file_get_contents($sqlFile);
|
||||
$pattern = "/INSERT INTO `(\w+)` VALUES \(.*\);\n/i";
|
||||
preg_match_all($pattern, $string, $matches, PREG_SET_ORDER);
|
||||
foreach ($matches as $match) {
|
||||
$table = $match[1];
|
||||
$sql = trim($match[0]);
|
||||
if (!in_array($table, $this->initializeTables)) {
|
||||
continue;
|
||||
}
|
||||
//if table not empty, skip
|
||||
$count = get_row_count($table);
|
||||
if ($count > 0) {
|
||||
$this->doLog("[IMPORT DATA] $table, not empty, skip");
|
||||
continue;
|
||||
}
|
||||
$this->doLog("[IMPORT DATA] $table, $sql");
|
||||
sql_query("truncate table $table");
|
||||
sql_query($sql);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
219
nexus/Install/update/update.php
Normal file
219
nexus/Install/update/update.php
Normal file
@@ -0,0 +1,219 @@
|
||||
<?php
|
||||
ini_set('error_reporting', E_ALL);
|
||||
ini_set('display_errors', 0);
|
||||
$rootpath = dirname(dirname(__DIR__)) . '/';
|
||||
define('ROOT_PATH', $rootpath);
|
||||
$isPost = $_SERVER['REQUEST_METHOD'] == 'POST';
|
||||
require $rootpath . 'vendor/autoload.php';
|
||||
require $rootpath . 'include/globalfunctions.php';
|
||||
require $rootpath . 'include/functions.php';
|
||||
require $rootpath . 'nexus/Database/helpers.php';
|
||||
|
||||
$update = new \Nexus\Install\Update();
|
||||
$currentStep = $update->currentStep();
|
||||
$maxStep = $update->maxStep();
|
||||
if (!$update->canAccessStep($currentStep)) {
|
||||
$update->gotoStep(1);
|
||||
}
|
||||
$error = $copy = '';
|
||||
|
||||
//step 1
|
||||
if ($currentStep == 1) {
|
||||
$requirements = $update->listRequirementTableRows();
|
||||
$pass = $requirements['pass'];
|
||||
if ($isPost) {
|
||||
$update->nextStep();
|
||||
}
|
||||
}
|
||||
|
||||
if ($currentStep == 2) {
|
||||
$envExampleFile = "$rootpath.env.example";
|
||||
$envExampleData = readEnvFile($envExampleFile);
|
||||
$envFormControls = $update->listEnvFormControls();
|
||||
$newData = array_column($envFormControls, 'value', 'name');
|
||||
while ($isPost) {
|
||||
try {
|
||||
$update->createEnvFile($_POST);
|
||||
$update->nextStep();
|
||||
} catch (\Exception $exception) {
|
||||
$error = $exception->getMessage();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
$tableRows = [
|
||||
[
|
||||
'label' => '.env.example',
|
||||
'required' => 'exists && readable',
|
||||
'current' => $envExampleFile,
|
||||
'result' => $update->yesOrNo(file_exists($envExampleFile) && is_readable($envExampleFile)),
|
||||
],
|
||||
];
|
||||
$fails = array_filter($tableRows, function ($value) {return $value['result'] == 'NO';});
|
||||
$pass = empty($fails);
|
||||
}
|
||||
|
||||
if ($currentStep == 3) {
|
||||
$pass = true;
|
||||
$shouldCreateTable = $update->listShouldCreateTable();
|
||||
while ($isPost) {
|
||||
try {
|
||||
$update->createTable($shouldCreateTable);
|
||||
$update->nextStep();
|
||||
} catch (\Exception $exception) {
|
||||
$error = $exception->getMessage();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//if ($currentStep == 4) {
|
||||
// $pass = true;
|
||||
// while (true) {
|
||||
// $shouldAlterTable = listShouldAlterTable();
|
||||
// if ($isPost) {
|
||||
// if (!empty($shouldAlterTable)) {
|
||||
// try {
|
||||
// sql_query('SET sql_mode=(SELECT REPLACE(@@sql_mode,"NO_ZERO_DATE", ""));');
|
||||
// foreach ($shouldAlterTable as $table => $fields) {
|
||||
// $sqlAlter = "alter table $table";
|
||||
// $sqlUpdate = "update $table";
|
||||
// $updateWhere = [];
|
||||
// foreach ($fields as $field) {
|
||||
// $sqlAlter .= " modify $field datetime default null,";
|
||||
// $sqlUpdate .= " set $field = null,";
|
||||
// $updateWhere[] = "$field = '0000-00-00 00:00:00'";
|
||||
// }
|
||||
// $sqlAlter = rtrim($sqlAlter, ',');
|
||||
// $sqlUpdate = rtrim($sqlUpdate, ',') . " where " . implode(' or ', $updateWhere);
|
||||
// sql_query($sqlUpdate);
|
||||
// sql_query($sqlAlter);
|
||||
// }
|
||||
// } catch (\Exception $e) {
|
||||
// $error = $e->getMessage();
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// goStep($currentStep + 1);
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
//}
|
||||
|
||||
if ($currentStep == 4) {
|
||||
$settingTableRows = $update->listSettingTableRows();
|
||||
$settings = $settingTableRows['settings'];
|
||||
$symbolicLinks = $settingTableRows['symbolic_links'];
|
||||
$tableRows = $settingTableRows['table_rows'];
|
||||
$pass = $settingTableRows['pass'];
|
||||
while ($isPost) {
|
||||
try {
|
||||
$update->createSymbolicLinks($symbolicLinks);
|
||||
$update->saveSettings($settings);
|
||||
$update->importInitialData();
|
||||
$update->nextStep();
|
||||
} catch (\Exception $e) {
|
||||
$error = $e->getMessage();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($currentStep == 5) {
|
||||
if ($isPost) {
|
||||
try {
|
||||
$update->createAdministrator($_POST['username'], $_POST['email'], $_POST['password'], $_POST['confirm_password']);
|
||||
$update->nextStep();
|
||||
} catch (\Exception $exception) {
|
||||
$error = $exception->getMessage();
|
||||
}
|
||||
}
|
||||
$pass = true;
|
||||
$userFormControls = [
|
||||
['label' => '用户名', 'name' => 'username', 'value' => $_POST['username'] ?? ''],
|
||||
['label' => '邮箱', 'name' => 'email', 'value' => $_POST['email'] ?? ''],
|
||||
['label' => '密码', 'name' => 'password', 'value' => $_POST['password'] ?? ''],
|
||||
['label' => '确认密码', 'name' => 'confirm_password', 'value' => $_POST['confirm_password'] ?? ''],
|
||||
];
|
||||
}
|
||||
?>
|
||||
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Required meta tags -->
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet">
|
||||
<title>Install NexusPHP | step <?php echo $currentStep?></title>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container mx-auto">
|
||||
<?php echo $update->renderSteps()?>
|
||||
<div class="mt-10">
|
||||
<form method="post" action="<?php echo getBaseUrl() . '?step=' . $currentStep?>">
|
||||
<input type="hidden" name="step" value="<?php echo $currentStep?>">
|
||||
<?php
|
||||
echo'<div class="step-' . $currentStep . ' text-center">';
|
||||
$header = ['项目', '要求', '当前', '结果'];
|
||||
if ($currentStep == 1) {
|
||||
echo $update->renderTable($header, $requirements['table_rows']);
|
||||
} elseif ($currentStep == 2) {
|
||||
echo $update->renderTable($header, $tableRows);
|
||||
echo '<div class="text-gray-700 p-4 text-red-400">若 Redis 不启用,相关项目留空</div>';
|
||||
echo $update->renderForm($envFormControls);
|
||||
|
||||
} elseif ($currentStep == 3) {
|
||||
echo '<h1 class="mb-4 text-lg font-bold">需要新建以下数据表</h1>';
|
||||
if (empty($shouldCreateTable)) {
|
||||
echo '<div class="text-green-600 text-center">恭喜,需要的表均已创建!</div>';
|
||||
} else {
|
||||
echo sprintf('<div class="h-64 text-left inline-block w-2/3"><code class="bolck w-px-100">%s</code></div>', implode(', ', array_keys($shouldCreateTable)));
|
||||
}
|
||||
} elseif ($currentStep == 4) {
|
||||
echo $update->renderTable($header, $tableRows);
|
||||
echo '<div class="text-blue-500 pt-10">';
|
||||
echo sprintf('这一步会把 <code>%s</code> 的数据合并到 <code>%s</code>, 然后插入数据库中。', $tableRows[1]['label'], $tableRows[0]['label']);
|
||||
echo '</div>';
|
||||
} elseif ($currentStep == 5) {
|
||||
echo $update->renderForm($userFormControls, '1/3', '1/4', '3/4');
|
||||
} elseif ($currentStep > $maxStep) {
|
||||
echo '<div class="text-green-900 text-6xl p-10">恭喜,一切就绪!</div>';
|
||||
echo '<div class="mb-6">有问题可查阅安装日志:<code>' . $update->getLogFile() . '</code></div>';
|
||||
echo '<div class="text-red-500">为安全起见,请删除以下目录</div>';
|
||||
echo '<div class="text-red-500"><code>' . $update->getInsallDirectory() . '</code></div>';
|
||||
}
|
||||
echo'</div>';
|
||||
|
||||
if (!empty($error)) {
|
||||
echo sprintf('<div class="text-center text-red-500 p-4">Error: %s</div>', nl2br($error));
|
||||
unset($error);
|
||||
}
|
||||
if (!empty($copy)) {
|
||||
echo sprintf('<div class="text-center"><textarea class="w-1/2 h-40 border">%s</textarea></div>', $copy);
|
||||
unset($copy);
|
||||
}
|
||||
?>
|
||||
<div class="mt-10 text-center">
|
||||
<button class="bg-blue-500 p-2 m-4 text-white rounded" type="button" onclick="goBack()">上一步</button>
|
||||
<?php if ($currentStep <= $maxStep) {?>
|
||||
<button class="bg-blue-<?php echo $pass ? 500 : 200;?> p-2 m-4 text-white rounded" type="submit" <?php echo $pass ? '' : 'disabled';?>>下一步</button>
|
||||
<?php } else {?>
|
||||
<a class="bg-blue-500 p-2 m-4 text-white rounded" href="<?php echo getSchemaAndHttpHost()?>">回首页</a>
|
||||
<?php }?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-10 text-center">
|
||||
欢迎使用 NexusPHP 升级程序(v1.5 ~ v1.6),如有疑问,点击<a href="http://nexusphp.org/" target="_blank" class="text-blue-500 p-1">这里</a>获取帮助。
|
||||
</div>
|
||||
</body>
|
||||
<script>
|
||||
function goBack() {
|
||||
window.location.search="step=<?php echo $currentStep == 1 ? 1 : $currentStep - 1?>"
|
||||
}
|
||||
</script>
|
||||
</html>
|
||||
Reference in New Issue
Block a user