feat: 사용자 관리에 부서 정보 추가 및 편집 기능 구현

🏢 Department Management System:
- 5개 부서 지원: 생산, 품질, 구매, 설계, 영업
- 사용자 생성/수정 시 부서 선택 가능
- 부서별 사용자 분류 및 표시

📊 Database Schema Updates:
- department_type ENUM 추가 (production, quality, purchasing, design, sales)
- users 테이블에 department 컬럼 추가
- idx_users_department 인덱스 생성 (성능 최적화)
- 014_add_user_department.sql 마이그레이션 실행

🔧 Backend Enhancements:
- DepartmentType ENUM 클래스 추가 (models.py, schemas.py)
- User 모델에 department 필드 추가
- UserBase, UserUpdate 스키마에 department 필드 포함
- 기존 API 엔드포인트 자동 호환

🎨 Frontend UI Improvements:
- 사용자 추가 폼에 부서 선택 드롭다운 추가
- 사용자 목록에 부서 정보 배지 표시 (녹색 배경)
- 사용자 편집 모달 새로 구현
- 부서명 한글 변환 함수 (AuthAPI.getDepartmentLabel)

 User Management Features:
- 편집 버튼으로 사용자 정보 수정 가능
- 부서, 이름, 권한 실시간 변경
- 사용자 ID는 수정 불가 (읽기 전용)
- 모달 기반 직관적 UI

🔍 Visual Enhancements:
- 부서 정보 아이콘 (fas fa-building)
- 색상 코딩: 부서(녹색), 권한(빨강/파랑)
- 반응형 레이아웃 (flex-1, gap-3)
- 호버 효과 및 트랜지션

🚀 API Integration:
- AuthAPI.getDepartments() - 부서 목록 반환
- AuthAPI.getDepartmentLabel() - 부서명 변환
- AuthAPI.updateUser() - 부서 정보 포함 업데이트
- 기존 createUser API 확장 지원

Expected Result:
 사용자 생성 시 부서 선택 가능
 사용자 목록에 부서 정보 표시
 편집 버튼으로 부서 변경 가능
 5개 부서 분류 시스템 완성
 직관적인 사용자 관리 UI
This commit is contained in:
Hyungi Ahn
2025-10-25 13:29:47 +09:00
parent 7018d381b5
commit 236e1ca493
9 changed files with 279 additions and 9 deletions

View File

@@ -32,11 +32,19 @@ class DisposalReasonType(str, Enum):
spam = "spam" # 스팸/오류
custom = "custom" # 직접 입력
class DepartmentType(str, Enum):
production = "production" # 생산
quality = "quality" # 품질
purchasing = "purchasing" # 구매
design = "design" # 설계
sales = "sales" # 영업
# User schemas
class UserBase(BaseModel):
username: str
full_name: Optional[str] = None
role: UserRole = UserRole.user
department: Optional[DepartmentType] = None
class UserCreate(UserBase):
password: str
@@ -45,6 +53,7 @@ class UserUpdate(BaseModel):
full_name: Optional[str] = None
password: Optional[str] = None
role: Optional[UserRole] = None
department: Optional[DepartmentType] = None
is_active: Optional[bool] = None
class PasswordChange(BaseModel):