Browse Source

feat(farm): 添加神像配置功能

- 新增神像配置模型、控制器和相关帮助类
- 实现神像配置的列表、详情和编辑功能
- 添加神像配置的JSON生成命令
- 优化游戏配置中神像配置信息的显示
notfff 7 months ago
parent
commit
53a7e7596c

+ 7 - 5
app/Module/Farm/AdminControllers/FarmShrineConfigController.php

@@ -8,7 +8,6 @@ use App\Module\Farm\AdminControllers\Helper\GridHelper;
 use App\Module\Farm\AdminControllers\Helper\ShowHelper;
 use App\Module\Farm\AdminControllers\Tools\RefreshFarmShrineJsonTool;
 use App\Module\Farm\Enums\BUFF_TYPE;
-use App\Module\Farm\Models\FarmShrineConfig;
 use App\Module\Farm\Repositories\FarmShrineConfigRepository;
 use Dcat\Admin\Form;
 use Dcat\Admin\Grid;
@@ -73,6 +72,7 @@ class FarmShrineConfigController extends AdminController
             $grid->column('duration_hours', '默认持续时间(小时)')->sortable();
             $grid->column('item_id', '对应物品ID');
             $helper->columnModelCatsJson('display_attributes', '显示属性');
+            $helper->columnModelCatsJson('numeric_attributes', '数值属性');
             $grid->column('created_at', '创建时间')->sortable();
             $grid->column('updated_at', '更新时间')->sortable();
 
@@ -82,12 +82,12 @@ class FarmShrineConfigController extends AdminController
             ]);
 
             // 设置过滤器
-            $grid->filter(function (Grid\Filter $filter) use ($helper) {
-                $helper->filterByID();
+            $grid->filter(function (Grid\Filter $filter) {
+                $filter->equal('id', 'ID');
                 $filter->equal('buff_type', '神像类型')->select(BUFF_TYPE::getAll());
                 $filter->like('name', '神像名称');
                 $filter->equal('item_id', '对应物品ID');
-                $helper->filterByCreatedAt();
+                $filter->between('created_at', '创建时间')->datetime();
             });
         });
     }
@@ -112,6 +112,7 @@ class FarmShrineConfigController extends AdminController
             $show->field('duration_hours', '默认持续时间(小时)');
             $show->field('item_id', '对应物品ID');
             $helper->fieldModelCatsJson('display_attributes', '显示属性');
+            $helper->fieldModelCatsJson('numeric_attributes', '数值属性');
             $show->field('created_at', '创建时间');
             $show->field('updated_at', '更新时间');
         });
@@ -141,7 +142,8 @@ class FarmShrineConfigController extends AdminController
                 ->min(1)
                 ->required();
             $helper->formKeyValueJson('display_attributes', '显示属性');
-            
+            $helper->formKeyValueJson('numeric_attributes', '数值属性');
+
             $form->display('created_at', '创建时间');
             $form->display('updated_at', '更新时间');
         });

+ 20 - 0
app/Module/Farm/AdminControllers/Helper/FilterHelperTrait.php

@@ -257,4 +257,24 @@ trait FilterHelperTrait
     {
         return $this->filter->between($field, $label)->datetime();
     }
+
+    /**
+     * 添加ID筛选
+     *
+     * @return Filter\AbstractFilter
+     */
+    public function filterByID(): Filter\AbstractFilter
+    {
+        return $this->filter->equal('id', 'ID');
+    }
+
+    /**
+     * 添加创建时间筛选
+     *
+     * @return Filter\AbstractFilter
+     */
+    public function filterByCreatedAt(): Filter\AbstractFilter
+    {
+        return $this->filter->between('created_at', '创建时间')->datetime();
+    }
 }

+ 15 - 0
app/Module/Farm/AdminControllers/Helper/FormHelperTrait.php

@@ -241,4 +241,19 @@ trait FormHelperTrait
             $table->rate('probability', '概率')->max(1)->step(0.01)->required();
         });
     }
+
+    /**
+     * 添加键值对JSON编辑器
+     *
+     * @param string $field 字段名
+     * @param string $label 标签名
+     * @return Field\KeyValue
+     */
+    public function formKeyValueJson(string $field, string $label): Field\KeyValue
+    {
+        return $this->form->keyValue($field, $label)
+            ->saving(function ($value) {
+                return json_encode($value, JSON_UNESCAPED_UNICODE);
+            });
+    }
 }

+ 41 - 0
app/Module/Farm/AdminControllers/Helper/GridHelperTrait.php

@@ -307,4 +307,45 @@ trait GridHelperTrait
             return $value;
         });
     }
+
+    /**
+     * 添加模型Cast JSON列
+     *
+     * @param string $field 字段名
+     * @param string $label 标签名
+     * @return Column
+     */
+    public function columnModelCatsJson(string $field, string $label): Column
+    {
+        return $this->grid->column($field, $label)->display(function ($value) {
+            if (empty($value)) {
+                return '-';
+            }
+
+            if (is_string($value)) {
+                $value = json_decode($value, true);
+            } elseif (is_object($value)) {
+                $value = (array)$value;
+            }
+
+            if (!is_array($value)) {
+                return '-';
+            }
+
+            $html = '<div class="table-responsive"><table class="table table-sm table-bordered">';
+            $html .= '<thead><tr><th>属性</th><th>值</th></tr></thead>';
+            $html .= '<tbody>';
+
+            foreach ($value as $key => $val) {
+                if (is_array($val) || is_object($val)) {
+                    $val = json_encode($val, JSON_UNESCAPED_UNICODE);
+                }
+                $html .= "<tr><td>{$key}</td><td>{$val}</td></tr>";
+            }
+
+            $html .= '</tbody></table></div>';
+
+            return $html;
+        });
+    }
 }

+ 41 - 0
app/Module/Farm/AdminControllers/Helper/ShowHelperTrait.php

@@ -294,4 +294,45 @@ trait ShowHelperTrait
             return $value;
         });
     }
+
+    /**
+     * 显示模型Cast JSON字段
+     *
+     * @param string $field 字段名
+     * @param string $label 标签名
+     * @return Show\Field
+     */
+    public function fieldModelCatsJson(string $field, string $label): Show\Field
+    {
+        return $this->show->field($field, $label)->as(function ($value) {
+            if (empty($value)) {
+                return '-';
+            }
+
+            if (is_string($value)) {
+                $value = json_decode($value, true);
+            } elseif (is_object($value)) {
+                $value = (array)$value;
+            }
+
+            if (!is_array($value)) {
+                return '-';
+            }
+
+            $html = '<div class="table-responsive"><table class="table table-sm table-bordered">';
+            $html .= '<thead><tr><th>属性</th><th>值</th></tr></thead>';
+            $html .= '<tbody>';
+
+            foreach ($value as $key => $val) {
+                if (is_array($val) || is_object($val)) {
+                    $val = json_encode($val, JSON_UNESCAPED_UNICODE);
+                }
+                $html .= "<tr><td>{$key}</td><td>{$val}</td></tr>";
+            }
+
+            $html .= '</tbody></table></div>';
+
+            return $html;
+        });
+    }
 }

+ 57 - 0
app/Module/Farm/Casts/FarmShrineDisplayAttributesCast.php

@@ -0,0 +1,57 @@
+<?php
+
+namespace App\Module\Farm\Casts;
+
+use App\Module\LCache\DQueueJob;
+use UCore\Model\CastsAttributes;
+
+/**
+ * 神像显示属性类型转换器
+ *
+ * 用于将数据库中存储的JSON格式的神像显示属性转换为PHP对象,以及将PHP对象转换回JSON格式。
+ * 显示属性包含用于界面展示的属性,如图标路径、颜色、描述等。
+ */
+class FarmShrineDisplayAttributesCast extends CastsAttributes
+{
+    /**
+     * 图标路径
+     * 
+     * @var string $icon
+     */
+    public string $icon = '';
+
+    /**
+     * 颜色
+     * 
+     * @var string $color
+     */
+    public string $color = '';
+
+    /**
+     * 描述
+     * 
+     * @var string $description
+     */
+    public string $description = '';
+
+    /**
+     * 背景图片
+     * 
+     * @var string $background
+     */
+    public string $background = '';
+
+    /**
+     * 动画效果
+     * 
+     * @var string $animation
+     */
+    public string $animation = '';
+
+    /**
+     * 特殊标记
+     * 
+     * @var string $badge
+     */
+    public string $badge = '';
+}

+ 49 - 0
app/Module/Farm/Casts/FarmShrineNumericAttributesCast.php

@@ -0,0 +1,49 @@
+<?php
+
+namespace App\Module\Farm\Casts;
+
+use UCore\Model\CastsAttributes;
+
+/**
+ * 神像数值属性类型转换器
+ *
+ * 用于将数据库中存储的JSON格式的神像数值属性转换为PHP对象,以及将PHP对象转换回JSON格式。
+ * 数值属性包含用于游戏逻辑计算的属性,如效果加成、持续时间加成等。
+ */
+class FarmShrineNumericAttributesCast extends CastsAttributes
+{
+    /**
+     * 效果强度加成(百分比)
+     * 
+     * @var float $effect_bonus
+     */
+    public float $effect_bonus = 0.0;
+
+    /**
+     * 持续时间加成(小时)
+     * 
+     * @var int $duration_bonus
+     */
+    public int $duration_bonus = 0;
+
+    /**
+     * 冷却时间减少(百分比)
+     * 
+     * @var float $cooldown_reduction
+     */
+    public float $cooldown_reduction = 0.0;
+
+    /**
+     * 激活消耗减少(百分比)
+     * 
+     * @var float $cost_reduction
+     */
+    public float $cost_reduction = 0.0;
+
+    /**
+     * 额外效果ID
+     * 
+     * @var int $extra_effect_id
+     */
+    public int $extra_effect_id = 0;
+}

+ 16 - 17
app/Module/Farm/Commands/GenerateFarmShrineConfigJson.php

@@ -3,8 +3,8 @@
 namespace App\Module\Farm\Commands;
 
 use App\Module\Farm\Models\FarmShrineConfig;
+use App\Module\Game\DCache\FarmShrineJsonConfig;
 use Illuminate\Console\Command;
-use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Log;
 
 /**
@@ -16,6 +16,7 @@ use Illuminate\Support\Facades\Log;
  */
 class GenerateFarmShrineConfigJson extends Command
 {
+
     /**
      * 命令名称
      *
@@ -43,23 +44,24 @@ class GenerateFarmShrineConfigJson extends Command
 
             // 准备JSON数据
             $jsonData = [
-                'generated_ts' => time(),
+                'generated_ts'   => time(),
                 'shrine_configs' => []
             ];
 
             foreach ($configs as $config) {
                 $jsonData['shrine_configs'][] = [
-                    'id' => $config->id,
-                    'buff_type' => $config->buff_type,
-                    'name' => $config->name,
-                    'description' => $config->description,
-                    'duration_hours' => $config->duration_hours,
-                    'item_id' => $config->item_id,
+                    'id'                 => $config->id,
+                    'buff_type'          => $config->buff_type,
+                    'name'               => $config->name,
+                    'description'        => $config->description,
+                    'duration_hours'     => $config->duration_hours,
+                    'item_id'            => $config->item_id,
                     'display_attributes' => $config->display_attributes,
+                    'numeric_attributes' => $config->numeric_attributes,
                 ];
             }
 
-//            dd($jsonData);
+
             return $jsonData;
         } catch (\Exception $e) {
             Log::error('Generate farm_shrine.json failed: ' . $e->getMessage());
@@ -80,15 +82,12 @@ class GenerateFarmShrineConfigJson extends Command
     public function handle()
     {
         $this->info('Generating farm_shrine.json...');
+        $result = FarmShrineJsonConfig::getData([], true);
 
-        $result = self::generateJson();
+        $this->info('Successfully generated farm_shrine.json with ' . count($result['shrine_configs']) . ' shrine configs.');
+
+        return 0;
 
-        if ($result) {
-            $this->info('Successfully generated farm_shrine.json with ' . count($result['shrine_configs']) . ' shrine configs.');
-            return 0;
-        } else {
-            $this->error('Failed to generate farm_shrine.json.');
-            return 1;
-        }
     }
+
 }

+ 8 - 4
app/Module/Farm/Models/FarmShrineConfig.php

@@ -2,13 +2,14 @@
 
 namespace App\Module\Farm\Models;
 
-use App\Module\Farm\Casts\DisplayAttributesCast;
+use App\Module\Farm\Casts\FarmShrineDisplayAttributesCast;
+use App\Module\Farm\Casts\FarmShrineNumericAttributesCast;
 use App\Module\Farm\Enums\BUFF_TYPE;
 use UCore\ModelCore;
 
 /**
  * 神像配置模型
- * field start 
+ * field start
  * @property   int  $id  主键ID
  * @property   int  $buff_type  神像类型:1丰收之神,2雨露之神,3屠草之神,4拭虫之神
  * @property   string  $name  神像名称
@@ -16,6 +17,7 @@ use UCore\ModelCore;
  * @property   int  $duration_hours  默认持续时间(小时)
  * @property   int  $item_id  对应物品ID
  * @property   object|array  $display_attributes  显示属性
+ * @property   object|array  $numeric_attributes  数值属性
  * @property   \Carbon\Carbon  $created_at  创建时间
  * @property   \Carbon\Carbon  $updated_at  更新时间
  * field end
@@ -29,7 +31,7 @@ class FarmShrineConfig extends ModelCore
      */
     protected $table = 'farm_shrine_configs';
 
-    // attrlist start 
+    // attrlist start
     protected $fillable = [
         'id',
         'buff_type',
@@ -38,6 +40,7 @@ class FarmShrineConfig extends ModelCore
         'duration_hours',
         'item_id',
         'display_attributes',
+        'numeric_attributes',
     ];
     // attrlist end
 
@@ -50,7 +53,8 @@ class FarmShrineConfig extends ModelCore
         'buff_type' => 'integer',
         'duration_hours' => 'integer',
         'item_id' => 'integer',
-        'display_attributes' => DisplayAttributesCast::class,
+        'display_attributes' => FarmShrineDisplayAttributesCast::class,
+        'numeric_attributes' => FarmShrineNumericAttributesCast::class,
     ];
 
     /**

+ 2 - 4
app/Module/Farm/Providers/FarmServiceProvider.php

@@ -49,6 +49,7 @@ class FarmServiceProvider extends ServiceProvider
             Commands\CheckHouseDowngradeCommand::class,
             Commands\CleanExpiredLogsCommand::class,
             Commands\GenerateFarmHouseConfigJson::class,
+            Commands\GenerateFarmShrineConfigJson::class
 
         ]);
 
@@ -64,10 +65,7 @@ class FarmServiceProvider extends ServiceProvider
     {
         parent::boot();
 
-        // 注册路由
-        if (file_exists(__DIR__ . '/../routes.php')) {
-            $this->loadRoutesFrom(__DIR__ . '/../routes.php');
-        }
+
 
         // 注册定时任务监听器
 //        $this->app->booted(function () {

+ 1 - 2
app/Module/Game/AdminControllers/GameConfigController.php

@@ -459,9 +459,8 @@ class GameConfigController extends AdminController
     protected function getFarmShrineConfigInfo()
     {
         $data = FarmShrineJsonConfig::getData();
-        dd($data);
         $info = [
-            '生成时间'  => Datetime::ts2string($data['generated_ts']),
+            '生成时间'  => isset($data['generated_ts']) ? Datetime::ts2string($data['generated_ts']) : '未生成',
             '神像配置数量' => isset($data['shrine_configs']) ? count($data['shrine_configs']) : 0,
         ];