종합 사항 (FE)
- 카테고리별 필터 기능 완료
- 검색 시 레이아웃 완료
- 상세페이지 레이아웃 완료
나의 작업 사항
대입해서 작업한 Fiter elements의 클래스 이름이나 var 사용등을 개선 하기
완료 내용 :
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>
<!-- bootstrap icon -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<title>Game Over</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<link href="https://fonts.googleapis.com/css2?family=Quicksand:wght@300&family=VT323&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Nanum+Gothic&display=swap" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="gameoversty.css">
<style>
</style>
<script>
$(document).ready(function () {
load();
TagSelect("all");
});
function load() {
$('#card-group').empty()
$.ajax({
type: "GET",
url: "https://www.freetogame.com/api/games?platform=pc",
data: {},
success: function (response) {
let games = response
for (let i = 0; i < games.length; i++) {
let game_img = games[i]['thumbnail']
let game_title = games[i]['title']
let game_text = games[i]['short_description']
let game_tag = games[i]['genre']
if (game_tag == 'MMO') {
let temp_html = `<div id="card" class="card-size GameDiv ${game_tag}_">
<div class="card card-height">
<img src="${game_img}" class="card-img-top card-img" alt="...">
<div class="card-body">
<h5 class="card-title title-over">${game_title}</h5>
<p class="card-text text-over">${game_text}</p>
</div>
<div class="card-footer">
<small class="text-muted"><span
class="badge badge-pill badge-secondary badge-size">${game_tag}</span></small>
</div>
</div>
</div>
`
$('#card-group').append(temp_html);
} else {
let temp_html = `<div id="card" class="card-size GameDiv ${game_tag}">
<div class="card card-height">
<img src="${game_img}" class="card-img-top card-img" alt="...">
<div class="card-body">
<h5 class="card-title title-over">${game_title}</h5>
<p class="card-text text-over">${game_text}</p>
</div>
<div class="card-footer">
<small class="text-muted"><span
class="badge badge-pill badge-secondary badge-size">${game_tag}</span></small>
</div>
</div>
</div>
`
$('#card-group').append(temp_html);
}
}
}
})
}
// 검색 enterkey 작동 함수
function enterkey() {
if (window.event.keyCode == 13) {
search_complete();
}
}
function search_complete() {
$('#result').empty();
go_to_search(search_result)
let search_result = $('#search').val();
// alert(search_result);
let temp_html = `<div>"<span class="searchWord">${search_result}</span>" 에 대한 검색 결과</div>`
// console.log(temp_html)
if (search_result == '') {
alert('검색어를 입력해 주세요');
$('#search').focus();
return false
} else {
$('#result').append(temp_html);
}
$('#search').val(null);
}
//filter elements
function TagSelect(c) {
$('#result').empty();
let x, i;
x = document.getElementsByClassName("GameDiv");
if (c == "all") c = "";
// Add the "show" class (display:block) to the filtered elements, and remove the "show" class from the elements that are not selected
for (i = 0; i < x.length; i++) {
RemoveClassShow(x[i], "show");
if (x[i].className.indexOf(c) > -1) AddClassShow(x[i], "show");
}
}
// Show filtered elements
function AddClassShow(element, name) {
let i, arr1, arr2;
arr1 = element.className.split(" ");
arr2 = name.split(" ");
for (i = 0; i < arr2.length; i++) {
if (arr1.indexOf(arr2[i]) == -1) {
element.className += " " + arr2[i];
}
}
}
// Hide elements that are not selected
function RemoveClassShow(element, name) {
let i, arr1, arr2;
arr1 = element.className.split(" ");
arr2 = name.split(" ");
for (i = 0; i < arr2.length; i++) {
while (arr1.indexOf(arr2[i]) > -1) {
arr1.splice(arr1.indexOf(arr2[i]), 1);
}
}
element.className = arr1.join(" ");
}
</script>
</head>
<body>
<div class="wrap">
<div class="header">
<div class="img"></div>
<div class="search">
<input placeholder='search' class=search-bar id='search' type='text' onkeyup="enterkey();"/>
<button class='search-icon' onclick="search_complete()">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="yellow" class="bi bi-search"
viewBox="0 0 16 16" href="https://www.google.com/ ">
<path d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z"/>
</svg>
</button>
</div>
</div>
<!-- hashtag-->
<div id="TagGroup" class="hashtag">
<button class="btnAll tag active" onclick="TagSelect('all')" aria-pressed="true">ALL</button>
<button class="btnMmorpg tag" onclick="TagSelect('MMORPG')">MMORPG</button>
<button class="btnShooter tag" onclick="TagSelect('Shooter')">Shooter</button>
<button class="btnBattleroyale tag" onclick="TagSelect('Battle Royale')">Battle Royale</button>
<button class="btnMoba tag" onclick="TagSelect('MOBA')">MOBA</button>
<button class="btnSports tag" onclick="TagSelect('Sports')">Sports</button>
<button class="btnRacing tag" onclick="TagSelect('Racing')">Racing</button>
<button class="btnStrategy tag" onclick="TagSelect('Strategy')">Strategy</button>
<button class="btnFighting tag" onclick="TagSelect('Fighting')">Fighting</button>
<button class="btnCardGame tag" onclick="TagSelect('Card Game')">Card Game</button>
<button class="btnMmo tag" onclick="TagSelect('MMO_')">MMO</button>
</div>
<!-- 검색 후 보이게 되는 창-->
<div id='result'>
</div>
<!-- 카드 -->
<div id="card-group" class="card-group">
<div id="card" class="card-size GameDiv MMORPG">
<div class="card card-height">
<img src="https://www.freetogame.com/g/1/thumbnail.jpg" class="card-img-top card-img" alt="...">
<div class="card-body">
<h5 class="card-title title-over">Dauntless</h5>
<p class="card-text text-over">A free-to-play, co-op action RPG with gameplay similar to Monster
Hunter.</p>
</div>
<div class="card-footer">
<small class="text-muted"><span
class="badge badge-pill badge-secondary badge-size badge-genre1">MMORPG</span></small>
</div>
</div>
</div>
<div id="card" class="card-size GameDiv Shooter">
<div class="card card-height">
<img src="https://www.freetogame.com/g/2/thumbnail.jpg" class="card-img-top card-img" alt="...">
<div class="card-body">
<h5 class="card-title title-over">World of Tanks</h5>
<p class="card-text text-over">If you like blowing up tanks, with a quick and intense game style you
will love this game!</p>
</div>
<div class="card-footer">
<small class="text-muted"><span
class="badge badge-pill badge-secondary badge-size">Shooter</span></small>
</div>
</div>
</div>
<div id="card" class="card-size GameDiv Shooter">
<div class="card card-height">
<img src="https://www.freetogame.com/g/3/thumbnail.jpg" class="card-img-top card-img" alt="...">
<div class="card-body">
<h5 class="card-title title-over">Warframe</h5>
<p class="card-text text-over">A cooperative free-to-play third person online action shooter set in
an stunning sci-fi world.</p>
</div>
<div class="card-footer">
<small class="text-muted"><span
class="badge badge-pill badge-secondary badge-size">Shooter</span></small>
</div>
</div>
</div>
</div>
<nav aria-label="Page navigation example">
<ul class="pagination">
<li class="page-item"><a class="page-link" href="#">Previous</a></li>
<li class="page-item"><a class="page-link" href="#">1</a></li>
<li class="page-item"><a class="page-link" href="#">2</a></li>
<li class="page-item"><a class="page-link" href="#">3</a></li>
<li class="page-item"><a class="page-link" href="#">Next</a></li>
</ul>
</nav>
<footer>
<p>참여한 사람들: 남혜민, 이민호, 이하나, 장정인, 조소영, 조원행 </p>
</footer>
</div>
</body>
</html>
CSS (Filter Elements 부분만)
/*fiter elements*/
.GameDiv {
display: none; /* Hidden by default */
}
.show {
display: block;
}
App.py - POST
@app.route('/order', methods=['POST'])
def save_order():
first_receive = request.form['first_give']
last_receive = request.form['last_give']
email_receive = request.form['email_give']
domain_receive = request.form['domain_give']
birth_receive = request.form['birth_give']
day_receive = request.form['day_give']
doc = {
'first': first_receive,
'last': last_receive,
'email': email_receive,
'domain': domain_receive,
'birth': birth_receive,
'day': day_receive
}
db.mypage.insert_one(doc)
return jsonify({'msg': '저장이 완료되었습니다!'})
index.html - POST
function order() {
let first = $('#firstname').val();
let last = $('#lastname').val();
let email = $('#inlineFormInputName').val();
let domain = $('#inlineFormInputGroupUsername').val();
let birth = $('#inputCity').val();
let day = $('#day').val();
$.ajax({
type: "POST",
url: "/order",
data: {
first_give: first,
last_give: last,
email_give: email,
domain_give: domain,
birth_give: birth,
day_give: day
},
success: function (response) { // 성공하면
alert(response["msg"]);
window.location.reload();
}
})
}
App.py - GET
@app.route('/order', methods=['GET'])
def view_orders():
customers = list(db.mypage.find({}, {'_id': False}))
return jsonify({'all_customers':customers})
index.html - GET
function order_listing() {
// 주문목록 보기 API 연결
$('#list').empty()
$.ajax({
type: "GET",
url: "/order",
data: {},
success: function (response) {
let cutomers = response['all_customers']
for (let i = 0; i < cutomers.length; i++) {
let firstname = cutomers[i]['first']
let lastname = cutomers[i]['last']
let email = cutomers[i]['email']
let domain = cutomers[i]['domain']
let birth = cutomers[i]['birth']
let day = cutomers[i]['day']
let temp_html =`<tr>
<td>${firstname} ${lastname}</td>
<td>${email}@${domain}</td>
<td>${birth}</td>
<td>${day}</td>
</tr>`
$('#list').append(temp_html)
}
}
})
}
결과:
POST
GET
: 오늘 드디어 벼르고 벼르던 4주차를 끝냈다! 세상 힘들었다... 중간중간에 오류내고 한참 찾고 또 고치고... 그래도 이렇게 끝내고 나니 뭔가 속이 후련한 느낌이다. 회의도 이제 절반을 넘어서 6회차에 이르렀다. 뭔가 하나하나 조각을 찾아 맞추어가는 느낌이라서 신기했다. 혼자서는 못할 것들을 한사람한사람 힘을 합쳐 해내가는게, 진짜 내가 이 메이킹 챌린지를 신청하지 않았으면 경험하지 못했을 것 들 이기에 다행이라고 느꼈다. Filter elements를 써보기는 했지만 아직 어떤 요소들이 어떻 게 작동해나가는지는 잘 감이 안잡힌다. 그래서 그런지 로딩후 전체 목록 뜨게 만드는게 너무 어렵게만 느껴진다. 어떻게 해결책을 찾아야할까....