validate([ 'phone' => 'required|string', 'password' => 'required|string', ]); $customer = Customer::withoutGlobalScope('store') ->where('phone', $request->phone) ->first(); if (!$customer || !$customer->password) { return $this->error('手机号或密码错误', 40100, 401); } if (!\Hash::check($request->password, $customer->password)) { return $this->error('手机号或密码错误', 40100, 401); } if ($customer->status !== 1) { return $this->error('账号已停用,请联系门店', 40101, 403); } // 清除旧 client token $customer->tokens()->where('name', 'client')->delete(); $token = $customer->createToken('client')->plainTextToken; $customer->update(['last_login_at' => now()]); return $this->success([ 'token' => $token, 'customer' => $this->formatCustomer($customer), ]); } /** * 退出登录 */ public function logout(Request $request): JsonResponse { $request->user()->currentAccessToken()->delete(); return $this->success(null, '退出成功'); } /** * 获取当前客户信息 */ public function me(Request $request): JsonResponse { $customer = $request->user()->load(['families', 'contracts']); return $this->success($this->formatCustomer($customer)); } /** * 修改密码 */ public function changePassword(Request $request): JsonResponse { $request->validate([ 'old_password' => 'required|string', 'new_password' => 'required|string|min:6', ]); $customer = $request->user(); if (!\Hash::check($request->old_password, $customer->password)) { return $this->error('原密码不正确', 40001); } $customer->update(['password' => $request->new_password]); return $this->success(null, '密码修改成功'); } private function formatCustomer(Customer $c): array { return [ 'id' => $c->id, 'name' => $c->name, 'phone' => $c->phone, 'wechat' => $c->wechat, 'store_id' => $c->store_id, 'expected_date' => $c->expected_date?->toDateString(), 'actual_date' => $c->actual_date?->toDateString(), 'baby_count' => $c->baby_count, 'status' => $c->status, 'families' => $c->relationLoaded('families') ? $c->families : [], 'contracts' => $c->relationLoaded('contracts') ? $c->contracts : [], ]; } }