언어/JavaScript

JS CRD 연습

JM Lee 2023. 5. 30. 03:07
728x90

슬프게도 프론트에서 너무 많이 막혀서..

적어도 같은 곳에서는 다시금 시간 지연을 반복하지 않게끔 공부해보았다.

 

// POST 요청 보내기
// 1. 요청할 데이터 생성(정의)
// 2. POST 요청 설정(headers = 인증방식, body 양식 등 / body = 내용)
// 3. fetch 사용하여 요청, 응답 받기(서버 urls.py에 보냄, 서버의 응답 상태를 사용자에 보고) 

async function reviewupload() {
    // 1. 요청할 데이터 생성
    const review = document.getElementById('review').value
    var data = {
      "content": review
    };
  
    // 2. POST 요청 설정
    var requestOptions = {
      method: 'POST',
      headers: {
        'Authorization': 'Bearer ' + localStorage.getItem("access"),
        'content-Type': 'application/json'
      },
      body: JSON.stringify(data)
    };
  
    // 3. fetch를 사용하여 요청 보내기
    fetch('http://127.0.0.1:8000/review/alcohol/', requestOptions)
      .then(response => {
        if (response.ok) {
          console.log("리뷰가 성공적으로 전송되었습니다.");
        } else {
          console.error("리뷰 전송에 실패했습니다.");
        }
      })
      .catch(error => {
        console.error("오류 발생:", error);
      });
  }
// GET
// 1. 다음 페이지에서 가져와야 할 것을 설정
// 2. 맞는 것과 아닌 것을 구분하는 장치
// 3. 맞는 경우 응답(HTML 파일)과, 아닌 경우 응답을 게시

async function AlcholCategoryShow(category_name) {
    // 3개의 카테고리 중 맞는 카테고리의 것만 들고 올 것(카테고리 이름이 인자)
    let url = ''
    if (category_name == undefined) {
        url = `${BACKEND_API}/alchol/`
    } else {
        url = `${BACKEND_API}/alchol/category/${category_name}/`
    }
    //GET method를 설정
    const response = await fetch(url, {
        method: "GET",
    });
	
    let response_json = await response.json()
	// 카테고리 이름이 다를 때 응답
    if (category_name == undefined) {
        response_json = response_json['results']
    }

    const alchol_category_list = document.getElementById('alchol-category-list')

    alchol_category_list.innerHTML = ''
	// 카테고리 이름이 같을 때(이상 없을 때) 응답
    response_json.forEach(e => {
        const id = e.id
        const name = e.name
        const beverage = e.beverage
        const image = e.image
        const taste = e.taste
		
        //우리가 원하고자 하는 카드섹션을 가져옴
        alchol_category_list.innerHTML += `<div class="card" onclick="AlcholDetailShow(${id})">
                                    <img src="${BACKEND_API}${image}">
                                    <div class="alchol-card">
                                        <span class="alchol-name">${name}</span>
                                        <span class="alchol-desc">${beverage}도</span>
                                        <span class="alchol-desc">#${taste}</span>
                                    </div>
                                </div>`
    })
}
// GET 2번째

async function AlcholDetailInfoShow() {
// URL에서 쿼리 매개변수를 추출하여 alchol_id 변수에 저장. 이를 통해 요청할 알코올 정보의 ID를 얻음
  const urlParams = new URL(location.href).searchParams;
  const alchol_id = urlParams.get('id');
  // 서버로 GET 요청을 보냄. 백엔드 서버의 기본 URL에 알코올 ID를 포함한 경로를 만듦.
  const response = await fetch(`${backend_base_url}/alchol/${alchol_id}/`, {
    method: 'GET',
  })
  // 응답을 await 키워드를 사용하여 기다립니다. response.json() 메서드를 호출하여 응답을 JSON 형식으로 변환. 그 결과를 response_json 변수에 저장.
  const response_json = await response.json()
  
  // imageCard라는 HTML 요소를 찾고, img 요소를 동적으로 생성하여 src 속성을 설정.
  // response_json.alchol.image는 응답에서 추출한 알코올 이미지의 URL을 나타냄.
  // 생성한 img 요소를 imageCard에 추가.
  // 아래 내용들도 비슷한 형식으로 자식요소에 추가.
  const imageCard = document.getElementById('image-box')
  const alcholImage = document.createElement('img')
  alcholImage.setAttribute('src', `https://api.sw-iing.com/${response_json.alchol.image}`)
  imageCard.appendChild(alcholImage)

  const newName = document.getElementById('name')
  const Name = document.createElement('p')
  Name.innerText = response_json.alchol.name
  newName.appendChild(Name)

  const newBeverage = document.getElementById('beverage')
  const Beverage = document.createElement('p')
  Beverage.innerText = response_json.alchol.beverage
  newBeverage.appendChild(Beverage)

  const newSort = document.getElementById('sort')
  const Sort = document.createElement('p')
  Sort.innerText = response_json.alchol.sort
  newSort.appendChild(Sort)
  
  const newTaste = document.getElementById('taste')
  const Taste = document.createElement('p')
  Taste.innerText = response_json.alchol.taste
  newTaste.appendChild(Taste)
  
  // review_list라는 HTML 요소를 찾고, response_json.reviews 배열에 대해 반복문을 실행.
  // 각 리뷰에 대해 콘텐츠와 ID를 추출하여 동적으로 생성한 HTML 요소에 추가.
  const review_list = document.getElementById('review-list')
  response_json.reviews.forEach(review => {
    const content = review.content 
    const id = review.id 
    const column_JM = document.createElement('div')
    column_JM.setAttribute('class', 'column-JM')
    review_list.appendChild(column_JM)
    const typing_review = document.createElement('div')
    typing_review.setAttribute('class', 'typing-review')
    typing_review.innerText = content
    column_JM.appendChild(typing_review)
    // 각 리뷰에 대한 삭제버튼 생성
    const delete_review = document.createElement('button')
    delete_review.setAttribute('type', 'button')
    delete_review.setAttribute('class', 'btn btn-info')
    delete_review.setAttribute('id', `delete_review${id}`)
    delete_review.innerText = '리뷰 삭제'
    column_JM.appendChild(delete_review)
    // 버튼 누를 시에 deleteReview 함수 실행
    document.getElementById(`delete_review${id}`).addEventListener('click',()=>{
      deleteReview(id)
    })
  })
  
  //북마크 버튼이라는 HTML 요소를 찾아서 정의함
  // 북마크 버튼 누를 시에 AlcholBookmark 함수 실행
  const bookmarkButton = document.getElementById('bookmarkButton')
  bookmarkButton.setAttribute('onclick', "AlcholBookmark()")
}
// DELETE method
// 보낼 body 내용이 없기 때문에 사용자 인증을 딴 headers만 보냄.

async function deleteReview(review_id){
  const response = await fetch(`${backend_base_url}/review/alcoholreview/${review_id}`, {
    method : 'DELETE',
    headers : {
      'Authorization': 'Bearer ' + localStorage.getItem("access"),
    }
  })
  location.reload()
}

'언어 > JavaScript' 카테고리의 다른 글

async / await  (0) 2023.06.03
setAttribute  (0) 2023.06.03
onclick this  (0) 2023.06.03
toggleClass()  (0) 2023.06.03