From 009bbfcef34eb1945047a91be377c4041aefc8df Mon Sep 17 00:00:00 2001 From: SeoJHeasdw Date: Fri, 13 Jun 2025 09:59:00 +0900 Subject: [PATCH] release --- src/views/ContentCreationView.vue | 548 +++++++++++++----------------- 1 file changed, 244 insertions(+), 304 deletions(-) diff --git a/src/views/ContentCreationView.vue b/src/views/ContentCreationView.vue index dab915f..3c7e74d 100644 --- a/src/views/ContentCreationView.vue +++ b/src/views/ContentCreationView.vue @@ -4,7 +4,10 @@ - +
@@ -15,137 +18,213 @@ - - - 1. 콘텐츠 유형 선택 - - - - - - {{ type.icon }} - -
- {{ type.label }} -
-
- {{ type.description }} -
-
-
-
-
-
- - -
- + +
+ - 2. 기본 정보 + 1. 콘텐츠 유형 선택 - - - - - - + - - - - - - - - - - - - - - - - - - - + + + {{ type.icon }} + +
+ {{ type.label }} +
+
+ {{ type.description }} +
+
+ +
+ +
+ + + 2. 기본 정보 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4. 이미지 첨부 + + + + +
+
+ + + mdi-close + +
+
+
+
+ + + + + + mdi-arrow-right + 다음 + + + +
+
+ + +
+ + + mdi-arrow-left + 이전 + + 3. AI 옵션 설정 @@ -203,7 +282,7 @@ - + 3. 콘텐츠 직접 입력 @@ -241,50 +320,7 @@ - - - {{ useAI ? '4' : '5' }}. 이미지 첨부 - - - - -
-
- - - mdi-close - -
-
-
-
- - + @@ -302,17 +338,21 @@ size="large" block :loading="isGenerating" - :disabled="!canGenerate" + :disabled="!canGenerate || remainingGenerations <= 0" @click="generateContent" class="mb-2" > {{ useAI ? 'mdi-robot' : 'mdi-content-save' }} - {{ useAI ? 'AI 콘텐츠 신규 생성' : '콘텐츠 저장' }} + {{ useAI ? `AI 콘텐츠 신규 생성 (${remainingGenerations}회)` : '콘텐츠 저장' }} - + +
+ mdi-information + AI 생성은 최대 3회까지 가능합니다. (남은 횟수: {{ remainingGenerations }}회) +
@@ -321,7 +361,7 @@ - +
@@ -329,14 +369,6 @@ mdi-file-document-multiple

콘텐츠 생성 결과

- - mdi-delete-sweep -
@@ -379,16 +411,6 @@ {{ version.title }} - - - - mdi-delete-outline -
@@ -458,18 +480,8 @@ - + - - mdi-pencil - 수정 - - + {{ selectedVersionData.title }} (버전 {{ selectedVersion + 1 }}) @@ -558,16 +570,13 @@ - - - 수정하기 - - + + mdi-send 발행하기 @@ -611,6 +620,7 @@ const contentStore = useContentStore() const appStore = useAppStore() // 반응형 데이터 +const currentStep = ref(1) // 현재 단계 (1: 첫번째 화면, 2: 두번째 화면) const selectedType = ref('') const formValid = ref(false) const useAI = ref(true) @@ -623,6 +633,7 @@ const showDetailDialog = ref(false) const selectedVersion = ref(0) const generatedVersions = ref([]) const hashtagInput = ref('') +const remainingGenerations = ref(3) // AI 생성 가능 횟수 // 폼 데이터 const formData = ref({ @@ -755,7 +766,7 @@ const contentRules = [ ] // 컴퓨티드 속성 -const canGenerate = computed(() => { +const canProceedToNext = computed(() => { if (!selectedType.value || !formData.value.title || !formData.value.platform || !formData.value.targetType) { return false } @@ -764,6 +775,10 @@ const canGenerate = computed(() => { return false } + return true +}) + +const canGenerate = computed(() => { if (!useAI.value && !formData.value.content) { return false } @@ -780,6 +795,16 @@ const selectContentType = (type) => { selectedType.value = type } +const goToNextStep = () => { + if (canProceedToNext.value) { + currentStep.value = 2 + } +} + +const goToPreviousStep = () => { + currentStep.value = 1 +} + const handleFileUpload = (files) => { if (files?.length) { previewImages.value = [] @@ -822,7 +847,7 @@ const removeHashtag = (index) => { } const generateContent = async () => { - if (!canGenerate.value) return + if (!canGenerate.value || remainingGenerations.value <= 0) return // 최대 3개 버전 체크 if (generatedVersions.value.length >= 3) { @@ -859,6 +884,8 @@ const generateContent = async () => { createdAt: new Date(), status: 'draft', } + // AI 생성 횟수 차감 + remainingGenerations.value-- } else { // 수동 입력 콘텐츠 newContent = { @@ -881,77 +908,11 @@ const generateContent = async () => { } } -const generateAdditionalVersion = async () => { - await generateContent() -} - const selectVersion = (index) => { selectedVersion.value = index showDetailDialog.value = true } -const editVersion = (index) => { - const version = generatedVersions.value[index] - - // 폼에 버전 데이터 로드 - formData.value = { - title: version.title, - platform: version.platform, - targetType: version.targetType, - eventName: version.eventName || '', - startDate: version.startDate || '', - endDate: version.endDate || '', - content: version.content || '', - hashtags: [...(version.hashtags || [])], - } - - selectedType.value = version.type - - if (version.aiOptions) { - aiOptions.value = { ...version.aiOptions } - useAI.value = true - } else { - useAI.value = false - } - - showDetailDialog.value = false - appStore.showSnackbar('버전 데이터를 폼에 로드했습니다. 수정 후 다시 생성해주세요.', 'info') -} - -const duplicateVersion = async (index) => { - if (generatedVersions.value.length >= 3) { - appStore.showSnackbar('최대 3개의 버전까지만 생성할 수 있습니다.', 'warning') - return - } - - const version = generatedVersions.value[index] - const duplicated = { - ...version, - id: Date.now() + Math.random(), - title: `${version.title} (복사본)`, - createdAt: new Date(), - } - - generatedVersions.value.push(duplicated) - selectedVersion.value = generatedVersions.value.length - 1 - - appStore.showSnackbar('버전이 복사되었습니다.', 'success') -} - -const deleteVersion = (index) => { - generatedVersions.value.splice(index, 1) - if (selectedVersion.value >= generatedVersions.value.length) { - selectedVersion.value = Math.max(0, generatedVersions.value.length - 1) - } - appStore.showSnackbar('버전이 삭제되었습니다.', 'info') -} - -const clearAllVersions = () => { - generatedVersions.value = [] - selectedVersion.value = 0 - appStore.showSnackbar('모든 버전이 삭제되었습니다.', 'info') -} - const publishVersion = async (index) => { isPublishing.value = true publishingIndex.value = index @@ -983,31 +944,6 @@ const publishVersion = async (index) => { } } -const saveDraft = async () => { - try { - const draftData = { - title: formData.value.title, - type: selectedType.value, - platform: formData.value.platform, - targetType: formData.value.targetType, - eventName: formData.value.eventName, - startDate: formData.value.startDate, - endDate: formData.value.endDate, - content: formData.value.content, - hashtags: formData.value.hashtags, - images: previewImages.value.map(img => img.url), - status: 'draft', - createdAt: new Date(), - } - - await contentStore.addContent(draftData) - appStore.showSnackbar('임시저장되었습니다', 'success') - } catch (error) { - console.error('임시저장 실패:', error) - appStore.showSnackbar('임시저장에 실패했습니다', 'error') - } -} - // 유틸리티 함수 const getPlatformColor = (platform) => { return PLATFORM_COLORS[platform] || 'grey' @@ -1048,8 +984,12 @@ formData.value.endDate = today