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

KDT5 9조 과제 제출 (김준희, 송홍빈, 조은상, 박근우, 백동은) #6

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

Conversation

dev-junehee
Copy link

@dev-junehee dev-junehee commented Jul 2, 2023

🏠 집 가구싶어 (SweetHome)

React, TypeScript, Rest API를 활용한 라이프 스타일 홈 데코·인테리어 쇼핑몰 프로젝트입니다.
성별과 연령에 상관없이 모두가 관심을 가지고 이용할 수 있는 인테리어 관련 주제로 선정하였으며,
‘집(Home)’ + ‘가구(Furniture)’ + ‘가고싶다.(Want To Go)’ 의 합성어로 언제 어디서나 집에 가고싶게 만드는 제품을 판매하다는 의미의 쇼핑몰입니다.


프로젝트 소개

패스트캠퍼스 프론트엔드 개발 부트캠프 5기
개발 기간 : 2023. 05. 30 ~ 2023. 07. 01
배포 주소 : DEMO


개발자 소개

김준희 송홍빈 조은상 박근우 백동은
김준희 송홍빈 조은상 박근우 백동은
회원가입
About 페이지
상품 페이지
장바구니 페이지
결제 페이지
관리자 페이지
Footer
로그인/로그아웃
검색 기능
메인 페이지
상품 페이지
장바구니 페이지
결제 페이지
Header
회원가입
로그인 인증
마이페이지
상품 페이지
장바구니 페이지
결제 페이지
관리자 페이지
디자인 참여 디자인 참여

사용기술 및 개발환경

Development


Config

Deployment

Environment

Cowork Tools


전체 화면 구성

메인 페이지 About 페이지
메인 어바웃
상품 목록 페이지 상품 상세 페이지
상품 목록 상품 상세
장바구니 페이지 결제 페이지
장바구니 결제
마이 페이지 (주문 내역 관리) 마이 페이지 (주문 내역 상세)
마이페이지 주문 내역 마이페이지 주문 상세
마이 페이지 (계좌 관리) 마이 페이지 (계좌 등록 모달)
마이페이지 계좌 관리 마이페이지 계좌 등록 모달
마이 페이지 (계좌 확인/삭제) 마이 페이지 (비밀번호 재확인)
마이페이지 계좌 확인/삭제 마이페이지 비밀번호 재확인
마이 페이지 (개인정보 수정) 관리자 페이지 (사용자 관리)
마이페이지 개인정보 수정 b관리자페이지 사용자 관리uy
관리자 페이지 (상품 관리) 관리자 페이지 (주문 내역 관리)
관리자 페이지 상품 관리 관리자 페이지 주문 내역 관리
회원가입 페이지 로그인 페이지
회원가입 로그인
검색창 로딩 스피너
검색창 로딩

프로젝트 상세 기능

Layout

  • React-Router-Dom의 outlet 중첩 라우팅을 활용한 레이아웃 구성
  • Redux를 사용한 전역 상태 관리
  • 재사용을 높이기 위한 세부 컴포넌트 구성
  • 더 나은 UX를 위한 로딩 스피너 추가

Head

  • 카테고리 (Navbar) : useNavigate, NavLink를 활용한 페이지 라우터 관리
  • 제품 검색 기능 : useState, useNavigate, ChangeEvent를 활용한 검색 기능 구현

메인 페이지 (Home)

  • 이미지 슬라이더 : React-slider를 활용한 메인 페이지 이미지 슬라이더 구현

상품 페이지 (Shop)

  • 상품 목록 페이지 : productItem 컴포넌트로 재사용성을 높이고 MouseEvent와 useState를 활용한 카테고리 필터 구현
  • 상품 상세 페이지 : useParams를 활용한 상품 상세 정보 조회(ID), Redux를 활용한 장바구니 기능 구현
  • 장바구니 담기 기능 : Redux, useDispatch, useSelector, useNavigate, useParams를 활용한 장바구니 상태 관리 구현
  • 결제 페이지 : useNavigate, Redux를 활용한 페이지 라우팅, 데이터 전달 구현

장바구니 페이지 (Cart)

  • 장바구니 목록 조회 : Redux, useSelector, useNavigate를 활용한 장바구니 상태 관리 구현
  • 전체/선택 상품 구매 : Redux를 활용하여 상품 선택 유무에 따른 조건부 렌더링 구현

결제 페이지 (Buy)

  • 결제 기능 : Redux를 활용한 결제 상세 정보 출력 및 사용자 계좌 유무에 따른 조건부 렌더링 구현

마이페이지 (Mypage)

  • 주문 내역 조회
    • 상품 구매 취소 : State 변화에 따른 조건부 렌더링 구현
    • 상품 구매 확정 : State 변화에 따른 조건부 렌더링 구현
    • 상세 정보 조회 : 주문 시간(최신순)에 따른 상품 구매 내역 정렬 구현
  • 계좌 관리
    • 전체 계좌 조회
    • 계좌 등록 : Modal을 통한 계좌 등록, 은행 선택시 은행 코드 자동 입력 구현, 자리수에 따른 여러 개의 input 상태 관리
    • 계좌 삭제 : 컴포넌트를 활용한 등록 계좌 리스트 출력, 등록 계좌 여부에 따라 조건부 렌더링 구현
  • 개인 정보 수정: 비밀번호 재확인 기능 구현, React-Hook-form을 통한 코드 단순화 및 유효성 검사 구현

관리자 페이지 (Admin)

  • 전체 사용자 목록 조회
  • 상품 관리
    • 전체 상품 목록 조회
    • 상품 등록 : Select 컴포넌트를 이용한 상품 태그 등록 구현
    • 상품 삭제
    • 상품 정보 수정 : Modal 통한 상품 정보 수정 및 기존 정보 확인 기능 구현
  • 주문 내역 관리
    • 전체 거래 내역 조회
    • 거래 취소 : State 변화에 따른 조건부 렌더링 구현
    • 거래 확정 : State 변화에 따른 조건부 렌더링 구현

인증 & 인가

  • 회원가입 : React-Hook-Form을 이용한 비제어 컴포넌트 관리 및 유효성 검사 구현
  • 로그인 : useState를 통해 로그인 기능 구현
  • 로그인 인증 : App.tsx에서 useEffect를 이용한 모든 하위 페이지 로그인 인증 구현
  • 로그아웃 : Redux를 사용해 Header 로그아웃 UI 구현

프로젝트 테스트

clone project

$ git clone [email protected]:FE5-TEAM9/sweethome.git

go to project

$ cd sweethome

install npm

$ npm install

start project

$ npm run dev

버그 수정 중입니다 ... 🥲⚒️

  • Cart 장바구니 수량 없을 때 상품 개수/총액 출력 오류
  • Mypage 계좌 관리 Modal 은행 이미지 엑박
  • Mypage 은행 이미지 선택 시 은행코드 출력 오류
  • Mypage 주문내역 관리 상품 이미지 크기 수정
  • Mypage 주문 상세 정보 Modal 이미지 경로 수정
  • Shop Detail 상품 정보 부분 UI 수정
  • SearchBar 로딩 스피너 빼거나 검색 시에만 넣기
  • Admin 관리자 계정공지 UI 수정
  • Admin Product 상품 리스트 UI 수정
  • Admin User 사용자 정보 UI 수정
  • index.html 파비콘 에러
  • SubNav 스타일 바꿀 수 있으면 수정
  • 모든 페이지 로딩 스피너 확인 -> 불필요한 곳 삭제

@dev-junehee dev-junehee requested a review from happyhermann July 2, 2023 06:43
@dev-junehee dev-junehee self-assigned this Jul 2, 2023
@dev-junehee dev-junehee changed the title KDT5_Team9 프론트엔드 5기 9조 과제 제출 (김준희, 손홍빈, 조은상 박근우, 백동은) 프론트엔드 5기 9조(KDT5_Team9) 과제 제출 (김준희, 손홍빈, 조은상 박근우, 백동은) Jul 2, 2023
@dev-junehee dev-junehee changed the title 프론트엔드 5기 9조(KDT5_Team9) 과제 제출 (김준희, 손홍빈, 조은상 박근우, 백동은) KDT5_Team9 : 프론트엔드 5기 9조 과제 제출 (김준희, 손홍빈, 조은상 박근우, 백동은) Jul 2, 2023
@dev-junehee dev-junehee changed the title KDT5_Team9 : 프론트엔드 5기 9조 과제 제출 (김준희, 손홍빈, 조은상 박근우, 백동은) KDT5_Team9 : 프론트엔드 5기 9조 과제 제출 (김준희, 손홍빈, 조은상, 박근우, 백동은) Jul 2, 2023
foodeco pushed a commit that referenced this pull request Jul 2, 2023
@dev-junehee dev-junehee changed the title KDT5_Team9 : 프론트엔드 5기 9조 과제 제출 (김준희, 손홍빈, 조은상, 박근우, 백동은) KDT5 9조 과제 제출 (김준희, 손홍빈, 조은상, 박근우, 백동은) Jul 3, 2023
@dev-junehee dev-junehee changed the title KDT5 9조 과제 제출 (김준희, 손홍빈, 조은상, 박근우, 백동은) KDT5 9조 과제 제출 (김준희, 송홍빈, 조은상, 박근우, 백동은) Jul 3, 2023
Comment on lines +13 to +24
useEffect(()=> {
authenticateHandler();
}, [location])

const authenticateHandler = useCallback(async () => {
try {
const res = await authenticate()
dispatch({ type: "RETURN_USER", payload: res })
} catch (err) {
console.log("로그인 인증 실패하였습니다.")
}
}, [location])

Choose a reason for hiding this comment

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

유저 인증하는 함수를 usecallback으로 메모이제이션 하고
useEffect dependency에 location 변수를 넣어준 것이 코드를 이펙트함수를 잘 다뤄준거 같네요!

Choose a reason for hiding this comment

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

api 폴더를 사용해서 api를 다루는 함수를 잘 모듈화 시켜 재사용 하기 용이하고 코드를 보기 편하게 만들어 준 것이 정말 중요한 것 같습니다. 다만 나중에 시도해보면 좋은 것은 api를 파일별로 비슷한 종류끼리 모듈화 시키는 것이 코드를 유지보수하는데 더 도움이 되기에 시도해보시는 것도 추천드립니다!

Comment on lines +13 to +22
max-width: 1440px;
min-height: calc(100vh - (100px + 150px));
gap: 120px;

.aboutImg {
min-width: 300px;
max-width: 30vw;
max-height: calc(width / 3 * 4);
overflow: hidden;

Choose a reason for hiding this comment

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

min, max 값을 비용하는 것이 반응형 퍼블리싱이 대세가 된 모던 웹에서 정말 유용하게 쓰이는데
calc 메서드를 이용해서 잘 처리해준 바 정말 좋은 것 같습니다

Choose a reason for hiding this comment

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

현업에서도 이런 함수 값 계산 함수랑 날짜에 관련한 함수들을 util 파일로 빼서 따로 관리하곤 하는데
잘 모듈화 시켜주신거 같네요

Comment on lines +31 to +38
e.target.checked
? dispatch({ type: "CHECKED_SELECTED_CART", items: item })
: dispatch({
type: "DELETE_SELECTED_CART",
items: mySelectedCart.filter(obj => obj.id !== item.id)
});
};

Choose a reason for hiding this comment

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

event target에 따라 dispatch 함수를 조건부로 렌더링 하는 것은 생소한데 꽤 효율적으로 보입니다!
dispatch 함수 자체를 직접적으로 쓰는것 말고 다른 방법은 없을지 한번 생각해봐도 좋을거같네요!

Choose a reason for hiding this comment

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

셀렉트 옵션을 따로 contants에서 export로 따로 빼서 관리한 점 정말 칭찬해드리고 싶네요

Comment on lines +18 to +23
useEffect(() => {
if (!localStorage.getItem('token')) {
alert('관리자 전용 페이지입니다! ⚙️');
navigate('/sweethome');
}
},[])

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.

2 participants