Initial commit: IT센터 출입자관리시스템 (ACS)

방문자 사전신청·승인, 입·출입 체크인/아웃, QR 배지, 재실현황,
블랙리스트, 대시보드 통계, 방문 리포트(엑셀)까지 7단계 전 기능 구현.

- backend: Spring Boot 3.4.5 / Java 21 (JDK 26 빌드), 세션 인증, JPA, H2/PostgreSQL, POI, ZXing, Flyway
- frontend: React 19 / Vite 6 / TypeScript
- infra: Docker Compose (db·app·web nginx), Flyway V1__init, Python 사용자 시드
- docs: 워크플로우 / 시퀀스 다이어그램(Mermaid) / 이슈·유의사항

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
unknown
2026-07-03 08:59:41 +09:00
commit f0c30d8005
130 changed files with 8884 additions and 0 deletions

145
frontend/src/types.ts Normal file
View File

@@ -0,0 +1,145 @@
export interface ApiResponse<T> {
code: number;
message: string;
data: T | null;
}
export type Role = 'ADMIN' | 'SECURITY' | 'HOST';
export interface CurrentUser {
id: number;
username: string;
fullName: string;
roles: Role[];
mustChangePassword: boolean;
}
export interface LoginRequest {
username: string;
password: string;
}
export interface ChangePasswordRequest {
oldPassword: string;
newPassword: string;
}
export interface Zone {
id: number;
code: string;
name: string;
securityLevel: number;
}
export type VisitStatus =
| 'DRAFT'
| 'PENDING'
| 'APPROVED'
| 'REJECTED'
| 'CANCELLED'
| 'EXPIRED';
export interface VisitRequestCreate {
visitorName: string;
company?: string;
contact: string;
email?: string;
vehicleNo?: string;
zoneName?: string;
purpose: string;
visitFrom: string; // ISO local datetime
visitTo: string;
}
export interface VisitRequestView {
id: number;
visitorName: string;
company?: string;
contact?: string;
vehicleNo?: string;
hostId: number;
hostName: string;
hostDepartment?: string;
zoneName?: string;
purpose: string;
visitFrom: string;
visitTo: string;
status: VisitStatus;
qrToken?: string;
createdAt: string;
}
export interface PublicPass {
visitorName: string;
company?: string;
zoneName?: string;
visitFrom: string;
visitTo: string;
/** Whether the visitor is currently inside — drives the kiosk 입장/퇴장 button. */
inside: boolean;
/** Whether the visit already completed (entered & exited) today — blocks re-entry. */
completedToday: boolean;
}
export interface ExcelImportResult {
totalRows: number;
successCount: number;
errors: string[];
success: boolean;
}
export interface InsideVisitor {
visitRequestId: number;
visitorName: string;
company?: string;
zoneName?: string;
hostName: string;
checkInAt: string;
}
export interface AccessRecord {
visitRequestId: number;
visitorName: string;
company?: string;
zoneName?: string;
visitFrom: string;
visitTo: string;
checkInAt?: string;
checkOutAt?: string;
inside: boolean;
}
export interface AccessAction {
visitRequestId: number;
visitorName: string;
direction: 'IN' | 'OUT';
eventAt: string;
gateOpened: boolean;
message: string;
}
export interface StatsSummary {
todayVisits: number;
pending: number;
approved: number;
currentlyInside: number;
total: number;
}
export interface BlacklistItem {
id: number;
name: string;
company?: string;
contact?: string;
reason: string;
active: boolean;
createdByName?: string;
createdAt: string;
}
export interface BlacklistCreate {
name: string;
company?: string;
contact?: string;
reason: string;
}