Commit 90d3d8ee authored by Lee SeoYeon's avatar Lee SeoYeon
Browse files

..

parent a0df9bdf
[{"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":1611552739016,"results":"16","hashOfConfig":"14"},{"size":3147,"mtime":1611553267391,"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":10587,"mtime":1611559111686,"results":"22","hashOfConfig":"14"},{"size":2167,"mtime":1611500202857,"results":"23","hashOfConfig":"14"},{"size":486,"mtime":1611489922054,"results":"24","hashOfConfig":"14"},{"size":2668,"mtime":1611558320008,"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":11,"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":15,"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","69"],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\App.js",["70","71","72","73"],"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",["74","75","76","77","78","79","80","81","82","83","84","85","86","87","88"],{"ruleId":"89","severity":1,"message":"90","line":11,"column":8,"nodeType":"91","messageId":"92","endLine":11,"endColumn":13},{"ruleId":"93","replacedBy":"94"},{"ruleId":"95","replacedBy":"96"},{"ruleId":"89","severity":1,"message":"97","line":7,"column":14,"nodeType":"91","messageId":"92","endLine":7,"endColumn":19},{"ruleId":"98","severity":1,"message":"99","line":21,"column":6,"nodeType":"100","endLine":21,"endColumn":8,"suggestions":"101"},{"ruleId":"89","severity":1,"message":"102","line":22,"column":12,"nodeType":"91","messageId":"92","endLine":22,"endColumn":18},{"ruleId":"89","severity":1,"message":"103","line":23,"column":12,"nodeType":"91","messageId":"92","endLine":23,"endColumn":16},{"ruleId":"89","severity":1,"message":"104","line":24,"column":12,"nodeType":"91","messageId":"92","endLine":24,"endColumn":16},{"ruleId":"89","severity":1,"message":"105","line":24,"column":18,"nodeType":"91","messageId":"92","endLine":24,"endColumn":25},{"ruleId":"89","severity":1,"message":"106","line":25,"column":12,"nodeType":"91","messageId":"92","endLine":25,"endColumn":19},{"ruleId":"89","severity":1,"message":"107","line":25,"column":21,"nodeType":"91","messageId":"92","endLine":25,"endColumn":31},{"ruleId":"89","severity":1,"message":"108","line":26,"column":12,"nodeType":"91","messageId":"92","endLine":26,"endColumn":17},{"ruleId":"89","severity":1,"message":"109","line":26,"column":19,"nodeType":"91","messageId":"92","endLine":26,"endColumn":27},{"ruleId":"89","severity":1,"message":"110","line":28,"column":11,"nodeType":"91","messageId":"92","endLine":28,"endColumn":22},{"ruleId":"89","severity":1,"message":"111","line":29,"column":11,"nodeType":"91","messageId":"92","endLine":29,"endColumn":21},{"ruleId":"112","severity":1,"message":"113","line":99,"column":35,"nodeType":"114","endLine":99,"endColumn":76},{"ruleId":"89","severity":1,"message":"115","line":1,"column":17,"nodeType":"91","messageId":"92","endLine":1,"endColumn":26},{"ruleId":"89","severity":1,"message":"116","line":2,"column":10,"nodeType":"91","messageId":"92","endLine":2,"endColumn":14},{"ruleId":"89","severity":1,"message":"117","line":4,"column":64,"nodeType":"91","messageId":"92","endLine":4,"endColumn":75},{"ruleId":"89","severity":1,"message":"118","line":4,"column":77,"nodeType":"91","messageId":"92","endLine":4,"endColumn":83},{"ruleId":"89","severity":1,"message":"115","line":1,"column":27,"nodeType":"91","messageId":"92","endLine":1,"endColumn":36},{"ruleId":"89","severity":1,"message":"119","line":2,"column":10,"nodeType":"91","messageId":"92","endLine":2,"endColumn":15},{"ruleId":"89","severity":1,"message":"120","line":2,"column":17,"nodeType":"91","messageId":"92","endLine":2,"endColumn":20},{"ruleId":"89","severity":1,"message":"121","line":2,"column":22,"nodeType":"91","messageId":"92","endLine":2,"endColumn":26},{"ruleId":"89","severity":1,"message":"122","line":2,"column":45,"nodeType":"91","messageId":"92","endLine":2,"endColumn":48},{"ruleId":"89","severity":1,"message":"123","line":2,"column":82,"nodeType":"91","messageId":"92","endLine":2,"endColumn":87},{"ruleId":"89","severity":1,"message":"124","line":2,"column":89,"nodeType":"91","messageId":"92","endLine":2,"endColumn":94},{"ruleId":"89","severity":1,"message":"125","line":13,"column":7,"nodeType":"91","messageId":"92","endLine":13,"endColumn":11},{"ruleId":"89","severity":1,"message":"105","line":16,"column":18,"nodeType":"91","messageId":"92","endLine":16,"endColumn":25},{"ruleId":"89","severity":1,"message":"108","line":17,"column":12,"nodeType":"91","messageId":"92","endLine":17,"endColumn":17},{"ruleId":"89","severity":1,"message":"106","line":18,"column":12,"nodeType":"91","messageId":"92","endLine":18,"endColumn":19},{"ruleId":"89","severity":1,"message":"107","line":18,"column":21,"nodeType":"91","messageId":"92","endLine":18,"endColumn":31},{"ruleId":"89","severity":1,"message":"126","line":19,"column":12,"nodeType":"91","messageId":"92","endLine":19,"endColumn":17},{"ruleId":"89","severity":1,"message":"127","line":19,"column":19,"nodeType":"91","messageId":"92","endLine":19,"endColumn":27},{"ruleId":"89","severity":1,"message":"125","line":21,"column":11,"nodeType":"91","messageId":"92","endLine":21,"endColumn":15},"no-unused-vars","'axios' is defined but never used.","Identifier","unusedVar","no-native-reassign",["128"],"no-negated-in-lhs",["129"],"'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",["130"],"'mobile' is assigned a value but never used.","'show' is assigned a value but never used.","'page' is assigned a value but never used.","'setPage' is assigned a value but never used.","'success' is assigned a value but never used.","'setSuccess' is assigned a value but never used.","'error' is assigned a value but never used.","'setError' is assigned a value but never used.","'handleClose' is assigned a value but never used.","'handleShow' 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.","'Image' is defined but never used.","'Table' is defined but never used.","'user' is assigned a value but never used.","'state' is assigned a value but never used.","'setState' is assigned a value but never used.","no-global-assign","no-unsafe-negation",{"desc":"131","fix":"132"},"Update the dependencies array to be: [getReview]",{"range":"133","text":"134"},[605,607],"[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\\App.js":"9","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\PrivateRoute.js":"10","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Bookmark.js":"11","C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Pages\\Search.js":"12"},{"size":1273,"mtime":1611560060506,"results":"13","hashOfConfig":"14"},{"size":362,"mtime":499162500000,"results":"15","hashOfConfig":"14"},{"size":1650,"mtime":1611552739016,"results":"16","hashOfConfig":"14"},{"size":3147,"mtime":1611553267391,"results":"17","hashOfConfig":"14"},{"size":405,"mtime":1609915408569,"results":"18","hashOfConfig":"14"},{"size":2959,"mtime":1611699671429,"results":"19","hashOfConfig":"14"},{"size":723,"mtime":1611670762295,"results":"20","hashOfConfig":"14"},{"size":2199,"mtime":1610503781980,"results":"21","hashOfConfig":"14"},{"size":2129,"mtime":1611699902042,"results":"22","hashOfConfig":"14"},{"size":438,"mtime":1611699613873,"results":"23","hashOfConfig":"14"},{"size":2646,"mtime":1611699941894,"results":"24","hashOfConfig":"14"},{"size":9095,"mtime":1611699762674,"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},{"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":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"47","messages":"48","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"49","messages":"50","errorCount":0,"warningCount":15,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"51","messages":"52","errorCount":0,"warningCount":7,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\index.js",["53"],"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 './Pages/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",["54","55"],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\reportWebVitals.js",[],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\Place.js",["56","57"],"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\\App.js",[],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Components\\PrivateRoute.js",[],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Bookmark.js",["58","59","60","61","62","63","64","65","66","67","68","69","70","71","72"],"C:\\Users\\hello\\Desktop\\project\\search-page\\client\\src\\Pages\\Search.js",["73","74","75","76","77","78","79"],{"ruleId":"80","severity":1,"message":"81","line":11,"column":8,"nodeType":"82","messageId":"83","endLine":11,"endColumn":13},{"ruleId":"84","replacedBy":"85"},{"ruleId":"86","replacedBy":"87"},{"ruleId":"80","severity":1,"message":"88","line":7,"column":14,"nodeType":"82","messageId":"83","endLine":7,"endColumn":19},{"ruleId":"89","severity":1,"message":"90","line":21,"column":6,"nodeType":"91","endLine":21,"endColumn":8,"suggestions":"92"},{"ruleId":"80","severity":1,"message":"93","line":1,"column":27,"nodeType":"82","messageId":"83","endLine":1,"endColumn":36},{"ruleId":"80","severity":1,"message":"94","line":2,"column":10,"nodeType":"82","messageId":"83","endLine":2,"endColumn":15},{"ruleId":"80","severity":1,"message":"95","line":2,"column":17,"nodeType":"82","messageId":"83","endLine":2,"endColumn":20},{"ruleId":"80","severity":1,"message":"96","line":2,"column":22,"nodeType":"82","messageId":"83","endLine":2,"endColumn":26},{"ruleId":"80","severity":1,"message":"97","line":2,"column":45,"nodeType":"82","messageId":"83","endLine":2,"endColumn":48},{"ruleId":"80","severity":1,"message":"98","line":2,"column":82,"nodeType":"82","messageId":"83","endLine":2,"endColumn":87},{"ruleId":"80","severity":1,"message":"99","line":2,"column":89,"nodeType":"82","messageId":"83","endLine":2,"endColumn":94},{"ruleId":"80","severity":1,"message":"100","line":15,"column":18,"nodeType":"82","messageId":"83","endLine":15,"endColumn":25},{"ruleId":"80","severity":1,"message":"101","line":16,"column":12,"nodeType":"82","messageId":"83","endLine":16,"endColumn":17},{"ruleId":"80","severity":1,"message":"102","line":17,"column":12,"nodeType":"82","messageId":"83","endLine":17,"endColumn":19},{"ruleId":"80","severity":1,"message":"103","line":17,"column":21,"nodeType":"82","messageId":"83","endLine":17,"endColumn":31},{"ruleId":"80","severity":1,"message":"104","line":18,"column":12,"nodeType":"82","messageId":"83","endLine":18,"endColumn":17},{"ruleId":"80","severity":1,"message":"105","line":18,"column":19,"nodeType":"82","messageId":"83","endLine":18,"endColumn":27},{"ruleId":"80","severity":1,"message":"106","line":20,"column":11,"nodeType":"82","messageId":"83","endLine":20,"endColumn":15},{"ruleId":"107","severity":1,"message":"108","line":39,"column":21,"nodeType":"109","endLine":39,"endColumn":32},{"ruleId":"80","severity":1,"message":"110","line":2,"column":16,"nodeType":"82","messageId":"83","endLine":2,"endColumn":24},{"ruleId":"80","severity":1,"message":"111","line":17,"column":12,"nodeType":"82","messageId":"83","endLine":17,"endColumn":18},{"ruleId":"89","severity":1,"message":"112","line":68,"column":8,"nodeType":"91","endLine":68,"endColumn":10,"suggestions":"113"},{"ruleId":"89","severity":1,"message":"114","line":72,"column":8,"nodeType":"91","endLine":72,"endColumn":21,"suggestions":"115"},{"ruleId":"89","severity":1,"message":"116","line":82,"column":8,"nodeType":"91","endLine":82,"endColumn":15,"suggestions":"117"},{"ruleId":"80","severity":1,"message":"118","line":85,"column":11,"nodeType":"82","messageId":"83","endLine":85,"endColumn":17},{"ruleId":"119","severity":1,"message":"120","line":163,"column":35,"nodeType":"109","endLine":163,"endColumn":76},"no-unused-vars","'axios' is defined but never used.","Identifier","unusedVar","no-native-reassign",["121"],"no-negated-in-lhs",["122"],"'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",["123"],"'useEffect' 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.","'Image' is defined but never used.","'Table' is defined but never used.","'setPage' is assigned a value but never used.","'error' is assigned a value but never used.","'success' is assigned a value but never used.","'setSuccess' is assigned a value but never used.","'state' is assigned a value but never used.","'setState' is assigned a value but never used.","'user' is assigned a value but never used.","react/style-prop-object","Style prop value must be an object","JSXAttribute","'Redirect' is defined but never used.","'mobile' is assigned a value but never used.","React Hook useEffect has a missing dependency: 'getAssociation'. Either include it or remove the dependency array.",["124"],"React Hook useEffect has a missing dependency: 'index'. Either include it or remove the dependency array. You can also replace multiple useState variables with useReducer if 'setPagePlace' needs the current value of 'index'.",["125"],"React Hook useEffect has missing dependencies: 'getAssociation', 'props.history', and 'search'. Either include them or remove the dependency array.",["126"],"'places' is assigned a value but never used.","react/jsx-no-duplicate-props","No duplicate props allowed","no-global-assign","no-unsafe-negation",{"desc":"127","fix":"128"},{"desc":"129","fix":"130"},{"desc":"131","fix":"132"},{"desc":"133","fix":"134"},"Update the dependencies array to be: [getReview]",{"range":"135","text":"136"},"Update the dependencies array to be: [getAssociation]",{"range":"137","text":"138"},"Update the dependencies array to be: [association, index]",{"range":"139","text":"140"},"Update the dependencies array to be: [getAssociation, props.history, search, state]",{"range":"141","text":"142"},[605,607],"[getReview]",[2337,2339],"[getAssociation]",[2447,2460],"[association, index]",[2690,2697],"[getAssociation, props.history, search, state]"]
\ No newline at end of file \ No newline at end of file
import React, { useEffect, useState } from 'react'; import React, { useState } from 'react';
import { Link, Redirect } from 'react-router-dom'; import { Redirect } from 'react-router-dom';
import ohuh from './ohuh.PNG' import ohuh from './ohuh.PNG'
import { Container, Row, Form, Image, InputGroup, Button, Col, FormControl, Navbar, Nav } from 'react-bootstrap'; import { Container, Row, Form, Image, InputGroup, Button, Col, Nav } from 'react-bootstrap';
import { handleLogout, isAuthenticated } from './utils/auth.js' import { handleLogout, isAuthenticated } from './utils/auth.js'
function App() { function App() {
......
...@@ -10,7 +10,6 @@ const INIT_PAGE = { ...@@ -10,7 +10,6 @@ const INIT_PAGE = {
} }
const user = isAuthenticated()
function Bookmark() { function Bookmark() {
const [page, setPage] = useState(INIT_PAGE) const [page, setPage] = useState(INIT_PAGE)
...@@ -35,26 +34,9 @@ function Bookmark() { ...@@ -35,26 +34,9 @@ function Bookmark() {
} }
} }
// async function handleSubmit(e){
// setState(true); //버튼이 눌려서 handlesubmit이될때 setState값이 true로 바뀐다
// try { //respons 서버에 post로 요청하여 데이터를 받아온다
// const response = await axios.post('/api/users/bookmark', page)
// setSuccess(true)
// } catch (error) {
// console.log(error)
// catchErrors(error, setError)
// }
// }
// useEffect(() => {
// getBookmark(user)
// }, [user])
return ( return (
<Container> <Container>
<Navbar bg="primary" variant="dark"> <Navbar style={"#"} bg="primary" variant="dark">
<Navbar.Brand href="/">북마크</Navbar.Brand> <Navbar.Brand href="/">북마크</Navbar.Brand>
<Nav className="mr-auto"> <Nav className="mr-auto">
<Nav.Link href="/">Home</Nav.Link> <Nav.Link href="/">Home</Nav.Link>
...@@ -75,3 +57,19 @@ function Bookmark() { ...@@ -75,3 +57,19 @@ function Bookmark() {
} }
export default Bookmark export default Bookmark
// async function handleSubmit(e){
// setState(true); //버튼이 눌려서 handlesubmit이될때 setState값이 true로 바뀐다
// try { //respons 서버에 post로 요청하여 데이터를 받아온다
// const response = await axios.post('/api/users/bookmark', page)
// setSuccess(true)
// } catch (error) {
// console.log(error)
// catchErrors(error, setError)
// }
// }
// useEffect(() => {
// getBookmark(user)
// }, [user])
\ No newline at end of file
import React from 'react' import React from 'react'
import { Route, Redirect } from 'react-router-dom' import { Route, Redirect } from 'react-router-dom'
import { isAuthenticated } from "../utils/auth"; import { isAuthenticated } from "../utils/auth";
//로그인 했을때 경로 실행하게 한다
function PrivateRoute({path, children}) { function PrivateRoute({path, children}) {
if (isAuthenticated()) { if (isAuthenticated()) {
return ( return (
......
...@@ -20,7 +20,7 @@ function Signup() { ...@@ -20,7 +20,7 @@ function Signup() {
const isUser = Object.values(user).every(el => Boolean(el)) const isUser = Object.values(user).every(el => Boolean(el))
isUser ? setDisabled(false) : setDisabled(true) isUser ? setDisabled(false) : setDisabled(true)
}, [user]) }, [user])
//바뀌는것이 있을때 이벤트가 발생하는 함수? //바뀌는것이 있을때 이벤트가 발생하는 함수
function handleChange(event) { function handleChange(event) {
const {name, value} = event.target const {name, value} = event.target
setUser({...user, [name]: value}) setUser({...user, [name]: value})
...@@ -33,7 +33,6 @@ function Signup() { ...@@ -33,7 +33,6 @@ function Signup() {
const response = await axios.post('/api/users/signup', user) const response = await axios.post('/api/users/signup', user)
console.log(response.data) console.log(response.data)
console.log(user) console.log(user)
// setUser(INIT_USER)
setSuccess(true) setSuccess(true)
} catch (error) { } catch (error) {
console.log(error) console.log(error)
......
import React from 'react'
function Hello(props) {
console.log(props)
return (
<>
<h1>Hello</h1>
<div>
안녕하세요 {props.name}.
</div>
<input/>
</>
)
}
export default Hello
...@@ -6,6 +6,7 @@ import { Container, Form, Row, Col, Card, Image, InputGroup, FormControl, Button ...@@ -6,6 +6,7 @@ import { Container, Form, Row, Col, Card, Image, InputGroup, FormControl, Button
import Paginations from '../Components/Paginations'; import Paginations from '../Components/Paginations';
import axios from 'axios'; import axios from 'axios';
import queryString from 'query-string' import queryString from 'query-string'
import * as Icon from 'react-bootstrap-icons';
function Search(props) { function Search(props) {
const endPage = 10; const endPage = 10;
...@@ -14,10 +15,9 @@ function Search(props) { ...@@ -14,10 +15,9 @@ function Search(props) {
const [showSet, setShowSet] = useState([false, false, false, false]); const [showSet, setShowSet] = useState([false, false, false, false]);
const [search, setSearch] = useState(queryString.parse(props.location.search).keyword); const [search, setSearch] = useState(queryString.parse(props.location.search).keyword);
const [mobile, setMobile] = useState(); const [mobile, setMobile] = useState();
// const [place, setPlace] = useState([{ name: "", category: "", address: "" }])
// const [imgUrl, setImgUrl] = useState([])
const [association, setAssociation] = useState([]) const [association, setAssociation] = useState([])
const [pagePlace, setPagePlace] = useState([]) const [pagePlace, setPagePlace] = useState([])
const [bookmark, setBookmark] = useState([false, false, false, false])
// console.log("search###############", search) // console.log("search###############", search)
// const getPlace = () => { // const getPlace = () => {
...@@ -58,8 +58,6 @@ function Search(props) { ...@@ -58,8 +58,6 @@ function Search(props) {
useEffect(() => { useEffect(() => {
// getPlace()
// getImg()
getAssociation() getAssociation()
if (window.innerWidth < 960) { if (window.innerWidth < 960) {
setMobile(true) setMobile(true)
...@@ -70,14 +68,10 @@ function Search(props) { ...@@ -70,14 +68,10 @@ function Search(props) {
}, []); }, []);
useEffect(() => { useEffect(() => {
// getImg()
// getAssociation()
setPagePlace(paginate(association, index, association.length)) setPagePlace(paginate(association, index, association.length))
}, [association]) }, [association])
useEffect(() => { useEffect(() => {
// getPlace()
// getImg()
getAssociation() getAssociation()
if (state) { if (state) {
props.history.push('/search?keyword=' + search) props.history.push('/search?keyword=' + search)
...@@ -144,7 +138,21 @@ function Search(props) { ...@@ -144,7 +138,21 @@ function Search(props) {
return page return page
} }
async function handlebookmark(index, place) {
if (!bookmark[index]) {
// const response = await axios.put('/api/bookmark',)
alert('북마크가 저장되었습니다.')
const showArr = bookmark
showArr[index] = true
setBookmark(showArr)
} else {
// axios.delete('')
alert('저장된 북마크가 삭제되었습니다.')
const showArr = bookmark
showArr[index] = false
setBookmark(showArr)
}
}
let time = new Date() let time = new Date()
...@@ -174,6 +182,11 @@ function Search(props) { ...@@ -174,6 +182,11 @@ 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
style={{ marginLeft: "50vh" }}
onClick={() => handlebookmark(index, place)}>
{console.log(bookmark)} <Icon.BookmarkStarFill size={35} /> <Icon.BookmarkStar size={35} />
</Button>
<Card.Title style={{ margin: "3%", fontSize: '200%', fontWeight: 'bold' }} >{place.name}</Card.Title> <Card.Title style={{ margin: "3%", fontSize: '200%', fontWeight: 'bold' }} >{place.name}</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} />
<Card.Body > <Card.Body >
......
import React, { useState, useEffect } from 'react';
import { Link, Redirect } from 'react-router-dom';
import ohuh from './ohuh-sm.PNG';
import Place from './Components/Place';
import { Container, Form, Row, Col, Card, Image, InputGroup, FormControl, Button } from 'react-bootstrap';
import Paginations from './Components/Paginations.js'
// import catchErrors from './utils/catchErrors.js'
// import * as Icon from 'react-bootstrap-icons';
// import axios from "axios";
const INIT_PAGE = {
title: '',
url: '',
} //초기페이지에 타이틀이랑 url 저장
function Search(props) {
const endPage = 10;
const [state, setState] = useState(false);
const [index, setIndex] = useState(1);
const [showSet, setShowSet] = useState([false, false, false, false]);
const [search, setSearch] = useState(props.location.state.id);
const [mobile, setMobile] = useState();
const [show, setShow] = useState(false);
const [page, setPage] = useState(INIT_PAGE)
const [success, setSuccess] = useState(false)
const [error, setError] = useState('')
const handleClose = () => setShow(false);
const handleShow = () => setShow(true);
useEffect(() => {
if (window.innerWidth < 960) {
setMobile(true)
} else {
setMobile(false)
}
}, []);
const places = [{
name: "한라산(hallasan)",
address: "제주 서귀포시 토평동 산15-1",
img: "data:image/png;base64,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",
// 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",
// }, {
// name: "성산일출봉(sungsan)",
// address: "제주 서귀포시 성산읍 성산리 1",
// 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",
// }, {
// name: "해녀의 집(haenyeo)",
// address: "제주 서귀포시 성산읍 한도로 141-13지번오조리 3 오조해녀의집",
// img: "https://mblogthumb-phinf.pstatic.net/MjAxNjExMTdfMTc0/MDAxNDc5MzU3ODU0ODQy.KZYXCjzsXT3rCsE4HXBfxyCg2buvluBvN_7NxVp7BSwg.loJc89d8JjGXdNCn-4yMd7aMWPjfrZn21TI9Hyzemkog.JPEG.icocam11/20161010_100205.jpg?type=w800",
// }, {
// name: "오설록 티 뮤지엄(osulloc)",
// address: "제주 서귀포시 안덕면 신화역사로 15 오설록지번서광리 1235-1 오설록",
// img: "https://cdnweb01.wikitree.co.kr/webdata/editor/202007/01/img_20200701143323_2ced7627.webp",
// }, {
// name: "오설록 티 뮤지엄(osulloc)",
// address: "제주 서귀포시 안덕면 신화역사로 15 오설록지번서광리 1235-1 오설록",
// 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",
}]
if (state !== false) {
return <Redirect to={{
pathname: `/search/${search}`,
state: { id: search },
}} />;
}
const handlePage = (num) => {
setIndex(num);
}
// async function bookmarkSave() {
// await axios.put('/api/users', {userId:userId, bookmarkId:bookmarkId})
// }
const handleChange = (e) => {
setSearch(e.target.value);
}
async function handleSubmit(e){
setState(true); //버튼이 눌려서 handlesubmit이될때 setState값이 true로 바뀐다
}
function paginate(items, pageNumber, itemNumber) {
const page = []; //페이지를 빈배열로 설정
const startIndex = (pageNumber - 1) * itemNumber // 처음인덱스 값이 페이지넘버 -1 * 아이템 넘버로
for (var i = 0; i < itemNumber; i++) {
page.push(items[(startIndex + i)])
}
return page
}
const pagePlace = paginate(places, index, 1)
return (
<Container >
<Link to="/" className="d-flex justify-content-center"><Image src={ohuh} /></Link>
<Row className="mb-2" className="d-flex justify-content-center">
<Form style={{ width: "90vw" }} onSubmit={handleSubmit}>
<InputGroup size="lg">
<FormControl
placeholder="검색어를 입력하세요."
value={search}
aria-label="Large"
aria-describedby="inputGroup-sizing-sm"
onChange={handleChange}
/>
<InputGroup.Append>
<Button type="submit" variant="outline-secondary" style={{ maxHeight: "8vh", maxWidth: "14vh" }} >검색</Button>
</InputGroup.Append>
</InputGroup>
</Form>
</Row>
<Row className="d-flex flex-wrap">
{pagePlace.map((place, index) => {
return (
<Col key={index} md={6} >
<Card align="center" border="info" style={{ margin: "3%" }}>
{/* <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>
<Card.Img variant="top" style={{ padding: "5%", width: "100%", height: "340px" }} src={place.img} />
<Card.Body >
<Card.Text style={{ overflow: 'auto', fontSize: '25px', width: '100%', height: "80px" }} >
{place.address} </Card.Text>
<Button variant="primary" onClick={() => {
const showArr = [false, false, false, false]
showArr[index] = true
setShowSet(showArr)
}}>{place.name} 자세히 살펴보기</Button>
<Place search={place} index={index} show={showSet[index]} onHide={() => setShowSet([false, false, false, false])} />
</Card.Body>
</Card>
</Col>
)
})}
</Row>
{ console.log(showSet)}
{/* show가 전부 true로 바뀌어서 전부 다 보이게 되는 것이다. */}
<Row className="mt-2 d-flex justify-content-center">
<Paginations index={index} endPage={endPage} handlePage={handlePage}></Paginations>
</Row>
</Container>
);
}
export default Search
...@@ -3,7 +3,7 @@ import ReactDOM from 'react-dom'; ...@@ -3,7 +3,7 @@ import ReactDOM from 'react-dom';
import './index.css'; import './index.css';
import 'bootstrap/dist/css/bootstrap.min.css'; import 'bootstrap/dist/css/bootstrap.min.css';
import App from './App' import App from './App'
import Search from './Search'; import Search from './Pages/Search';
import reportWebVitals from './reportWebVitals'; import reportWebVitals from './reportWebVitals';
import Signup from './Components/Signup' import Signup from './Components/Signup'
import Login from './Components/Login' import Login from './Components/Login'
......
...@@ -6,7 +6,7 @@ export function handleLogin(userId) { //로그인할때 로컬스토리지에 ...@@ -6,7 +6,7 @@ export function handleLogin(userId) { //로그인할때 로컬스토리지에
export async function handleLogout() { export async function handleLogout() {
localStorage.removeItem('loginStatus') //로컬스토리지에서 로그인상태를 지운다 localStorage.removeItem('loginStatus') //로컬스토리지에서 로그인상태를 지운다
await axios.get('/api/auth/logout') //? await axios.get('/api/auth/logout')
window.location.href='/' //경로 지정 window.location.href='/' //경로 지정
} }
//유저가 로그인 했는 지 확인하는 함수 //유저가 로그인 했는 지 확인하는 함수
......
...@@ -6,33 +6,27 @@ import config from "../config.js" ...@@ -6,33 +6,27 @@ import config from "../config.js"
const login = async (req, res) => { const login = async (req, res) => {
const { email, password } = req.body //구조분해해서 하나씩 const { email, password } = req.body //구조분해해서 하나씩
console.log( email, password) console.log( email, password)
try { //적어도 3개 맥시멈 10개 가 아니면 try {
// 1) 사용자 확인
const user = await User.findOne({email}).select('+password') const user = await User.findOne({email}).select('+password')
// 2) 이메일 사용자가 없으면 에러 반환
if (!user) { if (!user) {
return res.status(404).send(`${email}이 없습니다`) return res.status(404).send(`${email}이 없습니다`)
} }
// 3) 비밀번호 일치 확인
const passwordMatch = await bcrypt.compare(password, user.password) const passwordMatch = await bcrypt.compare(password, user.password)
// 4) 비밀번호가 맞으면 토큰 생성 후 쿠키에 저장 if (passwordMatch) {
if (passwordMatch) { //비밀스럽게 한다 노출되면 안된다 문자열
const token = jwt.sign({userId: user._id}, config.jwtSecret,{ const token = jwt.sign({userId: user._id}, config.jwtSecret,{
expiresIn: '7d' //만기날짜 expiresIn: '7d'
}) })
// 쿠키의 이름, 쿠키의 value
res.cookie('token', token, { res.cookie('token', token, {
maxAge: config.cookieMaxAge, //쿠키 얼마동안 살아있을지 생성일이 지나면 자동으로 사라짐 maxAge: config.cookieMaxAge,
httpOnly: true, //client쪽에서 자바스크립트에서 쿠키 접근 불가 httpOnly: true,
secure: config.env === 'production' //true가되면 https로만 접근가능 secure: config.env === 'production'
}) })
res.json({userId: user._id}) res.json({userId: user._id})
// 5) 비밀번호가 틀리면 에러 반환
} else { } else {
res.status(401).send('비밀번호가 일치하지 않습니다') res.status(401).send('비밀번호가 일치하지 않습니다')
} }
} catch (error) { //다른 과정에서 에러가 나면 실행 } catch (error) {
console.log(error) console.log(error)
res.status(500).send('로그인 에러') res.status(500).send('로그인 에러')
} }
......
...@@ -6,7 +6,7 @@ import bcrypt from "bcryptjs"; ...@@ -6,7 +6,7 @@ import bcrypt from "bcryptjs";
const signup = async (req, res) => { const signup = async (req, res) => {
const { name, email, password } = req.body //구조분해해서 하나씩 const { name, email, password } = req.body //구조분해해서 하나씩
console.log(name, email, password) console.log(name, email, password)
try { //적어도 3개 맥시멈 10개 가 아니면 try {
if (!isLength(name, { min: 3, max: 10 })) { if (!isLength(name, { min: 3, max: 10 })) {
return res.status(422).send('이름은 3-10자 사이입니다') return res.status(422).send('이름은 3-10자 사이입니다')
} else if (!isLength(password, { min: 6 })) { } else if (!isLength(password, { min: 6 })) {
...@@ -39,7 +39,7 @@ const userById = async (req, res, next, id) => { ...@@ -39,7 +39,7 @@ const userById = async (req, res, next, id) => {
res.status(404).send('사용자를 찾을 수 없습니다') res.status(404).send('사용자를 찾을 수 없습니다')
} }
req.profile = user req.profile = user
next() //만나는 순간 다음 미들웨어로 진행 없으면 가만히 있는다 next()
} catch (error) { } catch (error) {
console.log(error) console.log(error)
res.status(500).send('사용자 아이디 검색 실패') res.status(500).send('사용자 아이디 검색 실패')
...@@ -64,25 +64,8 @@ const getBookmark = async (req, res) => { ...@@ -64,25 +64,8 @@ const getBookmark = async (req, res) => {
res.send(updatedUser) res.send(updatedUser)
} }
// const putBookmark = async (req, res) => { // function handlebookmark() {
// const newBookmark = new Bookmark ({ // const bookmarkUser = await User.findOne({})
// bookmark,
// }).save()
// console.log(newBookmark)
// res.json(newBookmark)
// }
// const bookMark = async (req, res) => {
// const {title, url} = req.body
// console.log(title, url)
// try {
// let bookmark = []
// const newBookmark = await new User ({
// bookmark,
// }).save()
// } catch (error) {
// console.log(error)
// res.status(500).send('사용자 아이디 검색 실패')
// }
// } // }
export default { signup, userById, getBookmark } export default { signup, userById, getBookmark }
\ No newline at end of file
import mongoose from "mongoose"; import mongoose from "mongoose";
const { String } = mongoose.Schema.Types const { String, Array, ObjectId } = mongoose.Schema.Types
const { Array } = mongoose.Schema.Types
const { Schema } = mongoose;
const { Types: { ObjectId } } = Schema;
const ReserveSchema = new Schema({
user: {
type: ObjectId,
required: true,
ref: 'User',
},
})
const UserSchema = new mongoose.Schema({ const UserSchema = new mongoose.Schema({
name: { name: {
...@@ -34,10 +23,10 @@ const UserSchema = new mongoose.Schema({ ...@@ -34,10 +23,10 @@ const UserSchema = new mongoose.Schema({
default: 'user', default: 'user',
enum: ['user', 'admin', 'root'] enum: ['user', 'admin', 'root']
}, },
bookmark: { bookmark: [{
type: Array, type: ObjectId,
required: true, ref: 'Place'
} }]
}, { }, {
timestamps: true timestamps: true
}) })
......
...@@ -2,7 +2,7 @@ import express from "express" ...@@ -2,7 +2,7 @@ import express from "express"
import authCtrl from "../controllers/auth.controller.js" import authCtrl from "../controllers/auth.controller.js"
const router = express.Router() const router = express.Router()
//경로 설정?
router.route('/api/auth/login') router.route('/api/auth/login')
.post(authCtrl.login) .post(authCtrl.login)
......
...@@ -8,10 +8,7 @@ router.route('/api/users/signup') ...@@ -8,10 +8,7 @@ router.route('/api/users/signup')
router.route('/api/users/bookmark') router.route('/api/users/bookmark')
.put(userCtrl.getBookmark) .put(userCtrl.getBookmark)
// .get(userCtrl.putBookmark)
router.param('userId', userCtrl.userById) router.param('userId', userCtrl.userById)
// router.route('/api/users/bookmark')
export default router export default router
\ No newline at end of file
...@@ -9,8 +9,6 @@ connectDb() ...@@ -9,8 +9,6 @@ connectDb()
const app = express() const app = express()
app.use('/images', express.static('uploads/'))
app.use(express.json()) app.use(express.json())
app.use(placeRouter) app.use(placeRouter)
...@@ -18,11 +16,6 @@ app.use(reviewRouter) ...@@ -18,11 +16,6 @@ app.use(reviewRouter)
app.use(userRouter) app.use(userRouter)
app.use(authRouter) app.use(authRouter)
app.get('/', (req, res) => {
console.log("/ req.body", req.body)
res.json({ message: "http://localhost3001/ 에 연결됨" })
})
app.listen(3001, () => { app.listen(3001, () => {
console.log('Listening on port 3001') console.log('Listening on port 3001')
}) })
\ No newline at end of file
...@@ -7,7 +7,7 @@ async function connectDb() { ...@@ -7,7 +7,7 @@ async function connectDb() {
if (connection.isConnected) { if (connection.isConnected) {
return return
} }
//디비연결
const db = await mongoose.connect(config.mongoDbUri, { const db = await mongoose.connect(config.mongoDbUri, {
useNewUrlParser: true, useNewUrlParser: true,
useUnifiedTopology: true, useUnifiedTopology: true,
......
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