json([ 'status' => 'success', 'message' => '刷新成功' ]); } catch (\Exception $e) { return response()->json([ 'status' => 'error', 'message' => '刷新失败: ' . $e->getMessage() ]); } } /** * 页面标题 * * @var string */ protected $title = '游戏配置表管理'; /** * 页面描述 * * @var string */ protected $description = '查看和刷新游戏中的各种配置表'; /** * 配置表首页 * * @param Content $content * @return Content */ public function index(Content $content) { return $content ->title($this->title) ->description($this->description) ->body(function (Row $row) { // 物品配置表卡片 $row->column(6, $this->createConfigCard( '物品配置表', 'items.json', 'gameitems:generate-json', SyncItemsJsonTool::make(), $this->getItemConfigInfo() )); // 宝箱配置表卡片 $row->column(6, $this->createConfigCard( '宝箱配置表', 'chest.json', 'gameitems:generate-chest-json', SyncChetsJsonTool::make(), $this->getChestConfigInfo() )); }) ->body(function (Row $row) { // 合成配方配置表卡片 $row->column(6, $this->createConfigCard( '物品合成配方配置表', 'recipe.json', 'gameitems:generate-recipe-json', SyncRecipeJsonTool::make(), $this->getRecipeConfigInfo() )); // 分解配方配置表卡片 $row->column(6, $this->createConfigCard( '物品分解配方配置表', 'dismantle.json', 'gameitems:generate-dismantle-json', SyncDismantleJsonTool::make(), $this->getDismantleConfigInfo() )); }) ->body(function (Row $row) { // 宠物基础配置卡片 $row->column(6, $this->createConfigCard( '宠物基础配置表', 'pet_config.json', 'pet:generate-json', RefreshPetJsonTool::make(), $this->getPetConfigInfo(\App\Module\Pet\AdminControllers\Tools\RefreshCheckTool::checkSyncStatus('config')) )); // 宠物等级配置卡片 $row->column(6, $this->createConfigCard( '宠物等级配置表', 'pet_levels.json', 'pet:generate-json', SyncPetJsonTool::make(), $this->getPetLevelConfigInfo(\App\Module\Pet\AdminControllers\Tools\RefreshCheckTool::checkSyncStatus('level')) )); }) ->body(function (Row $row) { // 宠物技能配置卡片 $row->column(6, $this->createConfigCard( '宠物技能配置表', 'pet_skills.json', 'pet:generate-json', RefreshPetJsonTool::make(), $this->getPetSkillConfigInfo(\App\Module\Pet\AdminControllers\Tools\RefreshCheckTool::checkSyncStatus('skill')) )); // 农场房屋配置表卡片 $row->column(6, $this->createConfigCard( '农场房屋配置表', 'farm_house.json', 'farm:generate-house-json', RefreshFarmHouseJsonTool::make(), $this->getFarmHouseConfigInfo() )); }) ->body(function (Row $row) { // 土地配置表卡片 $row->column(6, $this->createConfigCard( '土地配置表', 'farm_land.json', 'farm:generate-land-json', RefreshFarmLandJsonTool::make(), $this->getFarmLandConfigInfo() )); // 种子配置表卡片 $row->column(6, $this->createConfigCard( '种子配置表', 'farm_seed.json', 'farm:generate-seed-json', RefreshFarmSeedJsonTool::make(), $this->getFarmSeedConfigInfo() )); }) ->body(function (Row $row) { // 神像配置表卡片 $row->column(6, $this->createConfigCard( '神像配置表', 'farm_shrine.json', 'farm:generate-shrine-json', RefreshFarmShrineJsonTool::make(), $this->getFarmShrineConfigInfo() )); }) ->body(function (Row $row) { // 货币配置表卡片 $row->column(6, $this->createConfigCard( '货币配置表', 'currencies.json', 'fund:generate-currency-json', RefreshFundCurrencyJsonTool::make(), $this->getFundCurrencyConfigInfo(\App\Module\Fund\AdminControllers\Tools\RefreshCheckTool::checkSyncStatus()) )); // 商店商品配置表卡片 $row->column(6, $this->createConfigCard( '商店商品配置表', 'shop_items.json', 'shop:generate-json', SyncShopItemsJsonTool::make(), $this->getShopItemsConfigInfo() )); }); } /** * 创建配置表信息卡片 * * @param string $title 卡片标题 * @param string $filename 文件名 * @param string $command 生成命令 * @param string $refreshUrl 刷新URL * @param array $info 配置信息 * @return Card */ protected function createConfigCard($title, $filename, $command, $refresh, $info) { $headers = [ '属性', '值' ]; $rows = []; foreach ($info as $key => $value) { $rows[] = [ $key, $value ]; } $card = new Card($title, Table::make($headers, $rows)); $card->tool($refresh); // 处理文件名,获取第一个文件名(如果有多个文件,只取第一个) $firstFilename = explode(',', $filename)[0]; $firstFilename = trim($firstFilename); // 特殊处理各种配置表的映射关系 if ($firstFilename === 'pet_config.json') { $key = 'pet_config'; } elseif ($firstFilename === 'pet_levels.json') { $key = 'pet_levels'; } elseif ($firstFilename === 'pet_skills.json') { $key = 'pet_skills'; } elseif ($firstFilename === 'farm_house.json') { $key = 'farm_house'; } elseif ($firstFilename === 'farm_land.json') { $key = 'farm_land'; } elseif ($firstFilename === 'farm_seed.json') { $key = 'farm_seed'; } elseif ($firstFilename === 'farm_shrine.json') { $key = 'farm_shrine'; } elseif ($firstFilename === 'currencies.json') { $key = 'currencies'; } elseif ($firstFilename === 'chest.json') { $key = 'chest'; } elseif ($firstFilename === 'items.json') { $key = 'items'; } elseif ($firstFilename === 'shop_items.json') { $key = 'shop_items'; } else { // 从文件名中提取key(去掉.json后缀) $key = str_replace('.json', '', $firstFilename); } // 构建查看JSON文件的链接 $jsonViewLink = "查看JSON内容"; $card->footer("文件: {$filename}
命令: php artisan {$command}
{$jsonViewLink}"); return $card; } /** * 获取物品配置表信息 * * @return array */ protected function getItemConfigInfo() { $data = ItemJsonConfig::getData(); $info = [ '生成时间' => Datetime::ts2string($data['generated_ts']), '物品数量' => isset($data['items']) ? count($data['items']) : 0, ]; return $info; } /** * 获取物品合成配方配置表信息 * * @return array */ protected function getRecipeConfigInfo() { $data = RecipeJsonConfig::getData(); $info = [ '生成时间' => isset($data['generated_ts']) ? Datetime::ts2string($data['generated_ts']) : '未生成', '配方数量' => isset($data['recipes']) ? count($data['recipes']) : 0, ]; return $info; } /** * 获取物品分解配方配置表信息 * * @return array */ protected function getDismantleConfigInfo() { $data = DismantleJsonConfig::getData(); $info = [ '生成时间' => isset($data['generated_ts']) ? Datetime::ts2string($data['generated_ts']) : '未生成', '规则数量' => isset($data['dismantle_rules']) ? count($data['dismantle_rules']) : 0, ]; return $info; } /** * 获取宝箱配置表信息 * * @return array */ protected function getChestConfigInfo() { $data = ChestJsonConfig::getData(); $info = [ '生成时间' => Datetime::ts2string($data['generated_ts']), '宝箱数量' => isset($data['chest']) ? count($data['chest']) : 0, ]; return $info; } /** * 获取宠物基础配置表信息 * * @param array $status 配置表状态 * @return array */ protected function getPetConfigInfo($status = null) { $data = PetConfigJsonConfig::getData(); $info = [ '生成时间' => isset($data['generated_ts']) ? Datetime::ts2string($data['generated_ts']) : '未生成', '宠物数量' => isset($data['pets']) ? count($data['pets']) : 0, ]; if ($status) { $info['同步状态'] = $status['is_synced'] ? '已同步' : '需要更新'; } return $info; } /** * 获取宠物等级配置表信息 * * @param array $status 配置表状态 * @return array */ protected function getPetLevelConfigInfo($status = null) { $data = PetLevelJsonConfig::getData(); $info = [ '生成时间' => isset($data['generated_ts']) ? Datetime::ts2string($data['generated_ts']) : '未生成', '等级配置数量' => isset($data['pet_levels']) ? count($data['pet_levels']) : 0, ]; if ($status) { $info['同步状态'] = $status['is_synced'] ? '已同步' : '需要更新'; } return $info; } /** * 获取宠物技能配置表信息 * * @param array $status 配置表状态 * @return array */ protected function getPetSkillConfigInfo($status = null) { $data = PetSkillJsonConfig::getData(); $info = [ '生成时间' => isset($data['generated_ts']) ? Datetime::ts2string($data['generated_ts']) : '未生成', '技能配置数量' => isset($data['pet_skills']) ? count($data['pet_skills']) : 0, ]; if ($status) { $info['同步状态'] = $status['is_synced'] ? '已同步' : '需要更新'; } return $info; } /** * 获取农场房屋配置表信息 * * @return array */ protected function getFarmHouseConfigInfo() { $data = FarmHouseJsonConfig::getData(); $info = [ '生成时间' => Datetime::ts2string($data['generated_ts']), '房屋配置数量' => isset($data['house_configs']) ? count($data['house_configs']) : 0, ]; return $info; } /** * 获取土地配置表信息 * * @return array */ protected function getFarmLandConfigInfo() { $data = FarmLandJsonConfig::getData(); $info = [ '生成时间' => Datetime::ts2string($data['generated_ts']), '土地类型数量' => isset($data['land_types']) ? count($data['land_types']) : 0, '升级路径数量' => isset($data['upgrade_paths']) ? count($data['upgrade_paths']) : 0, ]; return $info; } /** * 获取种子配置表信息 * * @return array */ protected function getFarmSeedConfigInfo() { $data = FarmSeedJsonConfig::getData(); // 统计总的产出物品数量 $totalOutputs = 0; if (isset($data['seeds'])) { foreach ($data['seeds'] as $seed) { $totalOutputs += count($seed['seed_outputs'] ?? []); } } $info = [ '生成时间' => isset($data['generated_ts']) ? Datetime::ts2string($data['generated_ts']) : '未生成', '种子数量' => isset($data['seeds']) ? count($data['seeds']) : 0, '产出物品总数' => $totalOutputs, '果实生长周期数量' => isset($data['fruit_growth_cycles']) ? count($data['fruit_growth_cycles']) : 0, ]; return $info; } /** * 获取货币配置表信息 * * @param array $status 配置表状态 * @return array */ protected function getFundCurrencyConfigInfo($status = null) { $data = FundCurrencyJsonConfig::getData([],true); // dd($data); // 计算有关联币种的账户种类数量 $linkedAccountsCount = 0; if (isset($data['fund'])) { foreach ($data['fund'] as $fundConfig) { if (!empty($fundConfig['currency_id'])) { $linkedAccountsCount++; } } } $info = [ '生成时间' => Datetime::ts2string($data['generated_ts']), '币种数量' => isset($data['currencies']) ? count($data['currencies']) : 0, '账户种类数量' => isset($data['fund']) ? count($data['fund']) : 0, '已关联币种的账户数量' => $linkedAccountsCount, ]; if ($status) { $info['同步状态'] = $status['is_synced'] ? '已同步' : '需要更新'; } return $info; } /** * 获取神像配置表信息 * * @return array */ protected function getFarmShrineConfigInfo() { $data = FarmShrineJsonConfig::getData(); $info = [ '生成时间' => isset($data['generated_ts']) ? Datetime::ts2string($data['generated_ts']) : '未生成', '神像配置数量' => isset($data['shrine_configs']) ? count($data['shrine_configs']) : 0, ]; return $info; } /** * 获取商店商品配置表信息 * * @return array */ protected function getShopItemsConfigInfo() { $data = ShopItemsJsonConfig::getData(); $info = [ '生成时间' => isset($data['generated_ts']) ? Datetime::ts2string($data['generated_ts']) : '未生成', '商品数量' => isset($data['shop_items']) ? count($data['shop_items']) : 0, ]; return $info; } /** * 友好地显示JSON配置数据 * * @param string $key 配置表键名 * @return Content */ #[Get('game-jsonconfigs/view-json/{key}')] public function viewJson($key, Content $content) { // 配置表映射关系 $map = [ 'items' => [ItemJsonConfig::class, '物品配置表'], 'chest' => [ChestJsonConfig::class, '宝箱配置表'], 'recipe' => [RecipeJsonConfig::class, '物品合成配方配置表'], 'dismantle' => [DismantleJsonConfig::class, '物品分解配方配置表'], 'pet_config' => [PetConfigJsonConfig::class, '宠物基础配置表'], 'pet_levels' => [PetLevelJsonConfig::class, '宠物等级配置表'], 'pet_skills' => [PetSkillJsonConfig::class, '宠物技能配置表'], 'pets' => [PetJsonConfig::class, '宠物配置表(旧版)'], 'farm_house' => [FarmHouseJsonConfig::class, '农场房屋配置表'], 'farm_land' => [FarmLandJsonConfig::class, '土地配置表'], 'farm_seed' => [FarmSeedJsonConfig::class, '种子配置表'], 'farm_shrine' => [FarmShrineJsonConfig::class, '神像配置表'], 'currencies' => [FundCurrencyJsonConfig::class, '货币配置表'], 'shop_items' => [ShopItemsJsonConfig::class, '商店商品配置表'], ]; // 检查请求的配置表是否存在 if (!isset($map[$key])) { return $content ->title('错误') ->description('配置表查看') ->body(new Card('错误', '配置表不存在')); } try { // 获取配置表数据 $configClass = $map[$key][0]; $title = $map[$key][1]; $data = $configClass::getData(); // 如果数据为空,返回错误 if (empty($data)) { return $content ->title('错误') ->description('配置表查看') ->body(new Card('错误', '配置表数据为空')); } // 创建JSON查看器 $jsonViewerId = 'json-viewer-' . uniqid(); // 格式化JSON数据 $formattedJson = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); if ($formattedJson === false) { $formattedJson = json_encode(["error" => "无法解析JSON数据"], JSON_PRETTY_PRINT); } // 转义HTML特殊字符 $escapedJson = htmlspecialchars($formattedJson, ENT_QUOTES, 'UTF-8'); $html = <<
{$escapedJson}
HTML; // 创建卡片 $card = new Card($title, $html); // 添加原始JSON链接 $card->tool('查看原始JSON'); return $content ->title('配置表查看') ->description($title) ->body($card); } catch (\Exception $e) { // 返回错误响应 return $content ->title('错误') ->description('配置表查看') ->body(new Card('错误', '获取配置表数据失败: ' . $e->getMessage())); } } /** * 创建JSON查看器 * * @param mixed $data 要显示的数据(数组或对象) * @return string */ protected function createJsonViewer($data) { // 生成唯一ID,避免多个查看器冲突 $viewerId = 'json-viewer-' . uniqid(); // 确保数据是格式化的JSON字符串 $jsonString = is_string($data) ? $data : json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); // 转义HTML特殊字符 $escapedJson = htmlspecialchars($jsonString, ENT_QUOTES, 'UTF-8'); // 使用简单的方式显示JSON数据 $html = <<
{$escapedJson}
HTML; return $html; } }