diff --git a/app/Endpoint/Api/Http/Controllers/Product/ProductSkuController.php b/app/Endpoint/Api/Http/Controllers/Product/ProductSkuController.php index 24c370df..a00a8f40 100644 --- a/app/Endpoint/Api/Http/Controllers/Product/ProductSkuController.php +++ b/app/Endpoint/Api/Http/Controllers/Product/ProductSkuController.php @@ -5,6 +5,7 @@ namespace App\Endpoint\Api\Http\Controllers\Product; use App\Endpoint\Api\Http\Controllers\Controller; use App\Endpoint\Api\Http\Resources\ProductSku\ProduckSkuResource; use App\Endpoint\Api\Http\Resources\ProductSku\ProductSkuSimpleResource; +use App\Events\ProductSku\Viewed; use App\Helpers\Paginator as PaginatorHelper; use App\Models\ProductPart; use App\Models\ProductPartSku; @@ -13,7 +14,7 @@ use App\Models\ProductSpu; use Illuminate\Http\Request; use Illuminate\Pagination\Paginator; -class ProductController extends Controller +class ProductSkuController extends Controller { /** * 筛选商品 @@ -100,6 +101,8 @@ class ProductController extends Controller } } + Viewed::dispatch($request->user(), $sku, now()); + return response()->json([ 'spu_specs' => $spuSpecs, 'sku' => array_merge(ProduckSkuResource::make($sku)->resolve(), [ diff --git a/app/Events/ProductSku/Viewed.php b/app/Events/ProductSku/Viewed.php new file mode 100644 index 00000000..1a906ade --- /dev/null +++ b/app/Events/ProductSku/Viewed.php @@ -0,0 +1,27 @@ +user === null) { + return; + } + + try { + ProductViewLog::updateOrCreate([ + 'user_id' => $event->user->id, + 'spu_id' => $event->sku->spu_id, + 'view_date' => $event->viewedAt->toDateString(), + ], [ + 'sku_id' => $event->sku->id, + ]); + } catch (Exception $e) { + report($e); + } + } +} diff --git a/app/Models/ProductViewLog.php b/app/Models/ProductViewLog.php new file mode 100644 index 00000000..44280b83 --- /dev/null +++ b/app/Models/ProductViewLog.php @@ -0,0 +1,33 @@ + 'date', + ]; + + /** + * @var array + */ + protected $fillable = [ + 'user_id', + 'spu_id', + 'sku_id', + 'view_date', + ]; + + /** + * 此浏览记录所属的商品 sku + */ + public function sku() + { + return $this->belongsTo(ProductSku::class, 'sku_id'); + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index a9f10a63..95870462 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -2,8 +2,6 @@ namespace App\Providers; -use Illuminate\Auth\Events\Registered; -use Illuminate\Auth\Listeners\SendEmailVerificationNotification; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Event; @@ -15,8 +13,8 @@ class EventServiceProvider extends ServiceProvider * @var array */ protected $listen = [ - Registered::class => [ - SendEmailVerificationNotification::class, + \App\Events\ProductSku\Viewed::class => [ + \App\Listeners\CreateProductViewLog::class, ], ]; diff --git a/database/migrations/2021_12_02_152813_create_product_view_logs_table.php b/database/migrations/2021_12_02_152813_create_product_view_logs_table.php new file mode 100644 index 00000000..80713404 --- /dev/null +++ b/database/migrations/2021_12_02_152813_create_product_view_logs_table.php @@ -0,0 +1,37 @@ +id(); + $table->unsignedBigInteger('user_id')->comment('用户ID'); + $table->unsignedBigInteger('spu_id')->comment('SPU ID'); + $table->unsignedBigInteger('sku_id')->comment('SKU ID'); + $table->date('view_date')->comment('查看日期'); + $table->timestamps(); + + $table->unique(['user_id', 'spu_id', 'view_date']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('product_view_logs'); + } +}