diff --git a/app/Endpoint/Api/Http/Controllers/AddressController.php b/app/Endpoint/Api/Http/Controllers/AddressController.php new file mode 100644 index 00000000..e3f7be7c --- /dev/null +++ b/app/Endpoint/Api/Http/Controllers/AddressController.php @@ -0,0 +1,117 @@ +user()->addresses()->latest('id')->get(); + + return AddressResource::collection($addresses); + } + + /** + * 创建地址 + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\JsonResponse + */ + public function store(Request $request) + { + $input = $request->validate([ + 'consignee' => ['bail', 'required', 'string', 'max:150'], + 'telephone' => ['bail', 'required', new PhoneNumber()], + 'province' => ['bail', 'required', 'string', 'max:255'], + 'city' => ['bail', 'required', 'string', 'max:255'], + 'district' => ['bail', 'required', 'string', 'max:255'], + 'address' => ['bail', 'required', 'string', 'max:255'], + 'is_default' => ['bail', 'required', 'boolean'], + ]); + + $user = $request->user(); + + $address = $user->addresses()->create($input); + + // 如果当前地址变为默认地址,则将其它地址设为非默认地址 + if ($address->is_default) { + $user->addresses()->where('id', '!=', $address->id)->update([ + 'is_default' => false, + ]); + } + + return AddressResource::make($address); + } + + /** + * 查看地址 + * + * @param int $id + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\JsonResponse + */ + public function show($id, Request $request) + { + $address = $request->user()->addresses()->findOrFail($id); + + return AddressResource::make($address); + } + + /** + * 修改地址 + * + * @param int $id + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\JsonResponse + */ + public function update($id, Request $request) + { + $input = $request->validate([ + 'consignee' => ['bail', 'required', 'string', 'max:150'], + 'telephone' => ['bail', 'required', new PhoneNumber()], + 'province' => ['bail', 'required', 'string', 'max:255'], + 'city' => ['bail', 'required', 'string', 'max:255'], + 'district' => ['bail', 'required', 'string', 'max:255'], + 'address' => ['bail', 'required', 'string', 'max:255'], + 'is_default' => ['bail', 'required', 'boolean'], + ]); + + $user = $request->user(); + + $address = $user->addresses()->findOrFail($id); + $address->update($input); + + // 如果当前地址变更为默认地址,则将其它地址设为非默认地址 + if ($address->wasChanged('is_default') && $address->is_default) { + $user->addresses()->where('id', '!=', $address->id)->update([ + 'is_default' => false, + ]); + } + + return AddressResource::make($address); + } + + /** + * 删除地址 + * + * @param int $id + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function destroy($id, Request $request) + { + $request->user()->addresses()->where('id', $id)->delete(); + + return response()->noContent(); + } +} diff --git a/app/Endpoint/Api/Http/Resources/AddressResource.php b/app/Endpoint/Api/Http/Resources/AddressResource.php new file mode 100644 index 00000000..9c911be5 --- /dev/null +++ b/app/Endpoint/Api/Http/Resources/AddressResource.php @@ -0,0 +1,28 @@ + $this->id, + 'consignee' => $this->consignee, + 'telephone' => $this->telephone, + 'province' => $this->province, + 'city' => $this->city, + 'district' => $this->district, + 'address' => $this->address, + 'is_default' => $this->is_default, + ]; + } +} diff --git a/app/Endpoint/Api/routes.php b/app/Endpoint/Api/routes.php index 2d1f18cd..4c565e18 100644 --- a/app/Endpoint/Api/routes.php +++ b/app/Endpoint/Api/routes.php @@ -2,6 +2,7 @@ use App\Endpoint\Api\Http\Controllers\Account\UserController; use App\Endpoint\Api\Http\Controllers\AdController; +use App\Endpoint\Api\Http\Controllers\AddressController; use App\Endpoint\Api\Http\Controllers\Auth\LoginController; use App\Endpoint\Api\Http\Controllers\Auth\LogoutController; use App\Endpoint\Api\Http\Controllers\Auth\RegisterController; @@ -47,6 +48,8 @@ Route::group([ Route::get('me', [UserController::class, 'show']); Route::put('me', [UserController::class, 'update']); + Route::apiResource('addresses', AddressController::class); + // 收藏商品 Route::post('product/products/{product}/collect', [ProductSkuController::class, 'collect']); // 取消商品收藏 diff --git a/app/Models/Address.php b/app/Models/Address.php new file mode 100644 index 00000000..ed814e46 --- /dev/null +++ b/app/Models/Address.php @@ -0,0 +1,36 @@ + false, + ]; + + /** + * @var array + */ + protected $fillable = [ + 'user_id', + 'consignee', + 'telephone', + 'province', + 'city', + 'district', + 'address', + 'is_default', + ]; + + /** + * @var array + */ + protected $casts = [ + 'is_default' => 'bool', + ]; +} diff --git a/app/Models/User.php b/app/Models/User.php index e8c31953..ab8e5065 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -72,14 +72,20 @@ class User extends Model implements AuthorizableContract, AuthenticatableContrac /** * 用户的VIP信息 - * - * @return void */ public function userVip() { return $this->hasOne(UserVip::class, 'user_id'); } + /** + * 属于此用户的收货地址 + */ + public function addresses() + { + return $this->hasMany(Address::class); + } + /** * 禁用用户 * diff --git a/database/migrations/2021_12_03_175347_create_addresses_table.php b/database/migrations/2021_12_03_175347_create_addresses_table.php new file mode 100644 index 00000000..d8bb3199 --- /dev/null +++ b/database/migrations/2021_12_03_175347_create_addresses_table.php @@ -0,0 +1,39 @@ +id(); + $table->unsignedBigInteger('user_id')->index()->comment('用户ID'); + $table->string('consignee')->comment('收件人'); + $table->string('telephone')->comment('电话'); + $table->string('province')->comment('省'); + $table->string('city')->comment('市'); + $table->string('district')->comment('区'); + $table->string('address')->comment('地址'); + $table->boolean('is_default')->default(false)->comment('是否默认'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('addresses'); + } +} diff --git a/resources/lang/zh_CN/models.php b/resources/lang/zh_CN/models.php index 5272c27b..25def359 100644 --- a/resources/lang/zh_CN/models.php +++ b/resources/lang/zh_CN/models.php @@ -1,9 +1,11 @@ '地址', ProductSpu::class => '商品', ProductSku::class => '商品', ];