From e0f0f0963a9d06c0bc6cd28859c63cbe48dc0bce Mon Sep 17 00:00:00 2001 From: cw2007 Date: Sat, 4 Jul 2026 22:32:16 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20cafe24=20=EA=B4=80=EB=A6=AC=EC=9E=90=20?= =?UTF-8?q?UI=20"Slate=20NOC=20Console"=20=EB=94=94=EC=9E=90=EC=9D=B8?= =?UTF-8?q?=EC=8B=9C=EC=8A=A4=ED=85=9C=20=ED=86=B5=ED=95=A9=20+=20?= =?UTF-8?q?=EC=A0=81=EB=8C=80=EB=A6=AC=EB=B7=B0=2018=EA=B1=B4=20=EB=B0=98?= =?UTF-8?q?=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 관리자 사이트 7페이지의 파편화된 인라인 스타일(색상 리터럴 160개, 페이지별 -
+ + diff --git a/php/dashboard.php b/php/dashboard.php index f6bc1b9..a355cb5 100644 --- a/php/dashboard.php +++ b/php/dashboard.php @@ -321,176 +321,48 @@ if ($alert_count > 0) { 온습도·누수 통합 모니터링 대시보드 <?= htmlspecialchars(APP_VERSION) ?> + - + -
+

온습도·누수 통합 모니터링 대시보드

설치 점검 @@ -499,7 +371,7 @@ if ($alert_count > 0) { 로그아웃
-
+
@@ -585,57 +457,61 @@ if ($alert_count > 0) {
경보 센서
-
+
개
오프라인
-
+
개
-
+
최근 온도
-
+
최근 습도
-
+
현재 시각
-
+
-

센서 현재 상태 30초 자동 새로고침

+

센서 현재 상태 30초 자동 새로고침

임계 경보 > 정상 @@ -658,12 +534,13 @@ if ($alert_count > 0) { $hum_chip_class = ''; if ($status_code === 'high_temp') { $temp_chip_class = 'hot'; } elseif ($status_code === 'low_temp') { $temp_chip_class = 'cold'; } - elseif ($status_code === 'high_humidity' || $status_code === 'low_humidity') { $hum_chip_class = 'humid'; } + elseif ($status_code === 'high_humidity') { $hum_chip_class = 'humid'; } + elseif ($status_code === 'low_humidity') { $hum_chip_class = 'dry'; } ?>

- /
-
+ /
+
@@ -679,9 +556,9 @@ if ($alert_count > 0) {
측정:
-
측정값 없음
+
측정값 없음
-
+
최종확인: (분 전) @@ -690,7 +567,7 @@ if ($alert_count > 0) {
-

아직 수신된 센서 데이터가 없습니다.

+

아직 수신된 센서 데이터가 없습니다.

@@ -720,17 +597,17 @@ if ($alert_count > 0) {
번 센서 (누수)
-
+
-
아직 수신된 누수 센서 데이터가 없습니다.
+
아직 수신된 누수 센서 데이터가 없습니다.

- /
-
+ /
+
-
+
최종확인: (분 전) @@ -781,13 +658,13 @@ if ($alert_count > 0) {
- - + - - 아직 누수 사고 이력이 없습니다. + 아직 누수 사고 이력이 없습니다. @@ -797,7 +674,7 @@ if ($alert_count > 0) {

온습도 추이 0): ?> - + · 최근 개 @@ -805,8 +682,8 @@ if ($alert_count > 0) {
= 2): ?>
- 온도(°C) - 습도(%) + 온도(°C) + 습도(%)
0) { $temp_segments = $build_segments('temp', $y_temp); $hum_segments = $build_segments('hum', $y_hum); + // 각 계열의 마지막 유효 지점(끝점 마커 + 최신값 라벨용) + $last_temp_i = null; $last_temp_v = null; + $last_hum_i = null; $last_hum_v = null; + foreach ($chart_points as $i => $p) { + if ($p['temp'] !== null) { $last_temp_i = $i; $last_temp_v = (float)$p['temp']; } + if ($p['hum'] !== null) { $last_hum_i = $i; $last_hum_v = (float)$p['hum']; } + } + $fmt = fn($v) => rtrim(rtrim(number_format($v, 1, '.', ''), '0'), '.'); ?> + aria-label="온습도 추이 라인 차트" class="chart-svg"> + class="plot-bg"> 0) { ?> + class="grid-line" stroke-dasharray="3,3"> + text-anchor="end" font-size="10" class="axis-temp"> + text-anchor="start" font-size="10" class="axis-hum"> @@ -902,21 +787,63 @@ if ($alert_count > 0) { $tlabel = substr($chart_points[$li]['t'], 5, 11); // MM-DD HH:MM ?> + text-anchor="" font-size="10" class="axis-x"> - + + $pad_t + $plot_h) { continue; } // 스케일 밖 + $thr_line_cls = $axis === 'temp' ? 'line-temp' : 'line-hum'; + $thr_label_cls = $axis === 'temp' ? 'axis-temp' : 'axis-hum'; + $thr_lx = $axis === 'temp' ? ($pad_l + 4) : ($pad_l + $plot_w - 4); + $thr_anchor = $axis === 'temp' ? 'start' : 'end'; + ?> + + + + + + + + + + + + + + +
@@ -924,7 +851,7 @@ if ($alert_count > 0) {
-
+

30일 운영 요약

@@ -957,7 +884,7 @@ if ($alert_count > 0) {
누수감지 SMS - 건 + 건
누수복구 SMS @@ -965,7 +892,7 @@ if ($alert_count > 0) {
SMS 실패 - 건 + 건
평균 온도 @@ -1013,7 +940,7 @@ if ($alert_count > 0) { - 아직 온습도 측정 데이터가 없습니다. + 아직 온습도 측정 데이터가 없습니다. @@ -1058,7 +985,7 @@ if ($alert_count > 0) { - 아직 센서 이벤트가 없습니다. + 아직 센서 이벤트가 없습니다. @@ -1088,36 +1015,115 @@ if ($alert_count > 0) { 실패 - + - 아직 SMS 발송 이력이 없습니다. + 아직 SMS 발송 이력이 없습니다.
-
+

diff --git a/php/login.php b/php/login.php index 5f5db59..945b162 100644 --- a/php/login.php +++ b/php/login.php @@ -162,62 +162,27 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !$is_locked && !$configuration_erro 로그인 - 누수감지 대시보드 <?= htmlspecialchars(APP_VERSION) ?> + - -
+ diff --git a/php/monthly_report.php b/php/monthly_report.php index df1df66..28862e2 100644 --- a/php/monthly_report.php +++ b/php/monthly_report.php @@ -251,52 +251,37 @@ if (($_GET['format'] ?? '') === 'csv') { 월간 운영 보고서 - <?= htmlspecialchars($month) ?> +

월간 운영 보고서

-
+
@@ -304,27 +289,28 @@ if (($_GET['format'] ?? '') === 'csv') {
- CSV 다운로드 + CSV 다운로드
-
- 보고서 생성 - -

범위:

+
+

보고서 생성

+ +

범위:

-
-
임계 경보(합계)건
-
고온/저온 경보/건
-
고습/저습 경보/건
-
정상복귀건
-
장비 오프라인/복구/건
-
SMS 실패건
-
측정 건수건
-
평균 온도/습도 /
-
온도 최저/최고 /
-
습도 최저/최고 /
+

월간 요약

+
+
임계 경보(합계)건
+
고온/저온 경보/건
+
고습/저습 경보/건
+
정상복귀건
+
장비 오프라인/복구/건
+
SMS 실패건
+
측정 건수건
+
평균 온도/습도 /
+
온도 최저/최고 /
+
습도 최저/최고 /

센서별 요약

@@ -356,7 +342,7 @@ if (($_GET['format'] ?? '') === 'csv') { - 해당 월 측정·경보 내역이 없습니다. + 해당 월 측정·경보 내역이 없습니다. diff --git a/php/security_evidence.php b/php/security_evidence.php index e3801ab..983f69b 100644 --- a/php/security_evidence.php +++ b/php/security_evidence.php @@ -68,56 +68,43 @@ if (($_GET['format'] ?? '') === 'md') { 보안 증적 보고서 - 온습도 모니터링 <?= htmlspecialchars(APP_VERSION) ?> +

보안 증적 보고서

-
-
- -

생성시각: · 버전:

-

이 보고서는 보안대책서 첨부용 운영 점검 결과와 보안통제 매트릭스를 제공합니다. 비밀번호, API 키, SMS 인증키 원문은 표시하지 않습니다.

-
+
+ +

생성시각: · 버전:

+

이 보고서는 보안대책서 첨부용 운영 점검 결과와 보안통제 매트릭스를 제공합니다. 비밀번호, API 키, SMS 인증키 원문은 표시하지 않습니다.

+

운영 점검 결과

+
@@ -127,7 +114,7 @@ if (($_GET['format'] ?? '') === 'md') { - + @@ -135,8 +122,10 @@ if (($_GET['format'] ?? '') === 'md') {
분류항목결과상세조치증적
+

보안통제 매트릭스

+
@@ -151,6 +140,7 @@ if (($_GET['format'] ?? '') === 'md') {
영역보안대책구현 위치확인 증적
+
diff --git a/php/setup_mfa.php b/php/setup_mfa.php index bf7773a..cf3a950 100644 --- a/php/setup_mfa.php +++ b/php/setup_mfa.php @@ -70,36 +70,25 @@ $token = $_GET['token'] ?? $_POST['token'] ?? ''; 관리자 MFA 등록 + -
+

Google Authenticator MFA 등록

-

이 화면은 Google Authenticator, Microsoft Authenticator, Authy 등 TOTP 인증 앱에 관리자 계정을 등록하기 위한 도구입니다. 외부 Google API로 비밀키를 보내지 않습니다.

+

이 화면은 Google Authenticator, Microsoft Authenticator, Authy 등 TOTP 인증 앱에 관리자 계정을 등록하기 위한 도구입니다. 외부 Google API로 비밀키를 보내지 않습니다.

-
+ -
인증 앱 코드가 확인되었습니다. 아래 설정 줄을 `config.local.php`에 반영하세요.
+

1. 인증 앱에 수동 등록

@@ -111,7 +100,7 @@ $token = $_GET['token'] ?? $_POST['token'] ?? '';

2. 앱 링크 등록

-

모바일 브라우저에서 열면 인증 앱이 이 URI를 인식할 수 있습니다. 데스크톱에서는 수동 등록을 사용하세요.

+

모바일 브라우저에서 열면 인증 앱이 이 URI를 인식할 수 있습니다. 데스크톱에서는 수동 등록을 사용하세요.

인증 앱으로 열기

@@ -130,7 +119,7 @@ $token = $_GET['token'] ?? $_POST['token'] ?? '';

4. config.local.php 반영

-

반영 후 `MFA_SETUP_TOKEN`은 빈 값으로 바꾸거나 삭제하세요.

+

반영 후 `MFA_SETUP_TOKEN`은 빈 값으로 바꾸거나 삭제하세요.

diff --git a/php/setup_wizard.php b/php/setup_wizard.php index 4cd3933..48ced8b 100644 --- a/php/setup_wizard.php +++ b/php/setup_wizard.php @@ -52,66 +52,64 @@ $failed_count = ops_failed_count($checks); 설치 점검 - 온습도 모니터링 <?= htmlspecialchars(APP_VERSION) ?> +

설치/운영 점검

-
-
- -
운영 반영 전 이 화면에서 설정, DB, 권한, SMS를 확인합니다.
+
+ +

운영 반영 전 이 화면에서 설정, DB, 권한, SMS를 확인합니다.

-
-

· ·

-

+
+

· ·

+

-
조치:
+

조치:

-
증적:
+

증적:

-
+
-
- 테스트 SMS 결과 +
+

테스트 SMS 결과

-

· ·

+

· ·

diff --git a/tools/make_deploy_bundles.py b/tools/make_deploy_bundles.py index 9877395..f9c8f57 100644 --- a/tools/make_deploy_bundles.py +++ b/tools/make_deploy_bundles.py @@ -33,7 +33,7 @@ SECRETS_DIR = DEPLOY / ".secrets" # deploy/.secrets/web_dir.txt 에서 로드한다(없으면 랜덤 생성). 아래 DOMAIN 만 수정. DOMAIN = "https://pores.kr" -TEXT_EXTS = {".sh", ".py", ".php", ".service", ".sql", ".md", ".txt", ".example", ".html"} +TEXT_EXTS = {".sh", ".py", ".php", ".service", ".sql", ".md", ".txt", ".example", ".html", ".css"} EXCLUDE_NAMES = {"__pycache__", ".gitignore", "config_local.py"} BUNDLES = [