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::group(['prefix' => 'user', 'middleware' => ['auth:api']], function () {
|
||||||
Route::get('profile', [UserController::class, 'profile']);
|
Route::get('profile', [UserController::class, 'profile']);
|
||||||
Route::put('profile', [UserController::class, 'update']);
|
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');
|
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)
|
public function scopeSort($q)
|
||||||
{
|
{
|
||||||
return $q->latest('id');
|
return $q->latest('id');
|
||||||
|
|
@ -75,9 +85,4 @@ class User extends Authenticatable
|
||||||
// 18223350967 => 182****0967
|
// 18223350967 => 182****0967
|
||||||
return $this->phone ? substr_replace($this->phone, '****', 3, 4) : '';
|
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