카테고리 없음
[고농축 백엔드 코스Quiz5]프론트엔드와 API 연동하기 - /users
개발자국S2
2023. 7. 30. 21:16
Index.html
더보기
<!DOCTYPE html>
<html lang="ko">
<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" />
<link rel="stylesheet" href="./index.css" />
<script src="./index.js"></script>
<script src="./user.js"></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<title>유저 리스트</title>
</head>
<body>
<div class="Container">
<div id="Wrapper">
<div
id="Navi_Wrapper"
style="width: 100%; display: flex; justify-content: space-between"
>
<a href="../login/index.html" class="Back_Button"> 🔙로그인 </a>
<a href="../menu/index.html" class="Back_Button"> 메뉴보기 </a>
</div>
<div id="Title_Wrapper">유저 리스트</div>
<div onclick="openMenu()" id="Open_Menu_Btn">유저 리스트 열기</div>
<div class="CloseBtnWrapper">
<span id="CloseBtn" onclick="closeMenu()">X</span>
</div>
<div id="Menu_Background">
<div class="User_Table_Item">
<div class="Item_Info" id="email">이메일</div>
<div class="Item_Info" id="personal">주민번호</div>
<div class="Item_Info" id="phone">전화번호</div>
<div class="Item_Info" id="prefer">좋아하는 사이트</div>
</div>
<div id="User_Data_Wrapper" />
</div>
</div>
</div>
</body>
</html>
Index.js (data를 보내는)
더보기
import express from "express";
import swaggerUi from "swagger-ui-express";
import swaggerJSDoc from "swagger-jsdoc";
import { options } from "./swagger/config.js";
import cors from "cors";
const app = express();
// swagger 생성
app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerJSDoc(options)));
app.use(express.json());
app.use(cors());
app.get("/users", (req, res) => {
const result = [
{
email: "aaa@gmail.com",
name: "철수",
phone: "010-1234-5678",
personal: "220110-2221232",
prefer: "https://naver.com",
},
{
email: "bbb@gmail.com",
name: "영수",
phone: "010-1234-5678",
personal: "220110-2000000",
prefer: "https://naver.com",
},
{
email: "ccc@gmail.com",
name: "진수",
phone: "010-1234-5678",
personal: "220110-2222222",
prefer: "https://naver.com",
},
{
email: "ddd@gmail.com",
name: "혜수",
phone: "010-1234-5678",
personal: "220110-2222222",
prefer: "https://naver.com",
},
{
email: "eee@gmail.com",
name: "민수",
phone: "010-1234-5678",
personal: "220110-2222222",
prefer: "https://naver.com",
},
];
res.send(result);
});
app.listen(3000, () => {
console.log("POSTMAN으로 요청을 보냈습니다.");
});
index.js (data를 받는)
더보기
const openMenu = () => {
let wrapper = document.getElementById('Wrapper')
let menu = document.getElementById('Menu_Background')
let button = document.getElementById('Open_Menu_Btn')
let closeButton = document.getElementById('CloseBtn')
let naviWrapper = document.getElementById('Navi_Wrapper')
let titleWrapper = document.getElementById('Title_Wrapper')
// wrapper.style.height = "1700px";
wrapper.style.backgroundImage = 'url()'
wrapper.style.backgroundColor = 'rgba(0,0,0,0.9)'
button.style.display = 'none'
menu.style.display = 'flex'
closeButton.style.display = 'flex'
naviWrapper.style.display = 'none'
titleWrapper.style.display = 'none'
// 회원 목록 조회 API 요청
getUser()
}
const closeMenu = () => {
let wrapper = document.getElementById('Wrapper')
let menu = document.getElementById('Menu_Background')
let button = document.getElementById('Open_Menu_Btn')
let closeButton = document.getElementById('CloseBtn')
let naviWrapper = document.getElementById('Navi_Wrapper')
let titleWrapper = document.getElementById('Title_Wrapper')
let userDataWrapper = document.querySelector('#User_Data_Wrapper')
wrapper.style.height = ''
wrapper.style.backgroundImage = 'url(../img/user-back-ground.jpg)'
wrapper.style.backgroundColor = 'rgba(0,0,0,0.2)'
wrapper.style.backgroundPosition = 'center'
button.style.display = 'flex'
menu.style.display = 'none'
closeButton.style.display = 'none'
naviWrapper.style.display = 'flex'
titleWrapper.style.display = 'block'
while (userDataWrapper.firstChild) {
userDataWrapper.removeChild(userDataWrapper.firstChild)
}
}
users.js
더보기
// 회원 목록 조회 API를 요청해주세요.
const getUser = async () => {
// 받은 데이터로 createUserDiv함수를 이용해
uData = await getUserData();
userInfo = uData.data;
// 목록 화면을 완성해주세요.
const result = userInfo.map((uInfo) => {
createUserDiv({
email: uInfo.email,
name: uInfo.name,
phone: uInfo.phone,
personal: uInfo.personal,
prefer: uInfo.prefer,
});
});
};
const createUserDiv = (data) => {
const userTableItem = document.createElement("div");
userTableItem.className = "User_Table_Item";
const emailItem = document.createElement("div");
emailItem.className = "Item_Info";
emailItem.textContent = data?.email || "abc@gmail.com";
const personalItem = document.createElement("div");
personalItem.className = "Item_Info";
personalItem.textContent = data?.personal || "220111-1******";
const phoneItem = document.createElement("div");
phoneItem.className = "Item_Info";
phoneItem.textContent = data?.phone || "010-1234-5678";
const preferItem = document.createElement("div");
preferItem.className = "Item_Info";
preferItem.textContent = data?.prefer || "naver.com";
const menuBack = document.querySelector("#User_Data_Wrapper");
menuBack.appendChild(userTableItem);
userTableItem.appendChild(emailItem);
userTableItem.appendChild(personalItem);
userTableItem.appendChild(phoneItem);
userTableItem.appendChild(preferItem);
};
const getUserData = () => {
return axios.get("http://localhost:3000/users");
};
index.css
더보기
* {
box-sizing: border-box;
}
.Container {
display: flex;
justify-content: center;
padding: 0 100px;
}
#Wrapper {
width: 640px;
min-height: 100vh;
padding: 0 5px;
display: flex;
flex-direction: column;
align-items: center;
background-position: center;
background-size: cover;
background-repeat: no-repeat;
background-image: url('../img/user-back-ground.jpg');
background-color: rgba(0, 0, 0, 0.2);
background-blend-mode: multiply;
}
#Title_Wrapper {
padding: 150px 0 50px 0;
font-size: 50px;
font-weight: bold;
color: #fff;
}
.Back_Button {
padding-top: 30px;
font-size: 30px;
font-weight: bold;
text-decoration: none;
color: #ebebeb;
cursor: pointer;
}
.Back_Button:hover {
color: #fff;
}
#Open_Menu_Btn {
background-color: #036635;
color: #fff;
font-size: 20px;
font-weight: bold;
border-radius: 10px;
padding: 20px;
/* margin: 500px 0 500px 0; */
cursor: pointer;
}
#Open_Menu_Btn:hover {
background-color: #fff;
color: #036635;
}
.CloseBtnWrapper {
width: 100%;
padding-top: 100px;
display: flex;
justify-content: flex-end;
}
#CloseBtn {
display: none;
color: #fff;
font-size: 60px;
font-weight: bold;
cursor: pointer;
}
#CloseBtn:hover {
color: #036635;
}
#Menu_Background {
width: 100%;
margin: 0 0 100px 0;
padding: 20px;
border-radius: 20px;
background-color: rgba(999, 999, 999, 0.2);
display: none;
flex-direction: column;
justify-content: space-evenly;
flex-wrap: wrap;
}
.User_Table_Item {
display: flex;
justify-content: space-between;
width: 100%;
font-size: 15px;
border-bottom: 1px solid #eaeaea;
color: #fff;
margin-bottom: 15px;
}
.Item_Info {
padding: 5px;
width: 25%;
text-align: center;
}
반응형