# πŸ” κΆŒν•œ 관리 μ‹œμŠ€ν…œ κ΅¬ν˜„ μž‘μ—… ## πŸ“… μž‘μ—… 정보 - **μ‹œμž‘μΌ**: 2025-01-10 - **μ΅œμ’… μˆ˜μ •**: 2025-01-10 - **μƒνƒœ**: βœ… μ™„λ£Œ --- ## 🎯 λͺ©ν‘œ 1. 직원관리 β†’ κ΄€λ¦¬μž 메뉴 ν•˜μœ„ "μ‚¬μš©μž 관리"둜 이동 및 λͺ…μΉ­ λ³€κ²½ 2. μ‚¬μš©μž λͺ©λ‘μ— κΆŒν•œ μ²΄ν¬λ°•μŠ€ ν‘œμ‹œ 3. κΆŒν•œκ΄€λ¦¬ νŒμ—…μœΌλ‘œ κΆŒν•œ CRUD 4. κΈ°μ‘΄ ν•˜λ“œμ½”λ”© admin 체크 β†’ role 기반으둜 μ „ν™˜ ## πŸ“Œ κΆŒν•œ ꡬ쑰 | κΆŒν•œμ½”λ“œ | κΆŒν•œλͺ… | μ„€λͺ… | |----------|--------|------| | ROLE_USER | μΌλ°˜μ‚¬μš©μž | κΈ°λ³Έ κΈ°λŠ₯ (주간보고 μž‘μ„±/쑰회) | | ROLE_MANAGER | λ§€λ‹ˆμ € | μ·¨ν•©λ³΄κ³ μ„œ λ“± 관리 κΈ°λŠ₯ | | ROLE_ADMIN | κ΄€λ¦¬μž | λͺ¨λ“  κΈ°λŠ₯ + μ‹œμŠ€ν…œ 관리 | --- ## πŸ“‹ Phase λͺ©λ‘ ### Phase 1: DB μŠ€ν‚€λ§ˆ 생성 - **μƒνƒœ**: βœ… μ™„λ£Œ - **파일**: `backend/sql/create_role_tables.sql` - **μž‘μ—… λ‚΄μš©**: - [x] wr_role ν…Œμ΄λΈ” 생성 - [x] wr_employee_role ν…Œμ΄λΈ” 생성 - [x] κΈ°λ³Έ κΆŒν•œ 데이터 INSERT (ROLE_ADMIN, ROLE_MANAGER, ROLE_USER) - [x] κΈ°μ‘΄ coziny@gmail.com에 ROLE_ADMIN λΆ€μ—¬ - **⚠️ DB μ‹€ν–‰ ν•„μš”**: `psql -f backend/sql/create_role_tables.sql` ### Phase 2: κΆŒν•œ CRUD API κ΅¬ν˜„ - **μƒνƒœ**: βœ… μ™„λ£Œ - **파일**: `backend/api/admin/role/` - **μž‘μ—… λ‚΄μš©**: - [x] GET /api/admin/role/list - κΆŒν•œ λͺ©λ‘ 쑰회 - [x] POST /api/admin/role/create - κΆŒν•œ 생성 - [x] PUT /api/admin/role/[id]/update - κΆŒν•œ μˆ˜μ • - [x] DELETE /api/admin/role/[id]/delete - κΆŒν•œ μ‚­μ œ - [x] session.ts에 requireAdmin, requireManager, getUserRoles, hasRole ν•¨μˆ˜ μΆ”κ°€ ### Phase 3: μ‚¬μš©μž-κΆŒν•œ λ§€ν•‘ API κ΅¬ν˜„ - **μƒνƒœ**: βœ… μ™„λ£Œ - **파일**: `backend/api/admin/user/` - **μž‘μ—… λ‚΄μš©**: - [x] GET /api/admin/user/list - μ‚¬μš©μž λͺ©λ‘ (κΆŒν•œ 포함) - [x] PUT /api/admin/user/[id]/roles - μ‚¬μš©μž κΆŒν•œ 일괄 λ³€κ²½ - [x] POST /api/admin/user/[id]/toggle-role - κ°œλ³„ κΆŒν•œ ν† κΈ€ - [x] GET /api/auth/current-user μˆ˜μ • - roles λ°°μ—΄ μΆ”κ°€ ### Phase 4: 메뉴 ꡬ쑰 λ³€κ²½ - **μƒνƒœ**: βœ… μ™„λ£Œ - **파일**: `frontend/components/layout/AppHeader.vue`, `frontend/composables/useAuth.ts` - **μž‘μ—… λ‚΄μš©**: - [x] 직원관리 메뉴 제거 - [x] κ΄€λ¦¬μž 메뉴 ν•˜μœ„μ— "μ‚¬μš©μž 관리" μΆ”κ°€ - [x] isAdmin λ‘œμ§μ„ role 기반으둜 λ³€κ²½ - [x] useAuth.ts에 hasRole(), isAdmin, isManager μΆ”κ°€ ### Phase 5: μ‚¬μš©μž 관리 νŽ˜μ΄μ§€ 생성 - **μƒνƒœ**: βœ… μ™„λ£Œ - **파일**: `frontend/admin/user/index.vue` - **μž‘μ—… λ‚΄μš©**: - [x] μ‚¬μš©μž λͺ©λ‘ ν…Œμ΄λΈ” - [x] κΆŒν•œ μ²΄ν¬λ°•μŠ€ μ»¬λŸΌλ“€ (동적 생성) - [x] μ²΄ν¬λ°•μŠ€ 클릭 μ‹œ κΆŒν•œ μ¦‰μ‹œ λ³€κ²½ (toggle-role API) - [x] 검색 κΈ°λŠ₯ ### Phase 6: κΆŒν•œκ΄€λ¦¬ νŒμ—… μ»΄ν¬λ„ŒνŠΈ - **μƒνƒœ**: βœ… μ™„λ£Œ - **파일**: `frontend/components/common/RoleManageModal.vue` - **μž‘μ—… λ‚΄μš©**: - [x] κΆŒν•œ λͺ©λ‘ ν‘œμ‹œ - [x] κΆŒν•œ μΆ”κ°€ κΈ°λŠ₯ (μ‹ κ·œ λ²„νŠΌ) - [x] κΆŒν•œ μˆ˜μ • κΈ°λŠ₯ (인라인 νŽΈμ§‘) - [x] κΆŒν•œ μ‚­μ œ κΈ°λŠ₯ (선택 μ‚­μ œ) - [x] μ‚¬μš©μž 수 ν‘œμ‹œ - [x] κΈ°λ³Έ κΆŒν•œ(ROLE_ADMIN, ROLE_MANAGER, ROLE_USER) 보호 ### Phase 7: κΈ°μ‘΄ μ½”λ“œ λ¦¬νŒ©ν† λ§ - **μƒνƒœ**: βœ… μ™„λ£Œ - **μž‘μ—… λ‚΄μš©**: - [x] useAuth.ts에 roles, hasRole() μΆ”κ°€ - [x] κΈ°μ‘΄ isAdmin ν•˜λ“œμ½”λ”© β†’ hasRole('ROLE_ADMIN')으둜 λ³€κ²½ - [x] aggregate.vue κΆŒν•œ 체크 μˆ˜μ • - [x] bulk-import.vue κΆŒν•œ 체크 μΆ”κ°€ - [x] [id].vue canEdit/canDelete μˆ˜μ • - [x] index.vue isAdmin μˆ˜μ • ### Phase 8: κΈ°μ‘΄ 파일 정리 - **μƒνƒœ**: βœ… μ™„λ£Œ - **μž‘μ—… λ‚΄μš©**: - [x] frontend/employee/index.vue μ‚­μ œ - [x] frontend/employee/[id].vue μ‚­μ œ - [x] frontend/employee 폴더 μ‚­μ œ --- ## πŸ“ μž‘μ—… 둜그 ### 2025-01-10 - [10:XX] μž‘μ—… κ³„νš 파일 생성 - [XX:XX] Phase 1~6 μ™„λ£Œ - [XX:XX] Phase 7 μ™„λ£Œ - bulk-import.vue에 isAdmin κΆŒν•œ 체크 μΆ”κ°€ - [XX:XX] Phase 8 μ™„λ£Œ - frontend/employee 폴더 μ‚­μ œ - [XX:XX] βœ… 전체 μž‘μ—… μ™„λ£Œ --- ## ⚠️ μ£Όμ˜μ‚¬ν•­ - κΈ°μ‘΄ coziny@gmail.com 계정은 ROLE_ADMIN μžλ™ λΆ€μ—¬ - λͺ¨λ“  APIλŠ” ROLE_ADMIN κΆŒν•œ 체크 ν•„μš” - DB λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ‹œ κΈ°μ‘΄ 데이터 영ν–₯ μ—†μŒ 확인 ## πŸ”— κ΄€λ ¨ 파일 - README.md - ν”„λ‘œμ νŠΈ λ¬Έμ„œ - backend/utils/session.ts - μ„Έμ…˜ 관리 - frontend/composables/useAuth.ts - 인증 μƒνƒœ 관리