Dorothy_YANG
With Dorothy
Dorothy_YANG
전체 방문자
오늘
어제
  • 분류 전체보기 (279)
    • Hi, I'm Dorothy 🕵️‍♂️ (21)
      • Slowly but Surely (18)
      • IT certifications (3)
    • 🤯TIL (80)
      • HTML & CSS (2)
      • Javascript & jQuery (13)
      • React (13)
      • C언어 (1)
      • JAVA (22)
      • Python (2)
      • Oracle SQL (10)
      • My SQL (5)
      • Spring (12)
    • 💻Programmers (17)
    • 🏫 Open API_JAVA (101)
    • 🌎 Project (10)
      • Shopping (10)
    • 💥 Error (24)
    • ⚙ Setting (23)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 코딩앙마
  • Database
  • 콜라보레이토리
  • spring
  • Javascript
  • 서버등록
  • sql기간
  • 창초기화
  • 시작일종료일
  • SQLD합격후기
  • 이것이자바다
  • 연습문제
  • oracle
  • HTML
  • 비쥬얼스튜디오코드
  • colaboratory
  • AllArgsConstructor
  • 오류해결
  • 독학후기
  • 백준
  • 노마드코더
  • CSS
  • 기간설정
  • googlecolaboratory
  • Eclipse
  • java
  • 기간쿼리
  • SQL
  • 파이썬온라인
  • SQLD합격

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Dorothy_YANG

With Dorothy

[92일차] 주문하기 코드모음 / 상품 상세페이지 / 상품 후기 작성
🏫 Open API_JAVA

[92일차] 주문하기 코드모음 / 상품 상세페이지 / 상품 후기 작성

2022. 12. 5. 17:25
728x90

20221202(금)

  • 목차
    - 주문하기 코드모음(Order ~)
    - 상품 상세페이지
    - 상품 후기 작성

< 주문하기 코드모음 (Order ~) >

sql 추가필요

< OrderDetailProductVO 생성필요>

 

 

< OrderMapper.java >

package com.docmall.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.docmall.domain.CartVO;
import com.docmall.domain.CartVOList;
import com.docmall.domain.OrderDetailProductVO;
import com.docmall.domain.OrderDetailVO;
import com.docmall.domain.OrderVO;
import com.docmall.domain.PaymentVO;
import com.docmall.dto.Criteria;

public interface OrderMapper {

	//1)주문정보 저장하기
	void orderSave(OrderVO vo);  // odr_code NULL상태
	
	//2-1)주문상세 저장하기.  장바구니테이블의 데이타를 참조해서, 주문상세테이블에 저장한다.
	void orderDetailSave(@Param("odr_code") Long odr_code, @Param("mem_id") String mem_id);
	
	//2-2)주문상세 저장하기.  바로구매에서 주문상세저장하기(장바구니 사용안함)
	void orderDirectDetailSave(OrderDetailVO vo);
	//3)결제정보 저장하기
	void paymentSave(PaymentVO vo);
	
	//바로구매에서 보여줄 주문내역
	CartVOList directOrder(CartVO vo);
	
	//시퀀스 가져오기
	long getOrderSequence();
	
	// 진행 주문건수
	int getOrderProcessCount(String mem_id);
	
	// 주문내역
	List<OrderVO> getOrderList(@Param("mem_id") String mem_id, @Param("cri") Criteria cri);
	
	int getOrderTotalCount(String mem_id);
	
	List<OrderDetailProductVO> getOrderDetailList(Long odr_code);
	
}

 

< OrderMapper.xml >

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.docmall.mapper.OrderMapper">

	<select id="getOrderSequence" resultType="long">
	
		SELECT SEQ_ORD_CODE.NEXTVAL FROM DUAL
	
	</select>
	

	<insert id="orderSave" parameterType="com.docmall.domain.OrderVO">
		<!-- 
		<selectKey keyProperty="odr_code" order="BEFORE" resultType="long">
			SELECT SEQ_ORD_CODE.NEXTVAL FROM DUAL
		</selectKey>
		 -->
		INSERT INTO ORDER_TBL
			(ODR_CODE, MEM_ID, ODR_NAME, ODR_ZIPCODE, ODR_ADDR, ODR_ADDR_D, ODR_PHONE, ODR_TOTAL_PRICE)
		VALUES
			(#{odr_code}, #{mem_id}, #{odr_name}, #{odr_zipcode}, #{odr_addr}, #{odr_addr_d}, #{odr_phone}, #{odr_total_price})
	
	</insert>
	
	<!-- 장바구니에서 주문상세작성 -->
	<insert id="orderDetailSave">
	
		INSERT INTO ORDER_DETAIL_TBL
			(ODR_CODE, PDT_NUM, ODR_AMOUNT, ODR_PRICE)
		SELECT  
			#{odr_code}, C.PDT_NUM,  C.CART_AMOUNT, P.PDT_PRICE * C.CART_AMOUNT
		FROM 
			CART_TBL C INNER JOIN PRODUCT_TBL P	
		ON 
			C.PDT_NUM = P.PDT_NUM 
		WHERE 
			C.MEM_ID = #{mem_id}
	

	</insert>
	
	<!-- 바로구매에서 주문상세작성 -->
	<insert id="orderDirectDetailSave">
	
		INSERT INTO ORDER_DETAIL_TBL
			(ODR_CODE, PDT_NUM, ODR_AMOUNT, ODR_PRICE)
		VALUES
			(#{odr_code}, #{pdt_num}, #{odr_amount}, #{odr_price})
	
	</insert>
	
	<!-- SEQ_PAYMENT_CODE.NEXTVAL -->
	<insert id="paymentSave">
	
		INSERT INTO PAYMENT_TBL
			(PAY_CODE, ODR_CODE, MEM_ID, PAY_METHOD, PAY_TOT_PRICE, PAY_NOBANK_PRICE, PAY_NOBANK_USER, PAY_NOBANK)
		VALUES
			(SEQ_PAYMENT_CODE.NEXTVAL, #{odr_code}, #{mem_id}, #{pay_method}, #{pay_tot_price}, #{pay_nobank_price}, #{pay_nobank_user}, #{pay_nobank})
	
	</insert>
	
	<select id="directOrder" resultType="com.docmall.domain.CartVOList">
	
		SELECT 
			PDT_IMG_FOLDER, 
			PDT_IMG, 
			PDT_PRICE, 
			#{cart_amount} as CART_AMOUNT, 
			PDT_PRICE * #{cart_amount} AS SALES_PRICE, 
			#{mem_id} as MEM_ID, 
			PDT_NUM, 
			pdt_name 
		
		FROM 
			PRODUCT_TBL
		WHERE 
			PDT_NUM = #{pdt_num}
	
	</select>
	
	<select id="getOrderProcessCount" resultType="int">
	
		<![CDATA[
	
		SELECT 
			COUNT(*)
		FROM 
			ORDER_TBL
		WHERE 
			MEM_ID = #{mem_id}
		AND 
			ODR_STATUS <> '배송완료'
	
		]]>
	</select>

	<select id="getOrderList" resultType="com.docmall.domain.OrderVO">
	
		<![CDATA[
		SELECT 
			RN, ODR_CODE, ODR_DATE, MEM_ID, ODR_NAME, ODR_TOTAL_PRICE, ODR_STATUS  
		FROM (
	        SELECT 
	        	/*+ INDEX_DESC(ord PK_ORDER_CODE) */  
                ROWNUM RN, ORD.ODR_CODE, ORD.ODR_DATE, ORD.MEM_ID, ORD.ODR_NAME, ORD.ODR_TOTAL_PRICE, ORD.ODR_STATUS
	        FROM 
	        	ORDER_TBL ord
            WHERE  
             	ORD.MEM_ID = #{mem_id}
            AND
            	ROWNUM <= #{cri.pageNum} * #{cri.amount}
 			)
		WHERE RN > (#{cri.pageNum}-1) * #{cri.amount}
		]]>
	
	</select>
	
	<select id="getOrderTotalCount" resultType="int">
	
		SELECT 
			COUNT(*) 
		FROM 
			ORDER_TBL 
		WHERE
			MEM_ID = #{mem_id}
	
	</select>
	
	<resultMap type="com.docmall.domain.OrderDetailVO" id="orderDetailMap">
		<id property="odr_code" column="odr_code"/>
		<id property="pdt_num" column="pdt_num"/>
		<result property="odr_amount" column="odr_amount"/>
		<result property="odr_price" column="odr_price"/>
	</resultMap>
	
	<resultMap type="com.docmall.domain.ProductVO" id="productMap">
		<id property="pdt_num" column="pdt_num"/>
		<result property="cate_code" column="cate_code"/>
		<result property="cate_code_prt" column="cate_code_prt"/>
		<result property="pdt_name" column="pdt_name"/>
		<result property="pdt_price" column="pdt_price"/>
		<result property="pdt_discount" column="pdt_discount"/>
		<result property="pdt_company" column="pdt_company"/>
		<result property="pdt_detail" column="pdt_detail"/>
		<result property="pdt_img_folder" column="pdt_img_folder"/>
		<result property="pdt_img" column="pdt_img"/>
		<result property="pdt_amount" column="pdt_amount"/>
		<result property="pdt_buy" column="pdt_buy"/>
		<result property="pdt_date_sub" column="pdt_date_sub"/>
		<result property="pdt_date_up" column="pdt_date_up"/>
	</resultMap>
	
	<resultMap type="com.docmall.domain.OrderDetailProductVO" id="orderDetailProductMap">
		<collection property="orderDetailVO" resultMap="orderDetailMap" />
		<collection property="productVO" resultMap="productMap" />
	</resultMap>
	
	<!-- resultMap 을 사용목적으로 주석처리. 주문 상세정보2 -->
	<select id="getOrderDetailList" resultMap="orderDetailProductMap">
	
		SELECT 
			OD.ODR_CODE, OD.PDT_NUM,  P.PDT_NAME, P.PDT_PRICE, OD.ODR_AMOUNT, OD.ODR_PRICE, P.PDT_IMG_FOLDER, P.PDT_IMG 
		FROM 
			ORDER_DETAIL_TBL OD INNER JOIN PRODUCT_TBL P
		ON 
			OD.PDT_NUM = P.PDT_NUM
		WHERE 
			ODR_CODE = #{odr_code}
		

	</select>
	
</mapper>

 

< OrderService >

package com.docmall.service;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.docmall.domain.CartVO;
import com.docmall.domain.CartVOList;
import com.docmall.domain.OrderDetailProductVO;
import com.docmall.domain.OrderDetailVO;
import com.docmall.domain.OrderVO;
import com.docmall.domain.PaymentVO;
import com.docmall.dto.Criteria;

public interface OrderService {
	
	List<CartVOList> cart_list(String mem_id);
	
	// 장바구니 -> 주문
	void orderSave(OrderVO o_vo, PaymentVO p_vo);  // String type 제거
	
	// 바로구매 -> 주문
	void orderDirectSave(OrderVO o_vo, OrderDetailVO od_vo, PaymentVO p_vo);  // 추가
	
	CartVOList directOrder(CartVO vo);
	
	long getOrderSequence();
	
	int getOrderProcessCount(String mem_id);
	
	// 주문내역
	List<OrderVO> getOrderList(String mem_id, Criteria cri);
	
	int getOrderTotalCount(String mem_id);
	
	List<OrderDetailProductVO> getOrderDetailList(Long odr_code);
}

 

< OrderServiceImpl >

package com.docmall.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.docmall.domain.CartVO;
import com.docmall.domain.CartVOList;
import com.docmall.domain.OrderDetailProductVO;
import com.docmall.domain.OrderDetailVO;
import com.docmall.domain.OrderVO;
import com.docmall.domain.PaymentVO;
import com.docmall.dto.Criteria;
import com.docmall.mapper.CartMapper;
import com.docmall.mapper.OrderMapper;

import lombok.Setter;

@Service
public class OrderServiceImpl implements OrderService {

	//주입
	@Setter(onMethod_ = {@Autowired})
	private OrderMapper orderMapper;
	
	@Setter(onMethod_ = {@Autowired})
	private CartMapper cartMapper;

	@Override
	public List<CartVOList> cart_list(String mem_id) {
		// TODO Auto-generated method stub
		return cartMapper.cart_list(mem_id);
	}

	// 서비스의 메서드안에서 하나라도 에러가 발생하면, 정상적으로 실행되는 다른 메서드의 작업도 롤백처리를 시키는 기능.
	// 장바구니에서 주문하기
	@Transactional
	@Override
	public void orderSave(OrderVO o_vo, PaymentVO p_vo) {
		

		//1)주문정보 저장하기(주문자와배송지 정보)
		orderMapper.orderSave(o_vo); 
		
		//2)주문상세 저장하기(주문상품정보)
		orderMapper.orderDetailSave(o_vo.getOdr_code(), o_vo.getMem_id());
		
		//3)결제정보 저장하기 
		p_vo.setOdr_code(o_vo.getOdr_code());
		orderMapper.paymentSave(p_vo);
		
		//4)장바구니 비우기
		cartMapper.cart_empty(o_vo.getMem_id());

	}
	
	// 상품리스트에서 바로구매
	@Transactional
	@Override
	public void orderDirectSave(OrderVO o_vo, OrderDetailVO od_vo, PaymentVO p_vo) {
		// TODO Auto-generated method stub
		//1)주문정보 저장하기(주문자와배송지 정보)
		orderMapper.orderSave(o_vo); 
		
		//2)주문상세 저장하기(주문상품정보)
		orderMapper.orderDirectDetailSave(od_vo);
		
		//3)결제정보 저장하기 
		p_vo.setOdr_code(o_vo.getOdr_code());
		orderMapper.paymentSave(p_vo);
		
	}

	@Override
	public CartVOList directOrder(CartVO vo) {
		// TODO Auto-generated method stub
		return orderMapper.directOrder(vo);
	}

	@Override
	public long getOrderSequence() {
		// TODO Auto-generated method stub
		return orderMapper.getOrderSequence();
	}

	@Override
	public int getOrderProcessCount(String mem_id) {
		// TODO Auto-generated method stub
		return orderMapper.getOrderProcessCount(mem_id);
	}

	@Override
	public List<OrderVO> getOrderList(String mem_id, Criteria cri) {
		// TODO Auto-generated method stub
		return orderMapper.getOrderList(mem_id, cri);
	}

	@Override
	public int getOrderTotalCount(String mem_id) {
		// TODO Auto-generated method stub
		return orderMapper.getOrderTotalCount(mem_id);
	}

	@Override
	public List<OrderDetailProductVO> getOrderDetailList(Long odr_code) {
		// TODO Auto-generated method stub
		return orderMapper.getOrderDetailList(odr_code);
	}

	
	
}

 

< OrderController.java >

package com.docmall.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.docmall.domain.CartVO;
import com.docmall.domain.CartVOList;
import com.docmall.domain.MemberVO;
import com.docmall.domain.OrderDetailProductVO;
import com.docmall.domain.OrderDetailVO;
import com.docmall.domain.OrderVO;
import com.docmall.domain.PaymentVO;
import com.docmall.dto.Criteria;
import com.docmall.dto.PageDTO;
import com.docmall.kakaopay.ApproveResponse;
import com.docmall.kakaopay.ReadyResponse;
import com.docmall.service.CartService;
import com.docmall.service.KakaoPayServiceImpl;
import com.docmall.service.OrderService;
import com.docmall.util.FileUtils;

import lombok.Setter;
import lombok.extern.log4j.Log4j;

@Log4j
@RequestMapping("/order/*")
@Controller
public class OrderController {

	//주입
	@Setter(onMethod_ = {@Autowired})
	private OrderService orderService;
	
	@Setter(onMethod_ = {@Autowired})
	private CartService cartService;
	
	@Setter(onMethod_ = {@Autowired})
	private KakaoPayServiceImpl kakaoPayServiceImpl;
	
	//업로드폴더 주입
	@Resource(name = "uploadPath") // servlet-context.xml 설정.
	private String uploadPath; // "C:\\doccomsa\\upload\\goods\\"
	
	//1)바로주문 ->주문작성하기(장바구니 사용안함)  2)장바구니  -> 주문작성하기.
	@GetMapping("/orderListInfo")
	public void orderListInfo(@ModelAttribute("type") String type, @RequestParam(value = "pdt_num", required = false ) Integer pdt_num, 
							@RequestParam(value = "odr_amount", required = false ) Integer odr_amount,  HttpSession session, Model model) {
		
		String mem_id = ((MemberVO)session.getAttribute("loginStatus")).getMem_id();
		
		List<CartVOList> orderList = null;
		
		if(type.equals("direct")) {  // 바로주문.  Integer pdt_num, Integer odr_amount, mem_id
			
			CartVO cartVO = new CartVO(null, pdt_num, mem_id, odr_amount);
			
			CartVOList cartVOList = orderService.directOrder(cartVO);
			
			orderList = new ArrayList<>();
			orderList.add(cartVOList);
			
		}else if(type.equals("cart")) { //장바구니
			
			orderList = orderService.cart_list(mem_id);
		}
		
		orderList.forEach(vo -> {
			vo.setPdt_img_folder(vo.getPdt_img_folder().replace("\\", "/"));
		});
		
		//주문내역
		model.addAttribute("orderList", orderList);
	}
	
	
	// 1)클라이언트에서 카카오페이 결제버튼 클릭하면 
	@GetMapping(value = "/orderPay", produces = "application/json")
	public @ResponseBody ReadyResponse payReady(String type, OrderVO o_vo, OrderDetailVO od_vo, PaymentVO p_vo, int totalamount, HttpSession session, Model model) {
		
		
		log.info("주문정보: " + o_vo);
		log.info("결제정보: " + p_vo);
		log.info("총주문금액: " + totalamount);
		
		String mem_id = ((MemberVO)session.getAttribute("loginStatus")).getMem_id();
		
		
		//장바구니 내역불러오기. 바로구매에서는 장바구니를 사용하지 않는다.
		List<CartVOList> cartList = cartService.cart_list(mem_id);
		
		
		// 카카오페이 결제 상품명
		String itemName = "";
		int quantity = 0;
		
		
		//주문번호가 시퀀스 작업(중요)
		o_vo.setOdr_code(orderService.getOrderSequence());
		
		o_vo.setMem_id(mem_id);
		p_vo.setMem_id(mem_id);
		
		// 오라클에서는 "" -> Null 처리 됨.
		p_vo.setPay_nobank_user("");
		p_vo.setPay_nobank("");
		
		
		od_vo.setOdr_code(o_vo.getOdr_code());
		
		//주문정보 저장하기.
		if(type.equals("cart")) {
			orderService.orderSave(o_vo, p_vo);  // 주문상세정보를 장바구니를 참조하여, 확보
		}else if(type.equals("direct")) {
			orderService.orderDirectSave(o_vo, od_vo, p_vo);
		}
		
	
		if(type.equals("cart")) {
			
			for(int i=0; i<cartList.size(); i++) {
				itemName += cartList.get(i).getPdt_name() + ",";
			}
			
			itemName = itemName.substring(0, itemName.lastIndexOf(",")-1);
			quantity = cartList.size();
			
		}else if(type.equals("direct")) {
			itemName = "개별상품";
			quantity = 1;
		}
		
	
		//카카오페이 서버에 1차 준비요청
		ReadyResponse  readyResponse = kakaoPayServiceImpl.payReady(o_vo.getOdr_code(), itemName, quantity, mem_id, totalamount);
		
		
		log.info("결제고유번호: " + readyResponse.getTid());
		log.info("결제요청 URL: " + readyResponse.getNext_redirect_pc_url()); // 카카오 페이 API서버에서 보내오는 url
		
		
		session.setAttribute("tid", readyResponse.getTid());
		session.setAttribute("odr_code", o_vo.getOdr_code()); // 주문번호
		
		return readyResponse;
	}
	
	
	//2)ajax요청이 성공된 후에 호출되는 주소
	//결제승인요청
	@GetMapping("/orderApproval")
	public String orderApproval(@RequestParam("pg_token") String pgToken, HttpSession session) {
		
		String mem_id = ((MemberVO)session.getAttribute("loginStatus")).getMem_id();
		String tid = (String) session.getAttribute("tid");
		Long odr_code = (Long) session.getAttribute("odr_code");
				
		ApproveResponse approveResponse = kakaoPayServiceImpl.payApprove(odr_code, tid, pgToken, mem_id);
		
		// 카카오페이에서 넘어 온 정보를 DB에 저장해야 할 경우. -> update작업

		//세션으로 저장한 정보는 사용후 즉시 소멸시킨다.
		session.removeAttribute("tid");
		session.removeAttribute("odr_code");
				
		return "redirect:/order/orderComplete";
	}
	
	// 무통장 결제. /orderSave
	@PostMapping("/orderSave")
	public String orderSave(String type, OrderVO o_vo, OrderDetailVO od_vo, PaymentVO p_vo, HttpSession session, Model model) {
		
		p_vo.setPay_tot_price(p_vo.getPay_nobank_price());
		
		log.info("주문정보: " + o_vo);
		log.info("주문상세정보: " + od_vo);
		log.info("결제정보: " + p_vo);
		
		
		
		String mem_id = ((MemberVO)session.getAttribute("loginStatus")).getMem_id();
		
		
		//주문번호가 시퀀스 작업(중요)
		o_vo.setOdr_code(orderService.getOrderSequence());
		
		o_vo.setMem_id(mem_id);
		p_vo.setMem_id(mem_id);
		od_vo.setOdr_code(o_vo.getOdr_code());
		
		//주문정보 저장하기.
		if(type.equals("cart")) {
			orderService.orderSave(o_vo, p_vo);  // 주문상세정보를 장바구니를 통하여, 데이타 작업
		}else if(type.equals("direct")) {
			orderService.orderDirectSave(o_vo, od_vo, p_vo);	// 주문작성하기 페이지에서 바로구매 상품정보 데이타 작업
		}
		
		
		return "redirect:/order/orderComplete"; 
	}
	
	
	//클라이언트에게 보여줄 결제및주문이 완료되었습니다.
	@GetMapping("/orderComplete")
	public void orderComplete() {
		
	}
	
	@GetMapping("/orderCancel")
	public void orderCancel() {
		
	}
	
	@GetMapping("/orderFail")
	public void orderFail() {
		
	}
	
	
	// 주문내역
	@GetMapping("/orderList")
	public void orderList(HttpSession session, @ModelAttribute("cri") Criteria cri, Model model) {
		
		String mem_id = ((MemberVO) session.getAttribute("loginStatus")).getMem_id();
		
		// 주문목록
		List<OrderVO> orderList = orderService.getOrderList(mem_id, cri);
		model.addAttribute("orderList", orderList);
		
		// 페이징정보
		int totalCount = orderService.getOrderTotalCount(mem_id);
		model.addAttribute("pageMaker", new PageDTO(cri, totalCount));
	}
	
	//주문상세
	@GetMapping("/orderDetail")
	public void orderDetail2(Long odr_code, Model model) {
		
		List<OrderDetailProductVO> odList = orderService.getOrderDetailList(odr_code);
		
		odList.forEach(vo -> {
			vo.getProductVO().setPdt_img_folder(vo.getProductVO().getPdt_img_folder().replace("\\", "/"));
		});
		
		//주문상세정보. OrderDetailVO
		model.addAttribute("odList", odList);
		
	}
	

	//상품목록에서 이미지 보여주기.
	@ResponseBody
	@GetMapping("/displayFile")
	public ResponseEntity<byte[]> displayFile(String folderName, String fileName) throws IOException {
		
		// C:\\doccomsa\\upload\\goods\\2022\\11\\22\\
		return FileUtils.getFile(uploadPath + folderName, fileName);
	}
}

 

+) KakaoPayServiceImpl 변경부분

    목록 (여러개 상품)
    - 다른정보를 선택한 버튼(this)을 기준으로 상대적으로 참조해줘야 한다.

    상세 (1개 상품)

    - 직접적으로 참조해야 한다.

 

 


< 상품 상세페이지 >

 

(1) Product Controller.java

     아래 두 개 같은 의미


(2) Product 매퍼 & 서비스


(3) productList 복사해서 productDetail.jsp 파일 만들기

      부트스트랩 코드 복사 jsp에 추가 / 수정이 필요한 부분은 수정했음

      https://getbootstrap.com/docs/4.6/components/card/

 

Cards

Bootstrap’s cards provide a flexible and extensible content container with multiple variants and options.

getbootstrap.com

 

  • 수정이 필요한 부분은 수정했음
<div class="container">
  <div class="row">
        <div class="col-md-4">
         <img src="/product/displayFile?folderName=${productVO.pdt_img_folder }&fileName=${productVO.pdt_img}" width="100%" height="400">
        </div>
         <div class="col-md-8">
           <b>${productVO.pdt_name}</b>
         </div>
   </div>
   <div class="row">
      <div class="col-md-12">
         <div id="tabs">
            <ul>
               <li><a href="#product_desc">상품설명</a></li>
               <li><a href="#product_qna">상품후기</a></li>
            </ul>
            <div id="product_desc">
               상품설명
            </div>
            <div id="product_qna">
               상품후기
            </div>
         </div>
      </div>
   </div>

(4) productList.jsp 코드추가


(5) ProductController.java

 

ex) 실행화면

 

 

 


< 상품 상세페이지 > - 디테일 추가

  • productDetail.jsp 코드추가 (script)
<div class="container">
       <div class="row">
          <div class="col-md-4">
            <img src="/product/displayFile?folderName=${productVO.pdt_img_folder }&fileName=${productVO.pdt_img}" style = "width : 350px; height : 380px;" alt = "">
          </div>
          <div class="col-md-8 pl-8">
            <div class="card-body">
              <h5 class="card-title">${productVO.pdt_name}</h5>
              <p class="card-text">test</p>
              <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
            </div>
          </div>
      </div>

      <div class="row">
            <div class="col-md-12">
               <div id="tabs">
                  <ul>
                     <li><a href="#product_desc">상품설명</a></li>
                     <li><a href="#product_qna">상품후기</a></li>
                  </ul>
                  <div id="product_desc">
                     상품설명
                     ${productVO.pdt_detail }
                  </div>
                  <div id="product_qna">
                     상품후기
                  </div>
               </div>
            </div>
         </div>     
</div>

 

ex) 실행화면

 

 

  • 참고링크
    https://minaminaworld.tistory.com/136
 

[Bootstrap] 부트스트랩(Bootstrap) 공백(Spacing) 주기 (mt , mb, ml, mr, mx, my, pt, pb, pl, pr, px, py)

# 부트스트랩(Bootstrap) 공백(Spacing) 주기 - M/P 의 의미 - M : Margin을 의미 - P : Padding을 의미 - t , b , l , r ,x , y 의 의미 - t : top을 의미 - b : bottom을 의미 - l : left을 의미 - r : right을 의미 - x : x축 -> left ,

minaminaworld.tistory.com

 


< 상품 후기 작성 >

 

(1) SQL

--8. 상품후기 테이블 
CREATE TABLE REVIEW_TBL(
   RV_NUM            NUMBER                        CONSTRAINT PK_REVIEW_NUM PRIMARY KEY, 
   MEM_ID            VARCHAR2(15)                  NOT NULL,
   PDT_NUM            NUMBER                        NOT NULL,
   RV_CONTENT         VARCHAR2(200)                  NOT NULL,
   RV_SCORE         NUMBER                        NOT NULL,
   RV_DATE_REG         DATE DEFAULT SYSDATE             NOT NULL
);
CREATE SEQUENCE SEQ_REVIEW_NUM;

 

(2) ReviewVO 클래스 생성


(3) Review Controller

 

** 주입하기 서비스임플에 매퍼 ➡ 컨트롤러에 서비스


**productDetail.jsp 코드추가 및 화면 확인

 

ex) 실행화면

     😎 이제 평점 누르면 색상이 변하도록 해보자!
     누르는 애 그 전까지 모두~ 색칠해버리기. 가운데 누르면 별 3개 찍히도록!!

 

     $(this).parent().children().removeClass("on");

     선택시 p태그 입장에서 자식 a태그의 class = "on" 을 모두 제거하라.

 

     $(this).addClass("on").prevAll("a").addClass("on");

     선택했던 부모로 올라가 자식을

 

**productDetail.jsp 코드추가 및 화면 확인

 

 

ex) 실행화면

728x90
저작자표시 (새창열림)

'🏫 Open API_JAVA' 카테고리의 다른 글

[94일차] 코틀린(변수와 함수 / 기초 데이타 타입) / 상품후기댓글 수정/삭제 버튼  (0) 2022.12.07
[93일차] 안드로이드 코틀린 / 상품 후기 등록, 댓글 리스트 및 페이징  (0) 2022.12.05
[91일차] 카카오페이 연결 / 상품 목록에서 바로구매 진행하기  (0) 2022.12.01
[90일차] 카카오페이 결제시스템 적용 / 카카오페이 클릭 후 작업 / 결제승인요청 / 주문하기 기능 안에서 일어나는 작업  (0) 2022.12.01
[89일차] 주문하기 / 주문자 정보 & 배송지 정보 폼 / 카카오페이 결제  (0) 2022.12.01
    '🏫 Open API_JAVA' 카테고리의 다른 글
    • [94일차] 코틀린(변수와 함수 / 기초 데이타 타입) / 상품후기댓글 수정/삭제 버튼
    • [93일차] 안드로이드 코틀린 / 상품 후기 등록, 댓글 리스트 및 페이징
    • [91일차] 카카오페이 연결 / 상품 목록에서 바로구매 진행하기
    • [90일차] 카카오페이 결제시스템 적용 / 카카오페이 클릭 후 작업 / 결제승인요청 / 주문하기 기능 안에서 일어나는 작업
    Dorothy_YANG
    Dorothy_YANG
    Slowly but Surely, 비전공 문과생의 개발공부

    티스토리툴바