user-address
parent
36c9f30764
commit
70430c318a
|
|
@ -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');
|
||||
}
|
||||
};
|
||||
|
|
@ -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);
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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('删除成功');
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue