Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

KDT0_JiHongKyu 직원 관리 시스템 #43

Open
wants to merge 13 commits into
base: main
Choose a base branch
from
Open

Conversation

JiHongkyu
Copy link

🙍‍♂️ 직원 관리 시스템

HTML, CSS, Javascript로 만든 직원 관리 시스템

➡️ 직원 관리 시스템 둘러보기

🖥️ 프로젝트 소개

직원 등록, 수정, 삭제가 가능한 직원 관리 시스템입니다.

  • 목적: Vanilla JS 실력 향상을 위해 CRUD 구현

  • 특이점: LocalStorage를 이용한 데이터 저장

📆 제작 기간

2023년 08월 08일 ~ 2023년 08월 18일

필수 요구사항

✅“AWS S3 / Firebase 같은 서비스”를 이용하여 사진을 관리할 수 있는 페이지를 구현

✅프로필 페이지를 개발

✅스크롤이 가능한 형태의 리스팅 페이지를 개발

✅전체 페이지 데스크탑-모바일 반응형 페이지를 개발

✅사진을 등록, 수정, 삭제가 가능

✅유저 플로우를 제작하여 리드미에 추가

✅CSS - 애니메이션 구현, 상대수치 사용(rem, em)

✅JavaScript - DOM event 조작

🚀 기술스택

HTML5

CSS3

JavaScript

AWS

📝 기능 구현

1. 리스트 페이지

img

  • table태그로 리스트 구현
  • 리스트 목록 hover시 구분가능하도록 리스트 색 변경

img

  • Debounce를 활용하여 검색 기능 구현

img

  • 리스트 목록 클릭 시 나오는 모달창 구현
  • 모달창과 버튼: 애니메이션으로 구현
  • 상세보기 버튼 클릭 시 클릭한 직원의 상세 페이지로 이동
  • 삭제하기 클릭 시 클릭한 직원 삭제

2. 직원 등록 페이지

img

  • 유효성 검사 코드 작성
  • 주소 API활용
  • 사진 선택 시 미리보기 구현
  • 사진 삭제 기능 구현
  • 등록 시 이미지는 AWS S3에 저장, 직원 정보는 로컬스토리지에 저장

3. 직원 상세 페이지

img

  • 직원 사진과 정보가 담긴 프로필 페이지 구현

4. 직원 수정 페이지

img

  • 직원 정보, 사진 수정 기능 구현

5. 모바일 반응형

img

  • @media를 사용하여 모바일 UI 구현

🙄 User Flow

img

✍ 개선 사항

  • LocalStorage 대신 AWS나 firebase 스토리지에 정보 저장해보기

@HOOOO98
Copy link

HOOOO98 commented Aug 22, 2023

오...회원 정보에 주소찾기를 통해 주소 정보를 넣는 거 꼭 도전해보고 싶네요!!
애니메이션이나 반응형도 너무 깔끔하게 잡아주셨네요!!
리스트를 추가하고 상세보기를 바로 보여주던데 엄청 디테일 하신거 같아요!😀
리스트를 하나 더 추가해보니 원래는 안보이던 바깥쪽 태그에 Y스크롤이 생겼는데
body에 overflow: hidden을 주면 사라질 거 같아 보여요~!

@IAMISTP
Copy link

IAMISTP commented Aug 25, 2023

와 아니 검색기능 하신거 대단하시네요 저도 이번에 코드 참고하여 검색기능 구현해보도록 하겠습니다.!
전체적인 UI 도 깔끔하니 보기 좋습니다!

@NamgungJongMin
Copy link

write.js에서 valid함수들을 보면 메시지들의 클래스에 active를 추가하는 코드가 지속적으로 반복되는 것 같습니다.

html에서 미리 각 메시지에 대한 영역을 만들어두고 클래스를 컨트롤 함으로써 display를 변경시키는 방식을 사용하신 것 같은데, 하나의 message 영역만을 만들어두고 자바스크립트로 동적으로 결과를 출력해주는 방식은 어떨까요? 어떤 영역에 대한 메시지인지, 성공인지 실패인지를 인수로 받는 함수를 만들어 이벤트에 적용시키면 중복되는 코드들의 가독성이 좋아질 것 같습니다.

@yeongmins
Copy link

전체적인 UI가 너무 깔끔한 것 같아요!
기능 구현도 잘되고, 프로필 화면 구성도 너무 잘하셨네요~
저도 리펙토링 시 참고해서 적용 시켜보겠습니다!

@suyeonnnnnnn
Copy link

Debounce를 활용한 검색 기능, 주소 API등 저도 활용하고 싶은게 많네요! UI도 깔끔하고, 모바일 화면도 매끄럽고 좋습니다👍👍

Copy link

@jungHyeonS jungHyeonS left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

홍규님 과제하시느라 고생하셨습니다~
aws s3 사용도 적절히 잘해주시고 디자인 과 애니메이션도 깔끔하게 잡아주신거같습니다~
추후에는 돔 이벤트 관련한 부분만 고민해주시면 좋을꺼같습니다~

Comment on lines +73 to +75
getItem.forEach((item) => {
createStaffList(item);
});

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

작성해주신 forEach 코드가 중복되어보입니다 동일한 동작을 하는 코드이기에 아래처럼 개선할수있을꺼같습니다~

if(!getItem){
...
  localStorage.setItem('infos', JSON.stringify(data));
  getItem = data;
}
getItem.forEach((item) => {
    createStaffList(item);
  });

Comment on lines +107 to +111
tr.addEventListener('click', function () {
const data = JSON.stringify(item);
localStorage.setItem('lately-info', data);
modal.classList.add('active');
modalSelect.classList.add('active');

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

createStaffList 함수가 싱행될떄 마다 tr 에 이벤트 리스너가 등록되고있습니다
만약 데이터가 100개가 넘는다면 이벤트 리스너가 100개 넘게 등록되는 구조여서 성능이 좋지가 않습니다
이럴땐 tr 에 부모 엘리먼트에 이벤트를 추가 하는 이벤트 위임 방식을 사용해주시면 좋습니다~

email: write['email'].value,
phone: write['phone'].value,
address: write['address'].value,
imageUrl: `https://hong-upload-image.s3.ap-northeast-2.amazonaws.com/${uploadFile.name ?? uploadFile}`

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이러한 https://hong-upload-image.s3.ap-northeast-2.amazonaws.com 주소 문자열 같은경우는 상수로 선언하여 관리해주시면 추후 유지보수가 쉬워집니다~

const profileAddress = document.querySelector('.address');
const profileImage = document.querySelector('.image');
const staffInfoEdit = document.querySelector('.staff-info-edit');
const data = JSON.parse(localStorage.getItem('lately-info'));

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

로컬 스토리지에서 데이터를 가져올때는 데이터가 있는지 없는지에 대한 예외처리를 해주시는게 좋습니다~

Comment on lines +8 to +10
const phone1 = data['phone'].slice(0, 3);
const phone2 = data['phone'].slice(3, 7);
const phone3 = data['phone'].slice(7);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

핸드폰 관련한 코드가 다른 파일에서도 반복적으로 나오고있는거같습니다 이럴경우 아래처럼 함수로 만들어서 재사용하시는걸 추천드립니다~

function formatPhone(phoneNumber) {
  const phone1 = phoneNumber.slice(0, 3);
  const phone2 = phoneNumber.slice(3, 7);
  const phone3 = phoneNumber.slice(7);
  return `${phone1}-${phone2}-${phone3}`;
}

Comment on lines +42 to +45
write['name'].value = latelyInfo['name'];
write['email'].value = latelyInfo['email'];
write['phone'].value = latelyInfo['phone'];
write['address'].value = latelyInfo['address'];

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 코드를 element 상랑 같이 사용하면 코드가 아래처럼 개선될꺼같습니다~

  element.forEach((el) => {
    write[el].value = latelyInfo[el];
  });

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants