soozya
[BACK] 상품 결제하기 본문
[👩🏻💻소스코드]
(OrderPayDAO.java)
package model;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.ArrayList;
public class OrderPayDAO {
private DBConnectionMgr pool=null; //1)연결할 클래스 객체 선언
//공통
private Connection con=null;
private PreparedStatement pstmt=null;
private ResultSet rs=null; //select
private String sql=""; //실행시킬 SQL구문 저장용
public OrderPayDAO() {
try {
pool=DBConnectionMgr.getInstance();
}catch(Exception e) {
System.out.println("DB 접속 오류="+e);
}
}//생성자
//회원정보 불러오기
public ArrayList<OrderPayDTO> getOrderMemList(String mem_id){
ArrayList<OrderPayDTO> orderList=new ArrayList<>();
// Timestamp post_date = new Timestamp(new Date().getTime());
// int order_num=0;
OrderPayDTO order= new OrderPayDTO();
try {
con=pool.getConnection();
sql="select i.*, m.* from item_depth i, mem_depth m where m.mem_id=?";
pstmt=con.prepareStatement(sql);
pstmt.setString(1, mem_id);
System.out.println("getOrderMemList()에서 회원정보 불러오기");
rs=pstmt.executeQuery();
if(rs.next()) {
order=makeOrderMemResult();
System.out.println("OrderMemList"+order);
orderList.add(order);
}
}catch (Exception e){
System.out.println("getOrderMemList sql 에러: "+e);
}finally {
pool.freeConnection(con, pstmt, rs);
}
return orderList;
}
//주문하기
public int insertOrder (OrderPayDTO order) {
java.util.Date now = new java.util.Date();
SimpleDateFormat vans = new SimpleDateFormat("yy/MM/dd");
String order_date=LocalDate.now().toString();
int check=0;
int pay_num=0;
try {
con=pool.getConnection();
sql="select max(pay_num) from pay";
pstmt=con.prepareStatement(sql);
rs=pstmt.executeQuery();
if(rs.next()) {//보여주는 결과가 있다면
pay_num=rs.getInt(1)+1;//최대값+1
}else {
pay_num=1;//테이블에 한개의 데이터가 없다면
}
sql="insert into pay (pay_num, mem_id, order_date, pay_meth, pay_amt, pay_total, item_name) values(?,?,?,?,?,?,?)";
pstmt=con.prepareStatement(sql);
pstmt.setInt(1, pay_num); //주문 번호
pstmt.setString(2, order.getMem_id()); //주문자 아이디
pstmt.setString(3, order_date); //주문 날짜
pstmt.setString(4, order.getPay_meth()); //결제방법
pstmt.setInt(5, order.getPay_amt()); //결제상품 합계 금액
pstmt.setInt(6, order.getPay_total()); // 총 결제 가격
pstmt.setString(7, order.getItem_name()); // 총 결제 가격
check=1;
int insert=pstmt.executeUpdate();
System.out.println("주문하기 성공 확인: "+insert);
}catch(Exception e) {
System.out.println("insertOrder 오류확인 :"+ e);
}finally {
pool.freeConnection(con, pstmt, rs);
}
return check;
}
//주문 내용 전송하기
public int getOrderInsert(OrderPayDTO order){
java.util.Date now = new java.util.Date();
SimpleDateFormat vans = new SimpleDateFormat("yyyyMMdd");
String order_num = vans.format(now);
String order_date=LocalDate.now().toString();
int x=0;
try {
con=pool.getConnection();
//주문번호 생성을 위한 sequence를 받아옵니다.
sql = "SELECT seq_ordercode.NEXTVAL seq_num FROM dual";
pstmt=con.prepareStatement(sql);
rs = pstmt.executeQuery();
if (rs.next()) {
int ordercode = rs.getInt("seq_num");
// 주문 번호를 생성
String trade_code = order_num+"-"+String.format("%04d", ordercode);
order_num=trade_code;
System.out.println("order_num: "+order_num+ ", ordercode"+ordercode);
}
// rs.close();
//주문번호, 회원 아이디
//con.setAutoCommit(false); //트랜잭션 처리
sql = "insert into order_check (order_date, mem_id, item_img, item_su, item_name, pay_amt, pay_total, item_num, order_num) ";
sql+= "values(?,?,?,?,?,?,?,?,?)";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, order_date); //주문 날짜
pstmt.setString(2, order.getMem_id()); //주문자 아이디
pstmt.setString(3, order.getItem_img()); //결제방법
pstmt.setInt(4, order.getItem_su()); //상품 수
pstmt.setString(5, order.getItem_name()); //상품이름
pstmt.setInt(6, order.getPay_amt()); //결제상품 합계 금액
pstmt.setInt(7, order.getPay_total()); // 총 결제 가격
pstmt.setInt(8, order.getItem_num()); //상품번호
pstmt.setString(9, order_num);
int insert=pstmt.executeUpdate();
System.out.println("주문 결과 보냈을까?: "+insert);
//con.commit();
x = 1;
} catch (Exception e) {
System.out.println("getOrderInsert()에러유발->" + e);
} finally {// 3.메모리해제
pool.freeConnection(con, pstmt, rs);
}
return x;
}
//pay에 해당하는 모든 정보
private OrderPayDTO makeOrderMemResult() throws Exception {
OrderPayDTO order = new OrderPayDTO();
order.setItem_num(rs.getInt("item_num"));
order.setItem_name(rs.getString("item_name"));
order.setItem_pay(rs.getInt("item_pay"));
order.setItem_su(rs.getInt("item_su"));
order.setItem_img(rs.getString("item_img"));
order.setMem_id(rs.getString("mem_id"));
order.setMem_name(rs.getString("mem_name"));
order.setMem_phone(rs.getString("mem_phone"));
order.setMem_email(rs.getString("mem_email"));
order.setMem_zipcode(rs.getInt("mem_zipcode"));
order.setMem_addr1(rs.getString("mem_addr1"));
order.setMem_addr2(rs.getString("mem_addr2"));
return order;
}
}
(OrderPayAction.java)
package action;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.OrderPayDAO;
import model.OrderPayDTO;
public class OrderPayAction implements CommandAction {
@Override
public String requestPro(HttpServletRequest request, HttpServletResponse response) throws Throwable {
// TODO Auto-generated method stub
//int item_num=0;
int pay_num=0;
int btn= Integer.parseInt(request.getParameter("btn"));
System.out.println("OrderPayAction의 btn "+btn);//1
//System.out.println("OrderPayListAction의 전달된 pay_num=>"+pay_num);
int item_num = Integer.parseInt(request.getParameter("item_num"));
String mem_id = request.getParameter("mem_id"); //회원아이디
System.out.println("OrderPayAction의 mem_id : "+mem_id);//1
System.out.println("여기로 오는 item_num: "+item_num);
OrderPayDAO orderpay = new OrderPayDAO();
List<OrderPayDTO> orderList = orderpay.getOrderMemList(mem_id);
System.out.println("orderlist size =====: "+ orderList.size());
request.setAttribute("pay_num",pay_num);
request.setAttribute("orderList",orderList);
request.setAttribute("orderpay",orderpay);
request.setAttribute("mem_id",mem_id);
request.setAttribute("btn",btn);
//3.공유해서 이동할 수 있도록 페이지를 지정
return "/OrderPay.jsp";
}
}
(OrderPayProAction.java)
package action;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.OrderPayDAO;
import model.OrderPayDTO;
public class OrderPayProAction implements CommandAction {
@Override
public String requestPro(HttpServletRequest request, HttpServletResponse response) throws Throwable {
// TODO Auto-generated method stub
request.setCharacterEncoding("utf-8");
//int pay_num = 0;
OrderPayDTO order=new OrderPayDTO();
List<OrderPayDTO> orderList = new ArrayList<OrderPayDTO>();
System.out.println("pro가 시작됩니다.111"+order);
//System.out.println("pro가 시작됩니다.222"+orderList);
order.setMem_id(request.getParameter("mem_id"));
System.out.println("pro가 시작됩니다.");
order.setItem_su(Integer.parseInt(request.getParameter("item_su")));
System.out.println(request.getParameter("item_su"));
order.setItem_num(Integer.parseInt(request.getParameter("item_num")));
System.out.println(request.getParameter("item_num"));
order.setPay_amt(Integer.parseInt(request.getParameter("pay_amt")));
System.out.println("====amt====: "+request.getParameter("pay_amt"));
order.setPay_meth(request.getParameter("pay_meth"));
order.setItem_img(request.getParameter("item_img"));
order.setItem_name(request.getParameter("item_name"));
System.out.println("pro야 잘 받았니?");
// order.setPay_num(Integer.parseInt(request.getParameter("pay_num")));
order.setPay_total(Integer.parseInt(request.getParameter("pay_total")));
// order.setOrder_date(String.valueOf(request.getParameter("order_date")));
System.out.println("pro야 잘 받았을까?222");
OrderPayDAO opPro=new OrderPayDAO();
int check=opPro.insertOrder(order);
int x=opPro.getOrderInsert(order);
System.out.println("insertOrder=>"+check);
System.out.println("getOrderInsert=>"+x);
System.out.println("pro, 여기까지 왔니?");
request.setAttribute("order",order);
// request.setAttribute("pay_num", pay_num);
request.setAttribute("orderList",orderList);
request.setAttribute("mem_id",request.getParameter("mem_id"));
//3.공유해서 이동할 수 있도록 페이지를 지정
return "/OrderPaypro.jsp";
}
}
(js 파일)
$(function(){
$("#name_error").hide();
$("#addr_error").hide();
$("#addr2_error").hide();
$("#phone_error").hide();
$('#pay_btn').click(function(){
//1. 이름 체크
var name=$("#mem_name").val();
if(name.length == null || name.length ==""){
$('#name_error').show();
return false;
}else{
$('#name_error').hide();
}
//2. 주소1 체크
var addr=$("#mem_addr1").val();
if(addr.length ==null || addr.length ==""){
$('#addr_error').show();
return false;
}else{
$('#addr_error').hide();
}
//3. 주소2 체크
var addr2=$("#mem_addr2").val();
if(addr2.length ==null || addr2.length ==""){
$('#addr2_error').show();
return false;
}else{
$('#addr2_error').hide();
}
//4. 연락처 체크
var phone=$("#mem_phone").val();
if(phone.length ==null || phone.length ==""){
$('#phone_error').show();
return false;
}else{
$('#phone_error').hide();
}
//5. 결제 방법 선택
var payment = $("input[type=radio][name=pay_meth]:checked").val();
if(payment==null){
alert("결제방법을 체크해주세요");
return false;
}
alert("결제가 완료되었습니다.");
});
});
[💬설명]
1️⃣ 회원정보와 상품 정보 불러오기
- 결제 페이지에서 회원 정보(이름, 주소 등)가 필요했기 때문에 상품정보와 함께 불러오기!
(OrderPayDAO)
2️⃣ 회원정보 오류 시 경고 메시지 띄우기 (js)
- 주문 페이지 프론트 코딩은 내 담당이 아니었으나 백부분 구현하면서 이것저것 기능 추가를 많이 했다.
기본적인 틀은 팀원이 짜고, 기능은 내가 이것저것 추가 함ㅎ
- 주문하기 페이지를 맡으면서 오류 날 때 빨간색 글씨로 경고메시지 띄우는걸 꼭 해보고 싶었는데,
팀원들도 너무 시간을 잡아먹거나 어려운거 아니면 하고 싶은거 해봐라 주의였던지라 얼른 추가함!😉
(OrderPay.jsp)
◼ 실행했을 때 나타나는 화면 (가입시 작성한 회원정보가 나타난다)
◼ 회원정보 js 파일 (동일 형식이라 이름 체크 부분만 작성함)
(OrderPay.jsp)
1) (129라인) jsp 파일에서 name_error라는 id를 설정한 후, 해당 메시지를 작성
(js파일)
2) js파일에서 해당 메세지를 숨김(~.hide();)
3) pay_btn(결제하기 버튼)을 클릭시 해당 함수 실행됨
4) name에 해당하는 데이터가 비어있거나 작성되지 않았다면 해당 메시지를 보여줌
5) 값이 잘 들어가있다면 에러 메시지를 숨기면 됨!
◼ 주소칸/연락처칸이 비워졌을 때 나타나는 화면
- 이게 뭐라고 구현해놓고 뿌듯해서 자랑했던 기억이..ㅋㅋㅋㅋㅋ
생전 처음 해보는거니까 뚝딱이긴 했지만 쓰면 쓰는대로 실행돼서 기분 좋았다 ㅎ..
◼ 결제 방법 js 파일
1) 각 결제수단을 체크 했을 때 payment라는 변수에 저장될 수 있도록 설정
2) payment의 값이 null일 경우, 결제방법을 체크해달라는 경고창이 뜨도록 설정
3️⃣ 상품 주문 후 마이페이지에서 확인하기 (주문번호 출력)
◼ 주문번호 설정을 위한 시퀀스 생성
1) 주문번호를 설정하기 위한 시퀀스를 생성했는데, 사용한 sql 구문은
create sequence seq_ordercode start with 1 increment by 1 nocycle nocache
1부터 시작, 1씩 증가, 최대값에 도달하면 멈춤..인데 최대값 설정을 안했음...메모리에는 저장하지 않음
2) NEXTVAL를 사용한 이유 : 시퀀스를 처음 생성했을 때는 값이 없기 때문에 CURRVAL 사용이 불가능함
- 처음 생성 할 때에는 반드시 nextval로 값을 넣어주어야 currval에 값이 저장되고 사용 가능
3) seq테이블의 ordercode라는 필드명의 다음값을 가져와 seq_num를 출력
◼ 주문번호 생성하기
1) 주문번호(날짜-0001 형식) 생성하기 위해 자료형이 String인 trade_code 변수를 설정함
2) 95라인에서 설정한 order_num에 시퀀스를 생성해서 만든 seq_num을 가져오되, 4자리 형식으로 불러오도록 함
[💻결과]
[주문 내역 확인]
'👩🏻💻프로젝트 > 👥팀프로젝트' 카테고리의 다른 글
[BACK] 상품 검색하기 (0) | 2023.08.09 |
---|---|
[BACK] 글 삭제하기 (0) | 2023.08.03 |
[BACK] 글 수정하기 (0) | 2023.08.02 |
[BACK] 게시판 글 쓰기, 상세보기 (0) | 2023.07.29 |
[BACK] 게시판 글 목록 보기 (0) | 2023.07.20 |