feat: new xboard
This commit is contained in:
@@ -4,6 +4,8 @@ namespace App\Console\Commands;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Google\Cloud\Storage\StorageClient;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Symfony\Component\Process\Process;
|
||||
|
||||
class BackupDatabase extends Command
|
||||
@@ -85,14 +87,14 @@ class BackupDatabase extends Command
|
||||
]);
|
||||
|
||||
// 输出文件链接
|
||||
\Log::channel('backup')->info("🎉:数据库备份已上传到 Google Cloud Storage: $objectName");
|
||||
Log::channel('backup')->info("🎉:数据库备份已上传到 Google Cloud Storage: $objectName");
|
||||
$this->info("🎉:数据库备份已上传到 Google Cloud Storage: $objectName");
|
||||
\File::delete($compressedBackupPath);
|
||||
File::delete($compressedBackupPath);
|
||||
}
|
||||
}catch(\Exception $e){
|
||||
\Log::channel('backup')->error("😔:数据库备份失败 \n" . $e);
|
||||
Log::channel('backup')->error("😔:数据库备份失败 \n" . $e);
|
||||
$this->error("😔:数据库备份失败\n" . $e);
|
||||
\File::delete($compressedBackupPath);
|
||||
File::delete($compressedBackupPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ class ClearUser extends Command
|
||||
->where('last_login_at', NULL);
|
||||
$count = $builder->count();
|
||||
if ($builder->delete()) {
|
||||
$this->info("已删除${count}位没有任何数据的用户");
|
||||
$this->info("已删除{$count}位没有任何数据的用户");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace App\Console\Commands;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class ExportV2Log extends Command
|
||||
{
|
||||
@@ -20,7 +21,7 @@ class ExportV2Log extends Command
|
||||
$days = $this->argument('days');
|
||||
$date = Carbon::now()->subDays($days)->startOfDay();
|
||||
|
||||
$logs = \DB::table('v2_log')
|
||||
$logs = DB::table('v2_log')
|
||||
->where('created_at', '>=', $date->timestamp)
|
||||
->get();
|
||||
|
||||
|
||||
@@ -4,6 +4,8 @@ namespace App\Console\Commands;
|
||||
|
||||
use App\Models\Setting;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\Artisan;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class MigrateFromV2b extends Command
|
||||
{
|
||||
@@ -51,11 +53,12 @@ class MigrateFromV2b extends Command
|
||||
],
|
||||
'1.7.3' => [
|
||||
'ALTER TABLE `v2_stat_order` RENAME TO `v2_stat`;',
|
||||
"ALTER TABLE `v2_stat` CHANGE COLUMN order_amount order_total INT COMMENT '订单合计';",
|
||||
"ALTER TABLE `v2_stat` CHANGE COLUMN order_amount paid_total INT COMMENT '订单合计';",
|
||||
"ALTER TABLE `v2_stat` CHANGE COLUMN order_count paid_count INT COMMENT '邀请佣金';",
|
||||
"ALTER TABLE `v2_stat` CHANGE COLUMN commission_amount commission_total INT COMMENT '佣金合计';",
|
||||
"ALTER TABLE `v2_stat`
|
||||
ADD COLUMN paid_count INT NULL,
|
||||
ADD COLUMN paid_total INT NULL,
|
||||
ADD COLUMN order_count INT NULL,
|
||||
ADD COLUMN order_total INT NULL,
|
||||
ADD COLUMN register_count INT NULL,
|
||||
ADD COLUMN invite_count INT NULL,
|
||||
ADD COLUMN transfer_used_total VARCHAR(32) NULL;
|
||||
@@ -132,7 +135,7 @@ class MigrateFromV2b extends Command
|
||||
try {
|
||||
foreach ($sqlCommands[$version] as $sqlCommand) {
|
||||
// Execute SQL command
|
||||
\DB::statement($sqlCommand);
|
||||
DB::statement($sqlCommand);
|
||||
}
|
||||
|
||||
$this->info('1️⃣、数据库差异矫正成功');
|
||||
@@ -158,7 +161,7 @@ class MigrateFromV2b extends Command
|
||||
|
||||
public function MigrateV2ConfigToV2Settings()
|
||||
{
|
||||
\Artisan::call('config:clear');
|
||||
Artisan::call('config:clear');
|
||||
$configValue = config('v2board') ?? [];
|
||||
|
||||
foreach ($configValue as $k => $v) {
|
||||
@@ -167,16 +170,16 @@ class MigrateFromV2b extends Command
|
||||
|
||||
// 如果记录不存在,则插入
|
||||
if ($existingSetting) {
|
||||
$this->warn("配置 ${k} 在数据库已经存在, 忽略");
|
||||
$this->warn("配置 {$k} 在数据库已经存在, 忽略");
|
||||
continue;
|
||||
}
|
||||
Setting::create([
|
||||
'name' => $k,
|
||||
'value' => is_array($v)? json_encode($v) : $v,
|
||||
]);
|
||||
$this->info("配置 ${k} 迁移成功");
|
||||
$this->info("配置 {$k} 迁移成功");
|
||||
}
|
||||
\Artisan::call('config:cache');
|
||||
Artisan::call('config:cache');
|
||||
|
||||
$this->info('所有配置迁移完成');
|
||||
}
|
||||
|
||||
@@ -39,11 +39,16 @@ class SendRemindMail extends Command
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
if (!(bool) admin_setting('remind_mail_enable', false)) {
|
||||
return;
|
||||
}
|
||||
$users = User::all();
|
||||
$mailService = new MailService();
|
||||
foreach ($users as $user) {
|
||||
if ($user->remind_expire) $mailService->remindExpire($user);
|
||||
if ($user->remind_traffic) $mailService->remindTraffic($user);
|
||||
if ($user->remind_expire)
|
||||
$mailService->remindExpire($user);
|
||||
if ($user->remind_traffic)
|
||||
$mailService->remindTraffic($user);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,10 @@ use Illuminate\Encryption\Encrypter;
|
||||
use App\Models\User;
|
||||
use App\Utils\Helper;
|
||||
use Illuminate\Support\Env;
|
||||
use Illuminate\Support\Facades\Artisan;
|
||||
use Illuminate\Support\Facades\Config;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use function Laravel\Prompts\confirm;
|
||||
use function Laravel\Prompts\text;
|
||||
use function Laravel\Prompts\note;
|
||||
@@ -45,17 +49,17 @@ class XboardInstall extends Command
|
||||
public function handle()
|
||||
{
|
||||
try {
|
||||
$isDocker = env('docker', false);
|
||||
$enableSqlite = env('enable_sqlite', false);
|
||||
$enableRedis = env('enable_redis', false);
|
||||
$adminAccount = env('admin_account', '');
|
||||
$isDocker = file_exists('/.dockerenv');
|
||||
$enableSqlite = env('ENABLE_SQLITE', false);
|
||||
$enableRedis = env('ENABLE_REDIS', false);
|
||||
$adminAccount = env('ADMIN_ACCOUNT', '');
|
||||
$this->info("__ __ ____ _ ");
|
||||
$this->info("\ \ / /| __ ) ___ __ _ _ __ __| | ");
|
||||
$this->info(" \ \/ / | __ \ / _ \ / _` | '__/ _` | ");
|
||||
$this->info(" / /\ \ | |_) | (_) | (_| | | | (_| | ");
|
||||
$this->info("/_/ \_\|____/ \___/ \__,_|_| \__,_| ");
|
||||
if (
|
||||
(\File::exists(base_path() . '/.env') && $this->getEnvValue('INSTALLED'))
|
||||
(File::exists(base_path() . '/.env') && $this->getEnvValue('INSTALLED'))
|
||||
|| (env('INSTALLED', false) && $isDocker)
|
||||
) {
|
||||
$securePath = admin_setting('secure_path', admin_setting('frontend_admin_path', hash('crc32b', config('app.key'))));
|
||||
@@ -86,11 +90,11 @@ class XboardInstall extends Command
|
||||
'DB_PASSWORD' => '',
|
||||
];
|
||||
try {
|
||||
\Config::set("database.default", 'sqlite');
|
||||
\Config::set("database.connections.sqlite.database", base_path($envConfig['DB_DATABASE']));
|
||||
\DB::purge('sqlite');
|
||||
\DB::connection('sqlite')->getPdo();
|
||||
if (!blank(\DB::connection('sqlite')->getPdo()->query("SELECT name FROM sqlite_master WHERE type='table'")->fetchAll(\PDO::FETCH_COLUMN))) {
|
||||
Config::set("database.default", 'sqlite');
|
||||
Config::set("database.connections.sqlite.database", base_path($envConfig['DB_DATABASE']));
|
||||
DB::purge('sqlite');
|
||||
DB::connection('sqlite')->getPdo();
|
||||
if (!blank(DB::connection('sqlite')->getPdo()->query("SELECT name FROM sqlite_master WHERE type='table'")->fetchAll(\PDO::FETCH_COLUMN))) {
|
||||
if (confirm(label: '检测到数据库中已经存在数据,是否要清空数据库以便安装新的数据?', default: false, yes: '清空', no: '退出安装')) {
|
||||
$this->info('正在清空数据库请稍等');
|
||||
$this->call('db:wipe', ['--force' => true]);
|
||||
@@ -115,16 +119,16 @@ class XboardInstall extends Command
|
||||
'DB_PASSWORD' => text(label: '请输入数据库密码', required: false),
|
||||
];
|
||||
try {
|
||||
\Config::set("database.default", 'mysql');
|
||||
\Config::set("database.connections.mysql.host", $envConfig['DB_HOST']);
|
||||
\Config::set("database.connections.mysql.port", $envConfig['DB_PORT']);
|
||||
\Config::set("database.connections.mysql.database", $envConfig['DB_DATABASE']);
|
||||
\Config::set("database.connections.mysql.username", $envConfig['DB_USERNAME']);
|
||||
\Config::set("database.connections.mysql.password", $envConfig['DB_PASSWORD']);
|
||||
\DB::purge('mysql');
|
||||
\DB::connection('mysql')->getPdo();
|
||||
Config::set("database.default", 'mysql');
|
||||
Config::set("database.connections.mysql.host", $envConfig['DB_HOST']);
|
||||
Config::set("database.connections.mysql.port", $envConfig['DB_PORT']);
|
||||
Config::set("database.connections.mysql.database", $envConfig['DB_DATABASE']);
|
||||
Config::set("database.connections.mysql.username", $envConfig['DB_USERNAME']);
|
||||
Config::set("database.connections.mysql.password", $envConfig['DB_PASSWORD']);
|
||||
DB::purge('mysql');
|
||||
DB::connection('mysql')->getPdo();
|
||||
$isMysqlValid = true;
|
||||
if (!blank(\DB::connection('mysql')->select('SHOW TABLES'))) {
|
||||
if (!blank(DB::connection('mysql')->select('SHOW TABLES'))) {
|
||||
if (confirm(label: '检测到数据库中已经存在数据,是否要清空数据库以便安装新的数据?', default: false, yes: '清空', no: '不清空')) {
|
||||
$this->info('正在清空数据库请稍等');
|
||||
$this->call('db:wipe', ['--force' => true]);
|
||||
@@ -141,12 +145,11 @@ class XboardInstall extends Command
|
||||
}
|
||||
}
|
||||
$envConfig['APP_KEY'] = 'base64:' . base64_encode(Encrypter::generateKey('AES-256-CBC'));
|
||||
$envConfig['INSTALLED'] = true;
|
||||
$isReidsValid = false;
|
||||
while (!$isReidsValid) {
|
||||
// 判断是否为Docker环境
|
||||
if ($isDocker == 'true' && ($enableRedis || confirm(label: '是否启用Docker内置的Redis', default: true, yes: '启用', no: '不启用'))) {
|
||||
$envConfig['REDIS_HOST'] = '/run/redis-socket/redis.sock';
|
||||
$envConfig['REDIS_HOST'] = '/data/redis.sock';
|
||||
$envConfig['REDIS_PORT'] = 0;
|
||||
$envConfig['REDIS_PASSWORD'] = null;
|
||||
} else {
|
||||
@@ -171,6 +174,8 @@ class XboardInstall extends Command
|
||||
// 连接失败,输出错误消息
|
||||
$this->error("redis连接失败:" . $e->getMessage());
|
||||
$this->info("请重新输入REDIS配置");
|
||||
$enableRedis = false;
|
||||
sleep(1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -191,10 +196,10 @@ class XboardInstall extends Command
|
||||
$this->saveToEnv($envConfig);
|
||||
|
||||
$this->call('config:cache');
|
||||
\Artisan::call('cache:clear');
|
||||
Artisan::call('cache:clear');
|
||||
$this->info('正在导入数据库请稍等...');
|
||||
\Artisan::call("migrate", ['--force' => true]);
|
||||
$this->info(\Artisan::output());
|
||||
Artisan::call("migrate", ['--force' => true]);
|
||||
$this->info(Artisan::output());
|
||||
$this->info('数据库导入完成');
|
||||
$this->info('开始注册管理员账号');
|
||||
if (!$this->registerAdmin($email, $password)) {
|
||||
@@ -206,6 +211,8 @@ class XboardInstall extends Command
|
||||
|
||||
$defaultSecurePath = hash('crc32b', config('app.key'));
|
||||
$this->info("访问 http(s)://你的站点/{$defaultSecurePath} 进入管理面板,你可以在用户中心修改你的密码。");
|
||||
$envConfig['INSTALLED'] = true;
|
||||
$this->saveToEnv($envConfig);
|
||||
} catch (\Exception $e) {
|
||||
$this->error($e);
|
||||
}
|
||||
|
||||
@@ -44,8 +44,8 @@ class XboardStatistics extends Command
|
||||
{
|
||||
$startAt = microtime(true);
|
||||
ini_set('memory_limit', -1);
|
||||
$this->statUser();
|
||||
$this->statServer();
|
||||
// $this->statUser();
|
||||
// $this->statServer();
|
||||
$this->stat();
|
||||
info('统计任务执行完毕。耗时:' . (microtime(true) - $startAt) / 1000);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user