Browse Source

统一字段

doge 16 hours ago
parent
commit
0c8faf14af

+ 2 - 1
app/Http/Controllers/api/ActivityReward.php

@@ -172,7 +172,7 @@ class ActivityReward extends BaseController
             request()->validate(['member_id' => ['nullable', 'string'], 'platform' => ['nullable', 'string', 'in:PC,H5,APP']]);
             $memberId = request()->input('member_id');
             $context = ActivityEligibilityService::memberContext($memberId);
-            $platform = request()->input('platform');
+            $platform = ContentLink::requestPlatform();
             $time = time();
             $query = ActivityRewardModel::where(ActivityRewardService::getWhere([
 //                'start_time' => ['<=', $time],
@@ -205,6 +205,7 @@ class ActivityReward extends BaseController
             })->toArray();
             $list = array_map(function (array $row) use ($platform) {
                 $row = array_replace($row, ContentLink::forPlatform($row, $platform));
+                unset($row['link_pc'], $row['link_h5']);
                 $row['can_jump'] = $row['click_type'] !== 'none' && !empty($row['link']) && $row['click_position'] !== null;
                 return $row;
             }, $list);

+ 7 - 1
app/Support/ContentLink.php

@@ -58,7 +58,13 @@ final class ContentLink
                 default => $links['link_pc'] === $links['link_h5'] ? $links['link_pc'] : null,
             };
         }
-        return $links;
+        return array_intersect_key($links, ['click_type' => true, 'link' => true]);
+    }
+
+    public static function requestPlatform(): string
+    {
+        $platform = request()->header('Platform');
+        return is_string($platform) ? (ActivityEligibility::normalizePlatform($platform) ?? 'PC') : 'PC';
     }
 
     public static function valid(string $value, string $type): bool

+ 3 - 3
docs/前端接口/公告PC与H5站内路径-前端接入.md

@@ -17,13 +17,13 @@
 
 `GET /admin/announcement` 的 `data.data[]`、`GET /admin/announcement/detail?id=7` 的 `data` 均返回这两个字段,编辑时分别回填。编辑时省略某一路径会保留原值。
 
-前台仍请求 `GET /api/announcement/lists?platform=PC`,H5 传 `platform=H5`,APP 传 `platform=APP`。`data.list[]` 示例:
+前台请求 `GET /api/announcement/lists`,自动读取请求头 `Platform`:`H5` 使用 H5 路径,`PC` 或未传时使用 PC 路径,`APP` 使用 H5 路径。无需提交 `platform` 参数。`data.list[]` 示例:
 
 ```json
-{"click_type":"internal","link_pc":"/pc/notice?id=7","link_h5":"/h5/notice?id=7","link":"/pc/notice?id=7","can_jump":true}
+{"click_type":"internal","link":"/h5/notice?id=7","can_jump":true}
 ```
 
-`link` 已按请求的 `platform` 选择对应路径。`can_jump=true` 时,用站内路由打开 `link`;否则不跳转。
+前台只接收选好的 `link`,不返回 `link_pc/link_h5`。`can_jump=true` 时,用站内路由打开 `link`;否则不跳转。
 
 选择「外站链接」仍提交 `click_type=external` 和完整 HTTP/HTTPS `link`,不需要两个站内路径。选择「无链接」提交 `click_type=none`,全部链接清空。
 

+ 3 - 3
docs/前端接口/活动/活动PC与H5站内路径-前端接入.md

@@ -18,7 +18,7 @@
 
 `GET /admin/ActivityReward` 的 `data.data[]` 返回两个路径和 `click_position`,编辑时分别回填。编辑时省略某一路径会保留原值。
 
-前台接口均传当前端的 `platform=PC/H5/APP`:
+前台接口自动读取请求头 `Platform`:`H5` 使用 H5 路径,`PC` 或未传时使用 PC 路径,`APP` 使用 H5 路径。无需提交 `platform` 参数:
 
 | 接口 | 字段位置 |
 | --- | --- |
@@ -26,10 +26,10 @@
 | `GET /api/index/activityInfo?id=5` | `data` |
 
 ```json
-{"click_type":"internal","link_pc":"/pc/promotion?id=5","link_h5":"/h5/promotion?id=5","link":"/h5/promotion?id=5","click_position":"detail","can_jump":true}
+{"click_type":"internal","link":"/h5/promotion?id=5","click_position":"detail","can_jump":true}
 ```
 
-上例为 H5 返回值,`link` 已按请求的 `platform` 选择对应路径,APP 使用 H5 路径。
+上例为 H5 返回值。前台只接收选好的 `link`,不返回 `link_pc/link_h5`。
 
 - `can_jump=true`、`click_position=cover`:点击封面,用站内路由打开 `link`。
 - `can_jump=true`、`click_position=detail`:封面进入活动详情,详情按钮用站内路由打开 `link`。

+ 6 - 2
tests/Integration/ActivityCatalogTest.php

@@ -160,12 +160,16 @@ class ActivityCatalogTest extends TestCase
     {
         $this->assertSame(HttpStatus::OK, $this->save(['type' => 1, 'click_type' => 'internal', 'link_pc' => '/pc/promo', 'link_h5' => '/h5/promo', 'click_position' => 'cover',
             'start_time' => '2000-01-01', 'end_time' => '2099-12-31'])['code']);
-        foreach (['PC' => '/pc/promo', 'H5' => '/h5/promo', 'APP' => '/h5/promo'] as $platform => $target) {
-            $this->app->instance('request', Request::create('/api/ActivityReward', 'GET', ['platform' => $platform]));
+        foreach (['PC' => '/pc/promo', 'H5' => '/h5/promo', 'APP' => '/h5/promo', 'h5' => '/h5/promo', '' => '/pc/promo'] as $platform => $target) {
+            $request = Request::create('/api/ActivityReward', 'GET', ['platform' => $platform === 'PC' ? 'H5' : 'PC']);
+            if ($platform !== '') $request->headers->set('Platform', $platform);
+            $this->app->instance('request', $request);
             $body = (new \App\Http\Controllers\api\ActivityReward())->index()->getData(true);
             $this->assertSame(0, $body['code'], $body['msg']);
             $this->assertSame($target, $body['data'][0]['link']);
             $this->assertTrue($body['data'][0]['can_jump']);
+            $this->assertArrayNotHasKey('link_pc', $body['data'][0]);
+            $this->assertArrayNotHasKey('link_h5', $body['data'][0]);
         }
     }
 

+ 2 - 1
tests/Integration/ActivityRewardEligibilityTest.php

@@ -194,6 +194,7 @@ class ActivityRewardEligibilityTest extends TestCase
     private function list(array $params = []): array
     {
         $this->request('/api/ActivityReward', $params);
+        if (isset($params['platform']) && is_string($params['platform'])) request()->headers->set('Platform', $params['platform']);
         $result = (new ApiActivityReward())->index()->getData(true);
         $this->assertSame(0, $result['code'], $result['msg']);
         return $result['data'];
@@ -597,7 +598,7 @@ class ActivityRewardEligibilityTest extends TestCase
             $rows = $this->list(['member_id' => '1001', 'platform' => $platform]);
             $this->assertSame([$all->id, $specific->id], array_column($rows, 'id'), $platform);
         }
-        $this->assertSame([$all->id], array_column($this->list(['member_id' => '1001']), 'id'));
+        $this->assertSame([$all->id, $pc->id], array_column($this->list(['member_id' => '1001']), 'id'));
         $this->request('/api/ActivityReward', ['platform' => 'INVALID']);
         $this->assertNotSame(0, (new ApiActivityReward())->index()->getData(true)['code']);
     }