☕ 카페 시그니처 음료 투표 이벤트 - 고객이 선택하는 이달의 메뉴
cafe-drink-voting-event
문제 설명
프로젝트 개요
카페 운영자를 위한 고객 참여형 이벤트 페이지를 만듭니다. 고객들이 카페의 시그니처 음료 후보들을 보고 투표하여 '이달의 음료'를 직접 선정하는 시스템입니다. 투표 결과는 실시간으로 집계되어 막대 그래프로 표시됩니다.
필수 기능
- 음료 후보 목록 표시: 이미지, 이름, 간단한 설명이 포함된 음료 카드 레이아웃
- 투표 기능: 각 음료마다 '투표하기' 버튼, 한 사용자당 1회만 투표 가능 (세션 기반)
- 실시간 투표 결과: 각 음료별 득표수와 득표율을 막대 그래프로 시각화
- 투표 완료 메시지: 투표 후 감사 메시지와 현재 1위 음료 표시
- 반응형 디자인: 모바일에서도 예쁘게 보이는 카드 레이아웃
선택 추가 기능 (보너스)
- 투표 종료 카운트다운 타이머 추가
- 투표 후 SNS 공유 버튼 ("나는 OO에 투표했어요!")
- 음료별 '좋아요' 댓글 남기기 기능
- 관리자 페이지: 음료 후보 추가/수정/삭제
- 투표 결과 PDF 다운로드 (차트 포함)
기술 스택
- 백엔드: Laravel 13.x (Blade 템플릿)
- 데이터베이스: SQLite (간단한 설정)
- 프론트엔드: Blade 컴포넌트 + Tailwind CSS
- 기타: Alpine.js (선택적, 간단한 인터랙션용)
학습 목표
- Laravel 라우팅과 컨트롤러 기초
- Eloquent ORM을 활용한 데이터 CRUD
- Blade 템플릿 문법과 컴포넌트 사용법
- 세션을 활용한 중복 방지 로직
- Tailwind CSS로 카드 레이아웃 구성
- 간단한 차트 시각화 (HTML/CSS 기반)
제약 조건
- • Laravel 13.x 최신 버전 사용 (composer create-project laravel/laravel 명령으로 설치)
- • Blade 템플릿 엔진만 사용 (React, Vue 등 SPA 프레임워크 금지)
- • SQLite 데이터베이스 사용 (별도 DB 서버 설정 불필요)
- • Tailwind CSS로 스타일링 (CDN 또는 Laravel Mix 설정)
- • 한 사용자(세션)당 1회만 투표 가능하도록 제한
- • 이미지는 public/images 폴더에 저장하거나 외부 URL 사용
- • 투표 결과는 백분율과 막대 그래프로 시각화
- • 모바일 반응형 디자인 필수
프롬프트 레시피
아래 프롬프트를 순서대로 AI에게 보내면 됩니다. 복사 버튼을 눌러 바로 사용하세요.
mkdir cafe-drink-voting-event && cd cafe-drink-voting-event
이 폴더에서 Laravel 13.x 프로젝트를 시작합니다.
다음 작업을 수행해주세요:
1. Laravel 13.x 프로젝트를 생성하세요 (composer create-project laravel/laravel .).
2. .env 파일에서 DB_CONNECTION을 sqlite로 변경하고, database/database.sqlite 파일을 생성하세요.
3. Tailwind CSS를 설정하세요 (npm install -D tailwindcss postcss autoprefixer && npx tailwindcss init -p). tailwind.config.js에서 content 경로를 './resources/**/*.blade.php', './resources/**/*.js'로 설정하세요.
4. resources/css/app.css에 Tailwind 디렉티브를 추가하세요 (@tailwind base; @tailwind components; @tailwind utilities;).
5. resources/views/layouts/app.blade.php 레이아웃 파일을 만들어주세요. 이 파일에는 HTML 기본 구조와 @vite('resources/css/app.css') 태그를 포함하세요.
6. npm install && npm run dev 명령으로 Vite 개발 서버를 실행하세요.
완료되면 php artisan serve로 Laravel 서버를 실행하고, 기본 페이지가 정상적으로 로드되는지 확인해주세요.
기대 결과: Laravel 13.x 프로젝트가 생성되고, SQLite 데이터베이스가 설정되며, Tailwind CSS가 통합됩니다. Vite 개발 서버와 Laravel 서버가 정상적으로 실행됩니다.
음료(Drink) 모델과 투표(Vote) 모델을 생성하고, 데이터베이스 마이그레이션을 작성해주세요. **Drink 모델 (음료 후보)**: - 필드: id, name (음료 이름), description (설명), image_url (이미지 URL), votes_count (득표수, 기본값 0) - php artisan make:model Drink -m 명령으로 모델과 마이그레이션 생성 **Vote 모델 (투표 기록)**: - 필드: id, drink_id (외래키, drinks 테이블 참조), session_id (세션 ID), voted_at (투표 시각) - php artisan make:model Vote -m 명령으로 모델과 마이그레이션 생성 **관계 설정**: - Drink 모델에 hasMany 관계 추가 (votes) - Vote 모델에 belongsTo 관계 추가 (drink) **시더(Seeder) 작성**: - database/seeders/DatabaseSeeder.php에서 Drink 테이블에 샘플 음료 4개를 추가하세요 (예: 아메리카노, 카페라떼, 바닐라라떼, 카라멜마끼아또). - 각 음료에는 이름, 설명, 이미지 URL(예: https://via.placeholder.com/300)을 포함하세요. 마이그레이션 실행 및 시더 실행: - php artisan migrate:fresh --seed
기대 결과: Drink와 Vote 모델이 생성되고, 데이터베이스 테이블이 마이그레이션됩니다. 샘플 음료 4개가 시더를 통해 데이터베이스에 추가됩니다.
투표 페이지를 만들어주세요.
**라우트 설정 (routes/web.php)**:
- GET / 경로: 투표 페이지 표시 (VoteController@index)
- POST /vote 경로: 투표 처리 (VoteController@store)
**VoteController 생성**:
- php artisan make:controller VoteController
- index() 메서드: 모든 Drink 레코드를 가져와서 resources/views/vote/index.blade.php 뷰에 전달. 세션에서 'voted' 키를 확인하여 이미 투표했는지 여부를 함께 전달.
- store() 메서드:
1. 세션에서 'voted' 키가 있으면 에러 메시지와 함께 리다이렉트
2. 요청에서 drink_id를 받아 해당 Drink의 votes_count를 +1 증가
3. Vote 레코드 생성 (drink_id, session_id는 session()->getId(), voted_at은 now())
4. 세션에 'voted' => true 저장
5. 성공 메시지와 함께 리다이렉트
**Blade 뷰 작성 (resources/views/vote/index.blade.php)**:
- layouts/app.blade.php 레이아웃 상속
- 페이지 제목: "☕ 이달의 시그니처 음료를 선택해주세요!"
- 음료 카드 그리드 레이아웃 (Tailwind CSS grid, 모바일 1열, 태블릿 2열, 데스크탑 4열)
- 각 음료 카드:
- 이미지 (rounded-lg shadow-md)
- 음료 이름 (font-bold text-lg)
- 설명 (text-gray-600 text-sm)
- 투표하기 버튼 (bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded)
- 이미 투표한 경우 버튼 비활성화 및 "투표 완료" 표시
- 투표 후 성공 메시지를 세션 플래시 메시지로 표시 (@if(session('success')))
Tailwind CSS로 카드 디자인을 예쁘게 꾸며주세요.
기대 결과: 투표 페이지가 완성되고, 음료 카드 그리드가 반응형으로 표시됩니다. 투표하기 버튼을 클릭하면 POST /vote 경로로 요청이 전송되고, 투표가 기록됩니다. 세션을 통해 중복 투표가 방지됩니다.
투표 결과 페이지를 만들어주세요. **라우트 추가 (routes/web.php)**: - GET /results 경로: 투표 결과 페이지 표시 (VoteController@results) **VoteController results() 메서드**: - 모든 Drink 레코드를 votes_count 내림차순으로 정렬하여 가져오기 - 전체 투표수 계산 (모든 Drink의 votes_count 합계) - 각 음료의 득표율(%) 계산하여 뷰에 전달 - resources/views/vote/results.blade.php 뷰 반환 **Blade 뷰 작성 (resources/views/vote/results.blade.php)**: - layouts/app.blade.php 레이아웃 상속 - 페이지 제목: "🏆 투표 결과 - 이달의 음료는?" - 1위 음료를 크게 강조 표시 (금색 배경, 트로피 이모지) - 각 음료별 투표 결과: - 음료 이름 - 득표수와 득표율 (예: "25표 (50%)") - 막대 그래프 (Tailwind CSS로 구현, width를 득표율에 따라 동적으로 설정) - 막대 그래프 색상: 1위는 금색(bg-yellow-500), 2위는 은색(bg-gray-400), 3위는 동색(bg-orange-400), 나머지는 파란색(bg-blue-500) - 하단에 "다시 투표하기" 링크 (GET / 경로로 이동, 단 세션 'voted' 키를 삭제해야 재투표 가능) **투표 페이지에 "결과 보기" 링크 추가**: - resources/views/vote/index.blade.php 하단에 "📊 현재 투표 결과 보기" 버튼 추가 (GET /results 경로로 이동) Tailwind CSS로 막대 그래프와 순위 표시를 시각적으로 매력적으로 만들어주세요.
기대 결과: 투표 결과 페이지가 완성되고, 각 음료의 득표수와 득표율이 막대 그래프로 시각화됩니다. 1위 음료는 금색으로 강조 표시됩니다. 투표 페이지에서 결과 페이지로 이동할 수 있는 링크가 추가됩니다.
제출된 작품 (0)
로그인 후 제출아직 제출된 작품이 없습니다. 첫 번째 도전자가 되어보세요!