diff --git a/.docker/php/entrypoint.sh b/.docker/php/entrypoint.sh index 00b375a5..c2663cc7 100644 --- a/.docker/php/entrypoint.sh +++ b/.docker/php/entrypoint.sh @@ -60,6 +60,7 @@ if [ "$SERVICE_NAME" = "php" ]; then # composer install if [ ! -d "$VENDOR_DIR" ]; then echo_info "vendor dir: $VENDOR_DIR not exists, run composer install ..." + git config --global --add safe.directory ${ROOT_PATH} composer install --working-dir=${ROOT_PATH} else echo_success "vendor dir: $VENDOR_DIR already exists, skip run composer install ..." diff --git a/app/Console/Commands/NexusUpdate.php b/app/Console/Commands/NexusUpdate.php index 775cd3ac..257b1a39 100644 --- a/app/Console/Commands/NexusUpdate.php +++ b/app/Console/Commands/NexusUpdate.php @@ -118,11 +118,11 @@ class NexusUpdate extends Command return 0; } if (!$mysqlInfo['match']) { - $this->doLog("Error: MySQL version: {$mysqlInfo['version']} is too low, please use the newest version of 5.7 or above.", 'error'); + $this->doLog("Error: MySQL version: {$mysqlInfo['version']} is too low, please use the newest version of {$mysqlInfo['minVersion']} or above.", 'error'); return 0; } if (!$redisInfo['match']) { - $this->doLog("Error: Redis version: {$mysqlInfo['version']} is too low, please use 2.0.0 or above.", 'error'); + $this->doLog("Error: Redis version: {$mysqlInfo['version']} is too low, please use {$mysqlInfo['minVersion']} or above.", 'error'); return 0; } if ($includeComposer) { diff --git a/app/Console/Commands/Test.php b/app/Console/Commands/Test.php index 0c1df113..c4d9fc57 100644 --- a/app/Console/Commands/Test.php +++ b/app/Console/Commands/Test.php @@ -56,8 +56,7 @@ class Test extends Command */ public function handle() { - $rep = new SeedBoxRepository(); - $rep->updateCacheCronjob(); + Language::updateTransStatus(); } } diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 606ff49a..0280cee8 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -68,7 +68,7 @@ class Kernel extends ConsoleKernel private function registerScheduleCleanup(Schedule $schedule): void { - if (!Schema::hasTable("settings")) { + if (!file_exists(base_path(".env")) || !Schema::hasTable("settings")) { return; } $interval = get_setting("main.autoclean_interval_one"); diff --git a/app/Models/Language.php b/app/Models/Language.php index 34daf152..1bbe8bc6 100644 --- a/app/Models/Language.php +++ b/app/Models/Language.php @@ -38,72 +38,72 @@ class Language extends NexusModel 'cs' => [ 'lang_name' => 'Czech', 'lang_name_cn' => '捷克语', - 'trans_state' => self::TRANS_STATE_INCOMPLETE, + 'trans_state' => self::TRANS_STATE_NEED_NEW, ], 'da' => [ 'lang_name' => 'Danish', 'lang_name_cn' => '丹麦语', - 'trans_state' => self::TRANS_STATE_INCOMPLETE, + 'trans_state' => self::TRANS_STATE_NEED_NEW, ], 'nl' => [ 'lang_name' => 'Dutch', 'lang_name_cn' => '荷兰语', - 'trans_state' => self::TRANS_STATE_INCOMPLETE, + 'trans_state' => self::TRANS_STATE_NEED_NEW, ], 'fi' => [ 'lang_name' => 'Finnish', 'lang_name_cn' => '芬兰语', - 'trans_state' => self::TRANS_STATE_INCOMPLETE, + 'trans_state' => self::TRANS_STATE_NEED_NEW, ], 'fr' => [ 'lang_name' => 'French', 'lang_name_cn' => '法语', - 'trans_state' => self::TRANS_STATE_INCOMPLETE, + 'trans_state' => self::TRANS_STATE_NEED_NEW, ], 'de' => [ 'lang_name' => 'German', 'lang_name_cn' => '德语', - 'trans_state' => self::TRANS_STATE_INCOMPLETE, + 'trans_state' => self::TRANS_STATE_NEED_NEW, ], 'el' => [ 'lang_name' => 'Greek', 'lang_name_cn' => '希腊语', - 'trans_state' => self::TRANS_STATE_INCOMPLETE, + 'trans_state' => self::TRANS_STATE_NEED_NEW, ], 'nb' => [ 'lang_name' => 'Norwegian', 'lang_name_cn' => '挪威语', - 'trans_state' => self::TRANS_STATE_INCOMPLETE, + 'trans_state' => self::TRANS_STATE_NEED_NEW, ], 'pl' => [ 'lang_name' => 'Polish', 'lang_name_cn' => '波兰语', - 'trans_state' => self::TRANS_STATE_INCOMPLETE, + 'trans_state' => self::TRANS_STATE_NEED_NEW, ], 'pt' => [ 'lang_name' => 'Portuguese', 'lang_name_cn' => '葡萄牙语', - 'trans_state' => self::TRANS_STATE_INCOMPLETE, + 'trans_state' => self::TRANS_STATE_NEED_NEW, ], 'ro' => [ 'lang_name' => 'Romanian', 'lang_name_cn' => '罗马尼亚语', - 'trans_state' => self::TRANS_STATE_INCOMPLETE, + 'trans_state' => self::TRANS_STATE_NEED_NEW, ], 'ru' => [ 'lang_name' => 'Russian', 'lang_name_cn' => '俄语', - 'trans_state' => self::TRANS_STATE_INCOMPLETE, + 'trans_state' => self::TRANS_STATE_NEED_NEW, ], 'es' => [ 'lang_name' => 'Spanish', 'lang_name_cn' => '西班牙语', - 'trans_state' => self::TRANS_STATE_INCOMPLETE, + 'trans_state' => self::TRANS_STATE_NEED_NEW, ], 'sv' => [ 'lang_name' => 'Swedish', 'lang_name_cn' => '瑞典语', - 'trans_state' => self::TRANS_STATE_INCOMPLETE, + 'trans_state' => self::TRANS_STATE_NEED_NEW, ], ]; diff --git a/app/Models/PluginStore.php b/app/Models/PluginStore.php index 816b6a19..ac7aa539 100644 --- a/app/Models/PluginStore.php +++ b/app/Models/PluginStore.php @@ -22,7 +22,7 @@ class PluginStore extends Model 'description' => 'array', ]; - const PLUGIN_LIST_API = "https://nppl.nexusphp.workers.dev"; + const PLUGIN_LIST_API = "https://nexusphp.org/plugin-store"; const BLOG_POST_INFO_API = "https://nexusphp.org/wp-json/wp/v2/posts/%d"; const BLOG_POST_URL = "https://nexusphp.org/?p=%d"; @@ -98,7 +98,7 @@ class PluginStore extends Model } else { $log .= ", not_null"; } - do_log($log, 'debug'); + do_log($log); return self::$rows; } @@ -132,7 +132,7 @@ class PluginStore extends Model $count = 0; foreach ($list as $row) { $installedVersion = $enabled[$row['plugin_id']] ?? ''; - if ($installedVersion && version_compare($installedVersion, $row['version'], '<=')) { + if ($installedVersion && version_compare($installedVersion, $row['version'], '<')) { $count++; } } diff --git a/database/seeders/LanguageTableSeeder.php b/database/seeders/LanguageTableSeeder.php index cc3fbcf6..e0db926a 100644 --- a/database/seeders/LanguageTableSeeder.php +++ b/database/seeders/LanguageTableSeeder.php @@ -48,9 +48,9 @@ class LanguageTableSeeder extends Seeder 'flagpic' => 'czechrep.gif', 'sub_lang' => 1, 'rule_lang' => 0, - 'site_lang' => 0, - 'site_lang_folder' => '', - 'trans_state' => 'unavailable', + 'site_lang' => 1, + 'site_lang_folder' => 'cs', + 'trans_state' => 'need-new', ), 3 => array ( @@ -59,9 +59,9 @@ class LanguageTableSeeder extends Seeder 'flagpic' => 'denmark.gif', 'sub_lang' => 1, 'rule_lang' => 0, - 'site_lang' => 0, - 'site_lang_folder' => '', - 'trans_state' => 'unavailable', + 'site_lang' => 1, + 'site_lang_folder' => 'da', + 'trans_state' => 'need-new', ), 4 => array ( @@ -70,9 +70,9 @@ class LanguageTableSeeder extends Seeder 'flagpic' => 'netherlands.gif', 'sub_lang' => 1, 'rule_lang' => 0, - 'site_lang' => 0, - 'site_lang_folder' => '', - 'trans_state' => 'unavailable', + 'site_lang' => 1, + 'site_lang_folder' => 'nl', + 'trans_state' => 'need-new', ), 5 => array ( @@ -103,9 +103,9 @@ class LanguageTableSeeder extends Seeder 'flagpic' => 'finland.gif', 'sub_lang' => 1, 'rule_lang' => 0, - 'site_lang' => 0, - 'site_lang_folder' => '', - 'trans_state' => 'unavailable', + 'site_lang' => 1, + 'site_lang_folder' => 'fi', + 'trans_state' => 'need-new', ), 8 => array ( @@ -114,9 +114,9 @@ class LanguageTableSeeder extends Seeder 'flagpic' => 'france.gif', 'sub_lang' => 1, 'rule_lang' => 0, - 'site_lang' => 0, - 'site_lang_folder' => '', - 'trans_state' => 'unavailable', + 'site_lang' => 1, + 'site_lang_folder' => 'fr', + 'trans_state' => 'need-new', ), 9 => array ( @@ -125,9 +125,9 @@ class LanguageTableSeeder extends Seeder 'flagpic' => 'germany.gif', 'sub_lang' => 1, 'rule_lang' => 0, - 'site_lang' => 0, - 'site_lang_folder' => '', - 'trans_state' => 'unavailable', + 'site_lang' => 1, + 'site_lang_folder' => 'de', + 'trans_state' => 'need-new', ), 10 => array ( @@ -136,9 +136,9 @@ class LanguageTableSeeder extends Seeder 'flagpic' => 'greece.gif', 'sub_lang' => 1, 'rule_lang' => 0, - 'site_lang' => 0, - 'site_lang_folder' => '', - 'trans_state' => 'unavailable', + 'site_lang' => 1, + 'site_lang_folder' => 'el', + 'trans_state' => 'need-new', ), 11 => array ( @@ -180,9 +180,9 @@ class LanguageTableSeeder extends Seeder 'flagpic' => 'japan.gif', 'sub_lang' => 1, 'rule_lang' => 0, - 'site_lang' => 0, - 'site_lang_folder' => '', - 'trans_state' => 'unavailable', + 'site_lang' => 1, + 'site_lang_folder' => 'ja', + 'trans_state' => 'need-new', ), 15 => array ( @@ -202,9 +202,9 @@ class LanguageTableSeeder extends Seeder 'flagpic' => 'norway.gif', 'sub_lang' => 1, 'rule_lang' => 0, - 'site_lang' => 0, - 'site_lang_folder' => '', - 'trans_state' => 'unavailable', + 'site_lang' => 1, + 'site_lang_folder' => 'nb', + 'trans_state' => 'need-new', ), 17 => array ( @@ -224,9 +224,9 @@ class LanguageTableSeeder extends Seeder 'flagpic' => 'poland.gif', 'sub_lang' => 1, 'rule_lang' => 0, - 'site_lang' => 0, - 'site_lang_folder' => '', - 'trans_state' => 'unavailable', + 'site_lang' => 1, + 'site_lang_folder' => 'pl', + 'trans_state' => 'need-new', ), 19 => array ( @@ -235,9 +235,9 @@ class LanguageTableSeeder extends Seeder 'flagpic' => 'portugal.gif', 'sub_lang' => 1, 'rule_lang' => 0, - 'site_lang' => 0, - 'site_lang_folder' => '', - 'trans_state' => 'unavailable', + 'site_lang' => 1, + 'site_lang_folder' => 'pt', + 'trans_state' => 'need-new', ), 20 => array ( @@ -246,9 +246,9 @@ class LanguageTableSeeder extends Seeder 'flagpic' => 'romania.gif', 'sub_lang' => 1, 'rule_lang' => 0, - 'site_lang' => 0, - 'site_lang_folder' => '', - 'trans_state' => 'unavailable', + 'site_lang' => 1, + 'site_lang_folder' => 'ro', + 'trans_state' => 'need-new', ), 21 => array ( @@ -257,9 +257,9 @@ class LanguageTableSeeder extends Seeder 'flagpic' => 'russia.gif', 'sub_lang' => 1, 'rule_lang' => 0, - 'site_lang' => 0, - 'site_lang_folder' => '', - 'trans_state' => 'unavailable', + 'site_lang' => 1, + 'site_lang_folder' => 'ru', + 'trans_state' => 'need-new', ), 22 => array ( @@ -301,9 +301,9 @@ class LanguageTableSeeder extends Seeder 'flagpic' => 'spain.gif', 'sub_lang' => 1, 'rule_lang' => 0, - 'site_lang' => 0, - 'site_lang_folder' => '', - 'trans_state' => 'unavailable', + 'site_lang' => 1, + 'site_lang_folder' => 'es', + 'trans_state' => 'need-new', ), 26 => array ( @@ -312,9 +312,9 @@ class LanguageTableSeeder extends Seeder 'flagpic' => 'sweden.gif', 'sub_lang' => 1, 'rule_lang' => 0, - 'site_lang' => 0, - 'site_lang_folder' => '', - 'trans_state' => 'unavailable', + 'site_lang' => 1, + 'site_lang_folder' => 'sv', + 'trans_state' => 'need-new', ), 27 => array ( diff --git a/nexus/Install/Install.php b/nexus/Install/Install.php index 4935c2f2..61836f40 100644 --- a/nexus/Install/Install.php +++ b/nexus/Install/Install.php @@ -37,6 +37,10 @@ class Install 'mysqli', 'bcmath', 'redis', 'gd', 'gmp', 'Zend OPcache', 'pcntl', 'posix', 'sockets', 'zip', 'intl', 'sqlite3', 'pdo_sqlite' ]; + + protected array $conflictExtensions = [ + 'mysql', + ]; protected array $optionalExtensions = [ // ['name' => 'swoole', 'desc' => "If use swoole for Octane, make sure 'current' shows 1"], ]; @@ -193,6 +197,16 @@ class Install 'result' => $this->yesOrNo(empty($disabledFunctions)), ]; + foreach ($this->conflictExtensions as $extension) { + $loaded = extension_loaded($extension); + $tableRows[] = [ + 'label' => "PHP extension $extension", + 'required' => 'disabled', + 'current' => (int)$loaded, + 'result' => $loaded ? 'NO' : 'YES', + ]; + } + foreach ($this->requiredExtensions as $extension) { if ($extension == 'pcntl' && function_exists('exec')) { $output = []; @@ -707,8 +721,9 @@ class Install $sql = 'select version() as v'; $result = NexusDB::select($sql); $version = $result[0]['v']; - $match = version_compare($version, '5.7.8', '>='); - return compact('version', 'match'); + $minVersion = '5.7.8'; + $match = version_compare($version, $minVersion, '>='); + return compact('version', 'match', 'minVersion'); } public function getRedisVersionInfo(): array @@ -716,8 +731,9 @@ class Install $redis = NexusDB::redis(); $result = $redis->info(); $version = $result['redis_version']; - $match = version_compare($version, '2.6.12', '>='); - return compact('version', 'match'); + $minVersion = '2.6.12'; + $match = version_compare($version, $minVersion, '>='); + return compact('version', 'match', 'minVersion'); } public function checkLock() diff --git a/nexus/Install/settings.default.php b/nexus/Install/settings.default.php index 91e55674..aa56f93b 100644 --- a/nexus/Install/settings.default.php +++ b/nexus/Install/settings.default.php @@ -95,6 +95,7 @@ return array ( 'upload_deny_approval_deny_count' => 2, 'enable_global_search' => 'yes', 'tmp_invite_count' => 0, + 'complain_enabled' => 'yes', ), 'smtp' => array ( diff --git a/public/styles/nexus.css b/public/styles/nexus.css index 17ac9f35..f5590989 100644 --- a/public/styles/nexus.css +++ b/public/styles/nexus.css @@ -74,3 +74,25 @@ img.hitandrun { .word-break-all { word-break: break-all; } + +.form-box { + padding: 15px; +} +.form-control-row { + display: flex; + align-items: center; + padding: 10px 0; +} +.form-control-row .label { + width: 80px +} +.form-control-row .field { + +} +.form-control-row input[type=text],textarea { + width: 300px; + padding: 4px; +} +.form-control-row input[type=checkbox] { + vertical-align: sub; +} diff --git a/public/usercp.php b/public/usercp.php index bd2bb519..0cda46dd 100644 --- a/public/usercp.php +++ b/public/usercp.php @@ -1033,30 +1033,6 @@ if (get_setting('seed_box.enabled') == 'yes') { } $seedBox .= sprintf('
', $lang_usercp['add_seed_box_btn']); tr_small($lang_usercp['row_seed_box'], $seedBox, 1); - $seedBoxCss = <<
@@ -1117,7 +1093,6 @@ jQuery('#seed-box-table').on('click', '.remove-seed-box-btn', function () { }); JS; \Nexus\Nexus::js($seedBoxJs, 'footer', false); - \Nexus\Nexus::css($seedBoxCss, 'footer', false); } //end seed box