스크린샷 문서 생성 및 Notion/README 연동
- docs/SCREENSHOTS.md: 전체 22개 화면 스크린샷 문서 - README.md: 스크린샷 문서 + Notion 진행상황 링크 추가 - Notion: 진행상황 페이지에 E2E 테스트, 테스터 계정, 전체 스크린샷, 개발 현황 요약 추가 - e2e/helpers/screenshots.js: 자동 스크린샷 캡처 스크립트 - .gitignore: docs/ 허용 (docs/local/ 만 제외) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -55,7 +55,7 @@ Vagrantfile
|
||||
#-------------------------
|
||||
# Local docs & MCP (저장소에 올리지 않음)
|
||||
#-------------------------
|
||||
docs/
|
||||
docs/local/
|
||||
mcp-servers/
|
||||
|
||||
# Cursor MCP — API 키·로컬 경로 등 포함 가능
|
||||
|
||||
@@ -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)** |
|
||||
|
||||
---
|
||||
|
||||
|
||||
92
docs/SCREENSHOTS.md
Normal file
92
docs/SCREENSHOTS.md
Normal file
@@ -0,0 +1,92 @@
|
||||
# 종량제 — 구현 화면 스크린샷
|
||||
|
||||
> 2026-03-25 기준 구현 완료된 전체 화면 캡처
|
||||
|
||||
---
|
||||
|
||||
## 공개 페이지
|
||||
|
||||
### 홈페이지 (`/`)
|
||||

|
||||
|
||||
### 로그인 (`/login`)
|
||||

|
||||
|
||||
### 회원가입 (`/register`)
|
||||

|
||||
|
||||
---
|
||||
|
||||
## 관리자 — Super Admin
|
||||
|
||||
### 지자체 선택 (`/admin/select-local-government`)
|
||||
Super Admin 로그인 시 첫 화면. 작업할 지자체를 선택해야 관리자 기능 사용 가능.
|
||||

|
||||
|
||||
### 관리자 대시보드 (`/admin`)
|
||||

|
||||
|
||||
### 회원 관리 (`/admin/users`)
|
||||
전체 회원 목록 조회. 역할, 상태, 승인 상태 확인 가능.
|
||||

|
||||
|
||||
### 회원 등록 (`/admin/users/create`)
|
||||
관리자가 직접 회원을 등록하는 화면. 역할 및 지자체 지정 가능.
|
||||

|
||||
|
||||
### 로그인 이력 (`/admin/access/login-history`)
|
||||
전체 로그인 성공/실패 이력. 기간별 조회 가능.
|
||||

|
||||
|
||||
### 승인 대기 (`/admin/access/approvals`)
|
||||
회원가입 승인 요청 목록. 승인/거절 처리.
|
||||

|
||||
|
||||
### 역할 관리 (`/admin/roles`)
|
||||
시스템 역할 목록 조회 (4단계 RBAC).
|
||||

|
||||
|
||||
### 메뉴 관리 (`/admin/menus`)
|
||||
트리 구조 메뉴 CRUD. 관리자/사이트 메뉴 분리, 역할별 노출 설정.
|
||||

|
||||
|
||||
### 지자체 관리 (`/admin/local-governments`)
|
||||
Super Admin 전용. 등록된 지자체 목록.
|
||||

|
||||
|
||||
### 지자체 등록 (`/admin/local-governments/create`)
|
||||

|
||||
|
||||
### 지정판매소 관리 (`/admin/designated-shops`)
|
||||
현재 지자체 소속 지정판매소 목록.
|
||||

|
||||
|
||||
### 지정판매소 등록 (`/admin/designated-shops/create`)
|
||||
판매소번호 자동생성, 상세 정보 입력.
|
||||

|
||||
|
||||
---
|
||||
|
||||
## 사용자 화면
|
||||
|
||||
### 일일 봉투 수불현황 — 대시보드 (`/dashboard`)
|
||||
로그인 후 기본 화면.
|
||||

|
||||
|
||||
### 클래식 대시보드 (`/dashboard/classic-mock`)
|
||||

|
||||
|
||||
### 모던 대시보드 (`/dashboard/modern`)
|
||||

|
||||
|
||||
### 밀집형 대시보드 (`/dashboard/dense`)
|
||||

|
||||
|
||||
### 차트 대시보드 (`/dashboard/charts`)
|
||||

|
||||
|
||||
### 재고 조회 (`/bag/inventory-inquiry`)
|
||||

|
||||
|
||||
### 봉투 수불현황 (`/bag/waste-suibal-enterprise`)
|
||||

|
||||
88
e2e/helpers/screenshots.js
Normal file
88
e2e/helpers/screenshots.js
Normal file
@@ -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); });
|
||||
1
jobs.md
1
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)
|
||||
|
||||
Reference in New Issue
Block a user