Giter Site home page Giter Site logo

kiosk-frontend's Introduction

HEADER

😃 개요

누구나 키오스크는,

  • 키오스크 기계 없이 가입만 하면 웹에서 바로 사용이 가능합니다.
  • 누구나 쉽게 자신의 가게를 등록할 수 있습니다.(여러개 등록 가능)
  • 등록한 가게마다 상품을 등록하고 판매 할 수 있습니다.
  • 고객의 주문 상태를 관리하여 가게의 혼잡한 상황을 최소화 할 수 있습니다.

지금 바로 데모를 만나보세요.

😅 공지.

build 이슈로 어플리케이션의 주문과 사진 등록이 되지 않습니다.
더미 데이터가 등록된 아이디로 어플리케이션을 체험해볼 수 있습니다.
id : [email protected]
pw : 123qwe!@

📑 위키

개발 과정에 대한 자세한 이야기는 위키에서 만나보세요!

✍️ 주요 기능

소개영상

everyonekiosk_AdobeExpress.1.mp4

Easy Start

  • 키오스크 기계 없이 컴퓨터 또는 고객의 핸드폰으로 주문을 하고 관리할 수 있습니다.
  • 초기 비용이 거의 필요가 없습니다.

🦸🏽‍♂️ 회원가입/로그인

  • 간편하게 이메일과 이름을 입력하면 가입할 수 있습니다.

📇 가게 등록 및 관리

  • 로그인을 하면 가게를 등록하는 화면에서 자신의 가게를 쉽게 등록할 수 있습니다.
  • 가게를 토글 버튼으로 열고 닫을 수 있습니다.

🌽 상품 등록 및 관리

  • 등록된 가게가 있다면 자신의 가게 상품을 등록할 수 있습니다.
  • 고객이 상품 정보를 잘 알 수 있도록 섬네일, 가격, 상품 이름, 옵션, 세부 사항을 작성해주세요.

👨🏻‍🌾 고객 주문 관리

  • 고객이 한 주문을 손쉽게 알아볼 수 있습니다. 각 단계별 텝에서 고객 주문을 관리 할 수 있습니다.
  • 검색을 통해 고객 주문을 쉽게 찾을 수 있습니다.
  • 고객 주문 상태를 손쉽게 확인할 수 있어 손님이 많이 몰려도 가게의 혼란을 최소화할 수 있습니다.

🖥 고객 주문 화면

  • 고객은 손쉽게 자신이 원하는 상품을 고르고 주문할 수 있습니다.
  • 결재는 카카오 페이로 손쉽게 가능합니다.

📀 프로젝트 기술스택

프론트 앤드

        

백앤드

      

형상관리

인프라

    

👨‍👩‍👧‍👧 누구나 키오스크 팀

Frontend Frontend Backend Backend
고현수 조서연 정선교 조민수
고현수 조서연 정선교 조민수

🕹 아키텍쳐

아키텍쳐

🛠 CI/CD

CICD

kiosk-frontend's People

Contributors

movie42 avatar sycho09 avatar

Stargazers

sojung avatar  avatar Seoyoon Sohn avatar 정한 Rycont avatar

Watchers

 avatar

kiosk-frontend's Issues

팀프로젝트 시작

개요

팀 프로젝트를 시작하려고 합니다. 어떤 요구사항들이 있는지 전반적으로 체크합니다.

요구사항

  • 프로젝트 설계
  • 미팅
  • 프로젝트 환경 구성
  • 깃 허브 초대

테스트

개요

테스트

요구사항

테스트

Layouts style 정리

개요

Layouts 폴더의 스타일과 도메인 분리

요구사항

  • Layouts 스타일과 도메인 분리

Client Views와 Domain 나누기

요구사항

View와 Domain 분리(컴포넌트 분리하기)

  • View는 UI를 보여주는 것만 담는다.
  • 기능적인 부분은 utils나 상태를 저장한다면 커스텀 훅으로 변경한다.
  • 폴더 구조는 hooks, interface, style 등 페이지에서 공통으로 사용되는 것을 최상위 폴더에 담는다.

관리자 화면 기능 요구사항

개요

관리자 화면의 기능 요구사항

요구사항

  1. 로그인 화면

    • 사용자가 로그인을 할 수 있다.
    • 잘못된 아이디나 비밀번호 서버 오류등은 메시지로 보여준다.
    • 아이디 또는 비밀번호를 잃어버린 경우에 대한 부분은 메일로 주고 받을 수 있게 한다.(미정)
    • 로그인에 성공하면 로그인 중입니다. 라는 메시지를 사용자에게 보여주고 서버와 동기화가 완료되면 관리자 화면으로 자동으로 넘어간다.
  2. 관리자 화면

    • 로그아웃 버튼을 누르면 로그아웃 된다.
    • 고객 주문 화면을 누르면 고객 주문 화면으로 연결된다.
    • 스탭 주문 화면을 누르면 스탭 주문 화면으로 연결된다.
    • 메뉴 관리하기 버튼을 누르면 메뉴 관리 화면으로 연결된다.
  3. 상품 관리 화면

    • 등록한 상품을 전부 볼 수 있다. 각 아이템은 사진과 상품 이름 가격을 보여주어야한다.
    • 상품 관리 화면에서 상품 등록하기 버튼을 누르면 상품 등록 화면으로 이동한다.
    • 많이 팔린 순, 가격순, 이름순으로 상품을 보여줄 수 있어야한다.
    • 초기화 버튼을 누르면 나중에 등록된 순서대로 상품을 보여준다.
    • 상품을 클릭하면 선택 색상으로 변경되고 여러개를 눌러 한번에 삭제할 수 있다 .
    • 삭제하기 버튼을 누르면 모달창이 열린다.
    • 모달창에서 삭제할 상품을 다시 한번 선택할 수 있다.
    • 삭제하기를 누르면 최종적으로 상품이 삭제된다.
    • 완료하기 버튼을 누르면 상품 관리 화면으로 돌아온다.
    • 메인 화면에는 삭제한 상품이 없어야한다.
  4. 상품 등록하기

    • 상품의 사진을 등록할 수 있다.
    • 상품 이름, 가격, 정보를 작성할 수 있다.
    • 상품 등록하기 버튼을 누르면 상품이 DB에 저장된다.
    • 새로고침시에도 작성중인 정보는 남아있어야한
    • 메인화면으로 자동으로 이동한다.
    • 메인화면에서는 나중에 등록된 순서로 상품을 보여준다.

Organisms 기능 뷰 분리하기

개요

Organisms 안에 있는 컴포넌트의 기능과 뷰를 분리합니다.

요구사항

  • 기능과 뷰를 분리
  • Client, Store, Product 등 페이지에 적용되는 Organisms를 각자 적용하기

fix:Styled Component에 type 지정시 잘못 설계된 컴포넌트 변경 필요

개요

Styled-Components 설계를 변경해야합니다.

요구사항

interface를 선언한뒤 컴포넌트 props에 type을 interface로 지정해줄 때, styled component를 React.FC로 덮어쓸 필요가 없습니다. 심각한 오류를 발생시키는 것은 아니지만 필요 없는 덮어쓰기를 할 이유도 없습니다.

잘못 작성된 코드 예시

styled components가 받고 있는 props의 타입이 무엇인지 알려 줄 때, styled component를 React.FC로 만들 필요가 없습니다.

import React, { ReactNode } from "react";
import styled from "styled-components";

// 이 부분의 선언이 불필요 합니다.
const Button: React.FC<IButtonDefaultStyle> = styled.button<IButtonDefaultStyle>`
  cursor: pointer;
  font-size: 2rem;
  border: 0;
  padding: 0.8rem 1.3rem;
  border-radius: 0.3rem;
  color: ${(props) => props.theme.color.fontColorWhite};
  background-color: ${(props) => props.theme.color.gray300};
`;

interface IButtonDefaultStyle
  extends React.DetailedHTMLProps<
    React.ButtonHTMLAttributes<HTMLButtonElement>,
    HTMLButtonElement
  > {
  children: ReactNode;
}

const ButtonDefaultStyle: React.FC<IButtonDefaultStyle> = ({
  children,
  ...props
}) => {
  return <Button {...props}>{children}</Button>;
};

export default ButtonDefaultStyle;

변경해야할 설계

import React, { ReactNode } from "react";
import styled from "styled-components";

const Button = styled.button<IButtonDefaultStyle>`
  cursor: pointer;
  font-size: 2rem;
  border: 0;
  padding: 0.8rem 1.3rem;
  border-radius: 0.3rem;
  color: ${(props) => props.theme.color.fontColorWhite};
  background-color: ${(props) => props.theme.color.gray300};
`;

interface IButtonDefaultStyle extends React.ButtonHTMLAttributes<HTMLButtonElement>
 {
  children: ReactNode;
  // 커스텀 props 작성
}

// React.FC로 선언하는 것은 틀린 문법이 아니지만 코드 스타일 통일을 위해서 아래와 같이 선언하는 것으로 통일합니다.
const ButtonDefaultStyle = ({
  children,
  ...props
}: IButtonDefaultStyle) => {
  return <Button {...props}>{children}</Button>;
};

export default ButtonDefaultStyle;

위와 같이 작성했을 때, interface에 커스텀 props를 작성한다면 다음과 같은 에러를 만날 수 있습니다.

No overload matches this call.
  Overload 1 of 2, '(props: { color?: string | undefined; slot?: string | undefined; style?: CSSProperties | undefined; title?: string | undefined; ref?: ((instance: HTMLLIElement | null) => void) | RefObject<...> | null | undefined; ... 255 more ...; handler?: ((value: any) => any) | undefined; } & { ...; } & { ...; }): ReactElement<...>', gave the following error.
Type '{ children: Element[]; "data-id": string; onClick: (e: MouseEvent<HTMLLIElement, MouseEvent>) => void; }' is missing the following properties from type '{ color?: string | undefined; slot?: string | undefined; style?: CSSProperties | undefined; title?: string | undefined; ref?: ((instance: HTMLLIElement | null) => void) | RefObject<...> | null | undefined; ... 255 more ...; handler?: ((value: any) => any) | undefined; }': name, id, price
const Item: StyledComponent<"li", DefaultTheme, IProductItemProps, never>
No overload matches this call.
  Overload 1 of 2, '(props: { color?: string | undefined; slot?: string | undefined; style?: CSSProperties | undefined; title?: string | undefined; ref?: ((instance: HTMLLIElement | null) => void) | RefObject<...> | null | undefined; ... 255 more ...; handler?: ((value: any) => any) | undefined; } & { ...; } & { ...; }): ReactElement<...>', gave the following error.
    Type '{ children: Element[]; "data-id": string; onClick: (e: MouseEvent<HTMLLIElement, MouseEvent>) => void; }' is missing the following properties from type '{ color?: string | undefined; slot?: string | undefined; style?: CSSProperties | undefined; title?: string | undefined; ref?: ((instance: HTMLLIElement | null) => void) | RefObject<...> | null | undefined; ... 255 more ...; handler?: ((value: any) => any) | undefined; }': name, id, price
  Overload 2 of 2, '(props: StyledComponentPropsWithAs<"li", DefaultTheme, IProductItemProps, never, "li", "li">): ReactElement<StyledComponentPropsWithAs<"li", ... 4 more ..., "li">, string | JSXElementConstructor<...>>', gave the following error.
    Type '{ children: Element[]; "data-id": string; onClick: (e: MouseEvent<HTMLLIElement, MouseEvent>) => void; }' is missing the following properties from type '{ color?: string | undefined; slot?: string | undefined; style?: CSSProperties | undefined; title?: string | undefined; ref?: ((instance: HTMLLIElement | null) => void) | RefObject<...> | null | undefined; ... 255 more ...; handler?: ((value: any) => any) | undefined; }': name, id, pricets(2769)

위 에러는 복잡해보입니다. 하지만 메시지는 간단합니다. custom props에서 id, name, price가 필수 값이라고 알려줬는데 styled components에서 id, name, price�가 사용되고 있지 않다는 에러입니다.

해결할 수 있는 방법은 두가지가 있습니다. 커스텀 props를 옵셔널로 지정하는 방법과 stlyed components에서 사용할 props를 알려주기위한 interface를 따로 만들어서 styled-components에 알려주는 것입니다.

styled components에서 커스텀 props를 사용하기 위해서 interface 또는 types를 따로 선언하는 것을 권장하고 싶습니다. 왜냐하면 리액트 컴포넌트에 필수적으로 받는 props가 지정될 필요가 있기 때문입니다.

마무리

  • 컴포넌트를 작성할 때, 위의 예시대로 작성하시기 바랍니다.
  • 담당자를 지정하여 fix/styled-component 브랜치를 선언하고 잘못 설계된 컴포넌트를 수정해주시기 바랍니다.

로컬 환경에서 프로젝트 세팅하기

개요

main에서 프로젝트를 클론하고 로컬에서 프로젝트 세팅하기

요구사항

  • 로컬 환경에서 프로젝트 clone하기
    nodejs v16.14.2
  • server 폴더에 .env 만들고 PORT와 DB 세팅하기
  • client와 server를 동작시켜보고 발생하는 오류가 있다면 팀원에게 알리기

Client 버튼 적용하기

개요

재사용 컴포넌트로 만든 버튼을 client 페이지에 적용합니다.

요구사항

  • 사각 버튼 커스텀
  • 증감 버튼은 아이콘 버튼으로 교체
  • 기타 버튼 커스텀

fix: CSS 스타일 변경

개요

CSS 스타일을 한번 전체적으로 점검하기.

요구사항

  • 글자 크기가 10px 기준이기 때문에 폰트가 적용되면서 갑자기 변한 글자 크기를 다시 변경해야합니다.
  • theme에 정리된 화면비를 활용하여 수정
  • 색상 바꾸기... 색상이 정말 별로다.

Form UI 컴포넌트

개요

Form UI 컴포넌트를 정리합니다.

요구사항

  • 컴파운트 디자인 패턴 적용하기
  • ProductUpdateForm
  • Login
  • CreateProductPage
  • StoreCreatePage
  • StoreUpdatePage
  • SignUpPage
  • Options Container

프로젝트 리팩토링 해보기

개요

요구사항

  • View와 Domain 분리(컴포넌트 분리하기)

    • 관심사 분리
    • 제어 역전
    • 의존성 주입
    • Headless UI
    • View는 정말 UI를 보여주는 것만 담는다.
    • 기능적인 부분은 utils나 상태를 저장한다면 커스텀 훅으로 변경한다.
  • 폴더 구조 바꾸기

  • HTTP Client 라이브러리는 Axios 사용하기

    • 에러 처리가 더 편하다.
  • Service, Instance

    • HTTP instance
    • Authorization Service
  • Error 핸들링

  • 주석을 지워도 이해가 되는 코드 작성해보기.

  • 추후에 할 수 있으면 하기 NextJS(SSR, SSG)

Admin View와 Domain 분리하기

요구사항

View와 Domain 분리(컴포넌트 분리하기)

  • View는 UI를 보여주는 것만 담는다.
  • 기능적인 부분은 utils나 상태를 저장한다면 커스텀 훅으로 변경한다.
  • 폴더 구조는 hooks, interface, style 등 페이지에서 공통으로 사용되는 것을 최상위 폴더에 담는다.

서버 Typescript 세팅하기

개요

Express Server를 Typescript로 세팅합니다.

요구사항

  1. 패키지 설치
  • typescript, type-node type-node-dev, tsc
  • DB와 연결후 확인 메시지 확인

주문 에러

개요

  • 카카오톡 결제시 주문이 안됐을때 해결하는 방법 생각해보기
  • 삭제된 상품 정보를 불러올 때, 에러가 발생함
    • 삭제된 상품은 DB에 없다. 주문 상태 페이지에서 주문 요청 상품을 불러올 때는 DB에 저장된 상품을 가져와 ID가 일치하는 값을 불러오는 형식이기 때문에 undefined가 반환됨으로 에러가 발생한다. Backend에서 상품을 삭제하는 방법을 수정해야하는 문제라 지금 당장 해결할 수 없다.

요구사항

  • 카카오톡 결제시 주문이 안됐을때 해결하는 방법 생각해보기

랜딩 페이지 만들기

개요

랜딩 페이지

요구사항

랜딩 페이지에서 회원가입과 로그인 버튼을 누를 수 있다.
회원 가입 버튼을 누르면 회원가입을 할 수 있다.
홈페이지 약관을 확인 후에 다음으로 가기 버튼을 누르면 회원가입 서식 페이지로 이동한다.
서식을 작성한 뒤에 가입하기를 누르면 가입이 완료된다.

fix:자동 로그인과 로그아웃 문제

개요

  • 끄고 다시 들어갔는데 로컬스토리지가 남아있기 때문에 사이트를 되면 로그인을 새로 할 수 가 없다.
  • 로그우아웃을 눌렀을 때만 로컬스토리지 기록이 지워지는데 이부분 해결해야함

요구사항

자동 로그인이 문제입니다. JWT의 유효기간을 확인하고 로그아웃을 하는 방법을 백앤드와 이야기해서 해결하는 방법이 좋을지 다른 방법이 좋을지 생각해봐야합니다.
로컬스토리지에 유저 정보를 저장하는게 좋은 방법인지 고민해봐야할것같습니다.

고객 화면 기능 요구사항

개요

고객이 보는 화면의 기능 요구 사항입니다.

요구사항

  1. 고객이 main 화면에서 상품을 클릭한다.
  2. 클릭한 상품에 해당하는 모달창이 생긴다.
    • 모달창에서는 사진과 상품 이름, 상품 구성을 볼 수 있다.
    • 수량을 올릴 경우 구성의 수량도 변경되어야한다. 가격도 변경되어야한다.
    • 취소하기를 누르면 하던 작업을 취소하고 메인 화면으로 돌아갈 수 있다.
    • 주문하기를 누르면 하단 목록에 고른 상품수와 주문 가격에 반영되어야한다.
  3. 고객이 주문하기 버튼을 누르면 order 화면으로 넘어간다.
    • order 화면에서 고객이 고른 모든 상품을 리스트로 볼 수 있다.
    • 같은 상품은 묶어서 보여주어야한다.
    • 상품 주문 수량을 수정할 수 있다.
    • 수정한 부분이 총 상품 수의 갯수와 가격에 반영되어야한다.
    • 주문하기 버튼을 누르면 결제 화면으로 넘어간다.
  4. payment 화면은 카드를 읽는 화면이다.
    • 카드 삽입은 실재로 구현하기 어렵기 때문에 버튼을 누르면 결제중 화면으로 넘어간다.
    • 결제가 끝나면 영수증 출력 모달을 띄운다. 예, 아니요를 받아 state에 반영한다.
    • 결제가 완료되면 주문 번호가 자동으로 생성된다. 주문 번호는 자동으로 카운트 되어야한다.
    • 확인을 누르면 메인 화면으로 돌아가고 총 상품 수와 총 가격은 초기화되어야한다.

주소창 에러

개요

잘못된 주소를 요청하거나 새로고침을 했을 때, 간혹 userID, storeId가 유실되어 :userId로 주소창에 띄어집니다.

요구사항

  • 주소창 ID 새로고침했을 때, :id로 뜨는 문제 해결하기

버튼 만들기

개요

각 페이지에서 필요에 따라 따로 만들었던 버튼을 재사용되는 컴포넌트로 생성한 뒤에 각 페이지, 유기체, 분자 단위에서 재사용합니다.

요구사항

  • Toggle 버튼
  • 일반 사각 버튼(기본형)
  • 언더바 버튼(애니메이션이 들어간 버튼)
  • 증감 버튼(+, -)
  • 아이콘 버튼

백앤드 기능 요구사항

개요

백앤드 기능 요구사항을 정리한 문서입니다. 이 문서에서 이슈를 만들어 코드를 작성합니다.

요구사항

사용자

  • #21
    • 이메일, 아이디, 사용자 이름, 실명을 입력할 수 있다.
    • 이메일과 사용자 이름은 unique 필드로 설정하고 사용자에게 미리 알려준다.
    • 사용자가 회원 가입 완료를 누르면 DB에 정보를 저장한다.
  • 로그인
    • 사용자가 이메일과 비밀번호를 입력해서 로그인 할 수 있다.
    • 로그인에 성공하면 true와 jsonwebtoken을 발행한다.
    • 로그인에 실패했을 때 false와 왜 실패했는지 error 메시지를 프론트에서 받을 수 있어야한다.
  • 회원 정보 수정
    • 사용자가 자신의 사용자 이름과 비밀 번호를 바꿀 수 있어야한다.
  • 회원 탈퇴
    • 사용자가 자신의 회원 정보를 DB에서 삭제할 수 있어야한다.
    • 삭제시 DB에서 사용자의 정보는 삭제한다.
    • 사용자 사용 내역은 남아있는다.

상품 관리

  • 상품 등록
    • 상품 이름, 상품 가격, 상품 상세 정보, 상품 섬네일을 저장할 수 있다.
    • 상품 이름을 중복으로 입력하지 못하도록 경고 메시지를 보내준다.
  • 상품 삭제
    • 상품 관리 화면에서 상품을 여러개 선택해 삭제할 수 있다.
  • 상품 수정
    • 상품 관리 화면에서 상품을 개별적으로 수정할 수 있다.
  • 상품 상세 정보
    • 상품 상세 정보를 볼수 있고 상세 정보 화면에서도 수정과 삭제를 할 수 있다.

주문번호

  • 프론트에서 발행한 주문 번호와 주문 번호에 따른 상품 목록 생성
    • 프론트에서 전송한 주문 목록을 받을 수 있다.
    • 상품 주문을 완료하면 서버에서 주문번호를 발행해 주문 목록과 함께 DB에 저장한다.
  • 주문 번호 상품 수정
    • 주문 번호를 알고 있으면 목록에 있는 상품의 개수를 조정하거나 추가 주문이 가능하다.
  • 주문 번호 상품 삭제
    • 주문 번호를 알고 있으면 상품을 일괄 삭제 또는 부분 삭제 할 수 있다.
  • 주문 번호 상품 상세 정보
    • 주문 번호를 알고 있으면 해당 주문 번호의 주문 상세 정보를 볼 수 있다.

기타

그밖에 기능을 만들면서 수정해야할 부분이 있다면 논의 후 바로 바로 반영하도록 하겠습니다.

자동 로그인 로직 에러

개요

자동 로그인 로직 에러

요구사항

로그인 정보가 로컬스토리지에 저장되어있을 때, recoil로 사용자 정보를 불러오는데 그 사이에 isLogin이 false가 되면서 router에서 로그인 정보가 유실되어 없는 페이지로 사용자에게 출력되는 문제가 있습니다.

어떻게 해결할 수 있을까요?

fix:고객 주문 페이지 수정해야할 것들

개요

고객 주문 페이지 수정 사항입니다.

요구사항

  • 고객 주문 관리 페이지 라우팅 깨짐
  • complete와 done으로 나눠서
  • 검색창에 엔터 버튼 만들기
  • 검색창 실시간 검색(쓰로틀링과 디바운싱)

관리자 메뉴 화면 기능 요구사항

개요

관리자 메뉴 화면

요구사항

  • 로그아웃 버튼을 누르면 로그아웃 된다.
  • 고객 주문 화면을 누르면 고객 주문 화면으로 연결된다.
    • 고객 주문 화면 버튼은 회색이다.
    • 토글 버튼을 누르면 매장을 열겠냐고 모달창을 띄어주고 확인을 누르면 토글 버튼이 파란색으로 활성화된다.
    • 고객 주문화면도 진한 남색으로 활성화 된다.
    • 활성화가 되어야 고객 주문 화면 버튼을 누를 수 있고 누르면 고객 주문 화면으로 연결된다.
  • 스탭 주문 화면을 누르면 스탭 주문 화면으로 연결된다.
  • 메뉴 관리하기 버튼을 누르면 메뉴 관리 화면으로 연결된다.

상품 관리 화면

개요

상품 관리 화면의 기능을 만듭니다.

요구사항

  • 등록한 상품을 전부 볼 수 있다. 각 아이템은 사진과 상품 이름 가격을 보여주어야한다.

  • 상품 등록, 상품 삭제, 상품 수정 버튼이 있다.

  • 상품 관리 화면에서 상품 등록하기 버튼을 누르면 상품 등록 화면으로 이동한다.

- [ ] 많이 팔린 순, 가격순, 이름순으로 상품을 보여줄 수 있어야한다.
- [ ] 초기화 버튼을 누르면 나중에 등록된 순서대로 상품을 보여준다.
판매량 관리는 상품 세부 사항 화면에서 구현해야 할 것 같습니다.

  • 상품 삭제 버튼을 눌렀을 때

    • 상품을 클릭하면 선택 색상으로 변경되고 여러개를 눌러 한번에 삭제할 수 있다 .
    • 하단 상태 메뉴에서 삭제하기 버튼을 누르면 모달창이 열린다.
    • 하단 상태 메뉴에서 취소하기 버튼을 누르면 삭제 과정이 취소된다.
    • 모달창에서 삭제할 상품을 다시 한번 선택할 수 있다.
    • 삭제하기를 누르면 최종적으로 상품이 삭제된다.
    • 돌아가기 버튼을 누르면 상품 삭제 과정을 취소한다.
    • 삭제 완료 후 완료하기 버튼을 누르면 상품 관리 화면으로 돌아온다.
    • 메인 화면에는 삭제한 상품이 없어야한다.
  • 상품 수정 버튼을 눌렀을 때

    • 상품을 클릭하면 선택 색상으로 변경되고 여러개를 눌러 한번에 수정할 수 있다 .
    • 하단 상태 메뉴에서 수정하기 버튼을 누르면 모달창이 열린다.
    • 하단 상태 메뉴에서 취소하기 버튼을 누르면 삭제 과정이 취소된다.
    • 모달창에서 수정할 상품을 보여주고 개별 상품을 수정할 수 있다. 개별 상품에는 기본적으로 기존에 입력되었던 정보를 불러와야한다.
    • 수정하기 버튼을 누르면 최종적으로 수정된다.
    • 돌아가기 버튼을 누르면 상품 삭제 과정을 취소한다.
    • 수정 완료 후 완료하기 버튼을 누르면 상품 관리 화면으로 돌아온다.
    • 메인 화면에는 수정한 상품이 반영되어야한다.

로그인 화면

개요

로그인 화면

요구사항

  • 사용자가 로그인을 할 수 있다.
  • 잘못된 아이디나 비밀번호 서버 오류등은 메시지로 보여준다.
  • 아이디 또는 비밀번호를 잃어버린 경우에 대한 부분은 메일로 주고 받을 수 있게 한다.(미정)->백앤드로 넘기겠습니다.
  • 로그인에 성공하면 로그인 중입니다. 라는 메시지를 사용자에게 보여주고 서버와 동기화가 완료되면 관리자 화면으로 자동으로 넘어간다.

ManageOrder 페이지 뷰 도메인 분리

개요

뷰, 도메인 분리하기

요구사항

  • View는 UI를 보여주는 것만 담는다.
  • 기능적인 부분은 utils나 상태를 저장한다면 커스텀 훅으로 변경한다.
  • 폴더 구조는 hooks, interface, 페이지에서 공통으로 사용되는 것을 최상위 폴더에 담는다.
  • style은 도메인 하위 페이지 마다 담는다.

CreateProductPage 기능이 완전하지 않습니다

개요

CreateProductPage의 옵션에 에러가 있습니다. 기능이 완전하지 않습니다.
Product가 등록된 다음 Option을 등록할 때 옵션이 하나만 등록됩니다.

요구사항

  • Product Form 필드를 추가할때마다 Option이 새로운 컴포넌트로 랜더링 되도록 변경이 필요합니다.(이전Option과 연결이 되면 안 됨. 필드가 새로 추가될때마다 Option에 관련된 실행컨택스트가 새로 생성되어야합니다.)
  • Product를 등록하고 다시 Client로 넘어왔을 떄, Product의 ID와 OPtion 필드의 ID가 일치해야합니다. 그런데 이건 정말로 답이 없습니다. 그냥 index로 순서가 뒤바뀌지 않기만을 기도해야합니다. 완전한 수정을 위해서는 백앤드를 수정해야하는데...

Landing 페이지 리펙토링

개요

뷰, 도메인 분리하기

  • View는 UI를 보여주는 것만 담는다.
  • 기능적인 부분은 utils나 상태를 저장한다면 커스텀 훅으로 변경한다.
  • 폴더 구조는 hooks, interface, 페이지에서 공통으로 사용되는 것을 최상위 폴더에 담는다.
  • style은 도메인 하위 페이지 마다 담는다.

상품 등록하기 화면 만들기

개요

상품 등록하기

요구사항

  • 상품의 사진을 등록할 수 있다.
  • 상품 이름, 가격, 정보를 작성할 수 있다.
  • 상품 등록하기 버튼을 누르면 상품이 DB에 저장된다.
  • 새로고침시에도 작성중인 정보는 남아있어야한다.
  • 상품 등록이 완료되면 메인화면으로 자동으로 이동한다.
  • 상품 관리 메인화면에서는 나중에 등록된 순서로 상품을 보여준다.

서버 세팅

개요

Apollo-server-express를 사용하여 서버를 세팅합니다.

요구사항

Language : Typescript
Server : Apollo-server, Apollo-server-express
ORM : Prisma
Query : Graphql,
DB : Mongo�DB Atlas

  • Graphql tools 설치 및 개발 환경 구성
  • #19

고객 주문 관리 화면 기능 요구사항

개요

고객 주문 관리 화면 기능 요구사항입니다.

요구사항

  1. main 화면

    • 고객 화면에서 주문한 데이터를 받아 리스트를 보여준다.
    • 취소 버튼을 누르면 취소 모달창을 보여준다.
    • 접수 버튼을 누르면 현재 접수 현황 모달창을 보여준다.
    • 완료 버튼을 누르면 주문 완료를 위한 모달창을 보여준다.
    • 취소가 완료되면 취소 버튼에 빨간색이 들어오고 접수, 완료 버튼은 아이템 내에서 사라진다.
    • 완료 절차가 끝나면 완료 버튼에 옅은 파란색이 들어오고 접수, 취소 버튼은 아이템 내에서 사라진다.
  2. 취소 버튼을 눌렀을 때

    • 취소 모달창이 화면에 나타난다.
    • 일부 상품을 취소 항목에서 제외할 수 있다. 제외하지 않으면 일괄 취소가 된다.
    • 취소 사유를 반드시 선택한다. 선택하지 않으면 취소하기 버튼을 누를 수 없다.
    • 취소가 완료되면 취소가 되었다는 메시지가 모달창에 표시되고 돌아가기 버튼이 파란색으로 변한다. 취소하기 버튼은 사라진다.
    • 돌아가기 버튼을 누르면 main화면으로 돌아간다.
  3. 완료 버튼을 눌렀을 때

    • 완료하기 버튼을 누르면 완료 모달창이 표시된다.
    • 주문 번호와 주문한 상품을 전부 볼수 있다.
    • 완료하기 모달 안에서 완료하기 버튼을 누르면 상품 상태가 마감된다.
    • 돌아가기 버튼을 누르면 다시 리스트로 돌아간다.
  4. 접수 버튼을 눌렀을 때

    • 접수 현황 모달창이 표시된다. 주문번호와 함께 상품 현황이 표시되어야한다.
    • 취소 모달에서 선택적으로 취소한 상품은 빨간색으로 표시된다.
    • 접수 화면에서 비어있는 원을 클릭하면 초록색으로 변경된다.
    • 비어있는 원이 있는 경우 확인 버튼을 누르면 아무런 동작 없이 main화면으로 돌아간다. 단 초록색으로 선택한 값은 그대로 남아있어야한다.
    • 모든 상품에 빨간불이나 초록색 불이 들어와있는 경우에 확인 버튼을 누르면 자동으로 완료 모달창이 표시된다.
    • 이후 로직은 완료 로직을 따른다.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.