From 6049ec998343788996f83b4eb240d3501dbd106a Mon Sep 17 00:00:00 2001 From: Aymeric Chaumont <aymeric.chaumont@student-cs.fr> Date: Tue, 5 Jul 2022 16:04:50 +0200 Subject: [PATCH] added waiting time component, fixed waiting time back routes, added front .env --- backend/.env.template | 2 +- backend/db/crud.py | 8 ++- backend/docker-compose.yml | 2 +- backend/main.py | 2 +- frontend/.env.template | 2 + frontend/package-lock.json | 72 +++++++++++++++++++++----- frontend/package.json | 1 + frontend/src/components/Timetable.js | 2 +- frontend/src/components/WaitingTime.js | 26 ++++++++++ frontend/src/components/index.js | 3 +- frontend/src/styles/Timetable.css | 7 +++ frontend/src/styles/WaitingTime.css | 19 +++++++ frontend/src/views/Eiffel.js | 14 ++++- 13 files changed, 140 insertions(+), 20 deletions(-) create mode 100644 frontend/.env.template create mode 100644 frontend/src/components/WaitingTime.js create mode 100644 frontend/src/styles/WaitingTime.css diff --git a/backend/.env.template b/backend/.env.template index 87b242d..3c404ba 100644 --- a/backend/.env.template +++ b/backend/.env.template @@ -6,4 +6,4 @@ MYSQL_ROOT_PASSWORD=rootpassword DB_HOST=localhost DB_PORT=3306 -WEB_ROOT=http://localhost:8000 \ No newline at end of file +WEB_ROOT=http://localhost:3000 \ No newline at end of file diff --git a/backend/db/crud.py b/backend/db/crud.py index b90c047..02e961e 100644 --- a/backend/db/crud.py +++ b/backend/db/crud.py @@ -17,4 +17,10 @@ def create_record(new_record: schemas.RecordBase, db: Session): db.add(db_record) db.commit() db.refresh(db_record) - return db_record \ No newline at end of file + return db_record + + +def get_waiting_time(place: str, db: Session): + """ Get the last estimated waiting time for the given place """ + db_record = db.query(models.Records).filter(models.Records.place == place).order_by(models.Records.date.desc()).one() + return db_record.waiting_time diff --git a/backend/docker-compose.yml b/backend/docker-compose.yml index 76308ff..1ef4211 100644 --- a/backend/docker-compose.yml +++ b/backend/docker-compose.yml @@ -8,7 +8,7 @@ services: env_file: .env command: ["mysqld", "--authentication-policy=mysql_native_password"] ports: - - "3306:3306" + - "3307:3306" volumes: - mysql-db:/var/lib/mysql diff --git a/backend/main.py b/backend/main.py index 5aeddc9..c808a6f 100644 --- a/backend/main.py +++ b/backend/main.py @@ -89,4 +89,4 @@ async def estimate_(id: str) -> float: pred_map = np.squeeze(model.predict(input_image)) count_prediction = np.sum(pred_map) return count_prediction -""" \ No newline at end of file +""" diff --git a/frontend/.env.template b/frontend/.env.template new file mode 100644 index 0000000..7a3df20 --- /dev/null +++ b/frontend/.env.template @@ -0,0 +1,2 @@ +REACT_APP_BASE_URL_BACK=http://localhost:3001/api +REACT_APP_BASE_URL_FRONT=http://localhost:3000 \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 9f7ff56..992e115 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -11,6 +11,7 @@ "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^13.2.0", "@testing-library/user-event": "^14.2.0", + "axios": "^0.27.2", "bootstrap": "^5.1.3", "eslint": "^8.18.0", "history": "^5.3.0", @@ -5737,6 +5738,28 @@ "node": ">=12" } }, + "node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -7938,14 +7961,6 @@ "tslib": "^2.0.3" } }, - "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "engines": { - "node": ">=10" - } - }, "node_modules/dotenv-expand": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", @@ -16536,6 +16551,14 @@ } } }, + "node_modules/react-scripts/node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "engines": { + "node": ">=10" + } + }, "node_modules/react-side-effect": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz", @@ -24982,6 +25005,27 @@ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.2.tgz", "integrity": "sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA==" }, + "axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "requires": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, "axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -26627,11 +26671,6 @@ "tslib": "^2.0.3" } }, - "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" - }, "dotenv-expand": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", @@ -32951,6 +32990,13 @@ "webpack-dev-server": "^4.6.0", "webpack-manifest-plugin": "^4.0.2", "workbox-webpack-plugin": "^6.4.1" + }, + "dependencies": { + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" + } } }, "react-side-effect": { diff --git a/frontend/package.json b/frontend/package.json index def2739..2591c0b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -6,6 +6,7 @@ "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^13.2.0", "@testing-library/user-event": "^14.2.0", + "axios": "^0.27.2", "bootstrap": "^5.1.3", "eslint": "^8.18.0", "history": "^5.3.0", diff --git a/frontend/src/components/Timetable.js b/frontend/src/components/Timetable.js index 23a123a..92a0911 100644 --- a/frontend/src/components/Timetable.js +++ b/frontend/src/components/Timetable.js @@ -7,7 +7,7 @@ import styles from "../styles/Timetable.css" export default function Timetable (schedule) { const timetable = schedule.schedule; return( - <div style={{ borderRadius: '5px', width: '500px', textAlign: 'center' }}> + <div className = "timetable"> <Table className="table table-striped table-bordered"> <tbody> <tr> diff --git a/frontend/src/components/WaitingTime.js b/frontend/src/components/WaitingTime.js new file mode 100644 index 0000000..a2401b5 --- /dev/null +++ b/frontend/src/components/WaitingTime.js @@ -0,0 +1,26 @@ +import React from "react" +import axios from "axios" + +import styles from "../styles/WaitingTime.css" + + +export default function WaitingTime({place}) { + const baseURL = process.env.REACT_APP_BASE_URL_BACK + '/' + place + "/waiting_time"; + const [post, setPost] = React.useState(null); + + React.useEffect(() => { + axios.get(baseURL).then((response) => { + setPost(Math.round(response.data / 60)); + console.log(response.data) + }); + }, []); + + if (!post) return null; + return ( + <div className="parent"> + <div className="waiting-time"> + Temps d'attente estimé à <b>{post} minutes</b>. + </div> + </div> + ) +} diff --git a/frontend/src/components/index.js b/frontend/src/components/index.js index 6c78013..02b59c9 100644 --- a/frontend/src/components/index.js +++ b/frontend/src/components/index.js @@ -1,3 +1,4 @@ export { default as Header } from "./Header" export { default as Footer } from "./Footer" -export { default as Timetable } from "./Timetable" \ No newline at end of file +export { default as Timetable } from "./Timetable" +export { default as WaitingTime } from "./WaitingTime" \ No newline at end of file diff --git a/frontend/src/styles/Timetable.css b/frontend/src/styles/Timetable.css index e69de29..fe1502d 100644 --- a/frontend/src/styles/Timetable.css +++ b/frontend/src/styles/Timetable.css @@ -0,0 +1,7 @@ +.timetable{ + display: inline-block; + border-radius: 5px; + width: 500px; + text-align: center; + margin-top: 50px; +} \ No newline at end of file diff --git a/frontend/src/styles/WaitingTime.css b/frontend/src/styles/WaitingTime.css new file mode 100644 index 0000000..34caaad --- /dev/null +++ b/frontend/src/styles/WaitingTime.css @@ -0,0 +1,19 @@ +.parent{ + display: flex; + justify-content: center; +} + +.waiting-time{ + display: block; + margin-top: 50px; + margin-bottom: 50px; + font-size: large; + border: solid; + border-radius: 20px; + border-width: 2px; + padding: 10px; + max-width: 500px; + justify-content: center; + padding-left: 30px; + padding-right: 30px; +} \ No newline at end of file diff --git a/frontend/src/views/Eiffel.js b/frontend/src/views/Eiffel.js index 50cb1ff..f05bf46 100644 --- a/frontend/src/views/Eiffel.js +++ b/frontend/src/views/Eiffel.js @@ -1,6 +1,7 @@ import React from "react" import Timetable from "../components/Timetable" +import WaitingTime from "../components/WaitingTime" export default function Eiffel(props) { @@ -9,7 +10,18 @@ export default function Eiffel(props) { <h2> RU Eiffel </h2> - <Timetable schedule={ {'LundiMidi': '11h30 - 13h'} }/> + <WaitingTime place="eiffel" /> + <Timetable schedule={ { + 'LundiMidi': '11h30 - 14h', + 'LundiSoir': '18h30 - 21h', + 'MardiMidi': '11h30 - 14h', + 'MardiSoir': '18h30 - 21h', + 'MercrediMidi': '11h30 - 14h', + 'MercrediSoir': '18h30 - 21h', + 'JeudiMidi': '11h30 - 14h', + 'JeudiSoir': '18h30 - 21h', + 'VendrediMidi': '11h30 - 14h', + 'VendrediSoir': '18h30 - 21h'} }/> </div> ) } \ No newline at end of file -- GitLab