From f2a45cc33a9cdabac0f23394bd60d9e34254575a Mon Sep 17 00:00:00 2001 From: SeoJHeasdw Date: Tue, 17 Jun 2025 14:42:42 +0900 Subject: [PATCH 01/11] release --- src/views/DashboardView.vue | 52 +++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/src/views/DashboardView.vue b/src/views/DashboardView.vue index f69614e..2b3b52b 100644 --- a/src/views/DashboardView.vue +++ b/src/views/DashboardView.vue @@ -975,8 +975,13 @@ const updateAiRecommendation = (aiData) => { title: aiData.tipContent ? aiData.tipContent.substring(0, 50) + '...' : 'AI 마케팅 추천', sections: { ideas: { - title: '추천 아이디어', + title: '1. 추천 아이디어', items: [aiData.tipContent || '맞춤형 마케팅 전략을 제안드립니다.'] + }, + costs: { + title: '2. 예상 효과', + items: ['고객 관심 유도 및 매출 상승', 'SNS를 통한 브랜드 인지도 상승'], + effects: ['재방문율 및 공유 유도', '지역 내 인지도 향상'] } } } @@ -987,6 +992,31 @@ const updateAiRecommendation = (aiData) => { } +/** + * Fallback AI 추천 사용 + */ +const useFallbackAiRecommendation = () => { + console.log('Fallback AI 추천 사용') + aiRecommendation.value = { + emoji: '☀️', + title: '여름 시즌 마케팅 전략', + sections: { + ideas: { + title: '1. 기본 추천사항', + items: [ + '계절 메뉴 개발 및 프로모션', + 'SNS 마케팅 활용', + '지역 고객 대상 이벤트 기획' + ] + }, + costs: { + title: '2. 기대 효과', + items: ['매출 향상', '고객 만족도 증가'], + effects: ['브랜드 인지도 상승', '재방문 고객 증가'] + } + } + } +} // 계산된 속성들 (기존과 동일) const currentChartData = computed(() => chartData.value[chartPeriod.value]) @@ -1193,10 +1223,6 @@ const showDataTooltip = (index, event) => { if (!data) return - // 차트 영역의 위치 계산 - const chartArea = event.target.closest('.chart-area') - const rect = chartArea.getBoundingClientRect() - // ⚠️ 원본 데이터가 있으면 사용, 없으면 기본 변환 로직 사용 let actualSales, actualTarget @@ -1215,8 +1241,8 @@ const showDataTooltip = (index, event) => { tooltip.value = { show: true, - x: event.clientX - rect.left, - y: event.clientY - rect.top - 80, + x: event.clientX, + y: event.clientY - 80, title: data.label, sales: actualSales, target: actualTarget @@ -1454,7 +1480,6 @@ onMounted(async () => { top: 0; bottom: 0; width: 40px; - z-index: 0; } .y-label { @@ -1470,7 +1495,6 @@ onMounted(async () => { right: 0; top: 0; bottom: 0; - z-index: 0; } .grid-line { @@ -1487,7 +1511,6 @@ onMounted(async () => { top: 0; width: 100%; height: 100%; - z-index: 1; } .data-points { @@ -1496,7 +1519,6 @@ onMounted(async () => { right: 0; top: 0; bottom: 0; - z-index: 2; } .data-point { @@ -1547,8 +1569,8 @@ onMounted(async () => { } .chart-tooltip { - position: absolute; - z-index: 99999; + position: fixed; + z-index: 1000; pointer-events: none; } @@ -1566,6 +1588,10 @@ onMounted(async () => { margin-bottom: 4px; } +.tooltip-sales, +.tooltip-target { + margin: 2px 0; +} /* AI 추천 카드 새로운 스타일 */ .ai-recommend-card { From 30754fd3f20c14af4200d816ca48b702f089d5c5 Mon Sep 17 00:00:00 2001 From: SeoJHeasdw Date: Tue, 17 Jun 2025 14:44:11 +0900 Subject: [PATCH 02/11] release --- src/views/LoginView.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue index f10d764..a1cfd37 100644 --- a/src/views/LoginView.vue +++ b/src/views/LoginView.vue @@ -29,7 +29,7 @@ @keyup.enter="handleLogin" /> - + +
Date: Tue, 17 Jun 2025 14:46:18 +0900 Subject: [PATCH 03/11] front --- src/views/LoginView.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue index a1cfd37..f6036cc 100644 --- a/src/views/LoginView.vue +++ b/src/views/LoginView.vue @@ -45,7 +45,6 @@ @keyup.enter="handleLogin" /> -
Date: Tue, 17 Jun 2025 14:47:55 +0900 Subject: [PATCH 04/11] front test --- src/views/LoginView.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue index f6036cc..a1cfd37 100644 --- a/src/views/LoginView.vue +++ b/src/views/LoginView.vue @@ -45,6 +45,7 @@ @keyup.enter="handleLogin" /> +
Date: Tue, 17 Jun 2025 17:44:14 +0900 Subject: [PATCH 05/11] release --- src/services/content.js | 273 +++--- src/store/content.js | 435 ++++++--- src/utils/constants.js | 294 +++--- src/views/ContentCreationView.vue | 1502 +++++++++++++++-------------- src/views/DashboardView.vue | 48 +- 5 files changed, 1399 insertions(+), 1153 deletions(-) diff --git a/src/services/content.js b/src/services/content.js index 1a3a44f..99ee797 100644 --- a/src/services/content.js +++ b/src/services/content.js @@ -1,157 +1,172 @@ -//* src/services/content.js - 기존 파일 수정 (API 설계서 기준) +//* src/services/content.js import { contentApi, handleApiError, formatSuccessResponse } from './api.js' /** * 마케팅 콘텐츠 관련 API 서비스 - * API 설계서 기준으로 수정됨 + * 백엔드 SnsContentCreateRequest DTO에 맞게 수정 */ class ContentService { /** - * SNS 게시물 생성 (CON-005: SNS 게시물 생성) + * SNS 게시물 생성 * @param {Object} contentData - SNS 콘텐츠 생성 정보 * @returns {Promise} 생성된 SNS 콘텐츠 */ async generateSnsContent(contentData) { try { - const response = await contentApi.post('/sns/generate', { - storeId: contentData.storeId, - platform: contentData.platform, + console.log('🚀 SNS 콘텐츠 생성 요청:', contentData) + + // 백엔드 SnsContentCreateRequest DTO에 맞는 데이터 구조 + const requestData = { + // === 기본 정보 === + storeId: contentData.storeId || 1, + storeName: contentData.storeName || '테스트 매장', + storeType: contentData.storeType || '음식점', + platform: this.mapPlatform(contentData.platform), title: contentData.title, - category: contentData.category, - requirement: contentData.requirement || contentData.requirements, - toneAndManner: contentData.toneAndManner, - emotionalIntensity: contentData.emotionalIntensity || contentData.emotionIntensity, - targetAudience: contentData.targetAudience, - promotionalType: contentData.promotionalType || contentData.promotionType, - eventName: contentData.eventName, - eventDate: contentData.eventDate, - hashtagStyle: contentData.hashtagStyle, - hashtagCount: contentData.hashtagCount || 10, - includeCallToAction: contentData.includeCallToAction || false, - includeEmoji: contentData.includeEmoji || true, - contentLength: contentData.contentLength || '보통' - }) + + // === 콘텐츠 생성 조건 === + category: contentData.category || this.mapTargetToCategory(contentData.targetType), + requirement: contentData.requirements || contentData.content || '', + target: contentData.targetType || '일반 고객', + contentType: 'SNS 게시물', + + // === 이벤트 정보 === + eventName: contentData.eventName || null, + startDate: contentData.startDate ? this.formatDate(contentData.startDate) : null, + endDate: contentData.endDate ? this.formatDate(contentData.endDate) : null, + + // === 미디어 정보 === + images: contentData.images || [], + photoStyle: this.mapPhotoStyle(contentData.aiOptions?.photoStyle), + + // === 추가 옵션 === + includeHashtags: true, + includeEmojis: true, + includeCallToAction: true, + includeLocationInfo: false + } - return formatSuccessResponse(response.data.data, 'SNS 게시물이 생성되었습니다.') + console.log('📤 백엔드 DTO 맞춤 데이터:', requestData) + + const response = await contentApi.post('/sns/generate', requestData) + + console.log('📥 API 응답:', response.data) + + // 응답 데이터 구조에 맞게 처리 + const responseData = response.data.data || response.data + + return formatSuccessResponse({ + content: responseData.content || responseData, + hashtags: responseData.hashtags || [], + ...responseData + }, 'SNS 게시물이 생성되었습니다.') } catch (error) { + console.error('❌ SNS 콘텐츠 생성 실패:', error) return handleApiError(error) } } /** - * SNS 게시물 저장 (CON-010: SNS 게시물 저장) + * 플랫폼 매핑 (프론트엔드 -> 백엔드) + */ + mapPlatform(platform) { + const mapping = { + 'instagram': 'INSTAGRAM', + 'naver_blog': 'NAVER_BLOG', + 'facebook': 'FACEBOOK', + 'kakao_story': 'KAKAO_STORY' + } + return mapping[platform] || 'INSTAGRAM' + } + + /** + * 타겟 타입을 카테고리로 매핑 + */ + mapTargetToCategory(targetType) { + const mapping = { + 'new_menu': '메뉴소개', + 'discount': '이벤트', + 'store': '인테리어', + 'event': '이벤트' + } + return mapping[targetType] || '메뉴소개' + } + + /** + * 날짜 형식 변환 (YYYY-MM-DD -> LocalDate) + */ + formatDate(dateString) { + if (!dateString) return null + // YYYY-MM-DD 형식이 LocalDate와 호환됨 + return dateString + } + + /** + * 사진 스타일 매핑 + */ + mapPhotoStyle(style) { + const mapping = { + 'bright': '밝고 화사한', + 'calm': '차분하고 세련된', + 'vintage': '빈티지한', + 'modern': '모던한', + 'natural': '자연스러운' + } + return mapping[style] || '밝고 화사한' + } + + /** + * SNS 게시물 저장 * @param {Object} saveData - 저장할 SNS 콘텐츠 정보 * @returns {Promise} 저장 결과 */ async saveSnsContent(saveData) { try { - const response = await contentApi.post('/sns/save', { + console.log('💾 SNS 콘텐츠 저장 요청:', saveData) + + // 백엔드 SnsContentSaveRequest DTO에 맞는 구조로 변환 + const requestData = { title: saveData.title, content: saveData.content, - hashtags: saveData.hashtags, - platform: saveData.platform, - category: saveData.category, - toneAndManner: saveData.toneAndManner, - targetAudience: saveData.targetAudience, - promotionalType: saveData.promotionalType, + hashtags: saveData.hashtags || [], + platform: this.mapPlatform(saveData.platform), + category: saveData.category || '메뉴소개', + // 백엔드 DTO에서 지원하는 필드들만 포함 eventName: saveData.eventName, eventDate: saveData.eventDate, status: saveData.status || 'DRAFT' - }) + } + + console.log('📤 저장 요청 데이터:', requestData) + + const response = await contentApi.post('/sns/save', requestData) return formatSuccessResponse(response.data.data, 'SNS 게시물이 저장되었습니다.') } catch (error) { + console.error('❌ SNS 콘텐츠 저장 실패:', error) return handleApiError(error) } } /** - * 홍보 포스터 생성 (CON-015: 홍보 포스터 생성) - * @param {Object} posterData - 포스터 생성 정보 - * @returns {Promise} 생성된 포스터 - */ - async generatePoster(posterData) { - try { - const response = await contentApi.post('/poster/generate', { - storeId: posterData.storeId, - title: posterData.title, - targetType: posterData.targetType, - eventName: posterData.eventName, - eventDate: posterData.eventDate, - discountInfo: posterData.discountInfo, - designStyle: posterData.designStyle, - colorScheme: posterData.colorScheme, - includeQrCode: posterData.includeQrCode || false, - includeContact: posterData.includeContact || true, - imageStyle: posterData.imageStyle || posterData.photoStyle, - layoutType: posterData.layoutType, - sizes: posterData.sizes || ['1:1', '9:16', '16:9'] - }) - - return formatSuccessResponse(response.data.data, '홍보 포스터가 생성되었습니다.') - } catch (error) { - return handleApiError(error) - } - } - - /** - * 홍보 포스터 저장 (CON-016: 홍보 포스터 저장) - * @param {Object} saveData - 저장할 포스터 정보 - * @returns {Promise} 저장 결과 - */ - async savePoster(saveData) { - try { - const response = await contentApi.post('/poster/save', { - title: saveData.title, - images: saveData.images, - posterSizes: saveData.posterSizes, - targetType: saveData.targetType, - eventName: saveData.eventName, - status: saveData.status || 'DRAFT' - }) - - return formatSuccessResponse(response.data.data, '홍보 포스터가 저장되었습니다.') - } catch (error) { - return handleApiError(error) - } - } - - /** - * 콘텐츠 목록 조회 (CON-020: 마케팅 콘텐츠 이력) - * @param {Object} filters - 필터링 옵션 + * 콘텐츠 목록 조회 + * @param {Object} filters - 필터 조건 * @returns {Promise} 콘텐츠 목록 */ - async getContents(filters = {}) { + async getContentList(filters = {}) { try { - const queryParams = new URLSearchParams() - - if (filters.contentType) queryParams.append('contentType', filters.contentType) - if (filters.platform) queryParams.append('platform', filters.platform) - if (filters.period) queryParams.append('period', filters.period) - if (filters.sortBy) queryParams.append('sortBy', filters.sortBy || 'latest') - if (filters.page) queryParams.append('page', filters.page) - if (filters.size) queryParams.append('size', filters.size || 20) - if (filters.search) queryParams.append('search', filters.search) - - const response = await contentApi.get(`/?${queryParams.toString()}`) - + const params = new URLSearchParams() + + if (filters.contentType) params.append('contentType', filters.contentType) + if (filters.platform) params.append('platform', filters.platform) + if (filters.period) params.append('period', filters.period) + if (filters.sortBy) params.append('sortBy', filters.sortBy) + + const response = await contentApi.get(`/list?${params.toString()}`) + return formatSuccessResponse(response.data.data, '콘텐츠 목록을 조회했습니다.') } catch (error) { - return handleApiError(error) - } - } - - /** - * 진행 중인 콘텐츠 조회 - * @param {string} period - 조회 기간 - * @returns {Promise} 진행 중인 콘텐츠 목록 - */ - async getOngoingContents(period = 'month') { - try { - const response = await contentApi.get(`/ongoing?period=${period}`) - - return formatSuccessResponse(response.data.data, '진행 중인 콘텐츠를 조회했습니다.') - } catch (error) { + console.error('❌ 콘텐츠 목록 조회 실패:', error) return handleApiError(error) } } @@ -164,51 +179,29 @@ class ContentService { async getContentDetail(contentId) { try { const response = await contentApi.get(`/${contentId}`) - + return formatSuccessResponse(response.data.data, '콘텐츠 상세 정보를 조회했습니다.') } catch (error) { + console.error('❌ 콘텐츠 상세 조회 실패:', error) return handleApiError(error) } } /** - * 콘텐츠 수정 - * @param {number} contentId - 콘텐츠 ID - * @param {Object} updateData - 수정할 콘텐츠 정보 - * @returns {Promise} 수정 결과 - */ - async updateContent(contentId, updateData) { - try { - const response = await contentApi.put(`/${contentId}`, { - title: updateData.title, - content: updateData.content, - hashtags: updateData.hashtags, - startDate: updateData.startDate, - endDate: updateData.endDate, - status: updateData.status - }) - - return formatSuccessResponse(response.data.data, '콘텐츠가 수정되었습니다.') - } catch (error) { - return handleApiError(error) - } - } - - /** - * 콘텐츠 삭제 (CON-025: 콘텐츠 삭제) + * 콘텐츠 삭제 * @param {number} contentId - 콘텐츠 ID * @returns {Promise} 삭제 결과 */ async deleteContent(contentId) { try { - await contentApi.delete(`/${contentId}`) - + const response = await contentApi.delete(`/${contentId}`) + return formatSuccessResponse(null, '콘텐츠가 삭제되었습니다.') } catch (error) { + console.error('❌ 콘텐츠 삭제 실패:', error) return handleApiError(error) } } } -export const contentService = new ContentService() -export default contentService \ No newline at end of file +export default new ContentService() \ No newline at end of file diff --git a/src/store/content.js b/src/store/content.js index a1430e9..176e852 100644 --- a/src/store/content.js +++ b/src/store/content.js @@ -1,168 +1,307 @@ -//* src/store/content.js 수정 - 기존 구조 유지하고 API 연동만 추가 +//* src/store/content.js import { defineStore } from 'pinia' -import { ref, computed } from 'vue' -import contentService from '@/services/content' +import ContentService from '@/services/content.js' +import { PLATFORM_SPECS, PLATFORM_LABELS } from '@/utils/constants' -export const useContentStore = defineStore('content', () => { - // 기존 상태들 유지 - const contentList = ref([]) - const ongoingContents = ref([]) - const selectedContent = ref(null) - const generatedContent = ref(null) - const isLoading = ref(false) - - // 기존 computed 속성들 유지 - const contentCount = computed(() => contentList.value.length) - const ongoingContentCount = computed(() => ongoingContents.value.length) - - // generateContent를 실제 API 호출로 수정 - const generateContent = async (type, formData) => { - isLoading.value = true +/** + * 콘텐츠 관련 상태 관리 + */ +export const useContentStore = defineStore('content', { + state: () => ({ + // 콘텐츠 목록 + contentList: [], + totalCount: 0, - try { - let result - if (type === 'sns') { - result = await contentService.generateSnsContent(formData) - } else if (type === 'poster') { - result = await contentService.generatePoster(formData) + // 선택된 콘텐츠 + selectedContent: null, + + // 로딩 상태 + loading: false, + generating: false, + + // 필터 상태 + filters: { + contentType: '', + platform: '', + period: '', + sortBy: 'createdAt_desc' + }, + + // 페이지네이션 + pagination: { + page: 1, + itemsPerPage: 10 + } + }), + + getters: { + /** + * 필터링된 콘텐츠 목록 + */ + filteredContents: (state) => { + let filtered = [...state.contentList] + + if (state.filters.contentType) { + filtered = filtered.filter(content => content.type === state.filters.contentType) } - if (result.success) { - generatedContent.value = result.data - return { success: true, data: result.data } - } else { - return { success: false, error: result.message } - } - } catch (error) { - return { success: false, error: '네트워크 오류가 발생했습니다.' } - } finally { - isLoading.value = false - } - } - - // saveContent를 실제 API 호출로 수정 - const saveContent = async (type, contentData) => { - isLoading.value = true - - try { - let result - if (type === 'sns') { - result = await contentService.saveSnsContent(contentData) - } else if (type === 'poster') { - result = await contentService.savePoster(contentData) + if (state.filters.platform) { + filtered = filtered.filter(content => content.platform === state.filters.platform) } - if (result.success) { - // 콘텐츠 목록 새로고침 - await fetchContentList() - return { success: true, message: '콘텐츠가 저장되었습니다.' } - } else { - return { success: false, error: result.message } - } - } catch (error) { - return { success: false, error: '네트워크 오류가 발생했습니다.' } - } finally { - isLoading.value = false - } - } - - // fetchContentList를 실제 API 호출로 수정 - const fetchContentList = async (filters = {}) => { - isLoading.value = true - - try { - const result = await contentService.getContents(filters) + // 정렬 + const [field, order] = state.filters.sortBy.split('_') + filtered.sort((a, b) => { + let aValue = a[field] + let bValue = b[field] + + if (field === 'createdAt' || field === 'updatedAt') { + aValue = new Date(aValue) + bValue = new Date(bValue) + } + + if (order === 'desc') { + return bValue > aValue ? 1 : -1 + } else { + return aValue > bValue ? 1 : -1 + } + }) - if (result.success) { - contentList.value = result.data - return { success: true } - } else { - return { success: false, error: result.message } - } - } catch (error) { - return { success: false, error: '네트워크 오류가 발생했습니다.' } - } finally { - isLoading.value = false - } - } + return filtered + }, - // fetchOngoingContents를 실제 API 호출로 수정 - const fetchOngoingContents = async (period = 'month') => { - isLoading.value = true - - try { - const result = await contentService.getOngoingContents(period) + /** + * 페이지네이션된 콘텐츠 목록 + */ + paginatedContents: (state) => { + const start = (state.pagination.page - 1) * state.pagination.itemsPerPage + const end = start + state.pagination.itemsPerPage + return state.filteredContents.slice(start, end) + }, + + /** + * 총 페이지 수 + */ + totalPages: (state) => { + return Math.ceil(state.filteredContents.length / state.pagination.itemsPerPage) + } + }, + + actions: { + /** + * 콘텐츠 생성 (AI 기반) + */ + async generateContent(contentData) { + this.generating = true - if (result.success) { - ongoingContents.value = result.data - return { success: true } - } else { - return { success: false, error: result.message } + try { + console.log('🎯 콘텐츠 생성 시작:', contentData) + + // 백엔드 DTO에 맞는 데이터 구조로 변환 + const requestData = { + storeId: 1, // 현재는 하드코딩, 추후 로그인한 사용자의 매장 ID 사용 + storeName: '테스트 매장', // 추후 실제 매장 정보 사용 + storeType: '음식점', // 추후 실제 매장 업종 사용 + platform: contentData.platform, + title: contentData.title, + category: contentData.category || this.mapTargetToCategory(contentData.targetType), + requirement: contentData.requirements || '', + target: contentData.targetType || '일반 고객', + contentType: 'SNS 게시물', + eventName: contentData.eventName, + startDate: contentData.startDate, + endDate: contentData.endDate, + images: contentData.images || [], + photoStyle: '밝고 화사한', + includeHashtags: true, + includeEmojis: true, + includeCallToAction: true, + includeLocationInfo: false + } + + const result = await ContentService.generateSnsContent(requestData) + + if (result.success) { + console.log('✅ 콘텐츠 생성 성공:', result.data) + return result.data + } else { + throw new Error(result.message || '콘텐츠 생성에 실패했습니다.') + } + } catch (error) { + console.error('❌ 콘텐츠 생성 실패:', error) + throw error + } finally { + this.generating = false } - } catch (error) { - return { success: false, error: '네트워크 오류가 발생했습니다.' } - } finally { - isLoading.value = false - } - } + }, - // 콘텐츠 수정/삭제 메서드 추가 - const updateContent = async (contentId, updateData) => { - isLoading.value = true - - try { - const result = await contentService.updateContent(contentId, updateData) + /** + * 타겟 타입을 카테고리로 매핑 + */ + mapTargetToCategory(targetType) { + const mapping = { + 'new_menu': '메뉴소개', + 'discount': '이벤트', + 'store': '인테리어', + 'event': '이벤트' + } + return mapping[targetType] || '메뉴소개' + }, + + /** + * 플랫폼별 특성 조회 + */ + getPlatformSpec(platform) { + return PLATFORM_SPECS[platform] || null + }, + + /** + * 플랫폼 유효성 검사 + */ + validatePlatform(platform) { + return Object.keys(PLATFORM_SPECS).includes(platform) + }, + + /** + * 콘텐츠 저장 + */ + async saveContent(contentData) { + this.loading = true - if (result.success) { - await fetchContentList() - return { success: true, message: '콘텐츠가 수정되었습니다.' } - } else { - return { success: false, error: result.message } + try { + // 백엔드 DTO에 맞는 형식으로 데이터 정제 + const saveData = { + title: contentData.title, + content: contentData.content, + hashtags: contentData.hashtags || [], + platform: contentData.platform, // 이미 백엔드 형식 (INSTAGRAM, NAVER_BLOG 등) + category: contentData.category || '메뉴소개', + eventName: contentData.eventName, + eventDate: contentData.eventDate, + status: contentData.status || 'DRAFT' + } + + const result = await ContentService.saveSnsContent(saveData) + + if (result.success) { + // 목록 새로고침 + await this.fetchContentList() + return result.data + } else { + throw new Error(result.message || '콘텐츠 저장에 실패했습니다.') + } + } catch (error) { + console.error('❌ 콘텐츠 저장 실패:', error) + throw error + } finally { + this.loading = false } - } catch (error) { - return { success: false, error: '네트워크 오류가 발생했습니다.' } - } finally { - isLoading.value = false - } - } + }, - const deleteContent = async (contentId) => { - isLoading.value = true - - try { - const result = await contentService.deleteContent(contentId) + /** + * 콘텐츠 목록 조회 + */ + async fetchContentList() { + this.loading = true - if (result.success) { - await fetchContentList() - return { success: true, message: '콘텐츠가 삭제되었습니다.' } - } else { - return { success: false, error: result.message } + try { + const result = await ContentService.getContentList(this.filters) + + if (result.success) { + this.contentList = result.data || [] + this.totalCount = this.contentList.length + } else { + throw new Error(result.message || '콘텐츠 목록 조회에 실패했습니다.') + } + } catch (error) { + console.error('❌ 콘텐츠 목록 조회 실패:', error) + this.contentList = [] + this.totalCount = 0 + } finally { + this.loading = false } - } catch (error) { - return { success: false, error: '네트워크 오류가 발생했습니다.' } - } finally { - isLoading.value = false - } - } + }, - return { - // 상태 - contentList, - ongoingContents, - selectedContent, - generatedContent, - isLoading, - - // 컴퓨티드 - contentCount, - ongoingContentCount, - - // 메서드 - generateContent, - saveContent, - fetchContentList, - fetchOngoingContents, - updateContent, - deleteContent + /** + * 콘텐츠 상세 조회 + */ + async fetchContentDetail(contentId) { + this.loading = true + + try { + const result = await ContentService.getContentDetail(contentId) + + if (result.success) { + this.selectedContent = result.data + return result.data + } else { + throw new Error(result.message || '콘텐츠 상세 조회에 실패했습니다.') + } + } catch (error) { + console.error('❌ 콘텐츠 상세 조회 실패:', error) + throw error + } finally { + this.loading = false + } + }, + + /** + * 콘텐츠 삭제 + */ + async deleteContent(contentId) { + this.loading = true + + try { + const result = await ContentService.deleteContent(contentId) + + if (result.success) { + // 목록에서 제거 + this.contentList = this.contentList.filter(content => content.id !== contentId) + this.totalCount = this.contentList.length + return true + } else { + throw new Error(result.message || '콘텐츠 삭제에 실패했습니다.') + } + } catch (error) { + console.error('❌ 콘텐츠 삭제 실패:', error) + throw error + } finally { + this.loading = false + } + }, + + /** + * 필터 설정 + */ + setFilters(newFilters) { + this.filters = { ...this.filters, ...newFilters } + this.pagination.page = 1 // 필터 변경 시 첫 페이지로 + }, + + /** + * 페이지네이션 설정 + */ + setPagination(newPagination) { + this.pagination = { ...this.pagination, ...newPagination } + }, + + /** + * 상태 초기화 + */ + reset() { + this.contentList = [] + this.selectedContent = null + this.totalCount = 0 + this.filters = { + contentType: '', + platform: '', + period: '', + sortBy: 'createdAt_desc' + } + this.pagination = { + page: 1, + itemsPerPage: 10 + } + } } }) \ No newline at end of file diff --git a/src/utils/constants.js b/src/utils/constants.js index 26b368f..eb7213a 100644 --- a/src/utils/constants.js +++ b/src/utils/constants.js @@ -7,15 +7,7 @@ export const CONTENT_TYPES = { SNS: 'sns', POSTER: 'poster', - VIDEO: 'video', - BLOG: 'blog', -} - -export const CONTENT_TYPE_LABELS = { - [CONTENT_TYPES.SNS]: 'SNS 게시물', - [CONTENT_TYPES.POSTER]: '홍보 포스터', - [CONTENT_TYPES.VIDEO]: '비디오', - [CONTENT_TYPES.BLOG]: '블로그 포스트', + BLOG: 'blog' } // 플랫폼 @@ -23,191 +15,201 @@ export const PLATFORMS = { INSTAGRAM: 'instagram', NAVER_BLOG: 'naver_blog', FACEBOOK: 'facebook', - TWITTER: 'twitter', - YOUTUBE: 'youtube', - KAKAO: 'kakao', + KAKAO_STORY: 'kakao_story' } +// 플랫폼 라벨 export const PLATFORM_LABELS = { [PLATFORMS.INSTAGRAM]: '인스타그램', [PLATFORMS.NAVER_BLOG]: '네이버 블로그', [PLATFORMS.FACEBOOK]: '페이스북', - [PLATFORMS.TWITTER]: '트위터', - [PLATFORMS.YOUTUBE]: '유튜브', - [PLATFORMS.KAKAO]: '카카오', + [PLATFORMS.KAKAO_STORY]: '카카오스토리' } +// 플랫폼 컬러 export const PLATFORM_COLORS = { - [PLATFORMS.INSTAGRAM]: 'purple', + [PLATFORMS.INSTAGRAM]: 'pink', [PLATFORMS.NAVER_BLOG]: 'green', [PLATFORMS.FACEBOOK]: 'blue', - [PLATFORMS.TWITTER]: 'light-blue', - [PLATFORMS.YOUTUBE]: 'red', - [PLATFORMS.KAKAO]: 'yellow', + [PLATFORMS.KAKAO_STORY]: 'amber' } -// 콘텐츠 상태 -export const CONTENT_STATUS = { - DRAFT: 'draft', - PUBLISHED: 'published', - SCHEDULED: 'scheduled', - ARCHIVED: 'archived', - FAILED: 'failed', +// 플랫폼 아이콘 +export const PLATFORM_ICONS = { + [PLATFORMS.INSTAGRAM]: 'mdi-instagram', + [PLATFORMS.NAVER_BLOG]: 'mdi-web', + [PLATFORMS.FACEBOOK]: 'mdi-facebook', + [PLATFORMS.KAKAO_STORY]: 'mdi-chat' } -export const CONTENT_STATUS_LABELS = { - [CONTENT_STATUS.DRAFT]: '임시저장', - [CONTENT_STATUS.PUBLISHED]: '발행됨', - [CONTENT_STATUS.SCHEDULED]: '예약됨', - [CONTENT_STATUS.ARCHIVED]: '보관됨', - [CONTENT_STATUS.FAILED]: '실패', -} - -export const CONTENT_STATUS_COLORS = { - [CONTENT_STATUS.DRAFT]: 'orange', - [CONTENT_STATUS.PUBLISHED]: 'success', - [CONTENT_STATUS.SCHEDULED]: 'info', - [CONTENT_STATUS.ARCHIVED]: 'grey', - [CONTENT_STATUS.FAILED]: 'error', -} - -// 매장 업종 -export const BUSINESS_TYPES = { - RESTAURANT: 'restaurant', - CAFE: 'cafe', - SNACK_BAR: 'snack_bar', - FAST_FOOD: 'fast_food', - BAKERY: 'bakery', - DESSERT: 'dessert', - CONVENIENCE: 'convenience', - OTHER: 'other', -} - -export const BUSINESS_TYPE_LABELS = { - [BUSINESS_TYPES.RESTAURANT]: '일반음식점', - [BUSINESS_TYPES.CAFE]: '카페', - [BUSINESS_TYPES.SNACK_BAR]: '분식점', - [BUSINESS_TYPES.FAST_FOOD]: '패스트푸드', - [BUSINESS_TYPES.BAKERY]: '제과점', - [BUSINESS_TYPES.DESSERT]: '디저트카페', - [BUSINESS_TYPES.CONVENIENCE]: '편의점', - [BUSINESS_TYPES.OTHER]: '기타', +// 플랫폼 사양 정의 (누락된 PLATFORM_SPECS 추가) +export const PLATFORM_SPECS = { + [PLATFORMS.INSTAGRAM]: { + name: '인스타그램', + icon: 'mdi-instagram', + color: 'pink', + maxLength: 2200, + hashtags: true, + imageRequired: true, + format: 'sns' + }, + [PLATFORMS.NAVER_BLOG]: { + name: '네이버 블로그', + icon: 'mdi-web', + color: 'green', + maxLength: 5000, + hashtags: false, + imageRequired: false, + format: 'blog' + }, + [PLATFORMS.FACEBOOK]: { + name: '페이스북', + icon: 'mdi-facebook', + color: 'blue', + maxLength: 63206, + hashtags: true, + imageRequired: false, + format: 'sns' + }, + [PLATFORMS.KAKAO_STORY]: { + name: '카카오스토리', + icon: 'mdi-chat', + color: 'amber', + maxLength: 1000, + hashtags: true, + imageRequired: false, + format: 'sns' + } } // 톤앤매너 export const TONE_AND_MANNER = { FRIENDLY: 'friendly', PROFESSIONAL: 'professional', - HUMOROUS: 'humorous', - ELEGANT: 'elegant', CASUAL: 'casual', - TRENDY: 'trendy', -} - -export const TONE_AND_MANNER_LABELS = { - [TONE_AND_MANNER.FRIENDLY]: '친근함', - [TONE_AND_MANNER.PROFESSIONAL]: '전문적', - [TONE_AND_MANNER.HUMOROUS]: '유머러스', - [TONE_AND_MANNER.ELEGANT]: '고급스러운', - [TONE_AND_MANNER.CASUAL]: '캐주얼', - [TONE_AND_MANNER.TRENDY]: '트렌디', + HUMOROUS: 'humorous' } // 감정 강도 export const EMOTION_INTENSITY = { - CALM: 'calm', - NORMAL: 'normal', - ENTHUSIASTIC: 'enthusiastic', - EXCITING: 'exciting', -} - -export const EMOTION_INTENSITY_LABELS = { - [EMOTION_INTENSITY.CALM]: '차분함', - [EMOTION_INTENSITY.NORMAL]: '보통', - [EMOTION_INTENSITY.ENTHUSIASTIC]: '열정적', - [EMOTION_INTENSITY.EXCITING]: '과장된', + LOW: 'low', + MEDIUM: 'medium', + HIGH: 'high' } // 프로모션 타입 export const PROMOTION_TYPES = { - DISCOUNT: 'discount', - EVENT: 'event', - NEW_MENU: 'new_menu', - NONE: 'none', + DISCOUNT: 'DISCOUNT', + EVENT: 'EVENT', + NEW_PRODUCT: 'NEW_PRODUCT', + REVIEW: 'REVIEW' } -export const PROMOTION_TYPE_LABELS = { - [PROMOTION_TYPES.DISCOUNT]: '할인 정보', - [PROMOTION_TYPES.EVENT]: '이벤트 정보', - [PROMOTION_TYPES.NEW_MENU]: '신메뉴 알림', - [PROMOTION_TYPES.NONE]: '없음', -} - -// 이미지 스타일 +// 사진 스타일 export const PHOTO_STYLES = { MODERN: 'modern', - CLASSIC: 'classic', - EMOTIONAL: 'emotional', + VINTAGE: 'vintage', MINIMALIST: 'minimalist', + COLORFUL: 'colorful', + BRIGHT: 'bright', + CALM: 'calm', + NATURAL: 'natural' } -export const PHOTO_STYLE_LABELS = { - [PHOTO_STYLES.MODERN]: '모던', - [PHOTO_STYLES.CLASSIC]: '클래식', - [PHOTO_STYLES.EMOTIONAL]: '감성적', - [PHOTO_STYLES.MINIMALIST]: '미니멀', +// 콘텐츠 상태 +export const CONTENT_STATUS = { + DRAFT: 'draft', + PUBLISHED: 'published', + ARCHIVED: 'archived' } -// 파일 업로드 제한 -export const FILE_LIMITS = { - MAX_SIZE: 10 * 1024 * 1024, // 10MB - ALLOWED_TYPES: ['image/jpeg', 'image/png', 'image/gif', 'image/webp'], - ALLOWED_EXTENSIONS: ['.jpg', '.jpeg', '.png', '.gif', '.webp'], +// 타겟 대상 +export const TARGET_TYPES = { + NEW_MENU: 'new_menu', + DISCOUNT: 'discount', + STORE: 'store', + EVENT: 'event' +} + +// 타겟 대상 라벨 +export const TARGET_TYPE_LABELS = { + [TARGET_TYPES.NEW_MENU]: '신메뉴', + [TARGET_TYPES.DISCOUNT]: '할인 이벤트', + [TARGET_TYPES.STORE]: '매장 홍보', + [TARGET_TYPES.EVENT]: '일반 이벤트' +} + +// 백엔드 플랫폼 매핑 (프론트엔드 -> 백엔드) +export const BACKEND_PLATFORM_MAPPING = { + [PLATFORMS.INSTAGRAM]: 'INSTAGRAM', + [PLATFORMS.NAVER_BLOG]: 'NAVER_BLOG', + [PLATFORMS.FACEBOOK]: 'FACEBOOK', + [PLATFORMS.KAKAO_STORY]: 'KAKAO_STORY' +} + +// 백엔드에서 프론트엔드로 매핑 (백엔드 -> 프론트엔드) +export const FRONTEND_PLATFORM_MAPPING = { + 'INSTAGRAM': PLATFORMS.INSTAGRAM, + 'NAVER_BLOG': PLATFORMS.NAVER_BLOG, + 'FACEBOOK': PLATFORMS.FACEBOOK, + 'KAKAO_STORY': PLATFORMS.KAKAO_STORY } // API 응답 상태 export const API_STATUS = { SUCCESS: 'success', ERROR: 'error', - LOADING: 'loading', - IDLE: 'idle', + LOADING: 'loading' } -// 페이지네이션 -export const PAGINATION = { - DEFAULT_PAGE_SIZE: 20, - PAGE_SIZE_OPTIONS: [10, 20, 50, 100], +// 페이지 크기 +export const PAGE_SIZES = { + SMALL: 10, + MEDIUM: 20, + LARGE: 50 +} + +// 정렬 방향 +export const SORT_DIRECTION = { + ASC: 'asc', + DESC: 'desc' +} + +// 날짜 포맷 +export const DATE_FORMATS = { + DISPLAY: 'YYYY-MM-DD HH:mm', + API: 'YYYY-MM-DD', + FULL: 'YYYY-MM-DD HH:mm:ss' +} + +// 파일 업로드 제한 +export const FILE_LIMITS = { + MAX_SIZE: 10485760, // 10MB + ALLOWED_TYPES: ['image/jpeg', 'image/png', 'image/gif', 'image/webp'], + MAX_FILES: 5 +} + +// 콘텐츠 생성 제한 +export const CONTENT_LIMITS = { + TITLE_MAX_LENGTH: 100, + DESCRIPTION_MAX_LENGTH: 500, + REQUIREMENTS_MAX_LENGTH: 1000, + MAX_HASHTAGS: 30 +} + +// 알림 타입 +export const NOTIFICATION_TYPES = { + SUCCESS: 'success', + ERROR: 'error', + WARNING: 'warning', + INFO: 'info' } // 로컬 스토리지 키 export const STORAGE_KEYS = { - AUTH_TOKEN: 'auth_token', - USER_INFO: 'user_info', - APP_SETTINGS: 'app_settings', - CONTENT_FILTERS: 'content_filters', -} - -// 시간 관련 상수 -export const TIME_FORMATS = { - DATE: 'YYYY-MM-DD', - DATETIME: 'YYYY-MM-DD HH:mm:ss', - TIME: 'HH:mm', -} - -export const DATE_RANGES = { - TODAY: 'today', - WEEK: 'week', - MONTH: 'month', - QUARTER: 'quarter', - YEAR: 'year', - ALL: 'all', -} - -export const DATE_RANGE_LABELS = { - [DATE_RANGES.TODAY]: '오늘', - [DATE_RANGES.WEEK]: '최근 1주일', - [DATE_RANGES.MONTH]: '최근 1개월', - [DATE_RANGES.QUARTER]: '최근 3개월', - [DATE_RANGES.YEAR]: '최근 1년', - [DATE_RANGES.ALL]: '전체', -} + ACCESS_TOKEN: 'accessToken', + REFRESH_TOKEN: 'refreshToken', + USER_INFO: 'userInfo', + THEME: 'theme', + LANGUAGE: 'language' +} \ No newline at end of file diff --git a/src/views/ContentCreationView.vue b/src/views/ContentCreationView.vue index be215ed..370b9d8 100644 --- a/src/views/ContentCreationView.vue +++ b/src/views/ContentCreationView.vue @@ -9,301 +9,251 @@ :class="['left-panel', { 'left-panel-full': generatedVersions.length === 0 }]" > - +
+ mdi-creation -

콘텐츠 생성 (최대 3개)

+

콘텐츠 생성

+ + + 생성 가능: {{ remainingGenerations }}회 +
- -
- - - 콘텐츠 유형 선택 - - - + + 콘텐츠 유형 선택 + + + + - - - {{ type.icon }} - -
- {{ type.label }} -
-
- {{ type.description }} -
-
-
-
+ {{ type.icon }} + +
+ {{ type.label }} +
+
+ {{ type.description }} +
+
+
+
+
+
+ + +
+ + + 기본 정보 + + + + + + + + + + + + + + + + + + + + + + + + + + - -
- - - 기본 정보 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 이미지 첨부 - - - - -
-
- - - mdi-close - -
-
-
-
- - - - - - mdi-arrow-right - 다음 - - - -
-
- - -
- - - mdi-arrow-left - 이전 - - - - - AI 옵션 설정 + + + + mdi-robot + AI 설정 + - + - - - - - - + - - - - + + + + mdi-camera + 사진 업로드 (선택사항) + - - + + + +
+ + + + + + + + +
+
+
- + + + - - {{ useAI ? 'mdi-robot' : 'mdi-content-save' }} - - {{ useAI ? `AI 콘텐츠 신규 생성 (${remainingGenerations}회)` : '콘텐츠 저장' }} + mdi-robot + AI로 콘텐츠 생성하기 - - -
- mdi-information - AI 생성은 최대 3회까지 가능합니다. (남은 횟수: {{ remainingGenerations }}회) + +
+ 생성 가능 횟수를 모두 사용했습니다.
@@ -312,140 +262,155 @@ - - + + - -
-
- mdi-file-document-multiple -

콘텐츠 생성 결과

-
+ +
+ mdi-eye +

생성된 콘텐츠

+ + + {{ generatedVersions.length }}개 생성됨 +
- -
- - mdi-file-document-outline - -

- 아직 생성된 콘텐츠가 없습니다 -

-

- 왼쪽에서 정보를 입력하고 '{{ useAI ? 'AI 콘텐츠 생성' : '콘텐츠 저장' }}' 버튼을 클릭해주세요 -

+ +
+

생성된 버전들

+ + + + +
+
+
+ 버전 {{ index + 1 }} +
+
+ {{ formatDateTime(version.createdAt) }} +
+
+
+ + {{ getStatusText(version.status) }} + + + mdi-chevron-right + +
+
+
+
+
+
- -
- - -
- - 버전 {{ index + 1 }} - - - {{ version.title }} - -
-
- - - -
- - {{ getPlatformIcon(version.platform) }} - {{ getPlatformLabel(version.platform) }} - - - {{ formatDate(version.createdAt) }} - -
- - -
-

- {{ truncateText(version.content, 120) }} -

-
- - -
- - #{{ tag }} - - - +{{ version.hashtags.length - 3 }}개 더 - -
- - -
- - - - - -

- +{{ version.images.length - 2 }}개 이미지 더 -

-
-
- - - + +
+

미리보기

+ + + + {{ getPlatformIcon(currentVersion.platform) }} + + {{ getPlatformLabel(currentVersion.platform) }} - mdi-send - 발행 + 자세히 보기 - + + + + + + +
+ {{ currentVersion.title }} +
+ + +
+
+ +
+
+ ... 더 보려면 '자세히 보기'를 클릭하세요 +
+
+
{{ truncateText(currentVersion.content, 150) }}
+
+ + + +
+ + {{ hashtag }} + + + +{{ currentVersion.hashtags.length - 5 }}개 더 + +
+ + +
+ + mdi-content-save + 저장하기 + + + + mdi-content-copy + 복사 + +
+
@@ -453,90 +418,125 @@ - + - - - {{ selectedVersionData.title }} (버전 {{ selectedVersion + 1 }}) + + + + {{ getPlatformIcon(currentVersion.platform) }} + + {{ currentVersion.title }} - - mdi-close - + - + + + - - +
- - {{ getPlatformIcon(selectedVersionData.platform) }} - {{ getPlatformLabel(selectedVersionData.platform) }} - - {{ formatDate(selectedVersionData.createdAt) }} -
- - -

콘텐츠

-
- {{ selectedVersionData.content }} +
+
+
+ {{ currentVersion.content }}
+ + -
+

해시태그

- - #{{ tag }} - -
- - -
-

이미지

- - + - - - + {{ hashtag }} + +
+
+ + +
+

정보

+ + + 플랫폼 + + + + 홍보 대상 + + + + 이벤트명 + + + + 생성일시 + + +
- + - - + + + - mdi-send - 발행하기 + mdi-content-copy + 전체 복사 + + + mdi-content-save + 저장하기 - +

AI가 콘텐츠를 생성 중입니다

@@ -547,20 +547,10 @@ \ No newline at end of file diff --git a/src/views/DashboardView.vue b/src/views/DashboardView.vue index 2b3b52b..280e3ba 100644 --- a/src/views/DashboardView.vue +++ b/src/views/DashboardView.vue @@ -122,7 +122,7 @@
+ :style="{ bottom: `${i * 18}%` }"> {{ label }}
@@ -139,7 +139,7 @@ ref="chartCanvas" class="chart-canvas" width="800" - height="300" + height="600" @mousemove="handleMouseMove" @mouseleave="hideTooltip"> @@ -176,7 +176,7 @@
-
+
{ title: aiData.tipContent ? aiData.tipContent.substring(0, 50) + '...' : 'AI 마케팅 추천', sections: { ideas: { - title: '1. 추천 아이디어', + title: '추천 아이디어', items: [aiData.tipContent || '맞춤형 마케팅 전략을 제안드립니다.'] - }, - costs: { - title: '2. 예상 효과', - items: ['고객 관심 유도 및 매출 상승', 'SNS를 통한 브랜드 인지도 상승'], - effects: ['재방문율 및 공유 유도', '지역 내 인지도 향상'] } } } @@ -1025,17 +1020,30 @@ const chartDataPoints = computed(() => { const data = currentChartData.value if (!data || data.length === 0) return [] - const maxSales = Math.max(...data.map(d => Math.max(d.sales, d.target))) + const maxValue = Math.max(...data.map(d => Math.max(d.sales, d.target))) + + // Canvas의 실제 padding과 일치하는 좌표 계산 + const padding = 60 // drawChart에서 사용하는 padding과 동일 + const canvasWidth = 800 // Canvas width와 동일 + const canvasHeight = 300 // Canvas height와 동일 + const chartWidth = canvasWidth - padding * 2 + const chartHeight = canvasHeight - padding * 2 return data.map((item, index) => { - const chartStartPercent = 8 - const chartEndPercent = 92 - const chartWidth = chartEndPercent - chartStartPercent + // Canvas에서 그려지는 실제 좌표 계산 + const canvasX = padding + (index * chartWidth / (data.length - 1)) + const canvasY = padding + chartHeight - ((item.sales / maxValue) * chartHeight) + const targetCanvasY = padding + chartHeight - ((item.target / maxValue) * chartHeight) + + // 백분율로 변환하되, data-points의 padding을 고려 + const xPercent = (canvasX / canvasWidth) * 100 + const yPercent = ((canvasHeight - canvasY + padding) / canvasHeight) * 100 - 15 + const targetYPercent = ((canvasHeight - targetCanvasY + padding) / canvasHeight) * 100 - 15 return { - x: chartStartPercent + (index * chartWidth / (data.length - 1)), - y: 10 + ((item.sales / maxSales) * 80), - targetY: 10 + ((item.target / maxSales) * 80), + x: xPercent, + y: yPercent, + targetY: targetYPercent, sales: item.sales, target: item.target, label: item.label @@ -1479,7 +1487,7 @@ onMounted(async () => { left: 0; top: 0; bottom: 0; - width: 40px; + width: 50px; } .y-label { @@ -1491,8 +1499,8 @@ onMounted(async () => { .chart-grid { position: absolute; - left: 40px; - right: 0; + left: 60px; + right: 60px; top: 0; bottom: 0; } @@ -1515,7 +1523,7 @@ onMounted(async () => { .data-points { position: absolute; - left: 40px; + left: 0; right: 0; top: 0; bottom: 0; From ccdc2c91bbcf14e35bf3ac7b1b085daa62e788f9 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 18 Jun 2025 10:17:32 +0900 Subject: [PATCH 06/11] StoreManagementView.vue services/api.js edit --- public/images/menu-placeholder.png | Bin 0 -> 98463 bytes src/services/api.js | 170 ++- src/store/index.js | 152 +- src/views/ContentManagementView.vue | 950 ++++++------ src/views/StoreManagementView.vue | 2166 ++++++++++++++++----------- 5 files changed, 1933 insertions(+), 1505 deletions(-) create mode 100644 public/images/menu-placeholder.png diff --git a/public/images/menu-placeholder.png b/public/images/menu-placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..f097a4be651469bbf2d7db2b1d022fa6a458c09c GIT binary patch literal 98463 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

Kyo@V&%>8#&hN`Bz( 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 H*5UsF{(mWZ literal 0 HcmV?d00001 diff --git a/src/services/api.js b/src/services/api.js index 6fbd09d..6ac5977 100644 --- a/src/services/api.js +++ b/src/services/api.js @@ -1,4 +1,5 @@ -//* src/services/api.js - 수정된 API URL 설정 +//* src/services/api.js - 수정된 버전 (createImageApiInstance 함수 추가) + import axios from 'axios' // 런타임 환경 설정에서 API URL 가져오기 @@ -11,10 +12,9 @@ const getApiUrls = () => { STORE_URL: config.STORE_URL || 'http://localhost:8082/api/store', CONTENT_URL: config.CONTENT_URL || 'http://localhost:8083/api/content', MENU_URL: config.MENU_URL || 'http://localhost:8082/api/menu', - // ⚠️ 수정: 매출 API는 store 서비스 (포트 8082) SALES_URL: config.SALES_URL || 'http://localhost:8082/api/sales', - // ⚠️ 수정: 추천 API는 ai-recommend 서비스 (포트 8084) - RECOMMEND_URL: config.RECOMMEND_URL || 'http://localhost:8084/api/recommendations' + RECOMMEND_URL: config.RECOMMEND_URL || 'http://localhost:8084/api/recommendations', + IMAGE_URL: config.IMAGE_URL || 'http://localhost:8082/api/images' } } @@ -37,7 +37,6 @@ const createApiInstance = (baseURL) => { config.headers.Authorization = `Bearer ${token}` } - // ⚠️ 추가: 요청 로깅 (개발 환경에서만) if (import.meta.env.DEV) { console.log(`🌐 [API_REQ] ${config.method?.toUpperCase()} ${config.baseURL}${config.url}`) } @@ -52,14 +51,12 @@ const createApiInstance = (baseURL) => { // 응답 인터셉터 - 토큰 갱신 및 에러 처리 instance.interceptors.response.use( (response) => { - // ⚠️ 추가: 응답 로깅 (개발 환경에서만) if (import.meta.env.DEV) { console.log(`✅ [API_RES] ${response.status} ${response.config?.method?.toUpperCase()} ${response.config?.url}`) } return response }, async (error) => { - // ⚠️ 추가: 에러 로깅 (개발 환경에서만) if (import.meta.env.DEV) { console.error(`❌ [API_ERR] ${error.response?.status || 'Network'} ${error.config?.method?.toUpperCase()} ${error.config?.url}`, error.response?.data) } @@ -102,10 +99,155 @@ const createApiInstance = (baseURL) => { return instance } +// ✅ 이미지 업로드 전용 API 인스턴스 생성 함수 추가 +const createImageApiInstance = (baseURL) => { + const instance = axios.create({ + baseURL, + timeout: 60000, // 이미지 업로드는 시간이 더 걸릴 수 있음 + headers: { + Accept: 'application/json', + }, + }) + + // 요청 인터셉터 - JWT 토큰 자동 추가 + instance.interceptors.request.use( + (config) => { + const token = localStorage.getItem('accessToken') + if (token) { + config.headers.Authorization = `Bearer ${token}` + } + + if (import.meta.env.DEV) { + console.log(`🌐 [IMG_REQ] ${config.method?.toUpperCase()} ${config.baseURL}${config.url}`) + console.log('FormData 포함:', config.data instanceof FormData) + } + + return config + }, + (error) => { + return Promise.reject(error) + }, + ) + + // 응답 인터셉터 + instance.interceptors.response.use( + (response) => { + if (import.meta.env.DEV) { + console.log(`✅ [IMG_RES] ${response.status} ${response.config?.method?.toUpperCase()} ${response.config?.url}`) + } + return response + }, + async (error) => { + if (import.meta.env.DEV) { + console.error(`❌ [IMG_ERR] ${error.response?.status || 'Network'} ${error.config?.method?.toUpperCase()} ${error.config?.url}`, error.response?.data) + } + + // 토큰 갱신 로직은 기존과 동일 + const originalRequest = error.config + if (error.response?.status === 401 && !originalRequest._retry) { + originalRequest._retry = true + try { + const refreshToken = localStorage.getItem('refreshToken') + if (refreshToken) { + const refreshResponse = await axios.post(`${getApiUrls().AUTH_URL}/refresh`, { + refreshToken, + }) + const { accessToken, refreshToken: newRefreshToken } = refreshResponse.data.data + localStorage.setItem('accessToken', accessToken) + localStorage.setItem('refreshToken', newRefreshToken) + originalRequest.headers.Authorization = `Bearer ${accessToken}` + return instance(originalRequest) + } + } catch (refreshError) { + localStorage.removeItem('accessToken') + localStorage.removeItem('refreshToken') + localStorage.removeItem('userInfo') + window.location.href = '/login' + } + } + return Promise.reject(error) + }, + ) + + return instance +} + +// ✅ 메뉴 이미지 업로드 전용 API 인스턴스 생성 함수 추가 +const createMenuImageApiInstance = (baseURL) => { + const instance = axios.create({ + baseURL, + timeout: 60000, // 이미지 업로드는 시간이 더 걸릴 수 있음 + headers: { + Accept: 'application/json', + }, + }) + + // 요청 인터셉터 - JWT 토큰 자동 추가 + instance.interceptors.request.use( + (config) => { + const token = localStorage.getItem('accessToken') + if (token) { + config.headers.Authorization = `Bearer ${token}` + } + + if (import.meta.env.DEV) { + console.log(`🌐 [MENU_IMG_REQ] ${config.method?.toUpperCase()} ${config.baseURL}${config.url}`) + console.log('FormData 포함:', config.data instanceof FormData) + } + + return config + }, + (error) => { + return Promise.reject(error) + }, + ) + + // 응답 인터셉터 + instance.interceptors.response.use( + (response) => { + if (import.meta.env.DEV) { + console.log(`✅ [MENU_IMG_RES] ${response.status} ${response.config?.method?.toUpperCase()} ${response.config?.url}`) + } + return response + }, + async (error) => { + if (import.meta.env.DEV) { + console.error(`❌ [MENU_IMG_ERR] ${error.response?.status || 'Network'} ${error.config?.method?.toUpperCase()} ${error.config?.url}`, error.response?.data) + } + + // 토큰 갱신 로직은 기존과 동일 + const originalRequest = error.config + if (error.response?.status === 401 && !originalRequest._retry) { + originalRequest._retry = true + try { + const refreshToken = localStorage.getItem('refreshToken') + if (refreshToken) { + const refreshResponse = await axios.post(`${getApiUrls().AUTH_URL}/refresh`, { + refreshToken, + }) + const { accessToken, refreshToken: newRefreshToken } = refreshResponse.data.data + localStorage.setItem('accessToken', accessToken) + localStorage.setItem('refreshToken', newRefreshToken) + originalRequest.headers.Authorization = `Bearer ${accessToken}` + return instance(originalRequest) + } + } catch (refreshError) { + localStorage.removeItem('accessToken') + localStorage.removeItem('refreshToken') + localStorage.removeItem('userInfo') + window.location.href = '/login' + } + } + return Promise.reject(error) + }, + ) + + return instance +} + // API 인스턴스들 생성 const apiUrls = getApiUrls() -// ⚠️ 추가: API URL 확인 로깅 (개발 환경에서만) if (import.meta.env.DEV) { console.log('🔧 [API_CONFIG] API URLs 설정:', apiUrls) } @@ -115,8 +257,11 @@ 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 menuImageApi = createMenuImageApiInstance(apiUrls.MENU_URL) // ✅ 추가 export const salesApi = createApiInstance(apiUrls.SALES_URL) export const recommendApi = createApiInstance(apiUrls.RECOMMEND_URL) +export const imageApi = createApiInstance(apiUrls.IMAGE_URL) +export const apiWithImage = imageApi // 별칭 (기존 코드 호환성) // 기본 API 인스턴스 (Gateway URL 사용) export const api = createApiInstance(apiUrls.GATEWAY_URL) @@ -185,7 +330,7 @@ export const formatSuccessResponse = (data, message = '요청이 성공적으로 } } -// ⚠️ 추가: API 상태 확인 함수 +// API 상태 확인 함수 export const checkApiHealth = async () => { const results = {} @@ -214,11 +359,14 @@ export const checkApiHealth = async () => { return results } -// ⚠️ 추가: 개발 환경에서 전역 노출 +// 개발 환경에서 전역 노출 if (import.meta.env.DEV) { window.__api_debug__ = { urls: apiUrls, - instances: { memberApi, authApi, storeApi, contentApi, menuApi, salesApi, recommendApi }, + instances: { + memberApi, authApi, storeApi, contentApi, menuApi, menuImageApi, + salesApi, recommendApi, imageApi + }, checkHealth: checkApiHealth } console.log('🔧 [DEBUG] API 인스턴스가 window.__api_debug__에 노출됨') diff --git a/src/store/index.js b/src/store/index.js index 8ff224a..98da823 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -79,80 +79,88 @@ export const useStoreStore = defineStore('store', { } }, - /** - * 메뉴 목록 조회 - 실제 API 연동 (매장 ID 필요) - ✅ ID 필드 보장 - */ - async fetchMenus() { - console.log('=== Store 스토어: 메뉴 목록 조회 시작 ===') + // src/store/index.js에서 fetchMenus 부분만 수정 + +/** + * 메뉴 목록 조회 - 실제 API 연동 (매장 ID 필요) - ✅ 이미지 필드 매핑 수정 + */ +async fetchMenus() { + console.log('=== Store 스토어: 메뉴 목록 조회 시작 ===') + + try { + // 매장 정보에서 storeId 가져오기 + const storeId = this.storeInfo?.storeId + if (!storeId) { + console.warn('매장 ID가 없습니다. 매장 정보를 먼저 조회해주세요.') + return { success: false, message: '매장 정보가 필요합니다', data: [] } + } + + // 메뉴 서비스 임포트 + const { menuService } = await import('@/services/menu') + + console.log('메뉴 목록 API 호출, 매장 ID:', storeId) + const result = await menuService.getMenus(storeId) + + console.log('=== Store 스토어: 메뉴 API 응답 분석 ===') + console.log('Result:', result) + console.log('Result.success:', result.success) + console.log('Result.data:', result.data) + console.log('Result.message:', result.message) + + if (result.success && result.data) { + // ✅ 백엔드 MenuResponse의 필드명에 맞게 매핑 수정 + const menusWithId = (result.data || []).map(menu => { + // ID 필드가 확실히 있도록 보장 + const menuId = menu.menuId || menu.id + + if (!menuId) { + console.warn('⚠️ 메뉴 ID가 없는 항목 발견:', menu) + } + + console.log('메뉴 원본 데이터:', menu) // 디버깅용 + + return { + ...menu, + id: menuId, // ✅ id 필드 확실히 설정 + menuId: menuId, // ✅ menuId 필드도 설정 + // 기타 필드들 보장 + menuName: menu.menuName || menu.name || '이름 없음', + category: menu.category || '기타', + price: menu.price || 0, + description: menu.description || '', + available: menu.available !== undefined ? menu.available : true, + recommended: menu.recommended !== undefined ? menu.recommended : false, + // ✅ 이미지 필드 수정: 백엔드는 'image' 필드 사용 + imageUrl: menu.image || menu.imageUrl || '/images/menu-placeholder.png', + image: menu.image || menu.imageUrl, // 백엔드 호환성 + createdAt: menu.createdAt, + updatedAt: menu.updatedAt + } + }) - try { - // 매장 정보에서 storeId 가져오기 - const storeId = this.storeInfo?.storeId - if (!storeId) { - console.warn('매장 ID가 없습니다. 매장 정보를 먼저 조회해주세요.') - return { success: false, message: '매장 정보가 필요합니다', data: [] } - } - - // 메뉴 서비스 임포트 - const { menuService } = await import('@/services/menu') - - console.log('메뉴 목록 API 호출, 매장 ID:', storeId) - const result = await menuService.getMenus(storeId) - - console.log('=== Store 스토어: 메뉴 API 응답 분석 ===') - console.log('Result:', result) - console.log('Result.success:', result.success) - console.log('Result.data:', result.data) - console.log('Result.message:', result.message) - - if (result.success && result.data) { - // ✅ 메뉴 데이터 ID 필드 보장 처리 - const menusWithId = (result.data || []).map(menu => { - // ID 필드가 확실히 있도록 보장 - const menuId = menu.menuId || menu.id - - if (!menuId) { - console.warn('⚠️ 메뉴 ID가 없는 항목 발견:', menu) - } - - return { - ...menu, - id: menuId, // ✅ id 필드 확실히 설정 - menuId: menuId, // ✅ menuId 필드도 설정 - // 기타 필드들 보장 - menuName: menu.menuName || menu.name || '이름 없음', - category: menu.category || '기타', - price: menu.price || 0, - description: menu.description || '', - available: menu.available !== undefined ? menu.available : true, - recommended: menu.recommended !== undefined ? menu.recommended : false, - imageUrl: menu.imageUrl || '/images/menu-placeholder.png' - } - }) - - // 메뉴 목록이 있는 경우 - console.log('✅ 메뉴 목록 설정 (ID 보장됨):', menusWithId) - this.menus = menusWithId - return { success: true, data: menusWithId } - } else { - // 메뉴가 없거나 조회 실패한 경우 - console.log('⚠️ 메뉴 목록 없음 또는 조회 실패') - this.menus = [] - - if (result.message === '등록된 메뉴가 없습니다') { - return { success: false, message: '등록된 메뉴가 없습니다', data: [] } - } else { - return { success: false, message: result.message || '메뉴 목록 조회에 실패했습니다', data: [] } - } - } - } catch (error) { - console.error('=== Store 스토어: 메뉴 목록 조회 실패 ===') - console.error('Error:', error) - - this.menus = [] - return { success: false, message: error.message || '메뉴 목록을 불러오는데 실패했습니다', data: [] } + // 메뉴 목록이 있는 경우 + console.log('✅ 메뉴 목록 설정 (이미지 필드 매핑 완료):', menusWithId) + this.menus = menusWithId + return { success: true, data: menusWithId } + } else { + // 메뉴가 없거나 조회 실패한 경우 + console.log('⚠️ 메뉴 목록 없음 또는 조회 실패') + this.menus = [] + + if (result.message === '등록된 메뉴가 없습니다') { + return { success: false, message: '등록된 메뉴가 없습니다', data: [] } + } else { + return { success: false, message: result.message || '메뉴 목록 조회에 실패했습니다', data: [] } } - }, + } + } catch (error) { + console.error('=== Store 스토어: 메뉴 목록 조회 실패 ===') + console.error('Error:', error) + + this.menus = [] + return { success: false, message: error.message || '메뉴 목록을 불러오는데 실패했습니다', data: [] } + } + }, /** * 매장 등록 diff --git a/src/views/ContentManagementView.vue b/src/views/ContentManagementView.vue index 26006c9..c927e13 100644 --- a/src/views/ContentManagementView.vue +++ b/src/views/ContentManagementView.vue @@ -1,351 +1,359 @@ //* src/views/ContentManagementView.vue