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;
}
}