장바구니 만들기中

검색기능 -> 디테일 -> 장바구니(담기)

-> 컨트롤러 ->  서비스(세션에서 카트겍체를 불러와서 카트안에 있는 담기 메소드를 활용한다.)->  유틸 (카트)

 

카트(장바구니_책바구니)에서 담기기능(결재기능 을용)

-> 컨트롤러 ->  서비스 ->  DAO ->  Mapper ->  xml ->  SQL  (library_record 에 저잘)

 

 

뷰(jsp)

디테일

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>도서 검색 목록</title>
	<style>
	td{border: 1px solid;}
	body{background-color: #664499; color: white;}
	img {width: 120px;}
	#description {width:50%;}
	</style>
    <script src="/js/jquery-3.6.0.min.js"></script>
	<script>
		function search(){
			var keyWord = $('#keyWord').val();
			location.href="/library/bookSearch/"+keyWord;
			return false;
		}
		
		function inCart() {
			  var serData = $('#detail_form').serialize();
			      $.ajax({
			         url:'/library/cart/tocart',
			         method:'post',
			         cache:false,
			         data:serData,
			         dataType:'json',
			         success:function(res){
			        	if(res.ok){
			        		alert("장바구니에 저장 성공")
			            	location.href = '/library/cart';
			        	}else{
			            alert("장바구니에 들어있는 책입니다");
			        	}
			         },
			         error:function(xhr, status, err){
			            alert("error"+err);
			         }
			      });
			  return false;
		  }
	</script>
</head>
<body>
	<form id="search" onsubmit="return search();">
		<input type="text" id="keyWord" name="keyWord">
		<button type="submit">검색</button>
		
	</form>
	<div>제목</div>
	<div>${book.title}</div>
	<div>지은이</div>
	<div>${book.author}</div>
	<div>출판사</div>
	<div>${book.publisher}</div>
	<div>출판일</div>
	<div>${book.pubDate}</div>
	<div>옮긴이</div>
	<div>${book.translator}</div>
	<div>isbn</div>
	<div>${book.isbn}</div>
	<div><img src="${book.imageUrl}"></div>
	<div id="description">${book.description}</div>
	 <form id="detail_form" onsubmit="return inCart();">
	 	<input type="hidden" id="title" name="title" value="${book.title}">
		<input type="hidden" id="author" name="author" value="${book.author}">
		<input type="hidden" id="publisher" name="publisher" value="${book.publisher}">
	 	<input type="hidden" id="isbn" name="isbn" value="${book.isbn}">
	 	<input type="hidden" id="imageUrl" name="imageUrl" value="${book.imageUrl}">
		<button type="submit">담기</button>
	</form>
</body>
</html>

장바구니

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>도서관 가온누리</title>
 <script src="/js/jquery-3.6.0.min.js"></script>
<script>  
  function del(isbn){
	var reqURL='/library/cart/delelte/'+isbn;
	if(!(confirm('정말로 바구니에서 삭제할까요?')))return;
	location.href = reqURL;
  }
  
  function cartEmpty(){
	   if(!(confirm('정말로 책바구니를 비울까요?'))){
	   return;
	   }
	   location.href = '/library/cartempty/';
	  }
  function rent(isbn){
	  if(!confirm ("선택한 도서를 대출하시겠어요?")) return;
	     $.ajax({
	         url:'/library/cart/rent/'+isbn,
	         method:'post',
	         cache:false,
	         dataType:'json',
	         success: function (res){
	        	if (res.ok){
	        		alert("대출되었습니다.")
	        	location.href='/library/cart/delelte/'+isbn;
	        	}else alert("대출중인 도서입니다.")
	         },
	         error: function(xhr, status, err){
	        	 alert('로그인 하였는지 확인해주세요 error='+err);
	         }
	      });
	     return false;
  }
  </script>
<style>
body { color:white; }

a:visited {color:white; text-decoration: none;}
   table{border:1px solid black; padding:0.5em; 
      border-spacing: 0; border-collapse: collapse;
   }
   th {border:1px solid black; background-color: #333;}
   th:nth-child(2){width:20em;}
   td {border:1px solid black;}
   td{padding:0.2em 0.5em; text-align:center;}
   tr#footer>td { border-top:3px double black; 
      font-weight:bolder; background-color:#333;
   }
   tr#footer>td:nth-child(1){ text-align:right;}
   tr#footer>td:nth-child(2){ text-align:left;}
   img{width:90px;}
</style>
</head>
<body bgcolor="#664499">
	<div><a href="/library/bookSearch">검색....</a></div>
	<h3>Shopping Cart</h3>
	
	<table>
		<tr>
			<th></th><th>제목</th><th>지은이</th><th>출판사</th><th>(대출 가능 여부...)</th>
			<th>대출</th><th>예약</th><th>배달</th><th>삭제</th>
		</tr>
		<c:forEach var="item" items="${list}">
		<tr>
			<td><img src="${item.imageUrl}"></td>
			<td>${item.title}</td>
			<td>${item.author}</td>
			<td>${item.publisher}</td>
			<td>${item.isbn}</td>
			<td><button onclick="rent(${item.isbn});">대출</button></td>
			<td><button onclick="del(${item.isbn});">delete</button></td>
			<td><button onclick="del(${item.isbn});">delete</button></td>
			<td><button onclick="del(${item.isbn});">delete</button></td>
		</tr>
		</c:forEach>
		<tr>
		<td></td><td></td><td></td><td></td><td></td><td></td><td></td>
		<td><button onclick="cartEmpty();">비우기</button></td>
		</tr>
	</table>
	<br>
	<div><a href="/library/bookSearch">검색....</a></div>
	<a href="javascript: cartEmpty();">delete all</a>
</body>
</html>

건트롤러

package com.example.demo.cont;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.example.demo.svc.BookSVC;
import com.example.demo.vo.BookVO;

@Controller
@RequestMapping("/library")
public class bookCont {

	@Autowired
	private BookSVC bookSvc;
	
	@GetMapping("bookSearch")
	public String bookSerch() {
		return "/book/bookSearch";
	}
	@GetMapping("bookSearch/{keyWord}")
	public String bookSearch(@PathVariable("keyWord")String keyWord,
			Model m) {
		m.addAttribute("bookList",bookSvc.search(keyWord));
		//페이지헬퍼 연결
		return "/book/bookSearchList";
	}
	@GetMapping("bookDetail/{isbn}")
	public String bookDetail(@PathVariable("isbn")String isbn,
			Model m) {
		m.addAttribute("book",bookSvc.searchIsbn(isbn));
		return "/book/bookDetail";
	}
	@GetMapping("/cart")
	public String showCart(Model m) {
		m.addAttribute("list", bookSvc.showCart());
		return "/book/showCart";
	}
	@PostMapping("/cart/tocart")
	@ResponseBody
	public String toCart(BookVO book) {
		return String.format("{\"ok\":%b}", bookSvc.toCart(book));
	}
  @GetMapping("/cart/delelte/{isbn}")
  public String deleteBook(@PathVariable("isbn")String isbn, Model model) {
  	bookSvc.delete(isbn);
     return "redirect:/library/cart";
  }
  @GetMapping("/cartempty")
  public String cartEmpty() {
     bookSvc.cartEmpty();
     return "redirect:/library/cart";
  }
  
  @PostMapping("/cart/rent/{isbn}")
  @ResponseBody
  public String rent(@PathVariable("isbn")String isbn) {
  return String.format("{\"ok\":%b}", bookSvc.rent(isbn));
  }
	
}

서비스

package com.example.demo.svc;

import java.util.List;

import javax.servlet.http.HttpSession;

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

import com.example.demo.dao.BookDAO;
import com.example.demo.dao.RecordDAO;
import com.example.demo.util.Cart;
import com.example.demo.vo.BookVO;
import com.example.demo.vo.RecordVO;

@Service
public class BookSVC {

	@Autowired
	private HttpSession session;
	
	@Autowired
	private BookDAO book;
	
	@Autowired
	private RecordDAO recordDao;
	
	public List<BookVO> search(String keyWord){
		return book.search(keyWord);
	}

	public Object searchIsbn(String isbn) {
		return book.searchIsbn(isbn);
	}
	

	public boolean toCart(BookVO book) {
	if( session.getAttribute("cart") == null ) { 
			session.setAttribute("cart", new Cart());
			System.err.println("서비스에서 카트주기");
		}
		Cart cart = (Cart) session.getAttribute("cart");
		return cart.add(book);
	}
	
	public List<BookVO> showCart() {
		Cart cart = (Cart) session.getAttribute("cart");
		return cart.getList();
	}

	public boolean delete(String isbn) {
		Cart cart = (Cart) session.getAttribute("cart");
		return cart.delete(isbn);
	}

	public boolean cartEmpty() {
		Cart cart = (Cart) session.getAttribute("cart");
		return cart.cartEmpty();
		
	}

	public boolean rent(String isbn) {
		String uid = (String) session.getAttribute("uid");
		Cart cart = (Cart) session.getAttribute("cart");
		List<BookVO> list = cart.getList();
		RecordVO record = new RecordVO();
		for(int i=0; i<cart.getList().size(); i++) {
			if (isbn.equals(list.get(i).getIsbn())) {
				record.setUid(uid);
				record.setIsbn(list.get(i).getIsbn());
				record.setAuthor(list.get(i).getAuthor());
				record.setTitle(list.get(i).getTitle());
				record.setPublisher(list.get(i).getPublisher());
			}
		}
		if (recordDao.insert(record)>0) return true;
		return false;
	}


}

**유틸(카트)

package com.example.demo.util;

import java.util.ArrayList;
import java.util.List;

import com.example.demo.vo.BookVO;

public class Cart {
	
		private List<BookVO> list= new ArrayList<>();
		
		public boolean add(BookVO book) {
			list.add(book);
			return true;
		}
		
		public List<BookVO> getList() {
			return list;
		}
		
		public boolean delete(String isbn) {
			for (int i = 0; i<list.size(); i++) {
				BookVO book = list.get(i);
				if ( book.getIsbn().equals(isbn) ){
					list.remove(i);
					return true;
				}
			}
			return false;
		}
		
		public boolean cartEmpty() {
			list.clear();
			return true;
		}
		
		public boolean cartSave() {
			list.clear();
			return true;
		}

}

DAO

package com.example.demo.dao;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.example.demo.parsing.BookParsing;
import com.example.demo.vo.BookVO;

@Repository
public class BookDAO {
	
	private BookParsing bp = new BookParsing();
	
	public List<BookVO> search(String keyWord) {
		return bp.search(keyWord);
		//return null;
	}

	public Object searchIsbn(String isbn) {
		return bp.searchIsbn(isbn);
	}
}

Mapper

package com.example.demo.mapper;

import org.apache.ibatis.annotations.Mapper;

import com.example.demo.vo.RecordVO;

@Mapper
public interface RecordMapper {

	int insertRecord(RecordVO r);
}

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.example.demo.mapper.RecordMapper">

	<insert id="insertRecord" 
    	parameterType="com.example.demo.vo.RecordVO">
    	INSERT INTO library_record
    	(isbn,uid,title,author,publisher,rent_date)
    	VALUES(#{isbn},#{uid},#{title},#{author},#{publisher},NOW())
    </insert>
</mapper>

SQL 문장 (workbench)

CREATE TABLE library_record (
	id INT NOT NULL AUTO_INCREMENT,
    isbn VARCHAR(30) NOT NULL,
    uid VARCHAR(30) NOT NULL,
    title VARCHAR(100) NOT NULL,
    author VARCHAR(30) NOT NULL,
    publisher VARCHAR(30) NOT NULL,
    rent_date timestamp,
    return_date timestamp,
	reserve INT,
	delivery VARCHAR(30),
    PRIMARY KEY (id)
);
DROP table library_record;

    	INSERT INTO library_record
    	(isbn,uid,title,author,publisher,rent_date)
    	VALUES('7777777777','test','test','test','test',NOW());

SELECT * FROM library_record;

 

아이디어노트 

더보기

좋아요 버튼

자신글만 삭제가능하게….

사진게시판

업로드 기능

파일 뒤에 렌덤 값 붙이기?

사진파일일때는 바로 창에보여주기?

업로드 경로 db 에 저장하기

        //파일경로와 이름을 db에저장한다.

        그리고 글을 서밋 할때아이디를 업로드 파일에 붙여준다!

        아이디가 필요하다 그런데..저장되어있지 않다 

        파일경로를 브라우저에서 저장하고 서브밋 할때 스트링으로 다보낸다.

        ajax의 결과를 히든으로 하여 폼에 넣어준다?

        따라서 이결과 값에서 saveName을 json에 리스트로 넣는다?

        어짜피 리스트는 자바스크립트니깐 서밋 부분에서 리스트로 받을 있다.

        그러면 여기서  json  문자열로 보낸다. 세이브 리스트와 갯수.

        리스트를 모델에 담는다. 그 모델을 자바스크립트 파라미터 에 넣는다.

        파라미터는 빌수 있다..

        파일 업로드유 유무를 디비에저장 만약 유라면 디비에서 사진리스트를 받는다.

        나중에 리드시 포이치로 사진을 불러온다.

        

책바구니

로그아웃 /  등록 창에서 비로그인시 로그인 창으로 다이렉트 모든 페이지 에서……

체크박스로 대출/예약/배달

 

하나의 매퍼와 다오로 여러 게시판 구현 컨트롤러에서 서비스에서 지정한다

Xml 에서 sql 문장 조정

사진게시판 생성;

글 검색  인풋박스 그리고 겟방식 옵션.... !!! 그러면 포스트? 아니 겟! 검색;

조회수;

페이지 백버튼 오류;

글쓴이;

작성자 세션에서 받기;

 

희원이랑 게시판을 같이한다. 그때  사진 업로드 기능 구현 

그전에 장바구니 기능 과 오픈 api 연결한 검색기능 구현 

매퍼에서 vo import로 한 멥퍼 와 다오로 여러 게시판 구현

 

//22.01.30

주문시스템 만들기

Openapi 로 책 검색 가능하게 만든다.!

책검색에서 제고 확인  하고 주문 한것을 디비에 담아준다 

중복되어있는 것은 예약/배달예약 가능

 

북피니언 인증키

E4382798261957A5F3B708916542BA8E5AF936F427FC7D8C7826F22C11C7FDEC

인기 100

https://book.interpark.com/api/bestSeller.api?key=

E4382798261957A5F3B708916542BA8E5AF936F427FC7D8C7826F22C11C7FDEC

&categoryId=100

 

도서 검색

http://book.interpark.com/api/search.api?key=

E4382798261957A5F3B708916542BA8E5AF936F427FC7D8C7826F22C11C7FDEC

&query=%EC%82%BC%EA%B5%AD%EC%A7%80

&categoryId=100&output=json&maxResults=99

 

Isbn 검색

http://book.interpark.com/api/search.api?key=

E4382798261957A5F3B708916542BA8E5AF936F427FC7D8C7826F22C11C7FDEC

&query=

9788992717199

&queryType=isbn&output=json

 

http://book.interpark.com/api/bestSeller.api?key=

E4382798261957A5F3B708916542BA8E5AF936F427FC7D8C7826F22C11C7FDEC

&categoryId=100&output=json

 

게시판 앞뒤 5개 뜨기…..

 

파싱 리스트가 30개가 뜨도록 ->99;

검색결과가 없을때 검색 결과가 없습니다.

자동완성기능

 

북리스트 페이지 헬퍼

검색 조건 주기…..

 

모든 창에서 책바구니.버튼

 

책바구니에서 보여줄 목록 ……..

책재목  지은이 isbn 대출 / 예약 현황  

 예약 ? Db 와 연결? 그럼 db에서 대출 정보를 가져온다…..

db에 저장되어야 할 사항은 isbn 대출자 대출종류 시간…. 컬럼으로 구분

대출과 배달은 같은 취급 베달은 스트링 === 현장대출 배달신청 배달완료 회수완료?

 대출 버튼에서 이미 대출중인 도서 입니다 예약기능을 이용해 주세요.

예약 순번 ? 입니다!

 

파싱이 (리스트를 뱉게 함)을 서비스로 서비스에서 리스트 생성 뷰로 보낸다…;

책바구니에 담고 책바구니 비우기 책바구니 에서 체크박스 선택해서 요청 

뷰에서 예약/대출/배달/배달예약 한것을 디비에 저장한다. 저장시 유저아이디와 예약/대출 시간 저장

모든 책을 제고 처리하고 디폴트 값은 1로 처리한다. -> 예약 혹은 배달 대출 신청만 저장하고 중복시 얼럿

대출중이거나 배달중인것은 예약만가능하게한다 처리한다.

예약은 순번으로 처리하여 얼럿으로 예약 순번을 알려준다….

대출중 토큰 회수완료 나중에 회수 완료 

 

인기도서 / 인기대출 도서…..

 

도서 신청하는 것을 파싱과 연결하느냐 마느냐….. 일단 인풋 박스로 만들고 추후 파싱할수 있게한다.? 검색없을때

작성한다…. 

 

네서재에서  대출/예약 등의 상황파악이 가능하도록 한다. 그리고 대출이력 페이지

 

 

 

예약은 대출 배달 로 테이블 오더 테이블 만들기 

 

 

로그인을 안하고 대출을 누르면 에러가 나기때문에 비로그인시 사용 불가 처리 하거나 리다이렉트한다.

장바구니에 들어있는 도서는 추가할수 없도록

전체코드 

https://github.com/coderhydra/22jan_project/tree/master/libraryWeb

Comment