JS / 웹개발경진대회 / canvas / 영수증 만들기

Sangho Dev 💻 회고록·2023년 1월 9일
0

사용자가 장바구니의 있는 상품들의 최종구매가 결정되면 이름과 연락처를 적을 수 있는 모달창을 띄워주고 이름과 연락처를 입력받으면 영수증을 띄워주어야 하는데 사용자의 개인정보가 담겨 있기 때문에 img처럼 보이는 영수증을 띄워 copy & paste가 안되도록 하고, 영수증에는 구매자의 정보와 상품 총가격 정보 등을 띄워주는 기능을 구현하기로 하였다.

상품의 구매가 결정되고 최종구매 버튼을 누르게 되면

성함과 연락처를 적을 수 있는 모달창을 띄우게 된다.

그러면 위 사진처럼 img 형태의 영수증에 날짜와 현재시간, 구매자의 이름과 핸드폰번호 그리고 장바구니에 담은 상품의 가격과 수량, 최종적으로 상단에 모든 상품 총 합계를 표시해주기로 하였다.

	<div class="container canvas-container hide">
        <h3>영수증</h3>
        <button class="btn btn-dark close">닫기</button>
        <canvas class="canvas" id="canvas" width="350" height="1000"></canvas>
      </div>

먼저 영수증을 띄우기 위한 modal창 내부에 창을 닫을 수 있는 버튼과 canvas 태그를 이용하여 img형태의 영수증을 만들어주었다.

		  var canvas = document.getElementById("canvas");
          var c = canvas.getContext("2d");
          c.font = "14px dotum";
          c.fillText(`${dateString}    ${timeString}`, 20, 30);
          c.font = "14px dotum";
          c.fillText(`이름 : ${name}`, 20, 60);
          c.fillText(`핸드폰 : ${phoneNumber}`, 20, 80);
          c.font = "18px bold dotum";

          c.fillText("모든 상품 총 " + $("#sum").html(), 20, 110);

canvas태그를 먼저 생성해주고 상단에 먼저 생성해놓은 dataString(현재 날짜 데이터)와 timesting(현재 시간 데이터)를 14px dotum으로 표시해주었다.
이후 그 하단에 입력받아 저장해놓은 name, phoneNumber를 이용해서 이름, 핸드폰번호 순서로 14px dotum으로 표시해주었다.
그 하단에는 이전에 계산해놓은 모든 상품 총 합계 데이터 sum을 이용하여 총 상품 합계를 18px bold체 dotum 체로 표시해주었다.

이후 cart에 있는 아이템을 하나씩 가져와서 최종적으로 그 하단에 표시해주는 방법에서 많은 시행착오가 있었는데,
여러 방법을 고안하다가 반복문의 i를 이용해서 일정한 간격으로 표시해주는 방법을 사용하기로 하였다.

		cart.forEach((a, i) => {
            c.fillText(`${a.title}`, 20, 120 * (i + 1) + 20);
            c.fillText(`${a.brand}`, 20, 120 * (i + 1) + 40);
            c.fillText(`가격 : ${a.price}`, 20, 120 * (i + 1) + 60);
            c.fillText(`수량 : ${a.count}`, 20, 120 * (i + 1) + 80);
            c.fillText(
              `상품 합계 : ${a.price * cart[0].count}`,
              20,
              120 * (i + 1) + 100
            );
          });

장바구니에 담긴 상품에 대한 수량, 가격을 표시해줄때(i+1)에 120을 곱해주어 각각의 상품들이 120px만큼 일정한 간격을 두어 표시될 수 있도록 하였다.

상품마다 상품명, 브랜드명, 가격, 수량, 해당 상품 총 가격을 표시한 각 줄이 20px씩 차지하고, 각각의 상품을 표시하기 위한 공간은 120px로 할당하였기 때문에 일정한 간격을 두고 상품들이 표시 된 것을 확인 할 수 있었다.

profile
빨리 가는 유일한 방법은 제대로 가는 것이다. (로버트 C.마틴, <클린 코드>의 저자)

0개의 댓글