박규리

Move files for html/css/recommend-activity work

node_modules/
package-lock.json
.env
\ No newline at end of file
{
"name": "holiday-counter-recommend-activity",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node server.js"
},
"repository": {
"type": "git",
"url": "http://khuhub.khu.ac.kr/teamPARK/holiday-counter-recommand-activity.git"
},
"author": "",
"license": "ISC",
"dependencies": {
"dotenv": "^16.0.1",
"ejs": "^3.1.8",
"express": "^4.18.1",
"request": "^2.88.2",
"xml2js": "^0.4.23"
}
}
.circle {
margin: 0 auto;
width: 500px;
height: 500px;
border: 15px solid rgb(163, 151, 198);
border-radius: 50%;
line-height: 3em;
}
.dday {
padding: 50px 0;
}
.wrapper {
margin: 0 auto;
padding: 30px;
max-width: 1170px;
}
h1 {
font-size: 50px;
color : tomato;
font-family: 'Gowun Dodum', sans-serif;
margin-bottom: 10px;
}
h2 {
color :white;
font-weight: lighter;
font-family: 'Gowun Dodum', sans-serif;
}
#title {
color: rgb(191, 185, 211);
font-size: 70px;
font-family: 'Tiro Devanagari Marathi', serif;
font-weight: 600;
text-shadow: 4px 2px 2px rgba(178, 104, 180, 0.61);
letter-spacing: 0.05em;
}
#comment {
width: fit-content;
background-color: rgba(190, 125, 87, 0.39);
border-radius: 40px 80px / 80px 40px;
}
#detail {
width:1000px;
height:fit-content;
border-radius: 40px 80px / 80px 40px;
background-color: rgba(190, 87, 168, 0.39);
}
body {
margin-top: 100px;
margin-bottom: 100px;
margin-left: 50px;
margin-right: 50px;
background-color: rgb(78, 76, 76);
}
#background{
width : 80%;
height : 80%;
border: 15px solid rgb(229, 220, 231);
border-radius : 30px 30px / 30px 30px;
}
.box {
margin : 50px;
padding : 20px;
border : 1px solid rgb(248, 239, 249);
border-radius : 20px;
background-color: rgb(255, 255, 255);
}
/* button style*/
.frame {
width: 90%;
margin: 40px auto;
text-align: center;
}
button {
margin: 20px;
}
.custom-btn {
width: 130px;
height: 40px;
color: #fff;
border-radius: 5px;
padding: 10px 25px;
font-family: 'Lato', sans-serif;
font-weight: 500;
background: transparent;
cursor: pointer;
transition: all 0.3s ease;
position: relative;
display: inline-block;
box-shadow:inset 2px 2px 2px 0px rgba(255,255,255,.5),
7px 7px 20px 0px rgba(0,0,0,.1),
4px 4px 5px 0px rgba(0,0,0,.1);
outline: none;
}
.btn-12{
position: relative;
right: 20px;
bottom: 20px;
border:none;
box-shadow: none;
width: 130px;
height: 40px;
line-height: 42px;
-webkit-perspective: 230px;
perspective: 230px;
}
.btn-12 span {
background: rgb(0,172,238);
background: linear-gradient(0deg, rgba(0,172,238,1) 0%, rgba(2,126,251,1) 100%);
display: block;
position: absolute;
width: 130px;
height: 40px;
box-shadow:inset 2px 2px 2px 0px rgba(255,255,255,.5),
7px 7px 20px 0px rgba(0,0,0,.1),
4px 4px 5px 0px rgba(0,0,0,.1);
border-radius: 5px;
margin:0;
text-align: center;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: all .3s;
transition: all .3s;
}
.btn-12 span:nth-child(1) {
box-shadow:
-7px -7px 20px 0px #fff9,
-4px -4px 5px 0px #fff9,
7px 7px 20px 0px #0002,
4px 4px 5px 0px #0001;
-webkit-transform: rotateX(90deg);
-moz-transform: rotateX(90deg);
transform: rotateX(90deg);
-webkit-transform-origin: 50% 50% -20px;
-moz-transform-origin: 50% 50% -20px;
transform-origin: 50% 50% -20px;
}
.btn-12 span:nth-child(2) {
-webkit-transform: rotateX(0deg);
-moz-transform: rotateX(0deg);
transform: rotateX(0deg);
-webkit-transform-origin: 50% 50% -20px;
-moz-transform-origin: 50% 50% -20px;
transform-origin: 50% 50% -20px;
}
.btn-12:hover span:nth-child(1) {
box-shadow:inset 2px 2px 2px 0px rgba(255,255,255,.5),
7px 7px 20px 0px rgba(0,0,0,.1),
4px 4px 5px 0px rgba(0,0,0,.1);
-webkit-transform: rotateX(0deg);
-moz-transform: rotateX(0deg);
transform: rotateX(0deg);
}
.btn-12:hover span:nth-child(2) {
box-shadow:inset 2px 2px 2px 0px rgba(255,255,255,.5),
7px 7px 20px 0px rgba(0,0,0,.1),
4px 4px 5px 0px rgba(0,0,0,.1);
color: transparent;
-webkit-transform: rotateX(-90deg);
-moz-transform: rotateX(-90deg);
transform: rotateX(-90deg);
}
\ No newline at end of file
const express = require("express");
const app = express();
const request = require("request");
const xml2js = require("xml2js");
const static = require("serve-static");
require("dotenv").config();
// Modify the values as needed
var year = "2022";
var month = "09";
var operation = "getRestDeInfo";
// Do not modify the values
var SERVEICE_KEY = process.env.API_KEY;
var url = "http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/";
var queryParams = "?" + "solYear" + "=" + year;
queryParams += "&" + "solMonth" + "=" + month;
queryParams += "&" + "ServiceKey" + "=" + SERVEICE_KEY;
let requestUrl = url + operation + queryParams;
// Empty variables
var text = "";
var dateName = [];
var locdate = [];
var tempArr = [];
// To run EJS engine
app.set("views", __dirname + "/views");
app.set("view engine", "ejs");
app.use(static(__dirname));
// To get today date by using Date
function getTodayDate() {
var today = new Date();
var year = today.getFullYear();
var month = ("0" + (today.getMonth() + 1)).slice(-2);
var day = ("0" + today.getDate()).slice(-2);
var dateString = year + "-" + month + "-" + day;
//return "2022-06-02"; // 테스트용 날짜를 입력하세요. *** 테스트가 끝나면 주석처리하고 커밋해주세요. *** ex) 2022-09-12, 2022-09-15, 2022-10-04
return dateString;
}
// To get modified date from locdate
function getModifiedDate(locdate) {
return (
locdate.substr(0, 4) +
"-" +
locdate.substr(4, 2) +
"-" +
locdate.substr(6, 2)
);
}
// To get remaining days from locdate
function getLeftDate(locdate) {
var today = new Date(getTodayDate()); // today date
var holiday = new Date(getModifiedDate(locdate)); // holiday date
var diffDate = today.getTime() - holiday.getTime();
var dday = Math.abs(diffDate / (1000 * 3600 * 24));
return dday;
}
// To change parameter
function changeParams(year, month, operation) {
queryParams = "?" + "solYear" + "=" + year;
queryParams += "&" + "solMonth" + "=" + month;
queryParams += "&" + "ServiceKey" + "=" + SERVEICE_KEY;
requestUrl = url + operation + queryParams;
}
// To check is this left holiday
function cmpDate(date) {
var today = getTodayDate().replace(/\-/g, "");
if (Number(today) <= Number(date)) {
return true;
}
}
// To get data from holiday api by using parmas
function getData() {
request.get(requestUrl, (err, res, body) => {
if (err) {
console.log("err => " + err);
} else {
if (res.statusCode == 200) {
// Read url success
var result = body;
var parser = new xml2js.Parser();
parser.parseString(result, function (err, res) {
text = JSON.stringify(res);
// Get dataName method
dateName = [];
var idx = text.indexOf("dateName", 0);
while (idx != -1) {
var start = text.indexOf("[", idx) + 2;
var end = text.indexOf("]", idx) - 1;
var tempStr = text.substring(start, end);
dateName.push(tempStr);
idx = text.indexOf("dateName", idx + 1);
}
console.log(dateName);
// Get locdate method
locdate = [];
idx = text.indexOf("locdate", 0);
while (idx != -1) {
var start = text.indexOf("[", idx) + 2;
var end = text.indexOf("]", idx) - 1;
var tempStr = text.substring(start, end);
locdate.push(tempStr);
idx = text.indexOf("locdate", idx + 1);
}
console.log(locdate);
var holiArr = [];
for (var i = 0; i < dateName.length; i++) {
holiArr.push(getLeftDate(locdate[i]));
}
console.log(holiArr);
// Create tempArr to save dateName and locdate and leftDate at once
tempArr = [];
// To check left holiday
var check = false;
for (var i = 0; i < locdate.length; i++) {
if (cmpDate(locdate[i])) {
check = true;
tempArr.push(dateName[i]); // Get recent holiday name
tempArr.push(locdate[i]); // Get recent holiday date
tempArr.push(holiArr[i]); // Get leftDate through locdate
break;
}
}
console.log(tempArr);
if (!check) {
// If there are no holidays left this month
console.log(
"이번 달에는 남은 공휴일이 없습니다. 다음달 데이터를 불러옵니다."
);
if (Number(month) < 12) {
// Get next month data
month = String(Number(month) + 1).padStart(2, "0");
} else {
// Get next year data
year = String(Number(year) + 1).padStart(4, "0");
month = "01";
}
changeParams(year, month, operation);
getData();
}
console.log("* api로부터 데이터를 불러왔습니다.");
console.log("오늘의 날짜는", getTodayDate(), "입니다.");
console.log(
"가장 가까운 공휴일인 [" +
tempArr[0] +
"]의 날짜는 [" +
tempArr[1] +
"]이고, [" +
tempArr[2] +
"]일 남았습니다."
);
});
}
}
});
}
// To initialize datas when calling webpage
function init() {
// Intialize Year, Month
var date = getTodayDate().split("-");
year = date[0];
month = date[1];
operation = "getRestDeInfo";
changeParams(year, month, operation);
// Get data from holiday api
getData();
}
// Get request for web service
app.get("/", function (req, res) {
init();
// Send data from nodejs to ejs
res.render("data.ejs", { data: tempArr }, function (err, html) {
if (err) {
console.log(err);
}
res.end(html); // End response
});
// send data.ejs
res.sendFile(__dirname + "/views/data.ejs");
});
// Get request for app service(Send main data)
app.get("/app", function (req, res) {
init();
res.send(
getTodayDate() + "," + tempArr[0] + "," + tempArr[1] + "," + tempArr[2]
);
});
init();
const port = 8080;
app.listen(port, () => console.log("Listening on port " + port));
<!-- data.ejs -->
<!DOCTYPE html>
<html>
<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>Check the Holiday</title>
<link rel="stylesheet" href="../public/css/main.css" type="text/css">
<!--style.css 파일 적용.-->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Tiro+Devanagari+Marathi&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Gowun+Dodum&display=swap" rel="stylesheet">
</head>
<center>
<body>
<div id="title">When is Next Holiday?</div>
<br><br>
<div class="wrapper">
<div class="circle">
<p class="dday">
<span>
<h2>오늘로부터 가장 가까운 휴일은</h2>
<h1>
<%= data[0] %>
</h1>
<h1 style="font-size: 80px;"> D - <%= data[2] %>
</h1>
<h2>
<%= data[1][0] %>
<%= data[1][1] %>
<%= data[1][2] %>
<%= data[1][3] %>년 <%= data[1][4] %>
<%= data[1][5] %>월 <%= data[1][6] %>
<%= data[1][7] %>일
</h2>
<h2> </h2>
</span>
</p>
</div>
</div>
<!--comment part-->
<div id="comment">
<% if (data[2] << 7 ) { %>
<h2>벌써 <%= data[0] %>이(가) <font color="pink">일주일</font>도 남지 않았습니다! </h2>
<% } else if (data[2] << 10) { %>
<h2>어느새 <%= data[0] %>이(가) <font color="pink">열흘</font>도 남지 않았습니다! </h2>
<% } else if (data[2] << 31) { %>
<h2>
<%= data[0] %>이(가) <font color="pink">한 달</font>도 남지 않았습니다!
</h2>
<% } else if (data[2]==0) { %>
<h2>오늘은 즐거운 공휴일!</h2>
<% } else { %>
<h2>오늘부터 한 달 안에 공휴일이 없습니다..</h2>
<% } %>
</div>
<br><br>
<!--recommend activity-->
<h2> [<%= data[0] %>]에 추천하는 활동 </h2>
<div>
<% if (data[1]=='20230101' ) { %>
<div id="detail">
<br>
<h2>새해의 첫날이며, 영어로는 New Years Day라고 한다. </h2>
<h2>1. 제야의 종(보신각) :
보신각은 서울 종로구이 취치에 있는 종각으로 서울보신각종을 걸어 둘 수 있게 만든 것이다.
이 종은 1986년에 제작된 '서울대종'이며, 새해 첫날의 시작을 알리는 용도로 사용된다. </h2>
<h2>2. 해돋이 :
해는 매일 뜨지만 신년의 첫 해는 특별하게 느껴진다. 새해 첫날에 해돋이를 보면서 소원을
빌어보는 건 어떨까?
</h2><br>
</div>
<div class="frame">
<button class="custom-btn btn-12" href=""><span>click!</span><span>보신각 타종신청</span></button>
</div>
<div class="frame">
<button class="custom-btn btn-12" href=""><span>click!</span><span>일출시간</span></button>
</div>
<% } else if (data[1]=='20230121' ) { %>
<div id="detail">
<br>
<h2>설날은 추석과 함께 대표적인 한국의 명절중 하나이다. 음력으로 1월1일이며
설이라고도 불린다. 현재 한국은 양력 1월 1일은 새해로 기념하고, 친척들을 만다는
전통 명절 기념은 음력 1월 1일에 한다. </h2>
<h2>가족들과 함께 즐거운 설을 보내보자! </h2>
<br>
</div>
<% } else if (data[1]=='20230301' ) { %>
<div id="detail">
<br>
<h2>삼일절은 3·1 운동을 기념하기 위해 제정된 국경일이다. 1920년 임시 정부가 만들어진 이후
국경일로 지정되어 기념되기 시작하였다. </h2>
<h2>1. 서대문형무소 역사관 :
서대문구에 위치한 역사관으로 일본이 한국의 독립운동가들을 가두기 위해 만든 감옥이다.
서대문형무소 역사관에는 이러한 역사의 흔적이 그대로 남아있다. </h2>
<h2>2. 독립기념관 :
충남 천안시에 위치해 있으며 삼일절에 다양한 행사를 한다. </h2><br>
</div>
<div class="frame">
<button class="custom-btn btn-12" href=""><span>click!</span><span>내 주변z 투표소
찾기!</span></button>
</div>
<% } else if (data[1]=='20230505' ) { %>
<div id="detail">
<br>
<h2>어린이날은 미래 사회의 주인공이 될 아이들이 예쁘게 자라날 수 있도록
제정된 날로 우리나라 뿐만 아니라 다른 나라에서도 기념일로 정하고 있다.
</h2>
<h2>1. 롯데월드 :
서울의 대표적 명소로 서울에 거주중이라면 편하게 갈 수 있는 곳이다. 아이들이
좋아하는 테마파크가 존재한다. </h2>
<h2>2. 서울 어린이 대공원 :
서울에서 제일 큰 놀이터라는 별명을 가진 공원이다. 놀이동산 뿐만 아니라 동물원까지
있어 사실상 아이들이 놀기 딱 좋은 놀이시설이다. </h2>
<br>
</div>
<div class="frame">
<button class="custom-btn btn-12" href=""><span>click!</span><span>롯데월드</span></button>
</div>
<div class="frame">
<button class="custom-btn btn-12" href=""><span>click!</span><span>서울 어린이
대공원</span></button>
</div>
<% } else if (data[1]=='20230527' ) { %>
<div id="detail">
<br>
<h2>석가모니를 기념하기 위해 제정된 법정 공휴일이다. 음력 4월 8일을 기반으로 한다. </h2>
<h2>1. 봉은사
봉은사는 서울 한가운데에 있을 뿐 아니라 역과의 거리도 가까워 부담없이
방문할 수 있는 사찰 중 하나이다. 삼성동 근처에 있으며 신라 시대에 창건되었다.
부처님오신날에는 연등 축제 등 행사를 연다. </h2>
<h2>2. 조계사
조계사 또한 서울 시내에 있는 사찰이다. 비록 규모는 아담하지만 우리나라의 최대
불교 종단의 본사이며 크고 아름다운 대웅전이 있다. 조계사 주변에는 불교 서적을
구할수 잇는 서점, 템플스테이, 불교용품 가게 등 불표와 관련된 것들을 취급하는 곳이 많다. </h2>
<br>
</div>
<div class="frame">
<button class="custom-btn btn-12"
href=""><span>click!</span><span>봉은사</span></button>
</div>
<div class="frame">
<button class="custom-btn btn-12"
href=""><span>click!</span><span>조계사</span></button>
</div>
<% } else if (data[1]=='20220601' ) { %>
<div id="detail">
<br>
<h2>지방선거로 지정된 날로 대한민국에서 가장 중요한 날 중 하나이다. </h2>
<h2>모두가 투표에 참여함으로써 귀중한 표를 선사해야하는 날이다. </h2>
<br>
</div>
<div class="frame">
<button class="custom-btn btn-12" href=""><span>click!</span><span>내 주변z 투표소
찾기!</span></button>
</div>
<% } else if (data[1]=='20220606' ) { %>
<div id="detail">
<br>
<h2>현충일은 나라를 위해 희생한 순국선열과 장병들을 기리기 위해 지정된
기념일이다. </h2>
<h2>1. 국립 서울 현충원
서울 동작역 근처에 위치하고 있으며, 국가를 위해 희생한 분들을 모신 국립묘지입니다.
</h2>
<h2>2. 용산 전쟁기념관
선사시대부터 현대까지의 국가에 헌신한 분들의 공훈과 호국전쟁 자료 등이
실물, 복제품으로 전시되어 있다. </h2>
<h2>3. 김포함상공원
52년간 바다를 지켜온 운봉함을 개조한 공원으로 실제로 사용된 전함을
볼 수 있다.
</h2>
<br>
</div>
<div class="frame">
<button class="custom-btn btn-12"
href=""><span>click!</span><span>button</span></button>
</div>
<% } else if (data[1]=='20220815' ) { %>
<div id="detail">
<br>
<h2>광복절은 대한민국이 일본으로부터 해방된 것을 기념하는 날이다</h2>
<h2>1. 서대문형무소 역사관
서울 종로구에 위치한 역사 박물관으로 대한민국 서녕ㄹ들의 자주독립정신을
배울 수 있는 곳이다.</h2>
<h2>2. 전쟁기념관
서울 용산구에 위치해 있으며, 호국 자료를 전시하고 전쟁의 통해 얻을 수 있는
교훈과 호국정신을 배양한다.</h2>
<h2>3. 근현대사 기념관
순국선열의 묘역과 4/19민주묘지가 자리잡고 있다.
</h2>
<br>
</div>
<div class="frame">
<button class="custom-btn btn-12"
href=""><span>click!</span><span>button</span></button>
</div>
<% } else if (data[1]=='20220909' ) { %>
<div id="detail">
<br>
<h2>추석은 음력 8월 15일에 치르는 행사이고, 설날과 함께 한국의 주요 연휴이다. </h2>
<h2>가족들과 함께 보름달 같이 풍성한 한가위 보내자.</h2>
<br>
</div>
<div class="frame">
<button class="custom-btn btn-12"
href=""><span>click!</span><span>button</span></button>
</div>
<% } else if (data[1]=='20221003' ) { %>
<div id="detail">
<br>
<h2>개천절은 대한민국의 국경일중 하나이며, 단군왕검이 고조선을 세운 것을 기념하는 날이다.</h2>
<h2>1. 인천 차이나 타운
'먹방 여행'뿐만 아니라, 역사 투어까지 가능한 곳이다.<br> 우리가 즐겨먹는 짜장면이 바로 인천
차이나타운에서 탄생했으며,<br> 가장 오래된 중국집이 '짜장면박물관'으로 리모델링돼 운영중이다.</h2>
<h2>2. 태백 동굴 여행
태백에는 많은 동굴들이 있으며, 당일치기여행으로 갈만한 곳이 많다.</h2>
<br>
</div>
<div class="frame">
<button class="custom-btn btn-12"
href=""><span>click!</span><span>button</span></button>
</div>
<% } else if (data[1]=='20221010' ) { %>
<div id="detail">
<br>
<h2>한글날은 세종대왕이 훈민정음을 창제한 것을 기념하기 위해 만들어진 기념일이다. </h2>
<h2>1. 서울 시청 일대
서울 시청 근처에는 다양한 한글날 행사가 열린다.
</h2>
<h2>2. 광화문 세종대왕 동상
세종대황 동상이 있는 광화문 광장 지하에는 세종이야기와 충무공 이야기가 전시되어 있다.
전시관 안에는 다양한 세종대왕 관련 서적이 자리하고 있다.
</h2>
<br>
</div>
<div class="frame">
<button class="custom-btn btn-12"
href=""><span>click!</span><span>button!</span></button>
</div>
<% } else if (data[1]=='20221225' ) { %>
<div id="detail">
<br>
<h2>예수 그리스도의 탄생을 기리는 기념일이다. <br>
한 겨울에 있는 공휴일로 많은 사람들이
연인이나 가족들과 함께 시간을 보낸다. </h2>
<h2>1.분천역 산타마을
분천역은 국내 최초의 개방형 관광 열차인 백두개간 열차가 출발하는 역이다.<br>
역 주변에는 다양한 크리스마스 모형들이 있다.</h2>
<h2>2. 에버랜드
크리스마스 기간동안 에버랜드는 낭만적인 크리스마스 분위기를 연출한다.<br>
매일 1~2회씩 크리스마스 퍼레이드를 선보인다.</h2>
<br>
</div>
<div class="frame">
<button class="custom-btn btn-12"
onclick="location.href='http://buncheon.k7788.com/index.html?Midx=366&ct_pg=781'"><span>click!</span><span>분천역
산타마을</span></button>
</div>
<% } else { %>
<h2>Just Take some rest!</h2>
<% } %>
</div>
</body>
</center>
</html>
\ No newline at end of file