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

Y_FE_Toy1_Team9 (9굴 WIKI) #3

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

Y_FE_Toy1_Team9 (9굴 WIKI) #3

wants to merge 311 commits into from

Conversation

2YH02
Copy link

@2YH02 2YH02 commented Sep 22, 2023

직원들을 위한 위키 사이트 - 9굴 WIKI

main

💁 프로젝트 정보

회사 공지와 이미지들을 쉽게 수정하고 확인할 수 있고,

출퇴근 시간을 확인할 수 있는 직원들을 위한 위키 사이트 입니다.


개발기간: 2023.09.15 ~ 2023.09.22


🌐 배포 주소

배포 주소: https://chipper-puppy-71c021.netlify.app
깃허브 레포지토리 : https://github.com/toy-1/wiki


🚖 개발 팀 소개

이용훈 이승연 양재준 김소정 서지수
@2YH02 @ewinkite @yangjaejun @KSJT @jseo9732
갤러리 페이지 CRUD 및 세부 기능 로그인 페이지 로그인, 회원가입 기능 및 유저 플로우 작성 WIKI 페이지 CRUD 및 세부 기능 메인 페이지 이미지, WIKI 연동 및 세부 기능 메인 페이지 출퇴근 기록 및 세부기능

💻 개발 스택

🌙 환경

🌙 개발

🌙 소통





💡 User Flow

230921_WIKI_userflow


🗂 디렉토리 구조

📦 public
📦 src
 ┣📦 components        공통 또는 페이지별로 활용되는 컴포넌트가 포함된 폴더입니다.
 ┃ ┣ 📦 common
 ┃ ┣ 📦 gallery
 ┃ ┣ 📦 home
 ┃ ┣ 📦 login
 ┃ ┣ 📦 wiki
 ┃ ┣ 📦 styles
 ┃ ┣ 📦 utils
 ┣📦 db/wiki
 ┣📦 pages              Router를 사용하여 이동할 큰 단위의 컴포넌트가 포함된 폴더입니다.
 ┃ ┣ 📦 gallery
 ┃ ┣ 📦 home
 ┃ ┣ 📦 login
 ┃ ┣ 📦 wiki
 ┃ ┣ 📦 styles
 ┃ ┣ 📦 utils
 ┣📜 App.tsx
 ┣📜 AppRouter.tsx
 ┣📜 main.tsx
 ...


🤝 협업 방식

커밋 컨벤션, 코딩 컨벤션, 깃허브 규칙 등의 내용은 아래의 노션 페이지를 참고해주세요!

🔗 노션 페이지



🛠️ 주요기능

⭐ 출퇴근 기록

  • 출근 시간과 퇴근 시간을 기록할 수 있고 헤더에 출근 경과시간이 표시됩니다.

⭐ 메인페이지 와 WIKI, Gallery 페이지 연동

  • 메인 페이지에서 WIKI에 있는 중요한 공지사항을 슬라이드로 보여줍니다.
  • 메인 페이지에서 Gallery 페이지에 등록된 최신 사진 3개를 가져와 보여줍니다.

⭐ 회원가입, 로그인 기능 및 인증

  • 회원가입과 로그인이 가능합니다.
  • 인증이 안된 유저가 다른 페이지로 접근할 시 로그인 페이지로 이동됩니다.

⭐ WIKI 페이지 게시물 CRUD

  • WIKI 페이지에서 게시물을 CRUD 할 수 있습니다.

⭐ Gallery 페이지 게시물 CRUD

  • Gallery 페이지에서 게시물을 CRUD 할 수 있습니다.


🔍 팀원별 세부 구현 사항

이용훈: 📷 갤러리 페이지

1. 카테고리 추가

앨범 상위 카테고리 추가

카테고리등록

💡 카테고리 편집에서 원하는 앨범 카테고리를 만들 수 있습니다.
카테고리를 생성하면 파이어베이스 데이터베이스에 생성 날짜와 고유한 ID 값을 가지고 저장이 됩니다.

2. 앨범 추가

이미지들을 저장할 앨범 카테고리(폴더) 생성

앨범등록

💡 카테고리 편집에서 원하는 앨범을 만들 수 있습니다. 앨범을 생성하면
파이어베이스 데이터베이스에 생성 날짜, 상위 카테고리 ID, ID 값을 가지고 저장이 됩니다.

3. 이미지 추가

앨범 폴더 내부에 이미지 추가

이미지등록

💡 원하는 앨범 카테고리에 원하는 이미지를 드래그나 클릭으로 추가합니다.
추가 시 이미지 미리보기, 이름, 용량, 파일타입이 화면에 보이고,
파이어베이스 스토리지에 해당 앨범의 ID 값을 이름으로 하는 폴더에 저장됩니다.

4. 이미지 삭제

앨범 폴더 내부에 이미지 삭제

이미지삭제

💡 앨범에 있는 이미지를 삭제합니다.
삭제 시 파이어베이스 스토리지에 저장 돼 있던 해당 이미지가 삭제됩니다

5. 이미지 상세보기

이미지 방향 전환 및 크기 조절

이미지전환

💡 이미지 클릭 시 상세보기가 가능하고 버튼 클릭과 화살표 키보드로 다음 이미지로의 방향 전환이 가능합니다.
또한 이미지 크기 조절이 가능하도록 기능을 추가하였습니다.

이승연: 🔑 로그인 페이지

1. 접근 제한 라우팅

로그인 여부에 따른 제한 접근 라우팅

1라우팅

💡 해당 홈페이지는 사내 사이트로, 로그인 정보가 없는 경우 login페이지로 이동합니다.
로그아웃하지 않았다면 탭 종료 후 재접속하여도 로그인 상태를 유지합니다.

2. 회원 가입

회원 가입

2회원가입성공

💡 회원 가입 버튼 클릭시 회원 가입이 가능한 다이얼로그가 노출됩니다.
ID와 PW 값을 입력후 가입하기 버튼을 클릭시 User로 저장되며 해당 계정으로 사이트 로그인이 가능합니다.

회원가입 유효성 검사

5회원가입유효성검사

💡 프로세스에 따라 회원가입 유효성 검사 후 얼럿을 노출합니다.
정상적으로 입력이 완료되었다면 로그인 페이지로 진입합니다.

3. 로그인

로그인

3로그인성공

💡 회원가입한 계정의 ID와 PW 값을 입력후 들어가기 버튼을 클릭하여 사이트 로그인이 가능합니다.

로그인 유효성 검사

6로그인유효성검사

💡 프로세스에 따라 로그인 유효성 검사 후 얼럿을 노출합니다.
정상적으로 입력이 완료되었다면 메인 페이지로 진입합니다.

4. 로그인 정보 전달

로그인한 유저 정보 전달

4인증정보내려주기

💡 현재 사이트 로그인 중인 User 정보를 전달합니다.
이를 통해 Header와 WIKI페이지의 등록/수정/삭제 등의 기능 구현을 지원합니다.

양재준: 📂 WIKI 페이지

1. 위키 페이지 로딩 & 초기화

위키 데이터 로딩 및 초기 설정

위키 페이지 로딩 & 초기화

💡 사용자가 위키 페이지에 접속하면, 확인할 위키를 선택 할 수 있는 사이드 메뉴와 위키의 내용을 확인하고 편집 할 수 있는 화면이 표시됩니다.
데이터베이스의 부하를 방지 하기 위해 상위 위키 항목들만 사이드 메뉴에 표시되며, 그 중 첫번째 위키가 우측 화면에 표시됩니다.

2. 하위 위키 항목 표시

하위 위키 항목 표시

하위 위키 항목 표시

💡 사용자가 상위 위키의 화살표 버튼을 클릭하면, 해당 위키의 하위 위키 항목들을 불러옵니다.
사용자는 상위 위키를 하위 위키들을 묶는 카테고리 개념으로 활용할 수 있으며, 위키의 계층적 구조와 연관된 내용을 한눈에 파악할 수 있습니다.

3. 위키 작성

새로운 위키 작성

새로운 위키 작성

💡 사용자는 '등록' 버튼을 통해 새로운 위키를 작성할 수 있습니다.
작성된 위키 항목은 파이어베이스 데이터베이스에 저장되며, 고유한 ID와 함께 등록됩니다.
위키는 마크다운 형식으로 작성이 가능하며, 사용자가 폼에 입력하는 내용은 실시간으로 상태에 반영됩니다.
이를 통해 사용자는 입력 내용을 동적으로 관리하고 확인할 수 있습니다.
또한, 드롭다운 메뉴를 통해 상위 위키를 선택하여 해당 위키의 하위 항목으로 등록이 가능합니다.

4. 위키 편집

선택한 위키 항목의 내용 수정

위키 편집

💡 사용자는 '수정' 버튼을 클릭하여 해당 항목의 내용을 수정할 수 있습니다.
수정이 완료되면 '저장' 버튼을 클릭하여 변경 내용을 데이터베이스에 업데이트합니다.
드롭다운 메뉴를 통해 상위 위키를 선택 및 변경 할 수 있습니다. 이떄, 하위 위키가 등록된 상위 위키의 경우 다른 위키의 하위 위키로는 등록 할 수 없습니다.

5. 위키 삭제

위키 삭제

위키 항목 삭제

💡 '삭제' 버튼을 클릭하면, 해당 항목을 데이터베이스에서 완전히 제거할 수 있습니다.
삭제하기 전에 사용자에게 확인 절차를 거칩니다, 이를 통해 실수로 인한 삭제를 방지할 수 있습니다.
하위 위키가 등록된 상위 위키의 경우 하위 위키가 삭제 될 수 있음을 알리는 메시지를 표시하고, '확인'을 클릭 할 시 해당 위키의 하위 위키도 동시에 삭제됩니다.

서지수: 🌐 헤더 및 메인 페이지

1. 헤더 통근 다이얼로그

출근 기능

1
1-1

💡 통근 다이얼로그에서 출근 버튼을 클릭하면 파이어스토어에 출근 시간이 저장되고 헤더에 근무 시간(근무 타이머)가 표시됩니다.
로그아웃, 새로고침을 해도 파이어스토어에서 출근 및 퇴근 시간을 요청하여 표시해줍니다.

퇴근 기능

2

💡 통근 다이얼로그에서 퇴근 버튼을 클릭하면 파이어스토어에 퇴근 시간이 저장되고 헤더에 총 근무한 시간이 표시됩니다.

2. 로그아웃 기능

3 로그아웃

💡 파이어베이스의 `signOut`기능을 이용하여 로그아웃을 한 뒤 로그인 페이지로 이동합니다.

3. 최근 작성 위키 조회 기능

4 최근 위키

💡 파이어스토어에 저장된 위키 중 가장 최근에 작성된 2개의 게시글을 요청하여 표시해줍니다.
게시물을 클릭하면 해당 게시글로 이동합니다.

김소정: 🌐 메인 페이지

1. 메인 캐러셀

홈 화면 공지사항을 보여주는 캐러셀 구현

carousel

💡 캐러셀이 3초마다 다음 슬라이드를 보여줍니다.

carouseljumping

💡 하단의 버튼을 클릭하면 해당 인덱스의 슬라이드로 캐러셀이 점프합니다.

carouselreacting

💡 윈도우가 resize할 때마다 캐러셀의 width가 변화합니다.

2. 홈 화면 갤러리 미리보기 구현

gallerypreview

💡 갤러리에 최근 업데이트 된 사진을 3개까지 미리 보여줍니다.
클릭하면 갤러리 페이지로 이동합니다. 최초 로딩 시에는 스켈레톤 애니메이션이 보입니다. 

2YH02 and others added 30 commits September 15, 2023 11:25
사이드바 설정 기능 및 전체적인 갤러리 페이지 레이아웃
Env: firebase.ts내 auth추가
Refactor: 홈 화면 레이아웃 코드 변경
로그인 여부에 따른 페이지 라우팅 기능, 로그인 유저 ID값 전달 기능 구현
갤러리 페이지 이미지 상세보기 및 기능 추가 및 카테고리바 디자인 수정
seungjun222 pushed a commit that referenced this pull request Sep 22, 2023
noSPkeepgoing added a commit that referenced this pull request Sep 22, 2023
[feat] 회원가입 성공 시 새로운 유저 database 생성
Eojoonhyuk added a commit that referenced this pull request Sep 22, 2023
Eojoonhyuk added a commit that referenced this pull request Sep 22, 2023
feat: 위키 및 갤러리 라우팅 설정
Eojoonhyuk pushed a commit that referenced this pull request Sep 22, 2023
Sinary00 pushed a commit that referenced this pull request Sep 22, 2023
위키 마크다운 에디터 기능을 추가한다.
im-na0 pushed a commit that referenced this pull request Sep 22, 2023
Feat: Timer 페이지 마크업
TaePoong719 pushed a commit that referenced this pull request Sep 22, 2023
Copy link

@minsoo-web minsoo-web left a comment

Choose a reason for hiding this comment

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

우선 정말 짧은 시간동안 고생 많으셨습니다!!!

전반적으로 고쳤으면 하는 내용들은

  1. 변수명 개선 (축약형, 의미가 부족한 변수명)
  2. 매직넘버 개선
  3. 컴포넌트 복잡도 개선 (리렌더링 최적화)
  4. 불필요한 코드 삭제 (주석 포함)

등이 꼽혔던 것 같습니다.

좋았던 점은, 로그인이 안 된 유저의 진입을 막는 부분을 시도하신 부분, 캐로샐 직접 구현, ESC 를 통한 모달창 닫기 등 ux 고려, 드래그앤드롭으로 이미지 업로드 하는 ux, 키보드 화살표를 통한 제어 등 ux에 신경을 많이 쓰신 부분들이 정말 좋았습니다.

개선할 점들이 많이 꼽혔지만, 이번 프로젝트를 경험으로 많은 것을 배우셨으면 좋겠다는 마음과 함께 리뷰를 마치겠습니다.

고생하셨습니다!

스타일 관련된 리뷰는 최소화 했습니다.

Choose a reason for hiding this comment

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

issue와 PR을 통해 협업하신 점 너무 멋집니다.
PR을 생성할 때 closed #이슈번호 라고 명시해두면, 해당 PR이 닫힐 때 issue도 같이 닫히는데 다음에 한 번 적용해보시면 좋을 것 같아요

그리고 issue template에 yml 파일로도 템플릿화가 가능한데, 다음에 찾아보시고 적용해보시면 좋을 것 같습니다~!

Comment on lines +11 to +12
const [uid, setUid] = useState("");
const [email, setEmail] = useState("");

Choose a reason for hiding this comment

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

전체에서 사용되는 값을 state로 관리하셨네요, 필요에 따라서 Router에서 전달할 수 있도록 하게하신 것 같은데 이 방식 보다는 context API 를 사용했으면 어땠을까 싶습니다. 그럼 불필요하게 router에게 전달할 필요도 없어지고 props drilling 도 피할 수 있고 최상단에 선언된 provider를 통해 모든 컴포넌트가 접근할 수 있는 state가 되어서 관리가 편합니다.

context api 관련해서 공부가 꺼려지신다면 정말정말 잘 설명된 레퍼런스가 있으니 남겨놓고 가겠습니다.
https://velog.io/@velopert/react-context-tutorial

}, []);

return (
<>

Choose a reason for hiding this comment

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

이 리뷰를 마지막으로 불필요한 wrapper 가 없는지 확인해봅시다!

padding: string;
normal?: string;
disabled?: boolean;
onClick?: () => void;

Choose a reason for hiding this comment

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

typescript에 VoidFunction 이라는 유틸 타입이 있는데 자주 애용하는 편입니다. 똑같이 동작하는데 자동완성이 되어서 편해요!

@@ -0,0 +1,31 @@
import * as style from "./buttonStyle";

Choose a reason for hiding this comment

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

파일 하나하나만 볼 때는 상관 없지만 폴더구조로 봤을 때 조금 난해하지 않나요?

image

대소문자라도 통일이 되었으면 그래도 바로 다음에 style이 붙어서 정렬이 되었을텐데요!
이런 이슈를 막고자 컴포넌트별로 폴더를 따로 관리하는 것이 좋습니다.

예를 들어 지금은 test code도, storybook도 없지만 다음과 같은 경우가 생긴다면 무척이나 어지러울 겁니다.

Button.tsx
Button.styles.ts
Button.stories.tsx
Button.test.ts
Button.cy.ts
Foo.tsx
Foo.styles.ts
....

폴더별로 따로 관리한다면 이런 것을 막을 수 있게 됩니다.

@@ -0,0 +1,37 @@
import { HasChildMap, Wiki } from "@/components/wiki/types/WikiCommonType";

Choose a reason for hiding this comment

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

type 을 import 할 때는 import type {} from "" 으로 명시하는 게 좋습니다.
무슨 차이인지를 한 번 찾아보고 답변으로 남겨보시는 것도 좋을 것 같아 이유는 스스로의 공부로 남겨보겠습니다 !

Comment on lines +67 to +68
padding={"0.38rem 0.69rem"}
margin={"0 0.31rem 0 0"}

Choose a reason for hiding this comment

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

Suggested change
padding={"0.38rem 0.69rem"}
margin={"0 0.31rem 0 0"}
padding="0.38rem 0.69rem"
margin="0 0.31rem 0 0"

string 만 전달할 때는 중괄호로 감싸지 않으셔도 됩니다!

e: React.ChangeEvent<HTMLSelectElement>,
) => {
const newParentID = e.target.value;
const isNewWiki = () => form.wikiID === "";

Choose a reason for hiding this comment

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

함수여야 하는 이유가 따로 있을까요?! 🤔

@@ -0,0 +1,29 @@
import "@toast-ui/editor/dist/toastui-editor.css";
import { Editor } from "@toast-ui/react-editor";

Choose a reason for hiding this comment

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

많은 에디터가 있었을텐데, 그중 toast-ui 를 사용한 이유도 README에 정리가 되었었으면 좋았겠네요, 라이브러리를 활용할 때는 그 라이브러리를 선택한 이유가 분명할 수록 좋습니다.

return (
<Styled.WikiTop>
<Styled.WikiTitle>{title}</Styled.WikiTitle>
<div>

Choose a reason for hiding this comment

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

필요한 wrapper인가요?

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