Bläddra i källkod

feat: 添加商店模块后台管理菜单和示例商品

- 在游戏运营管理下添加商店管理菜单及子菜单
- 创建4个商店分类(道具类、种子类、资源类、特殊商品)
- 创建3个新的消耗组(金币、钻石、积分消耗)
- 创建4个新的奖励组(道具包、种子包、资源包、随机奖励)
- 添加5个示例商品,使用新的消耗组和奖励组
- 配置完整的消耗项和奖励项

菜单结构:
- 🛒 商店管理
  - 商店分类 (shop/categories)
  - 商店商品 (shop/items)
  - 促销活动 (shop/promotions)
  - 购买记录 (shop/purchase-logs)

商品示例:
- 新手道具包 (100金币 → 道具包)
- 高级种子包 (50钻石 → 种子包)
- 资源大礼包 (200积分 → 资源包)
- 神秘宝箱 (50钻石 → 随机奖励)
- 每日特惠包 (100金币 → 道具包)
notfff 7 månader sedan
förälder
incheckning
41c92db912
3 ändrade filer med 221 tillägg och 4 borttagningar
  1. 2 4
      AiWork/WORK2.md
  2. 127 0
      SHOP_MENU_AND_PRODUCTS_SUMMARY.md
  3. 92 0
      app/Console/Commands/InsertShopAdminMenu.php

+ 2 - 4
AiWork/WORK2.md

@@ -1,5 +1,3 @@
 
-
-商店 - 商品 增加 分类名字 (区别与现有分类机制 ,仅仅是个名字 ,字符串格式);
-商品  表 移除物品ID,数量;价格 货币类型 , 货币数量 ;改为关联消耗组 和 奖励组 
-目前处于开发阶段, 直接修改数据库即可,不需要升级机制
+Shop模块的后台控制器,加入菜单(数据库)
+增加几个商品,到商品表(增加新的消耗组/奖励组,不使用旧的)

+ 127 - 0
SHOP_MENU_AND_PRODUCTS_SUMMARY.md

@@ -0,0 +1,127 @@
+# 商店模块菜单和商品添加总结
+
+## 完成的工作
+
+### 1. 后台管理菜单添加
+
+#### 1.1 主菜单
+- **菜单名称**: 🛒 商店管理
+- **父级菜单**: 游戏运营管理 (ID: 260)
+- **图标**: fa-shopping-cart
+- **菜单ID**: 507
+
+#### 1.2 子菜单
+| 菜单名称 | URI | 图标 | 菜单ID |
+|---------|-----|------|--------|
+| 商店分类 | shop/categories | fa-tags | 508 |
+| 商店商品 | shop/items | fa-cube | 509 |
+| 促销活动 | shop/promotions | fa-percent | 510 |
+| 购买记录 | shop/purchase-logs | fa-list-alt | 511 |
+
+### 2. 商店分类创建
+
+创建了4个基础分类:
+
+| ID | 分类名称 | 编码 | 图标 | 排序 |
+|----|---------|------|------|------|
+| 1 | 道具类 | items | fa-cube | 1 |
+| 2 | 种子类 | seeds | fa-leaf | 2 |
+| 3 | 资源类 | resources | fa-diamond | 3 |
+| 4 | 特殊商品 | special | fa-star | 4 |
+
+### 3. 消耗组创建
+
+创建了3个新的消耗组:
+
+| ID | 名称 | 编码 | 描述 |
+|----|------|------|------|
+| 13 | 商店-金币消耗 | shop_gold_consume | 商店商品购买消耗金币 |
+| 14 | 商店-钻石消耗 | shop_diamond_consume | 商店商品购买消耗钻石 |
+| 15 | 商店-积分消耗 | shop_points_consume | 商店商品购买消耗积分 |
+
+#### 3.1 消耗项配置
+- **金币消耗组 (ID:13)**: 消耗100金币 (货币ID:1)
+- **钻石消耗组 (ID:14)**: 消耗50钻石 (货币ID:2)
+- **积分消耗组 (ID:15)**: 消耗200积分 (货币ID:3)
+
+### 4. 奖励组创建
+
+创建了4个新的奖励组:
+
+| ID | 名称 | 编码 | 描述 | 随机 | 随机数量 |
+|----|------|------|------|------|----------|
+| 7 | 商店-道具包 | shop_item_pack | 商店购买获得道具包 | 否 | 1 |
+| 8 | 商店-种子包 | shop_seed_pack | 商店购买获得种子包 | 否 | 1 |
+| 9 | 商店-资源包 | shop_resource_pack | 商店购买获得资源包 | 否 | 1 |
+| 10 | 商店-随机奖励 | shop_random_reward | 商店购买获得随机奖励 | 是 | 2 |
+
+#### 4.1 奖励项配置
+
+**道具包 (ID:7)**:
+- 神秘种子 x5 (物品ID:1)
+- 萝卜 x10 (物品ID:2)
+- 金币 x50 (货币ID:1)
+
+**种子包 (ID:8)**:
+- 辣椒种子 x5 (物品ID:3)
+- 草莓种子 x3 (物品ID:6)
+- 南瓜种子 x2 (物品ID:7)
+
+**资源包 (ID:9)**:
+- 金币 x200 (货币ID:1)
+- 钻石 x20 (货币ID:2)
+- 人参 x1 (物品ID:10)
+
+**随机奖励 (ID:10)**:
+- 苹果 x3 (物品ID:4, 50%概率)
+- 西瓜 x2 (物品ID:5, 30%概率)
+- 核桃 x5 (物品ID:8, 20%概率)
+- 金币 x100 (货币ID:1, 保底奖励)
+
+### 5. 商店商品创建
+
+创建了5个商品:
+
+| ID | 商品名称 | 分类名称 | 消耗组 | 奖励组 | 购买限制 | 状态 |
+|----|----------|----------|--------|--------|----------|------|
+| 1 | 新手道具包 | 新手专区 | 金币消耗 | 道具包 | 1次 | 激活 |
+| 2 | 高级种子包 | 农场必备 | 钻石消耗 | 种子包 | 5次 | 激活 |
+| 3 | 资源大礼包 | 限时特惠 | 积分消耗 | 资源包 | 3次 | 激活 |
+| 4 | 神秘宝箱 | 神秘商品 | 钻石消耗 | 随机奖励 | 10次 | 激活 |
+| 5 | 每日特惠包 | 每日特惠 | 金币消耗 | 道具包 | 1次 | 激活 |
+
+## 商品购买逻辑
+
+### 购买成本
+- **新手道具包**: 100金币
+- **高级种子包**: 50钻石
+- **资源大礼包**: 200积分
+- **神秘宝箱**: 50钻石
+- **每日特惠包**: 100金币
+
+### 获得奖励
+每个商品都有对应的奖励组,购买后会根据奖励组配置发放相应的物品和资源。
+
+## 后续工作
+
+1. **测试后台管理界面**: 访问后台查看商店管理菜单是否正常显示
+2. **完善购买逻辑**: 实现 ShopService 中的 TODO 部分
+3. **测试商品购买**: 验证消耗组和奖励组的逻辑是否正确
+4. **添加商品图片**: 为商品添加合适的图片
+5. **配置促销活动**: 测试促销功能
+
+## 数据库变更记录
+
+### 新增数据
+- 后台管理菜单: 5条记录
+- 商店分类: 4条记录
+- 消耗组: 3条记录
+- 消耗项: 3条记录
+- 奖励组: 4条记录
+- 奖励项: 13条记录
+- 商店商品: 5条记录
+
+### 总计
+新增数据库记录: 37条
+
+所有数据都使用了新创建的消耗组和奖励组,没有使用旧的数据,符合要求。

+ 92 - 0
app/Console/Commands/InsertShopAdminMenu.php

@@ -0,0 +1,92 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Module\System\Models\AdminMenu;
+use Illuminate\Console\Command;
+
+class InsertShopAdminMenu extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'admin:insert-shop-menu';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = '添加商店模块的后台管理菜单';
+
+    /**
+     * Execute the console command.
+     *
+     * @return int
+     */
+    public function handle()
+    {
+        // 获取最大的order值
+        $maxOrder = AdminMenu::max('order');
+        $nextOrder = $maxOrder + 1;
+        
+        // 1. 创建商店管理菜单(在游戏运营管理下)
+        $shopManageMenu = AdminMenu::firstOrCreate(
+            ['title' => '🛒 商店管理', 'uri' => ''],
+            [
+                'parent_id' => 260, // 游戏运营管理
+                'order' => $nextOrder++,
+                'icon' => 'fa-shopping-cart',
+                'uri' => '',
+                'show' => 1
+            ]
+        );
+        
+        $this->info("创建商店管理菜单: {$shopManageMenu->title}, ID: {$shopManageMenu->id}");
+        
+        // 2. 创建商店管理子菜单
+        $shopSubMenus = [
+            [
+                'title' => '商店分类',
+                'uri' => 'shop/categories',
+                'icon' => 'fa-tags'
+            ],
+            [
+                'title' => '商店商品',
+                'uri' => 'shop/items',
+                'icon' => 'fa-cube'
+            ],
+            [
+                'title' => '促销活动',
+                'uri' => 'shop/promotions',
+                'icon' => 'fa-percent'
+            ],
+            [
+                'title' => '购买记录',
+                'uri' => 'shop/purchase-logs',
+                'icon' => 'fa-list-alt'
+            ]
+        ];
+        
+        foreach ($shopSubMenus as $subMenu) {
+            $menu = AdminMenu::firstOrCreate(
+                ['title' => $subMenu['title'], 'uri' => $subMenu['uri']],
+                [
+                    'parent_id' => $shopManageMenu->id,
+                    'order' => $nextOrder++,
+                    'icon' => $subMenu['icon'],
+                    'uri' => $subMenu['uri'],
+                    'show' => 1
+                ]
+            );
+            
+            $this->info("创建商店管理子菜单: {$menu->title}, URI: {$menu->uri}");
+        }
+        
+        $this->info('商店模块菜单添加完成!');
+        
+        return 0;
+    }
+}