diff --git a/.gitignore b/.gitignore index c9269d7..7d9db00 100644 --- a/.gitignore +++ b/.gitignore @@ -55,7 +55,7 @@ Vagrantfile #------------------------- # Local docs & MCP (저장소에 올리지 않음) #------------------------- -docs/ +docs/local/ mcp-servers/ # Cursor MCP — API 키·로컬 경로 등 포함 가능 diff --git a/README.md b/README.md index 01892be..09e17ed 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ 백엔드는 **[CodeIgniter 4](https://codeigniter.com/)** 기반입니다. **저장소:** [wixon-associates/jongryangje](https://github.com/wixon-associates/jongryangje) +| **[구현 화면 스크린샷](./docs/SCREENSHOTS.md)** | **[Notion 진행상황](https://www.notion.so/31b42b987c3780baba32ded04a1d41bb)** | --- diff --git a/docs/SCREENSHOTS.md b/docs/SCREENSHOTS.md new file mode 100644 index 0000000..08b2f5a --- /dev/null +++ b/docs/SCREENSHOTS.md @@ -0,0 +1,92 @@ +# 종량제 — 구현 화면 스크린샷 + +> 2026-03-25 기준 구현 완료된 전체 화면 캡처 + +--- + +## 공개 페이지 + +### 홈페이지 (`/`) +![홈페이지](../screenshots/01_home.png) + +### 로그인 (`/login`) +![로그인](../screenshots/02_login.png) + +### 회원가입 (`/register`) +![회원가입](../screenshots/03_register.png) + +--- + +## 관리자 — Super Admin + +### 지자체 선택 (`/admin/select-local-government`) +Super Admin 로그인 시 첫 화면. 작업할 지자체를 선택해야 관리자 기능 사용 가능. +![지자체 선택](../screenshots/04_admin_select_lg.png) + +### 관리자 대시보드 (`/admin`) +![관리자 대시보드](../screenshots/05_admin_dashboard.png) + +### 회원 관리 (`/admin/users`) +전체 회원 목록 조회. 역할, 상태, 승인 상태 확인 가능. +![회원 관리](../screenshots/06_admin_users.png) + +### 회원 등록 (`/admin/users/create`) +관리자가 직접 회원을 등록하는 화면. 역할 및 지자체 지정 가능. +![회원 등록](../screenshots/07_admin_users_create.png) + +### 로그인 이력 (`/admin/access/login-history`) +전체 로그인 성공/실패 이력. 기간별 조회 가능. +![로그인 이력](../screenshots/08_admin_login_history.png) + +### 승인 대기 (`/admin/access/approvals`) +회원가입 승인 요청 목록. 승인/거절 처리. +![승인 대기](../screenshots/09_admin_approvals.png) + +### 역할 관리 (`/admin/roles`) +시스템 역할 목록 조회 (4단계 RBAC). +![역할 관리](../screenshots/10_admin_roles.png) + +### 메뉴 관리 (`/admin/menus`) +트리 구조 메뉴 CRUD. 관리자/사이트 메뉴 분리, 역할별 노출 설정. +![메뉴 관리](../screenshots/11_admin_menus.png) + +### 지자체 관리 (`/admin/local-governments`) +Super Admin 전용. 등록된 지자체 목록. +![지자체 관리](../screenshots/12_admin_local_governments.png) + +### 지자체 등록 (`/admin/local-governments/create`) +![지자체 등록](../screenshots/13_admin_lg_create.png) + +### 지정판매소 관리 (`/admin/designated-shops`) +현재 지자체 소속 지정판매소 목록. +![지정판매소 관리](../screenshots/14_admin_designated_shops.png) + +### 지정판매소 등록 (`/admin/designated-shops/create`) +판매소번호 자동생성, 상세 정보 입력. +![지정판매소 등록](../screenshots/15_admin_ds_create.png) + +--- + +## 사용자 화면 + +### 일일 봉투 수불현황 — 대시보드 (`/dashboard`) +로그인 후 기본 화면. +![대시보드](../screenshots/16_user_dashboard.png) + +### 클래식 대시보드 (`/dashboard/classic-mock`) +![클래식 대시보드](../screenshots/17_dashboard_classic.png) + +### 모던 대시보드 (`/dashboard/modern`) +![모던 대시보드](../screenshots/18_dashboard_modern.png) + +### 밀집형 대시보드 (`/dashboard/dense`) +![밀집형 대시보드](../screenshots/19_dashboard_dense.png) + +### 차트 대시보드 (`/dashboard/charts`) +![차트 대시보드](../screenshots/20_dashboard_charts.png) + +### 재고 조회 (`/bag/inventory-inquiry`) +![재고 조회](../screenshots/21_bag_inventory.png) + +### 봉투 수불현황 (`/bag/waste-suibal-enterprise`) +![봉투 수불현황](../screenshots/22_bag_waste_suibal.png) diff --git a/e2e/helpers/screenshots.js b/e2e/helpers/screenshots.js new file mode 100644 index 0000000..5588e99 --- /dev/null +++ b/e2e/helpers/screenshots.js @@ -0,0 +1,88 @@ +/** + * 전체 페이지 스크린샷 캡처 + * 실행: node e2e/helpers/screenshots.js + */ +const { chromium } = require('@playwright/test'); +const path = require('path'); +const fs = require('fs'); + +const BASE_URL = 'http://localhost:8045'; +const SCREENSHOT_DIR = path.join(__dirname, '../../screenshots'); + +const ACCOUNTS = { + admin: { id: 'tester_admin', password: 'test1234!' }, + local: { id: 'tester_local', password: 'test1234!' }, + user: { id: 'tester_user', password: 'test1234!' }, +}; + +async function login(page, account) { + await page.goto(`${BASE_URL}/login`); + await page.fill('input[name="login_id"]', account.id); + await page.fill('input[name="password"]', account.password); + await page.click('button[type="submit"]'); + await page.waitForURL(url => !url.pathname.includes('/login'), { timeout: 15000 }); +} + +async function screenshot(page, name, url) { + if (url) await page.goto(url); + await page.waitForTimeout(1000); + const filePath = path.join(SCREENSHOT_DIR, `${name}.png`); + await page.screenshot({ path: filePath, fullPage: true }); + console.log(` ✓ ${name}`); + return filePath; +} + +async function run() { + if (!fs.existsSync(SCREENSHOT_DIR)) fs.mkdirSync(SCREENSHOT_DIR, { recursive: true }); + + const browser = await chromium.launch(); + const context = await browser.newContext({ viewport: { width: 1440, height: 900 }, locale: 'ko-KR' }); + const page = await context.newPage(); + + console.log('=== 공개 페이지 ==='); + await screenshot(page, '01_home', `${BASE_URL}/`); + await screenshot(page, '02_login', `${BASE_URL}/login`); + await screenshot(page, '03_register', `${BASE_URL}/register`); + + console.log('\n=== Super Admin — 지자체 선택 ==='); + await login(page, ACCOUNTS.admin); + await screenshot(page, '04_admin_select_lg'); + + // 지자체 선택 + const radio = page.locator('input[name="lg_idx"]').first(); + await radio.check(); + await page.click('button[type="submit"]'); + await page.waitForURL(url => !url.pathname.includes('select-local-government'), { timeout: 15000 }); + + console.log('\n=== 관리자 패널 (Super Admin) ==='); + await screenshot(page, '05_admin_dashboard', `${BASE_URL}/admin`); + await screenshot(page, '06_admin_users', `${BASE_URL}/admin/users`); + await screenshot(page, '07_admin_users_create', `${BASE_URL}/admin/users/create`); + await screenshot(page, '08_admin_login_history', `${BASE_URL}/admin/access/login-history`); + await screenshot(page, '09_admin_approvals', `${BASE_URL}/admin/access/approvals`); + await screenshot(page, '10_admin_roles', `${BASE_URL}/admin/roles`); + await screenshot(page, '11_admin_menus', `${BASE_URL}/admin/menus`); + await screenshot(page, '12_admin_local_governments', `${BASE_URL}/admin/local-governments`); + await screenshot(page, '13_admin_lg_create', `${BASE_URL}/admin/local-governments/create`); + await screenshot(page, '14_admin_designated_shops', `${BASE_URL}/admin/designated-shops`); + await screenshot(page, '15_admin_ds_create', `${BASE_URL}/admin/designated-shops/create`); + + // 로그아웃 + await page.goto(`${BASE_URL}/logout`); + await page.waitForURL(/\/login/, { timeout: 10000 }); + + console.log('\n=== 일반 사용자 — 대시보드 ==='); + await login(page, ACCOUNTS.user); + await screenshot(page, '16_user_dashboard', `${BASE_URL}/dashboard`); + await screenshot(page, '17_dashboard_classic', `${BASE_URL}/dashboard/classic-mock`); + await screenshot(page, '18_dashboard_modern', `${BASE_URL}/dashboard/modern`); + await screenshot(page, '19_dashboard_dense', `${BASE_URL}/dashboard/dense`); + await screenshot(page, '20_dashboard_charts', `${BASE_URL}/dashboard/charts`); + await screenshot(page, '21_bag_inventory', `${BASE_URL}/bag/inventory-inquiry`); + await screenshot(page, '22_bag_waste_suibal', `${BASE_URL}/bag/waste-suibal-enterprise`); + + await browser.close(); + console.log(`\n스크린샷 ${fs.readdirSync(SCREENSHOT_DIR).length}개 저장 완료 → ${SCREENSHOT_DIR}`); +} + +run().catch(err => { console.error('실패:', err.message); process.exit(1); }); diff --git a/jobs.md b/jobs.md index 7675694..3592902 100644 --- a/jobs.md +++ b/jobs.md @@ -154,6 +154,7 @@ ### 2026-03-25 +- **DOC-02** 스크린샷 22개 + docs/SCREENSHOTS.md + Notion 진행상황 업데이트 + README 연동 - **TEST-01** Playwright E2E 테스트 환경 구성 (Chromium) - **TEST-01** 테스터 계정 4개 생성 (admin/local/shop/user, 비밀번호: test1234!) - **TEST-01** E2E 테스트 23개 작성 및 전체 통과 (auth 9, admin 10, public 4)