4
0
Fork 0

user-address

master
panliang 2022-10-08 14:47:44 +08:00
parent 36c9f30764
commit 70430c318a
6 changed files with 206 additions and 5 deletions

View File

@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('user_addresses', function (Blueprint $table) {
$table->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');
}
};

View File

@ -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);
});
});

View File

@ -0,0 +1,88 @@
<?php
namespace Peidikeji\User\Http\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Peidikeji\User\Http\Resources\UserAddressResource;
class AddressController extends Controller
{
public function index(Request $request)
{
$user = auth('api')->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('删除成功');
}
}

View File

@ -0,0 +1,32 @@
<?php
namespace Peidikeji\User\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
use Peidikeji\Region\Http\Resources\RegionResource;
class UserAddressResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
return [
'id' => $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,
];
}
}

View File

@ -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');
}
}

View File

@ -0,0 +1,33 @@
<?php
namespace Peidikeji\User\Models;
use Illuminate\Database\Eloquent\Model;
use Peidikeji\Region\Models\Region;
class UserAddress extends Model
{
protected $fillable = [
'user_id', 'contact_name', 'phone', 'address', 'province_id', 'city_id', 'area_id', 'is_default',
];
public function province()
{
return $this->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');
}
}