refactor: 네비게이션 헤더 최신 디자인으로 전면 개편 및 로그인 버그 수정

- fix: 로그인 API에서 user.role_name 필드 올바르게 사용 (auth.service.js)
- refactor: navbar 컴포넌트를 최신 dashboard-header 스타일로 전환
- refactor: 구버전 work-report-header 제거 (6개 페이지)
- refactor: load-navbar.js를 최신 헤더 구조에 맞게 업데이트
- style: 파란색 그라데이션 헤더, 실시간 시계, 향상된 프로필 메뉴
- docs: 2026-01-20 개발 로그 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-01-20 08:40:19 +09:00
parent 6933f67a2e
commit 4ac0605887
24 changed files with 1614 additions and 524 deletions

View File

@@ -23,13 +23,13 @@ exports.up = async function(knex) {
// 2. 사용자별 페이지 접근 권한 테이블 생성
await knex.schema.createTable('user_page_access', function(table) {
table.integer('user_id').unsigned().notNullable()
table.integer('user_id').notNullable()
.references('user_id').inTable('users').onDelete('CASCADE');
table.integer('page_id').unsigned().notNullable()
.references('id').inTable('pages').onDelete('CASCADE');
table.boolean('can_access').defaultTo(true); // 접근 가능 여부
table.timestamp('granted_at').defaultTo(knex.fn.now());
table.integer('granted_by').unsigned() // 권한을 부여한 Admin의 user_id
table.integer('granted_by') // 권한을 부여한 Admin의 user_id
.references('user_id').inTable('users').onDelete('SET NULL');
table.primary(['user_id', 'page_id']);
});

View File

@@ -7,7 +7,7 @@
* 2. 각 작업자에 대해 users 테이블에 계정 생성
* 3. username은 이름 기반으로 자동 생성 (예: 홍길동 → hong.gildong)
* 4. 초기 비밀번호는 '1234'로 통일 (첫 로그인 시 변경 권장)
* 5. 현재 연도 연차 잔액 초기화
* 5. 현재 연도 연차 잔액 초기화 (workers.annual_leave 사용)
*/
const bcrypt = require('bcrypt');
@@ -25,7 +25,7 @@ exports.up = async function(knex) {
'workers.worker_name',
'workers.email',
'workers.status',
'workers.base_annual_leave'
'workers.annual_leave'
);
console.log(`📊 계정이 없는 작업자: ${workersWithoutAccount.length}`);
@@ -41,7 +41,7 @@ exports.up = async function(knex) {
// User 역할 ID 조회
const userRole = await knex('roles')
.where('role_name', 'User')
.where('name', 'User')
.first();
if (!userRole) {
@@ -77,7 +77,7 @@ exports.up = async function(knex) {
await knex('worker_vacation_balance').insert({
worker_id: worker.worker_id,
year: currentYear,
total_annual_leave: worker.base_annual_leave || 15,
total_annual_leave: worker.annual_leave || 15,
used_annual_leave: 0,
created_at: knex.fn.now(),
updated_at: knex.fn.now()

View File

@@ -12,8 +12,8 @@ exports.up = async function(knex) {
// 1. Guest 역할 추가
const [guestRoleId] = await knex('roles').insert({
role_name: 'Guest',
role_description: '게스트 (계정 없이 특정 기능 접근 가능)',
name: 'Guest',
description: '게스트 (계정 없이 특정 기능 접근 가능)',
created_at: knex.fn.now(),
updated_at: knex.fn.now()
});
@@ -44,7 +44,7 @@ exports.down = async function(knex) {
// 역할 제거
await knex('roles')
.where('role_name', 'Guest')
.where('name', 'Guest')
.delete();
console.log('✅ 게스트 역할 제거 완료');