Skip to content

Myaongi/FE-admin

Repository files navigation

강아지킴이 κ΄€λ¦¬μž λŒ€μ‹œλ³΄λ“œ

κ°•μ•„μ§€ μ‹€μ’…/발견 κ²Œμ‹œλ¬Ό 관리 μ‹œμŠ€ν…œμ˜ κ΄€λ¦¬μž λŒ€μ‹œλ³΄λ“œμž…λ‹ˆλ‹€. Next.js 15와 React 19λ₯Ό 기반으둜 κ΅¬μΆ•λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

πŸ“‹ λͺ©μ°¨

ν”„λ‘œμ νŠΈ κ°œμš”

강아지킴이 κ΄€λ¦¬μž λŒ€μ‹œλ³΄λ“œλŠ” μ‹€μ’…/발견 κ²Œμ‹œλ¬Ό ν”Œλž«νΌμ˜ κ΄€λ¦¬μžμš© μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μž…λ‹ˆλ‹€. κ΄€λ¦¬μžλŠ” 이 λŒ€μ‹œλ³΄λ“œλ₯Ό 톡해 μ‚¬μš©μž, κ²Œμ‹œλ¬Ό, μ‹ κ³  내역을 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ£Όμš” νŠΉμ§•

  • πŸ” JWT 기반 인증 μ‹œμŠ€ν…œ
  • πŸ“Š μ‹€μ‹œκ°„ 데이터 쑰회 및 관리
  • 🎨 λ°˜μ‘ν˜• λ””μžμΈ (λͺ¨λ°”일/λ°μŠ€ν¬ν†± 지원)
  • πŸ” 검색 및 필터링 κΈ°λŠ₯
  • πŸ“„ νŽ˜μ΄μ§€λ„€μ΄μ…˜ 지원
  • πŸ—‘οΈ κ²Œμ‹œλ¬Ό 및 μ‚¬μš©μž μ‚­μ œ κΈ°λŠ₯
  • ⚠️ μ‹ κ³  λ‚΄μ—­ 관리 및 처리

μ£Όμš” κΈ°λŠ₯

1. μ‚¬μš©μž 관리 (/admin/members)

  • μ‚¬μš©μž λͺ©λ‘ 쑰회: 전체 μ‚¬μš©μž λͺ©λ‘μ„ νŽ˜μ΄μ§€λ„€μ΄μ…˜κ³Ό ν•¨κ»˜ 쑰회
  • 검색 κΈ°λŠ₯: μ‚¬μš©μžλͺ… λ˜λŠ” μ΄λ©”μΌλ‘œ 검색
  • μƒνƒœ 관리: 계정 ν™œμ„±ν™”/λΉ„ν™œμ„±ν™” 처리
  • 계정 μ‚­μ œ: μ‚¬μš©μž 계정 μ‚­μ œ κΈ°λŠ₯
  • 상세 정보: μ‚¬μš©μž ν™œλ™ 상세 정보 λͺ¨λ‹¬

2. κ²Œμ‹œλ¬Ό 관리 (/admin/posts)

  • κ²Œμ‹œλ¬Ό λͺ©λ‘ 쑰회: 전체/λ°œκ²¬ν–ˆμ–΄μš”/μžƒμ–΄λ²„λ Έμ–΄μš” κ²Œμ‹œλ¬Ό 필터링
  • AI 이미지 ν•„ν„°: AI 생성 이미지 κ²Œμ‹œλ¬Όλ§Œ 쑰회
  • κ²Œμ‹œλ¬Ό μ‚­μ œ: λΆ€μ μ ˆν•œ κ²Œμ‹œλ¬Ό μ‚­μ œ κΈ°λŠ₯
  • 상세 정보: κ²Œμ‹œλ¬Ό 상세 정보 λͺ¨λ‹¬ (κ°•μ•„μ§€ 정보, μœ„μΉ˜ 정보 포함)
  • 지도 연동: Google Mapsλ₯Ό ν†΅ν•œ μœ„μΉ˜ 정보 ν‘œμ‹œ

3. μ‹ κ³  λ‚΄μ—­ 관리 (/admin/reports)

  • μ‹ κ³  λͺ©λ‘ 쑰회: 전체 μ‹ κ³  λ‚΄μ—­ 쑰회
  • μ‹ κ³  상세보기: μ‹ κ³  μ‚¬μœ  및 상세 정보 확인
  • κ²Œμ‹œλ¬Ό 연동: μ‹ κ³ λœ κ²Œμ‹œλ¬Ό λ°”λ‘œ 확인
  • 처리 κΈ°λŠ₯:
    • μ‹ κ³  λ¬΄μ‹œ 처리
    • μ‹ κ³ λœ κ²Œμ‹œλ¬Ό μ‚­μ œ

4. 인증 μ‹œμŠ€ν…œ (/login)

  • 둜그인: 이메일/λΉ„λ°€λ²ˆν˜Έ 기반 둜그인
  • 토큰 관리: JWT 토큰 기반 인증
  • μžλ™ λ¦¬λ‹€μ΄λ ‰νŠΈ: 미인증 μ‹œ 둜그인 νŽ˜μ΄μ§€λ‘œ μžλ™ 이동
  • μ„Έμ…˜ 관리: 둜컬 μŠ€ν† λ¦¬μ§€λ₯Ό ν†΅ν•œ μ„Έμ…˜ μœ μ§€

기술 μŠ€νƒ

ν”„λ‘ νŠΈμ—”λ“œ

  • Framework: Next.js 15.5.6 (App Router)
  • UI Library: React 19.1.0
  • Language: TypeScript 5
  • Styling: Tailwind CSS 3.4.0
  • HTTP Client: Axios 1.12.2
  • UI Components:
    • @headlessui/react 2.2.9
    • @heroicons/react 2.2.0
  • Maps: @react-google-maps/api 2.20.7

개발 도ꡬ

  • Linting: ESLint 9
  • Build Tool: Turbopack (Next.js λ‚΄μž₯)
  • Package Manager: npm/yarn

ν”„λ‘œμ νŠΈ ꡬ쑰

fe-admin/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ app/                      # Next.js App Router νŽ˜μ΄μ§€
β”‚   β”‚   β”œβ”€β”€ admin/              # κ΄€λ¦¬μž νŽ˜μ΄μ§€
β”‚   β”‚   β”‚   β”œβ”€β”€ members/        # μ‚¬μš©μž 관리
β”‚   β”‚   β”‚   β”œβ”€β”€ posts/          # κ²Œμ‹œλ¬Ό 관리
β”‚   β”‚   β”‚   β”œβ”€β”€ reports/        # μ‹ κ³  λ‚΄μ—­ 관리
β”‚   β”‚   β”‚   β”œβ”€β”€ layout.tsx      # κ΄€λ¦¬μž λ ˆμ΄μ•„μ›ƒ
β”‚   β”‚   β”‚   └── page.tsx        # κ΄€λ¦¬μž 메인 (λ¦¬λ‹€μ΄λ ‰νŠΈ)
β”‚   β”‚   β”œβ”€β”€ api/                # API 라우트 (ν”„λ‘μ‹œ)
β”‚   β”‚   β”‚   β”œβ”€β”€ admin/          # κ΄€λ¦¬μž API
β”‚   β”‚   β”‚   └── auth/           # 인증 API
β”‚   β”‚   β”œβ”€β”€ login/              # 둜그인 νŽ˜μ΄μ§€
β”‚   β”‚   β”œβ”€β”€ layout.tsx          # 루트 λ ˆμ΄μ•„μ›ƒ
β”‚   β”‚   └── page.tsx            # ν™ˆ νŽ˜μ΄μ§€
β”‚   β”œβ”€β”€ components/             # μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈ
β”‚   β”‚   β”œβ”€β”€ badge/              # μƒνƒœ λ°°μ§€ μ»΄ν¬λ„ŒνŠΈ
β”‚   β”‚   β”œβ”€β”€ filters/            # ν•„ν„° μ»΄ν¬λ„ŒνŠΈ
β”‚   β”‚   β”œβ”€β”€ layout/             # λ ˆμ΄μ•„μ›ƒ μ»΄ν¬λ„ŒνŠΈ
β”‚   β”‚   β”œβ”€β”€ tables/             # ν…Œμ΄λΈ” μ»΄ν¬λ„ŒνŠΈ
β”‚   β”‚   β”œβ”€β”€ tabs/               # νƒ­ μ»΄ν¬λ„ŒνŠΈ
β”‚   β”‚   β”œβ”€β”€ ui/                 # UI μ»΄ν¬λ„ŒνŠΈ
β”‚   β”‚   β”œβ”€β”€ AiToggle.tsx        # AI ν•„ν„° ν† κΈ€
β”‚   β”‚   β”œβ”€β”€ FilterButtons.tsx   # κ²Œμ‹œλ¬Ό νƒ€μž… ν•„ν„°
β”‚   β”‚   β”œβ”€β”€ MembersDetailModal.tsx
β”‚   β”‚   β”œβ”€β”€ PostDetailModal.tsx
β”‚   β”‚   β”œβ”€β”€ PostsTable.tsx
β”‚   β”‚   β”œβ”€β”€ ReportDetailModal.tsx
β”‚   β”‚   └── Sidebar.tsx
β”‚   └── lib/                    # μœ ν‹Έλ¦¬ν‹° 및 μ„€μ •
β”‚       β”œβ”€β”€ api-client.ts       # API ν΄λΌμ΄μ–ΈνŠΈ
β”‚       β”œβ”€β”€ url-utils.ts        # URL μœ ν‹Έλ¦¬ν‹°
β”‚       └── mock/               # λͺ©μ—… 데이터
β”œβ”€β”€ public/                     # 정적 파일
β”œβ”€β”€ next.config.js              # Next.js μ„€μ •
β”œβ”€β”€ tailwind.config.js          # Tailwind CSS μ„€μ •
└── package.json                # ν”„λ‘œμ νŠΈ μ˜μ‘΄μ„±

μ‹œμž‘ν•˜κΈ°

사전 μš”κ΅¬μ‚¬ν•­

  • Node.js 18 이상
  • npm λ˜λŠ” yarn

μ„€μΉ˜

# μ˜μ‘΄μ„± μ„€μΉ˜
npm install
# λ˜λŠ”
yarn install

개발 μ„œλ²„ μ‹€ν–‰

# 개발 μ„œλ²„ μ‹œμž‘ (Turbopack μ‚¬μš©)
npm run dev
# λ˜λŠ”
yarn dev

λΈŒλΌμš°μ €μ—μ„œ http://localhost:3000을 μ—΄μ–΄ ν™•μΈν•˜μ„Έμš”.

λΉŒλ“œ

# ν”„λ‘œλ•μ…˜ λΉŒλ“œ
npm run build
# λ˜λŠ”
yarn build

# ν”„λ‘œλ•μ…˜ μ„œλ²„ μ‹œμž‘
npm start
# λ˜λŠ”
yarn start

ν™˜κ²½ μ„€μ •

λ°±μ—”λ“œ μ„œλ²„ μ„€μ •

ν”„λ‘œμ νŠΈλŠ” μ™ΈλΆ€ λ°±μ—”λ“œ μ„œλ²„(http://54.180.54.51:8080)와 ν†΅μ‹ ν•©λ‹ˆλ‹€.

next.config.jsμ—μ„œ API ν”„λ‘μ‹œ 섀정을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€:

async rewrites() {
  return [
    {
      source: "/api/:path*",
      destination: "http://54.180.54.51:8080/api/:path*",
    },
  ];
}

ν™˜κ²½ λ³€μˆ˜

개발 ν™˜κ²½μ—μ„œ λͺ©μ—… 데이터λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ ν™˜κ²½ λ³€μˆ˜λ₯Ό μ„€μ •ν•˜μ„Έμš”:

# .env.local
NEXT_PUBLIC_USE_MOCK=true

이미지 도메인 μ„€μ •

S3 이미지λ₯Ό ν‘œμ‹œν•˜κΈ° μœ„ν•΄ next.config.js에 이미지 도메인이 μ„€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€:

images: {
  remotePatterns: [
    {
      protocol: "https",
      hostname: "gangajikimi-server.s3.ap-northeast-2.amazonaws.com",
      pathname: "/**",
    },
  ],
}

μ£Όμš” νŽ˜μ΄μ§€

둜그인 νŽ˜μ΄μ§€ (/login)

  • 이메일/λΉ„λ°€λ²ˆν˜Έ μž…λ ₯
  • JWT 토큰 λ°œκΈ‰ 및 μ €μž₯
  • 둜그인 성곡 μ‹œ /admin/members둜 λ¦¬λ‹€μ΄λ ‰νŠΈ

μ‚¬μš©μž 관리 (/admin/members)

  • μ‚¬μš©μž λͺ©λ‘ ν…Œμ΄λΈ”
  • 검색 κΈ°λŠ₯ (μ‚¬μš©μžλͺ…/이메일)
  • νŽ˜μ΄μ§€λ„€μ΄μ…˜ (κΈ°λ³Έ 20개/νŽ˜μ΄μ§€)
  • 계정 μƒνƒœ λ³€κ²½ (ν™œμ„±ν™”/λΉ„ν™œμ„±ν™”)
  • 계정 μ‚­μ œ
  • μ‚¬μš©μž 상세 정보 λͺ¨λ‹¬

κ²Œμ‹œλ¬Ό 관리 (/admin/posts)

  • κ²Œμ‹œλ¬Ό λͺ©λ‘ ν…Œμ΄λΈ”
  • ν•„ν„°: 전체/λ°œκ²¬ν–ˆμ–΄μš”/μžƒμ–΄λ²„λ Έμ–΄μš”
  • AI 이미지 ν•„ν„° ν† κΈ€
  • κ²Œμ‹œλ¬Ό μ‚­μ œ
  • κ²Œμ‹œλ¬Ό 상세 정보 λͺ¨λ‹¬:
    • κ²Œμ‹œλ¬Ό 정보 νƒ­
    • κ°•μ•„μ§€ 정보 νƒ­
    • μœ„μΉ˜ 정보 νƒ­ (Google Maps)

μ‹ κ³  λ‚΄μ—­ 관리 (/admin/reports)

  • μ‹ κ³  λͺ©λ‘ ν…Œμ΄λΈ”
  • μ‹ κ³  μ‚¬μœ , μ‹ κ³ μž, 신고일 ν‘œμ‹œ
  • μ‹ κ³  μƒνƒœ λ°°μ§€
  • μ‹ κ³  상세보기 λͺ¨λ‹¬
  • μ‹ κ³ λœ κ²Œμ‹œλ¬Ό λ°”λ‘œκ°€κΈ°
  • κ΄€λ¦¬μž μž‘μ—…:
    • μ‹ κ³  λ¬΄μ‹œ 처리
    • μ‹ κ³ λœ κ²Œμ‹œλ¬Ό μ‚­μ œ

API ꡬ쑰

인증 API

  • POST /api/auth/login - 둜그인

κ΄€λ¦¬μž API

μ‚¬μš©μž 관리

  • GET /api/admin/members - μ‚¬μš©μž λͺ©λ‘ 쑰회
  • GET /api/admin/members/[id] - μ‚¬μš©μž 상세 쑰회
  • PATCH /api/admin/members/[id]/status - μ‚¬μš©μž μƒνƒœ λ³€κ²½
  • DELETE /api/admin/members/[id] - μ‚¬μš©μž μ‚­μ œ

κ²Œμ‹œλ¬Ό 관리

  • GET /api/admin/posts - κ²Œμ‹œλ¬Ό λͺ©λ‘ 쑰회
  • GET /api/admin/posts/[type]/[id] - κ²Œμ‹œλ¬Ό 상세 쑰회
  • DELETE /api/admin/posts/[type]/[id]/delete - κ²Œμ‹œλ¬Ό μ‚­μ œ

μ‹ κ³  λ‚΄μ—­ 관리

  • GET /api/admin/reports - μ‹ κ³  λͺ©λ‘ 쑰회
  • GET /api/admin/reports/[type]/[reportId] - μ‹ κ³  상세 쑰회
  • PATCH /api/admin/reports/[type]/[reportId]/ignore - μ‹ κ³  λ¬΄μ‹œ 처리
  • DELETE /api/admin/reports/[type]/[reportId]/delete - μ‹ κ³ λœ κ²Œμ‹œλ¬Ό μ‚­μ œ

API ν΄λΌμ΄μ–ΈνŠΈ

src/lib/api-client.tsμ—μ„œ API ν΄λΌμ΄μ–ΈνŠΈλ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€:

  • apiClient: μ‹€μ œ μ„œλ²„μ™€ 톡신 (κ²Œμ‹œλ¬Ό, μ‹ κ³  관리)
  • mockApiClient: λͺ©μ—… 데이터 μ‚¬μš© (μ‚¬μš©μž 관리)

μ£Όμš” μ»΄ν¬λ„ŒνŠΈ

λ ˆμ΄μ•„μ›ƒ μ»΄ν¬λ„ŒνŠΈ

  • Sidebar: μ‚¬μ΄λ“œλ°” λ„€λΉ„κ²Œμ΄μ…˜ 메뉴
  • AdminHeader: 상단 헀더 (μ‚¬μ΄λ“œλ°” ν† κΈ€, μ‚¬μš©μž 정보, λ‘œκ·Έμ•„μ›ƒ)

ν…Œμ΄λΈ” μ»΄ν¬λ„ŒνŠΈ

  • AdminTable: λ²”μš© κ΄€λ¦¬μž ν…Œμ΄λΈ”
  • PostsTable: κ²Œμ‹œλ¬Ό μ „μš© ν…Œμ΄λΈ”
  • TablePagination: νŽ˜μ΄μ§€λ„€μ΄μ…˜ μ»΄ν¬λ„ŒνŠΈ

λͺ¨λ‹¬ μ»΄ν¬λ„ŒνŠΈ

  • MembersDetailModal: μ‚¬μš©μž 상세 정보 λͺ¨λ‹¬
  • PostDetailModal: κ²Œμ‹œλ¬Ό 상세 정보 λͺ¨λ‹¬ (νƒ­ ꡬ쑰)
  • ReportDetailModal: μ‹ κ³  상세 정보 λͺ¨λ‹¬

ν•„ν„° μ»΄ν¬λ„ŒνŠΈ

  • FilterButtons: κ²Œμ‹œλ¬Ό νƒ€μž… ν•„ν„° (전체/발견/μ‹€μ’…)
  • SearchFilter: 검색 μž…λ ₯ ν•„ν„°
  • AiToggle: AI 이미지 ν•„ν„° ν† κΈ€

λ°°μ§€ μ»΄ν¬λ„ŒνŠΈ

  • ActivityBadge: μ‚¬μš©μž ν™œλ™ μƒνƒœ λ°°μ§€
  • StatusBadge: 일반 μƒνƒœ λ°°μ§€
  • ReportStatusBadge: μ‹ κ³  μƒνƒœ λ°°μ§€

인증 및 λ³΄μ•ˆ

  • JWT 토큰 기반 인증
  • 둜컬 μŠ€ν† λ¦¬μ§€μ— 토큰 μ €μž₯
  • API μš”μ²­ μ‹œ Authorization 헀더에 토큰 포함
  • 토큰 만료 μ‹œ μžλ™ λ‘œκ·Έμ•„μ›ƒ 및 둜그인 νŽ˜μ΄μ§€ λ¦¬λ‹€μ΄λ ‰νŠΈ
  • κ΄€λ¦¬μž νŽ˜μ΄μ§€ μ ‘κ·Ό μ‹œ 인증 확인

μŠ€νƒ€μΌλ§

  • Tailwind CSSλ₯Ό μ‚¬μš©ν•œ μœ ν‹Έλ¦¬ν‹° 기반 μŠ€νƒ€μΌλ§
  • λ°˜μ‘ν˜• λ””μžμΈ (λͺ¨λ°”일/νƒœλΈ”λ¦Ώ/λ°μŠ€ν¬ν†±)
  • 닀크 λͺ¨λ“œλŠ” 미지원 (ν–₯ν›„ μΆ”κ°€ κ°€λŠ₯)

개발 팁

λͺ©μ—… 데이터 μ‚¬μš©

개발 쀑 λ°±μ—”λ“œ μ„œλ²„κ°€ 없을 λ•Œ λͺ©μ—… 데이터λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

  1. .env.local 파일 생성
  2. NEXT_PUBLIC_USE_MOCK=true μ„€μ •
  3. 개발 μ„œλ²„ μž¬μ‹œμž‘

디버깅

  • λΈŒλΌμš°μ € μ½˜μ†”μ—μ„œ API μš”μ²­/응닡 둜그 확인
  • λ„€νŠΈμ›Œν¬ νƒ­μ—μ„œ μ‹€μ œ HTTP μš”μ²­ 확인
  • Next.js μ„œλ²„ μ½˜μ†”μ—μ„œ μ„œλ²„ μ‚¬μ΄λ“œ 둜그 확인

λΌμ΄μ„ μŠ€

이 ν”„λ‘œμ νŠΈλŠ” λΉ„κ³΅κ°œ ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€.

문의

ν”„λ‘œμ νŠΈ κ΄€λ ¨ λ¬Έμ˜μ‚¬ν•­μ΄ μžˆμœΌμ‹œλ©΄ κ°œλ°œνŒ€μ— μ—°λ½ν•΄μ£Όμ„Έμš”.

About

Frontend for admin web page

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages