zioinfo-mail/manual/15_UI_Nifty_가이드.md
DESKTOP-TKLFCPR\ython 82a4c72080 feat(itsm): PMS/준수성/JMeter/공공기관 기능 + Nifty UI + 로고 Copyright
[PMS 완성]
- core/si_report.py: 일/주/월 보고서 (Excel/HTML/PDF/DOCX/PPTX)
- routers/si_report.py: daily|weekly|monthly + 메신저 발송
- routers/deliverables.py: 산출물 CRUD + 제출/검토
- si_issues.py: 이슈→SR 자동 연결
- scheduler.py: 일일 18:00 + 주간 금 17:00 자동 보고서
- models.py: Deliverable 모델

[준수성 자동 점검]
- core/compliance_check.py: SC-8개/WA-7개/PI-6개 규칙
- routers/compliance.py: 스캔 + HTML/Excel 보고서

[JMeter 성능 테스트]
- routers/jmeter.py: JTL 업로드 + 내장 부하 테스트 + 보고서

[공공기관 필수 기능]
- routers/public_checklist.py: 행안부 기준 19개 항목

[UI/브랜드]
- 로고(ziologo.png) + Copyright 2026 All Rights Reserved
- Nifty 계층형 사이드바 (PMS 서브메뉴)
- X-Powered-By + X-Copyright 응답 헤더
- manual/15_UI_Nifty_가이드.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 22:50:29 +09:00

8.8 KiB

GUARDiA ITSM — Nifty 스타일 UI 가이드

참조: https://preview.themeon.net/nifty/
적용 버전: GUARDiA ITSM 2.0


1. 레이아웃 구조

┌─────────────────────────────────────────────────────┐
│  #topbar   [로고] [검색] [알림] [사용자]  [다크/라이트] │
├──────────┬──────────────────────────────────────────┤
│          │  #content-header (빵크럼 + 페이지 제목)   │
│ #sidebar │──────────────────────────────────────────│
│  (250px) │                                          │
│  계층형   │         #main-content                   │
│  메뉴    │         (페이지별 뷰 컨텐츠)              │
│          │                                          │
└──────────┴──────────────────────────────────────────┘
│  #footer  Copyright © 2026 GUARDiA All Rights Reserved │
└─────────────────────────────────────────────────────┘

2. 사이드바 메뉴 계층 구조

GUARDiA ITSM
├── 📊 대시보드
│   ├── 운영 현황 (SR/SLA/인시던트)
│   ├── 인프라 현황 (서버/CMDB)
│   ├── 보안 현황
│   └── AI 인사이트
│
├── 🗂️ SR 관리 (서비스 요청)
│   ├── SR 목록
│   ├── 칸반 보드
│   ├── 대량 처리
│   └── SLA 위반 현황
│
├── 🏗️ PMS (프로젝트 관리)     ← 신규 서브메뉴
│   ├── 프로젝트 목록
│   ├── WBS 관리
│   ├── 산출물 관리
│   ├── 이슈 관리
│   ├── 위험 관리
│   ├── 변경 요청
│   ├── 마일스톤
│   └── 보고서
│       ├── 일일 보고
│       ├── 주간 보고
│       └── 월간 보고
│
├── 🖥️ 인프라
│   ├── CMDB
│   ├── 서버 관리
│   └── 기관/사이트
│
├── 🔐 보안
│   ├── 취약점 스캔
│   ├── PAM (특권 접근)
│   ├── 감사 로그
│   └── 시큐어코딩 점검   ← 신규
│
├── 🤖 AI 운영
│   ├── 에이전트 현황
│   ├── 이상 탐지
│   ├── 예측 유지보수
│   └── 학습 루프
│
├── 📡 모니터링
│   ├── Scouter APM
│   ├── SSL 만료
│   └── 성능 테스트 (JMeter) ← 신규
│
├── ⚙️ 운영
│   ├── 배포 파이프라인
│   ├── 배치 작업
│   ├── On-Call 로테이션
│   └── 작업 타임테이블
│
├── 📚 지식관리
│   ├── KB 문서
│   └── 챗봇
│
└── 🔧 시스템 설정
    ├── 사용자 관리
    ├── LDAP/SSO
    ├── 라이선스
    └── 공공기관 체크리스트 ← 신규

3. Nifty 스타일 핵심 CSS 변수

/* 다크 테마 (기본) */
:root[data-theme="dark"] {
  --sidebar-bg:        #1a1f2e;
  --sidebar-hover:     rgba(255,255,255,.06);
  --sidebar-active:    #4f8ef7;
  --accent:            #818cf8;
  --accent-hover:      #6366f1;
  --surface:           #1e2333;
  --surface-2:         #252b3b;
  --border:            rgba(255,255,255,.08);
  --text-bright:       #f1f5f9;
  --text-muted:        #64748b;
  --topbar-bg:         #141824;
}

/* 라이트 테마 */
:root[data-theme="light"] {
  --sidebar-bg:        #1e2333;   /* 사이드바는 다크 유지 */
  --surface:           #f8fafc;
  --surface-2:         #ffffff;
  --border:            #e2e8f0;
  --text-bright:       #1e293b;
  --text-muted:        #64748b;
  --topbar-bg:         #ffffff;
}

4. 서브메뉴 (아코디언) 구현

<!-- 사이드바 계층 메뉴 패턴 -->
<div class="nav-group">
  <div class="nav-group-header" onclick="toggleNav(this)">
    <span class="nav-icon">🏗️</span>
    <span>PMS 프로젝트 관리</span>
    <span class="nav-arrow"></span>
  </div>
  <div class="nav-group-body">
    <a class="nav-sub-item" href="/si">프로젝트 목록</a>
    <a class="nav-sub-item" href="/si?tab=wbs">WBS 관리</a>
    <a class="nav-sub-item" href="/si?tab=deliverables">산출물 관리</a>
    <a class="nav-sub-item" href="/si?tab=issues">이슈 관리</a>
    <a class="nav-sub-item" href="/si?tab=report">보고서</a>
  </div>
</div>
.nav-group-header {
  display: flex; align-items: center; gap: 8px;
  padding: 10px 16px; cursor: pointer;
  color: var(--text-muted); font-size: 12px; font-weight: 600;
  text-transform: uppercase; letter-spacing: .5px;
}
.nav-group-header:hover { color: var(--text-bright); }
.nav-group-body { display: none; padding: 0 0 4px 36px; }
.nav-group-body.open { display: block; }
.nav-sub-item {
  display: block; padding: 7px 12px; font-size: 13px;
  color: var(--text-muted); text-decoration: none; border-radius: 6px;
}
.nav-sub-item:hover, .nav-sub-item.active {
  background: var(--sidebar-hover); color: var(--text-bright);
}
.nav-arrow { margin-left: auto; transition: transform .2s; }
.nav-group-header.open .nav-arrow { transform: rotate(180deg); }

5. 상단 탑바 구성

<header id="topbar">
  <!-- 햄버거 버튼 (모바일) -->
  <button id="sidebar-toggle" onclick="toggleSidebar()"></button>

  <!-- 글로벌 검색 -->
  <div id="topbar-search">
    <input type="search" placeholder="SR·서버·KB 통합 검색..." id="global-search">
  </div>

  <!-- 우측 액션 -->
  <div id="topbar-actions">
    <!-- 실시간 알림 -->
    <div class="topbar-icon" id="notif-bell">
      🔔 <span class="badge" id="notif-count">0</span>
    </div>
    <!-- 라이선스 상태 -->
    <div class="topbar-icon" id="license-badge"></div>
    <!-- 테마 토글 -->
    <button class="topbar-icon" onclick="toggleTheme()">🌙</button>
    <!-- 사용자 드롭다운 -->
    <div class="topbar-user" id="topbar-user"></div>
  </div>
</header>

6. 페이지 탭 (서브페이지 내부 탭)

<!-- PMS 페이지 내부 탭 예시 -->
<div class="page-tabs">
  <button class="page-tab active" data-tab="overview">개요</button>
  <button class="page-tab" data-tab="wbs">WBS</button>
  <button class="page-tab" data-tab="issues">이슈</button>
  <button class="page-tab" data-tab="deliverables">산출물</button>
  <button class="page-tab" data-tab="risks">위험</button>
  <button class="page-tab" data-tab="report">보고서</button>
</div>
<div class="page-tab-content">
  <div id="tab-overview" class="tab-panel active">...</div>
  <div id="tab-wbs" class="tab-panel">...</div>
  ...
</div>
.page-tabs {
  display: flex; gap: 2px; border-bottom: 2px solid var(--border);
  margin-bottom: 20px; overflow-x: auto;
}
.page-tab {
  padding: 10px 20px; background: none; border: none;
  color: var(--text-muted); font-size: 13px; font-weight: 600;
  cursor: pointer; border-bottom: 3px solid transparent;
  margin-bottom: -2px; white-space: nowrap;
}
.page-tab.active { color: var(--accent); border-bottom-color: var(--accent); }
.tab-panel { display: none; }
.tab-panel.active { display: block; }

7. 카드 컴포넌트

<!-- Nifty 스타일 카드 -->
<div class="nf-card">
  <div class="nf-card-header">
    <h3 class="nf-card-title">📊 프로젝트 현황</h3>
    <div class="nf-card-actions">
      <button class="btn-sm">새로고침</button>
    </div>
  </div>
  <div class="nf-card-body">
    <!-- 내용 -->
  </div>
</div>

8. 반응형 브레이크포인트

해상도 사이드바 레이아웃
≥1280px 250px 고정 2열 그리드 가능
768~1280px 60px (아이콘만) 1열
< 768px 오버레이 (토글) 모바일 전용

9. 적용 우선순위

  1. 즉시 적용: 탑바 + 사이드바 아코디언 메뉴 (index.html + style.css)
  2. 1주일 내: PMS 서브탭 페이지 (si.html 확장)
  3. 2주 내: 보안/모니터링 전용 페이지 UI 통일

  • 사이드바 하단: Copyright © 2026 GUARDiA All Rights Reserved.
  • 로그인 페이지: 로고 이미지 + Copyright
  • 출력 보고서: 모든 Excel/PDF/PPTX 하단
  • API 응답 헤더: X-Powered-By: GUARDiA ITSM 2.0
# FastAPI 미들웨어로 응답 헤더 추가
@app.middleware("http")
async def add_copyright_header(request, call_next):
    response = await call_next(request)
    response.headers["X-Powered-By"] = "GUARDiA ITSM 2.0 | Copyright 2026"
    return response