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_JungHyoJu 고객 정보 관리 시스템 #44

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

Conversation

hhjs2
Copy link

@hhjs2 hhjs2 commented Aug 18, 2023

💗 예약 관리 시스템

📌프로젝트 개요

  • 고객들의 예약 등록과 예약 관리를 도와주는 서비스 입니다.
  • LocalStorage와 파이어베이스를 이용해 DB 정보를 이용합니다.

📂 사이트 주소

🔗 배포 링크 : https://cupid-32b7f.web.app/

💿 필수 요구사항

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



📀 추가 구현사항

  • 사진 관리 페이지와 관련된 기타 기능도 고려해 보세요.
  • 직원을 등록, 수정, 삭제가 가능하게 해보세요.
  • LocalStorage 사용



💻 화면 구성

메인 페이지 사용자 등록(예약) 페이지

고객 정보 관리 페이지 고객 프로필 페이지


🔎 주요 기능

🔔 사용자 등록(예약) 페이지 - 사진 등록, 수정

Search Search

🔔 사용자 등록(예약) 페이지 - 사진 firebase 업로드

Search

🔔 사용자 등록(예약) 페이지 - 사용자 정보 LocalStorage 업로드

Search

🔔 고객 정보 관리 페이지 - 스크롤이 가능한 형태의 리스팅 페이지

Search

🔔 고객 정보 관리 페이지 - 애니메이션 구현

Search

🔔 고객 프로필 페이지 - 사진 삭제

Search

🔔 전체 페이지 데스크탑-모바일 반응형 페이지

메인 페이지 사용자 등록(예약) 페이지
Search Search
고객 정보 관리 페이지 고객 프로필 페이지
Search Search

🌿 유저 플로우

@netlify
Copy link

netlify bot commented Aug 18, 2023

👷 Deploy Preview for harmonious-cat-234230 processing.

Name Link
🔨 Latest commit 7aa62ce
🔍 Latest deploy log https://app.netlify.com/sites/harmonious-cat-234230/deploys/64df78d7b7d92300082a4e2b

@netlify
Copy link

netlify bot commented Aug 18, 2023

Deploy Preview for harmonious-cat-234230 failed.

Name Link
🔨 Latest commit 7aa62ce
🔍 Latest deploy log https://app.netlify.com/sites/harmonious-cat-234230/deploys/64df78d7b7d92300082a4e2b

@netlify
Copy link

netlify bot commented Aug 18, 2023

Deploy Preview for vocal-kringle-d5128d ready!

Name Link
🔨 Latest commit 7aa62ce
🔍 Latest deploy log https://app.netlify.com/sites/vocal-kringle-d5128d/deploys/64df78d79c32f40008b14abc
😎 Deploy Preview https://deploy-preview-44--vocal-kringle-d5128d.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.

@skyeome
Copy link

skyeome commented Aug 22, 2023

기능별로 js 파일을 나누어 주셔서 어떤파일이 어떤 역할을 하는지 확인하기 좋았던것같습니다!

Comment on lines +10 to +13
// localStorage에서 해당 클라이언트 정보를 가져옵니다.
const storageData = JSON.parse(
localStorage.getItem(`user-info${parseInt(clientIndex) + 1}`)
);

Choose a reason for hiding this comment

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

로컬스토리지 사용해보신 부분 좋은 거 같습니다! 기능별 파일 나눈 거도 좋은 거 같아요!
현재 사진 삭제는 가능한데 프로필 삭제는 불가능하니 해당 기능 + 체크박스 및 전체 체크박스 컨트롤 기능 넣어보시면 좋을 거 같아요! 그리고 등록하기 클릭시 애니메이션이나 이벤트 추가해봐도 좋을 거 같습니다! 고생하셨습니다 💪💪

Comment on lines +93 to +98
// 사진 업로드 클릭시 미리보기 구현 코드
const inputImage = document.getElementById("chooseFile");
inputImage.addEventListener("change", (e) => {
readURL(e.target); // chooseFile 의 e를 readURL로 전달
});

Copy link

Choose a reason for hiding this comment

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

사진 미리 보기는 이렇게 하면 되는군요..😮 잘 배워갑니다~!

function init() {
const userListItem = document.querySelector(".user-list-item");

for (var i = 1; i <= storedKeys.length; i++) {
Copy link
Member

Choose a reason for hiding this comment

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

var 키워드보다 const 키워드가 더 좋을 것 같습니다 👍

for (const i = 1; i <= storedKeys.length; i++)

Comment on lines +18 to +24
const userUrlElement = document.getElementById("user-url");
const userMnameElement = document.getElementById("user-m_name");
const userWnameElement = document.getElementById("user-w_name");
const userDataElement = document.getElementById("user-data");
const userPlaceElement = document.getElementById("user-place");
const userNumberElement = document.getElementById("user-number");
const userRegionElement = document.getElementById("user-region");
Copy link
Member

Choose a reason for hiding this comment

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

const elementsId = [
  "user-url",
  "user-m_name",
  "user-w_name",
  "user-data",
  "user-place",
  "user-number",
  "user-region",
];

const elements = elementsId.map(id => document.getElementById(id));

위와 같이 일일이 가져오지 않고 elements에 요소들을 넣어 배열화하는 방법도 있으니 참고하면 좋을 것 같습니다. 그리고 다음과 같이 배열화한 것은 some메서드로 요소의 값이 있는지 확인 후 인덱싱을 사용해서 요소의 값을 넣으면 더 편할 것 같아요 👍

elements[0].innerHTML = 값

Copy link
Author

Choose a reason for hiding this comment

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

와 몰랐던 방법이네요 ! 욱진님 말씀대로 하면 훨씬 편하고 코드 가독성이 좋아질거 같아용 항상 리뷰하실 때 참고할 만한 사이트나, 해결 방법을 직접 명시해주셔서 너무 도움되고 감사합니다 👍🙂

Comment on lines +2 to +6
const hypenTel = (target) => {
target.value = target.value
.replace(/[^0-9]/g, "")
.replace(/^(\d{2,3})(\d{3,4})(\d{4})$/, `$1-$2-$3`);
};
Copy link

Choose a reason for hiding this comment

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

이러한 디테일 한 부분까지 신경쓰시다니.. 👍 저도 리팩토링시 참고하겠습니다.

Copy link

@JIYEONGYANGdev JIYEONGYANGdev left a comment

Choose a reason for hiding this comment

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

고객 정보 <- 만 새로운 창으로 띄우게 한 건 의도하신 걸까요? 뭔가 페이지가 두개로 나뉘어서
헤더도 각각에 만들어두신 것 같은데요,
지금 배우고 계신 리액트로는 헤더를 공통 컴포넌트로 만들어서 여러 페이지에서 보이게끔 재사용할 수 있어요.

그리고 예약하기 위해 정보를 등록할 때, alert 등으로 등록이 된 걸 알려주고 등록이 되었으면 -> 리스트 로 가도록 처리해보면 어떨까요? 이런 것들이 쌓여서 좋은 UX를 만드는 것 같습니다.

반응형에 맞게 네비게이션 바를 토글로 바꾼 것도 좋네요!

리액트를 통해서 더 자유롭게 구현해보실 수 있을 거예요.
수고하셨습니다~!

Comment on lines +29 to +49
if (
userUrlElement &&
userMnameElement &&
userWnameElement &&
userDataElement &&
userPlaceElement &&
userNumberElement &&
userRegionElement &&
storageData
) {
userUrlElement.innerHTML = `<img class="dataImg" src="${storageData.url}">`;
userMnameElement.textContent = storageData.m_name;
userWnameElement.textContent = storageData.w_name;
userDataElement.textContent = storageData.data;
userPlaceElement.textContent = storageData.place;
userNumberElement.textContent = storageData.number;
userRegionElement.textContent = storageData.region;
} else {
console.log("값이 없음 !!!!!!");
}
});

Choose a reason for hiding this comment

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

욱진님이 좋은 팁 공유해주셨네요!

  if (
    userUrlElement &&
    userMnameElement &&
    userWnameElement &&
    userDataElement &&
    userPlaceElement &&
    userNumberElement &&
    userRegionElement &&
    storageData
  ) {

이렇게 조건을 위한 값을 만드려고 할 때 별거 아닌 것 같아도 꽤 복잡한 로직이 되더라고요.
앞으로 리액트할 때도 lodash 라이브러리 << 많이 사용해보면 좋을 거예요!


document.querySelector(".remove-image").addEventListener("click", remove);

function remove() {

Choose a reason for hiding this comment

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

함수명도 다양하게 지어볼 수 있긴 한데요,

handle{동작} 이런 컨벤션이 가장 보편적이긴 합니다. 협업에 있어 컨벤션은 중요하니 관심 갖고 있으시면 좋을 것 같아요!

const image = document.querySelector(".image");

//DropFile
function DropFile(dropAreaId) {

Choose a reason for hiding this comment

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

드래그&드롭 으로 파일업로드할 수 있게 신경쓰셨군요. 👍🏼

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