2023. 9. 23. 18:01ㆍGithub 프로젝트/음식점 포스 프로그램
지난 시간에 이어서 프론트엔드 셋팅 및 백엔드 셋팅까지 진행해 보았습니다.
이번시간에는 화면단 설계에 들어가보도록 하겠습니다.
Github : https://github.com/BerkleyLim/foodstor_pos
개발 하기 앞써 먼저 요구 사항을 확인 하도록 하겠습니다.
1. 요구사항 개요
- 고객사께서 직접 음식점을 차리고 있는 상황이다.
- 여기서, 현재 최저 임금이 오르고, 음식값이 비싸진 상황에서 직원 수를 줄여야 하는 상황이다.
- 여기서 음식 주문 시 키오스크를 활용해 기계로 주문 해야 하는 프로그램이 필요로 하다.
- 따라서 키오스크에 필요한 포스기를 활용하여 주문하는 프로그램을 제작해주세요.
- 만일, 장어덮밥 : 5000원, 감자튀김 : 4000원, 김밥 : 1000원 일 경우 해당 메뉴를 선택할 수 있게 만들어 주세요.
- 선택 메뉴에 부가세 10%를 포함한 금액을 화면단에 출력하여 보내주세요.
- - 예) 장어덮밥 가격 : 5500원, 감자튀김 : 4400원, 김밥 : 1100원
- 전제 조건 : 고객입장이라고 생각하고, 고객의 통장 잔고를 확인하고, 통장 잔고가 부족할 시 구매할 수 없다는 문구 추가
- 시작은 고객 정보(나이, 성별, 전화번호, 주민번호 앞자리 6자리, 카드 비밀번호 4자리) 화면 보여주고 메뉴 선택
- 백엔드에서는 선택한 메뉴와 고객의 정보와 잔고를 활용하여 프로그램 작성
- Native App에서 프론트엔드 UI 비슷하게 화면 구성해보기
2. 요구사항 화면단 설계
이 중, 요구 사항 중인 하나인 개인 정보 입력하는 폼을 제작 하고, 메뉴 입력까지 진입하는 것으로 하겠습니다.
(1) 개인 정보 입력
(2) 개인 정보 입력 후 헤더에 개인 정보 출력하고, 메뉴 선택까지 지정해 줍니다.
3. Recoil로 상태 관리 설정 - 사용자 정보 관련
<src/recoil/state/userInfoState.tsx>
import {atom} from 'recoil'
export const userInfoState = atom({
key: 'userInfo',
default: {
userName: 'berkley'
, userAge: 29
, userSex: '남'
, userPhone: '01011111111'
, userInfoNumber: '841111'
, userPassword: '1111'
}
});
==> Atom?
- react 및 redux에서는 state 값으로 표현하며, useState 역할을 하는 거와 같습니다.
- redux에서는 useselector를 통해 state 값을 수정하고 usedispatch를 통해 redux에서 저장된 state 값을 불려오는 것으로 활용 가능
- 여기서는 atom으로 이용하여 state 관리 하고, 실제로는 useRecoilState를 이용하여 커스텀 Hook을 사용 가능
4. 사용자 정보 관련 페이지 폼 제작 후, recoil 값에 저장된 데이터 넣기
아래는 recoil를 이용하여 회원 정보를 입력 후, state 값에 저장을 합니다.
입력 후, 메뉴 버튼으로 이동합니다.
<src/component/userInfo/InputUserInfo.tsx>
import React from 'react'
import styles from "../index.module.scss"
import { Card, CardHeader, Button, Form, Input, Label } from 'reactstrap'
import { useNavigate } from 'react-router';
import { userInfoState } from '../../recoil/state/userInfoState'
import { useSetRecoilState } from 'recoil';
const { useState, useEffect } = React;
const InputUserInfo = () => {
const [createForm, setCreateForm] = useState<any>();
const navigate = useNavigate();
const setUserInfo = useSetRecoilState(userInfoState);
const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const { name, value } = e.target;
setCreateForm({
...createForm,
[name]: value,
})
}
// 입력 이후, 회원 정보가 저장 되면서 recoil에 저장 후 header에 사용자 정보 저장
const submitUserInfo = () => {
// 리액트 Query 작성
alert(JSON.stringify(createForm));
setUserInfo(createForm)
navigate('/menuindex');
}
return (
<Card body className={`${styles?.kioskContainer} ${styles?.container}`}>
<CardHeader className="mb-3" tag="h1">
본인 개인정보 입력
</CardHeader>
<Form className={`form-floating mb-3`}>
<Input className="form-control fw-bold border" name="userName" onChange={onChange} />
<Label className="">이름</Label>
</Form>
<Form className="form-floating mb-3">
<Input className="form-control fw-bold border" name="userAge" onChange={onChange} />
<Label className="">나이</Label>
</Form>
<Form className="form-floating mb-3">
<Input className="form-control fw-bold border" name="userSex" onChange={onChange} />
<Label className="">성별</Label>
</Form>
<Form className="form-floating mb-3">
<Input className="form-control fw-bold border" name="userPhone" onChange={onChange} />
<Label className="">전화번호(- 없이 입력)</Label>
</Form>
<Form className="form-floating mb-3">
<Input className="form-control fw-bold border" name="userInfoNumber" onChange={onChange} />
<Label className="">주민번호(앞자리6글자)</Label>
</Form>
<Form className="form-floating mb-3">
<Input className="form-control fw-bold border" name="userPassword" onChange={onChange} />
<Label className="">카드비밀번호(4자리)</Label>
</Form>
{/* <Form className="form-floating mb-3">
<Input className="form-control fw-bold border" name="account" onChange={onChange}/>
<Label className="">잔액</Label>
</Form> */}
<Button color={"primary"} onClick={() => submitUserInfo()}>
제 출
</Button>
</Card>
)
}
export default InputUserInfo;
<Test>
1) 고객 정보 입력
2) 입력 후 결과
3) 입력 후 Header
5. 입력 이후, 다음 메뉴의 대한 페이지 구현
import Header from '../Header'
import styles from '../index.module.scss'
import { Button, Col, Row } from 'reactstrap'
import { useNavigate } from 'react-router'
import { useResetRecoilState } from 'recoil'
import { userInfoState } from '../../recoil/state/userInfoState'
const MenuIndex = () => {
const navigate = useNavigate();
// default 값으로 reset용
const resetUserInfo = useResetRecoilState(userInfoState);
const pageMoveClick = (url:any) => {
if (url === '/inputuserinfo') {
// recoil state 값 default 초기화
resetUserInfo();
}
navigate(url);
}
return (
<div>
<Header />
<div className={`${styles?.container} ${styles?.menuBarContainer}`}>
<h1>메뉴 선택</h1>
<div className={`${styles?.menuBar} mt-5`}>
<Row>
<Col>
<Button onClick={() => {pageMoveClick('/bank')}}>계좌 조회</Button>
</Col>
<Col>
<Button onClick={() => {pageMoveClick('/posfood')}}>음식 주문</Button>
</Col>
<Col>
<Button onClick={() => {pageMoveClick('/inputuserinfo')}}>종료(처음 화면으로 돌아가기)</Button>
</Col>
</Row>
</div>
</div>
</div>
)
}
export default MenuIndex
<결과>
※ 종료 시, recoil state 값을 default로 해주면 좋다.
6. 마치며
회원 정보 페이지의 대해 다뤄봤습니다.
비록 간단한 페이지지만, recoil로 활용하는 방법의 대해 알아보게 되었습니다.
다음으로는 계좌 처리 서비스 개발의 대한 페이지 및 서비스로 다뤄보겠습니다. (H2 Database 연동 x 버전)
'Github 프로젝트 > 음식점 포스 프로그램' 카테고리의 다른 글
[6] 음식점 포스 프로그램 - 화면단 개발(4) : 이벤트 로그 컴포넌트 구성 (0) | 2023.09.24 |
---|---|
[5] 음식점 포스 프로그램 - 화면단 개발(3) : 음식점 포스 프로그램 개발(키오스크) 및 서비스 개발 (2) | 2023.09.24 |
[4] 음식점 포스 프로그램 - 화면단 개발(2) 계좌 처리 화면 서비스 개발 (0) | 2023.09.24 |
[2] 음식점 포스 프로그램 - 개발 설정 : front, Back-End (0) | 2023.09.20 |
[1] 음식점 포스 프로그램 - 요구사항 설정 및 설계 (0) | 2023.09.09 |