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

 
 
 

Contributors

Languages