From a9edf595d6722517a79439025bfe1d6b2a733ab9 Mon Sep 17 00:00:00 2001 From: KNKIM Date: Wed, 13 Oct 2021 14:11:51 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B9=84=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=20=EC=BF=A0=ED=82=A4=20=EC=B9=B4=ED=8A=B8=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20-=20=EC=A4=91?= =?UTF-8?q?=EA=B0=84=20=EB=B0=B1=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nlib/col/service/CartCookieVO.java | 113 +++++++ .../java/nlib/col/service/CartService.java | 19 +- .../java/nlib/col/service/CollectionVO.java | 7 + .../col/service/impl/CartServiceImpl.java | 319 ++++++++++++++++-- .../nlib/col/service/impl/CollectionDAO.java | 11 + .../service/impl/CollectionServiceImpl.java | 15 +- .../java/nlib/col/web/CartController.java | 90 ++++- .../nlib/security/SpringSecurityConfig.java | 1 + src/main/java/nlib/util/StringUtil.java | 23 +- .../mapper/nlib/col/CartDAO_SQL.xml | 4 +- .../mapper/nlib/col/CollectionDAO_SQL.xml | 15 + .../WEB-INF/jsp/nlib/cart/listCartItems.jsp | 14 +- .../WEB-INF/jsp/nlib/sample/listRentItem.jsp | 2 +- src/main/webapp/js/cart.js | 8 +- 14 files changed, 570 insertions(+), 71 deletions(-) create mode 100644 src/main/java/nlib/col/service/CartCookieVO.java create mode 100644 src/main/java/nlib/col/service/impl/CollectionDAO.java create mode 100644 src/main/resources/egovframework/mapper/nlib/col/CollectionDAO_SQL.xml diff --git a/src/main/java/nlib/col/service/CartCookieVO.java b/src/main/java/nlib/col/service/CartCookieVO.java new file mode 100644 index 00000000..1a816c5c --- /dev/null +++ b/src/main/java/nlib/col/service/CartCookieVO.java @@ -0,0 +1,113 @@ +package nlib.col.service; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import nlib.util.StringUtil; + +/** + *
+ * @Class Name : CartCookieVO.java
+ * 
+ * @Description : 비로그인 회원의 카트정보를 담는 쿠키 정보값 
+ * 
+ * 
+ * @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021)
+ *
+ * 
+ * + * @ ------------ -------- --------------------------- + * @ 수정일 수정자 수정내용 + * @ ------------ -------- --------------------------- + * @ 2021. 10. 13. KNKIM 최초 생성 + * + * + * @author 이씨플라자 * DIGITALSHIP KNKIM + * @since 2021. 10. 13. + * @version 1.0 + * + */ +public class CartCookieVO { + + String rentValues = null; /* 대출 목록으로 ":"로 구분되어 짐 */ + String readValues = null; /* 방문열람 목록으로 ":"로 구분되어 짐 */ + + /** + * 쿠키 카트값에 자료 항목을 추가한다. + * + * @param cartTypeCd + * @param masterId + * @return + */ + public String addCartItem(String cartTypeCd, String masterId) { + + if(StringUtil.isEmpty(cartTypeCd)) return "카트구분 정보가 없습니다."; + if(StringUtil.isEmpty(masterId)) return "자료정보가 없습니다."; + + String cartStr = null; + + if("1".equals(cartTypeCd)) cartStr = getRentValues(); + else if("2".equals(cartTypeCd)) cartStr = getReadValues(); + else return "카트구분 정보가 적합하지 않습니다."; + + cartStr = (StringUtil.isEmpty(cartStr) ? ":" : cartStr); + if(cartStr.contains(":" + masterId + ":")) return "이미 카트에 존재합니다."; + + cartStr += (":" + masterId + ":"); + + if("1".equals(cartTypeCd)) setRentValues(cartStr); + else if("2".equals(cartTypeCd)) setReadValues(cartStr); + + return null; + } + + /** + * 쿠키 카트값에서 자료 항목을 삭제한다. + * + * @param cartTypeCd + * @param masterId + * @return + */ + public String removeCartItem(String cartTypeCd, String masterId) { + + if(StringUtil.isEmpty(cartTypeCd)) return "카트구분 정보가 없습니다."; + if(StringUtil.isEmpty(masterId)) return "자료정보가 없습니다."; + + String cartStr = null; + + if("1".equals(cartTypeCd)) cartStr = getRentValues(); + else if("2".equals(cartTypeCd)) cartStr = getReadValues(); + else return "카트구분 정보가 적합하지 않습니다."; + + + cartStr = (StringUtil.isEmpty(cartStr) ? ":" : cartStr); + if(StringUtil.isEmpty(cartStr) || !cartStr.contains(":" + masterId + ":")) return "해당 자료는 카트에 존재하지 않습니다."; + + int startIdx = cartStr.indexOf(":" + masterId + ":"); + if(startIdx < 0) return "해당 자료는 카트에 존재하지 않습니다."; + + int endIdx = startIdx + (":" + masterId).length(); + + cartStr = cartStr.substring(0, startIdx) + cartStr.substring(endIdx); + + if("1".equals(cartTypeCd)) setRentValues(cartStr); + else if("2".equals(cartTypeCd)) setReadValues(cartStr); + + return null; + } + + // GET & SET + public String getRentValues() { + return rentValues; + } + public void setRentValues(String rentValues) { + this.rentValues = rentValues; + } + public String getReadValues() { + return readValues; + } + public void setReadValues(String readValues) { + this.readValues = readValues; + } + +} diff --git a/src/main/java/nlib/col/service/CartService.java b/src/main/java/nlib/col/service/CartService.java index e646bd95..2fafd9a1 100644 --- a/src/main/java/nlib/col/service/CartService.java +++ b/src/main/java/nlib/col/service/CartService.java @@ -1,16 +1,9 @@ package nlib.col.service; -import java.util.HashMap; import java.util.List; import javax.servlet.http.HttpServletRequest; - -import org.springframework.http.HttpMethod; - -import nlib.restful.service.DataApiReqVO; -import nlib.restful.service.DataApiResVO; -import nlib.restful.service.XmlConverter; -import nlib.util.StringUtil; +import javax.servlet.http.HttpServletResponse; public interface CartService { @@ -23,7 +16,7 @@ public interface CartService * @return * @throws Exception */ - public List listCartItems(String mbInfoId, String cartDivCd) throws Exception; + public List listCartItems(String mbInfoId, String cartTypeCd) throws Exception; /** * (비로그인자용) 쿠키에서 카트 목록을 조회한다. @@ -33,7 +26,7 @@ public interface CartService * @return * @throws Exception */ - public List listCartItemsFromCookie(HttpServletRequest request, String cartDivCd) throws Exception; + public List listCartItemsFromCookie(HttpServletRequest request, HttpServletResponse response, String cartDivCd) throws Exception; /** * (로그인자용) 카트 영역 구분코드를 변경한다. (대출 <-> 방문열람) @@ -53,7 +46,7 @@ public interface CartService * @return * @throws Exception */ - public int changeCartTypeFromCookie(HttpServletRequest request, List targetCartItems) throws Exception; + public String changeCartTypeToCookie(HttpServletRequest request, HttpServletResponse response, CollectionVO cartVO) throws Exception; /** * (로그인자용) 카트에 추가한다. @@ -71,7 +64,7 @@ public interface CartService * @return * @throws Exception */ - public String insertCartItemToCookie(HttpServletRequest request, CollectionVO cartVO) throws Exception; + public String insertCartItemToCookie(HttpServletRequest request, HttpServletResponse response, CollectionVO cartVO) throws Exception; /** * (로그인자용) 카트에서 선택된 자료들을 삭제한다. @@ -89,7 +82,7 @@ public interface CartService * @return * @throws Exception */ - public String deleteCartItems(HttpServletRequest request, List targetCartItems) throws Exception; + public String deleteCartItemsFromCookie(HttpServletRequest request, HttpServletResponse response, CollectionVO cartVO) throws Exception; /** * 비로그인시 카트에 저장된 내역을 로그인한 후 해당 사용자의 카트로 저장하고, 쿠키 카트내용은 초기화한다. diff --git a/src/main/java/nlib/col/service/CollectionVO.java b/src/main/java/nlib/col/service/CollectionVO.java index 0186c440..23eed0c0 100644 --- a/src/main/java/nlib/col/service/CollectionVO.java +++ b/src/main/java/nlib/col/service/CollectionVO.java @@ -137,6 +137,13 @@ public class CollectionVO extends PagingVO { this.resultMessage = resultMessage; } + public static CollectionVO createWithMasterId(String cartTypeCd, String masterId) { + CollectionVO vo = new CollectionVO(); + vo.setCartTypeCd(cartTypeCd); + vo.setMasterId(masterId); + return vo; + } + // GET & SET public String getMasterId() { diff --git a/src/main/java/nlib/col/service/impl/CartServiceImpl.java b/src/main/java/nlib/col/service/impl/CartServiceImpl.java index da77606a..285f6655 100644 --- a/src/main/java/nlib/col/service/impl/CartServiceImpl.java +++ b/src/main/java/nlib/col/service/impl/CartServiceImpl.java @@ -1,14 +1,18 @@ package nlib.col.service.impl; +import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; +import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; +import nlib.col.service.CartCookieVO; import nlib.col.service.CartService; import nlib.col.service.CollectionService; import nlib.col.service.CollectionVO; @@ -41,6 +45,10 @@ public class CartServiceImpl implements CartService { private static final Logger log = LoggerFactory.getLogger(CartServiceImpl.class); + // 비로그인회원의 카트정보 쿠키명 + public static final String CART_COOKIE_NAME = "_NLIB_COOKIE"; + + @Resource(name="cartDAO") private CartDAO cartDAO; @@ -67,8 +75,31 @@ public class CartServiceImpl implements CartService * @return * @throws Exception */ - public List listCartItemsFromCookie(HttpServletRequest request, String cartDivCd) throws Exception { - return null; + public List listCartItemsFromCookie(HttpServletRequest request, HttpServletResponse response, String cartDivCd) throws Exception { + Cookie[] cookies = request.getCookies(); + if(cookies == null || cookies.length < 1) return null; + + List list = new ArrayList(); + + String targetCookieName = CART_COOKIE_NAME + (cartDivCd == null || cartDivCd.equals("0") ? "" : cartDivCd); + + for(Cookie cookie : cookies) { + String cookieName = cookie.getName(); + if(cookieName.startsWith(targetCookieName)) { + + // _NLIB_COOKIE1=:masterId:masterId: + String cartStr = cookie.getValue(); + String[] cartItemsStr = cartStr.split(":"); + for(String itemStr : cartItemsStr) { + if(StringUtil.isEmpty(itemStr)) continue; + CollectionVO vo = CollectionVO.createWithMasterId(cookieName.substring(cookieName.length()-2), itemStr); + vo.setMbCartId(vo.getMasterId()); // 비회원 쿠키 카트의 경우, 카트ID를 자료ID로 대체한다. + if(vo != null) list.add(vo); + } + } + } + + return list; } /** @@ -82,6 +113,11 @@ public class CartServiceImpl implements CartService public String changeCartType(CollectionVO cartVO) throws Exception { if(cartVO == null || StringUtil.isEmpty(cartVO.getMbInfoId())) return "회원 정보가 없습니다."; if(StringUtil.isEmpty(cartVO.getSelItems())) return "변경할 대상 정보가 없습니다."; + + String checkResult = checkValidCartItems(cartVO.getCartTypeCd(), cartVO.getSelItems()); + if(checkResult != null) return checkResult; + + updateSelItemsForDB(cartVO); int resultCnt = cartDAO.changeCartType(cartVO); if(resultCnt > 0) return null; @@ -97,8 +133,65 @@ public class CartServiceImpl implements CartService * @return * @throws Exception */ - public int changeCartTypeFromCookie(HttpServletRequest request, List targetCartItems) throws Exception { - return 0; + public String changeCartTypeToCookie(HttpServletRequest request, HttpServletResponse response, CollectionVO cartVO) throws Exception { + + if(cartVO == null) return "요청 정보가 없습니다."; + if(StringUtil.isEmpty(cartVO.getSelItems())) return "변경할 대상 정보가 없습니다."; + + String checkResult = checkValidCartItems(cartVO.getCartTypeCd(), cartVO.getSelItems()); + if(checkResult != null) return checkResult; + + int totCnt = 0; + int sucCnt = 0; + int errCnt = 0; + + String addCartTypeCd = null; + String delCartTypeCd = null; + + if("1".equals(cartVO.getCartTypeCd())) { + addCartTypeCd = "1"; + delCartTypeCd = "2"; + } else if("2".equals(cartVO.getCartTypeCd())) { + addCartTypeCd = "2"; + delCartTypeCd = "1"; + } else { + return "카트 구분값 정보가 정확하지 않습니다."; + } + + String[] masterIds = cartVO.getSelItems().split(","); + String resultMsgAdd = null; + String resultMsgDel = null; + + // 쿠키 카트 정보 가져오기 + CartCookieVO cartCookie = getCartCookieInfo(request); + + for(int i=0; i " + delCartTypeCd + "카트 " + masterIds[i] + " : 삭제오류 => " + resultMsgDel); + } else { + errCnt++; + log.error("changeCartTypeFromCookie adding > " + addCartTypeCd + "카트 " + masterIds[i] + " : 추가 오류 => " + resultMsgAdd); + } + + } + + if(sucCnt > 0) { + String result = setCookieCart(response, cartCookie); + if(result == null) { + if(totCnt == sucCnt) return null; + else return String.format("총 %d건의 자료 중 %d건에 대한 변경 처리가 정상적으로 처리되었습니다.", totCnt, sucCnt); + } else { + return result; + } + } + + return StringUtil.getString(resultMsgAdd, "") + StringUtil.getString(resultMsgDel, ""); } /** @@ -124,6 +217,126 @@ public class CartServiceImpl implements CartService return "등록 처리에 실패하였습니다. 관리자에게 문의하여 주시기 바랍니다."; } + /** + * (비로그인자용) 카트에 추가한다. + * + * @param cartVO + * @return + * @throws Exception + */ + public String insertCartItemToCookie(HttpServletRequest request, HttpServletResponse response, CollectionVO cartVO) throws Exception { + + cartVO = checkValidCartItem(cartVO); + + if(cartVO.getResultCode().charAt(0) != 'S') return cartVO.getResultMessage(); + + + //----------------------------------------------- + // 등록 처리 + //----------------------------------------------- + + // 쿠키 카트 정보 가져오기 + CartCookieVO cartCookie = getCartCookieInfo(request); + String result = cartCookie.addCartItem(cartVO.getCartTypeCd(), cartVO.getMasterId()); + + if(result != null) return result; + + return setCookieCart(response, cartCookie); + } + + /** + * (비로그인자용) 쿠키에서 카트 정보를 조회하여 CartCookieVO 생성하여 리턴한다. + * + * @param request + * @return + */ + public CartCookieVO getCartCookieInfo(HttpServletRequest request) { + CartCookieVO cartCookieInfo = new CartCookieVO(); + cartCookieInfo.setRentValues(getCookie(request, CART_COOKIE_NAME + "1")); + cartCookieInfo.setReadValues(getCookie(request, CART_COOKIE_NAME + "2")); + + return cartCookieInfo; + } + + /** + * (비로그인자용) 쿠키 카트에 자료 항목을 추가한다. + * + * @param request + * @param response + * @param cartTypeCd + * @param masterId + * @return + */ + public String setCookieCart(HttpServletResponse response, CartCookieVO cartCookie) { + + if(response == null) return "쿠키를 저장할 Response 객체 정보가 없습니다."; + if(cartCookie == null) return "쿠키에 저장할 카트정보가 없습니다."; + + setCookie(response, CART_COOKIE_NAME + "1", cartCookie.getRentValues()); + setCookie(response, CART_COOKIE_NAME + "2", cartCookie.getReadValues()); + + return null; + } + + /** + * (비로그인자용) 쿠키값을 설정한다. + * + * @param response + * @param name + * @param value + */ + public void setCookie(HttpServletResponse response, String name, String value) { + Cookie cookie = new Cookie(name, value); + response.addCookie(cookie); + } + + /** + * (비로그인자용) 쿠키값을 가져온다. + * + * @param request + * @param cookieName + * @return + */ + public String getCookie(HttpServletRequest request, String cookieName) { + Cookie[] cookies = request.getCookies(); + + if(cookies == null || cookies.length < 1) return null; + if(StringUtil.isEmpty(cookieName)) return null; + + for(Cookie cookie : cookies) { + if(cookieName.equalsIgnoreCase(cookie.getName())) { + return cookie.getValue(); + } + } + + return null; + } + + + /** + * 해당 자료가 대출/열람 카트 유형에 추가될 수 있는지 검증한다. + * + * @param String : null 정상 + * @return + * @throws Exception + */ + public String checkValidCartItems(String cartTypeCd, String selItems) throws Exception { + + if(StringUtil.isEmpty(cartTypeCd)) return "카트 유형 정보가 존재하지 않습니다."; + if(StringUtil.isEmpty(selItems)) return "대상 자료 정보가 존재하지 않습니다."; + + String masterIds[] = selItems.split(","); + for(int i=0; i 0) return null; return "변경 처리에 실패하였습니다. 관리자에게 문의하여 주시기 바랍니다."; - } - + /** * (비로그인자용) 카트에서 선택된 자료들을 삭제한다. * @@ -245,10 +453,75 @@ public class CartServiceImpl implements CartService * @return * @throws Exception */ - public String deleteCartItems(HttpServletRequest request, List targetCartItems) throws Exception { - return null; - } + public String deleteCartItemsFromCookie(HttpServletRequest request, HttpServletResponse response, CollectionVO cartVO) throws Exception { + if(cartVO == null) return "요청 정보가 없습니다."; + if(StringUtil.isEmpty(cartVO.getSelItems())) return "변경할 대상 정보가 없습니다."; + + int totCnt = 0; + int sucCnt = 0; + int errCnt = 0; + + String delCartTypeCd = cartVO.getCartTypeCd(); + + if(!"1".equals(delCartTypeCd) && !"2".equals(delCartTypeCd)) { + return "카트 구분값 정보가 정확하지 않습니다."; + } + + // 쿠키 카트 정보 가져오기 + CartCookieVO cartCookie = getCartCookieInfo(request); + + String[] masterIds = cartVO.getSelItems().split(","); + String resultMsgDel = null; + for(int i=0; i " + delCartTypeCd + "카트 " + masterIds[i] + " : 삭제 오류 => " + resultMsgDel); + } + } + + if(sucCnt > 0) { + String result = setCookieCart(response, cartCookie); + if(result == null) { + if(totCnt == sucCnt) return null; + else return String.format("총 %d건의 자료 중 %d건에 대한 삭제가 정상적으로 처리되었습니다.", totCnt, sucCnt); + } else { + return result; + } + } + + return StringUtil.getString(resultMsgDel, ""); + } + + public void updateSelItemsForDB(CollectionVO cartVO) { + + if(cartVO == null || StringUtil.isEmpty(cartVO.getMbInfoId())) return; + + String selItems = cartVO.getSelItems(); + + if(!selItems.startsWith("'")) { + String[] items = selItems.split(","); + String newSelItems = ""; + for(String item : items) { + + if(StringUtil.isEmpty(item)) continue; + + if(newSelItems.length() > 0) newSelItems += ","; + + newSelItems += "'" + item + "'"; + } + cartVO.setSelItems(newSelItems); + } + + log.debug("updateSelItemsForDB > " + cartVO.getSelItems()); + } + /** * 비로그인시 카트에 저장된 내역을 로그인한 후 해당 사용자의 카트로 저장하고, 쿠키 카트내용은 초기화한다. * @@ -261,4 +534,4 @@ public class CartServiceImpl implements CartService return 0; } -} \ No newline at end of file +} diff --git a/src/main/java/nlib/col/service/impl/CollectionDAO.java b/src/main/java/nlib/col/service/impl/CollectionDAO.java new file mode 100644 index 00000000..b7d4edcb --- /dev/null +++ b/src/main/java/nlib/col/service/impl/CollectionDAO.java @@ -0,0 +1,11 @@ +package nlib.col.service.impl; + +import egovframework.rte.psl.dataaccess.mapper.Mapper; +import nlib.col.service.CollectionVO; + +@Mapper("collectionDAO") +public interface CollectionDAO { + + public CollectionVO selectMngOrgInfo(String masterId) throws Exception; + +} \ No newline at end of file diff --git a/src/main/java/nlib/col/service/impl/CollectionServiceImpl.java b/src/main/java/nlib/col/service/impl/CollectionServiceImpl.java index e7daf76f..d8b74d94 100644 --- a/src/main/java/nlib/col/service/impl/CollectionServiceImpl.java +++ b/src/main/java/nlib/col/service/impl/CollectionServiceImpl.java @@ -49,6 +49,10 @@ public class CollectionServiceImpl implements CollectionService { @Resource(name = "dataApi") private DataApi dataApi; + @Resource(name="collectionDAO") + private CollectionDAO collectionDAO; + + /** * 자료 상세정보를 조회한다. * @@ -262,8 +266,17 @@ public class CollectionServiceImpl implements CollectionService { vo.setRsrvPsblYn (cVO.getRsrvPsblYn()); vo.setReqPsblYn (cVO.getReqPsblYn()); vo.setInterestYn (cVO.getInterestYn()); + + // DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD + // API에 존재하지 않을 경우, 추가 DB 조회 + if(StringUtil.isEmpty(cVO.getMngOrgCd()) || StringUtil.isEmpty(cVO.getMngOrgNm())) { + CollectionVO dbVO = collectionDAO.selectMngOrgInfo(vo.getMasterId()); + if(dbVO != null) { + vo.setMngOrgCd(dbVO.getMngOrgCd()); + vo.setMngOrgNm(dbVO.getMngOrgNm()); + } + } } - // // // DDDDDDDDDDDDDDDDDd 문화원 멀티 처리를 위해 테스트용으로 데이터 변경 // CollectionVO vo = list.get(cnt-2); diff --git a/src/main/java/nlib/col/web/CartController.java b/src/main/java/nlib/col/web/CartController.java index 519708cf..6994f4b6 100644 --- a/src/main/java/nlib/col/web/CartController.java +++ b/src/main/java/nlib/col/web/CartController.java @@ -1,10 +1,13 @@ package nlib.col.web; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -63,15 +66,16 @@ public class CartController extends NlibCommonController * 로그인되지 않은 사용자의 경우, 쿠키에 저장된 값으로 처리한다. * * @param request - * @param cartTypeCd + * @param cartTyp + * eCd * @param model * @return * @throws Exception */ @RequestMapping("/cart/listCartItems.do") - public String listCartItems(HttpServletRequest request, String message, String cartTypeCd, ModelMap model) throws Exception { + public String listCartItems(HttpServletRequest request, HttpServletResponse response, String message, String cartTypeCd, ModelMap model) throws Exception { - if(StringUtil.isEmpty(cartTypeCd)) cartTypeCd = "0"; // 대출 기본 설정 + if(StringUtil.isEmpty(cartTypeCd)) cartTypeCd = "1"; // 대출 기본 설정 String mbInfoId = getMbInfoId(request); @@ -80,20 +84,72 @@ public class CartController extends NlibCommonController // 카트 목록 가져오기 if(StringUtil.isEmpty(mbInfoId)) { // 쿠키에서 값 가져오기 - list = cartService.listCartItemsFromCookie(request, cartTypeCd); + list = cartService.listCartItemsFromCookie(request, response, cartTypeCd); + + // 카트 목록 자료에 대한 상세자료 설정 + collectionService.setDetailInfoForList(list); + + // 문화원별 정령 처리 + list = sortCollectionListByMngOrgCd(list); } else { list = cartService.listCartItems(mbInfoId, cartTypeCd); + + // 카트 목록 자료에 대한 상세자료 설정 + collectionService.setDetailInfoForList(list); } - // 카트 목록 자료에 대한 상세자료 설정 - collectionService.setDetailInfoForList(list); + if(StringUtil.isNotEmpty(message) && message.startsWith("%")) { + message = StringUtil.decodeUrl(message); + } model.addAttribute("list", list); model.addAttribute("cartTypeCd", cartTypeCd); model.addAttribute("message", message); return "nlib/cart/listCartItems"; } + + /** + * 자료 목록을 문화원별로 정렬하여 리턴한다. + * + * @param list + * @return + */ + public List sortCollectionListByMngOrgCd(List list) { + + if(list == null || list.size() < 1) return list; + + Map> orgMap = new HashMap>(); + + for(CollectionVO vo : list) { + String mngOrgCd = vo.getMngOrgCd(); + + if(StringUtil.isEmpty(mngOrgCd)) { + mngOrgCd = "NONE"; + vo.setMngOrgCd(mngOrgCd); + vo.setMngOrgNm("(없음)"); + } + List orgList = orgMap.get(mngOrgCd); + if(orgList == null) { + orgList = new ArrayList(); + } + + orgList.add(vo); + + orgMap.put(mngOrgCd, orgList); + } + + List retList = new ArrayList(); + for(String key : orgMap.keySet()) { + List orgList = orgMap.get(key); + + for(CollectionVO vo : orgList) { + retList.add(vo); + } + } + + return retList; + } /** * 카트 영역 구분코드를 변경한다. (대출 <-> 방문열람) @@ -105,20 +161,21 @@ public class CartController extends NlibCommonController * @throws Exception */ @RequestMapping("/cart/changeCartType.do") - public String changeCartType(HttpServletRequest request, CollectionVO cartVO, ModelMap model) throws Exception { + public String changeCartType(HttpServletRequest request, HttpServletResponse response, CollectionVO cartVO, ModelMap model) throws Exception { String message = null; String mbInfoId = getMbInfoId(request); if(StringUtil.isEmpty(mbInfoId)) { - cartService.changeCartTypeFromCookie(request, null); + message = cartService.changeCartTypeToCookie(request, response, cartVO); } else { cartVO.setMbInfoId(getMbInfoId(request)); message = cartService.changeCartType(cartVO); } if(message == null) message = "정상적으로 변경되었습니다."; - model.addAttribute("message", message); + model.addAttribute("message", StringUtil.encodeUrl(message)); + model.addAttribute("cartTypeCd", cartVO.getCartTypeCd()); return "redirect:/cart/listCartItems.do"; } @@ -132,7 +189,7 @@ public class CartController extends NlibCommonController * @throws Exception */ @RequestMapping("/cart/insertCartItemAjax.do") - public ResponseEntity insertCartItemAjax(HttpServletRequest request, @RequestBody CollectionVO cartVO, ModelMap model) throws Exception { + public ResponseEntity insertCartItemAjax(HttpServletRequest request, HttpServletResponse response, @RequestBody CollectionVO cartVO, ModelMap model) throws Exception { log.debug("insertCartItemAjax > masterId = " + cartVO.getMasterId()); @@ -152,11 +209,10 @@ public class CartController extends NlibCommonController cartVO.setMbInfoId(mbInfoId); cartVO.setRegId(mbInfoId); message = cartService.insertCartItem(cartVO); - } // 비회원인 경우 else { - message = cartService.insertCartItemToCookie(request, cartVO); + message = cartService.insertCartItemToCookie(request, response, cartVO); } if(message == null) { @@ -187,10 +243,16 @@ public class CartController extends NlibCommonController } @RequestMapping("/cart/deleteCartItems.do") - public String deleteCartItems(HttpServletRequest request, CollectionVO cartVO, ModelMap model) throws Exception { + public String deleteCartItems(HttpServletRequest request, HttpServletResponse response, CollectionVO cartVO, ModelMap model) throws Exception { String mbInfoId = getMbInfoId(request); cartVO.setMbInfoId(mbInfoId); - String message = cartService.deleteCartItems(cartVO); + String message = null; + + if(!StringUtil.isEmpty(mbInfoId)) { + message = cartService.deleteCartItems(cartVO); + } else { + message = cartService.deleteCartItemsFromCookie(request, response, cartVO); + } if(message == null) message = "정상적으로 삭제되었습니다."; model.addAttribute("message", StringUtil.encodeUrl(message)); diff --git a/src/main/java/nlib/security/SpringSecurityConfig.java b/src/main/java/nlib/security/SpringSecurityConfig.java index 61ea8099..04cf45d3 100644 --- a/src/main/java/nlib/security/SpringSecurityConfig.java +++ b/src/main/java/nlib/security/SpringSecurityConfig.java @@ -87,6 +87,7 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { .antMatchers("/code/**").permitAll() .antMatchers("/homes/**").permitAll() .antMatchers("/homes/**").permitAll() + .antMatchers("/cart/**").permitAll() .antMatchers("/bbs/**").permitAll() .anyRequest().authenticated() .and().formLogin() diff --git a/src/main/java/nlib/util/StringUtil.java b/src/main/java/nlib/util/StringUtil.java index 19b22b38..d1bcd04d 100644 --- a/src/main/java/nlib/util/StringUtil.java +++ b/src/main/java/nlib/util/StringUtil.java @@ -1,6 +1,7 @@ package nlib.util; import java.net.URL; +import java.net.URLDecoder; import java.net.URLEncoder; import java.sql.Timestamp; import java.text.SimpleDateFormat; @@ -123,7 +124,7 @@ public class StringUtil extends StringUtils { } /** - * Base64로 인코딩한다. + * URLEncoder로 인코딩한다. * * @return */ @@ -142,6 +143,26 @@ public class StringUtil extends StringUtils { return encodedStr; } + /** + * URLDecoder로 디코딩한다. + * + * @return + */ + public static String decodeUrl(String str) { + + if(isEmpty(str)) return ""; + + String decodedStr = null; + + try { + decodedStr = URLDecoder.decode(str, "UTF-8"); + } catch(Exception e) { + log.error("encodeUrl > Error while encoding for [" + str + "] " + e.toString()); + decodedStr = str; + } + return decodedStr; + } + /** * Base64로 인코딩한다. * diff --git a/src/main/resources/egovframework/mapper/nlib/col/CartDAO_SQL.xml b/src/main/resources/egovframework/mapper/nlib/col/CartDAO_SQL.xml index 9a65915c..e83e04e8 100644 --- a/src/main/resources/egovframework/mapper/nlib/col/CartDAO_SQL.xml +++ b/src/main/resources/egovframework/mapper/nlib/col/CartDAO_SQL.xml @@ -74,7 +74,7 @@ @@ -83,7 +83,7 @@ diff --git a/src/main/resources/egovframework/mapper/nlib/col/CollectionDAO_SQL.xml b/src/main/resources/egovframework/mapper/nlib/col/CollectionDAO_SQL.xml new file mode 100644 index 00000000..9acdc0da --- /dev/null +++ b/src/main/resources/egovframework/mapper/nlib/col/CollectionDAO_SQL.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/nlib/cart/listCartItems.jsp b/src/main/webapp/WEB-INF/jsp/nlib/cart/listCartItems.jsp index 44b0290c..337c9333 100644 --- a/src/main/webapp/WEB-INF/jsp/nlib/cart/listCartItems.jsp +++ b/src/main/webapp/WEB-INF/jsp/nlib/cart/listCartItems.jsp @@ -189,16 +189,7 @@ function fn_changeCartItems(cartTypeCd, cartTypeNm) { cartTypeCd = mngOrgCd = selItems = - message = ${message }
- - 전체 - - - 전체 - - -   |   대출 @@ -268,10 +259,11 @@ function fn_changeCartItems(cartTypeCd, cartTypeNm) { chk_item_${cart.mngOrgCd } - + ${cart.mbCartId } : ${cart.interestYn } - ${cart.title } + ${cart.title }
+ ${cart.masterId } ${cart.mngOrgCd } diff --git a/src/main/webapp/WEB-INF/jsp/nlib/sample/listRentItem.jsp b/src/main/webapp/WEB-INF/jsp/nlib/sample/listRentItem.jsp index 67d31e54..4b215809 100644 --- a/src/main/webapp/WEB-INF/jsp/nlib/sample/listRentItem.jsp +++ b/src/main/webapp/WEB-INF/jsp/nlib/sample/listRentItem.jsp @@ -85,7 +85,7 @@      > useStatus = ${record.useStatus}
     > masterId = ${record.masterId}
- +
diff --git a/src/main/webapp/js/cart.js b/src/main/webapp/js/cart.js index c7c7f5ab..32fbcc43 100644 --- a/src/main/webapp/js/cart.js +++ b/src/main/webapp/js/cart.js @@ -6,7 +6,7 @@ * */ -function fn_addRentCart(masterId, mngOrgCd, typeDivCd, useStatus) { +function fn_addRentCart(masterId, useStatus) { /* useStatus 01 : 이용가능 @@ -17,7 +17,7 @@ function fn_addRentCart(masterId, mngOrgCd, typeDivCd, useStatus) { 06 : 열람대기(대출불가능) 07 : 온라인열람만" */ - fn_addRentCartItem(masterId, mngOrgCd, typeDivCd, useStatus + fn_addRentCartItem(masterId, useStatus , function(data) { if(data.code == "S") { if(confirm(data.message + "\n카트로 이동하시겠습니까?")) { @@ -39,7 +39,7 @@ function fn_gotoCart() { location.href = "/cart/listCartItems.do"; } -function fn_addRentCartItem(masterId, mngOrgCd, typeDivCd, useStatus, resolve, reject) { +function fn_addRentCartItem(masterId, useStatus, resolve, reject) { var cartTypeCd = null; @@ -73,8 +73,6 @@ function fn_addRentCartItem(masterId, mngOrgCd, typeDivCd, useStatus, resolve, r type : "POST", data: JSON.stringify({ masterId : masterId, - mngOrgCd : mngOrgCd, - typeDivCd : typeDivCd, cartTypeCd : cartTypeCd }), success : function(data) {