Skip to content

De-cal/6-Favorite_Photo-FE

Repository files navigation

🖼️ 최애의 포토(FE)

당신의 최애는 무엇인가요? "최애의 포토"에서 확인하세요!

image


👨‍👩‍👧‍👦 팀원 소개

이태빈 김재욱 최민경 김수빈 이지수 안세빈 신수민
GitHub GitHub GitHub GitHub GitHub GitHub GitHub
팀장 부팀장 팀원 팀원 팀원 팀원 팀원
프로필
헤더
구매
교환(요청 취소)
알림
포인트
판매
교환(거절 승인)
공통 컴포넌트(카드)
로딩 인디케이터
포토카드 조회
인증/인가
구글 OAuth
랜딩페이지
공통 컴포넌트(버튼)
마켓플레이스 판매 취소

📑 프로젝트 소개

최애의 포토는 포인트를 재화로 사용하여 자신이 좋아하는 사진을 구매 할 수도 있고, 교환을 원하는 사람들끼리 서로의 카드를 교환할 수도 있습니다!
1시간 마다 등장하는 깜짝 포인트 이벤트를 통해 즐거운 경험도 해볼 수 있습니다!
서로의 포토카드를 교환하고, 나만의 포토카드를 자랑하는 재미와 함께 상호 교류도 즐길 수 있는 플랫폼, 최애의 포토에서 만나보세요!


📆 프로젝트 기간

2025.05.14 ~ 2025.06.04


⚙️ 기술 스택

Category Tech Stack
Frontend JavaScript Next.js React Tailwind CSS
Backend NodeJS express Nodemon prisma Postgres
Library ↳ Frontend
React Query Framer Motion date-fns crypto-js

↳ Backend
passport superstruct bcrypt express-jwt jsonwebtoken multer
Deploy Vercel Render
Tool Git GitHub Figma Notion

팀원별 구현 기능

이태빈(팀장)
  • 헤더 레이아웃, 프로필 모달 UI
  • 포토카드 구매
    • 상세 조회
      • 내가 등록한 카드가 아닐 경우, 포인트를 사용해 구매하거나, 교환 카드를 제시할 수 있습니다.
    • 구매
      • 포토 카드를 구매하려는 유저가 상점에 올라온 매진되지 않은 포토 카드를 포인트를 사용해 구매할 수 있는 기능입니다. 구매할 경우, 포토 카드의 가격만큼 구매자의 포인트가 차감되고 판매자의 포인트는 증가합니다.
  • 포토카드 교환
    • 요청
      • 상점에 올라온 매진되지 않은 포토 카드에 대해 교환을 제안할 수 있는 기능입니다. 교환을 원하는 유저는 교환할 카드를 한 장 선택해 교환 제안서를 보낼 수 있습니다.
    • 취소
      • 구매자가 교환 요청한 포토카드를 취소할 수 있는 기능입니다.
김재욱(부팀장)
  • 알림
    • 알림에는 아래와 같은 유형이 있습니다. 이때 알림이 발생한 시점을 표시합니다.
      • 1시간~23시간 내 :
        • 예시 : 1시간 전, 2시간 전, 3시간 전, ... , 23시간 전
      • 24시간 이후~6일 이내 :
        • 예시 : 1일 전, 2일 전, 3일 전, ... , 6일 전
      • 7일 이후~3주 이내 :
        • 예시 : 1주일 전, 2주일 전, 3주일 전
      • 4주 이후~11개월 이내 :
        • 예시 : 1개월 전, 2개월 전, 3개월 전, ... , 11개월 전
      • 12개월 이후 :
        • 예시 : 1년 전, 2년 전, 3년 전, ...
      • 포토 카드 교환 성사 알림 기능 : 포토 카드 교환 제안을 한 유저의 제안이 승인/거절될 경우, 교환 성사 혹은 불발되었음을 알리는 기능입니다.
      • 포토 카드 교환 제안 알림 기능 : 판매자에게 판매 포토 카드에 대한 교환 제안이 온 것을 알리는 기능입니다.
      • 포토 카드 구매 완료 알림 기능 : 유저가 판매 중인 포토 카드를 포인트로 구매했음을 알리는 기능입니다.
      • 포토 카드 판매 성사 알림 기능 : 판매자의 판매 포토 카드가 팔렸음을 알리는 기능입니다.
      • 포토 카드 품절 알림 기능 : 판매자에게 판매 중이던 포토 카드가 전체 판매되어 품절 처리되었음을 알리는 기능입니다.
  • 깜짝 포인트
    • 깜짝 모달을 활용해 유저에게 1시간에 1번 랜덤 상자 뽑기 기회를 부여하는 기능입니다. 뽑은 포인트는 적립됩니다.
최민경
  • 포토카드 판매
    • 판매
      • 기존에 소유하고 있는 포토카드를 판매할 수 있는 기능입니다. 유저가 소유 중인 포토 카드 중 하나를 선택하고, 발행량 이내에 판매할 장 수, 장당 판매 금액을 입력 후 상점에 업로드할 수 있습니다.
    • 수정
      • 내가 등록한 카드일 경우 판매 정보 수정이 가능합니다.
  • 포토카드 교환
    • 승인 및 거절
      • 교환 카드 제시에 대한 승인/거절이 가능합니다.
      • 판매자는 포토 카드 상세에서 요청이 온 교환 카드 목록을 확인할 수 있습니다.
      • 판매자가 승인하면, 교환 요청을 한 유저와 판매 포토 카드의 소유주가 서로 변경됩니다.
김수빈
  • 성공 & 실패 모달
  • 나의 포토카드 조회
    • 유저가 상점에서 구매했거나, 본인 소유로 등록한 포토 카드를 전체 조회하는 나만의 사진첩 기능입니다. 필터, 정렬, 검색, 페이지네이션 기능을 포함합니다.
  • 내가 판매중인 포토카드 조회
    • 유저가 판매를 위해 상점에 올린 포토 카드 목록 조회 기능입니다. 필터링(등급, 장르, 판매방법, 매진여부), 페이지네이션 기능을 포함합니다.
이지수
  • 인증 / 인가
    • 회원가입
      • 유저 회원가입 기능을 제공합니다.
    • 로그인
      • 계정으로 로그인하면 각 계정에 부여된 권한에 맞는 기능에 접근할 수 있습니다.
    • 로그아웃
      • 유저가 로그인 상태를 유지하고 싶지 않을 경우 로그아웃이 가능합니다.
  • 구글 OAuth
    • 유저는 구글 아이디로 회원가입과 로그인을 할 수 있습니다.
  • 랜딩 페이지
    • 로그인하지 않은 사용자에게는 서비스를 소개하는 랜딩 페이지를 보여줍니다.
    • 로그인한 사용자에게는 랜딩 페이지를 보여주지 않습니다.
안세빈
  • 포토카드 전체 조회
    • 판매할 카드가 등록되는 상점입니다. 검색, 필터(등급, 장르, 설명, 매진 여부 등), 정렬(최신/오래된 순, 낮은/높은 가격 순)
    • 무한 스크롤링 기능을 포함합니다.
    • 필터는 단일 선택만 가능합니다.
신수민
  • 포토카드 생성
    • 유저 본인이 찍은 사진을 카드로 생성하는 기능입니다. 원하는 사진을 업로드하고, 사진에 대한 정보(이름, 최소 가격, 등급, 총 발행량, 장르, 설명 등)를 입력 혹은 선택해 카드를 생성 및 등록할 수 있습니다.
  • 포토카드 판매
    • 상세 조회
      • 내가 등록한 카드일 경우 다른 사람이 제시한 교환 카드 제시 목록을 조회할 수 있습니다.
    • 취소 - 내가 등록한 카드일 경우 판매 취소가 가능합니다.

🗂️ 프로젝트 구조

Frontend
📦 /
┣ 📂src
┃ ┣ 📂app
┃ ┃ ┣ 📂(auth)
┃ ┃ ┃ ┣ 📂google-callback
┃ ┃ ┃ ┣ 📂login
┃ ┃ ┃ ┗ 📂signup
┃ ┃ ┣ 📂marketplace
┃ ┃ ┃ ┗ 📂[id]
┃ ┃ ┃   ┣ 📂buyer
┃ ┃ ┃   ┗ 📂seller
┃ ┃ ┣ 📂my-gallery
┃ ┃ ┃ ┗ 📂create
┃ ┃ ┣ 📂my-sell
┃ ┃ ┣ 📜globals.css        # 전역 스타일 정의
┃ ┃ ┣ 📜layout.js          # 전체 앱 레이아웃 컴포넌트
┃ ┃ ┣ 📜loading.js         # 페이지 로딩 상태 처리
┃ ┃ ┣ 📜page.js            # 루트 페이지 엔트리
┃ ┃ ┗ 📜Providers.jsx      # 전역 Provider 등록 컴포넌트
┃ ┣ 📂assets
┃ ┃ ┣ 📂fonts
┃ ┃ ┣ 📂icons
┃ ┃ ┗ 📂images
┃ ┣ 📂components           # 공통 UI 컴포넌트
┃ ┃ ┣ 📂common
┃ ┃ ┣ 📂modal
┃ ┃ ┗ 📂ui
┃ ┣ 📂contexts             # React Context 정의
┃ ┣ 📂hooks                # 커스텀 훅 모음
┃ ┣ 📂lib
┃ ┃ ┣ 📂api                # API 요청 관련 유틸
┃ ┃ ┗ 📂utils              # 일반 유틸 함수 모음
┃ ┗ 📂providers            # 전역 상태 Provider 등
┣ 📜.env                   # 환경 변수 정의
┣ 📜.env.example           # 환경 변수 예시 템플릿
┣ 📜.gitignore             # Git 추적 제외 목록
┣ 📜.prettierrc            # Prettier 코드 포맷팅 설정
┣ 📜eslint.config.mjs      # ESLint 린트 설정
┣ 📜jsconfig.json          # JS/TS 모듈 경로 설정
┣ 📜next.config.mjs        # Next.js 설정 파일
┗ 📜README.md              # 프로젝트 설명 문서
Backend
📦 /
┣ 📂src
┃ ┣ 📂config               # 환경설정 및 설정 파일 모음
┃ ┣ 📂controllers          # 라우트 요청에 대한 비즈니스 로직 처리
┃ ┣ 📂db
┃ ┃ ┣ 📂generated          # Prisma에 의해 자동 생성된 파일
┃ ┃ ┗ 📂prisma
┃ ┃   ┣ 📂migrations       # Prisma 마이그레이션 파일
┃ ┃   ┣ 📂mocks            # 테스트용 mock 데이터
┃ ┃   ┣ 📜prisma.js        # Prisma 클라이언트 초기화
┃ ┃   ┣ 📜schema.prisma    # Prisma 스키마 정의 파일
┃ ┃   ┗ 📜seed.js          # 초기 데이터 시드 파일
┃ ┣ 📂middlewares          # Express 미들웨어 정의
┃ ┣ 📂repositories         # DB 접근 로직 (DAO 계층)
┃ ┣ 📂routes               # 라우터 정의
┃ ┣ 📂services             # 비즈니스 로직 처리 계층
┃ ┣ 📂structs
┃ ┃ ┗ 📂auth               # 인증 관련 구조체 및 유틸
┃ ┣ 📂uploads              # 파일 업로드 저장소
┃ ┣ 📂utils                # 유틸리티 함수 모음
┃ ┗ 📜app.js               # Express 앱 엔트리포인트
┣ 📜.env                   # 환경 변수 설정
┣ 📜.env.example           # 환경 변수 예시 파일
┣ 📜.gitignore             # Git 추적 제외 파일 목록
┣ 📜.http                  # REST API 테스트용 요청 모음 (VSCode용)
┣ 📜.prettierrc            # Prettier 코드 포맷 설정
┣ 📜package-lock.json      # 패키지 잠금 파일
┣ 📜package.json           # 프로젝트 의존성 및 스크립트 정의
┗ 📜README.md              # 프로젝트 설명 문서

About

당신의 최애는 무엇인가요? "최애의 포토"에서 확인하세요!

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 7