| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- <?php
- namespace App\Console\Commands;
- use App\Module\Farm\Models\FarmFruitGrowthCycle;
- use App\Module\Farm\Models\FarmGodBuff;
- use App\Module\Farm\Models\FarmLandType;
- use App\Module\Farm\Models\FarmLandUpgradeConfig;
- use App\Module\Farm\Models\FarmMysterySeeLandEffect;
- use App\Module\Farm\Models\FarmSeed;
- use App\Module\Farm\Models\FarmSeedOutput;
- use App\Module\Farm\Models\FarmShrineConfig;
- use App\Module\Fund\Models\FundConfigModel;
- use App\Module\Fund\Models\FundCurrencyModel;
- use App\Module\Fund\Models\FundModel;
- use App\Module\GameItems\Models\ItemCategory;
- use App\Module\Mex\Models\MexPriceConfig;
- use App\Module\Pet\Models\PetLevelConfig;
- use App\Module\Pet\Models\PetSkill;
- use App\Module\Point\Models\PointAdminModel;
- use App\Module\Point\Models\PointConfigModel;
- use App\Module\Point\Models\PointCurrencyModel;
- use App\Module\Point\Models\PointModel;
- use App\Module\Shop\Models\ShopCategory;
- use App\Module\Shop\Models\ShopItem;
- use App\Module\ThirdParty\Models\ThirdPartyCredential;
- use App\Module\ThirdParty\Models\ThirdPartyLog;
- use App\Module\ThirdParty\Models\ThirdPartyQuota;
- use App\Module\ThirdParty\Models\ThirdPartyService;
- use App\Module\Transfer\Models\TransferApp;
- use App\Module\Transfer\Services\TransferService;
- use App\Module\UrsPromotion\Models\UrsTalentConfig;
- use App\Module\UrsPromotion\Models\UrsTransferFeeConfig;
- use Illuminate\Console\Command;
- use Illuminate\Support\Facades\File;
- use Illuminate\Support\Str;
- /**
- * 生成配置表的 数据库备份文件
- *
- * php artisan generate:configdb
- *
- */
- class GenerateConfigDbCommand extends Command
- {
- protected $signature = 'generate:configdb';
- protected $description = '生成配置表的 数据库备份文件,包含创建语句和插入语句';
- protected $outFile = 'database/sql/configdb.sql';
- protected $modelList = [
- // 系统
- \App\Module\System\Models\SysConfig::class,
- // 物品
- \App\Module\GameItems\Models\Item::class,
- \App\Module\GameItems\Models\ItemCategory::class,
- \App\Module\GameItems\Models\ItemChestConfig::class,
- \App\Module\GameItems\Models\ItemDismantleRule::class,
- \App\Module\GameItems\Models\ItemGroup::class,
- \App\Module\GameItems\Models\ItemGroupItem::class,
- \App\Module\GameItems\Models\ItemOutputLimit::class,
- \App\Module\GameItems\Models\ItemRecipe::class,
- // Game模块
- \App\Module\Game\Models\GameConditionGroup::class,
- \App\Module\Game\Models\GameConditionItem::class,
- \App\Module\Game\Models\GameConsumeGroup::class,
- \App\Module\Game\Models\GameConsumeItem::class,
- \App\Module\Game\Models\GameRewardGroup::class,
- \App\Module\Game\Models\GameRewardGroupPityCount::class,
- \App\Module\Game\Models\GameRewardItem::class,
- \App\Module\Game\Models\GameTag::class,
- \App\Module\Game\Models\GameTagRelation::class,
- // 农场
- \App\Module\Farm\Models\FarmConfig::class,
- \App\Module\Farm\Models\FarmShrineConfig::class,
- \App\Module\Farm\Models\FarmHouseConfig::class,
- FarmFruitGrowthCycle::class,
- FarmGodBuff::class,
- FarmLandType::class,
- FarmLandUpgradeConfig::class,
- FarmMysterySeeLandEffect::class,
- FarmSeed::class,
- FarmSeedOutput::class,
- FarmShrineConfig::class,
- // mex
- MexPriceConfig::class,
- // 宠物
- \App\Module\Pet\Models\PetConfig::class,
- PetLevelConfig::class,
- PetSkill::class,
- // urs 推广
- UrsTalentConfig::class,
- UrsTransferFeeConfig::class,
- // Fund 模块
- FundModel::class,
- FundConfigModel::class,
- FundCurrencyModel::class,
- // Point 模块
- PointModel::class,
- PointConfigModel::class,
- PointCurrencyModel::class,
- // 三方模块
- ThirdPartyService::class,
- ThirdPartyCredential::class,
- ThirdPartyQuota::class,
- // 划转模块
- TransferApp::class,
- // 商店模块
- ShopItem::class,
- ShopCategory::class,
- ];
- public function handle()
- {
- $this->info('开始生成配置表数据库备份文件...');
- // 确保输出目录存在
- $outputDir = dirname($this->outFile);
- if (!File::exists($outputDir)) {
- File::makeDirectory($outputDir, 0755, true);
- $this->info("创建输出目录: {$outputDir}");
- }
- $sqlContent = '';
- $sqlContent .= "-- ******************************************************************\n";
- $sqlContent .= "-- 配置表数据库备份文件\n";
- $sqlContent .= "-- 生成时间: " . now()->toDateTimeString() . "\n";
- $sqlContent .= "-- 警告: 此文件由系统自动生成,禁止修改!\n";
- $sqlContent .= "-- ******************************************************************\n\n";
- $totalTables = 0;
- $totalRecords = 0;
- // 遍历每个模型
- foreach ($this->modelList as $modelClass) {
- try {
- $this->info("处理模型: {$modelClass}");
- // 实例化模型
- $model = new $modelClass();
- $connection = $model->getConnection();
- $tablePrefix = $connection->getTablePrefix();
- $tableName = $tablePrefix . $model->getTable();
- $this->info(" 表名: {$tableName}");
- // 获取表的创建语句
- $createTableResult = $connection->select("SHOW CREATE TABLE `{$tableName}`");
- if (empty($createTableResult)) {
- $this->error(" 无法获取表 {$tableName} 的创建语句");
- continue;
- }
- $createTableSQL = $createTableResult[0]->{'Create Table'};
- // 移除当前自增值
- $createTableSQL = preg_replace('/\s+AUTO_INCREMENT=\d+/', '', $createTableSQL);
- // 添加表的创建语句
- $sqlContent .= "-- ==========================================\n";
- $sqlContent .= "-- 表: {$tableName}\n";
- $sqlContent .= "-- 模型: {$modelClass}\n";
- $sqlContent .= "-- ==========================================\n\n";
- $sqlContent .= "DROP TABLE IF EXISTS `{$tableName}`;\n";
- $sqlContent .= "{$createTableSQL};\n\n";
- // 获取表数据
- $records = $connection->table($model->getTable())->get();
- $recordCount = $records->count();
- $this->info(" 记录数: {$recordCount}");
- if ($recordCount > 0) {
- // 生成INSERT语句
- $sqlContent .= "-- 数据插入\n";
- // 获取字段名
- $firstRecord = (array)$records->first();
- $columns = array_keys($firstRecord);
- $columnList = '`' . implode('`, `', $columns) . '`';
- $sqlContent .= "INSERT INTO `{$tableName}` ({$columnList}) VALUES\n";
- $values = [];
- foreach ($records as $record) {
- $recordArray = (array)$record;
- $escapedValues = array_map(function ($value) {
- if ($value === null) {
- return 'NULL';
- } elseif (is_numeric($value)) {
- return $value;
- } else {
- return "'" . addslashes($value) . "'";
- }
- }, $recordArray);
- $values[] = '(' . implode(', ', $escapedValues) . ')';
- }
- $sqlContent .= implode(",\n", $values) . ";\n\n";
- } else {
- $sqlContent .= "-- 该表无数据记录\n\n";
- }
- $totalTables++;
- $totalRecords += $recordCount;
- } catch (\Exception $e) {
- $this->error("处理模型 {$modelClass} 时出错: " . $e->getMessage());
- continue;
- }
- }
- // 添加统计信息
- $sqlContent .= "-- ==========================================\n";
- $sqlContent .= "-- 备份统计\n";
- $sqlContent .= "-- 总表数: {$totalTables}\n";
- $sqlContent .= "-- 总记录数: {$totalRecords}\n";
- $sqlContent .= "-- 生成完成时间: " . now()->toDateTimeString() . "\n";
- $sqlContent .= "-- ==========================================\n";
- // 写入文件
- File::put($this->outFile, $sqlContent);
- $this->info("配置表数据库备份文件生成完成!");
- $this->info("输出文件: {$this->outFile}");
- $this->info("处理表数: {$totalTables}");
- $this->info("总记录数: {$totalRecords}");
- $this->info("文件大小: " . $this->formatBytes(File::size($this->outFile)));
- return self::SUCCESS;
- }
- /**
- * 格式化字节大小
- *
- * @param int $bytes
- * @return string
- */
- private function formatBytes(int $bytes): string
- {
- $units = [ 'B', 'KB', 'MB', 'GB' ];
- $bytes = max($bytes, 0);
- $pow = floor(($bytes ? log($bytes) : 0) / log(1024));
- $pow = min($pow, count($units) - 1);
- $bytes /= 1 << 10 * $pow;
- return round($bytes, 2) . ' ' . $units[$pow];
- }
- }
|