Skip to content

Latest commit

 

History

History
1086 lines (922 loc) · 20.4 KB

README.md

File metadata and controls

1086 lines (922 loc) · 20.4 KB

WORK FAIRY(근태 요정)


프로젝트 소개

주제 : 연차•당직 관리 프로그램
개발 기간 : 2023. 07. 24 ~ 2023. 08. 11
배포 주소 : DEMO


👩‍🚀 프론트엔드 개발팀

ChoEun-Sang
조은상
Pildrum
김필진
Siwoo Lee
이시우
Jung SeungWon
정승원
- 관리자 페이지
- 프론트엔드 팀장
- README 및 프로젝트 관련 서류 담당
- Auth페이지 / 관리자페이지
- 프로젝트 리더
- Git Management
- 와이어프레임 담당
- 사원 페이지
- 템플릿 디자인 담당
- 캘린더 컴포넌트


사용기술 및 개발환경

Development



화면 구성

로그인 페이지

사용자별 로그인 로그인 메인 회원가입 사원회원가입 사원용 로그인 사원 로그인 페이지 관리자용 로그인 관리자 로그인


사원 페이지

메인페이지 사원 메인 연차/당직 등록 연차등록 결재 내역 페이지 사원결재내역 결재 상세 내역 사원 결재 상세


관리자 페이지

요청 관리 페이지 관리자메인 결재 처리 창 관리자모달 일별 사용대장 관리자일별 월별 사용대장 관리자월별 사원 조회 페이지 관리자조회



API 사용법

모든 API 요청(Request) headers에 아래 정보가 꼭 포함돼야 합니다! usernameKDT5_TeamX와 같이 본명 혹은 팀 이름을 포함해야 합니다! 확인할 수 없는 사용자나 팀의 DB 정보는 임의로 삭제될 수 있습니다!

{
  "content-type": "application/json"
}

인증

'인증' 관련 API는 모두 일반 사용자 전용입니다.

회원가입

사용자가 username에 종속되어 회원가입합니다.

  • 사용자 비밀번호는 암호화해 저장합니다.(관리자는 확인할 수 없습니다!)
curl http://3.34.110.127/api/register
  \ -X 'POST'

요청 데이터 타입 및 예시:

interface RequestBody {
  email: string; // 사용자 아이디 (필수!)
  password: string; // 사용자 비밀번호, 8자 이상 (필수!)
  empName: string; // 사용자 이름, 20자 이하 (필수!)
  position?: string; // 직급 (선택 사항!)
}
{
  "email": "[email protected]",
  "password": "********",
  "empName": "team1",
  "position": "팀장"
}

응답 데이터 타입 및 예시:

interface ResponseValue {
  success: boolean;
  code: number;
  message: string;
}
{
  "success": false,
  "code": -1,
  "message": "이메일이 중복되었습니다."
}

로그인

  • 발급된 accessToken은 30분 후 만료됩니다.(만료 후 다시 로그인 필요)
curl http://3.34.110.127/api/login
  \ -X 'POST'

요청 데이터 타입 및 예시:

interface RequestBody {
  email: string; // 사용자 아이디 (필수!)
  password: string; // 사용자 비밀번호 (필수!)
}
{
  "email": "[email protected]",
  "password": "********"
}

응답 데이터 타입 및 예시:

interface ResponseValue {
  Authorization: string;
  Authorization-refresh: string;
}
{
  "Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjlQS3I...(생략)",
  "Authorization-refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjlQS3I...(생략)"
}

요청관리 - 결재처리

  • 관리자 전용 API 입니다.
curl http://3.34.110.127/api/admin/order/update
  \ -X 'POST'
  \ -H 'Authorization: accessToken'

요청 데이터 타입 및 예시:

interface RequestBody {
  id: number;
  status: string;
}
{
     "id" : 1
     "status" : "승인"
}

응답 데이터 타입 및 예시:

  • 없음

요청관리 리스트 조회 - 결재대기

  • 관리자 전용 API 입니다.
curl http://3.34.110.127/api/admin/order/list/status/wait?page=${page}&size=${size}
  \ -X 'GET'
  \ -H 'Authorization: accessToken'

요청 데이터 타입 및 예시:

  • 없음

응답 데이터 타입 및 예시:

interface ResponseValue {
  content: ContentData[];
  pageable: {
    sort: {
      empty: boolean;
      sorted: boolean;
      unsorted: boolean;
    };
    offset: number;
    pageNumber: number;
    pageSize: number;
    paged: boolean;
    unpaged: boolean;
  };
  totalElements: number;
  totalPages: number;
  last: boolean;
  number: number;
  sort: {
    empty: boolean;
    sorted: boolean;
    unsorted: boolean;
  };
  size: number;
  numberOfElements: number;
  first: boolean;
  empty: boolean;
}

interface ContentData {
  id: number;
  empName: string;
  createdAt: string;
  orderType: string;
  status: string;
  startDate: string;
  endDate: string;
  reason: string;
  category: string;
  etc: string;
}
{
  "content": [
    {
      "id": 1,
      "empName": "박지훈",
      "createdAt": "2023-07-15",
      "orderType": "연차",
      "status": "대기",
      "startDate": "2023-07-15",
      "endDate": "2023-07-20",
      "reason": "이유",
      "category": "경조사",
      "etc": "기타"
    }
  ],
  "pageable": {
    "sort": {
      "empty": true,
      "sorted": false,
      "unsorted": true
    },
    "offset": 0,
    "pageNumber": 0,
    "pageSize": 4,
    "paged": true,
    "unpaged": false
  },
  "totalElements": 22,
  "totalPages": 6,
  "last": false,
  "number": 0,
  "sort": {
    "empty": true,
    "sorted": false,
    "unsorted": true
  },
  "size": 4,
  "numberOfElements": 4,
  "first": true,
  "empty": false
}

요청관리 리스트 조회 - 결재완료

  • 관리자 전용 API 입니다.
curl http://3.34.110.127/api/admin/order/list/status/complete?page=${page}&size=${size}
  \ -X 'GET'
  \ -H 'Authorization: accessToken'

요청 데이터 타입 및 예시:

  • 없음

응답 데이터 타입 및 예시:

interface ResponseValue {
  content: {
    id: number;
    empName: string;
    createdAt: string;
    orderType: string;
    status: string;
    startDate: string;
    endDate: string;
    reason: string;
    category: string;
    etc: string;
  }[];
  pageable: {
    sort: {
      empty: boolean;
      sorted: boolean;
      unsorted: boolean;
    };
    offset: number;
    pageNumber: number;
    pageSize: number;
    paged: boolean;
    unpaged: boolean;
  };
  totalElements: number;
  totalPages: number;
  last: boolean;
  number: number;
  sort: {
    empty: boolean;
    sorted: boolean;
    unsorted: boolean;
  };
  size: number;
  numberOfElements: number;
  first: boolean;
  empty: boolean;
}
{
  "content": [
    {
      "id": 1,
      "empName": "박지훈",
      "createdAt": "2023-07-15",
      "orderType": "연차",
      "status": "승인",
      "startDate": "2023-07-15",
      "endDate": "2023-07-20",
      "reason": "이유",
      "category": "경조사",
      "etc": "기타"
    }
  ],
  "pageable": {
    "sort": {
      "empty": true,
      "sorted": false,
      "unsorted": true
    },
    "offset": 0,
    "pageNumber": 0,
    "pageSize": 4,
    "paged": true,
    "unpaged": false
  },
  "totalElements": 22,
  "totalPages": 6,
  "last": false,
  "number": 0,
  "sort": {
    "empty": true,
    "sorted": false,
    "unsorted": true
  },
  "size": 4,
  "numberOfElements": 4,
  "first": true,
  "empty": false
}

월별 사용대장 - 당직 조회

  • 관리자 전용 API 입니다.
curl http://3.34.110.127/api/admin/order/list/monthly/duty?year=${year}
  \ -X 'GET'
  \ -H 'Authorization: accessToken'

요청 데이터 타입 및 예시:

  • 없음

응답 데이터 타입 및 예시:

type TDutyData = IDutyItem[];

interface IDutyItem {
  id: number;
  empName: string;
  empNo: number;
  month: {
    jan: number;
    feb: number;
    mar: number;
    apr: number;
    may: number;
    jun: number;
    jul: number;
    aug: number;
    sept: number;
    oct: number;
    nov: number;
    dec: number;
    totalCount: number;
  };
  total: number;
}
[
  {
    "id": 1,
    "empName": "박지훈",
    "empNo": 20200001,
    "month": {
      "jan": 0,
      "feb": 0,
      "mar": 0,
      "apr": 0,
      "may": 0,
      "jun": 0,
      "jul": 6,
      "aug": 0,
      "sept": 0,
      "oct": 0,
      "nov": 0,
      "dec": 0,
      "totalCount": 6
    },
    "total": 6
  }
]

월별 사용대장 - 연차 조회

  • 관리자 전용 API 입니다.
curl http://3.34.110.127/api/admin/order/list/monthly/annual?year=${year}
  \ -X 'GET'
  \ -H 'Authorization: accessToken'

요청 데이터 타입 및 예시:

  • 없음

응답 데이터 타입 및 예시:

type TAnnualData = IDutyItem[];

interface IAnnualItem {
  id: number;
  empName: string;
  empNo: number;
  month: {
    jan: number;
    feb: number;
    mar: number;
    apr: number;
    may: number;
    jun: number;
    jul: number;
    aug: number;
    sept: number;
    oct: number;
    nov: number;
    dec: number;
    totalCount: number;
  };
  total: number;
}
[
  {
    "id": 1,
    "empName": "박지훈",
    "empNo": 20200001,
    "month": {
      "jan": 0,
      "feb": 0,
      "mar": 0,
      "apr": 0,
      "may": 0,
      "jun": 0,
      "jul": 6,
      "aug": 0,
      "sept": 0,
      "oct": 0,
      "nov": 0,
      "dec": 0,
      "totalCount": 6
    },
    "total": 6
  }
]

일별 사용대장 - 연차 조회

  • 관리자 전용 API 입니다.
curl http://3.34.110.127/api/admin/order/list/daily/annual?year=${year}&month=${month}
  \ -X 'GET'
  \ -H 'Authorization: accessToken'

요청 데이터 타입 및 예시:

  • 없음

응답 데이터 타입 및 예시:

interface IResponseBody {
  empName: string;
  empNo: number;
  orderType: string;
  date: string;
}
[
  {
    "empName": "홍길동",
    "empNo": 20230001,
    "orderType": "당직",
    "date": "2023-08--20"
  }
]

일별 사용대장 - 당직 조회

  • 관리자 전용 API 입니다.
curl http://3.34.110.127/api/admin/order/list/daily/duty?year=${year}&month=${month}
  \ -X 'GET'
  \ -H 'Authorization: accessToken'

요청 데이터 타입 및 예시:

  • 없음

응답 데이터 타입 및 예시:

interface IResponseBody {
  empName: string;
  empNo: number;
  orderType: string;
  date: string;
}
[
  {
    "empName": "홍길동",
    "empNo": 20230001,
    "orderType": "당직",
    "date": "2023-08--20"
  }
]

사원조회 - 사원명

  • 관리자 전용 API 입니다.
curl http://3.34.110.127/api/admin/user/search?name=${name}
  \ -X 'GET'
  \ -H 'Authorization: accessToken'

요청 데이터 타입 및 예시:

  • 없음

응답 데이터 타입 및 예시:

interface ISearch {
  id: number;
  empNo: number;
  empName: string;
  createdAt: string;
}
{
  "id": 4,
  "empNo": 20210004,
  "empName": "홍길동",
  "createdAt": "2023-08-03"
}

사원조회 - 사원번호

  • 관리자 전용 API 입니다.
curl http://3.34.110.127/api/admin/user/search?empno=${empno}
  \ -X 'GET'
  \ -H 'Authorization: accessToken'

요청 데이터 타입 및 예시:

  • 없음

응답 데이터 타입 및 예시:

interface ISearch {
  id: number;
  empNo: number;
  empName: string;
  createdAt: string;
}
{
  "id": 4,
  "empNo": 20210004,
  "empName": "홍길동",
  "createdAt": "2023-08-03"
}

사원조회 - 연차/당직 내역

  • 관리자 전용 API 입니다.
curl http://3.34.110.127/api/admin/order/list?user=${user}&page=${page}&size=${size}
  \ -X 'GET'
  \ -H 'Authorization: accessToken'

요청 데이터 타입 및 예시:

  • 없음

응답 데이터 타입 및 예시:

interface ResponseValue {
  content: {
    id: number;
    empName: string;
    createdAt: string;
    orderType: string;
    status: string;
    startDate: string;
    endDate: string;
    reason: string;
    category: string;
    etc: string;
  }[];
  pageable: {
    sort: {
      empty: boolean;
      sorted: boolean;
      unsorted: boolean;
    };
    offset: number;
    pageNumber: number;
    pageSize: number;
    paged: boolean;
    unpaged: boolean;
  };
  totalElements: number;
  totalPages: number;
  last: boolean;
  number: number;
  sort: {
    empty: boolean;
    sorted: boolean;
    unsorted: boolean;
  };
  size: number;
  numberOfElements: number;
  first: boolean;
  empty: boolean;
}
{
  "content": [
    {
      "id": 1,
      "empName": "박지훈",
      "createdAt": "2023-07-15",
      "orderType": "연차",
      "status": "승인",
      "startDate": "2023-07-15",
      "endDate": "2023-07-20",
      "reason": "이유",
      "category": "경조사",
      "etc": "기타"
    }
  ],
  "pageable": {
    "sort": {
      "empty": true,
      "sorted": false,
      "unsorted": true
    },
    "offset": 0,
    "pageNumber": 0,
    "pageSize": 4,
    "paged": true,
    "unpaged": false
  },
  "totalElements": 22,
  "totalPages": 6,
  "last": false,
  "number": 0,
  "sort": {
    "empty": true,
    "sorted": false,
    "unsorted": true
  },
  "size": 4,
  "numberOfElements": 4,
  "first": true,
  "empty": false
}

연차/당직 등록

  • 시원 전용 API 입니다.
curl http://3.34.110.127/api/admin/order/add
  \ -X 'POST'
  \ -H 'Authorization: accessToken'

요청 데이터 타입 및 예시:

interface RequestBody {
  orderType: string;
  startAt: string;
  endAt: string;
  reason: string | null;
  category: string | null;
  etc: string | null;
}
{
    "orderType": "당직 or 연차",
    "startAt": "2023-07-31",
    "endAt": "2023-07-31",
    "reason" : "이유"
    "category"? : "경조사"
    "etc"?: "특이사항입니다."
}

응답 데이터 타입 및 예시:

interface ResponseValue {
  success: boolean;
  response: string;
  error: null;
}
{
  "success": true,
  "response": "등록 완료",
  "error": null
}

전자결제내역

  • 시원 전용 API 입니다.
curl http://3.34.110.127/api/user/myorder?page={page}&size={size}
  \ -X 'GET'
  \ -H 'Authorization: accessToken'

요청 데이터 타입 및 예시:

  • 없음

응답 데이터 타입 및 예시:

interface ResponseValue {
  success: boolean;
  response: {
    content: [
      {
        id: number;
        empName: string;
        createdAt: string;
        orderType: string;
        status: string;
        startDate: string;
        endDate: string;
        reason: string | null;
      },
    ];
    pageable: {
      sort: {
        empty: boolean;
        sorted: boolean;
        unsorted: boolean;
      };
      offset: number;
      pageNumber: number;
      pageSize: number;
      paged: boolean;
      unpaged: boolean;
    };
    totalPages: number;
    totalElements: number;
    last: boolean;
    number: number;
    sort: {
      empty: boolean;
      sorted: boolean;
      unsorted: boolean;
    };
    size: number;
    numberOfElements: number;
    first: boolean;
    empty: boolean;
  };
  error: string | null;
}
{
  "success": true,
  "response": {
    "content": [
      {
        "id": 87,
        "empName": "마두기",
        "createdAt": "2023-08-09",
        "orderType": "당직",
        "status": "승인",
        "startDate": "2023-08-10",
        "endDate": "2023-08-10",
        "reason": null
      }
    ],
    "pageable": {
      "sort": {
        "empty": true,
        "sorted": false,
        "unsorted": true
      },
      "offset": 0,
      "pageNumber": 0,
      "pageSize": 10,
      "paged": true,
      "unpaged": false
    },
    "totalPages": 2,
    "totalElements": 12,
    "last": false,
    "number": 0,
    "sort": {
      "empty": true,
      "sorted": false,
      "unsorted": true
    },
    "size": 10,
    "numberOfElements": 10,
    "first": true,
    "empty": false
  },
  "error": null
}

연차/당직 내역 삭제

  • 시원 전용 API 입니다.
curl http://3.34.110.127/api/user/order/delete?id={id}
  \ -X 'POST'
  \ -H 'Authorization: accessToken'

요청 데이터 타입 및 예시:

  • 없음

응답 데이터 타입 및 예시:

interface ResponseValue {
  success: boolean;
  response: string;
  error: string | null;
}
{
  "success": "true",
  "response": "등록 완료",
  "error": null
}

개인 신청내역 월별조회

  • 시원 전용 API 입니다.
curl http://3.34.110.127/api/user/main?year={year}&month={month}
  \ -X 'GET'
  \ -H 'Authorization: accessToken'

요청 데이터 타입 및 예시:

  • 없음

응답 데이터 타입 및 예시:

interface ResponseValue {
  id: number;
  orderType: string;
  startDate: string;
  endDate: string;
  status: string;
  reason: string;
  category: string;
  etc: string;
}
[
  {
    "id" : 21,
    "orderType"  : “당직”,
    "startDate"  :  “2023-11-20”,
    "endDate"  :  “2023-11-20”,
    "status"  : “승인”,
    "reason" : “이유”,
    "category"  : “경조사”,
    "etc" : “특이사항입니다.”
  }
]