모든 작업자가 개인 계정으로 로그인하여 본인의 연차와 출근 기록을 확인할 수 있는 시스템을 구축했습니다. 주요 기능: - 작업자-계정 1:1 통합 (기존 작업자 자동 계정 생성) - 연차 관리 시스템 (연도별 잔액 관리) - 출근 기록 시스템 (일일 근태 기록) - 나의 대시보드 페이지 (개인 정보 조회) 데이터베이스: - workers 테이블에 salary, base_annual_leave 컬럼 추가 - work_attendance_types, vacation_types 테이블 생성 - daily_attendance_records 테이블 생성 - worker_vacation_balance 테이블 생성 - 기존 작업자 자동 계정 생성 (username: 이름 기반) - Guest 역할 추가 백엔드 API: - 한글→영문 변환 유틸리티 (hangulToRoman.js) - UserRoutes에 개인 정보 조회 API 추가 - GET /api/users/me (내 정보) - GET /api/users/me/attendance-records (출근 기록) - GET /api/users/me/vacation-balance (연차 잔액) - GET /api/users/me/work-reports (작업 보고서) - GET /api/users/me/monthly-stats (월별 통계) 프론트엔드: - 나의 대시보드 페이지 (my-dashboard.html) - 연차 정보 위젯 (총/사용/잔여) - 월별 출근 캘린더 - 근무 시간 통계 - 최근 작업 보고서 목록 - 네비게이션 바에 "나의 대시보드" 메뉴 추가 배포 시 주의사항: - 마이그레이션 실행 필요 - 자동 생성된 계정 초기 비밀번호: 1234 - 작업자들에게 첫 로그인 후 비밀번호 변경 안내 필요 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
57 lines
2.4 KiB
JavaScript
57 lines
2.4 KiB
JavaScript
/**
|
|
* @param { import("knex").Knex } knex
|
|
* @returns { Promise<void> }
|
|
*/
|
|
exports.up = function(knex) {
|
|
return knex.schema
|
|
// 1. roles 테이블 생성
|
|
.createTable('roles', function(table) {
|
|
table.increments('id').primary();
|
|
table.string('name', 50).notNullable().unique();
|
|
table.string('description', 255);
|
|
table.timestamps(true, true);
|
|
})
|
|
// 2. permissions 테이블 생성
|
|
.createTable('permissions', function(table) {
|
|
table.increments('id').primary();
|
|
table.string('name', 100).notNullable().unique(); // 예: 'user:create'
|
|
table.string('description', 255);
|
|
table.timestamps(true, true);
|
|
})
|
|
// 3. role_permissions (역할-권한) 조인 테이블 생성
|
|
.createTable('role_permissions', function(table) {
|
|
table.integer('role_id').unsigned().notNullable().references('id').inTable('roles').onDelete('CASCADE');
|
|
table.integer('permission_id').unsigned().notNullable().references('id').inTable('permissions').onDelete('CASCADE');
|
|
table.primary(['role_id', 'permission_id']);
|
|
})
|
|
// 4. users 테이블에 role_id 추가 및 기존 컬럼 삭제
|
|
.table('users', function(table) {
|
|
table.integer('role_id').unsigned().references('id').inTable('roles').onDelete('SET NULL').after('email');
|
|
// 기존 컬럼들은 삭제 또는 비활성화 (데이터 보존을 위해 일단 이름 변경)
|
|
table.renameColumn('role', '_role_old');
|
|
table.renameColumn('access_level', '_access_level_old');
|
|
})
|
|
// 5. user_permissions (사용자-개별 권한) 조인 테이블 생성
|
|
.createTable('user_permissions', function(table) {
|
|
table.integer('user_id').notNullable().references('user_id').inTable('users').onDelete('CASCADE');
|
|
table.integer('permission_id').unsigned().notNullable().references('id').inTable('permissions').onDelete('CASCADE');
|
|
table.primary(['user_id', 'permission_id']);
|
|
});
|
|
};
|
|
|
|
/**
|
|
* @param { import("knex").Knex } knex
|
|
* @returns { Promise<void> }
|
|
*/
|
|
exports.down = function(knex) {
|
|
return knex.schema
|
|
.dropTableIfExists('user_permissions')
|
|
.dropTableIfExists('role_permissions')
|
|
.dropTableIfExists('permissions')
|
|
.dropTableIfExists('roles')
|
|
.table('users', function(table) {
|
|
table.dropColumn('role_id');
|
|
table.renameColumn('_role_old', 'role');
|
|
table.renameColumn('_access_level_old', 'access_level');
|
|
});
|
|
}; |