Skip to content

danbihyun/FitMap

Repository files navigation

FitMap - 운동 추천 & 시설 추천 앱

공모전 프로젝트: 운동 추천 및 운동 시설 추천 애플리케이션

📁 프로젝트 구조

total/
├── backend/          # 백엔드 서버 (Node.js + Express + Prisma)
│   ├── src/
│   │   ├── controllers/    # 컨트롤러 (비즈니스 로직)
│   │   ├── middleware/     # 미들웨어 (인증 등)
│   │   ├── routes/         # 라우터 (API 엔드포인트)
│   │   │   ├── auth.js     # 인증 API
│   │   │   ├── weather.js  # 날씨 API
│   │   │   ├── facilities.js # 시설 API
│   │   │   ├── chat.js     # 챗봇 API (챗봇 시작 메뉴)
│   │   │   ├── exercise.js # 운동 API (Python 서버 프록시)
│   │   │   ├── stretch.js  # 스트레칭 API (Python 서버 프록시)
│   │   │   └── music.js    # 음악 추천 API (Python 서버 프록시)
│   │   ├── services/       # 서비스 레이어
│   │   │   ├── authService.js
│   │   │   └── pythonClient.js # Python FastAPI 서버 호출 클라이언트
│   │   └── prismaClient.js # Prisma 클라이언트
│   ├── prisma/       # Prisma 스키마
│   ├── public/       # 정적 파일 (프론트엔드 빌드 결과물)
│   └── server.js     # 서버 진입점
│
├── frontend/         # 프론트엔드 (Vue 3 + Vite + TailwindCSS)
│   ├── src/
│   │   ├── components/     # Vue 컴포넌트
│   │   │   ├── signup/     # 회원가입 컴포넌트
│   │   │   ├── BottomNav.vue    # 하단 네비게이션 (챗봇용)
│   │   │   └── QuickButtons.vue # 빠른 버튼 (챗봇용)
│   │   ├── views/          # 페이지 뷰
│   │   │   ├── LoginView.vue
│   │   │   ├── DashboardView.vue
│   │   │   ├── Chatbot.vue      # 챗봇 페이지
│   │   │   ├── ExerciseList.vue # 운동 리스트 페이지
│   │   │   ├── Stretching.vue   # 스트레칭 페이지
│   │   │   ├── Records.vue      # 기록 페이지
│   │   │   ├── Stats.vue        # 통계 페이지
│   │   │   └── Profile.vue      # 프로필 페이지
│   │   ├── router/         # Vue Router 설정
│   │   └── assets/         # 정적 리소스
│   └── docs/         # 문서
│
├── fitmap_ai/        # Python FastAPI 서버 (챗봇 AI 기능)
│   ├── main.py       # FastAPI 앱 진입점
│   ├── database/
│   │   └── connection.py  # MySQL 데이터베이스 연결
│   ├── routers/      # API 라우터
│   │   ├── exercise.py    # 운동 관련 API
│   │   ├── stretch.py     # 스트레칭 관련 API
│   │   └── music.py       # 음악 추천 API
│   ├── services/     # 비즈니스 로직
│   │   ├── exercises.py   # 운동 데이터 조회
│   │   ├── stretch.py     # 스트레칭 데이터 조회
│   │   └── deezer.py      # Deezer API 음악 추천
│   └── requirements.txt   # Python 의존성
│
└── package.json      # 루트 스크립트 (빌드 & 실행)

🚀 시작하기

전체 프로젝트 실행 (챗봇 포함)

cd total
npm install
npm start

이 명령어는 다음을 동시에 실행합니다:

  1. Python FastAPI 서버 (포트 8000) - 챗봇 AI 기능
  2. Node.js 백엔드 서버 (포트 3000) - 메인 API 서버
  3. Vue.js 프론트엔드 개발 서버 (포트 5173) - 프론트엔드

💡 참고: concurrently 패키지를 사용하여 세 서비스를 동시에 실행합니다.

개발 모드 실행

npm run dev

개발 모드에서는:

  • Python 서버: 자동 재시작 (--reload)
  • 백엔드 서버: nodemon으로 자동 재시작
  • 프론트엔드: Vite HMR (Hot Module Replacement)

개별 실행

Python 서버만 실행

cd fitmap_ai
pip install -r requirements.txt
python -m uvicorn main:app --host 0.0.0.0 --port 8000 --reload

백엔드만 실행

cd backend
npm install
npm run dev  # 개발 모드 (nodemon)
# 또는
npm start    # 프로덕션 모드

프론트엔드만 실행

cd frontend
npm install
npm run dev  # 개발 서버

🛠 기술 스택

Backend

  • Node.js 20+
  • Express.js - HTTP 서버 & 라우팅
  • Prisma ORM - MySQL 접근용 ORM
  • MySQL - 데이터베이스 (Railway)
  • JWT - 인증 토큰
  • axios - Python 서버 호출용

Frontend

  • Vue 3 - 프론트엔드 프레임워크
  • Vite - 빌드 도구
  • Vue Router - 라우팅
  • TailwindCSS - 스타일링
  • axios - API 호출

AI 서버 (fitmap_ai)

  • Python 3.8+
  • FastAPI - 고성능 Python 웹 프레임워크
  • Uvicorn - ASGI 서버
  • PyMySQL - MySQL 데이터베이스 연결
  • Requests - 외부 API 호출 (Deezer 등)

📝 주요 기능

기본 기능

  • ✅ 회원가입/로그인
  • ✅ 날씨 정보 조회
  • ✅ 운동 시설 정보 조회

챗봇 기능 (fitmap_ai 통합)

  • 챗봇 인터페이스 - 대화형 운동 추천
  • 운동 리스트 조회 - 부위별/카테고리별 운동 검색
  • 스트레칭 정보 - 부위별 스트레칭 가이드
  • 음악 추천 - 운동 종류별 맞춤 음악 추천 (Deezer API 연동)

📌 환경 변수 설정

백엔드 .env 파일 (backend/.env)

# 데이터베이스 연결 (Prisma용)
DATABASE_URL="mysql://root:123456@localhost:3306/fitness_app"

# JWT 인증
JWT_SECRET="your_jwt_secret_key_here"

# 외부 API 키
KMA_API_KEY="your_kma_api_key"
PUBLIC_DATA_API_KEY="your_public_data_api_key"

# Python 서버 URL (챗봇 AI 서버)
PYTHON_BASE_URL="http://localhost:8000"

# 백엔드 서버 포트 (선택사항, 기본값: 3000)
PORT=3000

Python 서버 .env 파일 (fitmap_ai/.env)

원본 챗봇 폴더의 .env 파일 내용을 바탕으로 생성되었습니다:

# MySQL 데이터베이스 연결 정보
# 백엔드와 같은 데이터베이스를 사용합니다
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=123456
DB_NAME=fitness_app

완료: total/fitmap_ai/.env 파일이 생성되었습니다.

⚠️ 중요:

  • Python 서버는 별도의 .env 파일이 필요합니다. fitmap_ai 폴더에 .env 파일을 생성하세요.
  • 백엔드와 같은 데이터베이스를 사용하지만, 연결 방식이 다릅니다:
    • 백엔드: Prisma ORM 사용 (DATABASE_URL 형식)
    • Python 서버: PyMySQL 직접 연결 (개별 환경 변수 사용)
  • 원본 폴더의 .env 파일이 있다면 그대로 복사해서 사용하세요.

🔧 설치 가이드

1. Node.js 의존성 설치

cd total
npm run install:all

또는 개별 설치:

cd backend && npm install
cd ../frontend && npm install

2. Python 의존성 설치

cd total
npm run install:python

또는 직접 설치:

cd fitmap_ai
pip install -r requirements.txt

3. 환경 변수 설정

  1. backend/.env 파일 생성 및 설정
  2. fitmap_ai/.env 파일 생성 및 설정

4. Prisma 클라이언트 생성

cd backend
npx prisma generate

🎯 챗봇 기능 상세

fitmap_ai 폴더 설명

fitmap_ai챗봇의 AI 기능을 제공하는 Python FastAPI 서버입니다.

주요 역할:

  1. 운동 데이터 조회: MySQL 데이터베이스에서 운동 정보를 조회
  2. 스트레칭 정보 제공: 유연성 운동 데이터 조회
  3. 음악 추천: Deezer API를 통한 운동별 맞춤 음악 추천

아키텍처:

  • FastAPI: 비동기 고성능 웹 프레임워크
  • PyMySQL: MySQL 데이터베이스 직접 연결
  • RESTful API: Node.js 백엔드에서 프록시로 호출

데이터 흐름:

프론트엔드 (Vue)
    ↓
백엔드 (Express) - /api/exercise, /api/stretch, /api/music
    ↓
Python 서버 (FastAPI) - /exercise, /stretch, /music
    ↓
MySQL 데이터베이스

챗봇 API 엔드포인트

백엔드 프록시 API (Node.js)

  • GET /api/chat/start - 챗봇 시작 메뉴
  • GET /api/exercise/menu - 운동 리스트 메뉴
  • GET /api/exercise/body-parts - 부위별 운동 리스트
  • GET /api/exercise/categories - 카테고리별 운동 리스트
  • GET /api/exercise/by-body?part={부위} - 특정 부위 운동 조회
  • GET /api/exercise/by-category?category={카테고리} - 특정 카테고리 운동 조회
  • GET /api/exercise/detail?name={운동명} - 운동 상세 정보
  • GET /api/stretch/body-parts - 스트레칭 부위 리스트
  • GET /api/stretch/by-body?part={부위} - 특정 부위 스트레칭 조회
  • GET /api/stretch/detail?name={스트레칭명} - 스트레칭 상세 정보
  • GET /api/music/types - 음악 추천 운동 종류
  • GET /api/music/moods - 음악 분위기 리스트
  • POST /api/music/recommend - 음악 추천 (body: {category, mood})

Python 서버 직접 API (FastAPI)

  • GET /exercise/body-parts - 부위 리스트
  • GET /exercise/by-body?part={부위} - 부위별 운동
  • GET /exercise/categories - 카테고리 리스트
  • GET /exercise/by-category?category={카테고리} - 카테고리별 운동
  • GET /exercise/detail?name={운동명}&weight={체중} - 운동 상세
  • GET /stretch/body-parts - 스트레칭 부위 리스트
  • POST /stretch/by-body - 부위별 스트레칭 (body: {part})
  • POST /stretch/detail - 스트레칭 상세 (body: {name})
  • GET /music/types - 운동 종류 리스트
  • GET /music/moods - 분위기 리스트
  • POST /music/recommend - 음악 추천 (body: {category, mood})

🐛 문제 해결

데이터베이스 연결 오류

Python 서버에서 DB 연결 실패 시:

  1. fitmap_ai/.env 파일이 존재하는지 확인
  2. 데이터베이스 연결 정보가 올바른지 확인:
    DB_HOST=localhost
    DB_USER=root
    DB_PASSWORD=your_password
    DB_NAME=fitness_app
  3. MySQL 서버가 실행 중인지 확인
  4. 데이터베이스가 존재하는지 확인

백엔드에서 DB 연결 실패 시:

  1. backend/.env 파일의 DATABASE_URL 확인
  2. Prisma 클라이언트 재생성:
    cd backend
    npx prisma generate

Python 서버 실행 오류

  1. Python이 설치되어 있는지 확인:

    python --version
  2. 의존성이 설치되어 있는지 확인:

    cd fitmap_ai
    pip install -r requirements.txt
  3. 포트 8000이 사용 중인지 확인

프론트엔드에서 API 호출 실패

  1. 백엔드 서버가 실행 중인지 확인 (포트 3000)
  2. Python 서버가 실행 중인지 확인 (포트 8000)
  3. Vite 프록시 설정 확인 (frontend/vite.config.js)

📚 추가 문서

🔄 프로젝트 통합 이력

  • 챗봇 기능 통합: suhyeon/cb_pyv 프로젝트의 챗봇 기능을 total 프로젝트에 통합
  • Python FastAPI 서버 추가: fitmap_ai 폴더로 챗봇 AI 기능 제공
  • 프론트엔드 통합: 챗봇 페이지 및 컴포넌트 추가
  • 백엔드 통합: 챗봇 API 라우트 및 Python 서버 프록시 추가

포트:

  • 프론트엔드: 5173
  • 백엔드: 3000
  • Python 서버: 8000

About

운동 추천 & 시설 추천 앱

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors