├── .gitignore
├── client
├── public
│ ├── Avatars
│ │ ├── Wolf.jfif
│ │ ├── Kredam.jfif
│ │ └── Selim.jfif
│ └── index.html
├── src
│ ├── assets
│ │ ├── featuring-arrow.png
│ │ ├── profile-placeholder.png
│ │ └── basketIcon.svg
│ ├── styles
│ │ ├── animations.scss
│ │ ├── relatedProducts.scss
│ │ ├── bestsellers.scss
│ │ ├── index.scss
│ │ ├── supply.scss
│ │ ├── navigation.scss
│ │ ├── header.scss
│ │ ├── featuring.scss
│ │ ├── headerSecondary.scss
│ │ ├── home.scss
│ │ ├── basket.scss
│ │ └── Component.styles.js
│ ├── http-common.js
│ ├── components
│ │ ├── products
│ │ │ ├── Books.tsx
│ │ │ ├── Films.tsx
│ │ │ └── Songs.tsx
│ │ ├── Footer.jsx
│ │ ├── user
│ │ │ ├── Logout.jsx
│ │ │ ├── Join.jsx
│ │ │ ├── profile.scss
│ │ │ ├── Signin.jsx
│ │ │ ├── Profile.jsx
│ │ │ └── Register.jsx
│ │ ├── home
│ │ │ ├── Home.jsx
│ │ │ ├── Supply.jsx
│ │ │ ├── Bestsellers.jsx
│ │ │ └── Featuring.jsx
│ │ ├── index.js
│ │ ├── storages
│ │ │ ├── storages.scss
│ │ │ └── Storages.tsx
│ │ ├── Wishlist.jsx
│ │ ├── templates
│ │ │ ├── BasketButton.jsx
│ │ │ ├── TemplatePage.jsx
│ │ │ ├── WishlistButton.jsx
│ │ │ └── TemplateProducts.jsx
│ │ ├── Header.jsx
│ │ ├── HeaderSecondary.jsx
│ │ ├── Navigation.jsx
│ │ ├── Basket.jsx
│ │ └── ProductPage.jsx
│ ├── redux
│ │ ├── reducers
│ │ │ ├── productReducer.js
│ │ │ ├── index.js
│ │ │ ├── userReducer.js
│ │ │ ├── basketReducer.js
│ │ │ └── wishlistReducer.js
│ │ ├── store.js
│ │ ├── actions
│ │ │ ├── productActions.js
│ │ │ ├── userActions.js
│ │ │ ├── basketActions.js
│ │ │ └── wishlistActions.js
│ │ └── constants
│ │ │ └── action-types.js
│ ├── model
│ │ └── user.ts
│ ├── lib
│ │ ├── localStorage.js
│ │ └── helper.js
│ ├── api
│ │ └── userAPI.js
│ ├── index.js
│ └── App.js
├── .gitignore
├── package.json
└── README.md
├── documentation
├── screenshots
│ ├── Basket.png
│ ├── Home.png
│ ├── DetailedProduct.png
│ └── README.md
└── diagrams
│ ├── table_view.png
│ ├── entity_relationship.png
│ └── entity_relationship.uml
├── server
├── database
│ ├── inserts
│ │ ├── address-inserts.sql
│ │ ├── storage-inserts.sql
│ │ ├── generate_songs_insert.py
│ │ ├── generate_book_insert.py
│ │ └── book-insert.sql
│ ├── raw_json
│ │ ├── wishlist.json
│ │ └── users.json
│ └── tables
│ │ ├── create_users.sql
│ │ └── create_tables.sql
├── src
│ ├── lib
│ │ ├── logger.js
│ │ ├── daoHelper.js
│ │ ├── fileHandler.js
│ │ ├── scraper_books.py
│ │ └── scraper_songs.py
│ ├── dao
│ │ ├── example.js
│ │ └── main_dao.js
│ └── routes
│ │ └── router.js
├── config
│ ├── db.js
│ └── connection.js
├── package.json
├── app.js
└── test
│ └── fileHandler.test.js
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | /server/.env
2 |
--------------------------------------------------------------------------------
/client/public/Avatars/Wolf.jfif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LeventeWolf/Bookshop/HEAD/client/public/Avatars/Wolf.jfif
--------------------------------------------------------------------------------
/client/public/Avatars/Kredam.jfif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LeventeWolf/Bookshop/HEAD/client/public/Avatars/Kredam.jfif
--------------------------------------------------------------------------------
/client/public/Avatars/Selim.jfif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LeventeWolf/Bookshop/HEAD/client/public/Avatars/Selim.jfif
--------------------------------------------------------------------------------
/documentation/screenshots/Basket.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LeventeWolf/Bookshop/HEAD/documentation/screenshots/Basket.png
--------------------------------------------------------------------------------
/documentation/screenshots/Home.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LeventeWolf/Bookshop/HEAD/documentation/screenshots/Home.png
--------------------------------------------------------------------------------
/client/src/assets/featuring-arrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LeventeWolf/Bookshop/HEAD/client/src/assets/featuring-arrow.png
--------------------------------------------------------------------------------
/documentation/diagrams/table_view.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LeventeWolf/Bookshop/HEAD/documentation/diagrams/table_view.png
--------------------------------------------------------------------------------
/client/src/assets/profile-placeholder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LeventeWolf/Bookshop/HEAD/client/src/assets/profile-placeholder.png
--------------------------------------------------------------------------------
/documentation/diagrams/entity_relationship.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LeventeWolf/Bookshop/HEAD/documentation/diagrams/entity_relationship.png
--------------------------------------------------------------------------------
/documentation/screenshots/DetailedProduct.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LeventeWolf/Bookshop/HEAD/documentation/screenshots/DetailedProduct.png
--------------------------------------------------------------------------------
/server/database/inserts/address-inserts.sql:
--------------------------------------------------------------------------------
1 | INSERT INTO wolf.address (city, zipcode, street, house_number) values ('Szeged', 6730, 'Kossuth Lajos', 1)
--------------------------------------------------------------------------------
/client/src/styles/animations.scss:
--------------------------------------------------------------------------------
1 | .appear {
2 | animation-name: appear;
3 | animation-duration: 1s;
4 | }
5 |
6 | @keyframes appear {
7 | from {opacity: 0;}
8 | to {opacity: 1;}
9 | }
10 |
--------------------------------------------------------------------------------
/client/src/http-common.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 | export default axios.create({
3 | baseURL: "http://localhost:3001/api",
4 | headers: {
5 | "Content-type": "application/json"
6 | }
7 | });
--------------------------------------------------------------------------------
/server/src/lib/logger.js:
--------------------------------------------------------------------------------
1 | function log (s) {
2 | const date = new Date().toISOString()
3 | .replace(/T/, ' ')
4 | .replace(/\..+/, '') ;
5 |
6 | console.log(`${date} | ${s}`)
7 | }
8 |
9 | module.exports = {log}
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/server/config/db.js:
--------------------------------------------------------------------------------
1 | require('dotenv').config()
2 |
3 | module.exports = {
4 | user : process.env.NODE_ORACLEDB_USERNAME || 'wolf',
5 | password : process.env.NODE_ORACLEDB_PASSWORD || 'yolo',
6 | connectString : process.env.NODE_ORACLEDB_CONNECTIONSTRING || 'localhost/XE',
7 | };
--------------------------------------------------------------------------------
/client/src/components/products/Books.tsx:
--------------------------------------------------------------------------------
1 | // @ts-ignore
2 | import React from 'react';
3 | import TemplatePage from '../templates/TemplatePage'
4 |
5 | const Books = () => {
6 | return (
7 |
6 |
7 | ### Basket
8 |
9 |
10 |
11 | ### Detailed Product
12 |
13 |
14 |
15 | ### Register & Login
16 |
17 | TODO
18 |
19 | ### Profile
20 |
21 | TODO
--------------------------------------------------------------------------------
/client/src/styles/relatedProducts.scss:
--------------------------------------------------------------------------------
1 | .related-wrap {
2 | background-color: white;
3 |
4 | box-shadow: 0 1px 3px rgb(0 0 0 / 20%);
5 | }
6 |
7 | .related-products-container {
8 | margin-top: 10px;
9 | display: flex;
10 | width: 100%;
11 |
12 | padding: 5px 0;
13 |
14 | justify-content: space-between;
15 | }
--------------------------------------------------------------------------------
/client/src/styles/bestsellers.scss:
--------------------------------------------------------------------------------
1 | .bestsellers-wrap {
2 | grid-area: bestsellers;
3 |
4 | position: relative;
5 | }
6 |
7 | .bestsellers-product-container {
8 | height: 100%;
9 | display: flex;
10 | flex-direction: column;
11 | align-items: center;
12 | }
13 |
14 | .bestsellers-product-wrap {
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/client/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/client/src/redux/reducers/productReducer.js:
--------------------------------------------------------------------------------
1 | import { ProductActionTypes } from "../constants/action-types";
2 |
3 | export const productReducer = (state = {}, {type, payload}) => {
4 | switch (type) {
5 | case ProductActionTypes.SELECTED_PRODUCT:
6 | return payload;
7 | case ProductActionTypes.REMOVE_SELECTED_PRODUCT:
8 | return {};
9 | default:
10 | return state;
11 | }
12 | }
--------------------------------------------------------------------------------
/client/src/components/Footer.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | function Footer() {
4 | return (
5 |
14 |
15 | More: [documentation/screenshots](https://github.com/LeventeWolf/Bookshop/tree/master/documentation/screenshots)
16 |
17 |
18 | ## Setup & Run
19 |
20 | ### Prerequisites:
21 | Client & Server
22 | - NodeJS version: 16 (not supported: 17)
23 | - Web browser: Chrome, Mozilla firefox,
24 |
25 | Database
26 | - Docker
27 | - Oracle [db] version: oracle-12c
28 |
29 |
108 | | Product Name | 118 |Product Genre | 119 |Product Price | 120 |Quantity | 121 |
|---|
| Product Name | 127 |Product Genre | 128 |Product Price | 129 |Quantity | 130 |
|---|