본문 바로가기

웹 개발/쇼핑몰 프로젝트(개인)

쇼핑몰 만들기(7)-카테고리 관리

728x90
 

쇼핑몰 만들기(6)-상품 관리(상품 수정, 삭제)

쇼핑몰 만들기(5)-상품 관리 쇼핑몰 만들기(4)-관리자 상세보기, 부트스트랩 적용 2024.04.05 - [웹 개발] - 쇼핑몰 만들기(3)-관리자 리스트, 관리자 메뉴, 권한 변경 쇼핑몰 만들기(3)-관리자 리스트,

broad-backend.tistory.com

 

이번에는 카테고리를 관리하는 기능을 만들것이다.

어떤 카테고리가 있는지 보여주는 categoryList와 카테고리 추가 , 삭제 기능을 만들것이다.

 

일단 카테고리 목록부터 구현할것이다.

categoryList.jsp

<%@page import="java.util.*"%>
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!-- Controller Layer -->
<%@ include file="/emp/inc/commonSessionCheck.jsp"%>

<%
	/* DB 연결 및 초기화 */
	Class.forName("org.mariadb.jdbc.Driver");
	Connection conn = null;
	conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3307/shop", "root", "****");
	
	/* [DB]shop.category에서 category와 생성일 가져오는 쿼리 */
	String getCategorySql = "SELECT category, emp_id empId, LEFT(create_date,16) createDate FROM category ORDER BY createDate DESC";
	PreparedStatement getCategoryStmt = null;
	ResultSet getCategoryRs = null;
	
	getCategoryStmt = conn.prepareStatement(getCategorySql);
	getCategoryRs = getCategoryStmt.executeQuery();
	
	// 자료 구조 변경(ResultSet --> ArrayList<HashMap>)
	ArrayList<HashMap<String, Object>> categoryList = new ArrayList<HashMap<String, Object>>();
	while(getCategoryRs.next()) {
		HashMap<String, Object> m = new HashMap<String, Object>();
		m.put("category", getCategoryRs.getString("category"));
		m.put("empId", getCategoryRs.getString("empId"));
		m.put("createDate", getCategoryRs.getString("createDate"));
		categoryList.add(m);
	}
%>
<%
	/* session의 정보 가져오기(grade별로 카테고리 삭제 권한 설정하기 위해) */
	HashMap<String, Object> getSessionMap = (HashMap<String, Object>)(session.getAttribute("loginEmp"));
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>카테고리 목록</title>
	<link href="/shop/css/w3.css" rel="stylesheet" type="text/css">
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="row">
<!-- 메인 메뉴 -->
<jsp:include page="/emp/inc/empMenu.jsp"></jsp:include>
	<div class="col"></div>
	
	<div class="col-5">

		<!-- category 목록 출력 -->
		<div class="w3-panel w3-border w3-round-small">
			<div class="row" style="margin: 20px auto;">
				<div class="col">
					<h1>category 목록</h1>
				</div>
			
				<div class="col" style="text-align: right;">
					<form action="/shop/emp/category/addCategoryForm.jsp">
						<button type="submit" class="btn btn-outline-dark">카테고리 추가</button>
					</form>
				</div>
			</div>
					
				
			<table class="table table-hover" style="margin-bottom: 30px;">
				<thead>
					<tr>
						<th>카테고리</th>
						<th>생성한 사람</th>
						<th>생성일</th>
						<th>삭제</th>
					</tr>
				</thead>

			<%
				for(HashMap<String, Object> m : categoryList) {
			%>
					<tbody>
						<tr>
							<td><%=m.get("category") %></td>
							<td><%=m.get("empId") %></td>
							<td><%=m.get("createDate") %></td>
							
								<td>
									<form action="/shop/emp/category/deleteCategoryForm.jsp">
										<input type="hidden" name="category" value="<%=m.get("category")%>">
										<%
											if((Integer)(getSessionMap.get("grade")) > 0) {
										%>
												<button type="submit" class="btn btn-danger btn-sm">삭제</button>
										<%
											} else {
										%>
												<button type="submit" class="btn btn-danger btn-sm" disabled="disabled">삭제</button>
										<%
											}
										%>
									</form>
								</td>
							
							
						</tr>
					</tbody>
			<%
				}
			%>
			</table>
		</div>
	</div>
		
	<div class="col"></div>
</div>

</body>
</html>

 

카테고리 목록은 카테고리명과 생성한 관리자, 카테고리 생성일만 보여주려고 했다.

그래서 DB에서 카테고리명과, 생성한 관리자,  생성일만 SELECT해서 가져왔다.

그 후 가져온 값들을 ResultSet에서 HashMap으로 바꿨다.

그 다음 페이지에 출력하면 끝이다!

 

그리고 카테고리 삭제같은 경우는 grade가 0이 아닌 경우에만 삭제를 할 수 있다.

카테고리 추가는 오른쪽 상단에 있다.

 

 

다음은 카테고리 추가먼저 하겠다.

addCategoryForm.jsp

<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!-- Controller Layer -->
<%@ include file="/emp/inc/commonSessionCheck.jsp"%>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>카테고리 추가</title>
	<link href="/shop/css/w3.css" rel="stylesheet" type="text/css">
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="row">
<!-- 메인 메뉴 -->
<jsp:include page="/emp/inc/empMenu.jsp"></jsp:include>
	<div class="col"></div>
	
	<div class="col-3">
		<div class="w3-border w3-round" style="margin-top: 20px;">
			<div class="w3-container w3-dark-grey" style="padding: 10px;">
				<h1>카테고리 추가</h1>
			</div>
			
			<div class="w3-card-4" style="padding: 5%;">
				<form class="w3-container" action="/shop/emp/category/addCategoryAction.jsp" method="post">
					<label style="margin: 20px;">카테고리</label>
					
					<div style="margin: 10px;">
						<input class="w3-input" type="text" name="category" placeholder="카테고리를 입력해주세요">
					</div>
					
					<div style="text-align: center;">
						<button class="w3-button w3-section w3-dark-grey w3-ripple" type="submit" style="width: 80%; margin: 20px;">
							카테고리 추가
						</button>
					</div>
		
				</form>
			</div>
		</div>
	</div>
	
	<div class="col"></div>
</div>
</body>
</html>

 

카테고리 폼 같은 경우는

그냥 카테고리 이름을 입력하고 추가 버튼을 누르면 끝이다

카테고리 추가 페이지

 

addCatogoryAction.jsp

<%@page import="java.util.*"%>
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- Controller Layer -->
<%@ include file="/emp/inc/commonSessionCheck.jsp"%>

<!-- Session 설정 값 : 입력할 때 로그인한 emp의 emp_id값이 필요하기 때문! -->
<%
	HashMap<String, Object> loginMember = (HashMap<String, Object>)(session.getAttribute("loginEmp"));
%>

<!-- Model Layer -->
<%
	// 요청 값 분석
	String category = request.getParameter("category");

	// 요청 값이  null일시
	if(category == null) {
		response.sendRedirect("/shop/emp/category/addCategoryForm.jsp");
	}
	
	// 요청값 디버깅
	System.out.println("addCategoryForm - category = " + category);	
%>

<!-- Controller Layer -->
<%
	/* DB 연결 및 초기화 */
	Class.forName("org.mariadb.jdbc.Driver");
	Connection conn = null;
	conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3307/shop", "root", "****");

	/* [DB]shop.category에 category에 추가하는 sql */
	String addCategorySql = "INSERT INTO category(category, emp_id) VALUES (?, ?)";
	PreparedStatement addCategoryStmt = null;
	
	addCategoryStmt = conn.prepareStatement(addCategorySql);
	addCategoryStmt.setString(1, category);
	addCategoryStmt.setString(2, (String)(loginMember.get("empId")));

	int row = addCategoryStmt.executeUpdate();
	
	if(row == 1) {
		// 카테고리 등록 성공
		System.out.println("카테고리 등록 성공");
		response.sendRedirect("/shop/emp/category/categoryList.jsp");
	} else {
		// 카테고리 등록 실패
		System.out.println("카테고리 등록 실패");
		response.sendRedirect("/shop/emp/category/addCategoryForm.jsp");
	}
	
%>

 

누가 등록했는지 알 수 있게 하기위해 loginEmp 세션 변수를 가져왔다.

 

폼에서 입력받은 카테고리를 요청값으로 가져왔다.

그 후 그냥 DB에 INSERT 쿼리를 날려주면 카테고리 추가는 끝이다.

 

카테고리 추가

 

다음은 카테고리 삭제이다

 

deleteCategoryForm.jsp

<%@page import="java.util.HashMap"%>
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!-- Controller Layer -->
<%@ include file="/emp/inc/commonSessionCheck.jsp"%>

<!-- Model Layer -->
<%
	// 요청 값
	String category = request.getParameter("category");

	// 요청 값 디버깅
	System.out.println("deleteCategoryForm - category = " + category);
	
%>
<%
	/* session의 정보 가져오기(grade별로 카테고리 삭제 권한 설정하기 위해) */
	HashMap<String, Object> loginMember = (HashMap<String, Object>)(session.getAttribute("loginEmp"));
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>카테고리 삭제</title>
	<link href="/shop/css/w3.css" rel="stylesheet" type="text/css">
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
		
<div class="row">
<!-- 메인 메뉴 -->
<jsp:include page="/emp/inc/empMenu.jsp"></jsp:include>

	<div class="col"></div>

	<div class="col-4">
		<div class="w3-border w3-round" style="margin-top: 20px;">
			<div class="w3-container w3-dark-grey" style="padding: 10px;">
				<h1>카테고리 삭제</h1>
			</div>	
			
			<div class="w3-card-4" style="padding: 5%;">
				<form class="w3-container" action="/shop/emp/category/deleteCategoryAction.jsp" method="post">
					<div>
						<label>삭제하려는 카테고리는</label>
						<input type="text" value="<%=category%>" name="category" readonly="readonly" style="text-align: center;">
						<label>입니다.</label>
						
						<br>
						
						<label>
							삭제할 경우 해당 카테고리의 <strong>모든 상품들이 삭제됩니다</strong>
							<br>정말 삭제하시려면 id 와 pw를 입력해주세요.
						</label>
					</div>
					
					<div style="margin-top: 20px;">
						<label>id</label>
						<input class="w3-input" type="text" name="empId" value="<%=loginMember.get("empId")%>" readonly="readonly">
					</div>
					
					<div>
						<label>pw</label>
						<input class="w3-input" type="password" name="empPw">
					</div>
							
					<div>
						<button class="w3-button w3-section w3-block w3-dark-grey w3-ripple" type="submit">카테고리 삭제</button>
					</div>
				</form>
			</div>
		</div>
		
	</div>
	
	<div class="col"></div>
</div>
</body>
</html>

 

어떤 카테고리를 삭제하는지 알려주기 위해 category값을 요청값으로 받아왔다.

그리고 폼을 만들어 id, pw를 입력받도록 했다.

id는 로그인 하고있는 관리자의 id를 받아오기 위해 loginEmp세션 변수에서 가져왔다.

 

deleteCategoryAction.jsp

<%@page import="java.io.File"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- Controller Layer -->
<%@ include file="/emp/inc/commonSessionCheck.jsp"%>

<!-- Model Layer -->
<%
	// 요청 값
	String category = request.getParameter("category");
	String empId = request.getParameter("empId");
	String empPw = request.getParameter("empPw");
	
	// 요청 값 디버깅
	System.out.println("deleteCategoryAction - category = " + category);
	System.out.println("deleteCategoryAction - empId = " + empId);
	System.out.println("deleteCategoryAction - empPw = " + empPw);
%>
<%
	/* session의 정보 가져오기(grade가 0이 아닐때 삭제 하기 위해) */
	HashMap<String, Object> loginMember = (HashMap<String, Object>)(session.getAttribute("loginEmp"));
%>
<%
	/* DB 연결 및 초기화 */
	Class.forName("org.mariadb.jdbc.Driver");
	Connection conn = null;
	conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3307/shop", "root", "****");
	
	/* [DB]shop.emp에서 id와 pw가 일치하는지 확인하고, grade를 가져오는 쿼리 */
	String checkEmpInfoSql = "SELECT emp_id empId FROM emp WHERE emp_id = ? AND emp_pw = PASSWORD(?)";
	PreparedStatement checkEmpInfoStmt = null;
	ResultSet checkEmpInfoRs = null;
	checkEmpInfoStmt = conn.prepareStatement(checkEmpInfoSql);
	checkEmpInfoStmt.setString(1, empId);
	checkEmpInfoStmt.setString(2, empPw);
	checkEmpInfoRs = checkEmpInfoStmt.executeQuery();
	
	// id, pw가 일치한다면
	if(checkEmpInfoRs.next()) {
		// grade가 0이 아니면 삭제
		System.out.println("deleteCategoryAction - grade = " + (int)(loginMember.get("grade")));
		if((int)(loginMember.get("grade")) > 0) {
			String deleteCategorySql = "DELETE FROM category WHERE category = ?";
			PreparedStatement deleteCategoryStmt = null;
			
			/* 카테고리와 연관된 상품들의 img 삭제하기 */
			// 해당 카테고리의 상품들 가져오는 쿼리
			String getGoodsOfCategorySql = "SELECT img_name imgName from goods WHERE category = ?";
			PreparedStatement getGoodsOfCategoryStmt = null;
			ResultSet getGoodsOfCategoryRs = null;
			
			getGoodsOfCategoryStmt = conn.prepareStatement(getGoodsOfCategorySql);
			getGoodsOfCategoryStmt.setString(1, category);
			getGoodsOfCategoryRs = getGoodsOfCategoryStmt.executeQuery();
			
			while(getGoodsOfCategoryRs.next()) {
				// 삭제 쿼리
				String deleteGoodsImgSql = "DELETE FROM goods WHERE img_name = ?";
				PreparedStatement deleteGoodsImgStmt = null;
				deleteGoodsImgStmt = conn.prepareStatement(deleteGoodsImgSql);
				deleteGoodsImgStmt.setString(1, getGoodsOfCategoryRs.getString("imgName"));
				
				String imgPath = request.getServletContext().getRealPath("upload");
				System.out.println("deleteGoodsAction - imgPath = " + imgPath);
				
			 	File deleteFile = new File(imgPath, getGoodsOfCategoryRs.getString("imgName"));
			 	deleteFile.delete();
			 	
// 			 	getGoodsOfCategoryRs.beforeFirst();
			}

			deleteCategoryStmt = conn.prepareStatement(deleteCategorySql);
			deleteCategoryStmt.setString(1, category);
			
			// 삭제됐는지
			int row = deleteCategoryStmt.executeUpdate();
			System.out.println("deleteCategoryAction - row = " + row);	// 삭제 됐는지 디버깅
			
			response.sendRedirect("/shop/emp/category/categoryList.jsp");
		} else {
			System.out.println("grade 0 아님 ");
			// grade가 0이 아님
			response.sendRedirect("/shop/emp/category/deleteCategoryForm.jsp?category=" + category);
		}
	} else {
		// id, pw 불일치
		System.out.println("id, pw 불일치 ");
		response.sendRedirect("/shop/emp/category/deleteCategoryForm.jsp?category=" + category);
	}
	
%>

 

category, empId, empPw를 요청값으로 가져왔다.

 

DB에서 id, pw가 일치하는지 확인하고, 일치한다면 -> grade값을 확인하도록 했다.

 

grade 또한 0보다 클 경우에만 이제 DELETE쿼리를 날릴 수 있다.

그리고 DELETE쿼리로 카테고리를 삭제하기 전에 카테고리에 해당하는 상품들의 이미지들 또한 모두 지워주는 코드를 구현하면 완료이다!

아래에 카테고리가 삭제된 후 이미지를 첨부했다

카테고리 삭제

728x90