Repository files navigation

🍽️ DecodEat

AI 기반 영양정보 분석 및 개인 맞춤 영양 관리 서비스

DecodEat는 제품의 영양성분표를 촬영하면 AI가 자동으로 분석하여 영양정보를 시각화하고, 개인에게 맞는 건강한 제품을 추천해주는 웹 서비스입니다.

📋 목차

✨ 주요 기능

🔍 AI 영양정보 분석

  • 제품 영양성분표 사진 업로드
  • AI 기반 자동 영양정보 추출 및 분석
  • 드래그 앤 드롭 및 클립보드 지원

📊 영양정보 시각화

  • 영양소별 시각적 차트 제공 (Chart.js)
  • 권장 섭취량 대비 비교 분석
  • 세부 영양소 정보 표시

🎯 개인 맞춤 추천

  • 사용자 행동 기반 제품 추천
  • 영양소 기반 유사 제품 추천
  • 좋아요 기능으로 관심 제품 관리

📚 영양소 백과사전

  • 주요 영양소별 상세 정보 제공
  • 권장 섭취량 및 효능 안내

🔐 카카오 로그인

  • OAuth2 기반 카카오 소셜 로그인
  • 자동 토큰 갱신 및 인증 관리

📱 마이페이지

  • 개인정보 관리
  • 분석 이력 조회
  • 좋아요한 제품 목록
  • 관리자 패널 (신고 관리)

🛠 기술 스택

Frontend Framework

  • React 19.1 - 최신 React 버전
  • TypeScript - 타입 안전성
  • Vite - 빠른 빌드 도구

라우팅 & 상태 관리

  • React Router 7.7 - 클라이언트 사이드 라우팅
  • Zustand 5.0 - 가벼운 전역 상태 관리
  • TanStack React Query 5.85 - 서버 상태 관리 및 캐싱

스타일링

  • Tailwind CSS 4.1 - 유틸리티 우선 CSS
  • Pretendard - 한글 폰트

API & 인증

  • Axios 1.11 - HTTP 클라이언트
  • OAuth2 - 카카오 소셜 로그인
  • JWT - 토큰 기반 인증

폼 & 검증

  • React Hook Form 7.62 - 폼 상태 관리
  • Zod 4.1 - 스키마 기반 데이터 검증

데이터 시각화

  • Chart.js 4.5 - 차트 라이브러리
  • react-chartjs-2 - React 래퍼

아이콘 & UI

  • Lucide React 0.526 - 아이콘 컴포넌트

개발 도구

  • ESLint - 코드 품질 관리
  • Prettier - 코드 포매팅

🚀 시작하기

필수 요구사항

  • Node.js 18 이상
  • pnpm (권장)

설치 및 실행

# 의존성 설치
pnpm install
# 개발 서버 실행
pnpm dev
# 프로덕션 빌드
pnpm build
# 빌드 미리보기
pnpm preview
# 린트 검사
pnpm lint

환경 변수

프로젝트 루트에 .env 파일을 생성하고 다음 환경 변수를 설정하세요:

VITE_API_BASE_URL=your_api_base_urlVITE_KAKAO_CLIENT_ID=your_kakao_client_idVITE_KAKAO_REDIRECT_URI=your_redirect_uri

📁 프로젝트 구조

src/
├── apis/ # API 통신 레이어
│ ├── axios.ts # Axios 인스턴스 + 인터셉터
│ ├── auth.ts # 인증 API
│ ├── product.ts # 제품 API
│ ├── productList.ts # 제품 목록 API
│ ├── productDetail.ts # 제품 상세 API
│ ├── enroll.ts # 제품 등록 API
│ ├── like.ts # 좋아요 API
│ ├── analysis.ts # 분석 API
│ ├── report.ts # 신고 API
│ └── adminReports.ts # 관리자 신고 API
│
├── components/ # 재사용 가능한 컴포넌트
│ ├── detail/ # 상세 페이지
│ │ ├── NutritionChart.tsx
│ │ ├── DetailedNutrients.tsx
│ │ ├── RecommendedProducts.tsx
│ │ ├── PieChart.tsx
│ │ └── NutritionEditForm.tsx
│ ├── search/ # 검색
│ │ ├── ProductGrid.tsx
│ │ ├── SearchBanner.tsx
│ │ ├── SearchProductGrid.tsx
│ │ └── ProductGridSkeleton.tsx
│ ├── home/ # 홈
│ │ └── UserBehaviorRecommendation.tsx
│ ├── myPage/ # 마이페이지
│ │ ├── PersonalInfo.tsx
│ │ ├── AnalysisResults.tsx
│ │ ├── LikedProducts.tsx
│ │ └── Settings.tsx
│ ├── admin/ # 관리자
│ │ ├── AdminReports.tsx
│ │ └── AdminReportDetail.tsx
│ ├── enroll/ # 등록
│ │ └── UploadSlot.tsx
│ ├── gnb/ # 네비게이션
│ │ └── TopGNB.tsx
│ └── ui/ # 공통 UI
│ ├── Modal.tsx
│ ├── MessageModal.tsx
│ ├── Pagination.tsx
│ ├── FilterBox.tsx
│ └── Skeleton.tsx
│
├── pages/ # 페이지 컴포넌트
│ ├── HomePage.tsx # 홈
│ ├── DetailPage.tsx # 제품 상세
│ ├── EnrollPage.tsx # 제품 등록
│ ├── SearchPage.tsx # 검색
│ ├── MyPage.tsx # 마이페이지
│ ├── LoginPage.tsx # 로그인
│ ├── OnboardingPage.tsx # 온보딩
│ ├── SupportPage.tsx # 고객 지원
│ ├── NutritionEncyclopediaPage.tsx # 영양소 백과사전
│ └── ErrorPage.tsx # 에러
│
├── hooks/ # 커스텀 훅
│ ├── useAuth.ts # 인증
│ ├── useEnroll.ts # 제품 등록
│ ├── useLike.ts # 좋아요
│ ├── useProduct.ts # 제품 검색
│ ├── useProductList.ts # 제품 목록
│ ├── useProductDetail.ts # 제품 상세
│ ├── useAnalysis.ts # 분석
│ ├── useReport.ts # 신고
│ ├── useAdminReports.ts # 관리자 신고
│ ├── useAdminReportDetail.ts
│ ├── useSearch.ts # 검색
│ └── useMessageModal.ts # 모달
│
├── store/ # Zustand 상태 관리
│ ├── useAuthStore.ts # 인증 상태
│ └── useStore.ts # 전역 상태
│
├── types/ # TypeScript 타입 정의
│ ├── auth.ts
│ ├── product.ts
│ ├── productList.ts
│ ├── productDetail.ts
│ ├── nutrition.ts
│ ├── analysis.ts
│ ├── enroll.ts
│ ├── like.ts
│ ├── report.ts
│ └── common.ts
│
├── utils/ # 유틸리티 함수
│ ├── image.ts # 이미지 압축
│ ├── nutritionUtils.ts # 영양정보 계산
│ └── chartUtils.ts # 차트 데이터 변환
│
├── constants/ # 상수
│ ├── nutrition.ts # 영양소 매핑
│ ├── nutritionEncyclopedia.ts # 백과사전 데이터
│ └── product.ts # 제품 상수
│
├── config/ # 설정
│ └── menuConfig.ts # 메뉴 설정
│
├── layout/ # 레이아웃 컴포넌트
│ ├── RootLayout.tsx # 메인 레이아웃
│ └── AuthLayout.tsx # 인증 레이아웃
│
├── routes/ # 라우팅
│ └── router.tsx # 라우터 설정
│
├── assets/ # 정적 파일
│ ├── icon/ # 아이콘
│ ├── img/ # 이미지
│ └── logo/ # 로고
│
├── App.tsx # 앱 루트
├── main.tsx # 앱 진입점
└── index.css # 글로벌 스타일

👥 개발 팀

역할이름GitHub
Frontend Developer유진@Yujin1219
Frontend Developer유상완 (바나)@wantkdd

📝 Git Convention

Git-flow 전략

  • main: 프로덕션 배포 브랜치
  • feature: 기능 개발 브랜치

브랜치 네이밍

feature/이름-기능제목#이슈번호

예시: feature/wantkdd-login#1

작업 규칙

  1. 모든 작업 전 main에서 최신 코드 pull
  2. 개인 작업은 feature 브랜치에서 진행
  3. 작업 완료 후 PR 생성
  4. 팀원 1명의 리뷰 및 approve 필수
  5. Approve 후 main에 merge

커밋 컨벤션

Prefix설명
start새 프로젝트 시작
feat새로운 기능 추가
fix버그 수정
designUI/CSS 변경
refactor코드 리팩토링
settings설정 파일 변경
comment주석 추가/변경
dependency의존성/플러그인 추가
docs문서 수정
merge브랜치 병합
deploy배포
rename파일/폴더명 수정
remove파일 삭제
revert이전 버전으로 롤백

커밋 메시지 예시

feat: 카카오 로그인 기능 구현 #12
fix: 제품 상세 페이지 로딩 오류 수정 #34
design: 마이페이지 반응형 스타일 적용 #56

📄 라이선스

이 프로젝트는 개인 프로젝트이며, 모든 권리는 개발팀에게 있습니다.

🔗 배포

  • 배포 플랫폼: Netlify
  • 배포 URL: [추후 업데이트]

⭐️ Made with ❤️ by DecodEat Team

About

No description, website, or topics provided.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

🍽️ DecodEat

AI 기반 영양정보 분석 및 개인 맞춤 영양 관리 서비스

DecodEat는 제품의 영양성분표를 촬영하면 AI가 자동으로 분석하여 영양정보를 시각화하고, 개인에게 맞는 건강한 제품을 추천해주는 웹 서비스입니다.

📋 목차

✨ 주요 기능

🔍 AI 영양정보 분석

  • 제품 영양성분표 사진 업로드
  • AI 기반 자동 영양정보 추출 및 분석
  • 드래그 앤 드롭 및 클립보드 지원

📊 영양정보 시각화

  • 영양소별 시각적 차트 제공 (Chart.js)
  • 권장 섭취량 대비 비교 분석
  • 세부 영양소 정보 표시

🎯 개인 맞춤 추천

  • 사용자 행동 기반 제품 추천
  • 영양소 기반 유사 제품 추천
  • 좋아요 기능으로 관심 제품 관리

📚 영양소 백과사전

  • 주요 영양소별 상세 정보 제공
  • 권장 섭취량 및 효능 안내

🔐 카카오 로그인

  • OAuth2 기반 카카오 소셜 로그인
  • 자동 토큰 갱신 및 인증 관리

📱 마이페이지

  • 개인정보 관리
  • 분석 이력 조회
  • 좋아요한 제품 목록
  • 관리자 패널 (신고 관리)

🛠 기술 스택

Frontend Framework

  • React 19.1 - 최신 React 버전
  • TypeScript - 타입 안전성
  • Vite - 빠른 빌드 도구

라우팅 & 상태 관리

  • React Router 7.7 - 클라이언트 사이드 라우팅
  • Zustand 5.0 - 가벼운 전역 상태 관리
  • TanStack React Query 5.85 - 서버 상태 관리 및 캐싱

스타일링

  • Tailwind CSS 4.1 - 유틸리티 우선 CSS
  • Pretendard - 한글 폰트

API & 인증

  • Axios 1.11 - HTTP 클라이언트
  • OAuth2 - 카카오 소셜 로그인
  • JWT - 토큰 기반 인증

폼 & 검증

  • React Hook Form 7.62 - 폼 상태 관리
  • Zod 4.1 - 스키마 기반 데이터 검증

데이터 시각화

  • Chart.js 4.5 - 차트 라이브러리
  • react-chartjs-2 - React 래퍼

아이콘 & UI

  • Lucide React 0.526 - 아이콘 컴포넌트

개발 도구

  • ESLint - 코드 품질 관리
  • Prettier - 코드 포매팅

🚀 시작하기

필수 요구사항

  • Node.js 18 이상
  • pnpm (권장)

설치 및 실행

# 의존성 설치
pnpm install
# 개발 서버 실행
pnpm dev
# 프로덕션 빌드
pnpm build
# 빌드 미리보기
pnpm preview
# 린트 검사
pnpm lint

환경 변수

프로젝트 루트에 .env 파일을 생성하고 다음 환경 변수를 설정하세요:

VITE_API_BASE_URL=your_api_base_urlVITE_KAKAO_CLIENT_ID=your_kakao_client_idVITE_KAKAO_REDIRECT_URI=your_redirect_uri

📁 프로젝트 구조

src/
├── apis/ # API 통신 레이어
│ ├── axios.ts # Axios 인스턴스 + 인터셉터
│ ├── auth.ts # 인증 API
│ ├── product.ts # 제품 API
│ ├── productList.ts # 제품 목록 API
│ ├── productDetail.ts # 제품 상세 API
│ ├── enroll.ts # 제품 등록 API
│ ├── like.ts # 좋아요 API
│ ├── analysis.ts # 분석 API
│ ├── report.ts # 신고 API
│ └── adminReports.ts # 관리자 신고 API
│
├── components/ # 재사용 가능한 컴포넌트
│ ├── detail/ # 상세 페이지
│ │ ├── NutritionChart.tsx
│ │ ├── DetailedNutrients.tsx
│ │ ├── RecommendedProducts.tsx
│ │ ├── PieChart.tsx
│ │ └── NutritionEditForm.tsx
│ ├── search/ # 검색
│ │ ├── ProductGrid.tsx
│ │ ├── SearchBanner.tsx
│ │ ├── SearchProductGrid.tsx
│ │ └── ProductGridSkeleton.tsx
│ ├── home/ # 홈
│ │ └── UserBehaviorRecommendation.tsx
│ ├── myPage/ # 마이페이지
│ │ ├── PersonalInfo.tsx
│ │ ├── AnalysisResults.tsx
│ │ ├── LikedProducts.tsx
│ │ └── Settings.tsx
│ ├── admin/ # 관리자
│ │ ├── AdminReports.tsx
│ │ └── AdminReportDetail.tsx
│ ├── enroll/ # 등록
│ │ └── UploadSlot.tsx
│ ├── gnb/ # 네비게이션
│ │ └── TopGNB.tsx
│ └── ui/ # 공통 UI
│ ├── Modal.tsx
│ ├── MessageModal.tsx
│ ├── Pagination.tsx
│ ├── FilterBox.tsx
│ └── Skeleton.tsx
│
├── pages/ # 페이지 컴포넌트
│ ├── HomePage.tsx # 홈
│ ├── DetailPage.tsx # 제품 상세
│ ├── EnrollPage.tsx # 제품 등록
│ ├── SearchPage.tsx # 검색
│ ├── MyPage.tsx # 마이페이지
│ ├── LoginPage.tsx # 로그인
│ ├── OnboardingPage.tsx # 온보딩
│ ├── SupportPage.tsx # 고객 지원
│ ├── NutritionEncyclopediaPage.tsx # 영양소 백과사전
│ └── ErrorPage.tsx # 에러
│
├── hooks/ # 커스텀 훅
│ ├── useAuth.ts # 인증
│ ├── useEnroll.ts # 제품 등록
│ ├── useLike.ts # 좋아요
│ ├── useProduct.ts # 제품 검색
│ ├── useProductList.ts # 제품 목록
│ ├── useProductDetail.ts # 제품 상세
│ ├── useAnalysis.ts # 분석
│ ├── useReport.ts # 신고
│ ├── useAdminReports.ts # 관리자 신고
│ ├── useAdminReportDetail.ts
│ ├── useSearch.ts # 검색
│ └── useMessageModal.ts # 모달
│
├── store/ # Zustand 상태 관리
│ ├── useAuthStore.ts # 인증 상태
│ └── useStore.ts # 전역 상태
│
├── types/ # TypeScript 타입 정의
│ ├── auth.ts
│ ├── product.ts
│ ├── productList.ts
│ ├── productDetail.ts
│ ├── nutrition.ts
│ ├── analysis.ts
│ ├── enroll.ts
│ ├── like.ts
│ ├── report.ts
│ └── common.ts
│
├── utils/ # 유틸리티 함수
│ ├── image.ts # 이미지 압축
│ ├── nutritionUtils.ts # 영양정보 계산
│ └── chartUtils.ts # 차트 데이터 변환
│
├── constants/ # 상수
│ ├── nutrition.ts # 영양소 매핑
│ ├── nutritionEncyclopedia.ts # 백과사전 데이터
│ └── product.ts # 제품 상수
│
├── config/ # 설정
│ └── menuConfig.ts # 메뉴 설정
│
├── layout/ # 레이아웃 컴포넌트
│ ├── RootLayout.tsx # 메인 레이아웃
│ └── AuthLayout.tsx # 인증 레이아웃
│
├── routes/ # 라우팅
│ └── router.tsx # 라우터 설정
│
├── assets/ # 정적 파일
│ ├── icon/ # 아이콘
│ ├── img/ # 이미지
│ └── logo/ # 로고
│
├── App.tsx # 앱 루트
├── main.tsx # 앱 진입점
└── index.css # 글로벌 스타일

👥 개발 팀

역할이름GitHub
Frontend Developer유진@Yujin1219
Frontend Developer유상완 (바나)@wantkdd

📝 Git Convention

Git-flow 전략

  • main: 프로덕션 배포 브랜치
  • feature: 기능 개발 브랜치

브랜치 네이밍

feature/이름-기능제목#이슈번호

예시: feature/wantkdd-login#1

작업 규칙

  1. 모든 작업 전 main에서 최신 코드 pull
  2. 개인 작업은 feature 브랜치에서 진행
  3. 작업 완료 후 PR 생성
  4. 팀원 1명의 리뷰 및 approve 필수
  5. Approve 후 main에 merge

커밋 컨벤션

Prefix설명
start새 프로젝트 시작
feat새로운 기능 추가
fix버그 수정
designUI/CSS 변경
refactor코드 리팩토링
settings설정 파일 변경
comment주석 추가/변경
dependency의존성/플러그인 추가
docs문서 수정
merge브랜치 병합
deploy배포
rename파일/폴더명 수정
remove파일 삭제
revert이전 버전으로 롤백

커밋 메시지 예시

feat: 카카오 로그인 기능 구현 #12
fix: 제품 상세 페이지 로딩 오류 수정 #34
design: 마이페이지 반응형 스타일 적용 #56

📄 라이선스

이 프로젝트는 개인 프로젝트이며, 모든 권리는 개발팀에게 있습니다.

🔗 배포

  • 배포 플랫폼: Netlify
  • 배포 URL: [추후 업데이트]

⭐️ Made with ❤️ by DecodEat Team

About

No description, website, or topics provided.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

🍽️ DecodEat

AI 기반 영양정보 분석 및 개인 맞춤 영양 관리 서비스

DecodEat는 제품의 영양성분표를 촬영하면 AI가 자동으로 분석하여 영양정보를 시각화하고, 개인에게 맞는 건강한 제품을 추천해주는 웹 서비스입니다.

📋 목차

✨ 주요 기능

🔍 AI 영양정보 분석

  • 제품 영양성분표 사진 업로드
  • AI 기반 자동 영양정보 추출 및 분석
  • 드래그 앤 드롭 및 클립보드 지원

📊 영양정보 시각화

  • 영양소별 시각적 차트 제공 (Chart.js)
  • 권장 섭취량 대비 비교 분석
  • 세부 영양소 정보 표시

🎯 개인 맞춤 추천

  • 사용자 행동 기반 제품 추천
  • 영양소 기반 유사 제품 추천
  • 좋아요 기능으로 관심 제품 관리

📚 영양소 백과사전

  • 주요 영양소별 상세 정보 제공
  • 권장 섭취량 및 효능 안내

🔐 카카오 로그인

  • OAuth2 기반 카카오 소셜 로그인
  • 자동 토큰 갱신 및 인증 관리

📱 마이페이지

  • 개인정보 관리
  • 분석 이력 조회
  • 좋아요한 제품 목록
  • 관리자 패널 (신고 관리)

🛠 기술 스택

Frontend Framework

  • React 19.1 - 최신 React 버전
  • TypeScript - 타입 안전성
  • Vite - 빠른 빌드 도구

라우팅 & 상태 관리

  • React Router 7.7 - 클라이언트 사이드 라우팅
  • Zustand 5.0 - 가벼운 전역 상태 관리
  • TanStack React Query 5.85 - 서버 상태 관리 및 캐싱

스타일링

  • Tailwind CSS 4.1 - 유틸리티 우선 CSS
  • Pretendard - 한글 폰트

API & 인증

  • Axios 1.11 - HTTP 클라이언트
  • OAuth2 - 카카오 소셜 로그인
  • JWT - 토큰 기반 인증

폼 & 검증

  • React Hook Form 7.62 - 폼 상태 관리
  • Zod 4.1 - 스키마 기반 데이터 검증

데이터 시각화

  • Chart.js 4.5 - 차트 라이브러리
  • react-chartjs-2 - React 래퍼

아이콘 & UI

  • Lucide React 0.526 - 아이콘 컴포넌트

개발 도구

  • ESLint - 코드 품질 관리
  • Prettier - 코드 포매팅

🚀 시작하기

필수 요구사항

  • Node.js 18 이상
  • pnpm (권장)

설치 및 실행

# 의존성 설치
pnpm install
# 개발 서버 실행
pnpm dev
# 프로덕션 빌드
pnpm build
# 빌드 미리보기
pnpm preview
# 린트 검사
pnpm lint

환경 변수

프로젝트 루트에 .env 파일을 생성하고 다음 환경 변수를 설정하세요:

VITE_API_BASE_URL=your_api_base_urlVITE_KAKAO_CLIENT_ID=your_kakao_client_idVITE_KAKAO_REDIRECT_URI=your_redirect_uri

📁 프로젝트 구조

src/
├── apis/ # API 통신 레이어
│ ├── axios.ts # Axios 인스턴스 + 인터셉터
│ ├── auth.ts # 인증 API
│ ├── product.ts # 제품 API
│ ├── productList.ts # 제품 목록 API
│ ├── productDetail.ts # 제품 상세 API
│ ├── enroll.ts # 제품 등록 API
│ ├── like.ts # 좋아요 API
│ ├── analysis.ts # 분석 API
│ ├── report.ts # 신고 API
│ └── adminReports.ts # 관리자 신고 API
│
├── components/ # 재사용 가능한 컴포넌트
│ ├── detail/ # 상세 페이지
│ │ ├── NutritionChart.tsx
│ │ ├── DetailedNutrients.tsx
│ │ ├── RecommendedProducts.tsx
│ │ ├── PieChart.tsx
│ │ └── NutritionEditForm.tsx
│ ├── search/ # 검색
│ │ ├── ProductGrid.tsx
│ │ ├── SearchBanner.tsx
│ │ ├── SearchProductGrid.tsx
│ │ └── ProductGridSkeleton.tsx
│ ├── home/ # 홈
│ │ └── UserBehaviorRecommendation.tsx
│ ├── myPage/ # 마이페이지
│ │ ├── PersonalInfo.tsx
│ │ ├── AnalysisResults.tsx
│ │ ├── LikedProducts.tsx
│ │ └── Settings.tsx
│ ├── admin/ # 관리자
│ │ ├── AdminReports.tsx
│ │ └── AdminReportDetail.tsx
│ ├── enroll/ # 등록
│ │ └── UploadSlot.tsx
│ ├── gnb/ # 네비게이션
│ │ └── TopGNB.tsx
│ └── ui/ # 공통 UI
│ ├── Modal.tsx
│ ├── MessageModal.tsx
│ ├── Pagination.tsx
│ ├── FilterBox.tsx
│ └── Skeleton.tsx
│
├── pages/ # 페이지 컴포넌트
│ ├── HomePage.tsx # 홈
│ ├── DetailPage.tsx # 제품 상세
│ ├── EnrollPage.tsx # 제품 등록
│ ├── SearchPage.tsx # 검색
│ ├── MyPage.tsx # 마이페이지
│ ├── LoginPage.tsx # 로그인
│ ├── OnboardingPage.tsx # 온보딩
│ ├── SupportPage.tsx # 고객 지원
│ ├── NutritionEncyclopediaPage.tsx # 영양소 백과사전
│ └── ErrorPage.tsx # 에러
│
├── hooks/ # 커스텀 훅
│ ├── useAuth.ts # 인증
│ ├── useEnroll.ts # 제품 등록
│ ├── useLike.ts # 좋아요
│ ├── useProduct.ts # 제품 검색
│ ├── useProductList.ts # 제품 목록
│ ├── useProductDetail.ts # 제품 상세
│ ├── useAnalysis.ts # 분석
│ ├── useReport.ts # 신고
│ ├── useAdminReports.ts # 관리자 신고
│ ├── useAdminReportDetail.ts
│ ├── useSearch.ts # 검색
│ └── useMessageModal.ts # 모달
│
├── store/ # Zustand 상태 관리
│ ├── useAuthStore.ts # 인증 상태
│ └── useStore.ts # 전역 상태
│
├── types/ # TypeScript 타입 정의
│ ├── auth.ts
│ ├── product.ts
│ ├── productList.ts
│ ├── productDetail.ts
│ ├── nutrition.ts
│ ├── analysis.ts
│ ├── enroll.ts
│ ├── like.ts
│ ├── report.ts
│ └── common.ts
│
├── utils/ # 유틸리티 함수
│ ├── image.ts # 이미지 압축
│ ├── nutritionUtils.ts # 영양정보 계산
│ └── chartUtils.ts # 차트 데이터 변환
│
├── constants/ # 상수
│ ├── nutrition.ts # 영양소 매핑
│ ├── nutritionEncyclopedia.ts # 백과사전 데이터
│ └── product.ts # 제품 상수
│
├── config/ # 설정
│ └── menuConfig.ts # 메뉴 설정
│
├── layout/ # 레이아웃 컴포넌트
│ ├── RootLayout.tsx # 메인 레이아웃
│ └── AuthLayout.tsx # 인증 레이아웃
│
├── routes/ # 라우팅
│ └── router.tsx # 라우터 설정
│
├── assets/ # 정적 파일
│ ├── icon/ # 아이콘
│ ├── img/ # 이미지
│ └── logo/ # 로고
│
├── App.tsx # 앱 루트
├── main.tsx # 앱 진입점
└── index.css # 글로벌 스타일

👥 개발 팀

역할이름GitHub
Frontend Developer유진@Yujin1219
Frontend Developer유상완 (바나)@wantkdd

📝 Git Convention

Git-flow 전략

  • main: 프로덕션 배포 브랜치
  • feature: 기능 개발 브랜치

브랜치 네이밍

feature/이름-기능제목#이슈번호

예시: feature/wantkdd-login#1

작업 규칙

  1. 모든 작업 전 main에서 최신 코드 pull
  2. 개인 작업은 feature 브랜치에서 진행
  3. 작업 완료 후 PR 생성
  4. 팀원 1명의 리뷰 및 approve 필수
  5. Approve 후 main에 merge

커밋 컨벤션

Prefix설명
start새 프로젝트 시작
feat새로운 기능 추가
fix버그 수정
designUI/CSS 변경
refactor코드 리팩토링
settings설정 파일 변경
comment주석 추가/변경
dependency의존성/플러그인 추가
docs문서 수정
merge브랜치 병합
deploy배포
rename파일/폴더명 수정
remove파일 삭제
revert이전 버전으로 롤백

커밋 메시지 예시

feat: 카카오 로그인 기능 구현 #12
fix: 제품 상세 페이지 로딩 오류 수정 #34
design: 마이페이지 반응형 스타일 적용 #56

📄 라이선스

이 프로젝트는 개인 프로젝트이며, 모든 권리는 개발팀에게 있습니다.

🔗 배포

  • 배포 플랫폼: Netlify
  • 배포 URL: [추후 업데이트]

⭐️ Made with ❤️ by DecodEat Team

About

No description, website, or topics provided.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

🍽️ DecodEat

AI 기반 영양정보 분석 및 개인 맞춤 영양 관리 서비스

DecodEat는 제품의 영양성분표를 촬영하면 AI가 자동으로 분석하여 영양정보를 시각화하고, 개인에게 맞는 건강한 제품을 추천해주는 웹 서비스입니다.

📋 목차

✨ 주요 기능

🔍 AI 영양정보 분석

  • 제품 영양성분표 사진 업로드
  • AI 기반 자동 영양정보 추출 및 분석
  • 드래그 앤 드롭 및 클립보드 지원

📊 영양정보 시각화

  • 영양소별 시각적 차트 제공 (Chart.js)
  • 권장 섭취량 대비 비교 분석
  • 세부 영양소 정보 표시

🎯 개인 맞춤 추천

  • 사용자 행동 기반 제품 추천
  • 영양소 기반 유사 제품 추천
  • 좋아요 기능으로 관심 제품 관리

📚 영양소 백과사전

  • 주요 영양소별 상세 정보 제공
  • 권장 섭취량 및 효능 안내

🔐 카카오 로그인

  • OAuth2 기반 카카오 소셜 로그인
  • 자동 토큰 갱신 및 인증 관리

📱 마이페이지

  • 개인정보 관리
  • 분석 이력 조회
  • 좋아요한 제품 목록
  • 관리자 패널 (신고 관리)

🛠 기술 스택

Frontend Framework

  • React 19.1 - 최신 React 버전
  • TypeScript - 타입 안전성
  • Vite - 빠른 빌드 도구

라우팅 & 상태 관리

  • React Router 7.7 - 클라이언트 사이드 라우팅
  • Zustand 5.0 - 가벼운 전역 상태 관리
  • TanStack React Query 5.85 - 서버 상태 관리 및 캐싱

스타일링

  • Tailwind CSS 4.1 - 유틸리티 우선 CSS
  • Pretendard - 한글 폰트

API & 인증

  • Axios 1.11 - HTTP 클라이언트
  • OAuth2 - 카카오 소셜 로그인
  • JWT - 토큰 기반 인증

폼 & 검증

  • React Hook Form 7.62 - 폼 상태 관리
  • Zod 4.1 - 스키마 기반 데이터 검증

데이터 시각화

  • Chart.js 4.5 - 차트 라이브러리
  • react-chartjs-2 - React 래퍼

아이콘 & UI

  • Lucide React 0.526 - 아이콘 컴포넌트

개발 도구

  • ESLint - 코드 품질 관리
  • Prettier - 코드 포매팅

🚀 시작하기

필수 요구사항

  • Node.js 18 이상
  • pnpm (권장)

설치 및 실행

# 의존성 설치
pnpm install
# 개발 서버 실행
pnpm dev
# 프로덕션 빌드
pnpm build
# 빌드 미리보기
pnpm preview
# 린트 검사
pnpm lint

환경 변수

프로젝트 루트에 .env 파일을 생성하고 다음 환경 변수를 설정하세요:

VITE_API_BASE_URL=your_api_base_urlVITE_KAKAO_CLIENT_ID=your_kakao_client_idVITE_KAKAO_REDIRECT_URI=your_redirect_uri

📁 프로젝트 구조

src/
├── apis/ # API 통신 레이어
│ ├── axios.ts # Axios 인스턴스 + 인터셉터
│ ├── auth.ts # 인증 API
│ ├── product.ts # 제품 API
│ ├── productList.ts # 제품 목록 API
│ ├── productDetail.ts # 제품 상세 API
│ ├── enroll.ts # 제품 등록 API
│ ├── like.ts # 좋아요 API
│ ├── analysis.ts # 분석 API
│ ├── report.ts # 신고 API
│ └── adminReports.ts # 관리자 신고 API
│
├── components/ # 재사용 가능한 컴포넌트
│ ├── detail/ # 상세 페이지
│ │ ├── NutritionChart.tsx
│ │ ├── DetailedNutrients.tsx
│ │ ├── RecommendedProducts.tsx
│ │ ├── PieChart.tsx
│ │ └── NutritionEditForm.tsx
│ ├── search/ # 검색
│ │ ├── ProductGrid.tsx
│ │ ├── SearchBanner.tsx
│ │ ├── SearchProductGrid.tsx
│ │ └── ProductGridSkeleton.tsx
│ ├── home/ # 홈
│ │ └── UserBehaviorRecommendation.tsx
│ ├── myPage/ # 마이페이지
│ │ ├── PersonalInfo.tsx
│ │ ├── AnalysisResults.tsx
│ │ ├── LikedProducts.tsx
│ │ └── Settings.tsx
│ ├── admin/ # 관리자
│ │ ├── AdminReports.tsx
│ │ └── AdminReportDetail.tsx
│ ├── enroll/ # 등록
│ │ └── UploadSlot.tsx
│ ├── gnb/ # 네비게이션
│ │ └── TopGNB.tsx
│ └── ui/ # 공통 UI
│ ├── Modal.tsx
│ ├── MessageModal.tsx
│ ├── Pagination.tsx
│ ├── FilterBox.tsx
│ └── Skeleton.tsx
│
├── pages/ # 페이지 컴포넌트
│ ├── HomePage.tsx # 홈
│ ├── DetailPage.tsx # 제품 상세
│ ├── EnrollPage.tsx # 제품 등록
│ ├── SearchPage.tsx # 검색
│ ├── MyPage.tsx # 마이페이지
│ ├── LoginPage.tsx # 로그인
│ ├── OnboardingPage.tsx # 온보딩
│ ├── SupportPage.tsx # 고객 지원
│ ├── NutritionEncyclopediaPage.tsx # 영양소 백과사전
│ └── ErrorPage.tsx # 에러
│
├── hooks/ # 커스텀 훅
│ ├── useAuth.ts # 인증
│ ├── useEnroll.ts # 제품 등록
│ ├── useLike.ts # 좋아요
│ ├── useProduct.ts # 제품 검색
│ ├── useProductList.ts # 제품 목록
│ ├── useProductDetail.ts # 제품 상세
│ ├── useAnalysis.ts # 분석
│ ├── useReport.ts # 신고
│ ├── useAdminReports.ts # 관리자 신고
│ ├── useAdminReportDetail.ts
│ ├── useSearch.ts # 검색
│ └── useMessageModal.ts # 모달
│
├── store/ # Zustand 상태 관리
│ ├── useAuthStore.ts # 인증 상태
│ └── useStore.ts # 전역 상태
│
├── types/ # TypeScript 타입 정의
│ ├── auth.ts
│ ├── product.ts
│ ├── productList.ts
│ ├── productDetail.ts
│ ├── nutrition.ts
│ ├── analysis.ts
│ ├── enroll.ts
│ ├── like.ts
│ ├── report.ts
│ └── common.ts
│
├── utils/ # 유틸리티 함수
│ ├── image.ts # 이미지 압축
│ ├── nutritionUtils.ts # 영양정보 계산
│ └── chartUtils.ts # 차트 데이터 변환
│
├── constants/ # 상수
│ ├── nutrition.ts # 영양소 매핑
│ ├── nutritionEncyclopedia.ts # 백과사전 데이터
│ └── product.ts # 제품 상수
│
├── config/ # 설정
│ └── menuConfig.ts # 메뉴 설정
│
├── layout/ # 레이아웃 컴포넌트
│ ├── RootLayout.tsx # 메인 레이아웃
│ └── AuthLayout.tsx # 인증 레이아웃
│
├── routes/ # 라우팅
│ └── router.tsx # 라우터 설정
│
├── assets/ # 정적 파일
│ ├── icon/ # 아이콘
│ ├── img/ # 이미지
│ └── logo/ # 로고
│
├── App.tsx # 앱 루트
├── main.tsx # 앱 진입점
└── index.css # 글로벌 스타일

👥 개발 팀

역할이름GitHub
Frontend Developer유진@Yujin1219
Frontend Developer유상완 (바나)@wantkdd

📝 Git Convention

Git-flow 전략

  • main: 프로덕션 배포 브랜치
  • feature: 기능 개발 브랜치

브랜치 네이밍

feature/이름-기능제목#이슈번호

예시: feature/wantkdd-login#1

작업 규칙

  1. 모든 작업 전 main에서 최신 코드 pull
  2. 개인 작업은 feature 브랜치에서 진행
  3. 작업 완료 후 PR 생성
  4. 팀원 1명의 리뷰 및 approve 필수
  5. Approve 후 main에 merge

커밋 컨벤션

Prefix설명
start새 프로젝트 시작
feat새로운 기능 추가
fix버그 수정
designUI/CSS 변경
refactor코드 리팩토링
settings설정 파일 변경
comment주석 추가/변경
dependency의존성/플러그인 추가
docs문서 수정
merge브랜치 병합
deploy배포
rename파일/폴더명 수정
remove파일 삭제
revert이전 버전으로 롤백

커밋 메시지 예시

feat: 카카오 로그인 기능 구현 #12
fix: 제품 상세 페이지 로딩 오류 수정 #34
design: 마이페이지 반응형 스타일 적용 #56

📄 라이선스

이 프로젝트는 개인 프로젝트이며, 모든 권리는 개발팀에게 있습니다.

🔗 배포

  • 배포 플랫폼: Netlify
  • 배포 URL: [추후 업데이트]

⭐️ Made with ❤️ by DecodEat Team

About

No description, website, or topics provided.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

🍽️ DecodEat

AI 기반 영양정보 분석 및 개인 맞춤 영양 관리 서비스

DecodEat는 제품의 영양성분표를 촬영하면 AI가 자동으로 분석하여 영양정보를 시각화하고, 개인에게 맞는 건강한 제품을 추천해주는 웹 서비스입니다.

📋 목차

✨ 주요 기능

🔍 AI 영양정보 분석

  • 제품 영양성분표 사진 업로드
  • AI 기반 자동 영양정보 추출 및 분석
  • 드래그 앤 드롭 및 클립보드 지원

📊 영양정보 시각화

  • 영양소별 시각적 차트 제공 (Chart.js)
  • 권장 섭취량 대비 비교 분석
  • 세부 영양소 정보 표시

🎯 개인 맞춤 추천

  • 사용자 행동 기반 제품 추천
  • 영양소 기반 유사 제품 추천
  • 좋아요 기능으로 관심 제품 관리

📚 영양소 백과사전

  • 주요 영양소별 상세 정보 제공
  • 권장 섭취량 및 효능 안내

🔐 카카오 로그인

  • OAuth2 기반 카카오 소셜 로그인
  • 자동 토큰 갱신 및 인증 관리

📱 마이페이지

  • 개인정보 관리
  • 분석 이력 조회
  • 좋아요한 제품 목록
  • 관리자 패널 (신고 관리)

🛠 기술 스택

Frontend Framework

  • React 19.1 - 최신 React 버전
  • TypeScript - 타입 안전성
  • Vite - 빠른 빌드 도구

라우팅 & 상태 관리

  • React Router 7.7 - 클라이언트 사이드 라우팅
  • Zustand 5.0 - 가벼운 전역 상태 관리
  • TanStack React Query 5.85 - 서버 상태 관리 및 캐싱

스타일링

  • Tailwind CSS 4.1 - 유틸리티 우선 CSS
  • Pretendard - 한글 폰트

API & 인증

  • Axios 1.11 - HTTP 클라이언트
  • OAuth2 - 카카오 소셜 로그인
  • JWT - 토큰 기반 인증

폼 & 검증

  • React Hook Form 7.62 - 폼 상태 관리
  • Zod 4.1 - 스키마 기반 데이터 검증

데이터 시각화

  • Chart.js 4.5 - 차트 라이브러리
  • react-chartjs-2 - React 래퍼

아이콘 & UI

  • Lucide React 0.526 - 아이콘 컴포넌트

개발 도구

  • ESLint - 코드 품질 관리
  • Prettier - 코드 포매팅

🚀 시작하기

필수 요구사항

  • Node.js 18 이상
  • pnpm (권장)

설치 및 실행

# 의존성 설치
pnpm install
# 개발 서버 실행
pnpm dev
# 프로덕션 빌드
pnpm build
# 빌드 미리보기
pnpm preview
# 린트 검사
pnpm lint

환경 변수

프로젝트 루트에 .env 파일을 생성하고 다음 환경 변수를 설정하세요:

VITE_API_BASE_URL=your_api_base_urlVITE_KAKAO_CLIENT_ID=your_kakao_client_idVITE_KAKAO_REDIRECT_URI=your_redirect_uri

📁 프로젝트 구조

src/
├── apis/ # API 통신 레이어
│ ├── axios.ts # Axios 인스턴스 + 인터셉터
│ ├── auth.ts # 인증 API
│ ├── product.ts # 제품 API
│ ├── productList.ts # 제품 목록 API
│ ├── productDetail.ts # 제품 상세 API
│ ├── enroll.ts # 제품 등록 API
│ ├── like.ts # 좋아요 API
│ ├── analysis.ts # 분석 API
│ ├── report.ts # 신고 API
│ └── adminReports.ts # 관리자 신고 API
│
├── components/ # 재사용 가능한 컴포넌트
│ ├── detail/ # 상세 페이지
│ │ ├── NutritionChart.tsx
│ │ ├── DetailedNutrients.tsx
│ │ ├── RecommendedProducts.tsx
│ │ ├── PieChart.tsx
│ │ └── NutritionEditForm.tsx
│ ├── search/ # 검색
│ │ ├── ProductGrid.tsx
│ │ ├── SearchBanner.tsx
│ │ ├── SearchProductGrid.tsx
│ │ └── ProductGridSkeleton.tsx
│ ├── home/ # 홈
│ │ └── UserBehaviorRecommendation.tsx
│ ├── myPage/ # 마이페이지
│ │ ├── PersonalInfo.tsx
│ │ ├── AnalysisResults.tsx
│ │ ├── LikedProducts.tsx
│ │ └── Settings.tsx
│ ├── admin/ # 관리자
│ │ ├── AdminReports.tsx
│ │ └── AdminReportDetail.tsx
│ ├── enroll/ # 등록
│ │ └── UploadSlot.tsx
│ ├── gnb/ # 네비게이션
│ │ └── TopGNB.tsx
│ └── ui/ # 공통 UI
│ ├── Modal.tsx
│ ├── MessageModal.tsx
│ ├── Pagination.tsx
│ ├── FilterBox.tsx
│ └── Skeleton.tsx
│
├── pages/ # 페이지 컴포넌트
│ ├── HomePage.tsx # 홈
│ ├── DetailPage.tsx # 제품 상세
│ ├── EnrollPage.tsx # 제품 등록
│ ├── SearchPage.tsx # 검색
│ ├── MyPage.tsx # 마이페이지
│ ├── LoginPage.tsx # 로그인
│ ├── OnboardingPage.tsx # 온보딩
│ ├── SupportPage.tsx # 고객 지원
│ ├── NutritionEncyclopediaPage.tsx # 영양소 백과사전
│ └── ErrorPage.tsx # 에러
│
├── hooks/ # 커스텀 훅
│ ├── useAuth.ts # 인증
│ ├── useEnroll.ts # 제품 등록
│ ├── useLike.ts # 좋아요
│ ├── useProduct.ts # 제품 검색
│ ├── useProductList.ts # 제품 목록
│ ├── useProductDetail.ts # 제품 상세
│ ├── useAnalysis.ts # 분석
│ ├── useReport.ts # 신고
│ ├── useAdminReports.ts # 관리자 신고
│ ├── useAdminReportDetail.ts
│ ├── useSearch.ts # 검색
│ └── useMessageModal.ts # 모달
│
├── store/ # Zustand 상태 관리
│ ├── useAuthStore.ts # 인증 상태
│ └── useStore.ts # 전역 상태
│
├── types/ # TypeScript 타입 정의
│ ├── auth.ts
│ ├── product.ts
│ ├── productList.ts
│ ├── productDetail.ts
│ ├── nutrition.ts
│ ├── analysis.ts
│ ├── enroll.ts
│ ├── like.ts
│ ├── report.ts
│ └── common.ts
│
├── utils/ # 유틸리티 함수
│ ├── image.ts # 이미지 압축
│ ├── nutritionUtils.ts # 영양정보 계산
│ └── chartUtils.ts # 차트 데이터 변환
│
├── constants/ # 상수
│ ├── nutrition.ts # 영양소 매핑
│ ├── nutritionEncyclopedia.ts # 백과사전 데이터
│ └── product.ts # 제품 상수
│
├── config/ # 설정
│ └── menuConfig.ts # 메뉴 설정
│
├── layout/ # 레이아웃 컴포넌트
│ ├── RootLayout.tsx # 메인 레이아웃
│ └── AuthLayout.tsx # 인증 레이아웃
│
├── routes/ # 라우팅
│ └── router.tsx # 라우터 설정
│
├── assets/ # 정적 파일
│ ├── icon/ # 아이콘
│ ├── img/ # 이미지
│ └── logo/ # 로고
│
├── App.tsx # 앱 루트
├── main.tsx # 앱 진입점
└── index.css # 글로벌 스타일

👥 개발 팀

역할이름GitHub
Frontend Developer유진@Yujin1219
Frontend Developer유상완 (바나)@wantkdd

📝 Git Convention

Git-flow 전략

  • main: 프로덕션 배포 브랜치
  • feature: 기능 개발 브랜치

브랜치 네이밍

feature/이름-기능제목#이슈번호

예시: feature/wantkdd-login#1

작업 규칙

  1. 모든 작업 전 main에서 최신 코드 pull
  2. 개인 작업은 feature 브랜치에서 진행
  3. 작업 완료 후 PR 생성
  4. 팀원 1명의 리뷰 및 approve 필수
  5. Approve 후 main에 merge

커밋 컨벤션

Prefix설명
start새 프로젝트 시작
feat새로운 기능 추가
fix버그 수정
designUI/CSS 변경
refactor코드 리팩토링
settings설정 파일 변경
comment주석 추가/변경
dependency의존성/플러그인 추가
docs문서 수정
merge브랜치 병합
deploy배포
rename파일/폴더명 수정
remove파일 삭제
revert이전 버전으로 롤백

커밋 메시지 예시

feat: 카카오 로그인 기능 구현 #12
fix: 제품 상세 페이지 로딩 오류 수정 #34
design: 마이페이지 반응형 스타일 적용 #56

📄 라이선스

이 프로젝트는 개인 프로젝트이며, 모든 권리는 개발팀에게 있습니다.

🔗 배포

  • 배포 플랫폼: Netlify
  • 배포 URL: [추후 업데이트]

⭐️ Made with ❤️ by DecodEat Team

About

No description, website, or topics provided.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

🍽️ DecodEat

AI 기반 영양정보 분석 및 개인 맞춤 영양 관리 서비스

DecodEat는 제품의 영양성분표를 촬영하면 AI가 자동으로 분석하여 영양정보를 시각화하고, 개인에게 맞는 건강한 제품을 추천해주는 웹 서비스입니다.

📋 목차

✨ 주요 기능

🔍 AI 영양정보 분석

  • 제품 영양성분표 사진 업로드
  • AI 기반 자동 영양정보 추출 및 분석
  • 드래그 앤 드롭 및 클립보드 지원

📊 영양정보 시각화

  • 영양소별 시각적 차트 제공 (Chart.js)
  • 권장 섭취량 대비 비교 분석
  • 세부 영양소 정보 표시

🎯 개인 맞춤 추천

  • 사용자 행동 기반 제품 추천
  • 영양소 기반 유사 제품 추천
  • 좋아요 기능으로 관심 제품 관리

📚 영양소 백과사전

  • 주요 영양소별 상세 정보 제공
  • 권장 섭취량 및 효능 안내

🔐 카카오 로그인

  • OAuth2 기반 카카오 소셜 로그인
  • 자동 토큰 갱신 및 인증 관리

📱 마이페이지

  • 개인정보 관리
  • 분석 이력 조회
  • 좋아요한 제품 목록
  • 관리자 패널 (신고 관리)

🛠 기술 스택

Frontend Framework

  • React 19.1 - 최신 React 버전
  • TypeScript - 타입 안전성
  • Vite - 빠른 빌드 도구

라우팅 & 상태 관리

  • React Router 7.7 - 클라이언트 사이드 라우팅
  • Zustand 5.0 - 가벼운 전역 상태 관리
  • TanStack React Query 5.85 - 서버 상태 관리 및 캐싱

스타일링

  • Tailwind CSS 4.1 - 유틸리티 우선 CSS
  • Pretendard - 한글 폰트

API & 인증

  • Axios 1.11 - HTTP 클라이언트
  • OAuth2 - 카카오 소셜 로그인
  • JWT - 토큰 기반 인증

폼 & 검증

  • React Hook Form 7.62 - 폼 상태 관리
  • Zod 4.1 - 스키마 기반 데이터 검증

데이터 시각화

  • Chart.js 4.5 - 차트 라이브러리
  • react-chartjs-2 - React 래퍼

아이콘 & UI

  • Lucide React 0.526 - 아이콘 컴포넌트

개발 도구

  • ESLint - 코드 품질 관리
  • Prettier - 코드 포매팅

🚀 시작하기

필수 요구사항

  • Node.js 18 이상
  • pnpm (권장)

설치 및 실행

# 의존성 설치
pnpm install
# 개발 서버 실행
pnpm dev
# 프로덕션 빌드
pnpm build
# 빌드 미리보기
pnpm preview
# 린트 검사
pnpm lint

환경 변수

프로젝트 루트에 .env 파일을 생성하고 다음 환경 변수를 설정하세요:

VITE_API_BASE_URL=your_api_base_urlVITE_KAKAO_CLIENT_ID=your_kakao_client_idVITE_KAKAO_REDIRECT_URI=your_redirect_uri

📁 프로젝트 구조

src/
├── apis/ # API 통신 레이어
│ ├── axios.ts # Axios 인스턴스 + 인터셉터
│ ├── auth.ts # 인증 API
│ ├── product.ts # 제품 API
│ ├── productList.ts # 제품 목록 API
│ ├── productDetail.ts # 제품 상세 API
│ ├── enroll.ts # 제품 등록 API
│ ├── like.ts # 좋아요 API
│ ├── analysis.ts # 분석 API
│ ├── report.ts # 신고 API
│ └── adminReports.ts # 관리자 신고 API
│
├── components/ # 재사용 가능한 컴포넌트
│ ├── detail/ # 상세 페이지
│ │ ├── NutritionChart.tsx
│ │ ├── DetailedNutrients.tsx
│ │ ├── RecommendedProducts.tsx
│ │ ├── PieChart.tsx
│ │ └── NutritionEditForm.tsx
│ ├── search/ # 검색
│ │ ├── ProductGrid.tsx
│ │ ├── SearchBanner.tsx
│ │ ├── SearchProductGrid.tsx
│ │ └── ProductGridSkeleton.tsx
│ ├── home/ # 홈
│ │ └── UserBehaviorRecommendation.tsx
│ ├── myPage/ # 마이페이지
│ │ ├── PersonalInfo.tsx
│ │ ├── AnalysisResults.tsx
│ │ ├── LikedProducts.tsx
│ │ └── Settings.tsx
│ ├── admin/ # 관리자
│ │ ├── AdminReports.tsx
│ │ └── AdminReportDetail.tsx
│ ├── enroll/ # 등록
│ │ └── UploadSlot.tsx
│ ├── gnb/ # 네비게이션
│ │ └── TopGNB.tsx
│ └── ui/ # 공통 UI
│ ├── Modal.tsx
│ ├── MessageModal.tsx
│ ├── Pagination.tsx
│ ├── FilterBox.tsx
│ └── Skeleton.tsx
│
├── pages/ # 페이지 컴포넌트
│ ├── HomePage.tsx # 홈
│ ├── DetailPage.tsx # 제품 상세
│ ├── EnrollPage.tsx # 제품 등록
│ ├── SearchPage.tsx # 검색
│ ├── MyPage.tsx # 마이페이지
│ ├── LoginPage.tsx # 로그인
│ ├── OnboardingPage.tsx # 온보딩
│ ├── SupportPage.tsx # 고객 지원
│ ├── NutritionEncyclopediaPage.tsx # 영양소 백과사전
│ └── ErrorPage.tsx # 에러
│
├── hooks/ # 커스텀 훅
│ ├── useAuth.ts # 인증
│ ├── useEnroll.ts # 제품 등록
│ ├── useLike.ts # 좋아요
│ ├── useProduct.ts # 제품 검색
│ ├── useProductList.ts # 제품 목록
│ ├── useProductDetail.ts # 제품 상세
│ ├── useAnalysis.ts # 분석
│ ├── useReport.ts # 신고
│ ├── useAdminReports.ts # 관리자 신고
│ ├── useAdminReportDetail.ts
│ ├── useSearch.ts # 검색
│ └── useMessageModal.ts # 모달
│
├── store/ # Zustand 상태 관리
│ ├── useAuthStore.ts # 인증 상태
│ └── useStore.ts # 전역 상태
│
├── types/ # TypeScript 타입 정의
│ ├── auth.ts
│ ├── product.ts
│ ├── productList.ts
│ ├── productDetail.ts
│ ├── nutrition.ts
│ ├── analysis.ts
│ ├── enroll.ts
│ ├── like.ts
│ ├── report.ts
│ └── common.ts
│
├── utils/ # 유틸리티 함수
│ ├── image.ts # 이미지 압축
│ ├── nutritionUtils.ts # 영양정보 계산
│ └── chartUtils.ts # 차트 데이터 변환
│
├── constants/ # 상수
│ ├── nutrition.ts # 영양소 매핑
│ ├── nutritionEncyclopedia.ts # 백과사전 데이터
│ └── product.ts # 제품 상수
│
├── config/ # 설정
│ └── menuConfig.ts # 메뉴 설정
│
├── layout/ # 레이아웃 컴포넌트
│ ├── RootLayout.tsx # 메인 레이아웃
│ └── AuthLayout.tsx # 인증 레이아웃
│
├── routes/ # 라우팅
│ └── router.tsx # 라우터 설정
│
├── assets/ # 정적 파일
│ ├── icon/ # 아이콘
│ ├── img/ # 이미지
│ └── logo/ # 로고
│
├── App.tsx # 앱 루트
├── main.tsx # 앱 진입점
└── index.css # 글로벌 스타일

👥 개발 팀

역할이름GitHub
Frontend Developer유진@Yujin1219
Frontend Developer유상완 (바나)@wantkdd

📝 Git Convention

Git-flow 전략

  • main: 프로덕션 배포 브랜치
  • feature: 기능 개발 브랜치

브랜치 네이밍

feature/이름-기능제목#이슈번호

예시: feature/wantkdd-login#1

작업 규칙

  1. 모든 작업 전 main에서 최신 코드 pull
  2. 개인 작업은 feature 브랜치에서 진행
  3. 작업 완료 후 PR 생성
  4. 팀원 1명의 리뷰 및 approve 필수
  5. Approve 후 main에 merge

커밋 컨벤션

Prefix설명
start새 프로젝트 시작
feat새로운 기능 추가
fix버그 수정
designUI/CSS 변경
refactor코드 리팩토링
settings설정 파일 변경
comment주석 추가/변경
dependency의존성/플러그인 추가
docs문서 수정
merge브랜치 병합
deploy배포
rename파일/폴더명 수정
remove파일 삭제
revert이전 버전으로 롤백

커밋 메시지 예시

feat: 카카오 로그인 기능 구현 #12
fix: 제품 상세 페이지 로딩 오류 수정 #34
design: 마이페이지 반응형 스타일 적용 #56

📄 라이선스

이 프로젝트는 개인 프로젝트이며, 모든 권리는 개발팀에게 있습니다.

🔗 배포

  • 배포 플랫폼: Netlify
  • 배포 URL: [추후 업데이트]

⭐️ Made with ❤️ by DecodEat Team

About

No description, website, or topics provided.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

🍽️ DecodEat

AI 기반 영양정보 분석 및 개인 맞춤 영양 관리 서비스

DecodEat는 제품의 영양성분표를 촬영하면 AI가 자동으로 분석하여 영양정보를 시각화하고, 개인에게 맞는 건강한 제품을 추천해주는 웹 서비스입니다.

📋 목차

✨ 주요 기능

🔍 AI 영양정보 분석

  • 제품 영양성분표 사진 업로드
  • AI 기반 자동 영양정보 추출 및 분석
  • 드래그 앤 드롭 및 클립보드 지원

📊 영양정보 시각화

  • 영양소별 시각적 차트 제공 (Chart.js)
  • 권장 섭취량 대비 비교 분석
  • 세부 영양소 정보 표시

🎯 개인 맞춤 추천

  • 사용자 행동 기반 제품 추천
  • 영양소 기반 유사 제품 추천
  • 좋아요 기능으로 관심 제품 관리

📚 영양소 백과사전

  • 주요 영양소별 상세 정보 제공
  • 권장 섭취량 및 효능 안내

🔐 카카오 로그인

  • OAuth2 기반 카카오 소셜 로그인
  • 자동 토큰 갱신 및 인증 관리

📱 마이페이지

  • 개인정보 관리
  • 분석 이력 조회
  • 좋아요한 제품 목록
  • 관리자 패널 (신고 관리)

🛠 기술 스택

Frontend Framework

  • React 19.1 - 최신 React 버전
  • TypeScript - 타입 안전성
  • Vite - 빠른 빌드 도구

라우팅 & 상태 관리

  • React Router 7.7 - 클라이언트 사이드 라우팅
  • Zustand 5.0 - 가벼운 전역 상태 관리
  • TanStack React Query 5.85 - 서버 상태 관리 및 캐싱

스타일링

  • Tailwind CSS 4.1 - 유틸리티 우선 CSS
  • Pretendard - 한글 폰트

API & 인증

  • Axios 1.11 - HTTP 클라이언트
  • OAuth2 - 카카오 소셜 로그인
  • JWT - 토큰 기반 인증

폼 & 검증

  • React Hook Form 7.62 - 폼 상태 관리
  • Zod 4.1 - 스키마 기반 데이터 검증

데이터 시각화

  • Chart.js 4.5 - 차트 라이브러리
  • react-chartjs-2 - React 래퍼

아이콘 & UI

  • Lucide React 0.526 - 아이콘 컴포넌트

개발 도구

  • ESLint - 코드 품질 관리
  • Prettier - 코드 포매팅

🚀 시작하기

필수 요구사항

  • Node.js 18 이상
  • pnpm (권장)

설치 및 실행

# 의존성 설치
pnpm install
# 개발 서버 실행
pnpm dev
# 프로덕션 빌드
pnpm build
# 빌드 미리보기
pnpm preview
# 린트 검사
pnpm lint

환경 변수

프로젝트 루트에 .env 파일을 생성하고 다음 환경 변수를 설정하세요:

VITE_API_BASE_URL=your_api_base_urlVITE_KAKAO_CLIENT_ID=your_kakao_client_idVITE_KAKAO_REDIRECT_URI=your_redirect_uri

📁 프로젝트 구조

src/
├── apis/ # API 통신 레이어
│ ├── axios.ts # Axios 인스턴스 + 인터셉터
│ ├── auth.ts # 인증 API
│ ├── product.ts # 제품 API
│ ├── productList.ts # 제품 목록 API
│ ├── productDetail.ts # 제품 상세 API
│ ├── enroll.ts # 제품 등록 API
│ ├── like.ts # 좋아요 API
│ ├── analysis.ts # 분석 API
│ ├── report.ts # 신고 API
│ └── adminReports.ts # 관리자 신고 API
│
├── components/ # 재사용 가능한 컴포넌트
│ ├── detail/ # 상세 페이지
│ │ ├── NutritionChart.tsx
│ │ ├── DetailedNutrients.tsx
│ │ ├── RecommendedProducts.tsx
│ │ ├── PieChart.tsx
│ │ └── NutritionEditForm.tsx
│ ├── search/ # 검색
│ │ ├── ProductGrid.tsx
│ │ ├── SearchBanner.tsx
│ │ ├── SearchProductGrid.tsx
│ │ └── ProductGridSkeleton.tsx
│ ├── home/ # 홈
│ │ └── UserBehaviorRecommendation.tsx
│ ├── myPage/ # 마이페이지
│ │ ├── PersonalInfo.tsx
│ │ ├── AnalysisResults.tsx
│ │ ├── LikedProducts.tsx
│ │ └── Settings.tsx
│ ├── admin/ # 관리자
│ │ ├── AdminReports.tsx
│ │ └── AdminReportDetail.tsx
│ ├── enroll/ # 등록
│ │ └── UploadSlot.tsx
│ ├── gnb/ # 네비게이션
│ │ └── TopGNB.tsx
│ └── ui/ # 공통 UI
│ ├── Modal.tsx
│ ├── MessageModal.tsx
│ ├── Pagination.tsx
│ ├── FilterBox.tsx
│ └── Skeleton.tsx
│
├── pages/ # 페이지 컴포넌트
│ ├── HomePage.tsx # 홈
│ ├── DetailPage.tsx # 제품 상세
│ ├── EnrollPage.tsx # 제품 등록
│ ├── SearchPage.tsx # 검색
│ ├── MyPage.tsx # 마이페이지
│ ├── LoginPage.tsx # 로그인
│ ├── OnboardingPage.tsx # 온보딩
│ ├── SupportPage.tsx # 고객 지원
│ ├── NutritionEncyclopediaPage.tsx # 영양소 백과사전
│ └── ErrorPage.tsx # 에러
│
├── hooks/ # 커스텀 훅
│ ├── useAuth.ts # 인증
│ ├── useEnroll.ts # 제품 등록
│ ├── useLike.ts # 좋아요
│ ├── useProduct.ts # 제품 검색
│ ├── useProductList.ts # 제품 목록
│ ├── useProductDetail.ts # 제품 상세
│ ├── useAnalysis.ts # 분석
│ ├── useReport.ts # 신고
│ ├── useAdminReports.ts # 관리자 신고
│ ├── useAdminReportDetail.ts
│ ├── useSearch.ts # 검색
│ └── useMessageModal.ts # 모달
│
├── store/ # Zustand 상태 관리
│ ├── useAuthStore.ts # 인증 상태
│ └── useStore.ts # 전역 상태
│
├── types/ # TypeScript 타입 정의
│ ├── auth.ts
│ ├── product.ts
│ ├── productList.ts
│ ├── productDetail.ts
│ ├── nutrition.ts
│ ├── analysis.ts
│ ├── enroll.ts
│ ├── like.ts
│ ├── report.ts
│ └── common.ts
│
├── utils/ # 유틸리티 함수
│ ├── image.ts # 이미지 압축
│ ├── nutritionUtils.ts # 영양정보 계산
│ └── chartUtils.ts # 차트 데이터 변환
│
├── constants/ # 상수
│ ├── nutrition.ts # 영양소 매핑
│ ├── nutritionEncyclopedia.ts # 백과사전 데이터
│ └── product.ts # 제품 상수
│
├── config/ # 설정
│ └── menuConfig.ts # 메뉴 설정
│
├── layout/ # 레이아웃 컴포넌트
│ ├── RootLayout.tsx # 메인 레이아웃
│ └── AuthLayout.tsx # 인증 레이아웃
│
├── routes/ # 라우팅
│ └── router.tsx # 라우터 설정
│
├── assets/ # 정적 파일
│ ├── icon/ # 아이콘
│ ├── img/ # 이미지
│ └── logo/ # 로고
│
├── App.tsx # 앱 루트
├── main.tsx # 앱 진입점
└── index.css # 글로벌 스타일

👥 개발 팀

역할이름GitHub
Frontend Developer유진@Yujin1219
Frontend Developer유상완 (바나)@wantkdd

📝 Git Convention

Git-flow 전략

  • main: 프로덕션 배포 브랜치
  • feature: 기능 개발 브랜치

브랜치 네이밍

feature/이름-기능제목#이슈번호

예시: feature/wantkdd-login#1

작업 규칙

  1. 모든 작업 전 main에서 최신 코드 pull
  2. 개인 작업은 feature 브랜치에서 진행
  3. 작업 완료 후 PR 생성
  4. 팀원 1명의 리뷰 및 approve 필수
  5. Approve 후 main에 merge

커밋 컨벤션

Prefix설명
start새 프로젝트 시작
feat새로운 기능 추가
fix버그 수정
designUI/CSS 변경
refactor코드 리팩토링
settings설정 파일 변경
comment주석 추가/변경
dependency의존성/플러그인 추가
docs문서 수정
merge브랜치 병합
deploy배포
rename파일/폴더명 수정
remove파일 삭제
revert이전 버전으로 롤백

커밋 메시지 예시

feat: 카카오 로그인 기능 구현 #12
fix: 제품 상세 페이지 로딩 오류 수정 #34
design: 마이페이지 반응형 스타일 적용 #56

📄 라이선스

이 프로젝트는 개인 프로젝트이며, 모든 권리는 개발팀에게 있습니다.

🔗 배포

  • 배포 플랫폼: Netlify
  • 배포 URL: [추후 업데이트]

⭐️ Made with ❤️ by DecodEat Team

About

No description, website, or topics provided.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

🍽️ DecodEat

AI 기반 영양정보 분석 및 개인 맞춤 영양 관리 서비스

DecodEat는 제품의 영양성분표를 촬영하면 AI가 자동으로 분석하여 영양정보를 시각화하고, 개인에게 맞는 건강한 제품을 추천해주는 웹 서비스입니다.

📋 목차

✨ 주요 기능

🔍 AI 영양정보 분석

  • 제품 영양성분표 사진 업로드
  • AI 기반 자동 영양정보 추출 및 분석
  • 드래그 앤 드롭 및 클립보드 지원

📊 영양정보 시각화

  • 영양소별 시각적 차트 제공 (Chart.js)
  • 권장 섭취량 대비 비교 분석
  • 세부 영양소 정보 표시

🎯 개인 맞춤 추천

  • 사용자 행동 기반 제품 추천
  • 영양소 기반 유사 제품 추천
  • 좋아요 기능으로 관심 제품 관리

📚 영양소 백과사전

  • 주요 영양소별 상세 정보 제공
  • 권장 섭취량 및 효능 안내

🔐 카카오 로그인

  • OAuth2 기반 카카오 소셜 로그인
  • 자동 토큰 갱신 및 인증 관리

📱 마이페이지

  • 개인정보 관리
  • 분석 이력 조회
  • 좋아요한 제품 목록
  • 관리자 패널 (신고 관리)

🛠 기술 스택

Frontend Framework

  • React 19.1 - 최신 React 버전
  • TypeScript - 타입 안전성
  • Vite - 빠른 빌드 도구

라우팅 & 상태 관리

  • React Router 7.7 - 클라이언트 사이드 라우팅
  • Zustand 5.0 - 가벼운 전역 상태 관리
  • TanStack React Query 5.85 - 서버 상태 관리 및 캐싱

스타일링

  • Tailwind CSS 4.1 - 유틸리티 우선 CSS
  • Pretendard - 한글 폰트

API & 인증

  • Axios 1.11 - HTTP 클라이언트
  • OAuth2 - 카카오 소셜 로그인
  • JWT - 토큰 기반 인증

폼 & 검증

  • React Hook Form 7.62 - 폼 상태 관리
  • Zod 4.1 - 스키마 기반 데이터 검증

데이터 시각화

  • Chart.js 4.5 - 차트 라이브러리
  • react-chartjs-2 - React 래퍼

아이콘 & UI

  • Lucide React 0.526 - 아이콘 컴포넌트

개발 도구

  • ESLint - 코드 품질 관리
  • Prettier - 코드 포매팅

🚀 시작하기

필수 요구사항

  • Node.js 18 이상
  • pnpm (권장)

설치 및 실행

# 의존성 설치
pnpm install
# 개발 서버 실행
pnpm dev
# 프로덕션 빌드
pnpm build
# 빌드 미리보기
pnpm preview
# 린트 검사
pnpm lint

환경 변수

프로젝트 루트에 .env 파일을 생성하고 다음 환경 변수를 설정하세요:

VITE_API_BASE_URL=your_api_base_urlVITE_KAKAO_CLIENT_ID=your_kakao_client_idVITE_KAKAO_REDIRECT_URI=your_redirect_uri

📁 프로젝트 구조

src/
├── apis/ # API 통신 레이어
│ ├── axios.ts # Axios 인스턴스 + 인터셉터
│ ├── auth.ts # 인증 API
│ ├── product.ts # 제품 API
│ ├── productList.ts # 제품 목록 API
│ ├── productDetail.ts # 제품 상세 API
│ ├── enroll.ts # 제품 등록 API
│ ├── like.ts # 좋아요 API
│ ├── analysis.ts # 분석 API
│ ├── report.ts # 신고 API
│ └── adminReports.ts # 관리자 신고 API
│
├── components/ # 재사용 가능한 컴포넌트
│ ├── detail/ # 상세 페이지
│ │ ├── NutritionChart.tsx
│ │ ├── DetailedNutrients.tsx
│ │ ├── RecommendedProducts.tsx
│ │ ├── PieChart.tsx
│ │ └── NutritionEditForm.tsx
│ ├── search/ # 검색
│ │ ├── ProductGrid.tsx
│ │ ├── SearchBanner.tsx
│ │ ├── SearchProductGrid.tsx
│ │ └── ProductGridSkeleton.tsx
│ ├── home/ # 홈
│ │ └── UserBehaviorRecommendation.tsx
│ ├── myPage/ # 마이페이지
│ │ ├── PersonalInfo.tsx
│ │ ├── AnalysisResults.tsx
│ │ ├── LikedProducts.tsx
│ │ └── Settings.tsx
│ ├── admin/ # 관리자
│ │ ├── AdminReports.tsx
│ │ └── AdminReportDetail.tsx
│ ├── enroll/ # 등록
│ │ └── UploadSlot.tsx
│ ├── gnb/ # 네비게이션
│ │ └── TopGNB.tsx
│ └── ui/ # 공통 UI
│ ├── Modal.tsx
│ ├── MessageModal.tsx
│ ├── Pagination.tsx
│ ├── FilterBox.tsx
│ └── Skeleton.tsx
│
├── pages/ # 페이지 컴포넌트
│ ├── HomePage.tsx # 홈
│ ├── DetailPage.tsx # 제품 상세
│ ├── EnrollPage.tsx # 제품 등록
│ ├── SearchPage.tsx # 검색
│ ├── MyPage.tsx # 마이페이지
│ ├── LoginPage.tsx # 로그인
│ ├── OnboardingPage.tsx # 온보딩
│ ├── SupportPage.tsx # 고객 지원
│ ├── NutritionEncyclopediaPage.tsx # 영양소 백과사전
│ └── ErrorPage.tsx # 에러
│
├── hooks/ # 커스텀 훅
│ ├── useAuth.ts # 인증
│ ├── useEnroll.ts # 제품 등록
│ ├── useLike.ts # 좋아요
│ ├── useProduct.ts # 제품 검색
│ ├── useProductList.ts # 제품 목록
│ ├── useProductDetail.ts # 제품 상세
│ ├── useAnalysis.ts # 분석
│ ├── useReport.ts # 신고
│ ├── useAdminReports.ts # 관리자 신고
│ ├── useAdminReportDetail.ts
│ ├── useSearch.ts # 검색
│ └── useMessageModal.ts # 모달
│
├── store/ # Zustand 상태 관리
│ ├── useAuthStore.ts # 인증 상태
│ └── useStore.ts # 전역 상태
│
├── types/ # TypeScript 타입 정의
│ ├── auth.ts
│ ├── product.ts
│ ├── productList.ts
│ ├── productDetail.ts
│ ├── nutrition.ts
│ ├── analysis.ts
│ ├── enroll.ts
│ ├── like.ts
│ ├── report.ts
│ └── common.ts
│
├── utils/ # 유틸리티 함수
│ ├── image.ts # 이미지 압축
│ ├── nutritionUtils.ts # 영양정보 계산
│ └── chartUtils.ts # 차트 데이터 변환
│
├── constants/ # 상수
│ ├── nutrition.ts # 영양소 매핑
│ ├── nutritionEncyclopedia.ts # 백과사전 데이터
│ └── product.ts # 제품 상수
│
├── config/ # 설정
│ └── menuConfig.ts # 메뉴 설정
│
├── layout/ # 레이아웃 컴포넌트
│ ├── RootLayout.tsx # 메인 레이아웃
│ └── AuthLayout.tsx # 인증 레이아웃
│
├── routes/ # 라우팅
│ └── router.tsx # 라우터 설정
│
├── assets/ # 정적 파일
│ ├── icon/ # 아이콘
│ ├── img/ # 이미지
│ └── logo/ # 로고
│
├── App.tsx # 앱 루트
├── main.tsx # 앱 진입점
└── index.css # 글로벌 스타일

👥 개발 팀

역할이름GitHub
Frontend Developer유진@Yujin1219
Frontend Developer유상완 (바나)@wantkdd

📝 Git Convention

Git-flow 전략

  • main: 프로덕션 배포 브랜치
  • feature: 기능 개발 브랜치

브랜치 네이밍

feature/이름-기능제목#이슈번호

예시: feature/wantkdd-login#1

작업 규칙

  1. 모든 작업 전 main에서 최신 코드 pull
  2. 개인 작업은 feature 브랜치에서 진행
  3. 작업 완료 후 PR 생성
  4. 팀원 1명의 리뷰 및 approve 필수
  5. Approve 후 main에 merge

커밋 컨벤션

Prefix설명
start새 프로젝트 시작
feat새로운 기능 추가
fix버그 수정
designUI/CSS 변경
refactor코드 리팩토링
settings설정 파일 변경
comment주석 추가/변경
dependency의존성/플러그인 추가
docs문서 수정
merge브랜치 병합
deploy배포
rename파일/폴더명 수정
remove파일 삭제
revert이전 버전으로 롤백

커밋 메시지 예시

feat: 카카오 로그인 기능 구현 #12
fix: 제품 상세 페이지 로딩 오류 수정 #34
design: 마이페이지 반응형 스타일 적용 #56

📄 라이선스

이 프로젝트는 개인 프로젝트이며, 모든 권리는 개발팀에게 있습니다.

🔗 배포

  • 배포 플랫폼: Netlify
  • 배포 URL: [추후 업데이트]

⭐️ Made with ❤️ by DecodEat Team

About

No description, website, or topics provided.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages