2023. 9. 24. 22:19ㆍGithub 프로젝트/음식점 포스 프로그램
이번 시간에는 좀 더 유용한 이벤트 로그를 찍는 것을 개발하였습니다.
고객이 사용한 행위의 대한 기록을 남기는 용도로 로그로 남겨 진행하였습니다.
특별한 요구 사항은 없지만, 고객이 한 행위를 관리자 관점이나 하는 행위에 대해 테스트 용도로 쓰기 위해 만들용도로 쓰이니 참조하였으면 하는 바램입니다. (관리자 관점일 경우 로그 관리 기능으로 유용하게 사용 가능)
github: https://github.com/BerkleyLim/foodstor_pos
개발 하기 앞써 먼저 요구 사항을 확인 하도록 하겠습니다.
1. 요구사항 개요
- 고객사께서 직접 음식점을 차리고 있는 상황이다.
- 여기서, 현재 최저 임금이 오르고, 음식값이 비싸진 상황에서 직원 수를 줄여야 하는 상황이다.
- 여기서 음식 주문 시 키오스크를 활용해 기계로 주문 해야 하는 프로그램이 필요로 하다.
- 따라서 키오스크에 필요한 포스기를 활용하여 주문하는 프로그램을 제작해주세요.
- 만일, 장어덮밥 : 5000원, 감자튀김 : 4000원, 김밥 : 1000원 일 경우 해당 메뉴를 선택할 수 있게 만들어 주세요.
- 선택 메뉴에 부가세 10%를 포함한 금액을 화면단에 출력하여 보내주세요.
- - 예) 장어덮밥 가격 : 5500원, 감자튀김 : 4400원, 김밥 : 1100원
- 전제 조건 : 고객입장이라고 생각하고, 고객의 통장 잔고를 확인하고, 통장 잔고가 부족할 시 구매할 수 없다는 문구 추가
- 시작은 고객 정보(나이, 성별, 전화번호, 주민번호 앞자리 6자리, 카드 비밀번호 4자리) 화면 보여주고 메뉴 선택
- 백엔드에서는 선택한 메뉴와 고객의 정보와 잔고를 활용하여 프로그램 작성
- Native App에서 프론트엔드 UI 비슷하게 화면 구성해보기
2. 요구사항에서 제대로 동작이 되어지는지 확인하기 위한 화면 기능
3. 각각 로그 셋팅
로그인 진입과 성공, 계좌 입출금, 음식 주문 선택만 // 구매 끝날 시 은행 계좌, 사용자 정보 state 값 초기화
<recoil/state/logInfoState.tsx>
- Log state 설정
import {atom} from 'recoil'
const today = new Date();
export const logInfoState = atom({
key: 'logInfo',
default: [{
lno: 1,
uno: -1, // 누가 로그인 했는지 알 수 없음 (-1로 지정)
pageNo: 1,
pageEventTitle: "로그인",
pageEventView: "로그인 진입",
crtTime: JSON.stringify(today),
}],
});
<component/index.tsx>
- 아래에 이벤트창 띄우는 컴포넌트 설정
<Router>
<div className={`${styles?.componentContainer}`}>
<Routes>
<Route path="/" element={<InputUserInfo />} />
<Route path="/inputuserinfo" element={<InputUserInfo />} />
<Route path="/menuindex" element={<MenuIndex />} />
<Route path="/posfood" element={<PosFood />} />
<Route path="/bank" element={<Bank />} />
</Routes>
<br /><br /><br />
{/* 로그창 띄우기 */}
<LogInfo />
</div>
</Router>
<component/loginfo/LogInfo.tsx>
- 로그 화면창 띄우기
import React from "react";
import { Card, CardBody, CardHeader, Table } from "reactstrap";
import styles from "../index.module.scss";
import { useRecoilValue } from "recoil";
import { logInfoState } from '../../recoil/state/logInfoState'
const LogInfo = () => {
const logInfo = useRecoilValue(logInfoState);
return (
<Card body className={`${styles?.kioskLog}`}>
<CardHeader tag="h1">주문 정보 관련 로그</CardHeader>
<CardBody>
<Table border={1} className={`w-100`}>
<thead className={`w-100`}>
<tr>
<th>번호(lno)</th>
<th>사용 메뉴(selectNumber)</th>
<th>이벤트(event)</th>
</tr>
</thead>
<tbody>
{logInfo?.map((log : any, index : number)=>
<tr key={index}>
<td>{log?.lno}</td>
<td>{log?.pageNo} - {log?.pageEventTitle}</td>
<td>{log?.pageEventView}</td>
<td>{log?.crtTime}</td>
</tr>
)}
</tbody>
</Table>
</CardBody>
</Card>
);
};
export default LogInfo;
<component/UserInfo/InputUserInfo.tsx>
- 로그인 및 로그인 성공의 대한 로그를 담는다.
/** 로그값 추가 */
const logInfo: any[] = useRecoilValue(logInfoState);
const setLogInfo = useSetRecoilState(logInfoState);
const today = new Date();
...
// 입력 이후, 회원 정보가 저장 되면서 recoil에 저장 후 header에 사용자 정보 저장
const submitUserInfo = () => {
// 리액트 Query 작성
alert(JSON.stringify(createForm));
setUserInfo(createForm)
/** 로그에 담는다 */
const createLog: any = {
lno: logInfo.length + 1,
uno: 1,
pageNo: 1,
pageEventTitle: "로그인",
pageEventView: "로그인 성공",
crtTime: JSON.stringify(today),
}
setLogInfo(
[...logInfo,
createLog]
)
navigate('/menuindex');
}
<component/posfood/PosFood.tsx>
- 음식 구입에 대한 로그를 담는다.
/** 로그값 추가 */
const logInfo: any[] = useRecoilValue(logInfoState);
const setLogInfo = useSetRecoilState(logInfoState);
const today = new Date();
// 구입 시 선택
const purchaseFood = (f:any | Object) => {
let tempBankInfo = {
bno: bankInfo?.bno,
userMoney: bankInfo.userMoney - f?.foodPrice - f?.VAT
}
/** 구입의 대한 로그에 담는다 */
const createLog: any = {
lno: logInfo.length + 1,
uno: 1,
pageNo: 4,
pageEventTitle: "음식 주문",
pageEventView: "음식 주문 : " + f?.foodMenu + "["+ (f?.foodPrice + f?.VAT) +"원], 잔액["+tempBankInfo.userMoney+"원]",
crtTime: JSON.stringify(today),
}
<component/bank/Bank.tsx>
- 은행 입/출금에 대한 로그를 담는다.
/** 로그값 추가 */
const logInfo: any[] = useRecoilValue(logInfoState);
const setLogInfo = useSetRecoilState(logInfoState);
const today = new Date();
console.log(bankInfo)
const decrementMoney = () => {
let tempBankInfo = {
bno: bankInfo?.bno,
userMoney: bankInfo.userMoney - 100000
}
setBankInfo(tempBankInfo)
/** 로그에 담는다 */
const createLog: any = {
lno: logInfo.length + 1,
pageNo: 3,
pageEventTitle: "계좌",
pageEventView: "출금 10만원, 남은 잔액 : " + (bankInfo.userMoney - 100000) + "원",
crtTime: JSON.stringify(today),
}
setLogInfo(
[...logInfo,
createLog]
)
}
const incrementMoney = () => {
let tempBankInfo = {
bno: bankInfo?.bno,
userMoney: bankInfo.userMoney + 100000
}
setBankInfo(tempBankInfo)
/** 로그에 담는다 */
const createLog: any = {
lno: logInfo.length + 1,
uno: 1,
pageNo: 3,
pageEventTitle: "계좌",
pageEventView: "입금 10만원, 남은 잔액 : " + (bankInfo.userMoney + 100000) + "원",
crtTime: JSON.stringify(today),
}
setLogInfo(
[...logInfo,
createLog]
)
}
<component/menu/MenuIndex.tsx>
- 메뉴 버튼을 뒤로 가기 시 초기화 한다.
// default 값으로 reset용
const resetUserInfo = useResetRecoilState(userInfoState);
const resetLogInfo = useResetRecoilState(logInfoState);
const resetUserBankInfo = useResetRecoilState(userBankInfoState);
const pageMoveClick = (url:any) => {
// Partial<Path> path = new Partial<>(url);
if (url === '/inputuserinfo') {
// recoil state 값 default 초기화
resetUserInfo();
// 계좌 초기화
resetUserBankInfo();
// 로그 초기화
resetLogInfo();
}
navigate(url);
}
4. 마치며
고객이 이용한 서비스 로그로 이용하여 로그인, 입출금, 음식 주문과 같은 내역을 출력하도록 완성하였다.
다음 시간에는 백엔드 데이터 베이스 설계 및 인터페이스 개발을 다뤄보도록 한다.
'Github 프로젝트 > 음식점 포스 프로그램' 카테고리의 다른 글
[8] 음식점 포스 프로그램 - 백엔드 인터페이스 개발(2) - 데이터 조작 SQL 쿼리 설계 (0) | 2023.10.07 |
---|---|
[7] 음식점 포스 프로그램 - 백엔드 인터페이스 개발(1) : Database schema 설계(H2 Database 기반) (0) | 2023.10.07 |
[5] 음식점 포스 프로그램 - 화면단 개발(3) : 음식점 포스 프로그램 개발(키오스크) 및 서비스 개발 (2) | 2023.09.24 |
[4] 음식점 포스 프로그램 - 화면단 개발(2) 계좌 처리 화면 서비스 개발 (0) | 2023.09.24 |
[3] 음식점 포스 프로그램 - 화면단 개발(1) - 고객 정보 입력 개발 및 서비스 개발 (0) | 2023.09.23 |