From 8cf9904a31d13dc90baed6d12c5c5bed7e29c0f9 Mon Sep 17 00:00:00 2001 From: Sangwook Park <41150708+sw0501@users.noreply.github.com> Date: Fri, 9 Dec 2022 00:02:59 +0900 Subject: [PATCH] Backend (#86) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Feat: 철도 관련 정보 엑셀 추가 철도 관련 정보 저장된 엑셀 파일 추가 및 MySQL 연결용 js 파일 추가 * Feat: API 추가 * Modify: VM 서버 올리기 위해서 빌드 코드 주석처리 빌드 코드 주석처리 및 창립제 발표 자료 추가 * Modify: Port 번호 변경 Port 번호 변경 * Modify: gitigonore 수정, GPS 데이터 삭제, 지하철 명 검색 API 추가 PPT 파일 gitignore 추가 GPS.json 파일 삭제 지하철 명 검색 시 해당 번호 및 철도 번호 추가 * Feat: DB 연결 코드 추가, 외부 접속용 cors 추가 MySQL 연결 코드 DBconnect.js 추가 외부 IP 접속용 cors 추가 * Feat: Test 파일 삭제 및 MySQL 연동 지하철 테스트 json 파일 및 test.js 파일 삭제 MySQL 연동 코드 작성 * Feat: package.json 추가 express, mysql, cors, path 모듈 추가 * Feat: Cors IP 추가 localhost:3000 Cors에 추가 * Feat: MySQL 연동 및 지하철 정보 API 추가 VM MySQL 연동 및 지하철 정보 API 추가 * Feat: 버스 도착 예정 시간 분/초 파싱 및 API 최신화 버스 도착 예정 시간 min / sec로 response에서 제공 사용하지 않는 API 및 수정된 URL로 REST API 최신화 지하철 역 선택 시 좌표 response 지하철 정보 배열로 response Fix: #42. #55, #62 * Modify: congestion 제거 response에서 congestion 값을 제공을 안해서 제거 * Modify: API 수정 및 SQL DUMP 파일 추가 API 수정 지하철역 Dump 파일 추가 * Modify: MySQL 한글 오류 수정 MySQL 'utf8mb4_0900_ai_ci' 오류 수정 * Test: MySQL 오류 확인 위해서 원상태로 복구 * Modify: .SQL 파일 헤더 추가 * Modify: .SQL 파일 헤더 변경 * Modify: .SQL 파일 헤더 변경 * Modify: .SQL 파일 헤더 변경 * Modify: .SQL 파일 헤더 변경 * Modify: Front 작업용 backend.js 수정 SQL 데이터 옮기는 건 추후에 작업: * Modify: VM용 쿼리문 구조 변경 * Feat: 휠체어 리프트 위치 API 추가 저상버스 도착 정보 주석처리 SQL문 VM용으로 수정 * Feat: 버스 타이머 기능 추가 Min, Sec 분할하여 제공 첫차, 막차, 분, 초 없는 예외 케이스 처리 * Feat: 휠체어리프트 이동동선, 엘리베이터 위치, 이동동선 API 추가 휠체어리프트 이동동선 API 추가 엘리베이터 위치 API 추가 엘리베이터 이동동선 API 추가 * Modify: VM test DB 사용 코드 변경 VM에 있는 'test' DB 데이터 사용 코드 변경 * Feat: TransferMove API 추가 환승역 이동동선 API 추가 환승역 아닌 경우 Error 코드 추가 * Modify: backend.js MySQL 테스트 코드 제거 backend.js MySQL 테스트 코드 제거 * Feat: Cors 서버 주소 추가 Cors 서버 주소 추가 * Feat: transferList, transferInfo, convenience API 구현 transferList 환승역 목록 제공 transferInfo 환승 이동 경로 제공 convenience 편의정보 시설 위치 및 상세정보 제공 Co-authored-by: 박규태 <79373803+KyuTae98@users.noreply.github.com> --- Backend/routes/develop.js | 49 ++++++++++ Backend/routes/subwaydata.js | 182 +++++++++++++++++++++++++++-------- 2 files changed, 189 insertions(+), 42 deletions(-) create mode 100644 Backend/routes/develop.js diff --git a/Backend/routes/develop.js b/Backend/routes/develop.js new file mode 100644 index 0000000..693f85e --- /dev/null +++ b/Backend/routes/develop.js @@ -0,0 +1,49 @@ +const router = require('express').Router(); +const request = require('request'); +const convert = require('xml-js'); +const serviceKey = require('../Key/serviceKey.json'); + +function getStationInfo(arsId, callback) { + + try { + + } + catch (e) { + console.error(e); + return res.status(500).json({ + error: e, + errorString: e.toString(), + }); + } + +} + +router.get('/arsId/:arsId', async (req, res) => { + + console.log('arsId'); + + const arsId = req.params.arsId; + //console.log("station"); + try { + await getStationInfo(arsId, stationinfo => { + //console.log(station); + if (stationinfo == 0) { + return res.status(404).json({ + error: 'No Bus In Station' + }) + } + else + return res.json(stationinfo); + }); + } + catch (e) { + console.error(e); + return res.status(500).json({ + error: e, + errorString: e.toString(), + }); + }; + +}) + +module.exports = router; \ No newline at end of file diff --git a/Backend/routes/subwaydata.js b/Backend/routes/subwaydata.js index 38ea13f..1327bf6 100644 --- a/Backend/routes/subwaydata.js +++ b/Backend/routes/subwaydata.js @@ -234,11 +234,12 @@ function getElevatorMove(stCd, stNm, railCd, lnCd, callback) { } -function getTransferMove(stCd, stNm, railCd, lnCd, callback) { +function getTransferList(stCd, stNm, railCd, lnCd, callback) { try { let sql = "Select * FROM stationinfotest WHERE StNm = ?;"; - let TransferInfo = []; + + let transferList = []; connection.query(sql, [stNm], function (err, results, fields) { @@ -246,45 +247,96 @@ function getTransferMove(stCd, stNm, railCd, lnCd, callback) { console.log(err); } - let prevStinCd = []; - let chthTgtLn = []; - let chtnNextStinCd = []; + if (results.length == 1) { + return callback({ + error: 404, + errorString: "Not Transfer Station" + }); + } for (let i = 0; i < results.length; i++) { if (results[i].StCd != stCd) { - prevStinCd.push(parseInt(results[i].StCd) + 1); - prevStinCd.push(parseInt(results[i].StCd) - 1); - chthTgtLn.push(results[i].LnCd); - chthTgtLn.push(results[i].LnCd); - chtnNextStinCd.push(parseInt(results[i].StCd) - 1); - chtnNextStinCd.push(parseInt(results[i].StCd) + 1); + const sql2 = "Select * FROM stationinfotest WHERE (StCd = ? or StCd = ?) and RailCd = ?;"; + connection.query(sql2, [parseInt(results[i].StCd) + 1, parseInt(results[i].StCd) - 1, results[i].RailCd], function (err, results2, fields) { + console.log(results2); + for (let j = 0; j < results2.length; j++) { + transferList.push({ + stCd: results2[j].StCd, + stNm: results2[j].StNm, + railCd: results2[j].RailCd, + lnCd: results2[j].LnCd + }) + } + callback(transferList); + }); + } } - for (let i = 0; i < prevStinCd.length; i++) { - const url = 'https://openapi.kric.go.kr/openapi/vulnerableUserInfo/transferMovement'; - let queryParams = '?' + encodeURIComponent('serviceKey'); - queryParams += '=' + serviceKey.subwayRailKey; - queryParams += '&' + encodeURIComponent('format') + '=' + encodeURIComponent('json'); - queryParams += '&' + encodeURIComponent('railOprIsttCd') + '=' + encodeURIComponent(railCd); - queryParams += '&' + encodeURIComponent('lnCd') + '=' + encodeURIComponent(lnCd); - queryParams += '&' + encodeURIComponent('stinCd') + '=' + encodeURIComponent(stCd); - queryParams += '&' + encodeURIComponent('prevStinCd') + '=' + encodeURIComponent(prevStinCd[i]); - queryParams += '&' + encodeURIComponent('chthTgtLn') + '=' + encodeURIComponent(chthTgtLn[i]); - queryParams += '&' + encodeURIComponent('chtnNextStinCd') + '=' + encodeURIComponent(chtnNextStinCd[i]); - - console.log(url + queryParams); - return request({ - url: url + queryParams, - method: 'GET' - }, function (error, response, body) { - TransferInfo.push(body); - callback(TransferInfo); - }); + + }); + + } + + catch (e) { + console.error(e); + callback(e); + } +} + +function getTransferInfo(stCd, stNm, railCd, lnCd, prev, chthTgtLn , chtnNextStinCd , callback) { + try { + + let sql = "Select * FROM stationinfotest WHERE StNm = ? and LnCd = ?;"; + let transferInfo = []; + + connection.query(sql, [stNm, chthTgtLn], function (err, results, fields) { + + if (err) { + console.log(err); } + let prevStinCd = ""; + + if (parseInt(results[0].StCd) + 1 == parseInt(chtnNextStinCd)) { + prevStinCd = parseInt(results[0].StCd) - 1; + } + else { + console.log(2); + prevStinCd = parseInt(results[0].StCd) + 1; + } + + const url = 'https://openapi.kric.go.kr/openapi/vulnerableUserInfo/transferMovement'; + let queryParams = '?' + encodeURIComponent('serviceKey'); + queryParams += '=' + serviceKey.subwayRailKey; + queryParams += '&' + encodeURIComponent('format') + '=' + encodeURIComponent('json'); + queryParams += '&' + encodeURIComponent('railOprIsttCd') + '=' + encodeURIComponent(railCd); + queryParams += '&' + encodeURIComponent('lnCd') + '=' + encodeURIComponent(lnCd); + queryParams += '&' + encodeURIComponent('stinCd') + '=' + encodeURIComponent(stCd); + queryParams += '&' + encodeURIComponent('prevStinCd') + '=' + encodeURIComponent(prevStinCd); + queryParams += '&' + encodeURIComponent('chthTgtLn') + '=' + encodeURIComponent(chthTgtLn); + queryParams += '&' + encodeURIComponent('chtnNextStinCd') + '=' + encodeURIComponent(chtnNextStinCd); + + console.log(url + queryParams); + + return request({ + url: url + queryParams, + method: 'GET' + }, function (error, response, body) { + const parse = JSON.parse(body).body; + for (let i = 0; i < parse.length; i++) { + //상행선이라면 + if ((parseInt(stCd) + 1 == parseInt(prev) && (parse[i].mvPathMgNo == 1 || parse[i].mvPathMgNo == 2)) + || (parseInt(stCd) - 1 == parseInt(prev) && (parse[i].mvPathMgNo == 3 || parse[i].mvPathMgNo == 4)) + ) { + transferInfo.push(parse[i]); + } + } + callback(transferInfo); + }); + }); - + } catch (e) { @@ -293,12 +345,12 @@ function getTransferMove(stCd, stNm, railCd, lnCd, callback) { } } -function getConvenience(stCd, stNm, railCd, lnCd, callback) { +function getConvenience(stCd, stNm, railCd, lnCd, category, callback) { try { - console.log(stNm); + let conveneinceInfo = []; - const url = 'https://openapi.kric.go.kr/openapi/vulnerableUserInfo/stationWheelchairLiftMovement'; + const url = 'https://openapi.kric.go.kr/openapi/handicapped/stationCnvFacl'; let queryParams = '?' + encodeURIComponent('serviceKey'); queryParams += '=' + serviceKey.subwayRailKey; queryParams += '&' + encodeURIComponent('format') + '=' + encodeURIComponent('json'); @@ -312,8 +364,23 @@ function getConvenience(stCd, stNm, railCd, lnCd, callback) { url: url + queryParams, method: 'GET' }, function (error, response, body) { - console.log(body); - callback(body); + const parse = JSON.parse(body).body; + + for (let i = 0; i < parse.length; i++) { + if (category == parse[i].gubun) { + conveneinceInfo.push(parse[i]); + } + } + + //No Data + if (conveneinceInfo.length == 0) { + conveneinceInfo.push({ + error: 404, + errorString: "No conveneince" + }) + } + + callback(conveneinceInfo); }); } catch (e) { @@ -477,7 +544,7 @@ router.get('/ElevatorMove/:stCd/:stNm/:railCd/:lnCd', async (req, res) => { }) -router.get('/transferMove/:stCd/:stNm/:railCd/:lnCd', async (req, res) => { +router.get('/transferMove/transferList/:stCd/:stNm/:railCd/:lnCd', async (req, res) => { try { stCd = req.params.stCd; @@ -485,8 +552,10 @@ router.get('/transferMove/:stCd/:stNm/:railCd/:lnCd', async (req, res) => { railCd = req.params.railCd; lnCd = req.params.lnCd; - await getTransferMove(stCd, stNm, railCd, lnCd, callback => { - //console.log(stationinfo); + await getTransferList(stCd, stNm, railCd, lnCd, callback => { + if (callback[0].error != null) { + return res.status(404).json(callback[0]) + } return res.json(callback) }); @@ -500,15 +569,44 @@ router.get('/transferMove/:stCd/:stNm/:railCd/:lnCd', async (req, res) => { } }); +router.get('/transferMove/transferInfo/:stCd/:stNm/:railCd/:lnCd/:prevStinCd/:chthTgtLn/:chtnNextStinCd', async (req, res) => { + try { + + stCd = req.params.stCd; + stNm = req.params.stNm; + railCd = req.params.railCd; + lnCd = req.params.lnCd; + prevStinCd = req.params.prevStinCd; + chthTgtLn = req.params.chthTgtLn; + chtnNextStinCd = req.params.chtnNextStinCd; + + await getTransferInfo(stCd, stNm, railCd, lnCd, prevStinCd, chthTgtLn, chtnNextStinCd, callback => { + + return res.json(callback) + }); -router.get('/convenience/:stCd/:stNm/:railCd/:lnCd', async (req, res) => { + } + catch (e) { + console.error(e); + return res.status(500).json({ + error: e, + errorString: e.toString(), + }) + } +}); + +router.get('/convenience/:stCd/:stNm/:railCd/:lnCd/:category', async (req, res) => { try { stCd = req.params.stCd; stNm = req.params.stNm; railCd = req.params.railCd; lnCd = req.params.lnCd; + category = req.params.category; - await getTransfer(stCd, stNm, railCd, lnCd, callback => { + await getConvenience(stCd, stNm, railCd, lnCd, category, callback => { + if (callback[0].error != null) { + return res.status(404).json(callback[0]); + } return res.json(callback); });