diff --git a/public/runtime-env.js b/public/runtime-env.js index 8e75086..0cd6c8e 100644 --- a/public/runtime-env.js +++ b/public/runtime-env.js @@ -1,15 +1,17 @@ -//* public/runtime-env.js +//* public/runtime-env.js - 디버깅 포함 버전 +console.log('=== RUNTIME-ENV.JS 로드됨 ==='); + window.__runtime_config__ = { - // API 서버 URL들 - AUTH_URL: 'http://20.1.2.3/auth', - STORE_URL: 'http://20.1.2.3/store', - CONTENT_URL: 'http://20.1.2.3/content', - RECOMMEND_URL: 'http://20.1.2.3/recommend', - - // 외부 API 설정 - CLAUDE_AI_ENABLED: true, - WEATHER_API_ENABLED: true, - + // 로컬 개발 환경 설정 + AUTH_URL: 'http://localhost:8081/api/auth', + MEMBER_URL: 'http://localhost:8081/api/member', + STORE_URL: 'http://localhost:8082/api/store', + CONTENT_URL: 'http://localhost:8083/api/content', + RECOMMEND_URL: 'http://localhost:8084/api/recommendation', + + // Gateway 주석 처리 (로컬에서는 사용 안함) + // GATEWAY_URL: 'http://20.1.2.3', + // 기능 플래그 FEATURES: { ANALYTICS: true, @@ -19,10 +21,15 @@ window.__runtime_config__ = { }, // 환경 설정 - ENV: 'production', - DEBUG: false, + ENV: 'development', + DEBUG: true, // 버전 정보 VERSION: '1.0.0', BUILD_DATE: new Date().toISOString(), -} +}; + +console.log('=== 설정된 API URLs ==='); +console.log('AUTH_URL:', window.__runtime_config__.AUTH_URL); +console.log('MEMBER_URL:', window.__runtime_config__.MEMBER_URL); +console.log('전체 설정:', window.__runtime_config__); \ No newline at end of file diff --git a/src/services/api.js b/src/services/api.js index d2d98e0..223b0f1 100644 --- a/src/services/api.js +++ b/src/services/api.js @@ -6,10 +6,12 @@ const getApiUrls = () => { const config = window.__runtime_config__ || {} return { GATEWAY_URL: config.GATEWAY_URL || 'http://20.1.2.3', - MEMBER_URL: config.MEMBER_URL || 'http://20.1.2.3/api/member', - AUTH_URL: config.AUTH_URL || 'http://20.1.2.3/api/auth', + AUTH_URL: 'http://localhost:8081/api/auth', + MEMBER_URL: 'http://localhost:8081/api/member', STORE_URL: config.STORE_URL || 'http://20.1.2.3/api/store', CONTENT_URL: config.CONTENT_URL || 'http://20.1.2.3/api/content', + MENU_URL: config.MENU_URL || 'http://20.1.2.3/api/menu', + SALES_URL: config.SALES_URL || 'http://20.1.2.3/api/sales', RECOMMEND_URL: config.RECOMMEND_URL || 'http://20.1.2.3/api/recommendation', } } @@ -26,7 +28,7 @@ const createApiInstance = (baseURL) => { }) // 요청 인터셉터 - JWT 토큰 자동 추가 - instance.interceptors.request.use( +instance.interceptors.request.use( (config) => { const token = localStorage.getItem('accessToken') if (token) { @@ -58,8 +60,9 @@ const createApiInstance = (baseURL) => { refreshToken, }) - const { accessToken } = refreshResponse.data.data + const { accessToken, refreshToken: newRefreshToken } = refreshResponse.data.data localStorage.setItem('accessToken', accessToken) + localStorage.setItem('refreshToken', newRefreshToken) // 원래 요청에 새 토큰으로 재시도 originalRequest.headers.Authorization = `Bearer ${accessToken}` @@ -69,6 +72,7 @@ const createApiInstance = (baseURL) => { // 토큰 갱신 실패 시 로그아웃 처리 localStorage.removeItem('accessToken') localStorage.removeItem('refreshToken') + localStorage.removeItem('userInfo') window.location.href = '/login' } } @@ -86,6 +90,8 @@ export const memberApi = createApiInstance(apiUrls.MEMBER_URL) export const authApi = createApiInstance(apiUrls.AUTH_URL) export const storeApi = createApiInstance(apiUrls.STORE_URL) export const contentApi = createApiInstance(apiUrls.CONTENT_URL) +export const menuApi = createApiInstance(apiUrls.MENU_URL) +export const salesApi = createApiInstance(apiUrls.SALES_URL) export const recommendApi = createApiInstance(apiUrls.RECOMMEND_URL) // 기본 API 인스턴스 (Gateway URL 사용) @@ -99,7 +105,7 @@ export const handleApiError = (error) => { return { success: false, message: '네트워크 연결을 확인해주세요.', - code: 'NETWORK_ERROR', + error: error.message } } @@ -111,46 +117,47 @@ export const handleApiError = (error) => { return { success: false, message: data?.message || '잘못된 요청입니다.', - code: 'BAD_REQUEST', + error: data?.error } case 401: return { success: false, message: '인증이 필요합니다.', - code: 'UNAUTHORIZED', + error: 'UNAUTHORIZED' } case 403: return { success: false, message: '접근 권한이 없습니다.', - code: 'FORBIDDEN', + error: 'FORBIDDEN' } case 404: return { success: false, - message: '요청하신 정보를 찾을 수 없습니다.', - code: 'NOT_FOUND', + message: '요청한 리소스를 찾을 수 없습니다.', + error: 'NOT_FOUND' } case 500: return { success: false, message: '서버 오류가 발생했습니다.', - code: 'SERVER_ERROR', + error: 'INTERNAL_SERVER_ERROR' } default: return { success: false, - message: data?.message || '알 수 없는 오류가 발생했습니다.', - code: 'UNKNOWN_ERROR', + message: data?.message || `오류가 발생했습니다. (${status})`, + error: data?.error } } } // 성공 응답 포맷터 -export const formatSuccessResponse = (data, message = '성공적으로 처리되었습니다.') => { +export const formatSuccessResponse = (data, message = '요청이 성공적으로 처리되었습니다.') => { return { success: true, message, - data, + data } } + diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue index 8e8e5bd..7049207 100644 --- a/src/views/LoginView.vue +++ b/src/views/LoginView.vue @@ -1,25 +1,22 @@ -//* src/views/LoginView.vue +//* src/views/LoginView.vue - 수정된 회원가입 기능 @@ -336,6 +622,10 @@ onMounted(() => { margin-top: 8px; } +.gap-2 { + gap: 8px; +} + @media (max-width: 600px) { .login-card { margin: 16px; @@ -344,5 +634,14 @@ onMounted(() => { .logo-section { padding: 16px 0; } + + .d-flex.align-center.gap-2 { + flex-direction: column; + align-items: stretch; + } + + .d-flex.align-center.gap-2 .v-btn { + margin-top: 8px; + } } - + \ No newline at end of file