스파르타코딩/스파르타코딩 4주차

4주차 마무리 - 마카롱 쇼핑몰 다듬기(1주차++)

usop 2022. 6. 15. 10:26

1주차 마카롱 쇼핑몰을 다듬어서 GET, POST로 주문 받는 기능을 추가해보자

 

<다듬은 html code>

<!doctype html>
<html lang="en">

<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
        integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">

    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
        integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"
        crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
        integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
        crossorigin="anonymous"></script>

    <title>스파르타코딩클럽 | 부트스트랩 연습하기</title>
    <link href="https://fonts.googleapis.com/css2?family=Black+Han+Sans&family=Jua&display=swap" rel="stylesheet">

    <style>
        *{
            font-family: 'Black Han Sans', sans-serif;
        }
        .wrap{
            width:700px;
            margin:auto;
        }
        .pt-3{
            padding-top:30px;
        }
        .pt-5{
            padding-top:50px;
        }
        .pb-3{
            padding-bottom:30px;
        }
        .mt-3{
            margin-top:30px;
        }
        .mt-5{
            margin-top:50px;
        }
        .product-text{
            margin-left:180px;
            margin-right:20px;
        }

        .inline{
            display:inline-block;
        }
        .product-image{
            width:700px;
            height:350px;
            text-align:center;

            background-image:url("https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ1JK89xFuF_3gNJXUvhctY4-6nwgyTZjnekQ&usqp=CAU");
            background-position: center;
            background-size:cover;
        }
        .btn-order{
            width:150px;
            margin:auto;
            display:block;
        }
        .exchange-rate{
            font-size:22px;
            font-weight: bold;
            color: coral;
        }
    </style>
    <script>
        $(document).ready(function () {
            q1();
        });
        function q1() {
            $.ajax({
                type: "GET",
                url: "http://spartacodingclub.shop/sparta_api/rate",
                data: {},
                success: function (response) {
                    let er = response['rate'];
                    $('#exchange').append(' ' + er);
                }
            })
        }

    </script>
</head>

<body>
<div class="wrap">
    <div class="product-image mt-5"></div>
    <h1 class="product-text pt-5 pb-3 inline">마카롱을 팝니다</h1><span> 가격:15,000원 / 1세트</span>
    <p class="pb-3">이 마카롱은 사실 특별한 힘을 가지고 있어요. 마카롱을 1개만 먹어야지 하고 먹으면 어느덧 10개를 먹고 있는 자신의 모습을 볼 수 있어요. 저희는 당일 구운 마카롱만을 보내드립니다. 지금 주문주세요!</p>
    <div>
        <p class="exchange-rate" id="exchange">달러(원) 환율 :</p>
    </div>
    <form>
        <div class="form-group pb-3">
            <label for="order">주문자</label>
            <input type="text" class="form-control" id="order" aria-describedby="emailHelp"
                   placeholder="성함">
        </div>
        <div class="dropdown pb-3">
            <label for="order-product">메뉴 선택</label>
            <select id="order-product" class="custom-select">
                <option selected>-- 고르기 --</option>
                <option value="A">A세트( 딸기요거트 / 로투스 / 말차초코칩 / 바닐라 )</option>
                <option value="B">B세트( 복숭아요거트 / 블루베리 / 솔트카라멜 / 얼그레이 )</option>
                <option value="C">C세트( 오레오 / 인절미 / 페레로 / 티라미수 )</option>
            </select>
            <label for="order-count" class="mt-3">수량</label>
            <select id="order-count" class="custom-select ">
                <option selected>-- 수량을 선택하세요(최대 5) --</option>
                <option value="1">1</option>
                <option value="2">2</option>
                <option value="3">3</option>
                <option value="3">4</option>
                <option value="3">5</option>
            </select>
        </div>
        <div class="form-group pb-3">
            <label for="order-address">주소</label>
            <input type="text" class="form-control" id="order-address" aria-describedby="emailHelp"
                   placeholder="주소">
        </div>
        <div class="form-group pb-3">
            <label for="order-tel">연락처</label>
            <input type="tel" class="form-control" id="order-tel" placeholder=" '-'빼고 입력해주세요 (ex:01012345678)">
        </div>
        <button type="submit" class="btn btn-primary btn-order">주문하기</button>
    </form>
    <table class="table mt-5">
        <thead>
        <tr>
            <th>이름</th>
            <th>메뉴</th>
            <th>수량</th>
            <th>주소</th>
            <th>연락처</th>
        </tr>
        </thead>
    </table>
</div>

</body>
</html>

 

 

-- 완성 --

<app.py>

from flask import Flask, render_template, jsonify, request

app = Flask(__name__)

from pymongo import MongoClient

client = MongoClient('localhost', 27017)
db = client.dbhomework


## HTML 화면 보여주기
@app.route('/')
def homework():
    return render_template('index.html')


# 주문하기(POST) API
@app.route('/order', methods=['POST'])
def save_order():
    orderer_receive = request.form['orderer_give']
    orderMenu_receive = request.form['orderMenu_give']
    orderCount_receive = request.form['orderCount_give']
    orderAddress_receive = request.form['orderAddress_give']
    orderTel_receive = request.form['orderTel_give']

    doc = {
        'orderer':orderer_receive,
        'orderMenu':orderMenu_receive,
        'orderCount':orderCount_receive,
        'orderAddress':orderAddress_receive,
        'orderTel':orderTel_receive
    }
    db.orderStatus.insert_one(doc)

    return jsonify({'msg': '주문이 접수되었습니다'})


# 주문 목록보기(Read) API
@app.route('/order', methods=['GET'])
def view_orders():
    orders = list(db.orderStatus.find({}, {'_id':False}))

    return jsonify({'all_orders':orders})



if __name__ == '__main__':
    app.run('0.0.0.0', port=5000, debug=True)

 

<html>

<!doctype html>
<html lang="en">

<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
        integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">

    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
        integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"
        crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
        integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
        crossorigin="anonymous"></script>

    <title>스파르타코딩클럽 | 부트스트랩 연습하기</title>
    <link href="https://fonts.googleapis.com/css2?family=Black+Han+Sans&family=Jua&display=swap" rel="stylesheet">

    <style>
        *{
            font-family: 'Black Han Sans', sans-serif;
        }
        .wrap{
            width:700px;
            margin:auto;
        }
        .pt-3{
            padding-top:30px;
        }
        .pt-5{
            padding-top:50px;
        }
        .pb-3{
            padding-bottom:30px;
        }
        .mt-3{
            margin-top:30px;
        }
        .mt-5{
            margin-top:50px;
        }
        .product-text{
            margin-left:180px;
            margin-right:20px;
        }

        .inline{
            display:inline-block;
        }
        .product-image{
            width:700px;
            height:350px;
            text-align:center;

            background-image:url("https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ1JK89xFuF_3gNJXUvhctY4-6nwgyTZjnekQ&usqp=CAU");
            background-position: center;
            background-size:cover;
        }
        .btn-order{
            width:150px;
            margin:auto;
            display:block;
        }
        .exchange-rate{
            font-size:22px;
            font-weight: bold;
            color: coral;
        }
    </style>
    <script>
        $(document).ready(function (){
           showOrderStatus();
        });
        $(document).ready(function () {
            q1();
        });
        function q1() {
            $.ajax({
                type: "GET",
                url: "http://spartacodingclub.shop/sparta_api/rate",
                data: {},
                success: function (response) {
                    let er = response['rate'];
                    $('#exchange').append(' ' + er);
                }
            })
        }

        function showOrderStatus(){
            $.ajax({
                type:"GET",
                url: "/order",
                data: {},
                success: function (response){
                    let orders = response('all_orders')
                    for (let i =0; i<orders.length; i++) {
                        let orderer = orders[i]['orderer']
                        let orderMenu = orders[i]['orderMenu']
                        let orderCount = orders[i]['orderCount']
                        let orderAddress = orders[i]['orderAddress']
                        let orderTel = orders[i]['orderTel']

                        let temp_html = `<tr>
                                          <td>${orderer}</td>
                                          <td>${orderMenu}</td>
                                          <td>${orderCount}</td>
                                          <td>${orderAddress}</td>
                                          <td>${orderTel}</td>
                                     </tr>`

                        $('#orders-box').append(temp_html)
                    }
                }
            })

        }

        function postOrder(){
            let orderer = $('#order-name').val();
            let orderMenu = $('#order-product').val();
            let orderCount = $('#order-count').val();
            let orderAddress = $('#order-address').val();
            let orderTel = $('#order-tel').val();

            $.ajax({
                type:"POST",
                url:"/order",
                data: {orderer_give:orderer, orderMenu_give:orderMenu, orderCount_give:orderCount, orderAddress_give:orderAddress, orderTel_give:orderTel
                },
                success: function (response){
                    alert(response)["msg"];
                    window.location.reload()
                }
            })
        }

    </script>
</head>

<body>
<div class="wrap">
    <div class="product-image mt-5"></div>
    <h1 class="product-text pt-5 pb-3 inline">마카롱을 팝니다</h1><span> 가격:15,000원 / 1세트</span>
    <p class="pb-3">이 마카롱은 사실 특별한 힘을 가지고 있어요. 1개만 먹어야지 하고 집으면 어느새 10개를 해치워버린 자신의 모습을 볼 수 있어요. 저희는 당일 구운 마카롱만을 보내드립니다. 지금 주문주세요!</p>
    <div>
        <p class="exchange-rate" id="exchange">달러(원) 환율 :</p>
    </div>
    <form>
        <div class="form-group pb-3">
            <label for="order-name">주문자</label>
            <input type="text" class="form-control" id="order-name" aria-describedby="emailHelp"
                   placeholder="성함">
        </div>
        <div class="dropdown pb-3">
            <label for="order-product">메뉴 선택</label>
            <select id="order-product" class="custom-select">
                <option selected>-- 고르기 --</option>
                <option value="A">A세트( 딸기요거트 / 로투스 / 말차초코칩 / 바닐라 )</option>
                <option value="B">B세트( 복숭아요거트 / 블루베리 / 솔트카라멜 / 얼그레이 )</option>
                <option value="C">C세트( 오레오 / 인절미 / 페레로 / 티라미수 )</option>
            </select>
            <label for="order-count" class="mt-3">수량</label>
            <select id="order-count" class="custom-select ">
                <option selected>-- 수량을 선택하세요(최대 5) --</option>
                <option value="1">1</option>
                <option value="2">2</option>
                <option value="3">3</option>
                <option value="3">4</option>
                <option value="3">5</option>
            </select>
        </div>
        <div class="form-group pb-3">
            <label for="order-address">주소</label>
            <input type="text" class="form-control" id="order-address" aria-describedby="emailHelp"
                   placeholder="주소">
        </div>
        <div class="form-group pb-3">
            <label for="order-tel">연락처</label>
            <input type="tel" class="form-control" id="order-tel" placeholder=" '-'빼고 입력해주세요 (ex:01012345678)">
        </div>
        <button type="submit" class="btn btn-primary btn-order" onclick="postOrder()">주문하기</button>
    </form>
    <table class="table mt-5" id="orders-box">
        <thead>
        <tr>
            <th>이름</th>
            <th>메뉴</th>
            <th>수량</th>
            <th>주소</th>
            <th>연락처</th>
        </tr>
        </thead>
    </table>
</div>

</body>
</html>