diff --git a/app/Http/Controllers/LoginController.php b/app/Http/Controllers/LoginController.php index 5cc65fb..b4ba140 100644 --- a/app/Http/Controllers/LoginController.php +++ b/app/Http/Controllers/LoginController.php @@ -48,9 +48,9 @@ public function handleProviderCallback(Request $request) $user = Socialite::driver('line')->user(); Log::info('line', ['user' => $user]); $lineId = $user->getId(); - $name = $user->getName(); + $name = $user->getName(); $avatar = $user->getAvatar() ?? ''; - $email = $user->getEmail() ?? ''; + $email = $user->getEmail() ?? ''; Log::info('email', [$email]); @@ -64,12 +64,12 @@ public function handleProviderCallback(Request $request) Auth::guard('web')->login($existingUser); } else { $newUser = User::create([ - 'name' => $name, - 'line_id' => $lineId, + 'name' => $name, + 'line_id' => $lineId, 'password' => bcrypt(env('DEFAULT_PASSWORD')), - 'avatar' => $avatar, - 'source' => 'cafeg', - 'email' => $email, + 'avatar' => $avatar, + 'source' => 'cafeg', + 'email' => $email, ]); Auth::guard('web')->login($newUser); } @@ -87,12 +87,13 @@ public function handleProviderCallback(Request $request) Auth::guard('member')->login($existingUser); } else { $newUser = Member::create([ - 'name' => $name, - 'line_id' => $lineId, + 'name' => $name, + 'line_id' => $lineId, 'password' => bcrypt(env('DEFAULT_PASSWORD')), - 'avatar' => $avatar, - 'source' => 'cafeg', - 'email' => $email, + 'source' => 'cafeg', + 'avatar' => $avatar, + + 'email' => $email, ]); Auth::guard('member')->login($newUser); } @@ -138,4 +139,39 @@ public function memberNormalLogin(Request $request) return redirect()->route('front.login.view')->with('error', '帳號密碼錯誤'); } } + + // 重定向到 Google + public function redirectToGoogle() + { + return Socialite::driver('google')->redirect(); + } + + // 處理 Google 回調 + public function handleGoogleCallback() + { + try { + $googleUser = Socialite::driver('google')->stateless()->user(); + + // 查找或創建用戶 + $user = Member::firstOrCreate( + ['email' => $googleUser->getEmail()], + [ + 'name' => $googleUser->getName(), + 'google_id' => $googleUser->getId(), + 'avatar' => $googleUser->getAvatar(), + 'password' => bcrypt(env('DEFAULT_PASSWORD')), + 'source' => 'cafeg', + ] + ); + \Log::info('google Oauth :', [$user]); + + + // 登入用戶 + Auth::guard('member')->login($user, true); + + return redirect()->route('member.index'); // 登入後跳轉的路徑 + } catch (\Exception $e) { + return redirect('/')->with('error', '無法進行 Google 登入'); + } + } } diff --git a/app/Http/Controllers/front/MemberController.php b/app/Http/Controllers/front/MemberController.php index 57b397c..3dc851c 100644 --- a/app/Http/Controllers/front/MemberController.php +++ b/app/Http/Controllers/front/MemberController.php @@ -91,4 +91,15 @@ public function checkPhone(Request $request) return response()->json(['status' => 'success', 'msg' => '該電話號碼可用']); } + public function checkEmail(Request $request) + { + + $user = Member::where('email', $request->email)->first(); + + if ($user) { + return response()->json(['status' => 'error', 'msg' => '該email已被其他帳戶使用']); + } + + return response()->json(['status' => 'success', 'msg' => '該email號碼可用']); + } } diff --git a/app/Http/Controllers/front/RegisterController.php b/app/Http/Controllers/front/RegisterController.php index a9e8e09..a9d0d1c 100644 --- a/app/Http/Controllers/front/RegisterController.php +++ b/app/Http/Controllers/front/RegisterController.php @@ -7,7 +7,8 @@ use Exception; use App\Models\EmailVerifications; use Mail; - +use Log; +use Auth; class RegisterController extends Controller { /** @@ -45,7 +46,13 @@ public function create(Request $request) } - + /** + * Summary of forgotPassword 設定密碼頁面 + * @param mixed $id + * @param mixed $token + * @param \Illuminate\Http\Request $request + * @return mixed + */ public function forgotPassword(Request $request) { @@ -57,13 +64,13 @@ public function sendForgotPassword(Request $request) \Log::info('sendForgotPassword', []); $subject = "卡菲姬系統-密碼重新設定"; $token = \Str::random(32); - $result = Member::where('email', $request->email)->first(); + $result = Member::where('email', $request->email)->firstOrFail(); try { if (!isset($result)) { throw new Exception("找不到帳號", 404); } else { - $verificationLink = route('reset.password.token', ['token' => $token, 'id' => $result->id]); + $verificationLink = route('change.password', ['token' => $token, 'id' => $result->id]); \Log::info('sendForgotPassword go EmailVerifications', []); $res = EmailVerifications::where('email', $request->email)->first(); @@ -128,24 +135,44 @@ public function resetPassword(Request $request) } - + /** + * Summary of changePassword view + * @param $id + * @param \Illuminate\Http\Request $request + * @return mixed + */ public function changePassword(Request $request) { - return view('front.auth.confirmpassword'); + Log::info('request on changePassword : ', $request->all()); + + return view('front.auth.confirmpassword', ['id' => $request->id]); } - public function confrimPassword(Request $request) + + /** + * Summary of resetPasswordProcess + * @param mixed $id + * @method put + * @param \Illuminate\Http\Request $request + * @return mixed + */ + public function resetPasswordProcess(Request $request) { + if ($request->has('id')) { + $member = Member::where('id', $request->id)->first(); + $member->password = bcrypt($request->password); + $member->save(); + if ($member) { + EmailVerifications::where('email', $member->email)->delete(); + } - return view('front.auth.confirmpassword'); + Auth::guard('member')->login($member); - } - - public function resetPasswordProcess($id, Request $request) - { + } + return redirect()->route('member.index'); } @@ -154,7 +181,7 @@ public function resetPasswordProcess($id, Request $request) */ public function store(Request $request) { - // + } /** diff --git a/config/services.php b/config/services.php index 5c0c098..af602e7 100644 --- a/config/services.php +++ b/config/services.php @@ -34,10 +34,18 @@ 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), ], ], + 'line' => [ 'client_id' => env('LINE_CLIENT_ID'), 'client_secret' => env('LINE_CLIENT_SECRET'), 'redirect' => env('LINE_REDIRECT_URI'), ], + 'google' => [ + 'client_id' => env('GOOGLE_CLIENT_ID'), + 'client_secret' => env('GOOGLE_CLIENT_SECRET'), + 'redirect' => env('GOOGLE_REDIRECT_URI'), + ], + + ]; diff --git a/resources/views/admin/profile/index.blade.php b/resources/views/admin/profile/index.blade.php index 22b7c6d..07fc885 100644 --- a/resources/views/admin/profile/index.blade.php +++ b/resources/views/admin/profile/index.blade.php @@ -115,7 +115,7 @@ class="input-group-text cursor-pointer" class="form-control" placeholder="確認密碼" aria-label="確認密碼" - value="{{$data->password ?? ''}}" + value=" " /> @@ -218,7 +218,7 @@ class="btn btn-outline-secondary" - +{{-- --}} diff --git a/resources/views/front/auth/confirmpassword.blade.php b/resources/views/front/auth/confirmpassword.blade.php index 49d3781..eaa72f2 100644 --- a/resources/views/front/auth/confirmpassword.blade.php +++ b/resources/views/front/auth/confirmpassword.blade.php @@ -105,6 +105,7 @@ +
diff --git a/resources/views/front/auth/forgot-password.blade.php b/resources/views/front/auth/forgot-password.blade.php index d3fda6b..dbf7b73 100644 --- a/resources/views/front/auth/forgot-password.blade.php +++ b/resources/views/front/auth/forgot-password.blade.php @@ -184,7 +184,18 @@ return; } - console.log('email confirm'); + // 顯示 Loading 畫面 + Swal.fire({ + title: '請稍候', + text: '正在處理中...', + icon: 'info', + allowOutsideClick: false, // 防止用戶關閉 + showConfirmButton: false, // 隱藏按鈕 + didOpen: () => { + Swal.showLoading(); // 顯示 loading 動畫 + } + }); + $.ajax({ type: "post", url: "{{ route('email.password.post') }}", @@ -196,7 +207,8 @@ }, dataType: "json", success: function(response) { - console.log('Server response:', response); + Swal.close(); // 隱藏 Loading 畫面 + if (response.status == 'success') { Swal.fire({ title: '成功', @@ -214,14 +226,25 @@ } }, error: function(xhr, status, error) { - console.log('Error:', error); - Swal.fire({ - title: '錯誤', - text: "系統錯誤,請稍後再試", - icon: 'error', - confirmButtonText: '确定' - }); + Swal.close(); // 隱藏 Loading 畫面 + + if (xhr.status == 404) { + Swal.fire({ + title: '錯誤', + text: "未找到有效帳號", + icon: 'error', + confirmButtonText: '确定' + }); + } else { + Swal.fire({ + title: '錯誤', + text: "伺服器發生錯誤,請稍後再試", + icon: 'error', + confirmButtonText: '确定' + }); + } } }); }); + diff --git a/resources/views/front/login.blade.php b/resources/views/front/login.blade.php index 0840777..a345f1d 100644 --- a/resources/views/front/login.blade.php +++ b/resources/views/front/login.blade.php @@ -172,11 +172,9 @@ - - - {{-- + - --}} +
diff --git a/resources/views/front/member/auth-register.blade.php b/resources/views/front/member/auth-register.blade.php index c825581..3e95f2d 100644 --- a/resources/views/front/member/auth-register.blade.php +++ b/resources/views/front/member/auth-register.blade.php @@ -123,7 +123,7 @@
-
請輸入有效的 Email 地址。
+
請輸入有效的 Email 地址。
@@ -317,6 +317,44 @@ function validatePhoneField(field) { }); }); } + function validateEmailField(field) { + const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + const value = field.val().trim(); + + // 驗證格式 + if (!emailPattern.test(value)) { + field.addClass('is-invalid'); + $("#checkphone").text('請輸入有效的 10 位手機號碼。').show(); + return Promise.resolve(false); + } + + // 檢查手機號是否已被註冊 + return new Promise((resolve) => { + $.ajax({ + url: "{{ route('member.checkemail') }}", + method: 'GET', + data: { + email: value + }, + success: function(response) { + if (response.status === 'error') { + field.addClass('is-invalid'); + $("#checkemail").text(response.msg).show(); // 顯示伺服器返回的錯誤訊息 + resolve(false); + } else { + field.removeClass('is-invalid'); + $("#checkemail").hide(); // 隱藏錯誤訊息 + resolve(true); + } + }, + error: function() { + field.addClass('is-invalid'); + $("#checkphone").text('檢查手機號時發生錯誤,請稍後再試。').show(); + resolve(false); + } + }); + }); + } // 綁定每個欄位的失焦事件 $('#formAuthentication input').on('blur', function() { @@ -325,6 +363,11 @@ function validatePhoneField(field) { } else { validateField($(this)); } + if ($(this).attr('id') === 'email') { + validateEmailField($(this)); + } else { + validateField($(this)); + } }); // 表單提交事件 diff --git a/resources/views/front/member/index.blade.php b/resources/views/front/member/index.blade.php index a1f98ba..8a79466 100644 --- a/resources/views/front/member/index.blade.php +++ b/resources/views/front/member/index.blade.php @@ -77,7 +77,7 @@
兌換編碼
- + {{--
We'll never share your details with anyone else.
--}}
diff --git a/resources/views/front/member/page-profile.blade.php b/resources/views/front/member/page-profile.blade.php index d4d63be..92029cf 100644 --- a/resources/views/front/member/page-profile.blade.php +++ b/resources/views/front/member/page-profile.blade.php @@ -2,287 +2,393 @@ @section('content') - -
-
-
+ +
+
+
- -
- -
- -
+ + - - @php - if(empty($data)){ - $data = Auth::guard('member')->user(); - unset($data['password']); - } - @endphp -
-

卡菲姬個人資料

-

Hi, {{$data->name }} 用戶 歡迎你 ! ,請花幾分鐘完善資料

- -
-
-
-
-

編輯您的資訊

-

更新用戶詳細資訊

-
-
- -
-
- - -
+ +
+ + @php + if (empty($data)) { + $data = Auth::guard('member')->user(); + unset($data['password']); + } + @endphp +
+

卡菲姬個人資料

+

Hi, {{ $data->name }} 用戶 歡迎你 ! ,請花幾分鐘完善資料

+
+
+
+
+

編輯您的資訊

+

更新用戶詳細資訊

- - -
-
- - -
請輸入有效的 Email
-
-
- - -
-
-
-
- - -
請輸入有效密碼
- -
- - - -
-
- -
- - -
-
-
-
- - -
密碼與確認密碼不相符
- -
- - - -
-
-
- - -
-
- + + +
- - -
請輸入有效電話
- + +
-
+ +
+
+ email)) readonly @endif /> + +
請輸入有效的 Email
+
+
- -
- - -
- + +
+
+
+
+ + +
請輸入有效密碼
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ + +
密碼與確認密碼不相符
+ +
+ + + +
+
+
+ + +
+
+ +
+ + +
請輸入有效電話
+ +
+
+ +
+ + +
+ + +
+ +
+ + +
- - -
-
-
- +
+ - + -{{--
+ {{-- --}} - - - - - - - - - - - - - - - - -{{-- --}} -{{-- --}} - - - - - - - - - - - - - - - + + + +@section('scripts') + + + + + + + + + + + - - - + + + + + + + - // 簡單的電子郵件格式驗證(可選) - if (!email.match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/)) { - Swal.fire({ - icon: 'error' - , title: '格式錯誤' - , text: '請輸入有效的電子郵件地址!' - }); - return; - } + + - // 發送 AJAX 請求到伺服器進行進一步驗證 - $.ajax({ - url: "{{route('member.validemail')}}", // 替換成你的 API 路徑 - type: 'get', // 或 'GET',根據你的需求 - data: { - email: email + + + + + + + + + + + + - $("#cancel").on('click', function() { - let valid = true; + + + - - - + }); + +@endsection @endsection diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 8c40ee1..1261f8a 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -4,7 +4,7 @@ - + @if (Auth::guard('member')->check()) 卡菲姬APP @else diff --git a/resources/views/layouts/navbar.blade.php b/resources/views/layouts/navbar.blade.php index a1a3eaa..641a7b6 100644 --- a/resources/views/layouts/navbar.blade.php +++ b/resources/views/layouts/navbar.blade.php @@ -90,22 +90,20 @@
+ @if(isset(Auth::guard('member')->user()->avatar)) + + @else + @endif
- @if (Auth::guard('member')->check()) {{Auth::guard('member')->user()->name}} - @else - {{Auth::user()->name}} - @endif + - @if(Auth::guard('member')->check()) {{Auth::guard('member')->user()->Level_Name}} - @else - 管理員 - @endif +
@@ -150,19 +148,12 @@ class="align-middle">Pricing
  • - @if (Auth::guard('member')->check()) 登 出 - @else - - 登 出 - - - @endif
    diff --git a/routes/web.php b/routes/web.php index 45d98d9..677e8cb 100644 --- a/routes/web.php +++ b/routes/web.php @@ -40,10 +40,14 @@ Route::get('email/password', [RegisterController::class, 'forgotPassword'])->name('email.password'); Route::post('email/password', [RegisterController::class, 'sendForgotPassword'])->name('email.password.post'); Route::get('resetpassword', [RegisterController::class, 'resetPassword'])->name('reset.password.token'); -Route::get('changepassword/{id}', [RegisterController::class, 'changePassword'])->name('change.password'); -Route::put('changepassword/{id}', [RegisterController::class, 'resetPasswordProcess'])->name('change.password.put'); - +Route::get('changepassword', [RegisterController::class, 'changePassword'])->name('change.password'); +Route::put('changepassword', [RegisterController::class, 'resetPasswordProcess'])->name('change.password.put'); Route::any('checkphone', [MemberController::class, 'checkPhone'])->name('member.checkphone'); +Route::get('checkemail', [MemberController::class, 'checkEmail'])->name('member.checkemail'); +Route::get('google/auth', [LoginController::class, 'redirectToGoogle'])->name('google.auth'); +Route::get('google/callback', [LoginController::class, 'handleGoogleCallback'])->name('google.redirect'); + + //前台route 登入後;