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_ParkSuYeon 직원 정보 관리 서비스 #50

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

Conversation

suyeonnnnnnn
Copy link

📷 직원 정보 관리 서비스

패스트캠퍼스 X 야놀자: 프론트엔드 개발 부트캠프의 JAVASCRIPT 과제입니다.
직원들의 정보를 관리할 수 있는 서비스입니다.

주소 : https://employee-management-d1bad.web.app/

[프로젝트 개요]

프로젝트 기간

  • 2023년 8월 8일 ~ 2023년 8월 18일

[필수 요구 사항]
  • “AWS S3 / Firebase 같은 서비스”를 이용하여 사진을 관리할 수 있는 페이지를 구현하세요.

  • 프로필 페이지를 개발하세요.

  • 스크롤이 가능한 형태의 리스팅 페이지를 개발하세요.

  • 전체 페이지 데스크탑-모바일 반응형 페이지를 개발하세요.

  • 사진을 등록, 수정, 삭제가 가능해야 합니다.

  • 유저 플로우를 제작하여 리드미에 추가하세요.

  • CSS

    • 애니메이션 구현
    • 상대수치 사용(rem, em)
  • JavaScript

    • DOM event 조작


[화면]

메인 화면

메인

프로필 화면

프로필2
메인페이지의 이름 클릭 시 프로필 페이지로 이동.

[주요 기능]

  • CRUD

    CREATE READ
    등록 (1)

    메인페이지의 등록 버튼 클릭 후 모달창에서 정보 등록
    메인









    직원 정보 조회
    UPDATE DELETE
    수정
    메인페이지 수정 버튼 클릭 후 수정
    삭제
    수정 페이지의 삭제 버튼 클릭시 확인 경고창 생성 후 삭제

  • 데스크탑, 모바일 반응형 페이지

    메인 페이지 프로필 페이지 수정 페이지
    반응형_메인2 반응형_프로필 반응형_수정페이지

  • CSS 애니메이션

    모달창 애니메이션

임직원 등록 모달창 Fade-in 효과

[흐름]


유저플로우

유저플로우

[개선사항]

  • 수정 모달창을 이용한 수정 구현.
  • 체크박스를 이용한 삭제 구현.
  • 기타 선택 요구사항 구현.

@suyeonnnnnnn suyeonnnnnnn self-assigned this Aug 18, 2023
@HOOOO98
Copy link

HOOOO98 commented Aug 22, 2023

와! 리드미가 엄청 잘 정리되어 있어서 한번에 읽혔습니다!!👍👍
그리고 아이폰에서도 깨짐없이 잘 구현되는거 보고 놀랐습니다..!
저는 정적인 데이터를 넣을 때는 selectionoption태그를 사용해서 구현을 해보았는데요~!
input 태그에서처럼 placeholder로 기본값을 보여주고 싶을때는
option에서 selected="true" 속성을 주면 selection에서 기본값으로 나타나게 됩니다!
직책처럼 회사 내규를 따르는 정적 데이터는 selection으로 구현해보는 거는 어떻게 생각하시나요?😊

@JiHongkyu
Copy link

모바일 UI를 깔끔하게 구현하신 거 같아요!
유저 플로우도 한눈에 알아보기 쉬워서 보기 편했습니다😊

@IAMISTP
Copy link

IAMISTP commented Aug 25, 2023

모바일 UI 를 깔끔하게 구현하셔서 반응형으로 변경하였을때도 사용자기 보기 편하네요ㅠㅠㅠㅠ저도 이렇게 수정하도록 해야겠습니다.
삭제 기능을 해보았는데 에러가 나와서요! 확인 해보시면 좋을것 같습니다!
스크린샷 2023-08-25 오후 7 23 50

@NamgungJongMin
Copy link

코드 잘봤습니다!
firebase.js 안에서 데이터를 가져오는 것 뿐만아니라 각 페이지가 로드될 때 문서들을 동적으로 추가하는 코드들이 함께 있던데 firebase.js 안에서는 firebase에 접근하여 데이터를 가져오거나 등록, 수정하는 역할만을 담당하는 함수들을 만들고 페이지 로드에 관련한 부분들은 각페이지의 js파일에서 firebase의 함수들을 import해와서 정보들만 인수로 넘겨주는 식으로 구조를 바꿔보면 어떨까요?

@yeongmins
Copy link

crud 기능구현, 상세 프로필, 반응형 등 깔끔하게 구현을 잘 하신 것 같아요!
직원 정보 td에 css 기능 중
overflow: hidden;
text-overflow: ellipsis;
를 적용 시켜서 화면이 줄어들 때 텍스트가 안겹치게 하는것도 좋을 것 같아요!

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.

고생하셨습니다 수연님~
각 페이지별 과 기능별 자바스크립트 파일 분리도 잘해주셨고 코드도 깔끔하게 작성해주신거같습니다~
다만 비동기 처리 부분과 상수 처리 부분이 아쉬워서 리뷰 드린 내용참고하여 리팩토링해주시면 좋을꺼같습니다~

document.querySelector("#profile_edit").addEventListener('click', function() {
const updatedImageURL = document.getElementById('edit-image-preview').src;
db.collection('employee').doc(docId).update({
name: document.querySelector("#edit_name").value,

Choose a reason for hiding this comment

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

document.getElementById('edit_name') 같은 엘리먼트 조회부분이 중복되고있습니다 이럴때는 상수로 따로 선언해주시는게 좋습니다~

Comment on lines +55 to +56
let modal = document.querySelector('.modal--delete');
modal.classList.remove('hidden');

Choose a reason for hiding this comment

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

특정 모달을 보이게하는 코드가 동일해보입니다 이런 코드는 별로의 함수로 관리해주시면 좋습니다~

function showModal(modalClass) {
    let modal = document.querySelector(modalClass);
    modal.classList.remove('hidden');
}

document.addEventListener('DOMContentLoaded', function() {
// URL의 쿼리 스트링에서 docId를 추출
const queryString = new URLSearchParams(window.location.search);
const docId = queryString.get('id');

Choose a reason for hiding this comment

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

만약 쿼리 스트링에 id 값이 없는경우에 대한 예외처리를 추가해주시면 좋을꺼같습니다~

table tr {
background-color: #f8f8f8;
border: 1px solid #ddd;
padding: .35em;

Choose a reason for hiding this comment

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

em 과 rem은 폰트단위입니다 따라서 폰트외에 속성에서 em 과 rem 에 사용은 최대한 지양 해주시는게 좋습니다~

<script src="https://www.gstatic.com/firebasejs/8.6.5/firebase-firestore.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.6.5/firebase-storage.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds+3Ulb9Bn9Plx0x4" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>

Choose a reason for hiding this comment

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

현재 작성해주신 스크립트내에 jquery 관련한 코드는 없는거같아서 jquery는 빼주셔도 될꺼같습니다
이러한 불필요한 리소스가 많아지면 성능에 바로 직결이 되어서 적절하게 관리해주시는게 좋습니다~

Comment on lines +25 to +27
snapshot.ref.getDownloadURL().then((url) => {
document.getElementById('edit-image-preview').src = url;
});

Choose a reason for hiding this comment

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

then 을 사용하실때는 무조건 catch를 사용해서 에러 핸들링을 해주시는게 좋으시며
then/catch 보다는 아래와 같이 try/catch 와 async/await을 같이 사용하시는걸 추천드립니다~

try{
const url = await shapshot.ref.getDownloadURL()
document.getElementById('edit-image-preview').src = url;
}catch(error){
console.log(error)
}

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