Commit c48ea233 authored by Lee SeoYeon's avatar Lee SeoYeon
Browse files

.

parent f4598802
[{"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\index.js":"1","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\reportWebVitals.js":"2","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\Place.js":"3","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\Login.js":"4","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\utils\\catchErrors.js":"5","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\Signup.js":"6","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\utils\\auth.js":"7","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\Paginations.js":"8","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Search.js":"9","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\App.js":"10","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\PrivateRoute.js":"11","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Bookmark.js":"12"},{"size":1267,"mtime":1611500254459,"results":"13","hashOfConfig":"14"},{"size":362,"mtime":499162500000,"results":"15","hashOfConfig":"14"},{"size":1928,"mtime":1611500202848,"results":"16","hashOfConfig":"14"},{"size":3147,"mtime":1611533394731,"results":"17","hashOfConfig":"14"},{"size":405,"mtime":1609915408569,"results":"18","hashOfConfig":"14"},{"size":2995,"mtime":1611489922054,"results":"19","hashOfConfig":"14"},{"size":726,"mtime":1611495738863,"results":"20","hashOfConfig":"14"},{"size":2199,"mtime":1610503781980,"results":"21","hashOfConfig":"14"},{"size":11190,"mtime":1611533394731,"results":"22","hashOfConfig":"14"},{"size":2167,"mtime":1611500202857,"results":"23","hashOfConfig":"14"},{"size":486,"mtime":1611489922054,"results":"24","hashOfConfig":"14"},{"size":2226,"mtime":1611489922053,"results":"25","hashOfConfig":"14"},{"filePath":"26","messages":"27","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"28","usedDeprecatedRules":"29"},"1t9w6go",{"filePath":"30","messages":"31","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"29"},{"filePath":"32","messages":"33","errorCount":0,"warningCount":6,"fixableErrorCount":0,"fixableWarningCount":0,"source":"34","usedDeprecatedRules":"35"},{"filePath":"36","messages":"37","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"29"},{"filePath":"38","messages":"39","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"29"},{"filePath":"40","messages":"41","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"29"},{"filePath":"42","messages":"43","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"29"},{"filePath":"44","messages":"45","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"29"},{"filePath":"46","messages":"47","errorCount":0,"warningCount":10,"fixableErrorCount":0,"fixableWarningCount":0,"source":"48","usedDeprecatedRules":"29"},{"filePath":"49","messages":"50","errorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"51","usedDeprecatedRules":"29"},{"filePath":"52","messages":"53","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"29"},{"filePath":"54","messages":"55","errorCount":0,"warningCount":14,"fixableErrorCount":0,"fixableWarningCount":0,"source":"56","usedDeprecatedRules":"29"},"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\index.js",["57"],"import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './index.css';\r\nimport 'bootstrap/dist/css/bootstrap.min.css';\r\nimport App from './App'\r\nimport Search from './Search';\r\nimport reportWebVitals from './reportWebVitals';\r\nimport Signup from './Components/Signup'\r\nimport Login from './Components/Login'\r\nimport PrivateRoute from \"./Components/PrivateRoute\";\r\nimport axios from 'axios'\r\nimport Bookmark from \"./Bookmark\"\r\nimport {\r\n BrowserRouter as Router,\r\n Switch,\r\n Route,\r\n Redirect,\r\n} from \"react-router-dom\";\r\n\r\nReactDOM.render(\r\n <React.StrictMode>\r\n <Router>\r\n <Switch>\r\n <Route exact path=\"/\" component={App} />\r\n <Route path=\"/search\" component={Search} />\r\n <Route path='/signup' component={Signup}/>\r\n <Route path='/login' component={Login} />\r\n <PrivateRoute path='/bookmark'><Bookmark/></PrivateRoute>\r\n <Redirect path=\"/search\" to=\"/search\" />\r\n </Switch>\r\n </Router>\r\n </React.StrictMode>,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n",["58","59"],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\reportWebVitals.js",[],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\Place.js",["60","61","62","63","64","65"],"import axios from 'axios';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { Modal, Container, Row, Button, } from 'react-bootstrap';\r\n\r\nfunction Place(props) {\r\n<<<<<<< HEAD\r\n const [reviews, setReviews] = useState([]) \r\n const getReview = () => { //review를 서버에 연결해서\r\n axios.get(`/api/review/${props.search.name}`) \r\n=======\r\n const [reviews, setReviews] = useState([{ title: \"\", link: \"\", summery: \"\", content: \"\" }])\r\n const getReview = () => {\r\n axios.get(`/api/review/${props.search.name}`)\r\n>>>>>>> origin/BAE\r\n .then(res => {\r\n console.log(\"place res.data\", res.data)\r\n setReviews(res.data)\r\n })\r\n .catch(err => {\r\n console.log(err)\r\n })\r\n }\r\n\r\n useEffect(() => {\r\n getReview();\r\n }, [])\r\n\r\n return (\r\n <Modal {...props}\r\n size=\"xl\"\r\n keyboard=\"true\"\r\n variant=\"backdrop.in\"\r\n aria-labelledby=\"example-modal-sizes-title-lg\">\r\n <Modal.Header closeButton>\r\n <Modal.Title id=\"contained-modal-title-vcenter\" style={{ fontSize: '40px' }}>\r\n {props.index + 1}. {props.search.name}\r\n </Modal.Title>\r\n </Modal.Header>\r\n <Modal.Body className=\"show-grid\">\r\n <Container style={{ fontSize: '40px' }}>\r\n {reviews.map((review, index) => {\r\n return (\r\n <Row className=\"mt-4\">\r\n <a href={review.link}>{review.title}</a>\r\n <div>{review.summary}</div>\r\n <div>{review.content}</div>\r\n </Row>\r\n )\r\n })}\r\n </Container>\r\n\r\n </Modal.Body>\r\n <Modal.Footer>\r\n <Button block onClick={props.onHide}>Close</Button>\r\n </Modal.Footer>\r\n </Modal>\r\n );\r\n}\r\n\r\nexport default Place;\r\n",["66","67"],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\Login.js",[],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\utils\\catchErrors.js",[],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\Signup.js",[],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\utils\\auth.js",[],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\Paginations.js",[],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Search.js",["68","69","70","71","72","73","74","75","76","77"],"import React, { useState, useEffect } from 'react';\r\nimport { Link, Redirect } from 'react-router-dom';\r\nimport ohuh from './ohuh-sm.PNG';\r\nimport Place from './Components/Place';\r\nimport { Container, Form, Row, Col, Card, Image, InputGroup, FormControl, Button, Modal } from 'react-bootstrap';\r\nimport Paginations from './Components/Paginations.js'\r\nimport catchErrors from './utils/catchErrors.js'\r\nimport * as Icon from 'react-bootstrap-icons';\r\nimport axios from \"axios\";\r\n\r\nconst INIT_PAGE = {\r\n title: '',\r\n url: '',\r\n}\r\n\r\nfunction Search(props) {\r\n const endPage = 10;\r\n const [state, setState] = useState(false);\r\n const [index, setIndex] = useState(1);\r\n const [showSet, setShowSet] = useState([false, false, false, false]);\r\n const [search, setSearch] = useState(props.location.state.id);\r\n const [mobile, setMobile] = useState();\r\n const [show, setShow] = useState(false);\r\n const [page, setPage] = useState(INIT_PAGE)\r\n const [success, setSuccess] = useState(false)\r\n const [error, setError] = useState('')\r\n\r\n const handleClose = () => setShow(false);\r\n const handleShow = () => setShow(true);\r\n\r\n useEffect(() => {\r\n if (window.innerWidth < 960) {\r\n setMobile(true)\r\n } else {\r\n setMobile(false)\r\n }\r\n }, []);\r\n\r\n const places = [{\r\n name: \"한라산(hallasan)\",\r\n address: \"제주 서귀포시 토평동 산15-1\",\r\n img: \"data:image/png;base64,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\",\r\n // img: \"https://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/KOCIS_Halla_Mountain_in_Jeju-do_%286387785543%29.jpg/269px-KOCIS_Halla_Mountain_in_Jeju-do_%286387785543%29.jpg?size=200x200\",\r\n // }, {\r\n // name: \"성산일출봉(sungsan)\",\r\n // address: \"제주 서귀포시 성산읍 성산리 1\",\r\n // img: \"https://www.jeju.go.kr/pub/site/geopark/images/sub/sub03/02%EC%A7%80%EC%A7%88%EB%A7%88%EC%9D%84%EC%9D%B4%EC%95%BC%EA%B8%B0/%EC%A7%80%EC%A7%88%EB%A7%88%EC%9D%84/%EC%A7%80%EC%A7%88%EB%A7%88%EC%9D%84_%EC%84%B1%EC%82%B0%EC%9D%BC%EC%B6%9C%EB%B4%89/1412402261.jpg?400/400\",\r\n // }, {\r\n // name: \"해녀의 집(haenyeo)\",\r\n // address: \"제주 서귀포시 성산읍 한도로 141-13지번오조리 3 오조해녀의집\",\r\n // img: \"https://mblogthumb-phinf.pstatic.net/MjAxNjExMTdfMTc0/MDAxNDc5MzU3ODU0ODQy.KZYXCjzsXT3rCsE4HXBfxyCg2buvluBvN_7NxVp7BSwg.loJc89d8JjGXdNCn-4yMd7aMWPjfrZn21TI9Hyzemkog.JPEG.icocam11/20161010_100205.jpg?type=w800\",\r\n // }, {\r\n // name: \"오설록 티 뮤지엄(osulloc)\",\r\n // address: \"제주 서귀포시 안덕면 신화역사로 15 오설록지번서광리 1235-1 오설록\",\r\n // img: \"https://cdnweb01.wikitree.co.kr/webdata/editor/202007/01/img_20200701143323_2ced7627.webp\",\r\n // }, {\r\n // name: \"오설록 티 뮤지엄(osulloc)\",\r\n // address: \"제주 서귀포시 안덕면 신화역사로 15 오설록지번서광리 1235-1 오설록\",\r\n // img: \"https://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/KOCIS_Halla_Mountain_in_Jeju-do_%286387785543%29.jpg/269px-KOCIS_Halla_Mountain_in_Jeju-do_%286387785543%29.jpg\",\r\n }]\r\n\r\n if (state !== false) {\r\n return <Redirect to={{\r\n pathname: `/search/${search}`,\r\n state: { id: search },\r\n }} />;\r\n }\r\n\r\n const handlePage = (num) => {\r\n setIndex(num);\r\n }\r\n\r\n // async function bookmarkSave() {\r\n // await axios.put('/api/users', {userId:userId, bookmarkId:bookmarkId})\r\n // }\r\n\r\n const handleChange = (e) => {\r\n setSearch(e.target.value);\r\n }\r\n\r\n async function handleSubmit(e){\r\n setState(true); //버튼이 눌려서 handlesubmit이될때 setState값이 true로 바뀐다\r\n try { //respons 서버에 post로 요청하여 데이터를 받아온다\r\n const response = await axios.post('/api/users/bookmark', page)\r\n setSuccess(true)\r\n } catch (error) {\r\n console.log(error)\r\n catchErrors(error, setError)\r\n }\r\n }\r\n\r\n function paginate(items, pageNumber, itemNumber) {\r\n const page = []; //페이지를 빈배열로 설정\r\n const startIndex = (pageNumber - 1) * itemNumber // 처음인덱스 값이 페이지넘버 -1 * 아이템 넘버로 \r\n for (var i = 0; i < itemNumber; i++) { \r\n page.push(items[(startIndex + i)])\r\n } \r\n return page\r\n }\r\n\r\n const pagePlace = paginate(places, index, 1)\r\n\r\n return (\r\n <Container >\r\n <Link to=\"/\" className=\"d-flex justify-content-center\"><Image src={ohuh} /></Link>\r\n <Row className=\"mb-2\" className=\"d-flex justify-content-center\">\r\n <Form style={{ width: \"90vw\" }} onSubmit={handleSubmit}>\r\n <InputGroup size=\"lg\">\r\n <FormControl\r\n placeholder=\"검색어를 입력하세요.\"\r\n value={search}\r\n aria-label=\"Large\"\r\n aria-describedby=\"inputGroup-sizing-sm\"\r\n onChange={handleChange}\r\n />\r\n <InputGroup.Append>\r\n <Button type=\"submit\" variant=\"outline-secondary\" style={{ maxHeight: \"8vh\", maxWidth: \"14vh\" }} >검색</Button>\r\n </InputGroup.Append>\r\n </InputGroup>\r\n </Form>\r\n </Row>\r\n <Row className=\"d-flex flex-wrap\">\r\n {pagePlace.map((place, index) => {\r\n return (\r\n <Col key={index} md={6} >\r\n <Card align=\"center\" border=\"info\" style={{ margin: \"3%\" }}>\r\n <Button onSubmit={handleSubmit} variant=\"outline-info\" style={{ marginLeft: \"55vh\" }} type='submit'><Icon.BookmarkStar size={30} /></Button>\r\n <Card.Title style={{ margin: \"3%\", fontSize: '200%', fontWeight: 'bold' }}>{place.name}\r\n </Card.Title>\r\n <Card.Img variant=\"top\" style={{ padding: \"5%\", width: \"100%\", height: \"340px\" }} src={place.img} />\r\n <Card.Body >\r\n <Card.Text style={{ overflow: 'auto', fontSize: '25px', width: '100%', height: \"80px\" }} >\r\n {place.address} </Card.Text>\r\n <Button variant=\"primary\" onClick={() => {\r\n const showArr = [false, false, false, false]\r\n showArr[index] = true\r\n setShowSet(showArr)\r\n }}>{place.name} 자세히 살펴보기</Button>\r\n <Place search={place} index={index} show={showSet[index]} onHide={() => setShowSet([false, false, false, false])} />\r\n </Card.Body>\r\n </Card>\r\n </Col>\r\n )\r\n })}\r\n </Row>\r\n { console.log(showSet)}\r\n {/* show가 전부 true로 바뀌어서 전부 다 보이게 되는 것이다. */}\r\n <Row className=\"mt-2 d-flex justify-content-center\">\r\n <Paginations index={index} endPage={endPage} handlePage={handlePage}></Paginations>\r\n </Row>\r\n </Container>\r\n\r\n );\r\n}\r\n\r\nexport default Search\r\n\r\n// async function saveId(bookmarkId) {\r\n// await axios.put('/api/users', {userId:userId, bookmarkId:bookmarkId})\r\n// }\r\n\r\n// const bookmarksave = async (req, res) => {\r\n// const {userId, bookmarkId} = req.body\r\n// let bookmark = await Bookmark.findOne({bookmarkId:bookmarkId}).select('user')\r\n// }\r\n","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\App.js",["78","79","80","81"],"import React, { useEffect, useState } from 'react';\r\nimport { Link, Redirect } from 'react-router-dom';\r\nimport ohuh from './ohuh.PNG'\r\nimport { Container, Row, Form, Image, InputGroup, Button, Col, FormControl, Navbar, Nav } from 'react-bootstrap';\r\nimport { handleLogout, isAuthenticated } from './utils/auth.js'\r\n\r\nfunction App() {\r\n const [state, setState] = useState(false);\r\n const [search, setSearch] = useState(\"\");\r\n const user = isAuthenticated()\r\n\r\n if (state !== false) {\r\n return <Redirect to={`/search?keyword=${search}`} />;\r\n }\r\n\r\n const handleChange = (e) => {\r\n setSearch(e.target.value);\r\n } //바뀌는 것이 있을때 이벤트 발생\r\n\r\n const handleSubmit = () => {\r\n setState(true);\r\n } //submit 버튼을 누르면 state 값을 true로 바뀐다\r\n\r\n return (\r\n <Container className=\"vh-100 d-flex justify-content-md-center align-items-center\">\r\n <Col md={6} style={{ marginTop: 140 }}>\r\n <Nav className=\"justify-content-end\" bg=\"#fff\" variant=\"light\" >\r\n {user ? <Nav.Link onClick={() => handleLogout()}>로그아웃</Nav.Link>\r\n : (\r\n <>\r\n <Nav.Link href=\"/signup\">회원가입</Nav.Link>\r\n <Nav.Link href=\"/login\">로그인</Nav.Link>\r\n </>\r\n )}\r\n <Nav.Link href='/bookmark'>북마크</Nav.Link>\r\n </Nav>\r\n <Row style={{ marginBottom: 20 }}>\r\n <Image src={ohuh} />\r\n </Row>\r\n <Row style={{ marginBottom: 500 }}>\r\n <Form className=\"vw-100\" onSubmit={handleSubmit}>\r\n <InputGroup style={{ width: 560 }}>\r\n <Form.Control\r\n size=\"lg\"\r\n placeholder=\"검색어를 입력하세요.\"\r\n aria-label=\"Large\"\r\n aria-describedby=\"inputGroup-sizing-sm\"\r\n onChange={handleChange}\r\n />\r\n <InputGroup.Append>\r\n <Button type='submit' variant=\"outline-secondary\">검색</Button>\r\n </InputGroup.Append>\r\n </InputGroup>\r\n </Form>\r\n </Row>\r\n </Col>\r\n </Container>\r\n );\r\n}\r\n\r\nexport default App;\r\n","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\PrivateRoute.js",[],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Bookmark.js",["82","83","84","85","86","87","88","89","90","91","92","93","94","95"],"import React, { useState, useEffect } from 'react'\r\nimport { Alert, Col, Card, Container, Form, Row, Button, Nav, Navbar, ListGroup, Image, Table } from \"react-bootstrap\"\r\nimport axios from \"axios\"\r\nimport catchErrors from './utils/catchErrors.js'\r\nimport { Redirect } from 'react-router-dom'\r\n\r\nconst INIT_PAGE = {\r\n title: '',\r\n url: '',\r\n}\r\n\r\nfunction Bookmark() {\r\n const [page, setPage] = useState(INIT_PAGE)\r\n const [success, setSuccess] = useState(false)\r\n const [error, setError] = useState('')\r\n\r\n\r\n function handleChange(event) {\r\n const {title, value} = event.target\r\n setPage({...page, [title]: value})\r\n }\r\n\r\n async function handleSubmit(event) {\r\n event.preventDefault()\r\n try {\r\n setError('')\r\n const response = await axios.post('/api/users/bookmark ', page)\r\n console.log(response.data)\r\n console.log(page)\r\n // setUser(INIT_USER)\r\n setSuccess(true)\r\n } catch (error) {\r\n console.log(error)\r\n catchErrors(error, setError)\r\n }\r\n }\r\n\r\n const add_Page = [{\r\n title:'즐겨찾기1',\r\n url:'http://localhost:3000',\r\n }, {\r\n title:'즐겨찾기2',\r\n url:'https://www.naver.com/',\r\n }, {\r\n title:'즐겨찾기3',\r\n url:'https://www.youtube.com/watch?v=wo46N-LQK7o'\r\n }]\r\n\r\n return (\r\n <Container>\r\n <Navbar bg=\"primary\" variant=\"dark\">\r\n <Navbar.Brand href=\"/\">북마크</Navbar.Brand>\r\n <Nav className=\"mr-auto\">\r\n <Nav.Link href=\"/\">Home</Nav.Link>\r\n </Nav>\r\n {/* <Form inline>\r\n <FormControl type=\"text\" placeholder=\"Search\" className=\"mr-sm-2\" />\r\n <Button variant=\"outline-light\">Search</Button>\r\n </Form> */}\r\n </Navbar>\r\n <Form>\r\n <ListGroup>\r\n <ListGroup.Item action href=\"\">북마크1</ListGroup.Item>\r\n <ListGroup.Item>북마크2</ListGroup.Item>\r\n </ListGroup>\r\n </Form>\r\n </Container>\r\n )\r\n}\r\n\r\nexport default Bookmark",{"ruleId":"96","severity":1,"message":"97","line":11,"column":8,"nodeType":"98","messageId":"99","endLine":11,"endColumn":13},{"ruleId":"100","replacedBy":"101"},{"ruleId":"102","replacedBy":"103"},{"ruleId":"96","severity":1,"message":"104","line":3,"column":33,"nodeType":"98","messageId":"99","endLine":3,"endColumn":36},{"ruleId":"96","severity":1,"message":"105","line":3,"column":46,"nodeType":"98","messageId":"99","endLine":3,"endColumn":51},{"ruleId":"96","severity":1,"message":"106","line":3,"column":53,"nodeType":"98","messageId":"99","endLine":3,"endColumn":57},{"ruleId":"96","severity":1,"message":"107","line":3,"column":59,"nodeType":"98","messageId":"99","endLine":3,"endColumn":68},{"ruleId":"96","severity":1,"message":"108","line":3,"column":70,"nodeType":"98","messageId":"99","endLine":3,"endColumn":78},{"ruleId":"109","severity":1,"message":"110","line":20,"column":6,"nodeType":"111","endLine":20,"endColumn":8,"suggestions":"112"},{"ruleId":"100","replacedBy":"113"},{"ruleId":"102","replacedBy":"114"},{"ruleId":"96","severity":1,"message":"115","line":5,"column":83,"nodeType":"98","messageId":"99","endLine":5,"endColumn":88},{"ruleId":"96","severity":1,"message":"116","line":22,"column":12,"nodeType":"98","messageId":"99","endLine":22,"endColumn":18},{"ruleId":"96","severity":1,"message":"117","line":23,"column":12,"nodeType":"98","messageId":"99","endLine":23,"endColumn":16},{"ruleId":"96","severity":1,"message":"118","line":24,"column":18,"nodeType":"98","messageId":"99","endLine":24,"endColumn":25},{"ruleId":"96","severity":1,"message":"119","line":25,"column":12,"nodeType":"98","messageId":"99","endLine":25,"endColumn":19},{"ruleId":"96","severity":1,"message":"120","line":26,"column":12,"nodeType":"98","messageId":"99","endLine":26,"endColumn":17},{"ruleId":"96","severity":1,"message":"121","line":28,"column":11,"nodeType":"98","messageId":"99","endLine":28,"endColumn":22},{"ruleId":"96","severity":1,"message":"122","line":29,"column":11,"nodeType":"98","messageId":"99","endLine":29,"endColumn":21},{"ruleId":"96","severity":1,"message":"123","line":84,"column":19,"nodeType":"98","messageId":"99","endLine":84,"endColumn":27},{"ruleId":"124","severity":1,"message":"125","line":106,"column":35,"nodeType":"126","endLine":106,"endColumn":76},{"ruleId":"96","severity":1,"message":"127","line":1,"column":17,"nodeType":"98","messageId":"99","endLine":1,"endColumn":26},{"ruleId":"96","severity":1,"message":"128","line":2,"column":10,"nodeType":"98","messageId":"99","endLine":2,"endColumn":14},{"ruleId":"96","severity":1,"message":"129","line":4,"column":64,"nodeType":"98","messageId":"99","endLine":4,"endColumn":75},{"ruleId":"96","severity":1,"message":"130","line":4,"column":77,"nodeType":"98","messageId":"99","endLine":4,"endColumn":83},{"ruleId":"96","severity":1,"message":"127","line":1,"column":27,"nodeType":"98","messageId":"99","endLine":1,"endColumn":36},{"ruleId":"96","severity":1,"message":"131","line":2,"column":10,"nodeType":"98","messageId":"99","endLine":2,"endColumn":15},{"ruleId":"96","severity":1,"message":"104","line":2,"column":17,"nodeType":"98","messageId":"99","endLine":2,"endColumn":20},{"ruleId":"96","severity":1,"message":"106","line":2,"column":22,"nodeType":"98","messageId":"99","endLine":2,"endColumn":26},{"ruleId":"96","severity":1,"message":"132","line":2,"column":45,"nodeType":"98","messageId":"99","endLine":2,"endColumn":48},{"ruleId":"96","severity":1,"message":"133","line":2,"column":50,"nodeType":"98","messageId":"99","endLine":2,"endColumn":56},{"ruleId":"96","severity":1,"message":"134","line":2,"column":82,"nodeType":"98","messageId":"99","endLine":2,"endColumn":87},{"ruleId":"96","severity":1,"message":"135","line":2,"column":89,"nodeType":"98","messageId":"99","endLine":2,"endColumn":94},{"ruleId":"96","severity":1,"message":"136","line":5,"column":10,"nodeType":"98","messageId":"99","endLine":5,"endColumn":18},{"ruleId":"96","severity":1,"message":"119","line":14,"column":12,"nodeType":"98","messageId":"99","endLine":14,"endColumn":19},{"ruleId":"96","severity":1,"message":"120","line":15,"column":12,"nodeType":"98","messageId":"99","endLine":15,"endColumn":17},{"ruleId":"96","severity":1,"message":"137","line":18,"column":14,"nodeType":"98","messageId":"99","endLine":18,"endColumn":26},{"ruleId":"96","severity":1,"message":"138","line":23,"column":20,"nodeType":"98","messageId":"99","endLine":23,"endColumn":32},{"ruleId":"96","severity":1,"message":"139","line":38,"column":11,"nodeType":"98","messageId":"99","endLine":38,"endColumn":19},"no-unused-vars","'axios' is defined but never used.","Identifier","unusedVar","no-native-reassign",["140"],"no-negated-in-lhs",["141"],"'Col' is defined but never used.","'Badge' is defined but never used.","'Card' is defined but never used.","'Accordion' is defined but never used.","'Carousel' is defined but never used.","react-hooks/exhaustive-deps","React Hook useEffect has a missing dependency: 'getReview'. Either include it or remove the dependency array.","ArrayExpression",["142"],["140"],["141"],"'Modal' is defined but never used.","'mobile' is assigned a value but never used.","'show' is assigned a value but never used.","'setPage' is assigned a value but never used.","'success' is assigned a value but never used.","'error' is assigned a value but never used.","'handleClose' is assigned a value but never used.","'handleShow' is assigned a value but never used.","'response' is assigned a value but never used.","react/jsx-no-duplicate-props","No duplicate props allowed","JSXAttribute","'useEffect' is defined but never used.","'Link' is defined but never used.","'FormControl' is defined but never used.","'Navbar' is defined but never used.","'Alert' is defined but never used.","'Row' is defined but never used.","'Button' is defined but never used.","'Image' is defined but never used.","'Table' is defined but never used.","'Redirect' is defined but never used.","'handleChange' is defined but never used.","'handleSubmit' is defined but never used.","'add_Page' is assigned a value but never used.","no-global-assign","no-unsafe-negation",{"desc":"143","fix":"144"},"Update the dependencies array to be: [getReview]",{"range":"145","text":"146"},[581,583],"[getReview]"] [{"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\index.js":"1","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\reportWebVitals.js":"2","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\Place.js":"3","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\Login.js":"4","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\utils\\catchErrors.js":"5","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\Signup.js":"6","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\utils\\auth.js":"7","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\Paginations.js":"8","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Search.js":"9","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\App.js":"10","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\PrivateRoute.js":"11","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Bookmark.js":"12"},{"size":1267,"mtime":1611500254459,"results":"13","hashOfConfig":"14"},{"size":362,"mtime":499162500000,"results":"15","hashOfConfig":"14"},{"size":1650,"mtime":1611534274491,"results":"16","hashOfConfig":"14"},{"size":3147,"mtime":1611533394731,"results":"17","hashOfConfig":"14"},{"size":405,"mtime":1609915408569,"results":"18","hashOfConfig":"14"},{"size":2995,"mtime":1611489922054,"results":"19","hashOfConfig":"14"},{"size":726,"mtime":1611495738863,"results":"20","hashOfConfig":"14"},{"size":2199,"mtime":1610503781980,"results":"21","hashOfConfig":"14"},{"size":10888,"mtime":1611535956580,"results":"22","hashOfConfig":"14"},{"size":2167,"mtime":1611500202857,"results":"23","hashOfConfig":"14"},{"size":486,"mtime":1611489922054,"results":"24","hashOfConfig":"14"},{"size":1626,"mtime":1611536074488,"results":"25","hashOfConfig":"14"},{"filePath":"26","messages":"27","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"28","usedDeprecatedRules":"29"},"1t9w6go",{"filePath":"30","messages":"31","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"29"},{"filePath":"32","messages":"33","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"34","usedDeprecatedRules":"29"},{"filePath":"35","messages":"36","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"29"},{"filePath":"37","messages":"38","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"29"},{"filePath":"39","messages":"40","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"29"},{"filePath":"41","messages":"42","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"29"},{"filePath":"43","messages":"44","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"29"},{"filePath":"45","messages":"46","errorCount":0,"warningCount":10,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"47","messages":"48","errorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"49","usedDeprecatedRules":"29"},{"filePath":"50","messages":"51","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"29"},{"filePath":"52","messages":"53","errorCount":0,"warningCount":13,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\index.js",["54"],"import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './index.css';\r\nimport 'bootstrap/dist/css/bootstrap.min.css';\r\nimport App from './App'\r\nimport Search from './Search';\r\nimport reportWebVitals from './reportWebVitals';\r\nimport Signup from './Components/Signup'\r\nimport Login from './Components/Login'\r\nimport PrivateRoute from \"./Components/PrivateRoute\";\r\nimport axios from 'axios'\r\nimport Bookmark from \"./Bookmark\"\r\nimport {\r\n BrowserRouter as Router,\r\n Switch,\r\n Route,\r\n Redirect,\r\n} from \"react-router-dom\";\r\n\r\nReactDOM.render(\r\n <React.StrictMode>\r\n <Router>\r\n <Switch>\r\n <Route exact path=\"/\" component={App} />\r\n <Route path=\"/search\" component={Search} />\r\n <Route path='/signup' component={Signup}/>\r\n <Route path='/login' component={Login} />\r\n <PrivateRoute path='/bookmark'><Bookmark/></PrivateRoute>\r\n <Redirect path=\"/search\" to=\"/search\" />\r\n </Switch>\r\n </Router>\r\n </React.StrictMode>,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n",["55","56"],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\reportWebVitals.js",[],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\Place.js",["57","58"],"import axios from 'axios';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { Modal, Container, Row, Button, } from 'react-bootstrap';\r\n\r\nfunction Place(props) {\r\n const [reviews, setReviews] = useState()\r\n const [db, setDb] = useState(false)\r\n const getReview = () => {\r\n axios({ url: `/api/review?keyword=${props.place.name}`, method: 'post', data: { db: db } })\r\n .then(res => {\r\n console.log(\"place res.data\", res.data)\r\n setReviews(res.data)\r\n })\r\n .catch(err => {\r\n console.log(err)\r\n })\r\n }\r\n\r\n useEffect(() => {\r\n getReview();\r\n }, [])\r\n\r\n return (\r\n <Modal {...props}\r\n size=\"xl\"\r\n keyboard=\"true\"\r\n variant=\"backdrop.in\"\r\n aria-labelledby=\"example-modal-sizes-title-lg\">\r\n <Modal.Header closeButton>\r\n <Modal.Title id=\"contained-modal-title-vcenter\" style={{ fontSize: '40px' }}>\r\n {props.index + 1}. {props.place.name}\r\n </Modal.Title>\r\n </Modal.Header>\r\n <Modal.Body className=\"show-grid\">\r\n <Container style={{ fontSize: '40px' }}>\r\n {Array.isArray(reviews) ? reviews.map((review, index) => {\r\n return (\r\n <Row className=\"mt-4\">\r\n <a href={review.link}>{review.title}</a>\r\n <div>{review.summary}</div>\r\n <div>{review.content}</div>\r\n </Row>\r\n )\r\n })\r\n : \"리뷰가 없습니다.\"}\r\n </Container>\r\n\r\n </Modal.Body>\r\n <Modal.Footer>\r\n <Button block onClick={props.onHide}>Close</Button>\r\n </Modal.Footer>\r\n </Modal>\r\n );\r\n}\r\n\r\nexport default Place;\r\n","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\Login.js",[],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\utils\\catchErrors.js",[],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\Signup.js",[],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\utils\\auth.js",[],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\Paginations.js",[],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Search.js",["59","60","61","62","63","64","65","66","67","68"],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\App.js",["69","70","71","72"],"import React, { useEffect, useState } from 'react';\r\nimport { Link, Redirect } from 'react-router-dom';\r\nimport ohuh from './ohuh.PNG'\r\nimport { Container, Row, Form, Image, InputGroup, Button, Col, FormControl, Navbar, Nav } from 'react-bootstrap';\r\nimport { handleLogout, isAuthenticated } from './utils/auth.js'\r\n\r\nfunction App() {\r\n const [state, setState] = useState(false);\r\n const [search, setSearch] = useState(\"\");\r\n const user = isAuthenticated()\r\n\r\n if (state !== false) {\r\n return <Redirect to={`/search?keyword=${search}`} />;\r\n }\r\n\r\n const handleChange = (e) => {\r\n setSearch(e.target.value);\r\n } //바뀌는 것이 있을때 이벤트 발생\r\n\r\n const handleSubmit = () => {\r\n setState(true);\r\n } //submit 버튼을 누르면 state 값을 true로 바뀐다\r\n\r\n return (\r\n <Container className=\"vh-100 d-flex justify-content-md-center align-items-center\">\r\n <Col md={6} style={{ marginTop: 140 }}>\r\n <Nav className=\"justify-content-end\" bg=\"#fff\" variant=\"light\" >\r\n {user ? <Nav.Link onClick={() => handleLogout()}>로그아웃</Nav.Link>\r\n : (\r\n <>\r\n <Nav.Link href=\"/signup\">회원가입</Nav.Link>\r\n <Nav.Link href=\"/login\">로그인</Nav.Link>\r\n </>\r\n )}\r\n <Nav.Link href='/bookmark'>북마크</Nav.Link>\r\n </Nav>\r\n <Row style={{ marginBottom: 20 }}>\r\n <Image src={ohuh} />\r\n </Row>\r\n <Row style={{ marginBottom: 500 }}>\r\n <Form className=\"vw-100\" onSubmit={handleSubmit}>\r\n <InputGroup style={{ width: 560 }}>\r\n <Form.Control\r\n size=\"lg\"\r\n placeholder=\"검색어를 입력하세요.\"\r\n aria-label=\"Large\"\r\n aria-describedby=\"inputGroup-sizing-sm\"\r\n onChange={handleChange}\r\n />\r\n <InputGroup.Append>\r\n <Button type='submit' variant=\"outline-secondary\">검색</Button>\r\n </InputGroup.Append>\r\n </InputGroup>\r\n </Form>\r\n </Row>\r\n </Col>\r\n </Container>\r\n );\r\n}\r\n\r\nexport default App;\r\n","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\PrivateRoute.js",[],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Bookmark.js",["73","74","75","76","77","78","79","80","81","82","83","84","85"],{"ruleId":"86","severity":1,"message":"87","line":11,"column":8,"nodeType":"88","messageId":"89","endLine":11,"endColumn":13},{"ruleId":"90","replacedBy":"91"},{"ruleId":"92","replacedBy":"93"},{"ruleId":"86","severity":1,"message":"94","line":7,"column":14,"nodeType":"88","messageId":"89","endLine":7,"endColumn":19},{"ruleId":"95","severity":1,"message":"96","line":21,"column":6,"nodeType":"97","endLine":21,"endColumn":8,"suggestions":"98"},{"ruleId":"86","severity":1,"message":"99","line":5,"column":83,"nodeType":"88","messageId":"89","endLine":5,"endColumn":88},{"ruleId":"86","severity":1,"message":"100","line":22,"column":12,"nodeType":"88","messageId":"89","endLine":22,"endColumn":18},{"ruleId":"86","severity":1,"message":"101","line":23,"column":12,"nodeType":"88","messageId":"89","endLine":23,"endColumn":16},{"ruleId":"86","severity":1,"message":"102","line":24,"column":18,"nodeType":"88","messageId":"89","endLine":24,"endColumn":25},{"ruleId":"86","severity":1,"message":"103","line":25,"column":12,"nodeType":"88","messageId":"89","endLine":25,"endColumn":19},{"ruleId":"86","severity":1,"message":"104","line":26,"column":12,"nodeType":"88","messageId":"89","endLine":26,"endColumn":17},{"ruleId":"86","severity":1,"message":"105","line":28,"column":11,"nodeType":"88","messageId":"89","endLine":28,"endColumn":22},{"ruleId":"86","severity":1,"message":"106","line":29,"column":11,"nodeType":"88","messageId":"89","endLine":29,"endColumn":21},{"ruleId":"86","severity":1,"message":"107","line":84,"column":19,"nodeType":"88","messageId":"89","endLine":84,"endColumn":27},{"ruleId":"108","severity":1,"message":"109","line":106,"column":35,"nodeType":"110","endLine":106,"endColumn":76},{"ruleId":"86","severity":1,"message":"111","line":1,"column":17,"nodeType":"88","messageId":"89","endLine":1,"endColumn":26},{"ruleId":"86","severity":1,"message":"112","line":2,"column":10,"nodeType":"88","messageId":"89","endLine":2,"endColumn":14},{"ruleId":"86","severity":1,"message":"113","line":4,"column":64,"nodeType":"88","messageId":"89","endLine":4,"endColumn":75},{"ruleId":"86","severity":1,"message":"114","line":4,"column":77,"nodeType":"88","messageId":"89","endLine":4,"endColumn":83},{"ruleId":"86","severity":1,"message":"115","line":2,"column":10,"nodeType":"88","messageId":"89","endLine":2,"endColumn":15},{"ruleId":"86","severity":1,"message":"116","line":2,"column":17,"nodeType":"88","messageId":"89","endLine":2,"endColumn":20},{"ruleId":"86","severity":1,"message":"117","line":2,"column":22,"nodeType":"88","messageId":"89","endLine":2,"endColumn":26},{"ruleId":"86","severity":1,"message":"118","line":2,"column":45,"nodeType":"88","messageId":"89","endLine":2,"endColumn":48},{"ruleId":"86","severity":1,"message":"119","line":2,"column":50,"nodeType":"88","messageId":"89","endLine":2,"endColumn":56},{"ruleId":"86","severity":1,"message":"120","line":2,"column":82,"nodeType":"88","messageId":"89","endLine":2,"endColumn":87},{"ruleId":"86","severity":1,"message":"121","line":2,"column":89,"nodeType":"88","messageId":"89","endLine":2,"endColumn":94},{"ruleId":"86","severity":1,"message":"122","line":6,"column":10,"nodeType":"88","messageId":"89","endLine":6,"endColumn":18},{"ruleId":"86","severity":1,"message":"102","line":16,"column":18,"nodeType":"88","messageId":"89","endLine":16,"endColumn":25},{"ruleId":"86","severity":1,"message":"104","line":17,"column":12,"nodeType":"88","messageId":"89","endLine":17,"endColumn":17},{"ruleId":"86","severity":1,"message":"123","line":19,"column":20,"nodeType":"88","messageId":"89","endLine":19,"endColumn":32},{"ruleId":"86","severity":1,"message":"107","line":23,"column":19,"nodeType":"88","messageId":"89","endLine":23,"endColumn":27},{"ruleId":"95","severity":1,"message":"124","line":34,"column":8,"nodeType":"97","endLine":34,"endColumn":14,"suggestions":"125"},"no-unused-vars","'axios' is defined but never used.","Identifier","unusedVar","no-native-reassign",["126"],"no-negated-in-lhs",["127"],"'setDb' is assigned a value but never used.","react-hooks/exhaustive-deps","React Hook useEffect has a missing dependency: 'getReview'. Either include it or remove the dependency array.","ArrayExpression",["128"],"'Modal' is defined but never used.","'mobile' is assigned a value but never used.","'show' is assigned a value but never used.","'setPage' is assigned a value but never used.","'success' is assigned a value but never used.","'error' is assigned a value but never used.","'handleClose' is assigned a value but never used.","'handleShow' is assigned a value but never used.","'response' is assigned a value but never used.","react/jsx-no-duplicate-props","No duplicate props allowed","JSXAttribute","'useEffect' is defined but never used.","'Link' is defined but never used.","'FormControl' is defined but never used.","'Navbar' is defined but never used.","'Alert' is defined but never used.","'Col' is defined but never used.","'Card' is defined but never used.","'Row' is defined but never used.","'Button' is defined but never used.","'Image' is defined but never used.","'Table' is defined but never used.","'Redirect' is defined but never used.","'handleSubmit' is defined but never used.","React Hook useEffect has an unnecessary dependency: 'user'. Either exclude it or remove the dependency array. Outer scope values like 'user' aren't valid dependencies because mutating them doesn't re-render the component.",["129"],"no-global-assign","no-unsafe-negation",{"desc":"130","fix":"131"},{"desc":"132","fix":"133"},"Update the dependencies array to be: [getReview]",{"range":"134","text":"135"},"Update the dependencies array to be: []",{"range":"136","text":"137"},[605,607],"[getReview]",[989,995],"[]"]
\ No newline at end of file \ No newline at end of file
...@@ -2,49 +2,38 @@ import React, { useState, useEffect } from 'react' ...@@ -2,49 +2,38 @@ import React, { useState, useEffect } from 'react'
import { Alert, Col, Card, Container, Form, Row, Button, Nav, Navbar, ListGroup, Image, Table } from "react-bootstrap" import { Alert, Col, Card, Container, Form, Row, Button, Nav, Navbar, ListGroup, Image, Table } from "react-bootstrap"
import axios from "axios" import axios from "axios"
import catchErrors from './utils/catchErrors.js' import catchErrors from './utils/catchErrors.js'
import { isAuthenticated } from './utils/auth'
import { Redirect } from 'react-router-dom' import { Redirect } from 'react-router-dom'
const INIT_PAGE = { const INIT_PAGE = {
title: '', name: '',
url: '', bookmark: []
} }
const user = isAuthenticated()
function Bookmark() { function Bookmark() {
const [page, setPage] = useState(INIT_PAGE) const [page, setPage] = useState(INIT_PAGE)
const [success, setSuccess] = useState(false)
const [error, setError] = useState('') const [error, setError] = useState('')
function handleChange(event) {
const {title, value} = event.target
setPage({...page, [title]: value})
}
async function handleSubmit(event) { async function handleSubmit(event) {
event.preventDefault() event.preventDefault()
try { try {
setError('') setError('')
const response = await axios.post('/api/users/bookmark ', page) const response = await axios.post('/api/users/bookmark',page)
console.log(response.data)
console.log(page) console.log(page)
// setUser(INIT_USER) // setUser(INIT_USER)
setSuccess(true)
} catch (error) { } catch (error) {
console.log(error) console.log(error)
catchErrors(error, setError) catchErrors(error, setError)
} }
} }
const add_Page = [{ useEffect(() => {
title:'즐겨찾기1', Bookmark(user)
url:'http://localhost:3000', }, [user])
}, {
title:'즐겨찾기2',
url:'https://www.naver.com/',
}, {
title:'즐겨찾기3',
url:'https://www.youtube.com/watch?v=wo46N-LQK7o'
}]
return ( return (
<Container> <Container>
...@@ -53,10 +42,6 @@ function Bookmark() { ...@@ -53,10 +42,6 @@ function Bookmark() {
<Nav className="mr-auto"> <Nav className="mr-auto">
<Nav.Link href="/">Home</Nav.Link> <Nav.Link href="/">Home</Nav.Link>
</Nav> </Nav>
{/* <Form inline>
<FormControl type="text" placeholder="Search" className="mr-sm-2" />
<Button variant="outline-light">Search</Button>
</Form> */}
</Navbar> </Navbar>
<Form> <Form>
<ListGroup> <ListGroup>
......
...@@ -3,18 +3,11 @@ import React, { useEffect, useState } from 'react'; ...@@ -3,18 +3,11 @@ import React, { useEffect, useState } from 'react';
import { Modal, Container, Row, Button, } from 'react-bootstrap'; import { Modal, Container, Row, Button, } from 'react-bootstrap';
function Place(props) { function Place(props) {
<<<<<<< HEAD
const [reviews, setReviews] = useState([{ title: "", link: "", summery: "", content: "" }])
const getReview = () => {
axios.get(`/api/review/${props.search.name}`)//review를 서버에 연결해서
.then(res => {s
=======
const [reviews, setReviews] = useState() const [reviews, setReviews] = useState()
const [db, setDb] = useState(false) const [db, setDb] = useState(false)
const getReview = () => { const getReview = () => {
axios({ url: `/api/review?keyword=${props.place.name}`, method: 'post', data: { db: db } }) axios({ url: `/api/review?keyword=${props.place.name}`, method: 'post', data: { db: db } })
.then(res => { .then(res => {
>>>>>>> origin/cherry
console.log("place res.data", res.data) console.log("place res.data", res.data)
setReviews(res.data) setReviews(res.data)
}) })
......
...@@ -5,7 +5,7 @@ import Place from './Components/Place'; ...@@ -5,7 +5,7 @@ import Place from './Components/Place';
import { Container, Form, Row, Col, Card, Image, InputGroup, FormControl, Button, Modal } from 'react-bootstrap'; import { Container, Form, Row, Col, Card, Image, InputGroup, FormControl, Button, Modal } from 'react-bootstrap';
import Paginations from './Components/Paginations.js' import Paginations from './Components/Paginations.js'
import catchErrors from './utils/catchErrors.js' import catchErrors from './utils/catchErrors.js'
import * as Icon from 'react-bootstrap-icons'; // import * as Icon from 'react-bootstrap-icons';
import axios from "axios"; import axios from "axios";
const INIT_PAGE = { const INIT_PAGE = {
...@@ -124,7 +124,7 @@ function Search(props) { ...@@ -124,7 +124,7 @@ function Search(props) {
return ( return (
<Col key={index} md={6} > <Col key={index} md={6} >
<Card align="center" border="info" style={{ margin: "3%" }}> <Card align="center" border="info" style={{ margin: "3%" }}>
<Button onSubmit={handleSubmit} variant="outline-info" style={{ marginLeft: "55vh" }} type='submit'><Icon.BookmarkStar size={30} /></Button> {/* <Button onSubmit={handleSubmit} variant="outline-info" style={{ marginLeft: "55vh" }} type='submit'><Icon.BookmarkStar size={30} /></Button> */}
<Card.Title style={{ margin: "3%", fontSize: '200%', fontWeight: 'bold' }}>{place.name} <Card.Title style={{ margin: "3%", fontSize: '200%', fontWeight: 'bold' }}>{place.name}
</Card.Title> </Card.Title>
<Card.Img variant="top" style={{ padding: "5%", width: "100%", height: "340px" }} src={place.img} /> <Card.Img variant="top" style={{ padding: "5%", width: "100%", height: "340px" }} src={place.img} />
...@@ -154,12 +154,3 @@ function Search(props) { ...@@ -154,12 +154,3 @@ function Search(props) {
} }
export default Search export default Search
// async function saveId(bookmarkId) {
// await axios.put('/api/users', {userId:userId, bookmarkId:bookmarkId})
// }
// const bookmarksave = async (req, res) => {
// const {userId, bookmarkId} = req.body
// let bookmark = await Bookmark.findOne({bookmarkId:bookmarkId}).select('user')
// }
...@@ -26,7 +26,7 @@ const searchPlace = async (req, res) => { ...@@ -26,7 +26,7 @@ const searchPlace = async (req, res) => {
places[i] = { name: $1('.biz_name').text(), category: $1('.category').text(), address: $1('.addr').text() } places[i] = { name: $1('.biz_name').text(), category: $1('.category').text(), address: $1('.addr').text() }
}) })
} })
} }
const searchImg = async (req, res) => { const searchImg = async (req, res) => {
...@@ -38,24 +38,24 @@ const searchImg = async (req, res) => { ...@@ -38,24 +38,24 @@ const searchImg = async (req, res) => {
let name = req.query.keyword let name = req.query.keyword
let $1 = cheerio.load(html); let $1 = cheerio.load(html);
axios.get(imgUrl) axios.get(imgUrl)
.then(async (response) => { .then(async (response) => {
const html = response.data const html = response.data
let name = req.params.search let name = req.params.search
let $1 = cheerio.load(html); let $1 = cheerio.load(html);
let images = $1('.RAyV4b').find('img').attr('src') let images = $1('.RAyV4b').find('img').attr('src')
//사진만 업데이트 //사진만 업데이트
let Place = await Places.findOne({ name: req.params.search }) let Place = await Places.findOne({ name: req.params.search })
Place.times.push(new Date().toLocaleString()) Place.times.push(new Date().toLocaleString())
await Places.updateOne({ name: req.params.search }, { img: images, times: Place.times }) await Places.updateOne({ name: req.params.search }, { img: images, times: Place.times })
const newPlaces = await new Places( const newPlaces = await new Places(
).save() ).save()
res.send(images) res.send(images)
}) })
//사진만 업데이트 //사진만 업데이트
let Place = await Places.findOne({ name: req.query.keyword }) let Place = await Places.findOne({ name: req.query.keyword })
...@@ -64,28 +64,28 @@ const searchImg = async (req, res) => { ...@@ -64,28 +64,28 @@ const searchImg = async (req, res) => {
} })
const searchAssociation = async (req, res) => { const searchAssociation = async (req, res) => {
let Place = await Places.findOne({ name: req.query.keyword }) let Place = await Places.findOne({ name: req.query.keyword })
if (!Place) { if (!Place) {
res.send([]) res.send([])
} }
let addresse = Place.address.split(' ')[0] let addresse = Place.address.split(' ')[0]
// let AssociationsId = [] // let AssociationsId = []
let addressPlaces = new RegExp(`${addresse}`) let addressPlaces = new RegExp(`${addresse}`)
let responsePlaces = await Places.find({ address: addressPlaces }) let responsePlaces = await Places.find({ address: addressPlaces })
res.send(responsePlaces) res.send(responsePlaces)
// responsePlaces.map(Association => { // responsePlaces.map(Association => {
// AssociationsId.push(Association._id) // AssociationsId.push(Association._id)
// }) // })
// console.log("Associations = ", Associations) // console.log("Associations = ", Associations)
// res.send(AssociationsId) // res.send(AssociationsId)
} }
export default { searchImg, searchPlace, searchAssociation } export default { searchImg, searchPlace, searchAssociation }
import Review from '../models/Review.js' import Review from '../models/Review.js'
import cheerio from "cheerio"; import cheerio from "cheerio";
<<<<<<< HEAD
import fs from 'fs' import fs from 'fs'
import axios from 'axios'; import axios from 'axios';
...@@ -16,14 +15,14 @@ const search = async (req, res, next) => { ...@@ -16,14 +15,14 @@ const search = async (req, res, next) => {
fs.writeFileSync("googleSearch", response1.data, { encoding: 'utf-8' }) fs.writeFileSync("googleSearch", response1.data, { encoding: 'utf-8' })
// console.log(response1.data) // console.log(response1.data)
const $1 = cheerio.load(response1.data); const $1 = cheerio.load(response1.data); //cheerio? reponse1의 데이터를 로드하는거
$1('.kCrYT').each(async function (i) { $1('.kCrYT').each(async function (i) {
const title = $1(this).find('h3').text() const title = $1(this).find('h3').text() //타이틀에 텍스트 안에 h3값을 찾는다?
const searchParams = new URLSearchParams($1(this).find('a').attr('href')); const searchParams = new URLSearchParams($1(this).find('a').attr('href'));
const link = searchParams.get("/url?q") const link = searchParams.get("/url?q")
const summary = $1(this).find('.s3v9rd').find('.s3v9rd').text() const summary = $1(this).find('.s3v9rd').find('.s3v9rd').text()
content.push(getReview(link)) content.push(getReview(link))
if (title) { if (title) { //타이틀일때 리뷰에 [i] 를 넣었을 때 타이틀, 링크값 설정
reviews[i] = { title: title, link: link } reviews[i] = { title: title, link: link }
} else if (summary) { } else if (summary) {
reviews[i - 1] = { ...reviews[i - 1], summary: summary } reviews[i - 1] = { ...reviews[i - 1], summary: summary }
...@@ -38,55 +37,6 @@ const search = async (req, res, next) => { ...@@ -38,55 +37,6 @@ const search = async (req, res, next) => {
} catch (error) { } catch (error) {
// console.log(error) // console.log(error)
// res.send(error) // res.send(error)
=======
import axios from 'axios';
const search = async (req, res, next) => {
console.log("1")
for (let i = 1; (req.reviews).length > 10; i++) {
try {
console.log("2")
let reviews = []
let content = []
const url = "https://www.google.com/search?q=" + encodeURI(req.query.keyword) + "+site%3Atistory.com&page_no=" + i
const response1 = await axios.get(url)
// console.log(response1.data)
const $1 = cheerio.load(response1.data);
$1('.kCrYT').each(async function (i) {
console.log("3")
const title = $1(this).find('h3').text()
const searchParams = new URLSearchParams($1(this).find('a').attr('href'));
const link = searchParams.get("/url?q")
const summary = $1(this).find('.s3v9rd').find('.s3v9rd').text()
Review.find({ link: link }, function (err, review) {
if (!review) {
content.push(getReview(link))
if (title) {
reviews[i] = { title: title, link: link }
} else if (summary) {
reviews[i - 1] = { ...reviews[i - 1], summary: summary }
reviews = reviews.filter(e => e)
}
}
})
})
let promiseReview = await Promise.all(content)
promiseReview = promiseReview.filter(e => typeof (e) === 'string')
reviews.forEach(async (review, i) => {
console.log("4")
review["content"] = promiseReview[i]
const reviews = new Review(review).save()
reviews.keyword.push(req.query.keyword)
req.reviews.push(reviews)
})
console.log("5")
res.send(reviews)
} catch (error) {
console.log("6")
console.log(error)
res.send(error)
}
>>>>>>> origin/cherry
} }
} }
...@@ -122,23 +72,5 @@ const getReview = async (link) => { ...@@ -122,23 +72,5 @@ const getReview = async (link) => {
return content return content
} }
<<<<<<< HEAD
export default { search, getReview } export default { search, getReview }
=======
const find = (req, res, next) => {
console.log("7", req.body)
if (req.body.db) {
next()
}
Review.find({ keyword:{ $elemMatch: res.query.keyword } }, function (err, reviews) {
if (reviews) {
if (reviews.length > 10)
res.send(reviews, { db: true })
req.reviews = reviews
}
next()
})
}
export default { search, find }
>>>>>>> origin/cherry
...@@ -8,14 +8,6 @@ router.route('/api/users/signup') ...@@ -8,14 +8,6 @@ router.route('/api/users/signup')
router.param('userId', userCtrl.userById) router.param('userId', userCtrl.userById)
// router.get('/admin/:_id', verifyToken, function (req, res, next) { // router.route('/api/users/bookmark')
// console.log('/reserves/admin get req.params', req.params)
// Reserve.find({ approve: false }).populate('user').exec(function (err, reserve) {
// if (err) return res.status(500).json({ error: err });
// console.log('reserve list', reserve)
// res.status(201).json(reserve);
// })
// });
export default router export default router
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment