tjddus: add MapView, Marker, StartFinshLocation frontend, update backend login
Showing
36 changed files
with
772 additions
and
23 deletions
code/.idea/code.iml
0 → 100644
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<module type="WEB_MODULE" version="4"> | ||
3 | + <component name="NewModuleRootManager"> | ||
4 | + <content url="file://$MODULE_DIR$" /> | ||
5 | + <orderEntry type="inheritedJdk" /> | ||
6 | + <orderEntry type="sourceFolder" forTests="false" /> | ||
7 | + </component> | ||
8 | +</module> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
code/.idea/misc.xml
0 → 100644
code/.idea/modules.xml
0 → 100644
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<project version="4"> | ||
3 | + <component name="ProjectModuleManager"> | ||
4 | + <modules> | ||
5 | + <module fileurl="file://$PROJECT_DIR$/.idea/code.iml" filepath="$PROJECT_DIR$/.idea/code.iml" /> | ||
6 | + </modules> | ||
7 | + </component> | ||
8 | +</project> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
code/.idea/vcs.xml
0 → 100644
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<project version="4"> | ||
3 | + <component name="VcsDirectoryMappings"> | ||
4 | + <mapping directory="$PROJECT_DIR$/locationTest/expo-location-example" vcs="Git" /> | ||
5 | + <mapping directory="$PROJECT_DIR$/my-project" vcs="Git" /> | ||
6 | + <mapping directory="$PROJECT_DIR$/render_server_react_native" vcs="Git" /> | ||
7 | + <mapping directory="$PROJECT_DIR$/render_server_react_native/@expo/vector-icons" vcs="Git" /> | ||
8 | + </component> | ||
9 | +</project> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
code/.idea/workspace.xml
0 → 100644
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<project version="4"> | ||
3 | + <component name="ChangeListManager"> | ||
4 | + <list default="true" id="940f1aa2-9848-4abc-bd75-a3db12d9e8e1" name="Default Changelist" comment=""> | ||
5 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/AuthContext.js" afterDir="false" /> | ||
6 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/components/CurrentUserLocationComponent.js" afterDir="false" /> | ||
7 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/components/LoginComponent.js" afterDir="false" /> | ||
8 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/components/MyProfileComponent.js" afterDir="false" /> | ||
9 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/components/SignUpComponent.js" afterDir="false" /> | ||
10 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/constants/layout.js" afterDir="false" /> | ||
11 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/navigations/SelectOrTakePhotoStackNavigation.js" afterDir="false" /> | ||
12 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/navigations/SelectOrTakePhotoTabNavigation.js" afterDir="false" /> | ||
13 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/navigations/TabNavigation.js" afterDir="false" /> | ||
14 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/reducers/index.js" afterDir="false" /> | ||
15 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/reducers/location.js" afterDir="false" /> | ||
16 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/reducers/user.js" afterDir="false" /> | ||
17 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/sagas/index.js" afterDir="false" /> | ||
18 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/sagas/location.js" afterDir="false" /> | ||
19 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/sagas/user.js" afterDir="false" /> | ||
20 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/screens/Gallery.js" afterDir="false" /> | ||
21 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/screens/Login.js" afterDir="false" /> | ||
22 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/screens/Main.js" afterDir="false" /> | ||
23 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/screens/Maps.js" afterDir="false" /> | ||
24 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/screens/Profile.js" afterDir="false" /> | ||
25 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/screens/TakePhoto.js" afterDir="false" /> | ||
26 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/screens/UploadPhoto.js" afterDir="false" /> | ||
27 | + <change afterPath="$PROJECT_DIR$/render_server_react_native/store.js" afterDir="false" /> | ||
28 | + </list> | ||
29 | + <option name="SHOW_DIALOG" value="false" /> | ||
30 | + <option name="HIGHLIGHT_CONFLICTS" value="true" /> | ||
31 | + <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> | ||
32 | + <option name="LAST_RESOLUTION" value="IGNORE" /> | ||
33 | + </component> | ||
34 | + <component name="FileTemplateManagerImpl"> | ||
35 | + <option name="RECENT_TEMPLATES"> | ||
36 | + <list> | ||
37 | + <option value="JavaScript File" /> | ||
38 | + </list> | ||
39 | + </option> | ||
40 | + </component> | ||
41 | + <component name="Git.Settings"> | ||
42 | + <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/render_server_react_native" /> | ||
43 | + </component> | ||
44 | + <component name="ProjectId" id="1baLVrrFUlmMeeq9EFLzndP0zML" /> | ||
45 | + <component name="ProjectLevelVcsManager" settingsEditedManually="true"> | ||
46 | + <ConfirmationsSetting value="2" id="Add" /> | ||
47 | + </component> | ||
48 | + <component name="ProjectViewState"> | ||
49 | + <option name="hideEmptyMiddlePackages" value="true" /> | ||
50 | + <option name="showExcludedFiles" value="true" /> | ||
51 | + <option name="showLibraryContents" value="true" /> | ||
52 | + </component> | ||
53 | + <component name="PropertiesComponent"> | ||
54 | + <property name="ASKED_ADD_EXTERNAL_FILES" value="true" /> | ||
55 | + <property name="RunOnceActivity.ShowReadmeOnStart" value="true" /> | ||
56 | + <property name="WebServerToolWindowFactoryState" value="false" /> | ||
57 | + <property name="last_opened_file_path" value="$PROJECT_DIR$" /> | ||
58 | + <property name="nodejs_package_manager_path" value="npm" /> | ||
59 | + </component> | ||
60 | + <component name="RecentsManager"> | ||
61 | + <key name="CopyFile.RECENT_KEYS"> | ||
62 | + <recent name="$PROJECT_DIR$/user_and_post_server" /> | ||
63 | + <recent name="$PROJECT_DIR$" /> | ||
64 | + <recent name="$PROJECT_DIR$/my-project/sagas" /> | ||
65 | + <recent name="$PROJECT_DIR$/my-project/reducers" /> | ||
66 | + </key> | ||
67 | + </component> | ||
68 | + <component name="SvnConfiguration"> | ||
69 | + <configuration /> | ||
70 | + </component> | ||
71 | + <component name="TaskManager"> | ||
72 | + <task active="true" id="Default" summary="Default task"> | ||
73 | + <changelist id="940f1aa2-9848-4abc-bd75-a3db12d9e8e1" name="Default Changelist" comment="" /> | ||
74 | + <created>1588865284571</created> | ||
75 | + <option name="number" value="Default" /> | ||
76 | + <option name="presentableId" value="Default" /> | ||
77 | + <updated>1588865284571</updated> | ||
78 | + <workItem from="1588865285717" duration="748000" /> | ||
79 | + <workItem from="1588875642765" duration="2528000" /> | ||
80 | + <workItem from="1588878826886" duration="6053000" /> | ||
81 | + <workItem from="1588919313007" duration="576000" /> | ||
82 | + <workItem from="1589357475573" duration="2335000" /> | ||
83 | + <workItem from="1589800232399" duration="230000" /> | ||
84 | + <workItem from="1589865778893" duration="5143000" /> | ||
85 | + <workItem from="1589960196464" duration="11230000" /> | ||
86 | + <workItem from="1590036154083" duration="405000" /> | ||
87 | + <workItem from="1590039473513" duration="2083000" /> | ||
88 | + <workItem from="1590082072338" duration="1708000" /> | ||
89 | + <workItem from="1590302730003" duration="745000" /> | ||
90 | + <workItem from="1590304674918" duration="364000" /> | ||
91 | + <workItem from="1590305558438" duration="34000" /> | ||
92 | + <workItem from="1590392477108" duration="7362000" /> | ||
93 | + <workItem from="1590405423629" duration="8216000" /> | ||
94 | + </task> | ||
95 | + <servers /> | ||
96 | + </component> | ||
97 | + <component name="TypeScriptGeneratedFilesManager"> | ||
98 | + <option name="version" value="1" /> | ||
99 | + </component> | ||
100 | + <component name="VcsManagerConfiguration"> | ||
101 | + <option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" /> | ||
102 | + </component> | ||
103 | + <component name="WindowStateProjectService"> | ||
104 | + <state x="368" y="125" key="#com.intellij.execution.impl.EditConfigurationsDialog" timestamp="1590082196823"> | ||
105 | + <screen x="0" y="23" width="1440" height="877" /> | ||
106 | + </state> | ||
107 | + <state x="368" y="125" key="#com.intellij.execution.impl.EditConfigurationsDialog/0.23.1440.877@0.23.1440.877" timestamp="1590082196823" /> | ||
108 | + <state x="710" y="271" key="#com.intellij.fileTypes.FileTypeChooser" timestamp="1588881921466"> | ||
109 | + <screen x="0" y="23" width="1440" height="877" /> | ||
110 | + </state> | ||
111 | + <state x="710" y="271" key="#com.intellij.fileTypes.FileTypeChooser/0.23.1440.877@0.23.1440.877" timestamp="1588881921466" /> | ||
112 | + <state width="784" height="229" key="GridCell.Tab.0.bottom" timestamp="1588878772214"> | ||
113 | + <screen x="0" y="23" width="1440" height="877" /> | ||
114 | + </state> | ||
115 | + <state width="784" height="229" key="GridCell.Tab.0.bottom/0.23.1440.877@0.23.1440.877" timestamp="1588878772214" /> | ||
116 | + <state width="784" height="229" key="GridCell.Tab.0.center" timestamp="1588878772213"> | ||
117 | + <screen x="0" y="23" width="1440" height="877" /> | ||
118 | + </state> | ||
119 | + <state width="784" height="229" key="GridCell.Tab.0.center/0.23.1440.877@0.23.1440.877" timestamp="1588878772213" /> | ||
120 | + <state width="784" height="229" key="GridCell.Tab.0.left" timestamp="1588878772212"> | ||
121 | + <screen x="0" y="23" width="1440" height="877" /> | ||
122 | + </state> | ||
123 | + <state width="784" height="229" key="GridCell.Tab.0.left/0.23.1440.877@0.23.1440.877" timestamp="1588878772212" /> | ||
124 | + <state width="784" height="229" key="GridCell.Tab.0.right" timestamp="1588878772213"> | ||
125 | + <screen x="0" y="23" width="1440" height="877" /> | ||
126 | + </state> | ||
127 | + <state width="784" height="229" key="GridCell.Tab.0.right/0.23.1440.877@0.23.1440.877" timestamp="1588878772213" /> | ||
128 | + <state x="702" y="213" width="670" height="676" key="search.everywhere.popup" timestamp="1588882527475"> | ||
129 | + <screen x="0" y="23" width="1440" height="877" /> | ||
130 | + </state> | ||
131 | + <state x="702" y="213" width="670" height="676" key="search.everywhere.popup/0.23.1440.877@0.23.1440.877" timestamp="1588882527475" /> | ||
132 | + <state x="767" y="383" key="vcs.readOnlyHandler.ReadOnlyStatusDialog" timestamp="1588882053803"> | ||
133 | + <screen x="0" y="23" width="1440" height="877" /> | ||
134 | + </state> | ||
135 | + <state x="767" y="383" key="vcs.readOnlyHandler.ReadOnlyStatusDialog/0.23.1440.877@0.23.1440.877" timestamp="1588882053803" /> | ||
136 | + </component> | ||
137 | + <component name="XDebuggerManager"> | ||
138 | + <breakpoint-manager> | ||
139 | + <breakpoints> | ||
140 | + <line-breakpoint enabled="true" type="javascript"> | ||
141 | + <url>file://$PROJECT_DIR$/my-project/screens/HomeScreen.js</url> | ||
142 | + <option name="timeStamp" value="1" /> | ||
143 | + </line-breakpoint> | ||
144 | + </breakpoints> | ||
145 | + </breakpoint-manager> | ||
146 | + </component> | ||
147 | +</project> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +import React, {useState, useEffect} from 'react'; | ||
2 | +import MapView, {Marker} from 'react-native-maps'; | ||
3 | +import {StyleSheet, Text, TextInput, View, TouchableOpacity} from 'react-native'; | ||
4 | +import screen from '../constants/layout'; | ||
5 | +import {useSelector, useDispatch} from "react-redux"; | ||
6 | +import * as Location from 'expo-location'; | ||
7 | +import {set} from "react-native-reanimated"; | ||
8 | +import {MaterialCommunityIcons} from "@expo/vector-icons"; | ||
9 | +import {SET_LOC_REQUEST} from "../reducers/location"; | ||
10 | + | ||
11 | + | ||
12 | +const StartAndFinishLocationComponent = () => { | ||
13 | + const [hasPermission, setHasPermission] = useState(false); | ||
14 | + const [startTextLocation, setStartTextLocation] = useState(''); | ||
15 | + const [finishTextLocation, setFinishTextLocation] = useState(''); | ||
16 | + const [userLocation, setUserLocation] = useState(null); | ||
17 | + | ||
18 | + const onChangeStartLocation = async (startTextLocation) => { | ||
19 | + setStartTextLocation(startTextLocation); | ||
20 | + }; | ||
21 | + | ||
22 | + const onChangeFinishLocation = (finishTextLocation) => { | ||
23 | + setFinishTextLocation(finishTextLocation); | ||
24 | + }; | ||
25 | + | ||
26 | + const dispatch = useDispatch(); | ||
27 | + const setLocation = async () => { | ||
28 | + if (!startTextLocation || !finishTextLocation) { | ||
29 | + return | ||
30 | + } | ||
31 | + console.log(startTextLocation, finishTextLocation); | ||
32 | + await dispatch({ | ||
33 | + type: SET_LOC_REQUEST, | ||
34 | + data: { | ||
35 | + startTextLocation, | ||
36 | + finishTextLocation | ||
37 | + } | ||
38 | + } | ||
39 | + ) | ||
40 | + | ||
41 | + }; | ||
42 | + | ||
43 | + return ( | ||
44 | + <View style={styles.container}> | ||
45 | + <View style={styles.input}> | ||
46 | + <Text style={styles.textStyle}>출발지</Text> | ||
47 | + <TextInput | ||
48 | + style={styles.inputText} | ||
49 | + onChangeText={onChangeStartLocation} | ||
50 | + /> | ||
51 | + <TouchableOpacity> | ||
52 | + <MaterialCommunityIcons color={'grey'} name={'map-marker'} size={30}/> | ||
53 | + </TouchableOpacity> | ||
54 | + | ||
55 | + </View> | ||
56 | + <View style={styles.input}> | ||
57 | + <Text style={styles.textStyle}>도착지</Text> | ||
58 | + <TextInput | ||
59 | + style={styles.inputText} | ||
60 | + onChangeText={onChangeFinishLocation} | ||
61 | + /> | ||
62 | + </View> | ||
63 | + <View style={{flexDirection: 'row'}}> | ||
64 | + <TouchableOpacity style={styles.buttonStyle} onPress={setLocation}> | ||
65 | + <Text>MAP설정</Text> | ||
66 | + </TouchableOpacity> | ||
67 | + <TouchableOpacity style={styles.buttonStyle}> | ||
68 | + <Text>사용자최적경로검색</Text> | ||
69 | + </TouchableOpacity> | ||
70 | + </View> | ||
71 | + </View> | ||
72 | + ) | ||
73 | +}; | ||
74 | + | ||
75 | +export default StartAndFinishLocationComponent; | ||
76 | + | ||
77 | +const styles = StyleSheet.create({ | ||
78 | + container: { | ||
79 | + marginLeft: 20, | ||
80 | + marginRight: 20, | ||
81 | + }, | ||
82 | + input: { | ||
83 | + borderRadius: 10, | ||
84 | + backgroundColor: 'lightgrey', | ||
85 | + paddingLeft: 10, | ||
86 | + paddingRight: 10, | ||
87 | + width: 300, | ||
88 | + height: 40, | ||
89 | + alignItems: 'center', | ||
90 | + flexDirection: 'row', | ||
91 | + justifyContent: 'space-between', | ||
92 | + borderBottomColor: '#bbb', | ||
93 | + marginBottom: 10 | ||
94 | + // borderBottomWidth: StyleSheet.hairlineWidth, | ||
95 | + }, | ||
96 | + inputText: { | ||
97 | + flex: 1, | ||
98 | + }, | ||
99 | + textStyle: { | ||
100 | + fontWeight: 'bold', | ||
101 | + fontSize: 17, | ||
102 | + marginRight: 15, | ||
103 | + }, | ||
104 | + buttonStyle: { | ||
105 | + flex: 1, | ||
106 | + backgroundColor: '#ecf0f1', | ||
107 | + alignItems: 'center', | ||
108 | + justifyContent: 'center', | ||
109 | + width: 30, | ||
110 | + height: 30, | ||
111 | + borderWidth: 1, | ||
112 | + borderColor: 'black', | ||
113 | + marginBottom: 20 | ||
114 | + | ||
115 | + } | ||
116 | +}); |
This diff could not be displayed because it is too large.
... | @@ -17,6 +17,7 @@ | ... | @@ -17,6 +17,7 @@ |
17 | "expo-asset": "^8.1.4", | 17 | "expo-asset": "^8.1.4", |
18 | "expo-camera": "~8.2.0", | 18 | "expo-camera": "~8.2.0", |
19 | "expo-font": "^8.1.1", | 19 | "expo-font": "^8.1.1", |
20 | + "expo-location": "~8.1.0", | ||
20 | "expo-media-library": "~8.1.0", | 21 | "expo-media-library": "~8.1.0", |
21 | "expo-permissions": "~8.1.0", | 22 | "expo-permissions": "~8.1.0", |
22 | "expo-web-browser": "^8.2.1", | 23 | "expo-web-browser": "^8.2.1", | ... | ... |
1 | import {combineReducers} from "redux"; | 1 | import {combineReducers} from "redux"; |
2 | import user from './user'; | 2 | import user from './user'; |
3 | -// import post from './post'; | 3 | +import location from './location'; |
4 | 4 | ||
5 | const rootReducer = combineReducers({ | 5 | const rootReducer = combineReducers({ |
6 | user, | 6 | user, |
7 | - // post | 7 | + location |
8 | }); | 8 | }); |
9 | 9 | ||
10 | export default rootReducer; | 10 | export default rootReducer; |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
1 | +export const initialState = { | ||
2 | + startLocation: null, | ||
3 | + finishLocation: null, | ||
4 | + | ||
5 | + settingLocation: false, | ||
6 | + | ||
7 | + info: '', | ||
8 | +}; | ||
9 | + | ||
10 | +export const SET_LOC_REQUEST = 'SET_LOC_REQUEST'; | ||
11 | +export const SET_LOC_SUCCESS = 'SET_LOC_SUCCESS'; | ||
12 | +export const SET_LOC_FAILURE = 'SET_LOC_FAILURE'; | ||
13 | + | ||
14 | +export default (state = initialState, action) => { | ||
15 | + switch (action.type) { | ||
16 | + | ||
17 | + case SET_LOC_REQUEST: { | ||
18 | + return { | ||
19 | + ...state, | ||
20 | + settingLocation: true, | ||
21 | + } | ||
22 | + } | ||
23 | + | ||
24 | + case SET_LOC_SUCCESS: { | ||
25 | + const {startLocation, finishLocation} = action.data; | ||
26 | + return { | ||
27 | + ...state, | ||
28 | + startLocation, | ||
29 | + finishLocation, | ||
30 | + isLoggingIn: false, | ||
31 | + }; | ||
32 | + } | ||
33 | + | ||
34 | + case SET_LOC_FAILURE: { | ||
35 | + const {info} = action.data; | ||
36 | + return { | ||
37 | + ...state, | ||
38 | + settingLocation: false, | ||
39 | + info, | ||
40 | + } | ||
41 | + } | ||
42 | + | ||
43 | + default: { | ||
44 | + return { | ||
45 | + ...state, | ||
46 | + }; | ||
47 | + } | ||
48 | + } | ||
49 | +}; | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
File mode changed
1 | import {all, fork} from 'redux-saga/effects'; | 1 | import {all, fork} from 'redux-saga/effects'; |
2 | 2 | ||
3 | import user from './user'; | 3 | import user from './user'; |
4 | -// import post from './post'; | 4 | +import location from './location'; |
5 | 5 | ||
6 | -export default function* rootSaga(){ | 6 | +export default function* rootSaga() { |
7 | yield all([ | 7 | yield all([ |
8 | fork(user), | 8 | fork(user), |
9 | - // fork(post) | 9 | + fork(location), |
10 | ]) | 10 | ]) |
11 | } | 11 | } |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
1 | +import {all, call, fork, delay, put, takeEvery, takeLatest} from 'redux-saga/effects'; | ||
2 | +import axios from 'axios'; | ||
3 | +import {coordAPIKEY} from '../env'; | ||
4 | +import { | ||
5 | + SET_LOC_REQUEST, | ||
6 | + SET_LOC_SUCCESS, | ||
7 | + SET_LOC_FAILURE, | ||
8 | +} from "../reducers/location"; | ||
9 | + | ||
10 | +function setLocationAPI(data) { | ||
11 | + const {startTextLocation, finishTextLocation} = data; | ||
12 | + console.log(startTextLocation, finishTextLocation); | ||
13 | + const startRes = axios.get(`http://api.vworld.kr/req/address?service=address&request=getcoord&version=2.0&crs=epsg:4326&address=${startTextLocation}&refine=true&simple=false&format=xml&type=road&key=${coordAPIKEY}`); | ||
14 | + const finishRes = axios.get(`http://api.vworld.kr/req/address?service=address&request=getcoord&version=2.0&crs=epsg:4326&address=${finishTextLocation}&refine=true&simple=false&format=xml&type=road&key=${coordAPIKEY}`); | ||
15 | + | ||
16 | + return {startRes, finishRes}; | ||
17 | +} | ||
18 | + | ||
19 | + | ||
20 | +function* setLocation(action) { | ||
21 | + try { | ||
22 | + console.log('saga의 setLocation', action.data); | ||
23 | + const res = yield call(setLocationAPI, action.data); | ||
24 | + console.log(res.startRes, res.finishRes); | ||
25 | + const {result} = res.startRes; | ||
26 | + console.log(result); | ||
27 | + } catch (e) { | ||
28 | + console.error(e); | ||
29 | + } | ||
30 | +}; | ||
31 | + | ||
32 | +function* watchSetLocation() { | ||
33 | + console.log('watchSetLocation'); | ||
34 | + yield takeLatest(SET_LOC_REQUEST, setLocation); | ||
35 | +} | ||
36 | + | ||
37 | +export default function* locationSaga() { | ||
38 | + yield all([ | ||
39 | + fork(watchSetLocation), | ||
40 | + ]); | ||
41 | +}; | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
File mode changed
... | @@ -37,6 +37,9 @@ function loginAPI(data) { | ... | @@ -37,6 +37,9 @@ function loginAPI(data) { |
37 | const {email, password} = data; | 37 | const {email, password} = data; |
38 | console.log(email, password); | 38 | console.log(email, password); |
39 | console.log(`http://${host}:4001/user/login`); | 39 | console.log(`http://${host}:4001/user/login`); |
40 | + // const res1 = axios.get(`http://${host}:4001/user/test`, { | ||
41 | + // withCredentials: true | ||
42 | + // }); | ||
40 | return axios.post(`http://${host}:4001/user/login`, { | 43 | return axios.post(`http://${host}:4001/user/login`, { |
41 | email, password | 44 | email, password |
42 | }, { | 45 | }, { | ... | ... |
1 | -import React from 'react'; | 1 | +import React, {useState, useEffect} from 'react'; |
2 | -import MapView from 'react-native-maps'; | 2 | +import MapView, {Marker} from 'react-native-maps'; |
3 | import {StyleSheet, Text, View, Dimensions} from 'react-native'; | 3 | import {StyleSheet, Text, View, Dimensions} from 'react-native'; |
4 | import screen from '../constants/layout'; | 4 | import screen from '../constants/layout'; |
5 | +import StartAndFinishLocationComponent from "../components/CurrentUserLocationComponent"; | ||
5 | 6 | ||
6 | 7 | ||
7 | const Maps = () => { | 8 | const Maps = () => { |
9 | + const [initialRegion, setInitialRegion] = useState( | ||
10 | + { | ||
11 | + latitude: 37.56647, | ||
12 | + longitude: 126.977963, | ||
13 | + latitudeDelta: 0.3922, | ||
14 | + longitudeDelta: 0.3421 | ||
15 | + }); | ||
16 | + | ||
8 | return ( | 17 | return ( |
9 | <View style={styles.container}> | 18 | <View style={styles.container}> |
19 | + <Text style={styles.textStyle}>Current User Location</Text> | ||
20 | + <StartAndFinishLocationComponent/> | ||
10 | <MapView | 21 | <MapView |
11 | style={styles.mapStyle} | 22 | style={styles.mapStyle} |
12 | - initialRegion={{ | 23 | + initialRegion={initialRegion} |
13 | - latitude: 37.78825, | 24 | + > |
14 | - longitude: -122.4324, | 25 | + <Marker |
15 | - latitudeDelta: 0.0922, | 26 | + coordinate={initialRegion} |
16 | - longitudeDelta: 0.0421 | 27 | + title="this is a marker" |
17 | - }} | 28 | + description="this is a marker example"> |
18 | - /> | 29 | + </Marker> |
30 | + | ||
31 | + </MapView> | ||
19 | </View> | 32 | </View> |
20 | ) | 33 | ) |
21 | }; | 34 | }; |
... | @@ -32,4 +45,10 @@ const styles = StyleSheet.create({ | ... | @@ -32,4 +45,10 @@ const styles = StyleSheet.create({ |
32 | width: screen.width, | 45 | width: screen.width, |
33 | height: screen.height / 2, | 46 | height: screen.height / 2, |
34 | }, | 47 | }, |
48 | + textStyle: { | ||
49 | + fontWeight: 'bold', | ||
50 | + fontSize: 20, | ||
51 | + color: 'grey', | ||
52 | + marginBottom: 20, | ||
53 | + } | ||
35 | }); | 54 | }); | ... | ... |
code/user_and_post_server/.gitignore
0 → 100644
1 | +node_modules/ |
1 | { | 1 | { |
2 | "development": { | 2 | "development": { |
3 | "username": "root", | 3 | "username": "root", |
4 | - "password": "test", | 4 | + "password": "ksy98042!", |
5 | "database": "capstone_design_prj1", | 5 | "database": "capstone_design_prj1", |
6 | "host": "127.0.0.1", | 6 | "host": "127.0.0.1", |
7 | "dialect": "mysql", | 7 | "dialect": "mysql", | ... | ... |
code/user_and_post_server/crawling.js
0 → 100644
1 | +function printSearchType(result) { | ||
2 | + if (result.result.searchType == 0) { | ||
3 | + console.log("도시내 이동"); | ||
4 | + } else if (result.result.searchType == 1) { | ||
5 | + console.log("도시간 직통"); | ||
6 | + } else { | ||
7 | + console.log("도시간 환승"); | ||
8 | + } | ||
9 | +} | ||
10 | + | ||
11 | +function printBusCount(result) { | ||
12 | + console.log("버스 결과 개수:", result.result.busCount); | ||
13 | +} | ||
14 | + | ||
15 | +function printSubwayCount(result) { | ||
16 | + console.log("지하철 결과 개수 :", result.result.subwayCount); | ||
17 | +} | ||
18 | + | ||
19 | +function printSubwayBusCount(result) { | ||
20 | + console.log("버스 + 지하철 결과 개수 : ", result.result.subwayBusCount); | ||
21 | +} | ||
22 | + | ||
23 | +function printPointDistance(result) { | ||
24 | + console.log("출발점-도착점 직선 거리 :", result.pointDistance); | ||
25 | +} | ||
26 | + | ||
27 | +function printPathType(info) { | ||
28 | + if (info.pathType == 1) { | ||
29 | + console.log("지하철"); | ||
30 | + } else if (info.pathType == 2) { | ||
31 | + console.log("버스"); | ||
32 | + } else if (info.pathType == 3) { | ||
33 | + console.log("지하철 + 버스"); | ||
34 | + } | ||
35 | +} | ||
36 | + | ||
37 | +function printTrafficDistance(info) { | ||
38 | + console.log("대중교통 이동거리: ", info.trafficDistance); | ||
39 | +} | ||
40 | + | ||
41 | +function printTotalWalk(info) { | ||
42 | + console.log("도보 이동거리 : ", info.totalWalk); | ||
43 | +} | ||
44 | + | ||
45 | +function printTotalTime(info) { | ||
46 | + console.log("총 소요시간 : ", info.totalTime); | ||
47 | +} | ||
48 | + | ||
49 | +function printBusTransitCount(info) { | ||
50 | + console.log("버스 환승 :", info.busTransitCount, "회"); | ||
51 | +} | ||
52 | + | ||
53 | +function printSubwayTransitCount(info) { | ||
54 | + console.log("지하철 환승 :", info.subwayTransit, "회"); | ||
55 | +} | ||
56 | + | ||
57 | +function printFirstStartStation(info) { | ||
58 | + console.log("최초 출발 역(정류소) : ", info.firstStartStation); | ||
59 | +} | ||
60 | + | ||
61 | +function printLastEndStation(info) { | ||
62 | + console.log("최종 도착 역(정류소) : ", info.lastEndStation); | ||
63 | +} | ||
64 | + | ||
65 | +function printBusStationCount(info) { | ||
66 | + console.log(info.busStationCount, "개 정류소 이동"); | ||
67 | +} | ||
68 | + | ||
69 | +function printSubwayStationCount(info) { | ||
70 | + console.log(info.subwayStationCount, "개 역 이동"); | ||
71 | +} | ||
72 | + | ||
73 | +function printPath(path) { | ||
74 | + printPathType(path); | ||
75 | + printTrafficDistance(path); | ||
76 | + printTotalWalk(path); | ||
77 | + printTotalTime(path); | ||
78 | + printBusTransitCount(path); | ||
79 | + printSubwayTransitCount(path); | ||
80 | + printFirstStartStation(path); | ||
81 | + printLastEndStation(path); | ||
82 | + if (path.pathType == 1) { | ||
83 | + printSubwayStationCount(path); | ||
84 | + } else if (path.pathType == 2) { | ||
85 | + printBusStationCount(path); | ||
86 | + } else { | ||
87 | + printBusStationCount(path); | ||
88 | + printSubwayStationCount(path); | ||
89 | + | ||
90 | + } | ||
91 | +} | ||
92 | + | ||
93 | +function printSubPath(subPath) { | ||
94 | + if (subPath.trafficType == 1) { | ||
95 | + console.log("지하철이용"); | ||
96 | + console.log("이동거리 : ", subPath.distance); | ||
97 | + console.log("이동 소요시간 : ", subPath.sectionTime); | ||
98 | + console.log(subPath.stationCount, "개의 역 이동"); | ||
99 | + console.log(subPath.startName, "에서 승차"); | ||
100 | + //startX | ||
101 | + //startY | ||
102 | + console.log("승차역 id : ", subPath.startID); | ||
103 | + console.log(subPath.endName, "에서 하차"); | ||
104 | + //endX | ||
105 | + //endY | ||
106 | + console.log("하차역 id : ", subPath.endID); | ||
107 | + printSubwayLane(subPath); | ||
108 | + printPassStopList(subPath); | ||
109 | + } else if (subPath.trafficType == 2) { | ||
110 | + console.log("버스 이용"); | ||
111 | + console.log("이동거리 : ", subPath.distance); | ||
112 | + console.log("이동 소요시간 : ", subPath.sectionTime); | ||
113 | + console.log("이동 정거장수 :", subPath.stationCount); | ||
114 | + console.log(subPath.startName, "에서 승차"); | ||
115 | + console.log("승차 정류쟝 id : ", subPath.startID); | ||
116 | + console.log(subPath.endName, "에서 하차"); | ||
117 | + console.log("하차 정류장 id : ", subPath.endID); | ||
118 | + printBusLane(subPath); | ||
119 | + printPassStopList(subPath); | ||
120 | + | ||
121 | + } else { | ||
122 | + console.log("도보 이용"); | ||
123 | + console.log("이동 거리 : ", subPath.distance); | ||
124 | + console.log("이동 소요시간 : ", subPath.sectionTime); | ||
125 | + } | ||
126 | +} | ||
127 | + | ||
128 | +function printBusNumber(lane) { | ||
129 | + console.log("버스 번호 : ", lane.busNo); | ||
130 | + | ||
131 | +} | ||
132 | + | ||
133 | +function printBusID(lane) { | ||
134 | + console.log("버스 id : ", lane.busID); | ||
135 | +} | ||
136 | + | ||
137 | +function printBusLane(subPath) { | ||
138 | + console.log("===========Bus=lane============"); | ||
139 | + console.log(subPath.lane.length, "개의 버스 이용가능"); | ||
140 | + for (var i = 0; i < subPath.lane.length; i++) { | ||
141 | + console.log(i + 1, "번째 버스") | ||
142 | + printBusNumber(subPath.lane[i]); | ||
143 | + printBusID(subPath.lane[i]); | ||
144 | + console.log("-------------------------"); | ||
145 | + } | ||
146 | +} | ||
147 | + | ||
148 | +function printSubwayLane(subPath) { | ||
149 | + console.log("===========Subway=lane============"); | ||
150 | + console.log(subPath.lane.length, "개의 지하철 이용가능"); | ||
151 | + for (var i = 0; i < subPath.lane.length; i++) { | ||
152 | + console.log(i + 1, "번째 지하철") | ||
153 | + console.log(subPath.lane[i]); | ||
154 | + console.log("-------------------------"); | ||
155 | + } | ||
156 | +} | ||
157 | + | ||
158 | +function printStations(station) { | ||
159 | + console.log(" || "); | ||
160 | + console.log(station.index, "번째 정류쟝"); | ||
161 | + console.log("정류쟝 id:", station.stationID);//=======>>>>>>실시간 API가져오기!!! | ||
162 | + console.log(station.stationName); | ||
163 | + console.log(" || "); | ||
164 | +} | ||
165 | + | ||
166 | +function printPassStopList(subPath) { | ||
167 | + console.log("=====경로 확인======="); | ||
168 | + for (var i = 0; i < subPath.passStopList.stations.length; i++) { | ||
169 | + printStations(subPath.passStopList.stations[i]); | ||
170 | + } | ||
171 | + | ||
172 | +} | ||
173 | + | ||
174 | +function printTotalCount(result) { | ||
175 | + console.log(result.totalCount, "개의 경로 존재"); | ||
176 | +} | ||
177 | + | ||
178 | +function printTrainCount(result) { | ||
179 | + console.log("============기 차 이 용=================") | ||
180 | + console.log("기차 탐색 결과 개수 : ", result.trainRequest.count); | ||
181 | +} | ||
182 | + | ||
183 | +function printOBJ(obj) { | ||
184 | + console.log("출발역 :", obj.startSTN, ",id :", obj.startID); | ||
185 | + //obj.SX | ||
186 | + //obj.SY | ||
187 | + console.log("도착역 :", obj.endSTN, ", id :", obj.endID); | ||
188 | + //obj.EX | ||
189 | + //obj.EY | ||
190 | + console.log(obj.trainType); | ||
191 | + //obj.trainCode | ||
192 | + //obj.mapOBJ | ||
193 | + console.log("소요 시간 :", obj.time); | ||
194 | + console.log("요금 :", obj.payment); | ||
195 | +} | ||
196 | + | ||
197 | +function printExBusCount(result) { | ||
198 | + console.log("==========고 속 버 스 이 용===========") | ||
199 | + console.log("고속 버스 탐색 결과 개수 : ", result.exBusRequest.count); | ||
200 | +} | ||
201 | + | ||
202 | +function printOutBusCount(result) { | ||
203 | + console.log("==========시 외 버 스 이 용===========") | ||
204 | + console.log("시외 버스 탐색 결과 개수 : ", result.outBusRequest.count); | ||
205 | +} | ||
206 | + | ||
207 | +function searchPubTransPathAJAX() { | ||
208 | + console.log('hihihihih'); | ||
209 | + var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; | ||
210 | + | ||
211 | + var xhr = new XMLHttpRequest(); | ||
212 | + //var url = "https://api.odsay.com/v1/api/searchPubTransPath?SX=126.9027279&SY=37.5349277&EX=126.9145430&EY=37.5499421&apiKey=xGDjn0UBwQ%2FazbcOasoxEs4gIcLqCBEgCFMT%2BJeVKcI"; | ||
213 | + var SX = 127.077001; //경희대학교 우정원 x좌표 | ||
214 | + var SY = 37.246214;//경희대학교 우정원 y좌표 | ||
215 | + var EX = 126.999472;//영통역 x좌표 | ||
216 | + var EY = 37.266670;//영통역 y좌표 | ||
217 | + var apiKey = "%2B6RMVoSKSHcru1NjEu194wRELD7wnalJG7JDY0mc2AE"; | ||
218 | + var url = "https://api.odsay.com/v1/api/searchPubTransPath?SX=" + SX + "&SY=" + SY + "&EX=" + EX + "&EY=" + EY + "&apiKey=" + apiKey; | ||
219 | + xhr.open("GET", url, true); | ||
220 | + xhr.send(); | ||
221 | + xhr.onreadystatechange = function () { | ||
222 | + | ||
223 | + if (xhr.readyState == 4 && xhr.status == 200) { | ||
224 | + var result = JSON.parse(xhr.responseText); | ||
225 | + //console.log(xhr.responseText); | ||
226 | + | ||
227 | + if (result.result.searchType == 0) { //한 도시내에서 이동 | ||
228 | + | ||
229 | + var totalPathSummary = new Object();//json 객체로 저장 | ||
230 | + totalPathSummary.searchType = result.result.searchType; | ||
231 | + totalPathSummary.busCount = result.result.busCount; | ||
232 | + totalPathSummary.subwayCount = result.result.subwayCount; | ||
233 | + totalPathSummary.pointDistance = result.result.pointDistance; | ||
234 | + | ||
235 | + totalPathSummary = JSON.stringify(totalPathSummary); | ||
236 | + //console.log(totalPathSummary); | ||
237 | + | ||
238 | + console.log("도시내 이동"); | ||
239 | + printBusCount(result); | ||
240 | + printSubwayCount(result); | ||
241 | + printSubwayBusCount(result); | ||
242 | + printPointDistance(result); | ||
243 | + | ||
244 | + | ||
245 | + var pathList = new Array(); | ||
246 | + | ||
247 | + for (var i = 0; i < result.result.path.length; i++) { | ||
248 | + console.log("-----------------new 경로------------------------------"); | ||
249 | + console.log(i + 1, "번째 경로"); | ||
250 | + | ||
251 | + var path = new Object(); | ||
252 | + path.pathType = result.result.path[i].pathType; | ||
253 | + path.info = result.result.path[i].info; | ||
254 | + path.subPathList = new Array(); | ||
255 | + printPath(result.result.path[i].info); | ||
256 | + | ||
257 | + | ||
258 | + for (var j = 0; j < result.result.path[i].subPath.length; j++) { | ||
259 | + console.log("---------------"); | ||
260 | + var subPath = new Object(); | ||
261 | + subPath = result.result.path[i].subPath; | ||
262 | + path.subPathList.push(subPath); | ||
263 | + printSubPath(result.result.path[i].subPath[j]); | ||
264 | + } | ||
265 | + pathList.push(path); | ||
266 | + console.log("--------------------경로 끝---------------------------"); | ||
267 | + | ||
268 | + | ||
269 | + } | ||
270 | + pathList = JSON.stringify(pathList); | ||
271 | + //console.log(pathList); | ||
272 | + | ||
273 | + } else if (result.result.searchType == 1) {//도시간 이동 | ||
274 | + //console.log(result.result); | ||
275 | + console.log("도시 간 이동"); | ||
276 | + var totalPathSummary = new Object(); | ||
277 | + totalPathSummary.startCityName = result.result.startCityName; | ||
278 | + totalPathSummary.startCID = result.result.startCID; | ||
279 | + totalPathSummary.endCityName = result.result.endCityName; | ||
280 | + totalPathSummary.endCID = result.result.endCID; | ||
281 | + totalPathSummary.pointDistance = result.result.pointDistance; | ||
282 | + totalPathSummary.totalCount = result.result.totalCount; | ||
283 | + | ||
284 | + totalPathSummary = JSON.stringify(totalPathSummary); | ||
285 | + //console.log(totalPathSummary); | ||
286 | + m | ||
287 | + console.log("출발 도시:", result.result.startCityName); | ||
288 | + console.log("도착 도시:", result.result.endCityName); | ||
289 | + printPointDistance(result.result); | ||
290 | + printTotalCount(result.result); | ||
291 | + printTrainCount(result.result);//기차 이용 | ||
292 | + | ||
293 | + var trainList = new Array();//기차이용 | ||
294 | + | ||
295 | + for (var i = 0; i < result.result.trainRequest.count; i++) { | ||
296 | + var OBJ = new Object(); | ||
297 | + OBJ = result.result.trainRequest.OBJ[i]; | ||
298 | + OBJList.push(OBJ); | ||
299 | + console.log("============", i + 1, "============"); | ||
300 | + printOBJ(result.result.trainRequest.OBJ[i]); | ||
301 | + } | ||
302 | + trainList = JSON.stringify(trainList); | ||
303 | + | ||
304 | + var exBusList = new Array(); | ||
305 | + printExBusCount(result.result); //고속버스 이용 | ||
306 | + for (var i = 0; i < result.result.exBusRequest.count; i++) { | ||
307 | + var OBJ = new Object(); | ||
308 | + OBJ = result.result.exBusRequest.OBJ[i]; | ||
309 | + OBJList.push(OBJ); | ||
310 | + console.log("============", i + 1, "============"); | ||
311 | + printOBJ(result.result.exBusRequest.OBJ[i]); | ||
312 | + } | ||
313 | + exBusList = JSON.stringify(exBusList); | ||
314 | + | ||
315 | + var outBusList = new Array(); | ||
316 | + printOutBusCount(result.result);//시외 버스 이용 | ||
317 | + for (var i = 0; i < result.result.outBusRequest.count; i++) { | ||
318 | + var OBJ = new Object(); | ||
319 | + OBJ = result.result.outBusRequest.OBJ[i]; | ||
320 | + outBusList.push(OBJ); | ||
321 | + console.log("============", i + 1, "============"); | ||
322 | + printOBJ(result.result.outBusRequest.OBJ[i]); | ||
323 | + } | ||
324 | + outBusList = JSON.stringify(outBusList); | ||
325 | + } | ||
326 | + } | ||
327 | + }; | ||
328 | +} | ||
329 | + | ||
330 | +module.exports = {searchPubTransPathAJAX}; |
File moved
... | @@ -2587,9 +2587,9 @@ | ... | @@ -2587,9 +2587,9 @@ |
2587 | } | 2587 | } |
2588 | }, | 2588 | }, |
2589 | "needle": { | 2589 | "needle": { |
2590 | - "version": "2.4.1", | 2590 | + "version": "2.5.0", |
2591 | - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.1.tgz", | 2591 | + "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.0.tgz", |
2592 | - "integrity": "sha512-x/gi6ijr4B7fwl6WYL9FwlCvRQKGlUNvnceho8wxkwXqN8jvVmmmATTmZPRRG7b/yC1eode26C2HO9jl78Du9g==", | 2592 | + "integrity": "sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA==", |
2593 | "requires": { | 2593 | "requires": { |
2594 | "debug": "^3.2.6", | 2594 | "debug": "^3.2.6", |
2595 | "iconv-lite": "^0.4.4", | 2595 | "iconv-lite": "^0.4.4", |
... | @@ -4428,6 +4428,11 @@ | ... | @@ -4428,6 +4428,11 @@ |
4428 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", | 4428 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", |
4429 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" | 4429 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" |
4430 | }, | 4430 | }, |
4431 | + "xmlhttprequest": { | ||
4432 | + "version": "1.8.0", | ||
4433 | + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", | ||
4434 | + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" | ||
4435 | + }, | ||
4431 | "xmlhttprequest-ssl": { | 4436 | "xmlhttprequest-ssl": { |
4432 | "version": "1.5.5", | 4437 | "version": "1.5.5", |
4433 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", | 4438 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", | ... | ... |
... | @@ -30,6 +30,7 @@ | ... | @@ -30,6 +30,7 @@ |
30 | "pug": "2.0.0-beta11", | 30 | "pug": "2.0.0-beta11", |
31 | "sequelize": "^5.21.5", | 31 | "sequelize": "^5.21.5", |
32 | "sequelize-cli": "^5.5.1", | 32 | "sequelize-cli": "^5.5.1", |
33 | - "socket.io": "^2.3.0" | 33 | + "socket.io": "^2.3.0", |
34 | + "xmlhttprequest": "^1.8.0" | ||
34 | } | 35 | } |
35 | } | 36 | } | ... | ... |
File moved
... | @@ -4,9 +4,10 @@ const bcrypt = require('bcrypt'); | ... | @@ -4,9 +4,10 @@ const bcrypt = require('bcrypt'); |
4 | const passport = require('passport'); | 4 | const passport = require('passport'); |
5 | const {isLoggedIn, isNotLoggedIn} = require("./middleware"); | 5 | const {isLoggedIn, isNotLoggedIn} = require("./middleware"); |
6 | const models = require('../models/index'); | 6 | const models = require('../models/index'); |
7 | +const {searchPubTransPathAJAX} = require('../crawling'); | ||
7 | 8 | ||
8 | router.get('/loadMe', isLoggedIn, (req, res, next) => { | 9 | router.get('/loadMe', isLoggedIn, (req, res, next) => { |
9 | - console.log('loadMe요청옴', req.user); | 10 | + // console.log('loadMe요청옴', req.user); |
10 | return res.json({user: req.user}); | 11 | return res.json({user: req.user}); |
11 | }); | 12 | }); |
12 | 13 | ||
... | @@ -113,4 +114,8 @@ router.get('/logout', (req, res, next) => { | ... | @@ -113,4 +114,8 @@ router.get('/logout', (req, res, next) => { |
113 | return res.send(); | 114 | return res.send(); |
114 | }); | 115 | }); |
115 | 116 | ||
117 | +router.get('/test', (req, res, next) => { | ||
118 | + searchPubTransPathAJAX(); | ||
119 | +}); | ||
120 | + | ||
116 | module.exports = router; | 121 | module.exports = router; |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
-
Please register or login to post a comment