Spaces:
Sleeping
Sleeping
import gradio as gr | |
import datetime | |
import calendar | |
class EventManager: | |
def __init__(self): | |
# 월별 기본 컨셉 정의 | |
self.monthly_concepts = { | |
1: {"theme": "신년/설날", "colors": ["#FF6B6B", "#FFE66D"], "mood": "희망찬, 따뜻한"}, | |
2: {"theme": "발렌타인데이", "colors": ["#FF69B4", "#FFB6C1"], "mood": "로맨틱, 달콤한"}, | |
3: {"theme": "화이트데이/봄", "colors": ["#FFFFFF", "#F0F8FF"], "mood": "순수한, 상쾌한"}, | |
4: {"theme": "벚꽃/봄나들이", "colors": ["#FFB7C5", "#98FB98"], "mood": "생기발랄, 활기찬"}, | |
5: {"theme": "로즈데이/가정의달", "colors": ["#FF1493", "#FF69B4"], "mood": "감사한, 사랑스러운"}, | |
6: {"theme": "결혼시즌/초여름", "colors": ["#87CEEB", "#F0E68C"], "mood": "청량한, 행복한"}, | |
7: {"theme": "여름휴가", "colors": ["#00CED1", "#FFE4B5"], "mood": "시원한, 자유로운"}, | |
8: {"theme": "무더위극복", "colors": ["#20B2AA", "#F0FFFF"], "mood": "시원한, 에너지 넘치는"}, | |
9: {"theme": "가을시작", "colors": ["#DEB887", "#CD853F"], "mood": "따뜻한, 아늑한"}, | |
10: {"theme": "할로윈", "colors": ["#FF4500", "#8B0000"], "mood": "신비로운, 재미있는"}, | |
11: {"theme": "단풍/감사", "colors": ["#DAA520", "#B22222"], "mood": "감사한, 따뜻한"}, | |
12: {"theme": "크리스마스/연말", "colors": ["#DC143C", "#228B22"], "mood": "축제같은, 따뜻한"} | |
} | |
# 이벤트 타입별 기본 설정 | |
self.event_types = { | |
"댓글이벤트": { | |
"action": "댓글 작성", | |
"reward_frequency": "1시간마다", | |
"participation": "유익하고 착한 댓글 남기기" | |
}, | |
"채용공고": { | |
"action": "채용공고 확인", | |
"reward_frequency": "일별", | |
"participation": "채용공고 열람 및 지원" | |
}, | |
"게시글작성": { | |
"action": "게시글 작성", | |
"reward_frequency": "일별", | |
"participation": "양질의 게시글 작성" | |
} | |
} | |
def calculate_event_duration(self, start_date: str, end_date: str): | |
"""이벤트 기간 계산""" | |
try: | |
start = datetime.datetime.strptime(start_date, "%Y-%m-%d") | |
end = datetime.datetime.strptime(end_date, "%Y-%m-%d") | |
duration = (end - start).days + 1 | |
month = start.month | |
return duration, month | |
except: | |
return 0, 0 | |
def generate_monthly_concept(self, month: int): | |
"""월별 컨셉 생성""" | |
if month in self.monthly_concepts: | |
concept = self.monthly_concepts[month] | |
return { | |
"theme": concept["theme"], | |
"colors": concept["colors"], | |
"mood": concept["mood"], | |
"month_name": calendar.month_name[month] | |
} | |
return {} | |
def generate_event_copy(self, event_type: str, concept: Dict, duration: int, | |
custom_details: str = "") -> str: | |
"""이벤트 카피 생성""" | |
if not concept: | |
return "먼저 이벤트 기간을 설정해주세요." | |
theme = concept.get("theme", "특별한") | |
mood = concept.get("mood", "즐거운") | |
base_copy = f"""✨ {theme} 특별 이벤트 ✨ | |
{mood} {theme} 시즌을 맞아 특별한 이벤트를 준비했어요! | |
🎯 이벤트 참여방법 | |
{self.event_types.get(event_type, {}).get('participation', '이벤트에 참여하세요')} | |
⏰ 이벤트 기간 | |
{duration}일간 진행되는 특별한 이벤트입니다! | |
🎁 혜택 | |
{self.event_types.get(event_type, {}).get('reward_frequency', '정기적으로')} 선물을 드려요! | |
""" | |
if custom_details: | |
base_copy += f"\n📝 추가 정보\n{custom_details}" | |
return base_copy | |
def generate_design_advice(self, concept: Dict) -> str: | |
"""디자인 조언 생성""" | |
if not concept: | |
return "컨셉 정보가 필요합니다." | |
colors = concept.get("colors", ["#000000", "#FFFFFF"]) | |
mood = concept.get("mood", "") | |
theme = concept.get("theme", "") | |
advice = f"""🎨 디자인 조언 | |
🎯 컬러 팔레트 | |
- 메인 컬러: {colors[0]} | |
- 서브 컬러: {colors[1]} | |
- 20-40대 여성에게 어필하는 {mood} 느낌 | |
📐 레이아웃 추천 | |
- 제목: 큰 폰트로 임팩트 있게 | |
- 핵심 정보: 시각적으로 구분되는 박스 활용 | |
- CTA 버튼: 눈에 띄는 컬러로 강조 | |
- 이미지: {theme} 테마에 맞는 일러스트 활용 | |
👀 가독성 향상 | |
- 충분한 여백 활용 | |
- 계층적 정보 구조 | |
- 스캔하기 쉬운 레이아웃 | |
- 모바일 친화적 디자인""" | |
return advice | |
def create_interface(): | |
event_manager = EventManager() | |
with gr.Blocks(title="이벤트 관리 시스템", theme=gr.themes.Soft()) as demo: | |
gr.Markdown("# 🎉 이벤트 관리 시스템") | |
gr.Markdown("월별 이벤트 기획부터 디자인 조언까지 한 번에!") | |
with gr.Row(): | |
with gr.Column(scale=1): | |
gr.Markdown("## 📅 이벤트 기본 정보") | |
start_date = gr.Textbox( | |
label="이벤트 시작일", | |
placeholder="YYYY-MM-DD (예: 2025-05-15)", | |
value="2025-05-15" | |
) | |
end_date = gr.Textbox( | |
label="이벤트 종료일", | |
placeholder="YYYY-MM-DD (예: 2025-05-25)", | |
value="2025-05-25" | |
) | |
event_type = gr.Dropdown( | |
choices=list(event_manager.event_types.keys()), | |
label="이벤트 종류", | |
value="댓글이벤트" | |
) | |
custom_details = gr.Textbox( | |
label="추가 상세내용", | |
placeholder="특별한 조건이나 상세 내용을 입력하세요", | |
lines=3 | |
) | |
generate_btn = gr.Button("✨ 이벤트 생성하기", variant="primary") | |
with gr.Column(scale=2): | |
gr.Markdown("## 📊 생성 결과") | |
duration_info = gr.Textbox( | |
label="이벤트 기간 정보", | |
interactive=False | |
) | |
concept_info = gr.Textbox( | |
label="월별 컨셉 정보", | |
interactive=False, | |
lines=3 | |
) | |
event_copy = gr.Textbox( | |
label="이벤트 카피", | |
interactive=False, | |
lines=8 | |
) | |
design_advice = gr.Textbox( | |
label="디자인 조언", | |
interactive=False, | |
lines=10 | |
) | |
def generate_event_content(start_date_val, end_date_val, event_type_val, custom_details_val): | |
# 기간 계산 | |
duration, month = event_manager.calculate_event_duration(start_date_val, end_date_val) | |
if duration == 0: | |
return "날짜 형식을 확인해주세요", "", "", "" | |
duration_text = f"{duration}일간 ({start_date_val} ~ {end_date_val})" | |
# 월별 컨셉 생성 | |
concept = event_manager.generate_monthly_concept(month) | |
concept_text = f"테마: {concept.get('theme', '')}\n분위기: {concept.get('mood', '')}\n컬러: {', '.join(concept.get('colors', []))}" | |
# 카피 생성 | |
copy_text = event_manager.generate_event_copy(event_type_val, concept, duration, custom_details_val) | |
# 디자인 조언 생성 | |
design_text = event_manager.generate_design_advice(concept) | |
return duration_text, concept_text, copy_text, design_text | |
generate_btn.click( | |
fn=generate_event_content, | |
inputs=[start_date, end_date, event_type, custom_details], | |
outputs=[duration_info, concept_info, event_copy, design_advice] | |
) | |
gr.Markdown(""" | |
## 📝 사용 가이드 | |
1. **이벤트 기간 설정**: 시작일과 종료일을 YYYY-MM-DD 형식으로 입력 | |
2. **이벤트 종류 선택**: 드롭다운에서 이벤트 타입 선택 | |
3. **추가 정보 입력**: 특별한 조건이나 상세내용 입력 (선택사항) | |
4. **생성하기 클릭**: 자동으로 컨셉, 카피, 디자인 조언 생성 | |
### 🎯 다음 단계 개발 예정 | |
- 이미지 레퍼런스 분석 기능 | |
- 상세한 공지사항 템플릿 | |
- 이벤트 종류별 맞춤 설정 | |
""") | |
return demo | |
if __name__ == "__main__": | |
demo = create_interface() | |
demo.launch(share=True) |