diff --git a/app/Endpoint/Api/Http/Controllers/ShoppingCartItemController.php b/app/Endpoint/Api/Http/Controllers/ShoppingCartItemController.php new file mode 100644 index 00000000..1df41c55 --- /dev/null +++ b/app/Endpoint/Api/Http/Controllers/ShoppingCartItemController.php @@ -0,0 +1,96 @@ +user()->shoppingCartItems()->with(['sku'])->has('sku')->latest('id')->get(); + + return ShoppingCartItemResource::collection($items); + } + + /** + * 添加购物车商品 + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $input = $request->validate([ + 'sku_id' => ['bail', 'required'], + 'qty' => ['bail', 'required', 'int', 'min:1'], + ]); + + $sku = ProductSku::whereRelation('category', 'is_show', true)->online()->find($input['sku_id']); + + if ($sku === null) { + throw new BizException(__('Product has been removed')); + } + + $item = $request->user()->shoppingCartItems()->firstOrCreate([ + 'sku_id' => $sku->id, + ], [ + 'qty' => $input['qty'], + ]); + + if (! $item->wasRecentlyCreated) { + $item->increment('qty', $input['qty']); + } + + return response()->noContent(); + } + + /** + * 修改购物车商品 + * + * @param int $id + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function update($id, Request $request) + { + $input = $request->validate([ + 'qty' => ['bail', 'required', 'int', 'min:1'], + ]); + + $item = $request->user()->shoppingCartItems()->find($id); + + if ($item === null) { + } + + $item->update($input); + + return response()->noContent(); + } + + /** + * 删除购物车商品 + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function delete(Request $request) + { + $input = $request->validate([ + 'ids' => ['bail', 'required', 'array'], + ]); + + $request->user()->shoppingCartItems()->whereIn('id', $input['ids'])->delete(); + + return response()->noContent(); + } +} diff --git a/app/Endpoint/Api/Http/Resources/ShoppingCartItemResource.php b/app/Endpoint/Api/Http/Resources/ShoppingCartItemResource.php new file mode 100644 index 00000000..c4205e34 --- /dev/null +++ b/app/Endpoint/Api/Http/Resources/ShoppingCartItemResource.php @@ -0,0 +1,24 @@ + $this->id, + 'sku' => ProductSkuSimpleResource::make($this->whenLoaded('sku')), + 'qty' => $this->qty, + ]; + } +} diff --git a/app/Endpoint/Api/routes.php b/app/Endpoint/Api/routes.php index e95c03ae..e4d11e1d 100644 --- a/app/Endpoint/Api/routes.php +++ b/app/Endpoint/Api/routes.php @@ -13,6 +13,7 @@ use App\Endpoint\Api\Http\Controllers\Product\ProductCategoryController; use App\Endpoint\Api\Http\Controllers\Product\ProductSkuController; use App\Endpoint\Api\Http\Controllers\Product\ProductSkuFavoriteController; use App\Endpoint\Api\Http\Controllers\Product\ProductViewLogController; +use App\Endpoint\Api\Http\Controllers\ShoppingCartItemController; use App\Endpoint\Api\Http\Controllers\SmsCodeController; use Illuminate\Support\Facades\Route; @@ -58,5 +59,11 @@ Route::group([ Route::get('product/view-logs', [ProductViewLogController::class, 'index']); // 商品收藏记录 Route::get('product/favorites', [ProductSkuFavoriteController::class, 'index']); + + // 购物车 + Route::get('shopping-cart-items', [ShoppingCartItemController::class, 'index']); + Route::post('shopping-cart-items', [ShoppingCartItemController::class, 'store']); + Route::delete('shopping-cart-items', [ShoppingCartItemController::class, 'delete']); + Route::put('shopping-cart-items/{shopping_cart_item}', [ShoppingCartItemController::class, 'update']); }); }); diff --git a/app/Models/ShoppingCartItem.php b/app/Models/ShoppingCartItem.php new file mode 100644 index 00000000..db000405 --- /dev/null +++ b/app/Models/ShoppingCartItem.php @@ -0,0 +1,32 @@ + 'int', + ]; + + /** + * @var array + */ + protected $fillable = [ + 'user_id', + 'sku_id', + 'qty', + ]; + + /** + * 此购物车物品所属的商品 + */ + public function sku() + { + return $this->belongsTo(ProductSku::class); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index ab8e5065..109e391e 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -79,11 +79,11 @@ class User extends Model implements AuthorizableContract, AuthenticatableContrac } /** - * 属于此用户的收货地址 + * 属于此用户的购物车中的商品 */ - public function addresses() + public function shoppingCartItems() { - return $this->hasMany(Address::class); + return $this->hasMany(ShoppingCartItem::class); } /** diff --git a/database/migrations/2021_12_06_171251_create_shopping_cart_items_table.php b/database/migrations/2021_12_06_171251_create_shopping_cart_items_table.php new file mode 100644 index 00000000..7580195b --- /dev/null +++ b/database/migrations/2021_12_06_171251_create_shopping_cart_items_table.php @@ -0,0 +1,36 @@ +id(); + $table->unsignedBigInteger('user_id')->comment('用户ID'); + $table->unsignedBigInteger('sku_id')->comment('商品ID'); + $table->unsignedInteger('qty')->default(0)->comment('购买数量'); + $table->timestamps(); + + $table->unique(['user_id', 'sku_id']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('shopping_cart_items'); + } +} diff --git a/resources/lang/zh_CN.json b/resources/lang/zh_CN.json index bf3c3ebc..1b7679cf 100644 --- a/resources/lang/zh_CN.json +++ b/resources/lang/zh_CN.json @@ -6,6 +6,7 @@ "Invalid verification code type": "无效的验证码类型", "Invalid old password": "原密码错误", "Inviter does not exist": "邀请人不存在", + "Product has been removed": "商品已下架", "Registration failed, please try again": "注册失败,请重试", "Sending too frequently, please try again later": "发送过于频繁,请稍后再试", "The phone number is already registered": "手机号码已被注册",