From 70430c318a92bb53e6ae89dd4a139731a94f0080 Mon Sep 17 00:00:00 2001 From: panliang <1163816051@qq.com> Date: Sat, 8 Oct 2022 14:47:44 +0800 Subject: [PATCH] user-address --- ...10_08_140932_create_user_address_table.php | 40 +++++++++ routes/api.php | 3 + src/Http/Api/AddressController.php | 88 +++++++++++++++++++ src/Http/Resources/UserAddressResource.php | 32 +++++++ src/Models/User.php | 15 ++-- src/Models/UserAddress.php | 33 +++++++ 6 files changed, 206 insertions(+), 5 deletions(-) create mode 100644 database/migrations/2022_10_08_140932_create_user_address_table.php create mode 100644 src/Http/Api/AddressController.php create mode 100644 src/Http/Resources/UserAddressResource.php create mode 100644 src/Models/UserAddress.php diff --git a/database/migrations/2022_10_08_140932_create_user_address_table.php b/database/migrations/2022_10_08_140932_create_user_address_table.php new file mode 100644 index 0000000..2c7f591 --- /dev/null +++ b/database/migrations/2022_10_08_140932_create_user_address_table.php @@ -0,0 +1,40 @@ +id(); + $table->unsignedBigInteger('user_id')->comment('用户ID'); + $table->string('contact_name')->comment('联系人'); + $table->string('phone')->comment('电话'); + $table->string('address')->comment('地址'); + $table->unsignedBigInteger('province_id')->nullable()->comment('省ID'); + $table->unsignedBigInteger('city_id')->nullable()->comment('市ID'); + $table->unsignedBigInteger('area_id')->nullable()->comment('区ID'); + $table->unsignedTinyInteger('is_default')->default(0)->comment('是否默认'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_address'); + } +}; diff --git a/routes/api.php b/routes/api.php index 4592592..50e497e 100644 --- a/routes/api.php +++ b/routes/api.php @@ -23,5 +23,8 @@ Route::group([ Route::group(['prefix' => 'user', 'middleware' => ['auth:api']], function () { Route::get('profile', [UserController::class, 'profile']); Route::put('profile', [UserController::class, 'update']); + + Route::get('address/default', [AddressController::class, 'default']); + Route::apiResource('address', AddressController::class); }); }); diff --git a/src/Http/Api/AddressController.php b/src/Http/Api/AddressController.php new file mode 100644 index 0000000..95b5e11 --- /dev/null +++ b/src/Http/Api/AddressController.php @@ -0,0 +1,88 @@ +user(); + $list = $user->addresses()->with(['province', 'city', 'area'])->sort()->paginate($request->input('per_page')); + + return $this->json(UserAddressResource::collection($list)); + } + + public function show($id) + { + $user = auth('api')->user(); + $address = $user->addresses()->findOrFail($id); + + return $this->json(UserAddressResource::make($address)); + } + + public function default() + { + $user = auth('api')->user(); + $info = $user->addresses()->with(['province', 'city', 'area'])->where(['is_default' => 1])->first(); + + return $this->json($info ? UserAddressResource::make($info) : null); + } + + public function store(Request $request) + { + $request->validate([ + 'contact_name' => 'required|max:20', + 'phone' => 'required|regex:/^1[3456789]\d{9}$/', + 'address' => 'required|max:50', + 'province_id' => 'integer', + 'city_id' => 'integer', + 'area_id' => 'integer', + 'is_default' => 'boolean', + ]); + $user = auth('api')->user(); + $address = $user->addresses()->create($request->input()); + if ($request->input('is_default')) { + // 将其他的地址 is_default = 0 + $user->addresses()->where('id', '!=', $address->id)->update(['is_default' => 0]); + } + + return $this->success('添加成功', UserAddressResource::make($address)); + } + + public function update($id, Request $request) + { + $request->validate([ + 'contact_name' => 'max:20', + 'phone' => 'regex:/^1[3456789]\d{9}$/', + 'address' => 'max:50', + 'province_id' => 'integer', + 'city_id' => 'integer', + 'area_id' => 'integer', + 'is_default' => 'boolean', + ]); + $user = auth('api')->user(); + $address = $user->addresses()->findOrFail($id); + $address->update($request->all()); + + // 设为默认 + if ($request->input('is_default')) { + // 将其他的地址 is_default = 0 + $user->addresses()->where('id', '!=', $address->id)->update(['is_default' => 0]); + } + + return $this->success('修改成功', UserAddressResource::make($address)); + } + + public function destroy($id) + { + $user = auth('api')->user(); + $address = $user->addresses()->findOrFail($id); + $address->delete(); + + return $this->success('删除成功'); + } +} diff --git a/src/Http/Resources/UserAddressResource.php b/src/Http/Resources/UserAddressResource.php new file mode 100644 index 0000000..bbf5a2a --- /dev/null +++ b/src/Http/Resources/UserAddressResource.php @@ -0,0 +1,32 @@ + $this->id, + 'contact_name' => $this->contact_name, + 'phone' => $this->phone, + 'address' => $this->address, + 'province_id' => $this->province_id, + 'province' => RegionResource::make($this->whenLoaded('province')), + 'city_id' => $this->city_id, + 'city' => RegionResource::make($this->whenLoaded('city')), + 'area_id' => $this->area_id, + 'area' => RegionResource::make($this->whenLoaded('area')), + 'is_default' => !!$this->is_default, + ]; + } +} diff --git a/src/Models/User.php b/src/Models/User.php index 93e5fd8..7c09fdd 100644 --- a/src/Models/User.php +++ b/src/Models/User.php @@ -59,6 +59,16 @@ class User extends Authenticatable return $this->hasMany(UserBalance::class, 'user_id'); } + public function orders() + { + return $this->hasMany(Order::class, 'user_id'); + } + + public function addresses() + { + return $this->hasMany(UserAddress::class, 'user_id'); + } + public function scopeSort($q) { return $q->latest('id'); @@ -75,9 +85,4 @@ class User extends Authenticatable // 18223350967 => 182****0967 return $this->phone ? substr_replace($this->phone, '****', 3, 4) : ''; } - - public function orders() - { - return $this->hasMany(Order::class, 'user_id'); - } } diff --git a/src/Models/UserAddress.php b/src/Models/UserAddress.php new file mode 100644 index 0000000..637b07e --- /dev/null +++ b/src/Models/UserAddress.php @@ -0,0 +1,33 @@ +belongsTo(Region::class); + } + + public function city() + { + return $this->belongsTo(Region::class); + } + + public function area() + { + return $this->belongsTo(Region::class); + } + + public function scopeSort($q) + { + return $q->orderBy('is_default', 'desc')->latest('created_at'); + } +}