Explorar el Código

Merge branch 'develop' of http://112.172.147.34:4936/style24/style24.front.git into develop

eskim hace 5 años
padre
commit
fa498ca522
Se han modificado 22 ficheros con 781 adiciones y 213 borrados
  1. 9 0
      src/main/java/com/style24/front/biz/dao/TsfCommonDao.java
  2. 66 1
      src/main/java/com/style24/front/biz/dao/TsfPlanningDao.java
  3. 68 0
      src/main/java/com/style24/front/biz/service/TsfPlanningService.java
  4. 31 1
      src/main/java/com/style24/front/biz/web/TsfDisplayController.java
  5. 0 4
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  6. 39 21
      src/main/java/com/style24/front/biz/web/TsfPlanningController.java
  7. 2 46
      src/main/java/com/style24/front/support/controller/TsfBaseController.java
  8. 7 4
      src/main/java/com/style24/front/support/controller/TsfCustomErrorController.java
  9. 68 0
      src/main/java/com/style24/front/support/util/ViewUtils.java
  10. 2 1
      src/main/java/com/style24/persistence/domain/Login.java
  11. 5 1
      src/main/java/com/style24/persistence/domain/Plan.java
  12. 7 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfCommon.xml
  13. 17 16
      src/main/java/com/style24/persistence/mybatis/shop/TsfLogin.xml
  14. 124 33
      src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml
  15. 8 1
      src/main/webapp/WEB-INF/views/mob/error/404Mob.html
  16. 161 0
      src/main/webapp/WEB-INF/views/web/display/LookbookMainFormWeb.html
  17. 9 2
      src/main/webapp/WEB-INF/views/web/error/404Web.html
  18. 4 5
      src/main/webapp/WEB-INF/views/web/mypage/MypageGiftcardFormWeb.html
  19. 17 75
      src/main/webapp/WEB-INF/views/web/mypage/MypageWishListFormWeb.html
  20. 2 2
      src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html
  21. 133 0
      src/main/webapp/WEB-INF/views/web/planning/PlanningShotGuideFormWeb.html
  22. 2 0
      src/main/webapp/ux/style24_link.js

+ 9 - 0
src/main/java/com/style24/front/biz/dao/TsfCommonDao.java

@@ -33,6 +33,15 @@ public interface TsfCommonDao {
 	 */
 	void createInflowHistory(InflowHst inflow);
 
+	/**
+	 * 웹제휴채널명 조회
+	 * @param afLinkCd - 웹제휴링크코드
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 30
+	 */
+	String getAfLinkName(String afLinkCd);
+
 //	/**
 //	 * 기본답변문구내용 조회
 //	 *

+ 66 - 1
src/main/java/com/style24/front/biz/dao/TsfPlanningDao.java

@@ -46,13 +46,58 @@ public interface TsfPlanningDao {
 
 	/**
 	 * 기획전 상품 목록
-	 * @param
+	 * @param plan - 기획전 정보
 	 * @return
 	 * @author gagamel
 	 * @since 2021. 3. 29
 	 */
 	Collection<Plan> getPlanningGoodsList(Plan plan);
 
+	/**
+	 * 디바이스접근가능여부 조회
+	 * @param plan - 기획전 정보
+	 * @return Y:접근가능 / N:접근불가
+	 * @author gagamel
+	 * @since 2021. 3. 30
+	 */
+	String getDeviceAccessibleYn(Plan plan);
+
+	/**
+	 * 신규회원접근가능여부 조회
+	 * @param plan - 기획전 정보
+	 * @return Y:접근가능 / N:접근불가
+	 * @author gagamel
+	 * @since 2021. 3. 30
+	 */
+	String getNewCustomerAccessibleYn(Plan plan);
+
+	/**
+	 * 고객구분접근가능여부 조회
+	 * @param plan - 기획전 정보
+	 * @return Y:접근가능 / N:접근불가
+	 * @author gagamel
+	 * @since 2021. 3. 30
+	 */
+	String getCustomerGubunAccessibleYn(Plan plan);
+
+	/**
+	 * 고객등급접근가능여부 조회
+	 * @param plan - 기획전 정보
+	 * @return Y:접근가능 / N:접근불가
+	 * @author gagamel
+	 * @since 2021. 3. 30
+	 */
+	String getCustomerGradeAccessibleYn(Plan plan);
+
+	/**
+	 * 웹제휴채널접근가능여부 조회
+	 * @param plan - 기획전 정보
+	 * @return Y:접근가능 / N:접근불가
+	 * @author gagamel
+	 * @since 2021. 3. 30
+	 */
+	String getAfLinkAccessibleYn(Plan plan);
+
 //	/**
 //	 * 기획전 목록 + 상품
 //	 *
@@ -171,6 +216,17 @@ public interface TsfPlanningDao {
 	 * @date 2021. 3. 23
 	 */
 	Collection<Plan> getPlanGoods1Info(Plan plan);
+	
+
+	/**
+	 * 기획전 코너 리스트
+	 *
+	 * @param 기획전 번호
+	 * @return
+	 * @author sowon
+	 * @date 2021. 3. 30
+	 */
+	Collection<Plan> getPlanCornerList(Plan plan);
 
 	/**
 	 * 이벤트 갯수 조회
@@ -192,4 +248,13 @@ public interface TsfPlanningDao {
 	 */
 	Collection<Plan> getPlanEventList(Plan plan);
 
+	/**
+	 * 총알배송 html 소스 
+	 *
+	 * @param plan
+	 * @return plan
+	 * @author sowon
+	 * @date 2021. 3. 30
+	 */
+	Plan getShotDeliveryHtml(Plan plan);
 }

+ 68 - 0
src/main/java/com/style24/front/biz/service/TsfPlanningService.java

@@ -2,10 +2,12 @@ package com.style24.front.biz.service;
 
 import java.util.Collection;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.style24.front.biz.dao.TsfCommonDao;
 import com.style24.front.biz.dao.TsfPlanningDao;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Coupon;
@@ -30,6 +32,9 @@ public class TsfPlanningService {
 	@Autowired
 	private TsfCouponService couponService;
 
+	@Autowired
+	private TsfCommonDao commonDao;
+
 	/**
 	 * 기획전 카테고리 목록
 	 * @param plan - 기획전 정보
@@ -110,6 +115,57 @@ public class TsfPlanningService {
 //		return planningDao.getPlanGoodsList(plan);
 //	}
 
+	/**
+	 * 기획전에 대해 접근여부 체크
+	 * @param planSq - 기획전번호
+	 * @author gagamel
+	 * @since 2021. 3. 30
+	 */
+	public void checkAccessablePlanning(Integer planSq) {
+		Plan plan = new Plan();
+		plan.setPlanSq(planSq);
+
+		// 디바이스접근가능여부 조회
+		plan.setFrontGb(TsfSession.getFrontGb());
+		if ("N".equals(planningDao.getDeviceAccessibleYn(plan))) {
+			String msg = "PC웹에서만 접근이 가능합니다.";
+			if ("M".equals(TsfSession.getFrontGb())) {
+				msg = "모바일웹에서만 접근이 가능합니다.";
+			} else if ("A".equals(TsfSession.getFrontGb())) {
+				msg = "앱에서만 접근이 가능합니다.";
+			}
+
+			throw new IllegalArgumentException(msg);
+		}
+
+		// 신규회원접근가능여부 조회
+		if ("N".equals(planningDao.getNewCustomerAccessibleYn(plan))) {
+			throw new IllegalArgumentException("신규회원만 접근 가능합니다.");
+		}
+
+		if (TsfSession.isLogin()) {
+			// 고객구분접근가능여부 조회
+			plan.setCustGb(TsfSession.getCustGb());
+			if ("N".equals(planningDao.getCustomerGubunAccessibleYn(plan))) {
+				throw new IllegalArgumentException(TsfSession.getInfo().getCustGbNm() + "만 접근이 가능합니다.");
+			}
+
+			// 고객등급접근가능여부 조회
+			plan.setCustGrade(TsfSession.getInfo().getCustGrade());
+			if ("N".equals(planningDao.getCustomerGradeAccessibleYn(plan))) {
+				throw new IllegalArgumentException(TsfSession.getInfo().getCustGradeNm() + "만 접근 가능합니다.");
+			}
+		}
+
+		if (StringUtils.isNotBlank(TsfSession.getAttribute("afLinkCd"))) {
+			// 웹제휴채널접근가능여부 조회
+			plan.setAfLinkCd(TsfSession.getAttribute("afLinkCd"));
+			if ("N".equals(planningDao.getAfLinkAccessibleYn(plan))) {
+				throw new IllegalArgumentException(commonDao.getAfLinkName(TsfSession.getAttribute("afLinkCd")) + " 채널만 접근 가능합니다.");
+			}
+		}
+	}
+
 	/**
 	 * 기획전 고객등급 목록
 	 *
@@ -245,5 +301,17 @@ public class TsfPlanningService {
 	public Collection<Plan> getPlanEventList(Plan plan) {
 		return planningDao.getPlanEventList(plan);
 	}
+	
+	/**
+	 * 총알배송 html 소스 
+	 *
+	 * @param plan
+	 * @return plan
+	 * @author sowon
+	 * @date 2021. 3. 30
+	 */
+	public Plan getShotDeliveryHtml(Plan plan) {
+		return planningDao.getShotDeliveryHtml(plan);
+	}
 
 }

+ 31 - 1
src/main/java/com/style24/front/biz/web/TsfDisplayController.java

@@ -7,6 +7,8 @@ import java.util.HashMap;
 
 import javax.servlet.http.HttpServletResponse;
 
+import com.gagaframework.web.parameter.GagaMap;
+import com.style24.core.support.env.TscConstants;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.BrandGroup;
 import com.style24.persistence.domain.Cate4Srch;
@@ -264,7 +266,7 @@ public class TsfDisplayController extends TsfBaseController {
 				Plan plan = new Plan();
 				plan.setBrandGroupNo(Integer.parseInt(paramMap.get("brandGroupNo")));
 				plan.setMaxRow(6);
-				plan.setFrontGb("P");
+				plan.setFrontGb(TsfSession.getFrontGb());
 				plan.setSiteCd("G000_10");
 				brandMain.setPlanningList(planningService.getPlanningMainList(plan));
 			}
@@ -332,4 +334,32 @@ public class TsfDisplayController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * 룩북 메인
+	 * @param lookbook
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 3. 30
+	 */
+	@GetMapping("/lookbook/main/form")
+	public ModelAndView lookbookMain(Lookbook lookbook) {
+		ModelAndView mav = new ModelAndView(super.getDeviceViewName("display/LookbookMainForm"));
+
+		return mav;
+	}
+
+	/**
+	 * 룩북 리스트
+	 * @param lookbook
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 3. 30
+	 */
+	@GetMapping("/lookbook/main/list")
+	@ResponseBody
+	public Collection<Lookbook> lookbooklist(Lookbook lookbook) {
+		lookbook.setFrontGb(TsfSession.getFrontGb());
+		return coreLookbookService.getLookbookList(lookbook);
+	}
+
 }

+ 0 - 4
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -1044,10 +1044,6 @@ public class TsfMypageController extends TsfBaseController {
 	@GetMapping("/wish/list/form")
 	public ModelAndView mypageWishListForm(WishList wishList) {
 		ModelAndView mav = new ModelAndView(super.getDeviceViewName("mypage/MypageWishListForm"));
-		// 위시리스트 달
-		mav.addObject("wishMonth", wishListService.getWishListMonth(wishList));
-		// 위시리스트 상품목록
-		mav.addObject("wishGoods", wishListService.getWishListGoodsList(wishList));
 		return mav;
 	}
 	

+ 39 - 21
src/main/java/com/style24/front/biz/web/TsfPlanningController.java

@@ -97,23 +97,23 @@ public class TsfPlanningController extends TsfBaseController {
 		return planningService.getPlanningMainList(plan);
 	}
 
-	/**
-	 * 기획전 접근확인
-	 * 
-	 * @return
-	 * @author sowon
-	 * @since 2021. 3. 22
-	 */
-	@PostMapping("/access")
-	@ResponseBody
-	public GagaMap PlanningAccessConfrim(@RequestBody Plan plan) throws Exception {
-		GagaMap result = new GagaMap();
-		// 접근 가능 고객 등급 확인
-		planningService.accessCustGrade(plan);
-		result.set("status", "200");
-
-		return result;
-	}
+//	/**
+//	 * 기획전 접근확인
+//	 * 
+//	 * @return
+//	 * @author sowon
+//	 * @since 2021. 3. 22
+//	 */
+//	@PostMapping("/access")
+//	@ResponseBody
+//	public GagaMap PlanningAccessConfrim(@RequestBody Plan plan) throws Exception {
+//		GagaMap result = new GagaMap();
+//		// 접근 가능 고객 등급 확인
+//		planningService.accessCustGrade(plan);
+//		result.set("status", "200");
+//
+//		return result;
+//	}
 
 	/**
 	 * 기획전 상세화면
@@ -124,7 +124,9 @@ public class TsfPlanningController extends TsfBaseController {
 	 */
 	@GetMapping("/detail/form")
 	@ResponseBody
-	public ModelAndView PlanningDetailForm(@RequestParam(value = "planSq") int planSq) throws Exception {
+	public ModelAndView PlanningDetailForm(@RequestParam(value = "planSq") int planSq) {
+		// 기획전 접근가능여부 체크
+		planningService.checkAccessablePlanning(planSq);
 
 		ModelAndView mav = new ModelAndView();
 		Plan plan = new Plan();
@@ -135,7 +137,7 @@ public class TsfPlanningController extends TsfBaseController {
 		plan.setFrontGb(TsfSession.getFrontGb());
 		plan.setCustGb(TsfSession.getCustGb());
 		plan.setCustNo(TsfSession.isLogin() ? TsfSession.getInfo().getCustNo() : 0);
-		
+
 		// 기본 set
 		plan.setExceptPlanSq(planSq);
 		plan.setPlanSq(planSq);
@@ -265,11 +267,10 @@ public class TsfPlanningController extends TsfBaseController {
 		plan.setSiteCd(TscConstants.Site.STYLE24.value());
 		plan.setFrontGb(TsfSession.getFrontGb());
 
-
 		mav.setViewName(super.getDeviceViewName("planning/PlanningEventMainForm"));
 		return mav;
 	}
-	
+
 	/**
 	 * 이벤트 메인 목록
 	 * @param plan - 이벤트 정보
@@ -287,5 +288,22 @@ public class TsfPlanningController extends TsfBaseController {
 
 		return planningService.getPlanEventList(plan);
 	}
+	
+	/**
+	 * 총알배송 메인 화면
+	 * 
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 30
+	 */
+	@GetMapping("/shot/delivery/guide/form")
+	public ModelAndView planningShotDeliveryForm(Plan plan) throws Exception {
+		ModelAndView mav = new ModelAndView();
+		plan.setSiteCd(TscConstants.Site.STYLE24.value());
+		plan.setFrontGb(TsfSession.getFrontGb());
+		mav.addObject("shotHtml", planningService.getShotDeliveryHtml(plan));
+		mav.setViewName(super.getDeviceViewName("planning/PlanningShotGuideForm"));
+		return mav;
+	}
 
 }

+ 2 - 46
src/main/java/com/style24/front/support/controller/TsfBaseController.java

@@ -3,7 +3,6 @@ package com.style24.front.support.controller;
 import java.util.Collection;
 import java.util.Set;
 
-import javax.servlet.http.HttpServletRequest;
 import javax.validation.ConstraintViolation;
 import javax.validation.Validation;
 import javax.validation.Validator;
@@ -12,25 +11,17 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.propertyeditors.StringTrimmerEditor;
 import org.springframework.core.env.Environment;
-import org.springframework.mobile.device.Device;
-import org.springframework.mobile.device.DeviceUtils;
-import org.springframework.mobile.device.site.SitePreference;
-import org.springframework.mobile.device.site.SitePreferenceUtils;
-import org.springframework.mobile.device.util.ResolverUtils;
-import org.springframework.util.Assert;
 import org.springframework.web.bind.WebDataBinder;
 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.bind.annotation.InitBinder;
 import org.springframework.web.bind.annotation.ModelAttribute;
 import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.context.request.RequestAttributes;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
 
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.front.support.env.TsfConstants;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.front.support.startup.TsfEnvsetInfo;
+import com.style24.front.support.util.ViewUtils;
 import com.style24.persistence.domain.Cate1;
 import com.style24.persistence.domain.Login;
 import com.style24.persistence.domain.Meta;
@@ -40,7 +31,6 @@ import lombok.extern.slf4j.Slf4j;
 import com.gagaframework.web.rest.exception.GagaRestException;
 import com.gagaframework.web.rest.server.GagaResponse;
 import com.gagaframework.web.rest.server.GagaResponseStatus;
-import com.gagaframework.web.util.GagaCookieUtil;
 
 /**
  * Controller Advice
@@ -277,41 +267,7 @@ public class TsfBaseController {
 	}
 
 	public String getDeviceViewName(String viewName) {
-		RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
-		Assert.isInstanceOf(ServletRequestAttributes.class, attrs);
-		HttpServletRequest request = ((ServletRequestAttributes)attrs).getRequest();
-
-		Device device = DeviceUtils.getCurrentDevice(request);
-		SitePreference sitePreference = SitePreferenceUtils.getCurrentSitePreference(request);
-		String resolvedViewName = viewName;
-
-		if (ResolverUtils.isNormal(device, sitePreference)) {
-			resolvedViewName = "web/" + viewName + "Web";
-		} else if (ResolverUtils.isMobile(device, sitePreference)) {
-			if (GagaCookieUtil.getCookie(request, TsfConstants.CK_PREFIX + "_site_preference").equals("normal")) {
-				resolvedViewName = "web/" + viewName + "Web";
-			} else {
-				resolvedViewName = "mob/" + viewName + "Mob";
-			}
-		} else if (ResolverUtils.isTablet(device, sitePreference)) {
-			if (GagaCookieUtil.getCookie(request, TsfConstants.CK_PREFIX + "_site_preference").equals("normal")) {
-				resolvedViewName = "web/" + viewName + "Web";
-			} else {
-				resolvedViewName = "mob/" + viewName + "Mob";
-			}
-		}
-
-		log.info("resolvedViewName: {}", resolvedViewName);
-
-		return stripTrailingSlash(resolvedViewName);
-	}
-
-	private String stripTrailingSlash(String viewName) {
-		if (viewName.endsWith("//")) {
-			return viewName.substring(0, viewName.length() - 1);
-		}
-
-		return viewName;
+		return ViewUtils.getDeviceViewName(viewName);
 	}
 
 }

+ 7 - 4
src/main/java/com/style24/front/support/controller/TsfCustomErrorController.java

@@ -13,10 +13,13 @@ import org.springframework.boot.web.servlet.error.ErrorAttributes;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
+import org.springframework.mobile.device.Device;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.servlet.ModelAndView;
 
+import com.style24.front.support.util.ViewUtils;
+
 import lombok.extern.slf4j.Slf4j;
 
 /**
@@ -51,7 +54,7 @@ public class TsfCustomErrorController extends AbstractErrorController {
 	 * @throws IOException
 	 */
 	@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
-	public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) throws IOException {
+	public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response, Device device) throws IOException {
 		HttpStatus status = this.getStatus(request);
 		log.error("status.value(): {}", status.value());
 
@@ -61,7 +64,7 @@ public class TsfCustomErrorController extends AbstractErrorController {
 		ModelAndView mav = this.resolveErrorView(request, response, status, model);
 
 		if (status.value() == HttpStatus.NOT_FOUND.value()) {
-			return (mav != null) ? mav : new ModelAndView("mob/error/404Mob", model);
+			return (mav != null) ? mav : new ModelAndView(ViewUtils.getDeviceViewName("error/404"), model);
 		}
 
 		Object oExceptionType = request.getAttribute(RequestDispatcher.ERROR_EXCEPTION_TYPE);
@@ -71,11 +74,11 @@ public class TsfCustomErrorController extends AbstractErrorController {
 
 			// Thymeleaf의 HTML 파일을 못 찾는 에러는 "org.thymeleaf.exceptions.TemplateInputException"임.
 			if (exceptionType.endsWith("org.thymeleaf.exceptions.TemplateInputException")) {
-				return (mav != null) ? mav : new ModelAndView("mob/error/404Mob", model);
+				return (mav != null) ? mav : new ModelAndView(ViewUtils.getDeviceViewName("error/404"), model);
 			}
 		}
 
-		return (mav != null) ? mav : new ModelAndView("mob/error/500Mob", model);
+		return (mav != null) ? mav : new ModelAndView(ViewUtils.getDeviceViewName("error/500"), model);
 	}
 
 	/**

+ 68 - 0
src/main/java/com/style24/front/support/util/ViewUtils.java

@@ -0,0 +1,68 @@
+package com.style24.front.support.util;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.mobile.device.Device;
+import org.springframework.mobile.device.DeviceUtils;
+import org.springframework.mobile.device.site.SitePreference;
+import org.springframework.mobile.device.site.SitePreferenceUtils;
+import org.springframework.mobile.device.util.ResolverUtils;
+import org.springframework.util.Assert;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import com.style24.front.support.env.TsfConstants;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.util.GagaCookieUtil;
+
+/**
+ * 디바이스 뷰 관련 Util Class
+ * 
+ * @author gagamel
+ * @since 2021. 3. 30
+ */
+@Slf4j
+public class ViewUtils {
+
+	public static String getDeviceViewName(String viewName) {
+		RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
+		Assert.isInstanceOf(ServletRequestAttributes.class, attrs);
+		HttpServletRequest request = ((ServletRequestAttributes)attrs).getRequest();
+
+		Device device = DeviceUtils.getCurrentDevice(request);
+		SitePreference sitePreference = SitePreferenceUtils.getCurrentSitePreference(request);
+		String resolvedViewName = viewName;
+
+		if (ResolverUtils.isNormal(device, sitePreference)) {
+			resolvedViewName = "web/" + viewName + "Web";
+		} else if (ResolverUtils.isMobile(device, sitePreference)) {
+			if (GagaCookieUtil.getCookie(request, TsfConstants.CK_PREFIX + "_site_preference").equals("normal")) {
+				resolvedViewName = "web/" + viewName + "Web";
+			} else {
+				resolvedViewName = "mob/" + viewName + "Mob";
+			}
+		} else if (ResolverUtils.isTablet(device, sitePreference)) {
+			if (GagaCookieUtil.getCookie(request, TsfConstants.CK_PREFIX + "_site_preference").equals("normal")) {
+				resolvedViewName = "web/" + viewName + "Web";
+			} else {
+				resolvedViewName = "mob/" + viewName + "Mob";
+			}
+		}
+
+		log.info("resolvedViewName: {}", resolvedViewName);
+
+		return stripTrailingSlash(resolvedViewName);
+	}
+
+	private static String stripTrailingSlash(String viewName) {
+		if (viewName.endsWith("//")) {
+			return viewName.substring(0, viewName.length() - 1);
+		}
+
+		return viewName;
+	}
+
+}

+ 2 - 1
src/main/java/com/style24/persistence/domain/Login.java

@@ -30,6 +30,8 @@ public class Login extends TscBaseDomain {
 	private String passwd;			// 비밀번호
 	private String custGb;			// 고객구분
 	private String custGbNm;		// 고객구분명
+	private String custGrade;		// 고객등급
+	private String custGradeNm;		// 고객등급명
 	private String custStat;		// 고객상태
 	private String cellPhnno;		// 휴대전화번호
 	private String email;			// 이메일
@@ -42,7 +44,6 @@ public class Login extends TscBaseDomain {
 	private String ipAddr;			// IP주소
 	private String loginLdt;		// 최종로그인일시
 	private String loginFailYn;		// 로그인실패여부
-	private String custGrade;		// 고객등급
 	private String tempPasswdYn;	// 임시비밀번호여부
 	private int pwdChgDay;			// 비밀번호변경일자
 	private String ci;				// CI(본인인증여부)

+ 5 - 1
src/main/java/com/style24/persistence/domain/Plan.java

@@ -257,7 +257,11 @@ public class Plan extends TscBaseDomain {
 	// 사용가능고객구분
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] usableCustGbArr;
-
+	
+	// 프론트구분
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] frontGbArr;
+	
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	List<Plan> multiPlanGoodsContent1;
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)

+ 7 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfCommon.xml

@@ -44,5 +44,12 @@
 		AND    USE_YN = 'Y'
 	</insert>
 	
+	<!-- 웹제휴채널명 조회 -->
+	<select id="getAfLinkName" parameterType="String" resultType="String">
+		/* TsfCommon.getAfLinkName */
+		SELECT AF_LINK_NM
+		FROM   TB_AF_LINK
+		WHERE  AF_LINK_CD = #{afLinkCd}
+	</select>
 
 </mapper>

+ 17 - 16
src/main/java/com/style24/persistence/mybatis/shop/TsfLogin.xml

@@ -5,27 +5,28 @@
 	<!-- 로그인체크 정보 조회 -->
 	<select id="getLoginCheckInfo" parameterType="Login" resultType="Login">
 		/* TsfLogin.getLoginCheckInfo */
-		SELECT CUST_NO                                                 /*고객번호*/
-		     , CUST_ID                                                 /*고객ID*/
-		     , CUST_NM                                                 /*고객명*/
-		     , PASSWD                                                  /*비밀번호*/
-		     , CUST_GB                                                 /*고객구분*/
-		     , CUST_GRADE                                              /*고객등급*/
-		     , FN_GET_CODE_NM('G100',CUST_GB) AS CUST_GB_NM            /*고객구분명*/
-		     , CUST_STAT                                               /*회원상태*/
-		     , CELL_PHNNO                                              /*휴대전화번호*/
-		     , EMAIL                                                   /*이메일*/
-		     , #{snsType}                     AS SNS_TYPE              /*SNS유형*/
-		     , #{snsId}                       AS SNS_ID                /*SNS가입ID*/
+		SELECT CUST_NO                                                   /*고객번호*/
+		     , CUST_ID                                                   /*고객ID*/
+		     , CUST_NM                                                   /*고객명*/
+		     , PASSWD                                                    /*비밀번호*/
+		     , CUST_GB                                                   /*고객구분*/
+		     , FN_GET_CODE_NM('G100',CUST_GB)          AS CUST_GB_NM     /*고객구분명*/
+		     , CUST_GRADE                                                /*고객등급*/
+		     , FN_GET_CODE_NM('G110',CUST_GRADE)       AS CUST_GRADE_NM  /*고객등급명*/
+		     , CUST_STAT                                                 /*회원상태*/
+		     , CELL_PHNNO                                                /*휴대전화번호*/
+		     , EMAIL                                                     /*이메일*/
+		     , #{snsType}                              AS SNS_TYPE       /*SNS유형*/
+		     , #{snsId}                                AS SNS_ID         /*SNS가입ID*/
 		     , IFNULL((SELECT LOGIN_FAIL_CNT
 		               FROM   TB_LOGIN_FAIL
 		               WHERE  CUST_ID = #{custId}
 		               AND    IP_ADDR = #{ipAddr}
 		               AND    SITE_CD = #{siteCd}
-		              ),0)                    AS LOGIN_FAIL_CNT         /*로그인실패건수*/
-		     , TEMP_PASSWD_YN                                           /*임시비밀번호여부*/
-		     , IFNULL(DATEDIFF(NOW(), PASSWD_CHG_DT), 0) AS PWD_CHG_DAY /*비밀번호변경일자*/
-		     , CI                                                       /*CI본인인증여부*/
+		              ),0)                             AS LOGIN_FAIL_CNT /*로그인실패건수*/
+		     , TEMP_PASSWD_YN                                            /*임시비밀번호여부*/
+		     , IFNULL(DATEDIFF(NOW(),PASSWD_CHG_DT),0) AS PWD_CHG_DAY    /*비밀번호변경일자*/
+		     , CI                                                        /*CI본인인증여부*/
 		FROM   TB_CUSTOMER A
 		WHERE  1 = 1
 		<choose>

+ 124 - 33
src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml

@@ -27,12 +27,7 @@
 		AND    P.PLAN_GB = 'P' /*기획전*/
 		AND    P.SITE_CD = #{siteCd}
 		<if test="frontGb != null and frontGb != ''">
-		    <if test='frontGb == "P"'> <!-- PC웹 -->
-		AND    P.FRONT_GB IN ('A','P')
-		    </if>
-		    <if test='frontGb == "A" or frontGb == "M"'> <!-- 모바일 -->
-		AND    P.FRONT_GB IN ('A','M')
-		    </if>
+		AND    P.FRONT_GB LIKE CONCAT('%',#{frontGb},'%')
 		</if>
 		AND    NOW() BETWEEN P.DISP_STDT AND P.DISP_EDDT
 		AND    P.DEL_YN = 'N' /*삭제안된 기획전*/
@@ -90,12 +85,7 @@
 		        WHERE  P.PLAN_GB = 'P' /*기획전*/
 		        AND    P.SITE_CD = #{siteCd}
 		        <if test="frontGb != null and frontGb != ''">
-		            <if test='frontGb == "P"'> <!-- PC웹 -->
-		        AND    P.FRONT_GB IN ('A','P')
-		            </if>
-		            <if test='frontGb == "A" or frontGb == "M"'> <!-- 모바일 -->
-		        AND    P.FRONT_GB IN ('A','M')
-		            </if>
+		        AND    P.FRONT_GB LIKE CONCAT('%',#{frontGb},'%')
 		        </if>
 		        AND    NOW() BETWEEN P.DISP_STDT AND P.DISP_EDDT
 		        AND    P.DEL_YN = 'N' /*삭제안된 기획전*/
@@ -163,12 +153,7 @@
 		    AND    P.PLAN_GB = 'P' /*기획전*/
 		    AND    P.SITE_CD = #{siteCd}
 		    <if test="frontGb != null and frontGb != ''">
-		        <if test='frontGb == "P"'> <!-- PC웹 -->
-		    AND    P.FRONT_GB IN ('A','P')
-		        </if>
-		        <if test='frontGb == "A" or frontGb == "M"'> <!-- 모바일 -->
-		    AND    P.FRONT_GB IN ('A','M')
-		        </if>
+		    AND    P.FRONT_GB LIKE CONCAT('%',#{frontGb},'%')
 		    </if>
 		    AND    NOW() BETWEEN P.DISP_STDT AND P.DISP_EDDT
 		    AND    P.DEL_YN = 'N' /*삭제안된 기획전*/
@@ -241,6 +226,81 @@
 		</if>
 	</select>
 	
+	<!-- 디바이스접근가능여부 조회 -->
+	<select id="getDeviceAccessibleYn" parameterType="Plan" resultType="String">
+		/* TsfPlanning.getDeviceAccessibleYn */
+		SELECT CASE WHEN COUNT(*) > 0 THEN
+		                'Y' /*접근가능*/
+		            ELSE
+		                'N' /*접근불가*/
+		       END AS ACCESSIBLE_YN
+		FROM   TB_PLAN
+		WHERE  PLAN_SQ = #{planSq}
+		AND    FRONT_GB LIKE CONCAT('%',#{frontGb},'%')
+	</select>
+	
+	<!-- 신규회원접근가능여부 조회 -->
+	<select id="getNewCustomerAccessibleYn" parameterType="Plan" resultType="String">
+		/* TsfPlanning.getNewCustomerAccessibleYn */
+		SELECT CASE WHEN NEW_CUST_YN = 'N' THEN
+		                'Y' /*접근가능*/
+		            ELSE
+		                CASE WHEN NOW() BETWEEN CUST_JOIN_STDT AND CUST_JOIN_EDDT THEN
+		                         'Y' /*접근가능*/
+		                     ELSE
+		                         'N' /*접근불가*/
+		                END
+		       END AS ACCESSIBLE_YN
+		FROM   TB_PLAN
+		WHERE  PLAN_SQ = #{planSq}
+	</select>
+	
+	<!-- 고객구분접근가능여부 조회 -->
+	<select id="getCustomerGubunAccessibleYn" parameterType="Plan" resultType="String">
+		/* TsfPlanning.getCustomerGubunAccessibleYn */
+		SELECT CASE WHEN COUNT(*) > 0 THEN
+		                'Y' /*접근가능*/
+		            ELSE
+		                'N' /*접근불가*/
+		       END AS ACCESSIBLE_YN
+		FROM   TB_PLAN_CUST_DIVISION
+		WHERE  PLAN_SQ = #{planSq}
+		AND    CUST_GB = #{custGb}
+	</select>
+	
+	<!-- 고객등급접근가능여부 조회 -->
+	<select id="getCustomerGradeAccessibleYn" parameterType="Plan" resultType="String">
+		/* TsfPlanning.getCustomerGradeAccessibleYn */
+		SELECT CASE WHEN COUNT(*) > 0 THEN
+		                'Y' /*접근가능*/
+		            ELSE
+		                'N' /*접근불가*/
+		       END AS ACCESSIBLE_YN
+		FROM   TB_PLAN_CUST_GRADE
+		WHERE  PLAN_SQ = #{planSq}
+		AND    CUST_GRADE = #{custGrade}
+	</select>
+	
+	<!-- 웹제휴채널접근가능여부 조회 -->
+	<select id="getAfLinkAccessibleYn" parameterType="Plan" resultType="String">
+		/* TsfPlanning.getAfLinkAccessibleYn */
+		SELECT CASE WHEN CNT1 = 0 THEN
+		                'Y' /*접근가능*/
+		            ELSE
+		                CASE WHEN CNT2 > 0 THEN
+		                         'Y' /*접근가능*/
+		                     ELSE
+		                         'N' /*접근불가*/
+		                END
+		       END AS ACCESSIBLE_YN
+		FROM   (
+		        SELECT COUNT(*)                                             AS CNT1 /*제휴채널전체건수*/
+		             , CASE WHEN AF_LINK_CD = #{afLinkCd} THEN 1 ELSE 0 END AS CNT2 /*특정제휴채널건수*/
+		        FROM   TB_PLAN_AF_CHANNEL
+		        WHERE  PLAN_SQ = #{planSq}
+		       ) Z
+	</select>
+	
 	<!-- 기획전 상세정보 -->
 	<select id="getPlanDetailInfo" parameterType="Plan" resultType="Plan">
 		/* TsfPlanning.getPlanDetailInfo*/
@@ -285,7 +345,7 @@
 		AND    NOW() BETWEEN A.DISP_STDT AND A.DISP_EDDT
 		</if>
 		<if test="frontGb != null and frontGb != ''">
-		AND    (A.FRONT_GB = 'A' OR A.FRONT_GB = #{frontGb})
+		AND    A.FRONT_GB LIKE CONCAT('%',#{frontGb},'%')
 		</if>
 	</select>
 	
@@ -330,23 +390,11 @@
 		        WHERE  P.PLAN_GB = 'E' /*이벤트*/
 		        AND    P.SITE_CD = #{siteCd}
 		        <if test="frontGb != null and frontGb != ''">
-		            <if test='frontGb == "P"'> <!-- PC웹 -->
-		        AND    P.FRONT_GB IN ('A','P')
-		            </if>
-		            <if test='frontGb == "A" or frontGb == "M"'> <!-- 모바일 -->
-		        AND    P.FRONT_GB IN ('A','M')
-		            </if>
+		        AND    P.FRONT_GB LIKE CONCAT('%',#{frontGb},'%')
 		        </if>
 		        AND    NOW() BETWEEN P.DISP_STDT AND P.DISP_EDDT
 		        AND    P.DEL_YN = 'N' /*삭제안된 기획전*/
 		        AND    P.OPEN_YN = 'Y' /*오픈된 기획전*/
-		        <if test="brandGroupNo != null and brandGroupNo != ''"> <!-- 브랜드메인에서 사용 -->
-		        AND    P.PLAN_SQ IN (SELECT PLAN_SQ
-		                             FROM   TB_PLAN_BRAND
-		                             WHERE  BRAND_GROUP_NO = #{brandGroupNo}
-		                             AND    DISP_YN = 'Y' /*전시하는브랜드기획전*/
-		                            )
-		        </if>
 		       ) Z
 		ORDER  BY NEW_YN DESC, END_DAYS
 	</select>
@@ -668,5 +716,48 @@
 			 AND PC.DISP_YN = 'Y'
 		 )Z
 	</select>
-
+	
+	<!-- 기획전 코너 목록 -->
+	<select id="getPlanCornerList" parameterType="Plan" resultType="Plan">
+		/* TsfPlanning.getPlanCornerList */
+		SELECT P.PLAN_SQ
+		     , PD.PLAN_DTL_SQ
+		     , PD.CORNER_NM
+		     , PD.CORNER_DISP_TYPE
+		FROM TB_PLAN P INNER JOIN TB_PLAN_DETAIL PD ON P.PLAN_SQ = PD.PLAN_SQ
+		 WHERE 1=1
+		  AND P.PLAN_SQ = #{planSq}
+		  AND PD.DISP_YN = 'Y'
+		  AND NOW() BETWEEN PD.DISP_STDT AND PD.DISP_EDDT 
+		ORDER BY PD.DISP_ORD 
+	</select>
+	
+	<!-- 총알배송 html 소스  -->
+	<select id="getShotDeliveryHtml" parameterType="Plan" resultType="Plan">
+		/* TsfPlanning.getShotDeliveryHtml */
+		SELECT P.PLAN_SQ 
+		      ,P.PLAN_NM 
+		      ,PC.PLAN_CONT_SQ 
+		      ,PF.DISP_YN
+		      ,PF.FSRC_PC 
+		      ,PF.FSRC_MOB 
+		FROM TB_PLAN P INNER JOIN TB_PLAN_CONTENTS PC ON P.PLAN_SQ = PC.PLAN_SQ 
+		                                              AND P.PLAN_SQ = PC.PLAN_SQ
+		               INNER JOIN TB_PLAN_FSRC PF ON P.PLAN_SQ = PF.PLAN_SQ 
+		                                              AND P.PLAN_SQ = PF.PLAN_SQ
+		WHERE 1=1
+		  AND P.PLAN_SQ = 13
+		  AND P.DEL_YN = 'N'
+		        <if test="frontGb != null and frontGb != ''">
+		            <if test='frontGb == "P"'> <!-- PC웹 -->
+		        AND    P.FRONT_GB IN ('A','P')
+		            </if>
+		            <if test='frontGb == "A" or frontGb == "M"'> <!-- 모바일 -->
+		        AND    P.FRONT_GB IN ('A','M')
+		            </if>
+		        </if>
+		  AND P.OPEN_YN ='Y'
+		  AND PF.DISP_YN ='Y'
+		  AND P.SITE_CD = #{siteCd}
+	</select>
 </mapper>

+ 8 - 1
src/main/webapp/WEB-INF/views/mob/error/404Mob.html

@@ -57,10 +57,17 @@
 				</p>
 			</div>
 			<div class="btn_group">
-				<button class="btn btn_dark" onclick="cfnGoToPage(_PAGE_MAIN);"><span>홈으로 이동</span></button>
+				<button class="btn btn_dark" onclick="fnGoToHome();"><span>홈으로 이동</span></button>
 			</div>
 		</div>
 	</div>
 	<!-- // container -->
+
+<script type="text/javascript">
+	let fnGoToHome = function() {
+		document.location.href = '/';
+	}
+</script>
+
 </body>
 </html>

+ 161 - 0
src/main/webapp/WEB-INF/views/web/display/LookbookMainFormWeb.html

@@ -0,0 +1,161 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/DefaultLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : LookbookMainFormWeb.html
+ * @desc    : 룩북메인 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.30   bin2107     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+	<div id="container" class="container dp">
+		<div class="breadcrumb">
+			<ul>
+				<li class="bread_home"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);">홈</a></li>
+				<li class="bread_2depth">룩북</li>
+			</ul>
+		</div>
+		<div class="wrap">
+			<div class="content">
+				<div class="cont_head">
+					<div>
+						<h3>룩북</h3>
+					</div>
+					</dziv>
+					<div class="cont_body">
+						<div class="event_list" id="changeClass">
+							<div class="event_top">
+								<div class="ui_row">
+									<div class="count">
+										<span id="lookbookTotCnt"></span>개의 이벤트
+									</div>
+									<div class="ui_col_12">
+										<div class="btn_group">
+											<!-- <div class="btn_group open"> -->
+											<a href="#none" data-toggle="dropdown" class="btn btn_default tgl_dropdown" aria-expanded="true" id="brandBox">브랜드 선택<span class="caret"></span></a>
+											<div class="dropdown_menu">
+												<ul id="brandArea">
+
+												</ul>
+												<div class="ui_row">
+													<button type="button" class="fillter_reset" onclick="fnGetLookbookList();"><span>초기화</span></button>
+													<button type="button" class="fillter_apply" onclick="fnGetBrandLookbookList();"><span>적용</span></button>
+												</div>
+											</div>
+										</div>
+									</div>
+								</div>
+							</div>
+
+							<div class="list">
+								<ul class="clear event_con" id="lookbookArea" style="display: none;">
+
+								</ul>
+								<ul class="clear no_con" id="divLookbookNoData" style="display: none;">
+									<li>
+										<p><img src="/images/pc/ico_content_none.png" alt="등록된 이벤트가 없습니다."></p>
+										<span>등록된 룩북이 없습니다.</span>
+										<a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);">메인으로 가기</a>
+									</li>
+								</ul>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let fnGetLookbookList = function (brandGroupNo){
+		let actionUrl = '/display/lookbook/main/list';
+		if (!gagajf.isNull(brandGroupNo)) actionUrl += '?multiBrandCd=' + brandGroupNo;
+
+		$.getJSON(actionUrl
+			, function (result, status){
+				if (status == 'success'){
+					if (result.length > 0){
+						$('#lookbookTotCnt').html('<span>' + result.length.addComma() + '</span>');
+
+						if (gagajf.isNull(brandGroupNo)){
+							$('#brandArea').html('');
+							let tag = '';
+							let brandArr = [];
+							$.each(result, function(idx, item) {
+								if(!brandArr.includes(item.brandCd)){
+									brandArr.push(item.brandCd);
+									tag += '<li>';
+									tag += '	<label class="brand_btn">';
+									tag += '		<input type="checkbox" group="filterValue" id="chkFilterBrand'+idx+'" data-name="chkFilterBrand'+idx+'" name="filterBrandCds" value="'+item.brandCd+'"><span>'+item.brandNm+'</span>';
+									tag += '	</label>';
+									tag += '</li>';
+								}
+							});
+							$('#brandArea').html(tag);
+						}
+
+						$('#lookbookArea').html('');
+						let tag2 = '';
+						tag2 += '<ul class="clear event_con" id="lookbookArea" style="display: block;">';
+						$.each(result, function(idx, item) {
+							tag2 += '<li>';
+							tag2 += '	<a href="javascript:void(0);">';
+							tag2 += '		<div class="ev_img">';
+							tag2 += '			<img src="' + _imgUrl + item.orgTnfileNm + '" alt="" style="height:100%">';
+							tag2 += '		</div>';
+							tag2 += '		<div class="txt">';
+							tag2 += '			<span class="brand">'+item.brandNm+'</span>';
+							tag2 += '			<p class="tit">'+item.title+'</p>';
+							tag2 += '		</div>';
+							tag2 += '	</a>';
+							tag2 += '</li>';
+						});
+						tag2 += '</ul>';
+
+						$('#lookbookArea').html(tag2);
+						$('#divLookbookNoData').hide();
+						$('#lookbookArea').show();
+					}else{
+						$('#lookbookTotCnt').html('<span>0</span>');
+						document.getElementById("changeClass").className = "event_list no_data";
+						$('#lookbookArea').hide();
+						$('#divLookbookNoData').show();
+					}
+				}
+				document.getElementById("brandBox").className = "btn btn_default tgl_dropdown";
+				$('.dropdown_menu').hide();
+			});
+	}
+
+	var fnGetBrandLookbookList = function (){
+		var multiBrandCd = [];
+		$("input:checkbox:checked").each(function (index) {
+			multiBrandCd.push($(this).val());
+		});
+
+		fnGetLookbookList(multiBrandCd);
+	}
+
+	$(document).ready(function() {
+		//$("#container .wrap .content .cont_body .event_list .event_top .ui_row .count").find('span').text(totalCnt.addComma());
+		fnGetLookbookList();
+	});
+
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 9 - 2
src/main/webapp/WEB-INF/views/web/error/404Web.html

@@ -51,16 +51,23 @@
 			<div class="contGrp">
 				<h2>죄송합니다.<br/> 요청하신 페이지를 찾을 수 없습니다.</h2>
 				<p class="none_m">방문하시려는 페이지의 주소가 잘못 입력되었거나,<br/>페이지의 주소가 변경 혹은 삭제되어 요청하신 페이지를 찾을 수 없습니다. </p>
-				<p>입력하신 주소가 정확한지 다시한번 확인해주시기 바랍니다</p>
+				<p>입력하신 주소가 정확한지 다시  번 확인해 주시기 바랍니다.</p>
 				<p class="none_m">
 					서비스 이용 중 문의사항이나 불편하셨던 점은 <a class="none_m"  href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_FAQ);">고객센터</a>를 이용해주세요. 감사합니다.
 				</p>
 			</div>
 			<div class="btn_group">
-				<button class="btn btn_dark" onclick="cfnGoToPage(_PAGE_MAIN);"><span>홈으로 이동</span></button>
+				<button class="btn btn_dark" onclick="fnGoToHome();"><span>홈으로 이동</span></button>
 			</div>
 		</div>
 	</div>
 	<!-- // container -->
+
+<script type="text/javascript">
+	let fnGoToHome = function() {
+		document.location.href = '/';
+	}
+</script>
+
 </body>
 </html>

+ 4 - 5
src/main/webapp/WEB-INF/views/web/mypage/MypageGiftcardFormWeb.html

@@ -24,14 +24,13 @@
 			<!-- 페이지특정 클래스 = myVoucher -->
 			<div class="cont_body">
 				<div class="lnb">
-							<div class="lnb_tit">
+					<div class="lnb_tit">
 						<h2>마이페이지</h2>
-						<div class="lnb_list">
-						<ul id="mypageLnbList"></ul>
 					</div>
+					<div class="lnb_list">
+						<ul id="mypageLnbList"></ul>
 					</div>
-					
-				</div>
+				</div>	
 				<div class="cont">
 					<div class="sec_head">
 						<h3 class="subH1">상품권</h3>

+ 17 - 75
src/main/webapp/WEB-INF/views/web/mypage/MypageWishListFormWeb.html

@@ -54,89 +54,30 @@
 
 
 <script th:inline="javascript">
-let wishMonth = [[${wishMonth}]];
-let wishGoods = [[${wishGoods}]];
-let _mall = [[${@environment.getProperty('domain.front')}]];
-// 위시리스트 
-var wishListForm = function() {
-
-	var html = '';
-	$("#wishList").append(html);
-	if(wishMonth.length>0){
-		for (var i = 0; i < wishMonth.length; i++) {
-			html += '<div class="monthly_wish_wrap">                                                                                         ';
-			html += '	<div class="date">                                                                                                   ';
-			html += '		<span>'+wishMonth[i].regDt+'</span>                                                                              ';
-			html += '	</div>                                                                                                               ';
-			html += '	<div class="itemsGrp">                                                                                            ';
-			$.each(wishGoods, function(idx, item) {
-				html += '		<div class="item_prod">                                                                                       ';
-				html += '			<div class="item_state">                                                                                  ';
-				html += '				<button type="button" class="itemLike active" goodsCd="'+item.goodsCd+'" planDtlSq="" onclick="wishlistDelete(this)">관심상품 추가</button>                                               ';
-				html += '				<a onclick="cfnGoToGoodsDetail(\'' + item.goodsCd + '\');"  class="itemLink" >                                                                     ';
-				html += '					<div class="itemPic">                                                                             ';
-				html += '						<img alt="" class=" vLHTC pd_img" src="/images/pc/thumb/prod5.jpg">                           ';
-				html += '					</div>                                                                                            ';
-				html += '					<p class=" itemBrand">'+item.brandKnm+'</p>                                               ';
-				html += '					<div class=" itemName">'+item.goodsNm+'</div>                                             ';
-				html += '					<p class="itemPrice">' + item.currPrice.addComma();
-				if (item.currPrice != item.listPrice) {
-					html += '						<span class="itemPrice_original">'+item.listPrice.addComma() + '</span>                         ';	
-				}
-				if (item.dcRate>0) {
-					html += '						<span class=" itemPercent">'+item.dcRate+'%</span>                                     ';	
-				}
-				html += '					</p>                                                                                              ';
-				html += '					<div class="itemcolorchip">                                                                       ';
-				html += '						<span class="chip_color35" value="ABM">BEIGE</span>                                           ';
-				html += '						<span class="chip_color54" value="BDS">BLACK</span>                                           ';
-				html += '						<span class="chip_color40" value="YBR">WHITE</span>                                           ';
-				html += '					</div>                                                                                            ';
-				html += '					 <p class="itemBadge">                                                                            ';
-				html += '						<span class="badge13">베스트 </span>                                                             ';
-				html += '					</p>                                                                                              ';
-				html += '					<div class="itemComment">★ [NEW] 20FW 빅웨이브 단독발매!</div>                                            ';
-				html += '				</a>                                                                                                  ';
-				html += '			</div>                                                                                                    ';
-				html += '		</div>	                                                                                                      ';
-			});
-			html += '	</div>  																										 ';
-			html += '</div>                                                                                                                ';
-		}
-	}else{
-		html += '<div class="nodata">';
-		html += '	<div class="txt_box">';
-		html += '		<p>';
-		html += '			등록된 위시리스트가 없습니다.<br>';
-		html += '		</p>';
-		html += '	</div>';
-		html += '</div> ';
-	}
-	
-	$("#wishList").append(html);
-}
-
 // 마이페이지 위시리스트 해제
 var wishlistDelete = function(obj) {
 	mcxDialog.confirm("위시리스트를 해제하시겠습니까?", {
 		cancelBtnText : "취소",
 		sureBtnText : "확인",
 		sureBtnClick : function() {
-			
 			cfnPutWishList(obj);
-			 $.ajax({
-					type		: "GET",
-					url 		: '/mypage/wish/list',
-					dataType 	: 'html',
-					success 	: function(result) {
-						if (result != null) {
-							$("#wishList").html(result);
-						}
-					}
-				});		
-			}
+			ajaxWishList();
+		}
 	});
+}
 
+// 마이페이지 위시리스트 
+var ajaxWishList = function () {
+	 $.ajax({
+			type		: "GET",
+			url 		: '/mypage/wish/list',
+			dataType 	: 'html',
+			success 	: function(result) {
+				if (result != null) {
+					$("#wishList").html(result);
+				}
+			}
+		});		
 }
 
 $(document).ready(function() {
@@ -146,7 +87,8 @@ $(document).ready(function() {
 
 	// 마이페이지 location 설정
 	fnSetMypageLocation('위시리스트', '_PAGE_MYPAGE_WISHLIST');
-	wishListForm();
+	
+	ajaxWishList();
 
 });
 </script>

+ 2 - 2
src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html

@@ -53,6 +53,7 @@
 						</div>
 					</div>
 					<div class="cont_body">
+				
 						<div class="coner_content">
 							<div class="coner_front">
 								<div class="promotion_visual" th:if="${fsrcInfoTop != null}" th:utext="${fsrcInfoTop.fsrcPc}"></div>
@@ -83,7 +84,7 @@
 								
 							</th:block>
 							
-						
+		
 							<div class="coner_front">
 								<div class="promotion_visual" th:if="${fsrcInfoBtm != null}" th:utext="${fsrcInfoBtm.fsrcPc}"></div>
 								<!-- 하단배너 -->
@@ -186,7 +187,6 @@
 									</div>
 								</div>
 							</div>
-
 						</div>
 					</div>
 				</div>

+ 133 - 0
src/main/webapp/WEB-INF/views/web/planning/PlanningShotGuideFormWeb.html

@@ -0,0 +1,133 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/DefaultLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : PlanningShotGuideFormWeb.html
+ * @desc    : 총알배송 Page
+ *============================================================================
+ * Pastelmall
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.3.30  	 sowon     최초 작성
+ *******************************************************************************
+ -->
+ <body>
+<th:block layout:fragment="content">
+<!--  container -->
+	<div id="container" class="container dp">
+		<div class="breadcrumb"> 
+			<ul>
+				<li class="bread_home"><a href="index.html">홈</a></li>
+				<li class="bread_2depth">총알배송</li>
+			</ul> 
+		</div>
+		<div class="wrap">
+			<div class="content wide dp_Bulletship"> <!-- 페이지특정 클래스 = dp_Bulletship -->
+				<div class="cont_head">
+					<div>
+                        <h3>총알배송</h3>
+                    </div>
+				</div>
+				<div class="cont_body">
+                     <div class="Bulletship"  th:utext="${#strings.replace(#strings.replace(shotHtml.fsrcPc,'&amplt;','<'),'&ampgt;','>')}">
+                    </div> 
+                    <div class="Bulletship_list">
+                        <div class="cont_head">
+                            <div class="bullet_sticky_nav">
+                                <ul>    
+                                    <li><a href="#brand01">모이몰른</a></li> <!-- 섹션이동 -->
+                                    <li><a href="#brand02">컬리수</a></li>
+                                </ul>
+                            </div>
+                        </div>
+                        <div class="cont_body">
+                            <div class="list_content">
+                                <div id="brand01">
+                                    <div class="item_header"> <!-- 섹션이동 -->
+                                        <h4>모이몰른</h4>
+                                    </div>
+                                    <div class="itemsGrp">
+                                        <div class="item_prod">
+                                            <div class="item_state">
+                                                <button type="button" class="itemLike">관심상품 추가</button>
+                                                <a href="#none" class="itemLink">
+                                                    <div class="rank ranker"><span>1</span></div>
+                                                    <div class="itemPic">
+                                                        <img alt="BLUE-a" class=" vLHTC pd_img" src="/images/pc/thumb/prod1.jpg">
+                                                    </div>
+                                                    <p class="itemBrand">BRAND NAME</p>
+                                                    <div class="itemName">남성 헤링본 기모 팬츠 헤링본 기모 팬츠</div>
+                                                    <p class="itemPrice">80,100
+                                                        <span class="itemPrice_original">89,000</span>
+                                                        <span class=" itemPercent">10%</span>
+                                                    </p>
+                                                    <div class="itemcolorchip">
+                                                        <span class="chip_color35" value="ABM">BEIGE</span>
+                                                        <span class="chip_color54" value="BDS">BLACK</span>
+                                                        <span class="chip_color40" value="YBR">WHITE</span>
+                                                    </div>
+                                                    <p class="itemBadge">
+                                                        <span class="badge13">베스트 </span>
+                                                    </p>
+                                                    <div class="itemComment">#주문 폭주 상품</div>
+                                                </a>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div id="brand02">
+                                    <div class="item_header" > <!-- 섹션이동 -->
+                                        <h4>컬리수</h4>
+                                    </div>
+                                    <div class="itemsGrp">
+                                        <div class="item_prod">
+                                            <div class="item_state">
+                                                <button type="button" class="itemLike">관심상품 추가</button>
+                                                <a href="#none" class="itemLink">
+                                                    <div class="rank ranker"><span>1</span></div>
+                                                    <div class="itemPic">
+                                                        <img alt="BLUE-a" class=" vLHTC pd_img" src="/images/pc/thumb/prod1.jpg">
+                                                    </div>
+                                                    <p class="itemBrand">BRAND NAME</p>
+                                                    <div class="itemName">남성 헤링본 기모 팬츠 헤링본 기모 팬츠</div>
+                                                    <p class="itemPrice">80,100
+                                                        <span class="itemPrice_original">89,000</span>
+                                                        <span class=" itemPercent">10%</span>
+                                                    </p>
+                                                    <div class="itemcolorchip">
+                                                        <span class="chip_color35" value="ABM">BEIGE</span>
+                                                        <span class="chip_color54" value="BDS">BLACK</span>
+                                                        <span class="chip_color40" value="YBR">WHITE</span>
+                                                    </div>
+                                                    <p class="itemBadge">
+                                                        <span class="badge13">베스트 </span>
+                                                    </p>
+                                                    <div class="itemComment">#주문 폭주 상품</div>
+                                                </a>
+                                            </div>
+                                        </div>             
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+		    </div>
+        </div>
+    </div>    
+	<!-- // container -->	
+<script th:inline="javascript">
+/*<![CDATA[*/
+
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 2 - 0
src/main/webapp/ux/style24_link.js

@@ -92,6 +92,8 @@ const _PAGE_GOODS_QNA = _frontUrl + "/callcenter/goods/qna/form";						// 고객
 const _PAGE_NOTICE = _frontUrl + "/callcenter/notice/form";								// 고객센터 > 공지사항
 
 //== 기타 ==/
+const _PAGE_LOOKBOOK_MAIN = _frontUrl + "/display/lookbook/main/form";		// 룩북 메인
+const _PAGE_LOOKBOOK_DETAIL = _frontUrl + "/display/lookbook/detail/form";		// 룩북 상세
 
 
 /**********************************************************************************************/