Showing
9 changed files
with
117 additions
and
33 deletions
1 | /*global kakao*/ | 1 | /*global kakao*/ |
2 | -import React, { useEffect, useState, Fragment } from "react"; | 2 | +import React, { useEffect, useState } from "react"; |
3 | -import { Input, Button, ButtonGroup } from "reactstrap"; | 3 | +import { Input, } from "reactstrap"; |
4 | -import { Label, CustomInput, Row, Col, FormGroup } from "reactstrap"; | 4 | +import { Label, Row, Col, FormGroup } from "reactstrap"; |
5 | import appKey from "../config/appKey.json"; | 5 | import appKey from "../config/appKey.json"; |
6 | 6 | ||
7 | const LandingMap = (props) => { | 7 | const LandingMap = (props) => { |
... | @@ -23,7 +23,6 @@ const LandingMap = (props) => { | ... | @@ -23,7 +23,6 @@ const LandingMap = (props) => { |
23 | document.head.appendChild(script); | 23 | document.head.appendChild(script); |
24 | 24 | ||
25 | script.onload = () => { | 25 | script.onload = () => { |
26 | - console.log(FDatas); | ||
27 | kakao.maps.load(() => { | 26 | kakao.maps.load(() => { |
28 | let container = document.getElementById("map"); | 27 | let container = document.getElementById("map"); |
29 | let options = { | 28 | let options = { |
... | @@ -111,12 +110,11 @@ const LandingMap = (props) => { | ... | @@ -111,12 +110,11 @@ const LandingMap = (props) => { |
111 | } | 110 | } |
112 | } | 111 | } |
113 | setFDatas(result); | 112 | setFDatas(result); |
114 | - }, [selectedOption]); | 113 | + }, [selectedOption, props]); |
115 | 114 | ||
116 | 115 | ||
117 | 116 | ||
118 | const handleOptionChange = (e) => { | 117 | const handleOptionChange = (e) => { |
119 | - console.log(e.target.value); | ||
120 | setselectedOption(e.target.value); | 118 | setselectedOption(e.target.value); |
121 | } | 119 | } |
122 | 120 | ... | ... |
... | @@ -10,12 +10,16 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" | ... | @@ -10,12 +10,16 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" |
10 | const MealCard = (props) => { | 10 | const MealCard = (props) => { |
11 | 11 | ||
12 | const [modal, setModal] = useState(false); | 12 | const [modal, setModal] = useState(false); |
13 | - const [isLogin, setIsLogin] = useState(false); | ||
14 | const toggleModal = () => setModal(!modal); | 13 | const toggleModal = () => setModal(!modal); |
15 | 14 | ||
16 | 15 | ||
17 | const authApi = () => { | 16 | const authApi = () => { |
18 | const user = JSON.parse(localStorage.getItem('user')); | 17 | const user = JSON.parse(localStorage.getItem('user')); |
18 | + if(!user) { | ||
19 | + alert('로그인이 필요합니다.'); | ||
20 | + window.location.href = "/mypick"; | ||
21 | + return ; | ||
22 | + } | ||
19 | return fetch('/api/auth', { | 23 | return fetch('/api/auth', { |
20 | method: 'GET', | 24 | method: 'GET', |
21 | headers: { | 25 | headers: { |
... | @@ -45,7 +49,7 @@ const MealCard = (props) => { | ... | @@ -45,7 +49,7 @@ const MealCard = (props) => { |
45 | alert('error'); | 49 | alert('error'); |
46 | } | 50 | } |
47 | }); | 51 | }); |
48 | - setIsLogin(true); | 52 | + |
49 | } else { | 53 | } else { |
50 | alert('로그인이 필요합니다.'); | 54 | alert('로그인이 필요합니다.'); |
51 | window.location.href = "/mypick"; | 55 | window.location.href = "/mypick"; |
... | @@ -59,11 +63,6 @@ const MealCard = (props) => { | ... | @@ -59,11 +63,6 @@ const MealCard = (props) => { |
59 | authApi(); | 63 | authApi(); |
60 | } | 64 | } |
61 | 65 | ||
62 | - // useEffect(() => { | ||
63 | - // authApi(); | ||
64 | - // }, [isLogin]); | ||
65 | - | ||
66 | - | ||
67 | return ( | 66 | return ( |
68 | <> | 67 | <> |
69 | <Card style={{ | 68 | <Card style={{ | ... | ... |
... | @@ -35,7 +35,7 @@ const NavBar = (props) => { | ... | @@ -35,7 +35,7 @@ const NavBar = (props) => { |
35 | <NavLink href="/mypick" style={{'color':'#fff'}}>MyPick</NavLink> | 35 | <NavLink href="/mypick" style={{'color':'#fff'}}>MyPick</NavLink> |
36 | </NavItem> | 36 | </NavItem> |
37 | </Nav> | 37 | </Nav> |
38 | - <NavbarText><a href="http://khuhub.khu.ac.kr/2019102227/TermProject" target="_blank" style={{'color':'#fff', 'textDecoration':'none'}}>OSS Project</a></NavbarText> | 38 | + <NavbarText><a href="http://khuhub.khu.ac.kr/2019102227/TermProject" target="_blank" rel="noopener" style={{'color':'#fff', 'textDecoration':'none'}}>OSS Project</a></NavbarText> |
39 | </Collapse> | 39 | </Collapse> |
40 | </Container> | 40 | </Container> |
41 | </Navbar> | 41 | </Navbar> | ... | ... |
... | @@ -12,6 +12,56 @@ const MealCard = (props) => { | ... | @@ -12,6 +12,56 @@ const MealCard = (props) => { |
12 | const [modal, setModal] = useState(false); | 12 | const [modal, setModal] = useState(false); |
13 | const toggleModal = () => setModal(!modal); | 13 | const toggleModal = () => setModal(!modal); |
14 | 14 | ||
15 | + const authApi = () => { | ||
16 | + const user = JSON.parse(localStorage.getItem('user')); | ||
17 | + if(!user) { | ||
18 | + alert('토큰이 만료되었습니다.'); | ||
19 | + window.location.href = "/mypick"; | ||
20 | + return ; | ||
21 | + } | ||
22 | + return fetch('/api/auth', { | ||
23 | + method: 'GET', | ||
24 | + headers: { | ||
25 | + 'Content-Type': 'application/json', | ||
26 | + 'authorization': user | ||
27 | + } | ||
28 | + }).then(response => response.json()) | ||
29 | + .then(result => { | ||
30 | + if(result.message === 'valid token') { | ||
31 | + | ||
32 | + return fetch('/api/delete', { | ||
33 | + method: 'POST', | ||
34 | + headers: { | ||
35 | + 'Content-Type': 'application/json', | ||
36 | + 'authorization': user | ||
37 | + }, | ||
38 | + body: JSON.stringify({ | ||
39 | + "cardid":props.id | ||
40 | + }) | ||
41 | + }).then(response => response.json()) | ||
42 | + .then(result => { | ||
43 | + if(result.message === 'delete success') { | ||
44 | + alert('delete success'); | ||
45 | + window.location.href = "/mypick"; | ||
46 | + } else if(result.message === 'delete error') { | ||
47 | + alert('delete error'); | ||
48 | + } else { | ||
49 | + alert('error'); | ||
50 | + } | ||
51 | + }); | ||
52 | + } else { | ||
53 | + alert('토큰이 만료되었습니다.'); | ||
54 | + window.location.href = "/mypick"; | ||
55 | + } | ||
56 | + }); | ||
57 | +} | ||
58 | + | ||
59 | + | ||
60 | + const deleteHandler = (e) => { | ||
61 | + e.preventDefault(); | ||
62 | + authApi(); | ||
63 | + } | ||
64 | + | ||
15 | return ( | 65 | return ( |
16 | <> | 66 | <> |
17 | <Card style={{ | 67 | <Card style={{ |
... | @@ -80,7 +130,7 @@ const MealCard = (props) => { | ... | @@ -80,7 +130,7 @@ const MealCard = (props) => { |
80 | <small> | 130 | <small> |
81 | 썸네일 출처 | 131 | 썸네일 출처 |
82 | <hr className="my-2"/> | 132 | <hr className="my-2"/> |
83 | - {props.img_source} <Button size="sm" className="float-right" color="danger">Delete</Button> | 133 | + {props.img_source} <Button size="sm" onClick={deleteHandler} className="float-right" color="danger">Delete</Button> |
84 | </small> | 134 | </small> |
85 | </div> | 135 | </div> |
86 | </ModalFooter> | 136 | </ModalFooter> | ... | ... |
1 | import React, { useState, useEffect } from 'react'; | 1 | import React, { useState, useEffect } from 'react'; |
2 | import { Container, Row, Col, Button } from 'reactstrap'; | 2 | import { Container, Row, Col, Button } from 'reactstrap'; |
3 | -import cookie from 'react-cookies'; | ||
4 | -import axios from 'axios'; | ||
5 | import PickedCard from '../components/PickedCard'; | 3 | import PickedCard from '../components/PickedCard'; |
6 | 4 | ||
7 | const UserCards = (props) => { | 5 | const UserCards = (props) => { |
... | @@ -10,6 +8,7 @@ const UserCards = (props) => { | ... | @@ -10,6 +8,7 @@ const UserCards = (props) => { |
10 | 8 | ||
11 | const authApi = () => { | 9 | const authApi = () => { |
12 | const user = JSON.parse(localStorage.getItem('user')); | 10 | const user = JSON.parse(localStorage.getItem('user')); |
11 | + | ||
13 | return fetch('/api/mypicks', { | 12 | return fetch('/api/mypicks', { |
14 | method: 'GET', | 13 | method: 'GET', |
15 | headers: { | 14 | headers: { |
... | @@ -19,7 +18,6 @@ const UserCards = (props) => { | ... | @@ -19,7 +18,6 @@ const UserCards = (props) => { |
19 | }).then(response => response.json()) | 18 | }).then(response => response.json()) |
20 | .then( result => { | 19 | .then( result => { |
21 | setPicks(result.datas); | 20 | setPicks(result.datas); |
22 | - console.log(result.datas); | ||
23 | } | 21 | } |
24 | ); | 22 | ); |
25 | } | 23 | } |
... | @@ -27,7 +25,7 @@ const UserCards = (props) => { | ... | @@ -27,7 +25,7 @@ const UserCards = (props) => { |
27 | useEffect(() => { | 25 | useEffect(() => { |
28 | setUsername(props.username); | 26 | setUsername(props.username); |
29 | authApi(); | 27 | authApi(); |
30 | - }, [username]); | 28 | + }, [username, props]); |
31 | 29 | ||
32 | 30 | ||
33 | 31 | ||
... | @@ -50,7 +48,7 @@ const UserCards = (props) => { | ... | @@ -50,7 +48,7 @@ const UserCards = (props) => { |
50 | <Container style={{'paddingTop':'1.2rem'}}> | 48 | <Container style={{'paddingTop':'1.2rem'}}> |
51 | <Row xs="2" sm="2" md="4"> | 49 | <Row xs="2" sm="2" md="4"> |
52 | {picks.map((data, index) => | 50 | {picks.map((data, index) => |
53 | - <Col> | 51 | + <Col key = {index}> |
54 | <PickedCard | 52 | <PickedCard |
55 | key = {index} | 53 | key = {index} |
56 | id = {data.id} | 54 | id = {data.id} | ... | ... |
... | @@ -9,12 +9,7 @@ import 'react-app-polyfill/ie11'; | ... | @@ -9,12 +9,7 @@ import 'react-app-polyfill/ie11'; |
9 | // import 'bootstrap-css-only/css/bootstrap.min.css'; | 9 | // import 'bootstrap-css-only/css/bootstrap.min.css'; |
10 | // import 'mdbreact/dist/css/mdb.css'; | 10 | // import 'mdbreact/dist/css/mdb.css'; |
11 | 11 | ||
12 | -ReactDOM.render( | 12 | +ReactDOM.render( <App />, document.getElementById('root')); |
13 | - <React.StrictMode> | ||
14 | - <App /> | ||
15 | - </React.StrictMode>, | ||
16 | - document.getElementById('root') | ||
17 | -); | ||
18 | 13 | ||
19 | // If you want your app to work offline and load faster, you can change | 14 | // If you want your app to work offline and load faster, you can change |
20 | // unregister() to register() below. Note this comes with some pitfalls. | 15 | // unregister() to register() below. Note this comes with some pitfalls. | ... | ... |
1 | -import React, { useState, useEffect, Fragment } from 'react'; | 1 | +import React, { useState, useEffect} from 'react'; |
2 | import NavBar from '../components/NavBar'; | 2 | import NavBar from '../components/NavBar'; |
3 | import LandingMap from '../components/LandingMap'; | 3 | import LandingMap from '../components/LandingMap'; |
4 | import { CustomInput } from 'reactstrap'; | 4 | import { CustomInput } from 'reactstrap'; |
... | @@ -55,7 +55,7 @@ const LandingPage = (props) => { | ... | @@ -55,7 +55,7 @@ const LandingPage = (props) => { |
55 | } | 55 | } |
56 | setFilteredDatas(result); | 56 | setFilteredDatas(result); |
57 | setIsLoading(true); | 57 | setIsLoading(true); |
58 | - }, [Kfood, Cfood, Jfood, meat, snackfood, pub, fastfood, cafe, etc]); | 58 | + }, [Kfood, Cfood, Jfood, meat, snackfood, pub, fastfood, cafe, etc, datas]); |
59 | 59 | ||
60 | useEffect(() => { | 60 | useEffect(() => { |
61 | if(all === true) { | 61 | if(all === true) { |
... | @@ -95,7 +95,7 @@ const LandingPage = (props) => { | ... | @@ -95,7 +95,7 @@ const LandingPage = (props) => { |
95 | let y = -1; | 95 | let y = -1; |
96 | while(1) { | 96 | while(1) { |
97 | y = getRandomInt(0, filteredDatas.length); | 97 | y = getRandomInt(0, filteredDatas.length); |
98 | - if(x!=y) break; | 98 | + if(x!==y) break; |
99 | } | 99 | } |
100 | setRandomCards([filteredDatas[x], filteredDatas[y]]); | 100 | setRandomCards([filteredDatas[x], filteredDatas[y]]); |
101 | setIsRandom(2); | 101 | setIsRandom(2); | ... | ... |
... | @@ -57,7 +57,7 @@ const MenuPage = (props) => { | ... | @@ -57,7 +57,7 @@ const MenuPage = (props) => { |
57 | } | 57 | } |
58 | setFilteredDatas(result); | 58 | setFilteredDatas(result); |
59 | setIsLoading(true); | 59 | setIsLoading(true); |
60 | - }, [Kfood, Cfood, Jfood, meat, snackfood, pub, fastfood, cafe, etc]); | 60 | + }, [Kfood, Cfood, Jfood, meat, snackfood, pub, fastfood, cafe, etc, datas]); |
61 | 61 | ||
62 | useEffect(() => { | 62 | useEffect(() => { |
63 | if(all === true) { | 63 | if(all === true) { | ... | ... |
... | @@ -59,7 +59,6 @@ app.post("/api/signup", (req, res) => { | ... | @@ -59,7 +59,6 @@ app.post("/api/signup", (req, res) => { |
59 | const params = [req.body.username, hash]; | 59 | const params = [req.body.username, hash]; |
60 | connection.query(sql, params, (err, rows, fields) => { | 60 | connection.query(sql, params, (err, rows, fields) => { |
61 | if (err) { | 61 | if (err) { |
62 | - console.log(err); | ||
63 | res.send({ | 62 | res.send({ |
64 | code: 400, | 63 | code: 400, |
65 | message: "error", | 64 | message: "error", |
... | @@ -202,9 +201,11 @@ app.post('/api/pick', (req, res) => { | ... | @@ -202,9 +201,11 @@ app.post('/api/pick', (req, res) => { |
202 | 201 | ||
203 | connection.query(`SELECT pick FROM USER WHERE NAME='${username}';`, (err, rows, fileds)=> { | 202 | connection.query(`SELECT pick FROM USER WHERE NAME='${username}';`, (err, rows, fileds)=> { |
204 | if(rows.length === 0) { | 203 | if(rows.length === 0) { |
205 | - // ?? | 204 | + return res.status(401).json({ |
205 | + code: 401, | ||
206 | + message: 'card exist' | ||
207 | + }); | ||
206 | } else { | 208 | } else { |
207 | - // ???? ?? | ||
208 | let flag = true; | 209 | let flag = true; |
209 | let user_picks = rows[0].pick.split(','); | 210 | let user_picks = rows[0].pick.split(','); |
210 | user_picks.pop(); | 211 | user_picks.pop(); |
... | @@ -233,4 +234,47 @@ app.post('/api/pick', (req, res) => { | ... | @@ -233,4 +234,47 @@ app.post('/api/pick', (req, res) => { |
233 | }) | 234 | }) |
234 | }); | 235 | }); |
235 | 236 | ||
237 | +app.post('/api/delete', (req, res) => { | ||
238 | + const user = jwt_decode(req.headers.authorization); | ||
239 | + const username = user.name; | ||
240 | + const cardid = req.body.cardid; | ||
241 | + | ||
242 | + connection.query(`SELECT pick FROM USER WHERE NAME='${username}';`, (err, rows, fileds)=> { | ||
243 | + if(rows.length === 0) { | ||
244 | + return res.status(401).json({ | ||
245 | + code: 401, | ||
246 | + message: 'card exist' | ||
247 | + }); | ||
248 | + } else { | ||
249 | + let flag = false; | ||
250 | + let user_picks = rows[0].pick.split(','); | ||
251 | + let newPick = ''; | ||
252 | + user_picks.pop(); | ||
253 | + for(let i=0; i<user_picks.length; i++) { | ||
254 | + if(user_picks[i] == cardid) { | ||
255 | + flag = true; | ||
256 | + continue; | ||
257 | + } | ||
258 | + else newPick = newPick + (user_picks[i] + ','); | ||
259 | + } | ||
260 | + if(flag) { | ||
261 | + console.log(user_picks, newPick); | ||
262 | + connection.query(`UPDATE USER SET pick='${newPick}' WHERE NAME='${username}';`, (err, rows, fields) => { | ||
263 | + return res.status(200).json({ | ||
264 | + code: 200, | ||
265 | + message: 'delete success', | ||
266 | + }); | ||
267 | + }) | ||
268 | + } else { | ||
269 | + return res.status(401).json({ | ||
270 | + code: 401, | ||
271 | + message: 'delete error' | ||
272 | + }); | ||
273 | + } | ||
274 | + | ||
275 | + } | ||
276 | + }) | ||
277 | + | ||
278 | +}); | ||
279 | + | ||
236 | app.listen(port, () => console.log(`Listening on port ${port}`)); | 280 | app.listen(port, () => console.log(`Listening on port ${port}`)); |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
-
Please register or login to post a comment