Showing
10 changed files
with
313 additions
and
0 deletions
busterm/.vscode/launch.json
0 → 100644
1 | +{ | ||
2 | + // IntelliSense를 사용하여 가능한 특성에 대해 알아보세요. | ||
3 | + // 기존 특성에 대한 설명을 보려면 가리킵니다. | ||
4 | + // 자세한 내용을 보려면 https://go.microsoft.com/fwlink/?linkid=830387을(를) 방문하세요. | ||
5 | + "version": "0.2.0", | ||
6 | + "configurations": [ | ||
7 | + { | ||
8 | + "type": "pwa-node", | ||
9 | + "request": "launch", | ||
10 | + "name": "Launch Program", | ||
11 | + "skipFiles": [ | ||
12 | + "<node_internals>/**" | ||
13 | + ], | ||
14 | + "program": "${workspaceFolder}\\app.js" | ||
15 | + } | ||
16 | + ] | ||
17 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
busterm/app.js
0 → 100644
1 | +const express = require("express"); | ||
2 | +var app = express(); | ||
3 | +http = require('http').createServer(app); | ||
4 | +port = 23023; | ||
5 | + | ||
6 | +app.use(express.static(__dirname + "/views")); | ||
7 | +const routes = require("./routes/"); | ||
8 | +app.use(routes) | ||
9 | + | ||
10 | +app.use((err,req,res,next) => { | ||
11 | + const {status,message} = err | ||
12 | + console.error(err) | ||
13 | + res.status(status||500).json({message}) | ||
14 | +}) | ||
15 | + | ||
16 | +var server = http.listen(port, function(){ | ||
17 | + console.log(`http://localhost:${port}`); | ||
18 | +}) | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
busterm/models/BusInfo.js
0 → 100644
1 | +let request = require('request'); | ||
2 | +let cheerio = require('cheerio'); | ||
3 | +const bus_url = 'http://apis.data.go.kr/6410000/busarrivalservice/getBusArrivalList'; | ||
4 | +//const stationID = '228000708'; // 사색의광장 들어오는 방향 | ||
5 | +const gateStationID = '203000125' | ||
6 | +require('dotenv').config(); | ||
7 | +//const BusArrivalUrl = bus_url + '?servicekey=' + process.env.key + '&stationId=' + stationID;// 사색의광장 정류장 버스 도착 정보 조회용 | ||
8 | +//console.log(BusArrivalUrl); | ||
9 | +var routeID = ['200000112', '200000115', '234000016', '200000103']; | ||
10 | +var Bus = []; | ||
11 | +// request(BusArrivalUrl, (err, res, body) => { | ||
12 | +// var $ = cheerio.load(body, {decodeEntities: false}); | ||
13 | +// $('busArrivalList').each(function(idx){ | ||
14 | +// let route = $(this).find('routeId').text(); | ||
15 | +// routeID.push(route); | ||
16 | +// }) | ||
17 | +// //console.log(routeID); | ||
18 | +// }) | ||
19 | +const route_url = 'http://apis.data.go.kr/6410000/busrouteservice/getBusRouteInfoItem'; | ||
20 | +var index = 0; | ||
21 | +function getBusNum(){ | ||
22 | + var BusRouteUrl = route_url + '?servicekey=' + process.env.key + '&routeId='; // 각 버스 정보 조회용 | ||
23 | + BusRouteUrl += routeID[index++]; | ||
24 | + //console.log(BusRouteUrl); | ||
25 | + request(BusRouteUrl, (err, res, body) => { | ||
26 | + var $ = cheerio.load(body, {decodeEntities: false}); | ||
27 | + $('busRouteInfoItem').each(function(idx){ | ||
28 | + var id = $(this).find('routeId').text(); //버스 노선 id | ||
29 | + var num = $(this).find('routeName').text(); //버스 번호 | ||
30 | + var firsttime = $(this).find('upFirstTime').text(); //평일 기점 첫차시간 | ||
31 | + var lasttime = $(this).find('upLastTime').text(); //평일 기점 막차 시간 | ||
32 | + var mintime = $(this).find('peekAlloc').text(); //평일 최소 배차시간 | ||
33 | + var maxtime = $(this).find('nPeekAlloc').text(); //평일 최대 배차시간 | ||
34 | + //var idx = Bus.findIndex((item, idx) => { return item.routeId = id}) | ||
35 | + var newBus = new Object(); | ||
36 | + newBus.routeId = id; | ||
37 | + newBus.BusNum = num; | ||
38 | + newBus.FirstTime = firsttime; | ||
39 | + newBus.LastTime = lasttime; | ||
40 | + newBus.MinTime = mintime; | ||
41 | + newBus.MaxTime = maxtime; | ||
42 | + console.log(newBus); | ||
43 | + Bus.push(newBus); | ||
44 | + console.log(Bus); | ||
45 | + }) | ||
46 | + }) | ||
47 | +} | ||
48 | +for(var i=0; i<routeID.length; i++){ | ||
49 | + getBusNum(); | ||
50 | +} | ||
51 | +const GateBusUrl = bus_url + '?servicekey=' + process.env.key + '&stationId=' + gateStationID; //국제캠 정문 정류장 | ||
52 | +let date = new Date(); | ||
53 | +let predictTime = ['-1', '-1', '-1', '-1']; | ||
54 | +let body = new Object(); | ||
55 | +function predict(){ | ||
56 | + console.log(GateBusUrl); | ||
57 | + request(GateBusUrl, (err, res, body) => { | ||
58 | + var $ = cheerio.load(body, {decodeEntities: false}); | ||
59 | + $('busArrivalList').each(function(idx){ | ||
60 | + let route = $(this).find('routeId').text(); | ||
61 | + var index = Bus.findIndex(function(e, idx){ return e.routeId == route;}); | ||
62 | + if(index > -1){ | ||
63 | + //var num = $(this).find('plateNo1').text(); // 버스 차량번호 ex) 70사 1290 | ||
64 | + var time = $(this).find('predictTime1').text(); // 버스 예상 도착시간 | ||
65 | + var predictHour1 = date.getHours(); | ||
66 | + var predictMinute1 = date.getMinutes() + Bus[index].mintime - (3 - (time*1)); // 사색의 광장 -> 경희대학교 3분정도 소요 | ||
67 | + var predictHour2 = date.getHours(); | ||
68 | + var predictMinute2 = date.getMinutes() + Bus[index].maxtime - (3 - (time*1)); // time*1 : string to integer 형변환 | ||
69 | + if(predictMinute1 >= 60){ | ||
70 | + predictHour1 += 1; | ||
71 | + predictMinute1 -= 60; | ||
72 | + } | ||
73 | + if(predictMinute2 >= 60){ | ||
74 | + predictHour2 += 1; | ||
75 | + predictMinute2 -= 60; | ||
76 | + } | ||
77 | + Bus[index]["MinPredictTime"] = predictHour1 + ":" + predictMinute1; | ||
78 | + Bus[index]["MaxPredictTime"] = predictHour2 + ":" + predictMinute2; | ||
79 | + predictTime = [predictHour1 + "", predictMinute1 + "", predictHour2 + "", predictMinute2 + ""] | ||
80 | + const dateBusDeparture = new Date(date.getFullYear(), date.getMonth(), date.getDate(), predictTime[0]*1, predictTime[1]*1, 0); | ||
81 | + var gapSec = (dateBusDeparture.getTime() - date.getTime())/1000; | ||
82 | + var gapHour = Math.floor(gapSec / 60 / 60); | ||
83 | + var gapMin = Math.floor((gapSec - gapHour * 3600) / 60); | ||
84 | + // var ans = gapHour + "시간" + gapMin + "분 이상"; | ||
85 | + // var ETD_min_H = predictTime[0]; | ||
86 | + // var ETD_min_M = predictTime[1]; | ||
87 | + // var ETD_max_H = predictTime[2]; | ||
88 | + // var ETD_max_M = predictTime[3]; | ||
89 | + | ||
90 | + | ||
91 | + //controller에 데이터 전송 | ||
92 | + module.exports.data = {}; | ||
93 | + module.exports.data.remainTime = gapHour + "시간" + gapMin + "분 이상"; | ||
94 | + module.exports.data.ETD_min_H = predictTime[0]; | ||
95 | + module.exports.data.ETD_min_M = predictTime[1]; | ||
96 | + module.exports.data.ETD_max_H = predictTime[2]; | ||
97 | + module.exports.data.ETD_max_M = predictTime[3]; | ||
98 | + | ||
99 | + | ||
100 | + } | ||
101 | + }) | ||
102 | + }) | ||
103 | +} | ||
104 | + | ||
105 | + | ||
106 | + | ||
107 | +function start(){ | ||
108 | + setInterval(predict, 60000); | ||
109 | +} | ||
110 | +setTimeout(start, 20000); |
busterm/routes/controller.js
0 → 100644
1 | +var express = require('express'); | ||
2 | +var app = express(); | ||
3 | +var fs = require('fs') | ||
4 | +var Businfo = require("../models/BusInfo"); | ||
5 | + | ||
6 | +app.set('views',__dirname+'/views'); | ||
7 | +app.set('view engine', 'ejs'); | ||
8 | +app.engine('html',require('ejs').renderFile); | ||
9 | +app.engine('ejs', require('ejs').renderFile); | ||
10 | + | ||
11 | +exports.mainView = function(req, res) { | ||
12 | + res.render("./views/ejstest.ejs", "utf8", function(err,buf){ | ||
13 | + res.end(buf); //render 함수로 ejs 파일 렌더링 할 예정. index.ejs | ||
14 | + }) | ||
15 | +} | ||
16 | + | ||
17 | +exports.timeTable = function(req, res) { | ||
18 | + res.render("ejstest",{busNum:req.query.busNum, remainTime: Businfo.data.remainTime, ETD_min_H: Businfo.data.ETD_min_H, | ||
19 | + ETD_min_m: Businfo.data.ETD_max_m, ETD_max_H: Businfo.data.ETD_max_H, ETD_max_m: Businfo.data.ETD_max_m }); | ||
20 | +} | ||
21 | + | ||
22 | + |
busterm/routes/index.js
0 → 100644
1 | +const router = require("express").Router(); | ||
2 | +const controller = require("./controller"); | ||
3 | + | ||
4 | +router.get("/", controller.mainView); //main 페이지 | ||
5 | +router.get("/timetable", controller.timeTable); //timetable 페이지 | ||
6 | + | ||
7 | + | ||
8 | +module.exports = router; | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
busterm/views/Index.html
0 → 100644
1 | +<!doctype html> | ||
2 | +<html> | ||
3 | +<head> | ||
4 | + <title>BUS TT</title> | ||
5 | + <meta charset="utf-8"> | ||
6 | + <style type="text/css"> | ||
7 | + a { text-decoration:none } /* 하이퍼링크 밑줄 미적용 | ||
8 | + a { color:red; text-decoration:none} : 색깔 변화없음 | ||
9 | + */ | ||
10 | + </style> | ||
11 | +</head> | ||
12 | + | ||
13 | +<body> | ||
14 | + <h1><p style="text-align:center;">BTT</p></h1> | ||
15 | + <br> | ||
16 | + <h2> 사색의 광장 Bus Time Table 조회 서비스에 오신 것을 환영합니다.</h2> | ||
17 | + <p> 이곳에는 사색의 광장에서 출발하는 모든 버스의 정보가 있습니다.</p> | ||
18 | + <br><br> | ||
19 | + <h2> 버스별 시간표 조회</h2> | ||
20 | + <p> m월 d일 오늘 운행하는 버스들</p> | ||
21 | + <ul> | ||
22 | + <li><a href="http://localhost:23023/?busNum=5100">5100</a></li> | ||
23 | + <li><a href="http://localhost:23023/?busNum=M5107">M5107</a></li> | ||
24 | + <li><a href="http://localhost:23023/?busNum=9">9</a></li> | ||
25 | + <li><a href="http://localhost:23023/?busNum=7000">7000</a></li> | ||
26 | + <li>etc</li> | ||
27 | + </ul> | ||
28 | + <br> | ||
29 | + <p>설명</p> | ||
30 | + | ||
31 | + | ||
32 | +</body> | ||
33 | +</html> |
busterm/views/ejstest.ejs
0 → 100644
1 | +<!doctype html> | ||
2 | + <html> | ||
3 | + <head> | ||
4 | + <title>Time Table</title> | ||
5 | + <meta charset="utf-8"> | ||
6 | + <style type="text/css"> | ||
7 | + a { text-decoration:none } | ||
8 | + </style> | ||
9 | + </head> | ||
10 | + | ||
11 | + <body> | ||
12 | + <h1><a href="/"><p style="text-align:center;">BTT</p></a></h1> | ||
13 | + <br> <div style="padding:0 0 0 20px;"> | ||
14 | + <h2> <%= busNum %> BUS Time Table</h2> | ||
15 | + </div> | ||
16 | + <div style="padding:0 0 0 20px;"> | ||
17 | + <table border="3" width="400"> | ||
18 | + <th> Index</th> | ||
19 | + <th> 출발 예정시간</th> | ||
20 | + <th> 남은 시간</th> | ||
21 | + <tr align="center"> | ||
22 | + <td> text입력하기 </td> | ||
23 | + <td> <%= ETD_min_H %>:<%= ETD_min_m %> ~ <%= ETD_max_H %>:<%= ETD_max_m %> </td> | ||
24 | + <td> <%= remainTime %> </td> | ||
25 | + </tr> | ||
26 | + </table> | ||
27 | + </div> | ||
28 | + <br> | ||
29 | + <br> | ||
30 | + <p> <div style="padding:0 0 0 20px;"> | ||
31 | + 버스의 평균 배차시간을 기준으로 최소 출발시간과 최대 출발시간을 제공합니다. | ||
32 | + </div> </p> | ||
33 | + <div style="padding:0 0 0 20px;"> | ||
34 | + <% var date = new Date(); %> | ||
35 | + <% var yyyy = date.getFullYear(); %> | ||
36 | + <% var mm1 = date.getMonth() + 1; %> | ||
37 | + <% var dd = date.getDate(); %> | ||
38 | + <% var hh = date.getHours(); %> | ||
39 | + <% var mm2 = date.getMinutes(); %> | ||
40 | + | ||
41 | + <% document.write(yyyy+"년 "+mm1+"월 "+dd+"일 "); %> | ||
42 | + <% document.write(hh+"시 "+mm2+"분 기준"); %> | ||
43 | + </div> | ||
44 | + </body> | ||
45 | + </html> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
busterm/views/index.ejs
0 → 100644
1 | +<!doctype html> | ||
2 | +<html> | ||
3 | +<head> | ||
4 | + <title>BUS TT</title> | ||
5 | + <meta charset="utf-8"> | ||
6 | + <style type="text/css"> | ||
7 | + a { text-decoration:none } | ||
8 | + </style> | ||
9 | +</head> | ||
10 | +<body> | ||
11 | + <h1><p style="text-align:center;">BTT</p></h1> | ||
12 | + <br> | ||
13 | + <link rel='stylesheet' type='text/css' href='/css/style.css' /> | ||
14 | + <h2> 사색의 광장 Bus Time Table 조회 서비스에 오신 것을 환영합니다.</h2> | ||
15 | + <p> 이곳에는 사색의 광장에서 출발하는 모든 버스의 정보가 있습니다.</p> | ||
16 | + <br><br> | ||
17 | + <h2> 버스별 시간표 조회</h2> | ||
18 | + | ||
19 | + <div style="padding:0 0 0 20px;"> | ||
20 | + <% var date = new Date(); %> | ||
21 | + <% var yyyy = date.getFullYear(); %> | ||
22 | + <% var mm1 = date.getMonth() + 1; %> | ||
23 | + <% var dd = date.getDate(); %> | ||
24 | + <% var hh = date.getHours(); %> | ||
25 | + <% var mm2 = date.getMinutes(); %> | ||
26 | + | ||
27 | + <% document.write(yyyy+"년 "+mm1+"월 "+dd+"일 오늘 운행하는 버스들 "); %> | ||
28 | + <% document.write("( "+hh+"시 "+mm2+"분 기준 )"); %> | ||
29 | + </div> | ||
30 | + <ul> | ||
31 | + <li><a href="http://localhost:23023/timetable?busNum=5100">5100</a></li> | ||
32 | + <li><a href="http://localhost:23023/timetable?busNum=M5107">M5107</a></li> | ||
33 | + <li><a href="http://localhost:23023/timetable?busNum=9">9</a></li> | ||
34 | + <li><a href="http://localhost:23023/timetable?busNum=7000">7000</a></li> | ||
35 | + <li>etc</li> | ||
36 | + </ul> | ||
37 | + <br> | ||
38 | + <p>설명</p> | ||
39 | +</body> | ||
40 | +</html> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
busterm/views/timetable.html
0 → 100644
1 | +<!-- 이 문서는 base.js에 timetableHTML로 저장되어 있음. 따라서 이 문서는 직접적으로 사용하지 않음--> | ||
2 | + | ||
3 | +<!doctype html> | ||
4 | +<html> | ||
5 | +<head> | ||
6 | + <title>Time Table</title> | ||
7 | + <meta charset="utf-8"> | ||
8 | + <style type="text/css"> | ||
9 | + a { text-decoration:none } | ||
10 | + </style> | ||
11 | +</head> | ||
12 | + | ||
13 | +<body> | ||
14 | + <h1><a href="Index.html"><p style="text-align:center;">BTT</p></a></h1> | ||
15 | + <br> | ||
16 | + <h2>0000 BUS Time Table</h2> | ||
17 | + <p> 타임테이블 출력 ~~~~ </p> | ||
18 | +</body> | ||
19 | +</html> |
-
Please register or login to post a comment