From 124ad0d165392640596ba396cf59550a84340d44 Mon Sep 17 00:00:00 2001 From: byun Date: Mon, 1 Jun 2026 15:25:47 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=E2=80=94=20=EC=98=B5=EC=A0=80=EB=B2=84=20=EA=B3=84=EC=A0=95=20?= =?UTF-8?q?=EB=B0=8F=20=ED=98=84=ED=99=A9=20=EC=A1=B0=ED=9A=8C=20=ED=8F=AC?= =?UTF-8?q?=ED=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 읽기 전용 옵저버 역할 추가. 신고 현황 확인만 가능하며 모든 쓰기 동작 차단. - auth.py: require_viewer(admin+observer) 의존성 추가 - auth_router.py: register 엔드포인트에 role 파라미터 추가 (mechanic/observer) - login.html: 회원가입 시 정비사/옵저버 역할 카드 선택 UI, 역할별 안내문구 - 로그인 후 observer → /pages/observer/dashboard.html 라우팅 - observer/dashboard.html: 통계 카드(상태별 건수) + 신고 현황 테이블(읽기전용) - observer/reports.html: 상태·충전기ID·충전소명 필터 신고 목록 - accounts.html: 옵저버 필터·생성·승인 대기 역할 표시 추가 Co-Authored-By: Claude Sonnet 4.6 --- backend/auth.py | 5 +- backend/routers/auth_router.py | 5 +- frontend/static/js/auth.js | 2 +- frontend/static/pages/admin/accounts.html | 6 +- frontend/static/pages/login.html | 36 ++++- frontend/static/pages/observer/dashboard.html | 124 ++++++++++++++++++ frontend/static/pages/observer/reports.html | 103 +++++++++++++++ 7 files changed, 274 insertions(+), 7 deletions(-) create mode 100644 frontend/static/pages/observer/dashboard.html create mode 100644 frontend/static/pages/observer/reports.html diff --git a/backend/auth.py b/backend/auth.py index 3727457..34eab43 100644 --- a/backend/auth.py +++ b/backend/auth.py @@ -84,6 +84,7 @@ def require_role(*roles): return current_user return checker -require_admin = require_role("admin") -require_mechanic = require_role("mechanic", "admin") +require_admin = require_role("admin") +require_mechanic = require_role("mechanic", "admin") require_manufacturer = require_role("manufacturer", "admin") +require_viewer = require_role("admin", "observer") # 읽기 전용 역할 포함 diff --git a/backend/routers/auth_router.py b/backend/routers/auth_router.py index eb1c488..236a3a0 100644 --- a/backend/routers/auth_router.py +++ b/backend/routers/auth_router.py @@ -35,14 +35,17 @@ def register( name: str = Form(...), phone: str = Form(""), company: str = Form(""), + role: str = Form("mechanic"), # mechanic | observer db: Session = Depends(get_db) ): + if role not in ("mechanic", "observer"): + role = "mechanic" if db.query(models.User).filter_by(username=username).first(): raise HTTPException(400, "이미 사용 중인 아이디입니다.") user = models.User( username=username, password_hash=hash_password(password), - role="mechanic", + role=role, name=name, phone=phone or None, company=company or None, diff --git a/frontend/static/js/auth.js b/frontend/static/js/auth.js index 067ccde..fe72959 100644 --- a/frontend/static/js/auth.js +++ b/frontend/static/js/auth.js @@ -75,7 +75,7 @@ const Auth = (() => { pending_approval: '승인대기', pending: '접수', in_progress: '처리중', done: '완료', waiting: '부품대기', revisit: '재방문', closed: '상황종료', registered: '등록', reviewing: '검토중', developing: '개발중', - deployed: '배포완료', + deployed: '배포완료', observer: '옵저버', }; return `${map[status] || status}`; } diff --git a/frontend/static/pages/admin/accounts.html b/frontend/static/pages/admin/accounts.html index 5b5e812..ce71998 100644 --- a/frontend/static/pages/admin/accounts.html +++ b/frontend/static/pages/admin/accounts.html @@ -55,6 +55,7 @@