Skip to content

Commit 156c032

Browse files
Display active profile badges in login and sidebar (#32)
1 parent 981921a commit 156c032

5 files changed

Lines changed: 91 additions & 3 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package apu.saerok_admin.web;
2+
3+
import apu.saerok_admin.web.view.EnvironmentProfileBadge;
4+
import java.util.Arrays;
5+
import java.util.List;
6+
import org.springframework.core.env.Environment;
7+
import org.springframework.web.bind.annotation.ControllerAdvice;
8+
import org.springframework.web.bind.annotation.ModelAttribute;
9+
10+
@ControllerAdvice
11+
public class EnvironmentProfileAdvice {
12+
13+
private final Environment environment;
14+
15+
public EnvironmentProfileAdvice(Environment environment) {
16+
this.environment = environment;
17+
}
18+
19+
@ModelAttribute("environmentProfileBadge")
20+
public EnvironmentProfileBadge environmentProfileBadge() {
21+
List<String> activeProfiles = Arrays.asList(environment.getActiveProfiles());
22+
if (activeProfiles.isEmpty()) {
23+
activeProfiles = Arrays.asList(environment.getDefaultProfiles());
24+
}
25+
if (activeProfiles.contains("local")) {
26+
return new EnvironmentProfileBadge("로컬", "environment-badge--local");
27+
}
28+
if (activeProfiles.contains("dev") || activeProfiles.contains("qa")) {
29+
return new EnvironmentProfileBadge("개발/QA", "environment-badge--dev");
30+
}
31+
if (activeProfiles.contains("prod")) {
32+
return new EnvironmentProfileBadge("운영", "environment-badge--prod");
33+
}
34+
return new EnvironmentProfileBadge("운영", "environment-badge--prod");
35+
}
36+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package apu.saerok_admin.web.view;
2+
3+
public record EnvironmentProfileBadge(String label, String cssClass) {
4+
}

src/main/resources/static/css/admin-theme.css

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,36 @@ a:focus {
176176
color: var(--accent-primary-strong) !important;
177177
}
178178

179+
.environment-badge {
180+
display: inline-flex;
181+
align-items: center;
182+
padding: 0.2rem 0.6rem;
183+
border-radius: 999px;
184+
font-size: 0.75rem;
185+
font-weight: 600;
186+
letter-spacing: -0.01em;
187+
line-height: 1.2;
188+
white-space: nowrap;
189+
}
190+
191+
.environment-badge--local {
192+
background: rgba(59, 130, 246, 0.18);
193+
color: #1d4ed8;
194+
box-shadow: inset 0 0 0 1px rgba(37, 99, 235, 0.25);
195+
}
196+
197+
.environment-badge--dev {
198+
background: rgba(168, 85, 247, 0.18);
199+
color: #7c3aed;
200+
box-shadow: inset 0 0 0 1px rgba(124, 58, 237, 0.25);
201+
}
202+
203+
.environment-badge--prod {
204+
background: rgba(34, 197, 94, 0.18);
205+
color: #15803d;
206+
box-shadow: inset 0 0 0 1px rgba(22, 163, 74, 0.25);
207+
}
208+
179209
.table-modern thead th {
180210
background: var(--surface-muted);
181211
font-size: 0.875rem;

src/main/resources/templates/auth/login.html

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@
1010
src="/images/saerok-admin-icon.png"
1111
alt="새록 어드민 로고"
1212
decoding="async">
13-
<h1 class="h4 fw-bold mt-3">새록 어드민</h1>
13+
<div class="d-flex align-items-center justify-content-center gap-2 mt-3 flex-wrap">
14+
<h1 class="h4 fw-bold mb-0">새록 어드민</h1>
15+
<span class="environment-badge"
16+
th:if="${environmentProfileBadge}"
17+
th:classappend="' ' + ${environmentProfileBadge.cssClass()}"
18+
th:text="${environmentProfileBadge.label()}">운영</span>
19+
</div>
1420
<p class="text-muted small mb-0">운영자 전용 로그인 페이지입니다.</p>
1521
</div>
1622

src/main/resources/templates/fragments/_sidebar.html

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,13 @@
55
<div class="app-sidebar d-none d-lg-flex flex-column position-fixed">
66
<div class="app-sidebar__brand">
77
<img th:src="@{/images/saerok-admin-icon.png}" src="/images/saerok-admin-icon.png" alt="새록 어드민 로고" width="48" height="48" class="me-2">
8-
<span class="app-sidebar__title">새록 어드민</span>
8+
<div class="d-flex align-items-center gap-2 flex-wrap">
9+
<span class="app-sidebar__title mb-0">새록 어드민</span>
10+
<span class="environment-badge"
11+
th:if="${environmentProfileBadge}"
12+
th:classappend="' ' + ${environmentProfileBadge.cssClass()}"
13+
th:text="${environmentProfileBadge.label()}">운영</span>
14+
</div>
915
</div>
1016
<nav class="app-sidebar__nav">
1117
<a th:href="@{/}" class="app-sidebar__link" th:classappend="${activeMenu}=='dashboard' ? ' is-active'">
@@ -34,7 +40,13 @@
3440
</div>
3541
<div class="offcanvas offcanvas-start" tabindex="-1" id="sidebarOffcanvas">
3642
<div class="offcanvas-header">
37-
<h5 class="offcanvas-title">새록 어드민</h5>
43+
<div class="d-flex align-items-center gap-2">
44+
<h5 class="offcanvas-title mb-0">새록 어드민</h5>
45+
<span class="environment-badge"
46+
th:if="${environmentProfileBadge}"
47+
th:classappend="' ' + ${environmentProfileBadge.cssClass()}"
48+
th:text="${environmentProfileBadge.label()}">운영</span>
49+
</div>
3850
<button type="button" class="btn-close" data-bs-dismiss="offcanvas"></button>
3951
</div>
4052
<div class="offcanvas-body">

0 commit comments

Comments
 (0)