diff --git a/app/game-frontend/src/router/index.ts b/app/game-frontend/src/router/index.ts index a1a32f19..d2c47ab6 100644 --- a/app/game-frontend/src/router/index.ts +++ b/app/game-frontend/src/router/index.ts @@ -27,6 +27,7 @@ import DynastyListView from '../views/DynastyListView.vue'; import DynastyDetailView from '../views/DynastyDetailView.vue'; import SurveyView from '../views/SurveyView.vue'; import TroopView from '../views/TroopView.vue'; +import YearbookView from '../views/YearbookView.vue'; import { useSessionStore } from '../stores/session'; const routes = [ @@ -211,6 +212,14 @@ const routes = [ name: 'dynasty-detail', component: DynastyDetailView, }, + { + path: '/yearbook', + name: 'yearbook', + component: YearbookView, + meta: { + requiresAuth: true, + }, + }, { path: '/my-page', name: 'my-page', diff --git a/app/game-frontend/src/views/MainView.vue b/app/game-frontend/src/views/MainView.vue index 21ac3961..b77a91ad 100644 --- a/app/game-frontend/src/views/MainView.vue +++ b/app/game-frontend/src/views/MainView.vue @@ -102,6 +102,7 @@ watch( 명장일람 명예의 전당 왕조일람 + 연감 게시판 전투 시뮬레이터 내 정보 diff --git a/app/game-frontend/src/views/YearbookView.vue b/app/game-frontend/src/views/YearbookView.vue new file mode 100644 index 00000000..7a0169df --- /dev/null +++ b/app/game-frontend/src/views/YearbookView.vue @@ -0,0 +1,331 @@ + + + + + diff --git a/app/gateway-frontend/src/router/index.ts b/app/gateway-frontend/src/router/index.ts index f234b448..a77baaae 100644 --- a/app/gateway-frontend/src/router/index.ts +++ b/app/gateway-frontend/src/router/index.ts @@ -3,6 +3,8 @@ import HomeView from '../views/HomeView.vue'; import LobbyView from '../views/LobbyView.vue'; import AdminView from '../views/AdminView.vue'; import ServerOperationsView from '../views/ServerOperationsView.vue'; +import AccountView from '../views/AccountView.vue'; +import OAuthCallbackView from '../views/OAuthCallbackView.vue'; const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -27,6 +29,16 @@ const router = createRouter({ name: 'server-operations', component: ServerOperationsView, }, + { + path: '/account', + name: 'account', + component: AccountView, + }, + { + path: '/oauth/callback', + name: 'oauth-callback', + component: OAuthCallbackView, + }, ], }); diff --git a/app/gateway-frontend/src/views/AccountView.vue b/app/gateway-frontend/src/views/AccountView.vue new file mode 100644 index 00000000..85cf8ec9 --- /dev/null +++ b/app/gateway-frontend/src/views/AccountView.vue @@ -0,0 +1,537 @@ + + + + + diff --git a/app/gateway-frontend/src/views/HomeView.vue b/app/gateway-frontend/src/views/HomeView.vue index 10e53c5d..8145ed1a 100644 --- a/app/gateway-frontend/src/views/HomeView.vue +++ b/app/gateway-frontend/src/views/HomeView.vue @@ -105,6 +105,16 @@ const handleKakao = async (): Promise => { loginError.value = error instanceof Error ? error.message : '카카오 로그인을 시작하지 못했습니다.'; } }; + +const handlePasswordReset = async (): Promise => { + loginError.value = ''; + try { + const result = await trpc.auth.kakaoStart.query({ mode: 'change_pw' }); + window.location.assign(result.authUrl); + } catch (error) { + loginError.value = error instanceof Error ? error.message : '비밀번호 초기화를 시작하지 못했습니다.'; + } +};