본문 바로가기

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

쇼핑몰 만들기(3)-관리자 리스트, 관리자 메뉴, 권한 변경

728x90
 

쇼핑몰 만들기(2)-관리자 로그인,로그아웃

쇼핑몰 만들기(1)-관리자페이지 두번째 개인 프로젝트로 쇼핑몰을 만드려고 한다. 일단은 관리자페이지 먼저 구상을 조금씩 해놓고 코드를 구현할 것이다. 현재까지 구상한 마인드 맵이다 로그

broad-backend.tistory.com

 

이번에는 로그인 후 나오는 페이지인 관리자 리스트 페이지를 만들 것이다.

또한 관리자로 접근시  나오는 공통 메뉴인 관리자 메뉴도 만들 것이다.

 

관리자 메뉴는 따로 페이지를 만들어서 include 기술을 사용해 각각의 페이지에 넣어 줄 것이다.

그리고 include기술을 페이지 실행 전 session체크에도 사용하도록 변경하겠다.

 

include로 login form이나 action이 아닐경우는 commonSessionCheck로 jsp를 만들어 사용했다.

 

Map을 생성하고 getAttribute()메서드를 사용해 session의 loginEmp변수를 가져왔다.

empMenu.jsp

<%@ include file="/emp/inc/commonSessionCheck.jsp"%>

<%
	HashMap<String, Object> loginMember = (HashMap<String, Object>)(session.getAttribute("loginEmp"));
%>

<div>
	<a href="/shop/emp/empList.jsp">사원 관리</a>
	<!-- category CRUD -->
	<a href="/shop/emp/category/categoryList.jsp">카테고리 관리</a>
	<a href="/shop/emp/goods/goodsList.jsp">상품 관리</a>
	
	<!-- 개인정보 페이지 -->
	<span>
		<a href="/shop/emp/empOne.jsp"><%=(String)(loginMember.get("empName"))%>님</a> 반갑습니다 
	</span>
	
	<!-- 로그아웃 -->
	<div>
		<a href="/shop/emp/empLogoutAction.jsp">
			로그아웃
		</a>
	</div>
</div>

 

login 세션 체크 하고

DB연결 및 Connection을 초기화 했다.

 

사원의 수가 많다면  출력 페이지가 길어지므로 페이징을 해주었다.

 

그리고 startRow(보여줄 data row), rowPerPage를 이용해 emp 테이블에서 필요한 data를 SELECT로 뽑아온다.

 

이제 View layer이다.

일단 메인 메뉴인 empMenu를 include해줬다.

그리고 empList를 담았던 HashMap을 for문을 사용해 사원들을 출력해준다.

또한 active를 변경할 수 있는 버튼을 있다.

단, [DB]shop.emp의 grade가 0보다 클 경우에만 active를 변경할 수 있고 0일 경우는 button을 disabled 해줬다.

버튼 클릭시 form action을 통해 empId와 active값이 modifyEmpActive로 넘어간다.

그 아래에는 페이징 버튼을 만들었다.

empList.jsp

<%@page import="java.util.HashMap"%>
<%@page import="java.util.ArrayList"%>
<%@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 -->
<%
	// 1. 특수한 형태의 데이터(RDBMS:mariaDB)
	// 2. API 사용(JDBC API)해 자료구조(ResultSet) 획득
	// 3. 일반화된 자료구조(ex. List, Set 등)로 변경 -> 모델 획득
	
	/* DB 연결 및 초기화 */
	Class.forName("org.mariadb.jdbc.Driver");
	Connection conn = null;
	conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3307/shop", "root", "****");

%>

<%
	/* emp목록 페이징 */
	
	// 현재 페이지
	int currentPage = 1;
	if(request.getParameter("currentPage") != null) {
		currentPage = Integer.parseInt(request.getParameter("currentPage"));
	}
	System.out.println("empList - currentPage = " + currentPage);
	
	// 페이지당 보여줄 row 수
	int rowPerPage = 10;
	
// 	// select 박스로 rowPerPage 구하기
// 	if(request.getParameter("rowPerPage") != null) {
// 		rowPerPage = Integer.parseInt(request.getParameter("rowPerPage"));
// 	}

	// 전체 emp 수 구하기
	String getTotalRowSql = "SELECT COUNT(*) cnt FROM emp";
	PreparedStatement getTotalRowStmt = null;
	getTotalRowStmt = conn.prepareStatement(getTotalRowSql);
	ResultSet getTotalRowRs = getTotalRowStmt.executeQuery();
	
	int totalRow = 0;
	if(getTotalRowRs.next()) {
		totalRow = getTotalRowRs.getInt("cnt");
	}
	System.out.println("empList - totalRow = " + totalRow);
	
	// 마지막 페이지 구하기
	int lastPage = totalRow / rowPerPage;
	if(totalRow % rowPerPage != 0) {
		lastPage += 1;
	}
	System.out.println("empList - lastPage = " + lastPage);
	
	// 페이지당 시작할 row
	int startRow = (currentPage - 1) * rowPerPage;
	System.out.println("empList - startRow = " + startRow);
%>

<%
	/*
	[DB]shop.emp 테이블 가져오는 SQL쿼리
	
	SELECT emp_id empId, emp_name empName, emp_job empJob, hire_date hireDate, active 
	FROM emp
	ORDER BY active ASC, hire_date DESC
	*/
	String getEmpSql = "SELECT emp_id empId, emp_name empName, emp_job empJob, hire_date hireDate, active FROM emp ORDER BY hire_date ASC LIMIT ?,?";
	PreparedStatement getEmpStmt = null; 
	ResultSet getEmpRs = null;
	getEmpStmt = conn.prepareStatement(getEmpSql);
	getEmpStmt.setInt(1, startRow);
	getEmpStmt.setInt(2, rowPerPage);
	getEmpRs = getEmpStmt.executeQuery();
	
	// JDBC API에 종속된 자료구조 모델인 ResultSet -> 기본 API (ArrayList)로 변경
	ArrayList<HashMap<String, Object>> empList = new ArrayList<HashMap<String,Object>>();
	
	// ResultSet -> ArrayList<HashMap<String, Object>>
	while(getEmpRs.next()) {
		HashMap<String, Object> empMap = new HashMap<String, Object>();
		empMap.put("empId", getEmpRs.getString("empId"));
		empMap.put("empName", getEmpRs.getString("empName"));
		empMap.put("empJob", getEmpRs.getString("empJob"));
		empMap.put("hireDate", getEmpRs.getString("hireDate"));
		empMap.put("active", getEmpRs.getString("active"));
		empList.add(empMap);
	}
%>

<%
	/* session의 정보 가져오기(어떤 emp가 로그인 돼있고, grade로 권한 부여 설정하기 위해) */
	HashMap<String, Object> getSessionMap = (HashMap<String, Object>)(session.getAttribute("loginEmp"));
%>
<!-- View Layer : 모델(ArrayList<HashMap<String, Object>>) 출력 -->
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>empList</title>
	<link href="/shop/emp/css/emp.css" rel="stylesheet" type="text/css">
</head>
<body>
	<!-- empMenu.jsp include : 주체(서버) vs redirect(주체: 클라이언트) -->
	<!-- 주체가 서버이기때문에 include할때는 절대주소가 /shop/...으로 시작하지 않는다 -->
	
	<!-- 메인 메뉴 -->
	<jsp:include page="/emp/inc/empMenu.jsp"></jsp:include>
	
	<!-- emp목록 출력 -->
	<div style="display:table;">
	
		<div class="list-title">
			<h1>사원 목록</h1>
		</div>
			
		
		<div style="display:table-row">
			<div class="list-cell" style="display:table-cell">직원 id</div>
			<div class="list-cell" style="display:table-cell">직원 이름</div>
			<div class="list-cell" style="display:table-cell">직급</div>
			<div class="list-cell" style="display:table-cell">고용일자</div>
			<div class="list-cell" style="display:table-cell">권한</div>
		</div>
		
		<%
			for(HashMap<String, Object> m : empList) {
		%>
				
					
					<div style="display:table-row">
						<div class="list-cell" style="display:table-cell"><%=m.get("empId") %></div>
						<div class="list-cell" style="display:table-cell"><%=m.get("empName") %></div>
						<div class="list-cell" style="display:table-cell"><%=m.get("empJob") %></div>
						<div class="list-cell" style="display:table-cell"><%=m.get("hireDate") %></div>
						<form action="/shop/emp/modifyEmpActive.jsp" method="post">
							<div class="list-cell" style="display:table-cell">
							<%
								// grade가 0보다 클 경우 active ON,OFF 권한 부여
								if((Integer)(getSessionMap.get("grade")) > 0) {
							%>
									<input type="hidden" name="empId" value="<%=m.get("empId") %>">
									<input type="hidden" name="active" value="<%=m.get("active") %>">
									<button type="submit"><%=m.get("active") %></button>
							<%
								} else {
							%>
									<button disabled="disabled"><%=m.get("active") %></button>
							<%
								}
							%>
								
							</div>
						</form>
					</div>
				
		<%
			}
		%>
	</div>
	
	<!-- 페이징 버튼 -->	
	<div>

		<%
			if(currentPage > 1) {
		%>	
				<a href="/shop/emp/empList.jsp?currentPage=1">처음페이지</a>
				<a href="/shop/emp/empList.jsp?currentPage=<%=currentPage-1%>">이전페이지</a>
		<%		
			} else {
		%>
				<a href="/shop/emp/empList.jsp?currentPage=1">처음페이지</a>
				<a href="/shop/emp/empList.jsp?currentPage=1">이전페이지</a>
		<%		
			}

			if(currentPage < lastPage) {
		%>
				<a href="/shop/emp/empList.jsp?currentPage=<%=currentPage+1%>">다음페이지</a>
				<a href="/shop/emp/empList.jsp?currentPage=<%=lastPage%>">마지막페이지</a>
		<%		
			} else {
		%>
				<a href="/shop/emp/empList.jsp?currentPage=<%=lastPage%>">다음페이지</a>
				<a href="/shop/emp/empList.jsp?currentPage=<%=lastPage%>">마지막페이지</a>
		<%
			}
		%>

	</div>
		
</body>
</html>

 

로그인 세션 체크 후 DB연결을 했다.

 empId, active값을 getParameter로 받는다.

[DB]shop.emp를 emp_id를 조건으로 주고 active를 변경시키는 UPDATE쿼리를 날린다.

active가 ON일 경우 OFF로, OFF일 경우 ON으로 변경시켜준다.

 

그후 empList로 redirect 해준다.

 

modifyEmpActive.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"%>

<%
    //DB 연결 및 초기화
    Class.forName("org.mariadb.jdbc.Driver");
    Connection conn = null;
    conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3307/shop", "root", "****");
    
    // 요청 값
    String empId = request.getParameter("empId");
    String active = request.getParameter("active");
    
    // 요청 값 체크
    System.out.println("modifyEmpActive - empId = " + empId);
    System.out.println("modifyEmpActive - active = " + active);
    
    // [DB]shop.emp의 active 값 수정
    /*
        [DB]shop.emp에 empId, empPw SQL문
        
        UPDATE emp
        SET active = 'ON' or 'OFF'
        WHERE emp_id = ?
    */
    
    String changeActiveSql = "UPDATE emp SET active = ? WHERE emp_id = ?";
    PreparedStatement changeActiveStmt = null; 
    changeActiveStmt = conn.prepareStatement(changeActiveSql);
    int row = 0;    // 쿼리 실행 확인
    
    // active 값 교체
    if(active.equals("ON")) {
        // active가 ON일 경우
        active = "OFF";
        changeActiveStmt.setString(1, active);
        changeActiveStmt.setString(2, empId);
        row = changeActiveStmt.executeUpdate();
    } else {    
        // active가 OFF일 경우
        active = "ON";
        changeActiveStmt.setString(1, active);
        changeActiveStmt.setString(2, empId);
        row = changeActiveStmt.executeUpdate();
    }
    
    System.out.println("modifyEmpActive - row = " + row);
    
    response.sendRedirect("/shop/emp/empList.jsp");

%>

권한 변경
grade가 0일경우 버튼 비활성화

728x90