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_ParkNaYoung 프로젝트 매니지먼트 서비스 #66

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

Conversation

im-na0
Copy link

@im-na0 im-na0 commented Aug 18, 2023

프로젝트 매니지먼트 서비스

🚀 프로젝트 소개

팀 프로젝트 진행 시 멤버를 등록하고 팀 구성을 도와주는 서비스를 입니다 😁

🚀 프로젝트 배포

https://deploy-preview-66--effulgent-axolotl-ab38e8.netlify.app/

🚀 과제 요구사항

✅ 필수 요구사항

  • “AWS S3 / Firebase 같은 서비스”를 이용하여 사진을 관리할 수 있는 페이지를 구현하세요.
  • 프로필 페이지를 개발하세요.
  • 스크롤이 가능한 형태의 리스팅 페이지를 개발하세요.
  • 전체 페이지 데스크탑-모바일 반응형 페이지를 개발하세요.
  • 사진을 등록, 수정, 삭제가 가능해야 합니다.
  • 유저 플로우를 제작하여 리드미에 추가하세요.
  • CSS
    • 애니메이션 구현
    • 상대수치 사용(rem, em)
  • JavaScript
    • DOM event 조작

✅ 선택 요구사항

  • 사진 관리 페이지와 관련된 기타 기능도 고려해 보세요.
  • 직원을 등록, 수정, 삭제가 가능하게 해보세요.
  • 페이지가 보여지기 전에 로딩 애니메이션이 보이도록 만들어보세요.
  • 직원 검색 기능을 추가해 보세요.
  • infinity scroll 기능을 추가해 보세요.
  • 사진을 편집할 수 있는 기능을 추가해 보세요.
  • LocalStorage 사용

🚀 프로젝트 내용

메인페이지 메인 페이지
ezgif-4-85d3eb5036 ezgif-4-c21991c473
✓ 전체 리스트 확인
✓ floating animation
✓ members 이름순 정렬 (최대 6개 출력)
✓ lazy-loading
멤버 리스트 페이지 멤버 리스트 페이지
aa bb
✓ 멤버 리스트 확인
✓ 멤버 등록순 정렬
✓ lazy-loading
✓ 멤버 등록
스크린샷 2023-08-21 오후 10 15 24 스크린샷 2023-08-21 오후 10 15 53    
✓ 삭제 / 수정 / 조회 ✓ 수정 & 등록 시 유효성 검사
✓ 모든 폼을 채워야 등록 가능
팀 리스트 페이지 팀 리스트 페이지
ezgif-4-f3b9f9b116 dd
✓ 팀 리스트 확인
✓ 팀 이름순 정렬
✓ hover animation
✓ lazy-loading
✓ 팀 멤버 조회 가능 (프로필만 구현함)
✓ unsplash random 이미지 사용

🚀 유저 플로우

스크린샷 2023-08-22 오전 1 39 15
interaction 기준으로 작성했습니다

✍️ 아쉬운 점

  • 다른 부분에서 오류처리하느라 firebase에 대해 자세히 공부하지 못했던 것 같아 아쉽습니다.
  • 디렉토리 구조가 깔끔하지 못한 것 같습니다. 🥲
  • 기능 추가를 많이 못한 것이 아쉽습니다. 팀 페이지도 여유가 된다면 구현해보고 싶습니다.
  • 모듈화해서 코드의 재사용성을 높이고자 했는데 오히려 같은 로직을 두번이나 사용해야 했었습니다. 다시한번 더 클린코드에 대해 고민해보게 되는 시간이였습니다..😞

@im-na0 im-na0 changed the title KDT0프로젝트 매니지먼트 서비스 KDT0_ParkNaYoung 프로젝트 매니지먼트 서비스 Aug 18, 2023
@netlify
Copy link

netlify bot commented Aug 20, 2023

Deploy Preview for effulgent-axolotl-ab38e8 ready!

Name Link
🔨 Latest commit e8ac04d
🔍 Latest deploy log https://app.netlify.com/sites/effulgent-axolotl-ab38e8/deploys/64ecbdd6e741a500087549a8
😎 Deploy Preview https://deploy-preview-66--effulgent-axolotl-ab38e8.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify site configuration.

@lee-sangone
Copy link

디렉터리 구조 아쉽다 하셨는데 제가 보기엔 깔끔한 것 같습니다! 다양한 기능들을 넣으셨고 결과물도 정말 완벽한것 같아요 수고하셨습니다!

Copy link

@Gaoridang Gaoridang left a comment

Choose a reason for hiding this comment

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

구조가 너무 잘 짜여있어서 깜짝 놀랐습니다! 오래 들여다보긴 했는데 제가 첨언할 내용이 많지 않아서 리뷰 내용은 별로 없네요ㅠ 진짜 고생 많으셨어요!!

import { handleTooltipClick } from './tooltip'
// import { handleupdateBtn } from './upadate'

export function buildHTMLList(member) {

Choose a reason for hiding this comment

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

이거 만드느라 시간 엄청 뺏기셨을 것 같아요 요소 생성하는 함수를 하나 만드는 것도 좋았을 것 같아요!! 클래스 명은 미리 생각해두고 붙이신걸까요?

Copy link
Author

Choose a reason for hiding this comment

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

넵 여기서 시간을 많이 잡아먹었습니다😭 구조가 복잡해서 먼저 html로 만들어보고 js로 옮겼어요!
오 아예 요소를 만드는 부분도 함수로 만들면 좋을 것 같네요 좋은 의견 감사합니다!

observer.unobserve(entry.target)
}
})
}, options)

Choose a reason for hiding this comment

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

어차피 나머지 값은 디폴트이니 options => { threshold: 0.1 } 이렇게 바꿔도 괜찮을 것 같아요! 저도 시도해본 건 아니라 확실치는 않아요ㅎㅎ..

Copy link
Author

Choose a reason for hiding this comment

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

아 그렇게 해도 똑같이 동작할 것 같네요~ 리팩토링할 때 시도해보겠습니다 😄

// 스토리지에 업로드
export async function uploadStorage(file) {
const fileName = file.name
const id = Date.now() / fileName.length

Choose a reason for hiding this comment

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

id를 이렇게 생성하신 이유가 있으신가요?

Copy link
Author

Choose a reason for hiding this comment

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

id는 고유값을 생성하는 부분이에요! storage에 파일을 업로드할 때 이름에 고유값을 넣어서 최대한 중복이름을 피하고자 했습니다.

Copy link
Member

Choose a reason for hiding this comment

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

fileName을 해싱해서 Date.now()와 조합했으면 조금 더 unique한 id를 만들 수 있었을 것 같네요.

@im-na0
Copy link
Author

im-na0 commented Aug 24, 2023

디렉터리 구조 아쉽다 하셨는데 제가 보기엔 깔끔한 것 같습니다! 다양한 기능들을 넣으셨고 결과물도 정말 완벽한것 같아요 수고하셨습니다!

감사합니다 😄😄 !!

Copy link

@SOL-MI SOL-MI left a comment

Choose a reason for hiding this comment

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

모듈화 관련해서 정말 많은 고민을 하셨던 걸로 아는데 그 고민의 흔적이 가득 녹아있는 코드였습니다..! 엄청 깔끔하게 정리해두셔서 감탄하면서 봤습니다 :) 심지어 사이트도 예뻐요ㅎㅎ 최고세요!!!!!!!!!!🤩
+) 아주 사소한 문제 하나 발견했습니당. 반응형 가로 391px~753px정도를 지날때 멤버리스트에서 글씨 및 아이콘이 조금 빠져나가게 보여요

imageUrlInfo.revokeImageUrl()
}
} catch (error) {
console.error('Error during form submission: ', error)
Copy link

Choose a reason for hiding this comment

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

Add member버튼 통해서 업로드 할 때 이런 오류가 발생합니다!
업로드는 정상적으로 되지만 한번 확인해보시면 좋을 것 같습니다.
members.controller.js:73 Error during form submission: ReferenceError: imageUrlInfo is not defined
at HTMLFormElement. (members.controller.js:69:1)

Copy link
Author

Choose a reason for hiding this comment

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

감사합니다!! 어디서 에러가 나는지 알았으니 얼른 고쳐봐야겠네요 😁!!

if (e.target.classList.contains('members__row')) {
const memberId = e.target.getAttribute('data-id')
const newUrl = `/members/${memberId}`
navigateTo(newUrl)
Copy link

Choose a reason for hiding this comment

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

이런 식으로 해쉬를 사용하는 방법도 있었군요:D 배워갑니다 ㅎㅎ
다만 글씨/사진 근처 부분을 클릭했을 때는 이동하지 않고, 커서가 pointer로 바뀌지 않아 동작을 확인하는 게 쉽지 않았습니다..!

Copy link
Author

Choose a reason for hiding this comment

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

이동이 제대로 안되는 부분은 어떻게 해결해야할 지 저도 고민인 부분입니다 😭.. 리팩토링하면서 왜 이동이 안되는지 원인을 찾아봐야겠어요!
커서를 pointer로 바꾸는게 훨씬 접근성이 좋을 것 같네요 좋은 의견 감사합니다!!

@developer-jyyun
Copy link

폴더 구조 아쉽다고 하셨는데 폴도 구조도, 코드도 너무 잘 정리되어있고 깔끔해서 가독성이 높았습니다!
유효성 검사에 정렬 기능까지!! 필수 구현 외에도 다양한 기능 추가되었는데 기능 추가가 아쉽다고 하신 나영님..너무 겸손하신거 아닌가요...
제가 아직 구현 못한 기능들은 나영님 코드 보며 공부 해 보려구요😗

개인적으로 팀 영역에 마우스 각 팀의 멤버들 뜨는 거 좋았어요!!
팀 페이지 구현되면 마음껏 자랑해주세요!!! 😊

프로필 상세 보기 아이콘이 크기가 작고, 리스트의 마우스 오버 효과로 인해서 상세보기 아이콘 위치도 달라져서 곧바로 클릭하기가 조금 불편했어요..! 아이콘 크기가 작은만큼 수정/삭제 버튼 아이콘이 리스트에 바로 노출되면 사용성이 더 좋을 것 같아요!

모바일에서 프로필 상세보기 아이콘 클릭할 때 '박지민'분만 레이아웃이 가로형으로 변경됩니다!

Copy link
Member

@marshallku marshallku left a comment

Choose a reason for hiding this comment

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

고생하셨습니다!
짧은 시간에 구현하실 수 있을 분량이 아니었을 것 같은데, 잠은 주무시면서 하시는 거죠?
dom 생성 부분같은 것과 프로젝트 구조만 조금 다듬으면 아주 좋아질 것 같습니다!

Comment on lines +1 to +4
[[redirects]]
from = "/*"
to = "/index.html"
status = 200
Copy link
Member

Choose a reason for hiding this comment

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

_redirects 파일이랑 netlify.toml 둘 다 사용해야 작동하는 건가요??

src/index.html Outdated
@@ -0,0 +1,14 @@
<!DOCTYPE html>
<html lang="en">
Copy link
Member

Choose a reason for hiding this comment

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

en -> ko

<title>Main</title>
</head>
<body>
<div id="app"></div>
Copy link
Member

Choose a reason for hiding this comment

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

html이 극단적으로 다이어트했네요

Comment on lines 48 to 57
@media (min-width: 1200px) {
.container-xxl,
.container-xl,
.container-lg,
.container-md,
.container-sm,
.container {
max-width: 960px;
}
}
Copy link
Member

Choose a reason for hiding this comment

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

이게 더 아래에 있어야 우선순위가 제대로 부여되지 않을까요?

Copy link
Member

Choose a reason for hiding this comment

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

커밋되지 않아야 하는 파일이 같이 커밋된 것 같네요...!

Comment on lines 84 to 86
rmBtn.style.display = showRmBtn ? 'block' : 'none'
cgBtn.style.display = showCgBtn ? 'block' : 'none'
saveCgBtn.style.display = showSaveCgBtn ? 'block' : 'none'
Copy link
Member

Choose a reason for hiding this comment

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

hidden attribute을 toggle하거나, css로 조절해보셔도 좋을 것 같습니다.

}

&__image {
flex-grow: 0 !important;
Copy link
Member

Choose a reason for hiding this comment

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

!import의 사용은 최대한 지양해주시는 게 좋습니다.

Comment on lines 18 to 19
const getAllTeams = () => {
return new Promise((resolve, reject) => {
Copy link
Member

Choose a reason for hiding this comment

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

이런 케이스엔 return을 생략해도 되지 않을까요?

const getUsersByTeam = (teamName) => {
return new Promise((resolve, reject) => {
try {
const q = query(collection(db, 'members'), where('team', '==', teamName), orderBy('name'))
Copy link
Member

Choose a reason for hiding this comment

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

q보단 조금 더 성의있는 이름을 지어주시면 좋을 것 같습니다.

Comment on lines 43 to 46
const members = []
querySnapshot.forEach((doc) => {
members.push(doc.data())
})
Copy link
Member

Choose a reason for hiding this comment

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

map을 사용하면 좀 더 깔끔하고 직관적으로 정리할 수 있지 않을까요?

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.

6 participants