feat: 사용자 관리 및 권한 시스템 구현

- 관리자 전용 사용자 관리 페이지 추가
- 사용자 추가/삭제 기능 (한글 ID 지원)
- 비밀번호 변경 기능
- 권한별 메뉴 접근 제한
  - 관리자: 모든 메뉴 접근 가능
  - 일반 사용자: 일일공수, 부적합등록/조회만 가능
- 이미지 없이 부적합 등록 가능
- 목록 관리에서 이미지 수정 기능
- 작업 시간 확인 버튼 개선
- 부적합 조회 페이지 간소화 (시간순 나열)
This commit is contained in:
hyungi
2025-09-17 13:02:38 +09:00
parent 1339e5dded
commit f6bdb68d19
9 changed files with 497 additions and 25 deletions

View File

@@ -153,7 +153,7 @@
<!-- 네비게이션 -->
<nav class="bg-white border-b">
<div class="container mx-auto px-4">
<div class="flex gap-2 py-2 overflow-x-auto">
<div id="navContainer" class="flex gap-2 py-2 overflow-x-auto">
<a href="daily-work.html" class="nav-link">
<i class="fas fa-calendar-check mr-2"></i>일일 공수
</a>
@@ -163,12 +163,15 @@
<a href="issue-view.html" class="nav-link">
<i class="fas fa-search mr-2"></i>부적합 조회
</a>
<button class="nav-link" onclick="showSection('list')">
<button class="nav-link" onclick="showSection('list')" style="display:none;" id="listBtn">
<i class="fas fa-list mr-2"></i>목록 관리
</button>
<button class="nav-link" onclick="showSection('summary')">
<button class="nav-link" onclick="showSection('summary')" style="display:none;" id="summaryBtn">
<i class="fas fa-chart-bar mr-2"></i>보고서
</button>
<a href="admin.html" class="nav-link" style="display:none;" id="adminBtn">
<i class="fas fa-users-cog mr-2"></i>관리
</a>
</div>
</div>
</nav>
@@ -276,11 +279,8 @@
document.getElementById('loginScreen').classList.add('hidden');
document.getElementById('mainScreen').classList.remove('hidden');
// 일반 사용자는 보고서 메뉴 숨김
if (user.role === 'user') {
const reportBtn = document.querySelector('button[onclick="showSection(\'summary\')"]');
if (reportBtn) reportBtn.style.display = 'none';
}
// 권한에 따른 메뉴 표시/숨김
updateNavigation();
loadIssues();
}
@@ -299,11 +299,8 @@
document.getElementById('loginScreen').classList.add('hidden');
document.getElementById('mainScreen').classList.remove('hidden');
// 일반 사용자는 보고서 메뉴 숨김
if (currentUser.role === 'user') {
const reportBtn = document.querySelector('button[onclick="showSection(\'summary\')"]');
if (reportBtn) reportBtn.style.display = 'none';
}
// 권한에 따른 메뉴 표시/숨김
updateNavigation();
loadIssues();
} catch (error) {
@@ -316,6 +313,27 @@
AuthAPI.logout();
}
// 네비게이션 권한 업데이트
function updateNavigation() {
const listBtn = document.getElementById('listBtn');
const summaryBtn = document.getElementById('summaryBtn');
const adminBtn = document.getElementById('adminBtn');
if (currentUser.role === 'admin') {
// 관리자는 모든 메뉴 표시
listBtn.style.display = '';
summaryBtn.style.display = '';
adminBtn.style.display = '';
adminBtn.innerHTML = '<i class="fas fa-users-cog mr-2"></i>사용자 관리';
} else {
// 일반 사용자는 제한된 메뉴만 표시
listBtn.style.display = 'none';
summaryBtn.style.display = 'none';
adminBtn.style.display = '';
adminBtn.innerHTML = '<i class="fas fa-key mr-2"></i>비밀번호 변경';
}
}
// 섹션 전환
function showSection(section) {
// 모든 섹션 숨기기