본문 바로가기
TIL/웹 초보

23.04.18

by J1-H00N 2023. 4. 18.

해당 url을 새 창에 띄우는 함수

const move = (url) => {
            window.open(url,'_blank')
        }

 

$('#card-wrap').prepend(temp_html)

와 같이 prepend를 사용하면 추가할 temp_html을 앞에 추가할 수 있다.

 

꾸미기 전 코드

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>오늘의 전시</title>
    <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.12.4.min.js"></script>
    <style>
        html,
        body,
        h1,
        h2,
        h3,
        p,
        a,
        span {
            margin: 0;
            padding: 0;
        }

        .wrap {
            width: 1050px;
            margin: auto;
        }

        .card {
            width: 320px;
            height: 340px;

            display: flex;
            flex-direction: column;
            align-items: flex-start;
            justify-content: flex-start;

            margin: 16px 10px;
            border: 1px solid black;

            cursor: pointer;
        }

        .card-wrap {
            display: flex;
            flex-direction: row;
            flex-wrap: wrap;
        }

        .card-image {
            background-position: center;
            background-size: cover;

            width: 100%;
            height: 200px;

        }

        .card>span {
            margin: 8px;
        }

        .card-title {
            font-size: 18px;
            font-weight: bold;
        }

        .period {
            color: yellowgreen;
            font-size: 14px;
        }

        .tags {
            color: gray;
            font-size: 14px;
            word-break: keep-all;
        }

        .url-form {
            align-items: center;
            justify-content: space-around;
        }

        .plus-form {
            align-items: center;
            justify-content: center;
            cursor: pointer;
        }
    </style>
    <script>
        $(document).ready(() => {
            listing();
            showPlusForm();
            now();
        })

        const showUrlForm = () => {
            $('#plus-form').hide();
            $('#url-form').show();
        }

        const showPlusForm = () => {
            $('#url-form').hide();
            $('#plus-form').show();
        }

        const posting = () => {
            let url = $('#url').val()

            let formData = new FormData()
            formData.append("url_give", url)

            fetch('/exhibit', {method: "POST", body: formData}).then(res => res.json()).then(data => {
                alert(data['msg'])
                window.location.reload();
            })
        }

        const move = (url) => {
            window.open(url,'_blank')
        }

        const listing = () => {
            fetch('/exhibit').then(res => res.json()).then(data => {
                let rows = data['result']
                rows.forEach((row) => {
                    let title = row['title']
                    let period = row['period']
                    let image = row['image']
                    let tags = row['tags']
                    let url = row['url']

                    let temp_html = `<div onclick="move('${url}')" class="card">
                                        <div style="background-image: url('${image}');" class="card-image"></div>
                                        <span class="card-title">${title}</span>
                                        <span class="period">${period}</span>
                                        <span class="tags">${tags}</span>
                                    </div>`
                    $('#card-wrap').prepend(temp_html)
                })
            })
        }

        const now = () => {
            fetch('/now').then(res => res.json()).then(data => {
                let rows = data['now']
                rows.forEach((row) => {
                    let title = row['title']
                    let period = row['period']
                    let image = row['image']
                    let url = row['url']

                    let temp_html = `<div onclick="move('${url}')" class="card">
                                        <div style="background-image: url('${image}');" class="card-image"></div>
                                        <span class="card-title">${title}</span>
                                        <span class="period">${period}</span>
                                        <span class="tags"></span>
                                    </div>`
                    $('#card-now').append(temp_html)
                })
            })
        }
    </script>
</head>

<body>
    <div class="wrap">
        <h1>오늘의 전시</h1>
        <h2>내가 추가한 전시</h2>
        <div id="card-wrap" class="card-wrap">
            <div id="url-form" class="url-form card">
                <input id="url" placeholder="전시 URL을 입력해주세요!">
                <div>
                    <button onclick="showPlusForm()">취소하기</button>
                    <button onclick="posting()">등록하기</button>
                </div>
            </div>
            <div id="plus-form" onclick="showUrlForm()" class="plus-form card">
                <span>+</span>
                <span>추가하기</span>
            </div>
        </div>
        <h2>현재 진행중인 전시</h2>
        <div id="card-now" class="card-wrap">

        </div>
    </div>

</body>

</html>
from flask import Flask, render_template, request, jsonify
app = Flask(__name__)

import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient
client = MongoClient("mongodb+srv://sparta:test@cluster0.xa8mbuw.mongodb.net/?retryWrites=true&w=majority")
db = client.pirates_lv1

@app.route('/')
def home():
	return render_template("index.html")

@app.route('/exhibit', methods=["POST"])
def post_exhibit():
	url_receive = request.form["url_give"]

	headers = {
		'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
	data = requests.get(url_receive, headers=headers)
	soup = BeautifulSoup(data.text, 'html.parser')

	title = soup.select_one('#container > div.wide-inner > section > h3').text
	period = soup.select_one('#container > div.detial-cont-element.active > div > dl:nth-child(1) > dd').text.strip()
	tags = soup.select_one('#container > section.tag-element.poi > p').text.replace('\n',' ')
	image = soup.select('.item')[1]['style'].replace("background-image:url('",'').replace("');",'')
	image = 'https://korean.visitseoul.net'+image

	doc = {
		'url' : url_receive,
		'title' : title,
		'period' : period,
		'tags' : tags,
		'image' : image
	}

	db.exhibition.insert_one(doc)

	return jsonify({"msg": "저장 완료!"})

@app.route('/exhibit', methods=["GET"])
def get_exhibit():
	exhibitions = list(db.exhibition.find({},{'_id':False}))
	return jsonify({"result": exhibitions})

@app.route('/now', methods=["GET"])
def get_now():
	url = 'https://korean.visitseoul.net/exhibition'

	headers = {
		'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
	data = requests.get(url, headers=headers)
	soup = BeautifulSoup(data.text, 'html.parser')

	items = soup.select('.item > a')
	base = 'https://korean.visitseoul.net'

	docs = []
	for item in items:
		url = base+item['href']
		image = base+item.select_one('.thumb')['style'].split('(')[1].replace(')','')
		title = item.select_one('.title').text
		period = item.select_one('.small-text.text-dot-d').text.strip()
		doc = {
			'url':url,
			'image':image,
			'title':title,
			'period':period
		}
		docs.append(doc)

	return jsonify({"now": docs})

if __name__ == "__main__":
	app.run(debug=True, port=8080)

 

꾸미기(CSS)

 

어떤 개체를 독립적으로 만들기 위해서는 position : absolute;가 필요한데, 그러기 위해서는 부모 div에 position : relative;를 부여해야한다.

 

position : absolute;  => 위, 아래, 양 옆을 기준으로 움직일 수 있다.

.bg {
            width: 100%;
            height: 420px;
            background-color: #d7d8da;
            position: relative;

            display: flex;
            flex-direction: row;
            align-items: center;
            justify-content: center;
        }
h1 {
            color: white;
            position: absolute;
            top: 50px;
            left: 25%;
        }

 

모바일 반응형 웹 만들기

 

@media screen and (max-width: 700px) {
            .card {
                margin: 16px auto;
                width: 300px;
                height: 300px;
            }
            .card>span {
                margin: 4px;
            }
            .card-title, .period, .tags {
                font-size: 12px;
            }
        }
        @media screen and (max-width: 400px) {
            .card {
                width: 220px;
            }
        }

화면이 max-width보다 작아질 때 { }속 css 우선적용 

'TIL > 웹 초보' 카테고리의 다른 글

23.05.12  (0) 2023.05.12
webflow + chatGPT  (0) 2023.04.19
23.04.17  (0) 2023.04.17
23.04.17  (0) 2023.04.17
23.04.14  (0) 2023.04.14