오늘은 간단하게 재고관리프로그램을 만들어보았습니다
js코드는 총 3가지로
- shop.js
- stock.js
- stockmanager.js
이렇게 3개의 코드를 만들었습니다
아래에는 코드와 코드들의 설명입니다
class Stock {
constructor(stno, stname, stamt, stindate, strgdate, shno){
this.stno = stno;
this.stname = stname;
this.stamt = stamt;
this.stindate = stindate;
this.strgdate = strgdate;
this.shno = shno;
}
};
Stock 클래스는 재고 객체를 생성하기 위해 사용됩니다. 이 클래스는 생성자 함수를 통해 각 재고 항목의 속성을 초기화합니다.
속성 설명
- stno: 재고 번호 (재고의 고유 식별자)
- stname: 재고 이름 (재고의 이름이나 설명)
- stamt: 재고 수량 (해당 재고의 수량)
- stindate: 입고 날짜 (재고가 입고된 날짜)
- strgdate: 등록 날짜 (재고가 시스템에 등록된 날짜와 시간)
- shno: 매장 번호 (해당 재고가 속한 매장의 고유 식별자)
역할
Stock 클래스는 매장에 속한 각 재고 항목을 객체로 표현하며, 각 재고 항목의 속성을 관리합니다. 새로운 재고를 추가할 때 Stock 클래스의 인스턴스를 생성하고, 로컬 스토리지에 저장된 재고 목록에 추가합니다. 이 클래스는 재고 관리 시스템에서 재고 항목을 생성하고 관리하는 데 필수적인 역할을 합니다.
이와 같은 클래스를 사용하면 재고 정보를 체계적으로 관리할 수 있으며, 객체 지향 프로그래밍의 장점을 활용하여 코드의 재사용성과 유지보수성을 높일 수 있습니다.
class Shop {
constructor(shno, shname, shtotst){
this.shno = shno;
this.shname = shname;
this.shtotst = shtotst;
}
}
Shop 클래스는 매장 객체를 생성하기 위해 사용됩니다. 이 클래스는 생성자 함수를 통해 각 매장의 속성을 초기화합니다. 다음은 Shop 클래스와 그 역할에 대한 설명입니다.
속성 설명
- shno: 매장 번호 (매장의 고유 식별자)
- shname: 매장 이름 (매장의 이름)
- shtotst: 총 재고 수량 (해당 매장의 총 재고 수량)
역할
Shop 클래스는 각 매장을 객체로 표현하며, 각 매장의 속성을 관리합니다. 새로운 매장을 추가할 때 Shop 클래스의 인스턴스를 생성하고, 로컬 스토리지에 저장된 매장 목록에 추가합니다. 이 클래스는 매장 관리 시스템에서 매장 항목을 생성하고 관리하는 데 필수적인 역할을 합니다.
이와 같은 클래스를 사용하면 매장 정보를 체계적으로 관리할 수 있으며, 객체 지향 프로그래밍의 장점을 활용하여 코드의 재사용성과 유지보수성을 높일 수 있습니다.
$(() => {
// localStorage 초기화
initLocalStorage();
$('#shwriteBtn').on('click', () => {
writeShop();
showStoreList();
});
$('#stwriteBtn').on('click', () => {
writeStock();
showStockList(currentShopId);
});
// 초기 목록 표시
showStoreList();
showStockList(null);
});
const initLocalStorage = () => {
if (localStorage) {
if (!localStorage.getItem('shopSeq')) {
localStorage.setItem('shopSeq', '0');
}
if (!localStorage.getItem('stockSeq')) {
localStorage.setItem('stockSeq', '0');
}
if (!localStorage.getItem('shopList')) {
localStorage.setItem('shopList', '[]');
}
if (!localStorage.getItem('stockList')) {
localStorage.setItem('stockList', '[]');
}
}
};
let currentShopId = null;
// 매장 등록
const writeShop = () => {
const shopArr = JSON.parse(localStorage.getItem('shopList'));
shopArr.push(new Shop(getNextShopSeq(), $('#shname').val(), 0));
localStorage.setItem('shopList', JSON.stringify(shopArr));
$('#shname').val('');
};
// 매장 번호 시퀀스
const getNextShopSeq = () => {
const nextShopSeq = Number(localStorage.getItem('shopSeq')) + 1;
localStorage.setItem('shopSeq', nextShopSeq);
return nextShopSeq;
};
// 매장 목록 표시
const showStoreList = () => {
const shopArr = JSON.parse(localStorage.getItem('shopList'));
const tbody = $('#shoplist tbody');
tbody.empty();
shopArr.forEach((shop, index) => {
tbody.append(`
<tr onclick="showStockList(${shop.shno})">
<td>${index + 1}</td>
<td>${shop.shname}</td>
<td>${shop.shtotst}</td>
<td><button onclick="editShop(${shop.shno})">수정</button></td>
<td><button onclick="deleteShopList(${shop.shno})">삭제</button></td>
</tr>
`);
});
};
// 매장 삭제
const deleteShopList = (shno) => {
let shopArr = JSON.parse(localStorage.getItem('shopList'));
shopArr = shopArr.filter((shop) => shop.shno !== shno);
localStorage.setItem('shopList', JSON.stringify(shopArr));
showStoreList();
};
// 재고 등록
const writeStock = () => {
if (currentShopId === null) {
alert('먼저 매장을 선택하세요.');
return;
}
const stockArr = JSON.parse(localStorage.getItem('stockList'));
const stock = new Stock(
getNextStockSeq(),
$('#stname').val(),
$('#stamt').val(),
$('#stindate').val(),
formatDateTime(new Date()),
currentShopId
);
stockArr.push(stock);
localStorage.setItem('stockList', JSON.stringify(stockArr));
$('#stname').val('');
$('#stamt').val('');
$('#stindate').val('');
showStockList(currentShopId);
};
// 재고 번호 시퀀스
const getNextStockSeq = () => {
const nextStockSeq = Number(localStorage.getItem('stockSeq')) + 1;
localStorage.setItem('stockSeq', nextStockSeq);
return nextStockSeq;
};
// 날짜 및 시간 형식 지정
const formatDateTime = (date) => {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}년 ${month}월 ${day}일 ${hours}:${minutes}:${seconds}`;
};
// 재고목록의 합
const sTotal = stocks => {
return stocks.reduce((acc,stock) => acc + stock.stamt, 0);
};
// 재고 목록 표시
const showStockList = (shno) => {
currentShopId = shno;
const stockArr = JSON.parse(localStorage.getItem('stockList'));
const filteredStockArr = shno ? stockArr.filter(stock => stock.shno === shno) : stockArr;
const tbody2 = $('#stocklist tbody');
tbody2.empty();
filteredStockArr.forEach((stock, index) => {
tbody2.append(`
<tr>
<td>${index + 1}</td>
<td>${stock.stname}</td>
<td>${stock.stamt}</td>
<td>${stock.stindate}</td>
<td>${stock.strgdate}</td>
<td><button onclick="editStock(${stock.stno})">수정</button></td>
<td><button onclick="deleteStockList(${stock.stno})">삭제</button></td>
</tr>
`);
});
};
// 재고 삭제
const deleteStockList = (stno) => {
let stockArr = JSON.parse(localStorage.getItem('stockList'));
stockArr = stockArr.filter((stock) => stock.stno !== stno);
localStorage.setItem('stockList', JSON.stringify(stockArr));
showStockList(currentShopId);
};
이 코드는 로컬 스토리지를 이용한 간단한 매장 및 재고 관리 시스템입니다. 매장과 재고를 추가하고, 목록을 보여주며, 수정 및 삭제할 수 있는 기능을 제공합니다. 다음은 주요 기능과 동작 방식에 대한 설명입니다.
1. 초기 설정
- initLocalStorage 함수: 로컬 스토리지에 필요한 초기 데이터를 설정합니다. shopSeq, stockSeq, shopList, stockList가 존재하지 않으면 초기값을 설정합니다.
2. 매장 관리
- writeShop 함수: 새로운 매장을 추가합니다. 입력된 매장 이름과 함께 새로운 매장 객체를 생성하고 shopList에 추가합니다.
- getNextShopSeq 함수: 매장 번호 시퀀스를 증가시키고 반환합니다.
- showStoreList 함수: shopList에 저장된 매장 목록을 테이블에 표시합니다.
- deleteShopList 함수: 특정 매장을 삭제하고 목록을 업데이트합니다.
3. 재고 관리
- writeStock 함수: 현재 선택된 매장에 새로운 재고를 추가합니다. 재고 이름, 수량, 입고 날짜 등을 입력받아 stockList에 추가합니다.
- getNextStockSeq 함수: 재고 번호 시퀀스를 증가시키고 반환합니다.
- showStockList 함수: 특정 매장의 재고 목록을 테이블에 표시합니다. 매장이 선택되지 않으면 모든 재고를 표시합니다.
- deleteStockList 함수: 특정 재고를 삭제하고 목록을 업데이트합니다.
4. 기타 함수
- formatDateTime 함수: 날짜와 시간을 지정된 형식으로 변환합니다.
- sTotal 함수: 주어진 재고 배열에서 총수량을 계산합니다.
이벤트 핸들러
- #shwriteBtn 클릭 이벤트: 매장을 추가하고 매장 목록을 갱신합니다.
- #stwriteBtn 클릭 이벤트: 재고를 추가하고 현재 매장의 재고 목록을 갱신합니다.
초기화 및 목록 표시
- 초기 목록 표시: 페이지 로드 시 showStoreList와 showStockList를 호출하여 초기 목록을 표시합니다.
이 코드는 HTML 요소와 결합하여 매장과 재고를 관리할 수 있는 간단한 시스템을 제공합니다. 로컬 스토리지를 이용하여 데이터가 유지되며, 사용자가 페이지를 새로 고침해도 데이터가 손실되지 않습니다.
다음은 HTML과 css코드입니다
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>재고관리프로그램 v0.1</title>
<link rel="stylesheet" href="/stockmanager/css/stockmanager.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="/stockmanager/js/stockmanager.js"></script>
<script src="/stockmanager/js/Shop.js"></script>
<script src="/stockmanager/js/Stock.js"></script>
</head>
<body>
<div id="wrapper">
<div id="title">
<h1>재고관리프로그램 v1.0</h1>
</div>
<div id="shoplist" class="list">
<h2>매장목록</h2>
<p>
<input id="shname" type="text" placeholder="매장명" />
<input id="shwriteBtn" type="button" value="등록" />
</p>
<table>
<thead>
<tr>
<th>NO</th>
<th>매장명</th>
<th>수량</th>
<th>수정</th>
<th>삭제</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
<div id="stocklist" class="list">
<h2>재고목록</h2>
<p>
<input id="stname" type="text" placeholder="재고제품명" />
<input id="stamt" type="number" placeholder="재고수량" />
<input id="stindate" type="date" placeholder="입고일시" />
<input id="stwriteBtn" type="button" value="등록" />
</p>
<table>
<thead>
<tr>
<th>NO</th>
<th>재고제품명</th>
<th>수량</th>
<th>입고일시</th>
<th>등록일시</th>
<th>수정</th>
<th>삭제</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
</body>
</html>
* {
margin: 0;
padding: 0;
}
div {
border: 1px solid #333;
}
h1, h2 {
text-align: center;
}
input[type='text'], input[type='number'], input[type='date'] {
height: 25px;
}
input[type='button'] {
height: 25px;
padding: 0 10px;
}
#wrapper {
width: 820px;
height: 600px;
}
#title {
color: white;
background-color: black;
padding: 10px 0;
}
.list {
float: left;
margin: 10px;
height: 510px;
}
.list h2 {
padding: 10px 0;
color: white;
background-color: gray;
}
.list table, .list table th, .list table td {
border: 1px solid #999;
border-collapse: collapse;
}
#shoplist {
width: 278px;
}
#shoplist table {
width: 278px;
}
#stocklist {
width: 493px;
}
#stocklist table {
width: 493px;
}
#shoplist p, #stocklist p {
padding: 10px;
}
#shname {
width: 190px;
}
#stname {
width: 190px;
}
#stamt {
width: 70px;
}
결과도 잘 나오는 모습입니다 입력을 할 때마다 값이 올라가고 로컬스토리지에 저장됩니다
이렇게 간단하게 재고관리프로그램을 만들어보았습니다
감사합니다