From b0df7c2280dd7382b799740e89ba4fb26a6d36a3 Mon Sep 17 00:00:00 2001 From: "Adithyan Gopakumar (gopakumara)" Date: Thu, 1 Aug 2024 13:44:05 +0100 Subject: [PATCH] commit commit --- ...er Manual for Toolbox Web Application.docx | Bin 0 -> 16497 bytes ToolBox/__pycache__/app.cpython-311.pyc | Bin 0 -> 21858 bytes ToolBox/__pycache__/test_app.cpython-311.pyc | Bin 0 -> 5679 bytes .../test_integration.cpython-311.pyc | Bin 0 -> 5892 bytes ToolBox/app.py | 407 +++++++++++ ToolBox/app2.py | 97 +++ ToolBox/databases/toolbox.sql | 650 ++++++++++++++++++ ToolBox/static/Homepage.css | 158 +++++ ToolBox/static/Item_Details.css | 145 ++++ ToolBox/static/List.css | 268 ++++++++ ToolBox/static/Login.css | 182 +++++ ToolBox/static/Registration.css | 120 ++++ ToolBox/static/Service_booking.css | 112 +++ ToolBox/static/Services.css | 139 ++++ ToolBox/static/admin.css | 8 + ToolBox/static/cart.css | 71 ++ ToolBox/static/rent.css | 271 ++++++++ ToolBox/static/rent_booking.css | 157 +++++ ToolBox/templates/Admin.html | 59 ++ ToolBox/templates/Admin_add.html | 73 ++ ToolBox/templates/Homepage.html | 164 +++++ ToolBox/templates/Item_details.html | 200 ++++++ ToolBox/templates/List.html | 156 +++++ ToolBox/templates/Login.html | 36 + ToolBox/templates/Professional.html | 57 ++ ToolBox/templates/Registration.html | 87 +++ ToolBox/templates/Service_booking.html | 131 ++++ ToolBox/templates/Services.html | 117 ++++ ToolBox/templates/Vendor.html | 68 ++ ToolBox/templates/cart.html | 107 +++ ToolBox/templates/rent.html | 184 +++++ ToolBox/templates/rental_booking.html | 220 ++++++ 32 files changed, 4444 insertions(+) create mode 100644 ToolBox/User Manual for Toolbox Web Application.docx create mode 100644 ToolBox/__pycache__/app.cpython-311.pyc create mode 100644 ToolBox/__pycache__/test_app.cpython-311.pyc create mode 100644 ToolBox/__pycache__/test_integration.cpython-311.pyc create mode 100644 ToolBox/app.py create mode 100644 ToolBox/app2.py create mode 100644 ToolBox/databases/toolbox.sql create mode 100644 ToolBox/static/Homepage.css create mode 100644 ToolBox/static/Item_Details.css create mode 100644 ToolBox/static/List.css create mode 100644 ToolBox/static/Login.css create mode 100644 ToolBox/static/Registration.css create mode 100644 ToolBox/static/Service_booking.css create mode 100644 ToolBox/static/Services.css create mode 100644 ToolBox/static/admin.css create mode 100644 ToolBox/static/cart.css create mode 100644 ToolBox/static/rent.css create mode 100644 ToolBox/static/rent_booking.css create mode 100644 ToolBox/templates/Admin.html create mode 100644 ToolBox/templates/Admin_add.html create mode 100644 ToolBox/templates/Homepage.html create mode 100644 ToolBox/templates/Item_details.html create mode 100644 ToolBox/templates/List.html create mode 100644 ToolBox/templates/Login.html create mode 100644 ToolBox/templates/Professional.html create mode 100644 ToolBox/templates/Registration.html create mode 100644 ToolBox/templates/Service_booking.html create mode 100644 ToolBox/templates/Services.html create mode 100644 ToolBox/templates/Vendor.html create mode 100644 ToolBox/templates/cart.html create mode 100644 ToolBox/templates/rent.html create mode 100644 ToolBox/templates/rental_booking.html diff --git a/ToolBox/User Manual for Toolbox Web Application.docx b/ToolBox/User Manual for Toolbox Web Application.docx new file mode 100644 index 0000000000000000000000000000000000000000..871ed1f9be778ddd9b53bb560eb13bd4a2749a0c GIT binary patch literal 16497 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

kuO0427_O5`aEnEem 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 RSI(`oPhBA5ZfIb;`5$pZ!rlM? literal 0 HcmV?d00001 diff --git a/ToolBox/__pycache__/test_integration.cpython-311.pyc b/ToolBox/__pycache__/test_integration.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf29810308d79b88bf007d149086f153e5e34501 GIT binary patch literal 5892 zcmcIo-ER|D7Qf^1$2hhL;E)6w5|@C$#Bm%FNYVm@Hqg*Q0vqU-Y}C=jGfAA-Gv>}1 zh!v!)#6z~KwA~dFJn)c*6wpufB%LLn0HIOOrADb)~tC zYs{75$9N9geA=DyjCokyo%UwDV_uH9$frd1+$XYEAv3=6O`q_DJcF-Y#stML`(|C( zqI+BfG}(Nx{RF&z$x23Y+VWqKrc%i(T5>kZSw3CS^^~SU zm6x*Fq-}1?vfo!fK>Hzh8{=d$=90PlWQ+&zZrSyO1F!J4i_G7zna7xCQ$6hDp<`I(~>@WKAXLy8p;%v40zV-if-shXVx%xTv2@5R}{oU zVt_1{c_NmpWS-18^`%OCr?+~xV9WLjhh?tPS}dZV?}pA|6RF~np#rKpDGUHh%ml_XUR zaaNgw9d+wUdQ!)UM&4fd9^AIMEuI!=(Wr7q^7D$5_d1@ zEGZ}l;LA2nhF;jXicP8BihHhk*E~1lj8|+7nRm@N+fmc+#u;H*?}u$HL!B()PHZSL zC%a@`cFP{wEBoLhJobI>e*!an=FI&bKTnn%m{;Cno}UrQZMm-63Sb?W;En?k!iuE$`azn9B9FYqE{q?g~3stsPJ? zd^Yxul6KNfboU+CUH&Gy!*S#$;o!rdx@S1=@1n|7N;eexc3%apM37e^h_QS_1!~SA zjNtrc@^vQ?i9~0j8?OA`?h`$cO5;((s)N4Xlc)On2NIT$m2~}%M&+o_a;s8Cu{=sf zN~JAc)+Q{UB+C?t+j3{8RgLb0#j)xEB9keaxw>Zf6!0%ghO`=oLm%Z=@#xbq)0~#{ zX+;*xF7n>4v^JGeqb}NnO6+#N96X4al4%>7_*o0*5e-lT1u#yI>Ke6zKsPz6inpb7 zPO*H-T_u?_6ib*?Al7KALW8L7&T6`01z>6lH7?xBNogyf8Qxtj%LJ!=xbDS%5jF)}>6#THn zbDd|fz0vUydTl;b^6^JaSmdsN>G`}ViCfx#pEk4M~tQQwa-4rEoV!DG*2O%S&C7mhU?WA%57 zHZ@7u4kHU+%X`40PV9gub&BkUh~zMMtrg=$&oCeqc_Qz{+#%Aviu$WE_V^9x>5gaB zsr=q9U6E*V`lDMph0dKp)zyE1j*d~(He6#D+73PRFp486j-y~i!cQp%J%-IF2urXT z<&sJdLK9LW#2<~J=tO}zh>pv;&I2tB$M#G_oSaxe*7=j$!+#629&|GgVkfBYyjqA| ztHIyHkN)^kp}lW8++Pg$FAAm*+#Js^@cYo$p>I=5&3`($EOZrxu0r{u@J2$aPOOt1 zoqgvM3vt}Zjh1jBH$BKA=PGAgg6x;; zM~rDD0>KpBzlFr&L~m!J9}^2tcjALYBI=`!V9w$>y!Wv{ zjH!_2%TjG3tz`1M;cZWYlb?athfc^7lk1rp;Wz_hO;nDop|NUlst`HwzYw{l>3MLf{|Ch8sQhVT#NzxB2w1Ici-X_p z|J?`#N`It8%Hk!~UOUb8ftnf%Ic1}YF)xWrTp=daK;Mq}g~R=3Lo0^geeau1hs~xg zGZHf+MEJr8jps~7@#n#Hu!@5~Ug9lIQS zR-x8mj3o!v;L$0YaEA-Hga7&50X((tYex+6*!z938tFUahZ5?(01G-SBCaz^epeR~17xOX%E&=dl{IpJS}i$Pbp!odB)2Hu|SVZN!+m+0d)h|K{G$#48CK-^aqh}*TdHcJJh{{Jv9 zRHXHV!@X+|Z#iZ*Ma}n)!c_|SP6NC_Fm(Gc)dm5n_TDX1?KN~`%KDu1o)7cS!|wA< zzUK!xki${GC5R%vs)?diCyE(O&ZV&)6h(aTvPbA{u%-xFnn2Nq;tYxlAfCeCi&)1O zCyM_@FoAzp=zj;X;CxDM-h*j+g{&jqz`~6}pkvt+D|%uj*CD2X@+D8ao$Gx=T&-%r zlPD1o>x$TOpjNHH(_11S*43~lR;#uT)j+JPm3vsX{fPK{Ei#12Djz') +def list_by_category(category_id): + + page = int(request.args.get('page', 1)) + + + start_index = (page - 1) * PER_PAGE + + cur = mysql.connection.cursor() + + + cur.execute("SELECT id, title, discount, price, image_url FROM tools WHERE category_id = %s LIMIT %s, %s", + (category_id, start_index, PER_PAGE)) + tools = cur.fetchall() + + + cur.execute("SELECT COUNT(*) FROM tools WHERE category_id = %s", (category_id,)) + total_tools = cur.fetchone()[0] + + + total_pages = (total_tools + PER_PAGE - 1) // PER_PAGE + + + cur.execute("SELECT id, name FROM categories") + categories = cur.fetchall() + cur.execute("SELECT id, name FROM brands") + brands = cur.fetchall() + + cur.close() + + return render_template('list.html', tools=tools, categories=categories, brands=brands, page=page, + total_pages=total_pages) + +@app.route('/brand/') +def list_by_brand(brand_id): + + page = int(request.args.get('page', 1)) + + + start_index = (page - 1) * PER_PAGE + + cur = mysql.connection.cursor() + + + cur.execute("SELECT id, title, discount, price, image_url FROM tools WHERE brand_id = %s LIMIT %s, %s", + (brand_id, start_index, PER_PAGE)) + tools = cur.fetchall() + + + cur.execute("SELECT COUNT(*) FROM tools WHERE brand_id = %s", (brand_id,)) + total_tools = cur.fetchone()[0] + + + total_pages = (total_tools + PER_PAGE - 1) // PER_PAGE + + + cur.execute("SELECT id, name FROM categories") + categories = cur.fetchall() + cur.execute("SELECT id, name FROM brands") + brands = cur.fetchall() + + cur.close() + + return render_template('list.html', tools=tools, categories=categories, brands=brands, page=page, + total_pages=total_pages) + +@app.route('/item/', methods=['GET', 'POST']) +def item_details(item_id): + if request.method == 'POST': + + review_name = request.form['review_name'] + rating = request.form['rating'] + review_text = request.form['review_text'] + + cur = mysql.connection.cursor() + cur.execute("INSERT INTO reviews (tool_id, r_name, rating, review_text) VALUES (%s, %s, %s, %s)", + (item_id, review_name, rating, review_text)) + mysql.connection.commit() + cur.close() + + flash('Review added successfully!', 'success') + return redirect(url_for('item_details', item_id=item_id)) + + + cur = mysql.connection.cursor() + cur.execute("SELECT id, title, discount, price, image_url, rating, description FROM tools WHERE id = %s", + (item_id,)) + tool = cur.fetchone() + + + cur.execute("SELECT r_name, rating, review_text FROM reviews WHERE tool_id = %s", (item_id,)) + reviews = cur.fetchall() + + + cur.execute("SELECT id, name FROM categories") + categories = cur.fetchall() + cur.execute("SELECT id, name FROM brands") + brands = cur.fetchall() + + cur.close() + + return render_template('item_details.html', tool=tool, reviews=reviews, categories=categories, brands=brands) + +@app.route('/services') +def services(): + cur = mysql.connection.cursor() + cur.execute("SELECT id,name, description, icon FROM services") + services = cur.fetchall() + cur.close() + return render_template('Services.html', services=services) + +@app.route('/service_booking/', methods=['GET', 'POST']) +def service_booking(service_id): + if request.method == 'POST': + + name = request.form['name'] + email = request.form['email'] + phone_number = request.form['phone'] + address = request.form['address'] + problem_description = request.form['problem'] + appointment_date = request.form['appointment-date'] + appointment_time = request.form['appointment-time'] + + cur = mysql.connection.cursor() + cur.execute( + "INSERT INTO bookings (user_id, service_id, name, email_id, address, phone_number, problem_description, appointment_date, appointment_time) " + "VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)", + (None, service_id, name, email, address, phone_number, problem_description, appointment_date, + appointment_time)) + mysql.connection.commit() + cur.close() + + flash('Appointment booked successfully!', 'success') + return redirect(url_for('services')) + + + cur = mysql.connection.cursor() + cur.execute("SELECT name FROM services WHERE id = %s", (service_id,)) + service = cur.fetchone() + cur.close() + service_name = service[0] + + return render_template('Service_booking.html', service=service_name) + +@app.route('/rent') +def rent(): + cur = mysql.connection.cursor() + + + category_id = request.args.get('category') + brand_id = request.args.get('brand') + rating = request.args.get('rating') + min_price = request.args.get('min_price') + max_price = request.args.get('max_price') + page = request.args.get('page', 1, type=int) + per_page = 12 + + + query = "SELECT * FROM rental_tools WHERE 1=1" + params = [] + + + if category_id: + query += " AND category_id = %s" + params.append(category_id) + if brand_id: + query += " AND brand_id = %s" + params.append(brand_id) + if rating: + query += " AND rating >= %s" + params.append(rating) + if min_price: + query += " AND price >= %s" + params.append(min_price) + if max_price: + query += " AND price <= %s" + params.append(max_price) + + + cur.execute(query, params) + total_items = len(cur.fetchall()) + + + query += " LIMIT %s OFFSET %s" + params.extend([per_page, (page - 1) * per_page]) + + cur.execute(query, params) + rental_tools = cur.fetchall() + + + cur.execute("SELECT id, name FROM categories") + categories = cur.fetchall() + + cur.execute("SELECT id, name FROM brands") + brands = cur.fetchall() + + cur.close() + + + total_pages = (total_items + per_page - 1) // per_page + + return render_template('rent.html', rental_tools=rental_tools, categories=categories, brands=brands, page=page, + total_pages=total_pages) +@app.route('/rent_details/', methods=['GET', 'POST']) +def rent_details(rtool_id): + if request.method == 'POST': + + review_name = request.form['review_name'] + rating = request.form['rating'] + review_text = request.form['review_text'] + + cur = mysql.connection.cursor() + cur.execute("INSERT INTO r_reviews (rtool_id, r_name, rating, review_text) VALUES (%s, %s, %s, %s)", + (rtool_id, review_name, rating, review_text)) + mysql.connection.commit() + cur.close() + + flash('Review added successfully!', 'success') + return redirect(url_for('rent_details', rtool_id=rtool_id)) + + + cur = mysql.connection.cursor() + cur.execute("SELECT id, title, discount, price, image_url, rating, description FROM rental_tools WHERE id = %s", + (rtool_id,)) + rental_tool = cur.fetchone() + + + cur.execute("SELECT r_name, rating, review_text FROM r_reviews WHERE rtool_id = %s", (rtool_id,)) + reviews = cur.fetchall() + + + cur.execute("SELECT id, name FROM categories") + categories = cur.fetchall() + cur.execute("SELECT id, name FROM brands") + brands = cur.fetchall() + + cur.close() + + return render_template('rental_booking.html', rental_tool=rental_tool, reviews=reviews, categories=categories, brands=brands) +@app.route('/book_rental/', methods=['POST']) +def book_rental(rtool_id): + name = request.form['name'] + email = request.form['email'] + phone_number = request.form['phone_number'] + address = request.form['address'] + rental_date = request.form['rental_date'] + return_date = request.form['return_date'] + + cur = mysql.connection.cursor() + cur.execute( + "INSERT INTO rentals (tool_id, user_id, name, email, phone_number, address, rental_date, return_date) " + "VALUES (%s, NULL, %s, %s, %s, %s, %s, %s)", + (rtool_id, name, email, phone_number, address, rental_date, return_date) + ) + mysql.connection.commit() + cur.close() + + flash('Booking successful!', 'success') + return redirect(url_for('rent_details', rtool_id=rtool_id)) + +@app.route('/cart') +def cart(): + user_id = session.get('user_id') + if not user_id: + flash('Please log in to view your cart.', 'danger') + return redirect(url_for('login')) + + cur = mysql.connection.cursor() + + + cur.execute("SELECT * FROM rentals WHERE user_id = %s", (user_id,)) + rentals = cur.fetchall() + + + cur.execute("SELECT * FROM bookings WHERE user_id = %s", (user_id,)) + service_bookings = cur.fetchall() + + + cur.execute("SELECT * FROM purchases WHERE user_id = %s", (user_id,)) + purchases = cur.fetchall() + + cur.close() + + return render_template('cart.html', rentals=rentals, service_bookings=service_bookings, purchases=purchases) + + +@app.route('/register', methods=['GET', 'POST']) +def register(): + if request.method == 'POST': + name = request.form['name'] + email_id = request.form['email'] + dob = request.form['dob'] + address = request.form['address'] + phone_number = request.form['phno'] + password = request.form['password'] + confirm_password = request.form['confirmPassword'] + + if password != confirm_password: + flash('Passwords do not match', 'danger') + return redirect(url_for('register')) + + hashed_password = bcrypt.generate_password_hash(password).decode('utf-8') + cur = mysql.connection.cursor() + cur.execute( + "INSERT INTO users (name, email_id, dob, address, phone_number, password) VALUES (%s, %s, %s, %s, %s, %s)", + (name, email_id, dob, address, phone_number, hashed_password)) + mysql.connection.commit() + cur.close() + flash('You have successfully registered!', 'success') + return redirect(url_for('login')) + + return render_template('Registration.html') +@app.route('/login', methods=['GET', 'POST']) +def login(): + if request.method == 'POST': + email = request.form['email'] + password = request.form['password'] + cur = mysql.connection.cursor() + cur.execute("SELECT user_id, name, password FROM users WHERE email_id = %s", (email,)) + user = cur.fetchone() + cur.close() + # Check if the user exists and if the password is correct + if user and bcrypt.check_password_hash(user[2], password): + session['user_id'] = user[0] + session['user_name'] = user[1] + flash('Login successful!', 'success') + return redirect(url_for('home')) + else: + flash('Invalid email or password', 'danger') + + return render_template('Login.html') +@app.route('/logout') +def logout(): + session.clear() + flash('You have been logged out.', 'success') + return redirect(url_for('home')) + +if __name__ == '__main__': + app.run() diff --git a/ToolBox/app2.py b/ToolBox/app2.py new file mode 100644 index 0000000..0708833 --- /dev/null +++ b/ToolBox/app2.py @@ -0,0 +1,97 @@ +from flask import Flask, render_template, request, redirect, url_for, flash +from flask_mysqldb import MySQL +from flask_bcrypt import Bcrypt + +app = Flask(__name__) +app.secret_key = 'eH6BjKbFtJg4yP0Q1rWXu89Zc2aVs7Y3sLhNopkD' + +# MySQL configurations +app.config['MYSQL_HOST'] = 'localhost' +app.config['MYSQL_USER'] = 'root' +app.config['MYSQL_PASSWORD'] = '' +app.config['MYSQL_DB'] = 'toolbox' + +mysql = MySQL(app) +bcrypt = Bcrypt(app) + +@app.route('/') +def admin_dashboard(): + cur = mysql.connection.cursor() + cur.execute("SELECT id, name FROM brands") + brands = cur.fetchall() + cur.execute("SELECT id, name FROM categories") + categories = cur.fetchall() + cur.execute("SELECT id, image_url FROM carousel") + carousel = cur.fetchall() + cur.execute("SELECT id, image_url FROM offers") + offers = cur.fetchall() + + cur.close() + return render_template('admin.html', brands=brands, categories=categories,carousel=carousel, offers=offers) + + + + +@app.route('/admin/carousel/add', methods=['GET', 'POST']) +def add_carousel(): + cur = mysql.connection.cursor() + + if request.method == 'POST': + image_url = request.form['image_url'] + category_id = request.form['category_id'] + brand_id = request.form['brand_id'] + + cur.execute( + "INSERT INTO carousel (image_url, category_id, brand_id) VALUES (%s, %s, %s)", + (image_url, category_id, brand_id) + ) + mysql.connection.commit() + cur.close() + + flash('Carousel item added successfully!', 'success') + return redirect(url_for('admin_dashboard')) + + # Fetch categories and brands for dropdowns + cur.execute("SELECT id, name FROM categories") + categories = cur.fetchall() + cur.execute("SELECT id, name FROM brands") + brands = cur.fetchall() + cur.close() + + return render_template('Admin_add.html', categories=categories, brands=brands) + +@app.route('/admin/carousel/delete/', methods=['POST']) +def delete_carousel(carousel_id): + cur = mysql.connection.cursor() + cur.execute("DELETE FROM carousel WHERE id = %s", (carousel_id,)) + mysql.connection.commit() + cur.close() + + flash('Carousel item deleted successfully!', 'success') + return redirect(url_for('admin_dashboard')) + + +@app.route('/admin/offer', methods=['POST']) +def add_offer(): + image_url = request.form['offer_image'] + category_id = request.form['category_id'] + brand_id = request.form['brand_id'] + cur = mysql.connection.cursor() + cur.execute("INSERT INTO offers (image_url, category_id, brand_id) VALUES (%s, %s, %s)", (image_url, category_id, brand_id)) + mysql.connection.commit() + cur.close() + flash('Offer added successfully!', 'success') + return redirect(url_for('admin_dashboard')) + +@app.route('/admin/offer/delete/', methods=['POST']) +def delete_offer(id): + cur = mysql.connection.cursor() + cur.execute("DELETE FROM offers WHERE id = %s", (id,)) + mysql.connection.commit() + cur.close() + flash('Offer deleted successfully!', 'success') + return redirect(url_for('admin_dashboard')) + + +if __name__ == '__main__': + app.run(debug=True) diff --git a/ToolBox/databases/toolbox.sql b/ToolBox/databases/toolbox.sql new file mode 100644 index 0000000..ea68501 --- /dev/null +++ b/ToolBox/databases/toolbox.sql @@ -0,0 +1,650 @@ +-- phpMyAdmin SQL Dump +-- version 5.2.1 +-- https://www.phpmyadmin.net/ +-- +-- Host: 127.0.0.1 +-- Generation Time: Aug 01, 2024 at 02:05 PM +-- Server version: 10.4.28-MariaDB +-- PHP Version: 8.2.4 + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +START TRANSACTION; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- +-- Database: `toolbox` +-- + +-- -------------------------------------------------------- + +-- +-- Table structure for table `bookings` +-- + +CREATE TABLE `bookings` ( + `id` int(11) NOT NULL, + `user_id` int(11) DEFAULT NULL, + `service_id` int(11) DEFAULT NULL, + `name` varchar(255) NOT NULL, + `email_id` varchar(255) NOT NULL, + `address` text DEFAULT NULL, + `phone_number` varchar(20) DEFAULT NULL, + `problem_description` text DEFAULT NULL, + `appointment_date` date DEFAULT NULL, + `appointment_time` time DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `brands` +-- + +CREATE TABLE `brands` ( + `id` int(11) NOT NULL, + `name` varchar(255) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `brands` +-- + +INSERT INTO `brands` (`id`, `name`) VALUES +(1, 'Bosch'), +(2, 'DeWalt'), +(3, 'Stanley'), +(4, 'Makita'), +(5, 'Milwaukee'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `carousel` +-- + +CREATE TABLE `carousel` ( + `id` int(11) NOT NULL, + `image_url` varchar(255) DEFAULT NULL, + `category_id` int(11) DEFAULT NULL, + `brand_id` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `carousel` +-- + +INSERT INTO `carousel` (`id`, `image_url`, `category_id`, `brand_id`) VALUES +(1, 'https://i0.wp.com/toolguyd.com/blog/wp-content/uploads/2023/11/Home-Depot-Free-Dewalt-Cordless-Power-Tool-Offers-for-Holiday-2023.jpg?resize=600%2C437&ssl=1', 2, 2), +(2, 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR1fnMBNOGVrpIBRsumdFYZ-CNPXNH0gVzMFg&s', 2, NULL), +(3, 'https://www.cbspowertools.com/Files/102358/Img/21/tooloffers-cat-cbs.jpg', 2, NULL); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `categories` +-- + +CREATE TABLE `categories` ( + `id` int(11) NOT NULL, + `name` varchar(255) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `categories` +-- + +INSERT INTO `categories` (`id`, `name`) VALUES +(1, 'Hand Tools'), +(2, 'Power Tools'), +(3, 'Safety Equipment'), +(4, 'Gardening Tools'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `offers` +-- + +CREATE TABLE `offers` ( + `id` int(11) NOT NULL, + `image_url` varchar(255) DEFAULT NULL, + `category_id` int(11) DEFAULT NULL, + `brand_id` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `offers` +-- + +INSERT INTO `offers` (`id`, `image_url`, `category_id`, `brand_id`) VALUES +(1, 'https://i.shgcdn.com/6ea1f1a7-d6da-4f5c-8ef2-6d814e5fbaeb/-/format/auto/-/preview/3000x3000/-/quality/lighter/', 2, 5), +(2, 'https://images.prismic.io/tradetools/ZoHyQR5LeNNTwqTQ_makita600x400-8-.png?auto=format,compress', 1, 4); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `professionals` +-- + +CREATE TABLE `professionals` ( + `id` int(11) NOT NULL, + `name` varchar(255) NOT NULL, + `expertise` varchar(255) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `purchases` +-- + +CREATE TABLE `purchases` ( + `id` int(11) NOT NULL, + `user_id` int(11) NOT NULL, + `tool_id` int(11) NOT NULL, + `purchase_date` datetime DEFAULT current_timestamp() +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `rentals` +-- + +CREATE TABLE `rentals` ( + `id` int(11) NOT NULL, + `tool_id` int(11) DEFAULT NULL, + `user_id` int(11) DEFAULT NULL, + `name` varchar(255) NOT NULL, + `email` varchar(255) NOT NULL, + `phone_number` varchar(255) NOT NULL, + `address` text NOT NULL, + `rental_date` date NOT NULL, + `return_date` date NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `rental_tools` +-- + +CREATE TABLE `rental_tools` ( + `id` int(11) NOT NULL, + `title` varchar(255) NOT NULL, + `discount` decimal(5,2) DEFAULT NULL, + `price` decimal(10,2) NOT NULL, + `image_url` varchar(255) DEFAULT NULL, + `category_id` int(11) DEFAULT NULL, + `brand_id` int(11) DEFAULT NULL, + `rating` decimal(3,2) NOT NULL, + `description` text NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `rental_tools` +-- + +INSERT INTO `rental_tools` (`id`, `title`, `discount`, `price`, `image_url`, `category_id`, `brand_id`, `rating`, `description`) VALUES +(1, 'STANLEY Hammer, Curved, Fiberglass, 16-Oz', 3.00, 20.59, 'https://m.media-amazon.com/images/I/511F4+sVF6L._AC_UF894,1000_QL80_.jpg', 1, 3, 0.00, 'This STANLEY® Curved Claw Hammer has a lightweight design with a long handle for improved performance and less user fatigue. The handle has a fibreglass core that adds strength and helps to reduce vibrations. The polished smooth face has a tempered rim to reduce incidences of chipping'), +(2, 'DEWALT Atomic 20V MAX* Cordless Drill, 1/2-Inch, Tool Only', 10.00, 129.99, 'https://m.media-amazon.com/images/I/51XzwAey9vL._AC_UF894,1000_QL80_.jpg', 2, 2, 0.00, ''), +(3, 'Makita B-36170 Ratchet Screwdriver & Bit Set (47 piece)', 5.00, 20.99, 'https://cdn11.bigcommerce.com/s-320izp4p6a/images/stencil/1280x1280/products/65149/182911/B-36170-1__11184.1698966685.jpg?c=1', 1, 4, 0.00, ''), +(4, 'Bosch Safety Goggles', 2.00, 9.99, 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR-d66S59gRW1Zi92vQWsqWii-yhJOpBvcvRQ&s', 3, 1, 0.00, ''), +(5, 'Milwaukee M18F2LM53 18V 530mm Self-Propelled Lawn Mower Bare Unit', 25.00, 699.99, 'https://www.imagedelivery.space/ffx/products/m/milwaukee_m18f2lm53v6.jpg?fm=webp', 4, 5, 0.00, ''); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `reviews` +-- + +CREATE TABLE `reviews` ( + `id` int(11) NOT NULL, + `tool_id` int(11) DEFAULT NULL, + `r_name` varchar(50) NOT NULL, + `rating` decimal(3,2) NOT NULL DEFAULT 0.00, + `review_text` text DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `reviews` +-- + +INSERT INTO `reviews` (`id`, `tool_id`, `r_name`, `rating`, `review_text`) VALUES +(5, 1, 'adi', 2.00, 'good'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `r_reviews` +-- + +CREATE TABLE `r_reviews` ( + `id` int(11) NOT NULL, + `rtool_id` int(11) DEFAULT NULL, + `r_name` varchar(255) DEFAULT NULL, + `review_text` varchar(255) DEFAULT NULL, + `rating` decimal(3,2) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `r_reviews` +-- + +INSERT INTO `r_reviews` (`id`, `rtool_id`, `r_name`, `review_text`, `rating`) VALUES +(1, 1, 'adi', 'Good', 4.00), +(2, 1, 'rohan', 'great product', 5.00); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `services` +-- + +CREATE TABLE `services` ( + `id` int(11) NOT NULL, + `name` varchar(255) NOT NULL, + `description` text DEFAULT NULL, + `icon` varchar(255) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `services` +-- + +INSERT INTO `services` (`id`, `name`, `description`, `icon`) VALUES +(1, 'Cleaning Services', 'Professional cleaning services for your home or office.', 'bi bi-bucket-fill'), +(2, 'Pest Control Services', 'Effective pest control solutions to keep your space pest-free.', 'bi bi-bug-fill'), +(3, 'Plumbing Repair and Services', 'Comprehensive plumbing repair and maintenance services.', 'bi bi-tools'), +(4, 'Electrical Repair and Services', 'Expert electrical repair and maintenance services.', 'bi bi-lightning-charge-fill'), +(5, 'Carpentry Repair and Services', 'Quality carpentry repair and custom furniture services.', 'bi bi-hammer'), +(6, 'Air Conditioner Repair and Services', 'Reliable air conditioner repair and maintenance services.', 'bi bi-snow'), +(7, 'Refrigerator Repair and Services', 'Professional refrigerator repair and maintenance services.', 'bi bi-snow2'), +(8, 'Washing Machine Repair and Services', 'Expert washing machine repair and maintenance services.', 'bi bi-bucket'), +(9, 'Microwave Repair and Services', 'Reliable microwave repair and maintenance services.', 'bi bi-dash-square'), +(10, 'Water Purifier Repair and Services', 'Quality water purifier repair and maintenance services.', 'bi bi-droplet'), +(11, 'Geyser Repair and Services', 'Expert geyser repair and maintenance services.', 'bi bi-thermometer'), +(12, 'Painting Services', 'Professional painting services for your home or office.', 'bi bi-brush'), +(13, 'Disinfection Services', 'Thorough disinfection services to keep your space hygienic.', 'bi bi-shield-fill-check'), +(14, 'Home Repairs', 'General home repair services to fix any issue around your house.', 'bi bi-tools'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `service_requests` +-- + +CREATE TABLE `service_requests` ( + `id` int(11) NOT NULL, + `professional_id` int(11) DEFAULT NULL, + `booking_id` int(11) DEFAULT NULL, + `details` text DEFAULT NULL, + `status` enum('Pending','Accepted','Rejected') DEFAULT 'Pending' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `tools` +-- + +CREATE TABLE `tools` ( + `id` int(11) NOT NULL, + `title` varchar(255) NOT NULL, + `discount` decimal(5,2) DEFAULT NULL, + `price` decimal(10,2) NOT NULL, + `image_url` varchar(255) DEFAULT NULL, + `category_id` int(11) DEFAULT NULL, + `brand_id` int(11) DEFAULT NULL, + `rating` decimal(3,2) DEFAULT 0.00, + `description` text DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `tools` +-- + +INSERT INTO `tools` (`id`, `title`, `discount`, `price`, `image_url`, `category_id`, `brand_id`, `rating`, `description`) VALUES +(1, 'STANLEY Hammer, Curved, Fiberglass, 16-Oz', 3.00, 20.59, 'https://m.media-amazon.com/images/I/511F4+sVF6L._AC_UF894,1000_QL80_.jpg', 1, 3, 0.00, 'This STANLEY® Curved Claw Hammer has a lightweight design with a long handle for improved performance and less user fatigue. The handle has a fibreglass core that adds strength and helps to reduce vibrations. The polished smooth face has a tempered rim to reduce incidences of chipping'), +(2, 'DEWALT Atomic 20V MAX* Cordless Drill, 1/2-Inch, Tool Only', 10.00, 129.99, 'https://m.media-amazon.com/images/I/51XzwAey9vL._AC_UF894,1000_QL80_.jpg', 2, 2, 0.00, NULL), +(3, 'Makita B-36170 Ratchet Screwdriver & Bit Set (47 piece)', 5.00, 20.99, 'https://cdn11.bigcommerce.com/s-320izp4p6a/images/stencil/1280x1280/products/65149/182911/B-36170-1__11184.1698966685.jpg?c=1', 1, 4, 0.00, NULL), +(4, 'Bosch Safety Goggles', 2.00, 9.99, 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR-d66S59gRW1Zi92vQWsqWii-yhJOpBvcvRQ&s', 3, 1, 0.00, NULL), +(5, ' Milwaukee M18F2LM53 18V 530mm Self-Propelled Lawn Mower Bare Unit ', 25.00, 699.99, 'https://www.imagedelivery.space/ffx/products/m/milwaukee_m18f2lm53v6.jpg?fm=webp', 4, 5, 0.00, NULL); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `users` +-- + +CREATE TABLE `users` ( + `user_id` int(11) NOT NULL, + `name` varchar(100) NOT NULL, + `email_id` varchar(100) NOT NULL, + `dob` date NOT NULL, + `address` varchar(255) NOT NULL, + `phone_number` varchar(15) NOT NULL, + `password` varchar(255) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `users` +-- + +INSERT INTO `users` (`user_id`, `name`, `email_id`, `dob`, `address`, `phone_number`, `password`) VALUES +(4, 'Adithyan G', 'adithyan28g@gmail.com', '1999-01-27', 'BGA-15B-04, Bishop Gate, Tower St', '25448542', '$2b$12$JguTkeKOnFDtio.u.judkeqMClWJdtMjDqfdtpXoijvgFCs5ZPAz6'), +(11, 'Test User', 'testuser@example.com', '1990-01-01', '123 Test St', '1234567890', '$2b$12$kDcdyiH6AkkRTiFMpIyQJOKE8wyOlGfvmydLb3ee7D36TmkcXL/Ae'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `vendors` +-- + +CREATE TABLE `vendors` ( + `id` int(11) NOT NULL, + `name` varchar(255) NOT NULL, + `description` text DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Indexes for dumped tables +-- + +-- +-- Indexes for table `bookings` +-- +ALTER TABLE `bookings` + ADD PRIMARY KEY (`id`), + ADD KEY `user_id` (`user_id`), + ADD KEY `service_id` (`service_id`); + +-- +-- Indexes for table `brands` +-- +ALTER TABLE `brands` + ADD PRIMARY KEY (`id`); + +-- +-- Indexes for table `carousel` +-- +ALTER TABLE `carousel` + ADD PRIMARY KEY (`id`), + ADD KEY `category_id` (`category_id`), + ADD KEY `brand_id` (`brand_id`); + +-- +-- Indexes for table `categories` +-- +ALTER TABLE `categories` + ADD PRIMARY KEY (`id`); + +-- +-- Indexes for table `offers` +-- +ALTER TABLE `offers` + ADD PRIMARY KEY (`id`), + ADD KEY `category_id` (`category_id`), + ADD KEY `brand_id` (`brand_id`); + +-- +-- Indexes for table `professionals` +-- +ALTER TABLE `professionals` + ADD PRIMARY KEY (`id`); + +-- +-- Indexes for table `purchases` +-- +ALTER TABLE `purchases` + ADD PRIMARY KEY (`id`), + ADD KEY `user_id` (`user_id`), + ADD KEY `tool_id` (`tool_id`); + +-- +-- Indexes for table `rentals` +-- +ALTER TABLE `rentals` + ADD PRIMARY KEY (`id`), + ADD KEY `tool_id` (`tool_id`), + ADD KEY `user_id` (`user_id`); + +-- +-- Indexes for table `rental_tools` +-- +ALTER TABLE `rental_tools` + ADD PRIMARY KEY (`id`), + ADD KEY `category_id` (`category_id`), + ADD KEY `brand_id` (`brand_id`); + +-- +-- Indexes for table `reviews` +-- +ALTER TABLE `reviews` + ADD PRIMARY KEY (`id`), + ADD KEY `tool_id` (`tool_id`); + +-- +-- Indexes for table `r_reviews` +-- +ALTER TABLE `r_reviews` + ADD PRIMARY KEY (`id`), + ADD KEY `rtool_id` (`rtool_id`); + +-- +-- Indexes for table `services` +-- +ALTER TABLE `services` + ADD PRIMARY KEY (`id`); + +-- +-- Indexes for table `service_requests` +-- +ALTER TABLE `service_requests` + ADD PRIMARY KEY (`id`), + ADD KEY `professional_id` (`professional_id`), + ADD KEY `booking_id` (`booking_id`); + +-- +-- Indexes for table `tools` +-- +ALTER TABLE `tools` + ADD PRIMARY KEY (`id`), + ADD KEY `category_id` (`category_id`), + ADD KEY `brand_id` (`brand_id`); + +-- +-- Indexes for table `users` +-- +ALTER TABLE `users` + ADD PRIMARY KEY (`user_id`), + ADD UNIQUE KEY `email_id` (`email_id`); + +-- +-- Indexes for table `vendors` +-- +ALTER TABLE `vendors` + ADD PRIMARY KEY (`id`); + +-- +-- AUTO_INCREMENT for dumped tables +-- + +-- +-- AUTO_INCREMENT for table `bookings` +-- +ALTER TABLE `bookings` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6; + +-- +-- AUTO_INCREMENT for table `brands` +-- +ALTER TABLE `brands` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6; + +-- +-- AUTO_INCREMENT for table `carousel` +-- +ALTER TABLE `carousel` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8; + +-- +-- AUTO_INCREMENT for table `categories` +-- +ALTER TABLE `categories` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5; + +-- +-- AUTO_INCREMENT for table `offers` +-- +ALTER TABLE `offers` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; + +-- +-- AUTO_INCREMENT for table `professionals` +-- +ALTER TABLE `professionals` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `purchases` +-- +ALTER TABLE `purchases` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `rentals` +-- +ALTER TABLE `rentals` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; + +-- +-- AUTO_INCREMENT for table `rental_tools` +-- +ALTER TABLE `rental_tools` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8; + +-- +-- AUTO_INCREMENT for table `reviews` +-- +ALTER TABLE `reviews` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6; + +-- +-- AUTO_INCREMENT for table `r_reviews` +-- +ALTER TABLE `r_reviews` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; + +-- +-- AUTO_INCREMENT for table `services` +-- +ALTER TABLE `services` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=17; + +-- +-- AUTO_INCREMENT for table `service_requests` +-- +ALTER TABLE `service_requests` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `tools` +-- +ALTER TABLE `tools` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6; + +-- +-- AUTO_INCREMENT for table `users` +-- +ALTER TABLE `users` + MODIFY `user_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=12; + +-- +-- AUTO_INCREMENT for table `vendors` +-- +ALTER TABLE `vendors` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- Constraints for dumped tables +-- + +-- +-- Constraints for table `bookings` +-- +ALTER TABLE `bookings` + ADD CONSTRAINT `bookings_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`), + ADD CONSTRAINT `bookings_ibfk_2` FOREIGN KEY (`service_id`) REFERENCES `services` (`id`); + +-- +-- Constraints for table `carousel` +-- +ALTER TABLE `carousel` + ADD CONSTRAINT `carousel_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`), + ADD CONSTRAINT `carousel_ibfk_2` FOREIGN KEY (`brand_id`) REFERENCES `brands` (`id`); + +-- +-- Constraints for table `offers` +-- +ALTER TABLE `offers` + ADD CONSTRAINT `offers_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`), + ADD CONSTRAINT `offers_ibfk_2` FOREIGN KEY (`brand_id`) REFERENCES `brands` (`id`); + +-- +-- Constraints for table `purchases` +-- +ALTER TABLE `purchases` + ADD CONSTRAINT `purchases_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`), + ADD CONSTRAINT `purchases_ibfk_2` FOREIGN KEY (`tool_id`) REFERENCES `tools` (`id`); + +-- +-- Constraints for table `rentals` +-- +ALTER TABLE `rentals` + ADD CONSTRAINT `rentals_ibfk_1` FOREIGN KEY (`tool_id`) REFERENCES `tools` (`id`), + ADD CONSTRAINT `rentals_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`); + +-- +-- Constraints for table `rental_tools` +-- +ALTER TABLE `rental_tools` + ADD CONSTRAINT `rental_tools_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`), + ADD CONSTRAINT `rental_tools_ibfk_2` FOREIGN KEY (`brand_id`) REFERENCES `brands` (`id`); + +-- +-- Constraints for table `reviews` +-- +ALTER TABLE `reviews` + ADD CONSTRAINT `reviews_ibfk_1` FOREIGN KEY (`tool_id`) REFERENCES `tools` (`id`); + +-- +-- Constraints for table `r_reviews` +-- +ALTER TABLE `r_reviews` + ADD CONSTRAINT `r_reviews_ibfk_1` FOREIGN KEY (`rtool_id`) REFERENCES `rental_tools` (`id`); + +-- +-- Constraints for table `service_requests` +-- +ALTER TABLE `service_requests` + ADD CONSTRAINT `service_requests_ibfk_1` FOREIGN KEY (`professional_id`) REFERENCES `professionals` (`id`), + ADD CONSTRAINT `service_requests_ibfk_2` FOREIGN KEY (`booking_id`) REFERENCES `bookings` (`id`); + +-- +-- Constraints for table `tools` +-- +ALTER TABLE `tools` + ADD CONSTRAINT `tools_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`), + ADD CONSTRAINT `tools_ibfk_2` FOREIGN KEY (`brand_id`) REFERENCES `brands` (`id`); +COMMIT; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/ToolBox/static/Homepage.css b/ToolBox/static/Homepage.css new file mode 100644 index 0000000..710d9df --- /dev/null +++ b/ToolBox/static/Homepage.css @@ -0,0 +1,158 @@ +body { + background-color: #282C35; + color: white; +} + +.navbar-brand { + font-weight: bold; + color: white !important; +} + +.nav-item { + margin-left: 40px; +} + +.navbar-nav .nav-item .nav-link { + padding: 8px 10px; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover { + color: #28a745; +} + +.navbar-nav .nav-item .nav-link i { + font-size: 20px; + font-weight: bold; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover i { + color: #28a745; +} + +.navbar-nav .nav-item .dropdown-menu { + margin: 0; +} + +.navbar .form-control { + width: 300px; + +} + +.navbar .form-control + .btn { + margin-left: 5px; +} + +.navbar { + background-color: black; + height: 80px; +} + +.navbar .nav-link i { + font-size: 20px; + font-weight: bold; + color: white; +} + +.nav-item.dropdown:hover .dropdown-menu { + display: block; +} + +.dropdown-menu { + margin-top: 0; +} +.navbar-nav .dropdown-menu .dropdown-item { + color: white; + padding: 10px 20px; + transition: background-color 0.3s, color 0.3s; +} + +.navbar-nav .dropdown-menu .dropdown-item:hover { + background-color: #28a745; + color: white; + text-decoration: none; +} + +.navbar .dropdown-menu { + background-color: #282C35; + border: 1px solid #444; +} +.nav-link.logged-in { + color: green !important; + } + +.carousel { + margin-top: 15px; + padding-left: 10px; + padding-right: 10px; +} + +.carousel-item { + height: 400px; +} + +.carousel-control-prev, +.carousel-control-next { + top: 50%; + transform: translateY(-50%); + filter: invert(100%); +} + +.card-img-top { + height: 250px; +} + +.card-img { + height: 450px; + width: 700px; +} + +.card { + margin: 20px; + background-color: #282C35; + height: 550px; +} + +.card-body { + display: flex; + flex-direction: column; + justify-content: space-between; + height: 100%; +} + +.card-title { + color: white; + margin-bottom: auto; +} +.discount { + display: inline-block; + margin-bottom: -5px; + padding: 5px 10px; + max-width: 140px; + background-color: #007bff; + color: white; + font-size: 14px; + font-weight: bold; + border-radius: 5px; + text-transform: uppercase; +} + +.price { + margin-top: 5px; +} + + +.breadcrumb{ + background-color:transparent; + } + + table { + color: white; + } + th, td { + border: 1px solid #ffffff; + } + diff --git a/ToolBox/static/Item_Details.css b/ToolBox/static/Item_Details.css new file mode 100644 index 0000000..999e624 --- /dev/null +++ b/ToolBox/static/Item_Details.css @@ -0,0 +1,145 @@ +body { + background-color: #282C35; + color: white; +} + +.navbar-brand { + font-weight: bold; + color: white !important; +} + +.nav-item { + margin-left: 40px; +} + +.navbar-nav .nav-item .nav-link { + padding: 8px 10px; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover { + color: #28a745; +} + +.navbar-nav .nav-item .nav-link i { + font-size: 20px; + font-weight: bold; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover i { + color: #28a745; +} + +.navbar-nav .nav-item .dropdown-menu { + margin: 0; +} + +.navbar .form-control { + width: 300px; + +} + +.navbar .form-control + .btn { + margin-left: 5px; +} + +.navbar { + background-color: black; + height: 80px; +} + +.navbar .nav-link i { + font-size: 20px; + font-weight: bold; + color: white; +} + +.nav-item.dropdown:hover .dropdown-menu { + display: block; +} + +.dropdown-menu { + margin-top: 0; +} +.navbar-nav .dropdown-menu .dropdown-item { + color: white; + padding: 10px 20px; + transition: background-color 0.3s, color 0.3s; +} + +.navbar-nav .dropdown-menu .dropdown-item:hover { + background-color: #28a745; + color: white; + text-decoration: none; +} + +.navbar .dropdown-menu { + background-color: #282C35; + border: 1px solid #444; +} + + +.card-img-top { + height: 250px; +} + +.card-img { + height: 450px; + width: 700px; +} + +.card { + margin: 20px; + background-color: #282C35; + height: 550px; +} + +.card-body { + display: flex; + flex-direction: column; + justify-content: space-between; + height: 100%; +} + +.card-title { + color: white; + margin-bottom: auto; +} +.discount { + display: inline-block; + margin-bottom: -5px; + padding: 5px 10px; + max-width: 140px; + background-color: #007bff; + color: white; + font-size: 14px; + font-weight: bold; + border-radius: 5px; + text-transform: uppercase; +} + +.price { + margin-top: 5px; +} + + .stars { + display: inline-block; + font-size: 24px; + cursor: pointer; + } + + .stars .star { + color: #ccc; + } + + .stars .star.rated { + color: #ffcc00; + } + .breadcrumb{ + background-color:transparent; + } + + diff --git a/ToolBox/static/List.css b/ToolBox/static/List.css new file mode 100644 index 0000000..7036c8b --- /dev/null +++ b/ToolBox/static/List.css @@ -0,0 +1,268 @@ +body { + background-color: #282C35; + color: white; +} + +.navbar-brand { + font-weight: bold; + color: white !important; +} + +.nav-item { + margin-left: 40px; +} + +.navbar-nav .nav-item .nav-link { + padding: 8px 10px; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover { + color: #28a745; +} + +.navbar-nav .nav-item .nav-link i { + font-size: 20px; + font-weight: bold; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover i { + color: #28a745; +} + +.navbar-nav .nav-item .dropdown-menu { + margin: 0; +} + +.navbar .form-control { + width: 300px; + +} + +.navbar .form-control + .btn { + margin-left: 5px; +} + +.navbar { + background-color: black; + height: 80px; +} + +.navbar .nav-link i { + font-size: 20px; + font-weight: bold; + color: white; +} + +.nav-item.dropdown:hover .dropdown-menu { + display: block; +} + +.dropdown-menu { + margin-top: 0; +} +.navbar-nav .dropdown-menu .dropdown-item { + color: white; + padding: 10px 20px; + transition: background-color 0.3s, color 0.3s; +} + +.navbar-nav .dropdown-menu .dropdown-item:hover { + background-color: #28a745; + color: white; + text-decoration: none; +} + +.navbar .dropdown-menu { + background-color: #282C35; + border: 1px solid #444; +} + + +.card-img-top { + height: 250px; +} + +.card-img { + height: 450px; + width: 700px; +} + +.card { + + margin: 20px; + background-color: #282C35; + height: 550px; +} + +.card-body { + display: flex; + flex-direction: column; + justify-content: space-between; + height: 100%; +} + +.card-title { + color: white; + margin-bottom: auto; +} +.discount { + display: inline-block; + margin-bottom: -5px; + padding: 5px 10px; + max-width: 140px; + background-color: #007bff; + color: white; + font-size: 14px; + font-weight: bold; + border-radius: 5px; + text-transform: uppercase; +} + +.price { + margin-top: 5px; +} + + + + +body { + background-color: #282C35; + color: white; +} + +.navbar-brand { + font-weight: bold; + color: white !important; +} + +.nav-item { + margin-left: 40px; +} + +.navbar-nav .nav-item .nav-link { + padding: 8px 10px; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover { + color: #28a745; +} + +.navbar-nav .nav-item .nav-link i { + font-size: 20px; + font-weight: bold; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover i { + color: #28a745; +} + +.navbar-nav .nav-item .dropdown-menu { + margin: 0; +} + +.navbar .form-control { + width: 300px; + +} + +.navbar .form-control + .btn { + margin-left: 5px; +} + +.navbar { + background-color: black; + height: 80px; +} + +.navbar .nav-link i { + font-size: 20px; + font-weight: bold; + color: white; +} + +.nav-item.dropdown:hover .dropdown-menu { + display: block; +} + +.dropdown-menu { + margin-top: 0; +} +.navbar-nav .dropdown-menu .dropdown-item { + color: white; + padding: 10px 20px; + transition: background-color 0.3s, color 0.3s; +} + +.navbar-nav .dropdown-menu .dropdown-item:hover { + background-color: #28a745; + color: white; + text-decoration: none; +} + +.navbar .dropdown-menu { + background-color: #282C35; + border: 1px solid #444; +} + + +.card-img-top { + height: 250px; +} + +.card-img { + height: 450px; + width: 700px; +} + +.card { + + margin: 20px; + background-color: #282C35; + height: 550px; +} + +.card-body { + display: flex; + flex-direction: column; + justify-content: space-between; + height: 100%; +} + +.card-title { + color: white; + margin-bottom: auto; +} +.discount { + display: inline-block; + margin-bottom: -5px; + padding: 5px 10px; + max-width: 140px; + background-color: #007bff; + color: white; + font-size: 14px; + font-weight: bold; + border-radius: 5px; + text-transform: uppercase; +} + +.price { + margin-top: 5px; +} + +.col +{ +margin-right:60px; +} + + +.breadcrumb{ +background-color: transparent; +} \ No newline at end of file diff --git a/ToolBox/static/Login.css b/ToolBox/static/Login.css new file mode 100644 index 0000000..98a89a8 --- /dev/null +++ b/ToolBox/static/Login.css @@ -0,0 +1,182 @@ +body { + margin: 0; + padding: 0; + background-color:#282C35; + + background-size: cover; + background-repeat: no-repeat; + background-position: center; + color: white; +} + +.container { + display: flex; + justify-content: center; + align-items: center; + height: 100vh; +} + +body { + background-color: #282C35; + color: white; +} + + + +.form-inline { + display: flex; + align-items: center; +} + +.form-control { + + background-color: transparent; + color: white; + border-radius: 20px; + border: 1px solid white; + padding: 5px 10px; + margin-top:19px; +} + +.form-control::placeholder { + color: white; +} + +.form-control:focus { + background-color: rgba(255, 255, 255, 0.1); + color: white; + outline: none; + border-color: rgba(255, 255, 255, 0.5); +} + + +.input-group-append { + margin-left: -40px; +} + +.btn { + color: white; + background-color: transparent; + border: none; + cursor: pointer; +} + +.btn:hover { + opacity: 0.8; +} +.transparent-box { + background-color: rgba(0, 0, 0, 0.8); + padding: 30px; + border-radius: 10px; + max-width: 400px; + width: 100%; +} + + +.form-control { + background-color: rgba(255, 255, 255, 0.1); + color: white; + border: none; + border-radius: 5px; + padding: 10px; + box-shadow: 0 0 5px rgba(255, 255, 255, 0.5); + margin-bottom: 20px; +} + + +.form-control:focus { + background-color: rgba(255, 255, 255, 0.2); + border-color: rgba(255, 255, 255, 0.2); +} + + +.form-control::placeholder { + color: white; +} + + +.form-control:focus, +.form-control:not(:placeholder-shown) { + color: white; +} + + +.btn-primary { + background-color: black; + border-color: black; +} + + +.btn-primary:hover { + background-color: #282C35; + border-color: #282C35; +} + + +.btn-below-message { + background-color: black; + border-color: black; + margin-top: auto; +} + +.btn-below-message:hover { + background-color: #282C35; + border-color: #282C35; + +} + + +.btn-block { + margin-left: auto; + margin-right: auto; + display: block; +} +.header { + position: absolute; + top: 0; + left: 0; + padding: 20px; + color: #282C35; + font-size: 18px; + font-weight: bold; +} + +.logo { + margin: 0; + padding: 0; +} + +.blue { + color: blue; +} +.gradient-text { + background:linear-gradient(147deg, #000000 0%, #04619f 74%); + + + + + +} + + +.navbar-brand { + font-weight: bold; + color: white; +} + + +.navbar { + background-color:Black; + height: 80px; +} + +.navbar .nav-link i { + font-size: 20px; + font-weight: bold; +} +.nav-item.dropdown:hover .dropdown-menu { + display: block; +} +.dropdown-menu { + margin-top: 0; +} \ No newline at end of file diff --git a/ToolBox/static/Registration.css b/ToolBox/static/Registration.css new file mode 100644 index 0000000..eabe343 --- /dev/null +++ b/ToolBox/static/Registration.css @@ -0,0 +1,120 @@ +body { + margin: 0; /* Remove default body margin */ + padding: 0; /* Remove default body padding */ + background-color: #282C35; /* Fallback color in case the background image doesn't load */ + /* Replace 'background-image.jpg' with the path to your desired image */ + background-size: cover; + background-repeat: no-repeat; + background-position: center; + color: white; /* Text color for better contrast with the background image */ +} + +.container { + display: flex; + justify-content: center; + align-items: center; + height: 105vh; + +} +.transparent-box { + background-color: rgba(0, 0, 0, 0.8); /* Darker transparent box */ + padding: 30px; + border-radius: 10px; + width: 500px; +} + + +.input-group-append { + margin-left: -40px; +} + +.btn { + color: white; + background-color: transparent; + border: none; + cursor: pointer; +} + +.btn:hover { + opacity: 0.8; +} + +/* Adjust the textbox styles */ +.form-control { + background-color: rgba(255, 255, 255, 0.1); /* Lighter black for the text box */ + color: white; /* Text color */ + border: none; /* Remove border */ + border-radius: 5px; /* Add border-radius */ + padding: 10px; /* Add padding */ + box-shadow: 0 0 5px rgba(255, 255, 255, 0.5); /* Add shadow */ +} + +/* Change text box color when clicked */ +.form-control:focus { + background-color: rgba(255, 255, 255, 0.2); /* Lighter black when clicked */ + border-color: rgba(255, 255, 255, 0.2); /* Matching border color */ +} + +/* Placeholder color */ +.form-control::placeholder { + color: white; /* White placeholder color */ +} + +/* Change the color of text entered by the user */ +.form-control:focus, +.form-control:not(:placeholder-shown) { + color: white; /* White text color */ +} + + + +/* Change the button color to black */ +.btn-primary { + background-color: black; + border-color: black; +} + +/* Change button hover color */ +.btn-primary:hover { + background-color: #282C35; + border-color: #282C35; /* Matching border color */ +} + + +.form-check-input:checked { + background-color: black; +} +.header { + position: absolute; + top: 0; + left: 0; + padding: 20px; + color: #282C35; + font-size: 18px; + font-weight: bold; +} + +.navbar-brand { + font-weight: bold; + color: white; +} + + +.navbar { + background-color:Black; + height: 80px; +} + +.navbar .nav-link i { + font-size: 20px; + font-weight: bold; +} +.nav-item.dropdown:hover .dropdown-menu { + display: block; +} +.dropdown-menu { + margin-top: 0; +} + + + diff --git a/ToolBox/static/Service_booking.css b/ToolBox/static/Service_booking.css new file mode 100644 index 0000000..47e114b --- /dev/null +++ b/ToolBox/static/Service_booking.css @@ -0,0 +1,112 @@ +body { + background-color: #282C35; + color: white; +} + +.navbar-brand { + font-weight: bold; + color: white !important; +} + +.nav-item { + margin-left: 40px; +} + +.navbar-nav .nav-item .nav-link { + padding: 8px 10px; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover { + color: #28a745; +} + +.navbar-nav .nav-item .nav-link i { + font-size: 20px; + font-weight: bold; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover i { + color: #28a745; +} + +.navbar-nav .nav-item .dropdown-menu { + margin: 0; +} + +.navbar .form-control { + width: 300px; + +} + +.navbar .form-control + .btn { + margin-left: 5px; +} + +.navbar { + background-color: black; + height: 80px; +} + +.navbar .nav-link i { + font-size: 20px; + font-weight: bold; + color: white; +} + +.nav-item.dropdown:hover .dropdown-menu { + display: block; +} + +.dropdown-menu { + margin-top: 0; +} +.navbar-nav .dropdown-menu .dropdown-item { + color: white; + padding: 10px 20px; + transition: background-color 0.3s, color 0.3s; +} + +.navbar-nav .dropdown-menu .dropdown-item:hover { + background-color: #28a745; + color: white; + text-decoration: none; +} + +.navbar .dropdown-menu { + background-color: #282C35; + border: 1px solid #444; +} + + + .book-body { + max-width: 500px; + margin-top: 30px; + margin-bottom: 30px; + background-color:transparent; + padding: 30px; + border-radius: 8px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + } + .form-group{ + padding-left: 30px; + margin: 20px; + } + .form-control{ + width: 350px; + } + .form-group label { + font-weight: bold; + } + .book-btn{ + + width: 250px; + margin-left: 85px; + + } + + .breadcrumb{ + background-color:transparent; \ No newline at end of file diff --git a/ToolBox/static/Services.css b/ToolBox/static/Services.css new file mode 100644 index 0000000..660d13a --- /dev/null +++ b/ToolBox/static/Services.css @@ -0,0 +1,139 @@ +body { + background-color: #282C35; + color: white; +} + +.navbar-brand { + font-weight: bold; + color: white !important; +} + +.nav-item { + margin-left: 40px; +} + +.navbar-nav .nav-item .nav-link { + padding: 8px 10px; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover { + color: #28a745; +} + +.navbar-nav .nav-item .nav-link i { + font-size: 20px; + font-weight: bold; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover i { + color: #28a745; +} + +.navbar-nav .nav-item .dropdown-menu { + margin: 0; +} + +.navbar .form-control { + width: 300px; + +} + +.navbar .form-control + .btn { + margin-left: 5px; +} + +.navbar { + background-color: black; + height: 80px; +} + +.navbar .nav-link i { + font-size: 20px; + font-weight: bold; + color: white; +} + +.nav-item.dropdown:hover .dropdown-menu { + display: block; +} + +.dropdown-menu { + margin-top: 0; +} +.navbar-nav .dropdown-menu .dropdown-item { + color: white; + padding: 10px 20px; + transition: background-color 0.3s, color 0.3s; +} + +.navbar-nav .dropdown-menu .dropdown-item:hover { + background-color: #28a745; + color: white; + text-decoration: none; +} + +.navbar .dropdown-menu { + background-color: #282C35; + border: 1px solid #444; +} + + + + + + + + + + +.card { + position: relative; + overflow: hidden; + border: 1px solid #ddd; + border-radius: 0.5rem; + transition: box-shadow 0.3s ease; + background-color:transparent; + } + + .card:hover { + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); + } + + .card-body { + position: relative; + z-index: 1; + text-align: center; + color:white; + } + + .description { + display: none; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + background-color: rgba(0, 0, 0, 0.7); + + text-align: center; + padding: 1rem; + box-sizing: border-box; + transition: opacity 0.3s ease; + opacity: 0; + } + + .card:hover .description { + display: block; + opacity: 1; + } + + .card-icon { + font-size: 3rem; + margin-bottom: 1rem; + + } + .breadcrumb{ + background-color:transparent; \ No newline at end of file diff --git a/ToolBox/static/admin.css b/ToolBox/static/admin.css new file mode 100644 index 0000000..3b32aeb --- /dev/null +++ b/ToolBox/static/admin.css @@ -0,0 +1,8 @@ + body { + background-color: #282C35; + color: #ffffff; + } + .card { + background-color: #343a40; + } + \ No newline at end of file diff --git a/ToolBox/static/cart.css b/ToolBox/static/cart.css new file mode 100644 index 0000000..9ecf647 --- /dev/null +++ b/ToolBox/static/cart.css @@ -0,0 +1,71 @@ +body { + background-color: #282C35; + color: white; +} +.breadcrumb{ + background-color:transparent; + } + + table { + color: white; + } + th, td { + border: 1px solid #ffffff; + } + .navbar-brand { + font-weight: bold; + color: white !important; +} + +.nav-item { + margin-left: 40px; +} + +.navbar-nav .nav-item .nav-link { + padding: 8px 10px; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover { + color: #28a745; +} + +.navbar-nav .nav-item .nav-link i { + font-size: 20px; + font-weight: bold; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover i { + color: #28a745; +} + +.navbar-nav .nav-item .dropdown-menu { + margin: 0; +} + +.navbar .form-control { + width: 300px; + +} + +.navbar .form-control + .btn { + margin-left: 5px; +} + +.navbar { + background-color: black; + height: 80px; +} + th, td { + color: white; + border: 1px solid #ffffff; + } + th { + background-color: #495057; + } + tr:nth-child(even) { + background-color: #495057; + } \ No newline at end of file diff --git a/ToolBox/static/rent.css b/ToolBox/static/rent.css new file mode 100644 index 0000000..0be77ff --- /dev/null +++ b/ToolBox/static/rent.css @@ -0,0 +1,271 @@ +body { + background-color: #282C35; + color: white; +} + +.navbar-brand { + font-weight: bold; + color: white !important; +} + +.nav-item { + margin-left: 40px; +} + +.navbar-nav .nav-item .nav-link { + padding: 8px 10px; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover { + color: #28a745; +} + +.navbar-nav .nav-item .nav-link i { + font-size: 20px; + font-weight: bold; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover i { + color: #28a745; +} + +.navbar-nav .nav-item .dropdown-menu { + margin: 0; +} + +.navbar .form-control { + width: 300px; + +} + +.navbar .form-control + .btn { + margin-left: 5px; +} + +.navbar { + background-color: black; + height: 80px; +} + +.navbar .nav-link i { + font-size: 20px; + font-weight: bold; + color: white; +} + +.nav-item.dropdown:hover .dropdown-menu { + display: block; +} + +.dropdown-menu { + margin-top: 0; +} +.navbar-nav .dropdown-menu .dropdown-item { + color: white; + padding: 10px 20px; + transition: background-color 0.3s, color 0.3s; +} + +.navbar-nav .dropdown-menu .dropdown-item:hover { + background-color: #28a745; + color: white; + text-decoration: none; +} + +.navbar .dropdown-menu { + background-color: #282C35; + border: 1px solid #444; +} + + +.card-img-top { + height: 250px; +} + +.card-img { + height: 450px; + width: 700px; +} + +.card { + + margin: 20px; + background-color: #282C35; + height: 550px; +} + +.card-body { + display: flex; + flex-direction: column; + justify-content: space-between; + height: 100%; +} + +.card-title { + color: white; + margin-bottom: auto; +} +.discount { + display: inline-block; + margin-bottom: -5px; + padding: 5px 10px; + max-width: 140px; + background-color: #007bff; + color: white; + font-size: 14px; + font-weight: bold; + border-radius: 5px; + text-transform: uppercase; +} + +.price { + margin-top: 5px; +} + + + + +body { + background-color: #282C35; + color: white; +} + +.navbar-brand { + font-weight: bold; + color: white !important; +} + +.nav-item { + margin-left: 40px; +} + +.navbar-nav .nav-item .nav-link { + padding: 8px 10px; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover { + color: #28a745; +} + +.navbar-nav .nav-item .nav-link i { + font-size: 20px; + font-weight: bold; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover i { + color: #28a745; +} + +.navbar-nav .nav-item .dropdown-menu { + margin: 0; +} + +.navbar .form-control { + width: 300px; + +} + +.navbar .form-control + .btn { + margin-left: 5px; +} + +.navbar { + background-color: black; + height: 80px; +} + +.navbar .nav-link i { + font-size: 20px; + font-weight: bold; + color: white; +} + +.nav-item.dropdown:hover .dropdown-menu { + display: block; +} + +.dropdown-menu { + margin-top: 0; +} +.navbar-nav .dropdown-menu .dropdown-item { + color: white; + padding: 10px 20px; + transition: background-color 0.3s, color 0.3s; +} + +.navbar-nav .dropdown-menu .dropdown-item:hover { + background-color: #28a745; + color: white; + text-decoration: none; +} + +.navbar .dropdown-menu { + background-color: #282C35; + border: 1px solid #444; +} + + +.card-img-top { + height: 250px; +} + +.card-img { + height: 450px; + width: 700px; +} + +.card { + + margin: 20px; + background-color: #282C35; + height: 550px; +} + +.card-body { + display: flex; + flex-direction: column; + justify-content: space-between; + height: 100%; +} + +.card-title { + color: white; + margin-bottom: auto; +} +.discount { + display: inline-block; + margin-bottom: -5px; + padding: 5px 10px; + max-width: 140px; + background-color: #007bff; + color: white; + font-size: 14px; + font-weight: bold; + border-radius: 5px; + text-transform: uppercase; +} + +.price { + margin-top: 5px; +} + +.col +{ +margin-right:60px; +} + + + + + +.breadcrumb{ +background-color: transparent; +} \ No newline at end of file diff --git a/ToolBox/static/rent_booking.css b/ToolBox/static/rent_booking.css new file mode 100644 index 0000000..31daa99 --- /dev/null +++ b/ToolBox/static/rent_booking.css @@ -0,0 +1,157 @@ +body { + background-color: #282C35; + color: white; +} + +.navbar-brand { + font-weight: bold; + color: white !important; +} + +.nav-item { + margin-left: 40px; +} + +.navbar-nav .nav-item .nav-link { + padding: 8px 10px; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover { + color: #28a745; +} + +.navbar-nav .nav-item .nav-link i { + font-size: 20px; + font-weight: bold; + color: white; + transition: color 0.3s; +} + +.navbar-nav .nav-item .nav-link:hover i { + color: #28a745; +} + +.navbar-nav .nav-item .dropdown-menu { + margin: 0; +} + +.navbar .form-control { + width: 300px; + +} + +.navbar .form-control + .btn { + margin-left: 5px; +} + +.navbar { + background-color: black; + height: 80px; +} + +.navbar .nav-link i { + font-size: 20px; + font-weight: bold; + color: white; +} + +.nav-item.dropdown:hover .dropdown-menu { + display: block; +} + +.dropdown-menu { + margin-top: 0; +} +.navbar-nav .dropdown-menu .dropdown-item { + color: white; + padding: 10px 20px; + transition: background-color 0.3s, color 0.3s; +} + +.navbar-nav .dropdown-menu .dropdown-item:hover { + background-color: #28a745; + color: white; + text-decoration: none; +} + +.navbar .dropdown-menu { + background-color: #282C35; + border: 1px solid #444; +} + + +.card-img-top { + height: 250px; +} + +.card-img { + height: 450px; + width: 700px; +} + +.card { + margin: 20px; + background-color: #282C35; + height: 550px; +} + +.card-body { + display: flex; + flex-direction: column; + justify-content: space-between; + height: 100%; +} + +.card-title { + color: white; + margin-bottom: auto; +} +.discount { + display: inline-block; + margin-bottom: -5px; + padding: 5px 10px; + max-width: 140px; + background-color: #007bff; + color: white; + font-size: 14px; + font-weight: bold; + border-radius: 5px; + text-transform: uppercase; +} + +.price { + margin-top: 5px; + margin-bottom: 20px; +} + + .stars { + display: flex; + direction: row; + font-size: 25px; +} + +.star { + cursor: pointer; + color: #ccc; +} + +.star.selected { + color: #ffc107; +} + + .breadcrumb{ + background-color:transparent; + } + .modal-content { + background-color: #282C35; + color: #FFFFFF; + } + .modal-header { + border-bottom: 1px solid #444; + } + .modal-footer { + border-top: 1px solid #444; + } + diff --git a/ToolBox/templates/Admin.html b/ToolBox/templates/Admin.html new file mode 100644 index 0000000..7c18669 --- /dev/null +++ b/ToolBox/templates/Admin.html @@ -0,0 +1,59 @@ + + + + + + Admin Dashboard + + + + + +

+

Admin Dashboard

+ + +
+

Carousel Items

+ Add Carousel Item +
+ {% for item in carousel %} +
+
+ Carousel Image +
+
+ +
+
+
+
+ {% endfor %} +
+
+ + +
+

Offers

+ Add Offer +
+ {% for offer in offers %} +
+
+ Offer Image +
+
+ +
+
+
+
+ {% endfor %} +
+
+
+ + + + + diff --git a/ToolBox/templates/Admin_add.html b/ToolBox/templates/Admin_add.html new file mode 100644 index 0000000..987d86e --- /dev/null +++ b/ToolBox/templates/Admin_add.html @@ -0,0 +1,73 @@ + + + + + + Add Carousel Item / Offer + + + + + +
+

Add Carousel Item

+
+
+ + +
+
+ + +
+
+ + +
+ +
+ +
+ +

Add Offer

+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ + + + + diff --git a/ToolBox/templates/Homepage.html b/ToolBox/templates/Homepage.html new file mode 100644 index 0000000..8ae3f33 --- /dev/null +++ b/ToolBox/templates/Homepage.html @@ -0,0 +1,164 @@ + + + + + + ToolBox | Home + + + + + + + + + + +
+ +
+ + + +
+ {% for tool in tools %} +
+
+ ... +
+
{{ tool[1] }}
+ {{ tool[2] }} % off +
£ {{ tool[3] }}
+ Add to Basket +
+
+
+ {% endfor %} +
+ + +
+ {% for offer in offers %} +
+
+ ... +
+
+ {% endfor %} +
+ + +
+
+
+ + + + + + +
+
+ +
+ © 2023 Copyright: + toolbox.com +
+
+ + + + + + diff --git a/ToolBox/templates/Item_details.html b/ToolBox/templates/Item_details.html new file mode 100644 index 0000000..89cd642 --- /dev/null +++ b/ToolBox/templates/Item_details.html @@ -0,0 +1,200 @@ + + + + + + ToolBox | Item Details + + + + + + + + +
+
+ +
+ Tool Image +
+
+

{{ tool[1] }}

+

Rating: {{ tool[5] }}/5

+

{{ tool[2] }}% off

+

£ {{ tool[3] }}

+ +
+
+ +
+ + +
+
+

Specifications

+

{{ tool[6] }}

+
+
+ +
+ + + +
+
+

Customer Reviews

+ + {% for review in reviews %} +
+

{{ review[0] }}

+

Rating: {{ review[1] }}/5

+

{{ review[2] }}

+
+ {% endfor %} + + +
+
+
+ + +
+
+ + + +
+ + + + + +
+
+
+ + +
+ +
+
+
+ +
+ +
+
+
+ + + + + + +
+
+ +
+ © 2023 Copyright: + toolbox.com +
+
+ + + + + + + diff --git a/ToolBox/templates/List.html b/ToolBox/templates/List.html new file mode 100644 index 0000000..fac59c3 --- /dev/null +++ b/ToolBox/templates/List.html @@ -0,0 +1,156 @@ + + + + + + ToolBox | List + + + + + + + + +
+
+ {% for tool in tools %} +
+
+ + ... + +
+
+ {{ tool[1] }} +
+ {{ tool[2] }} % off +
£ {{ tool[3] }}
+ View Details +
+
+
+ {% endfor %} +
+ + + +
+ + +
+
+
+ + + + + + +
+
+ +
+ © 2023 Copyright: + toolbox.com +
+
+ + + + + + diff --git a/ToolBox/templates/Login.html b/ToolBox/templates/Login.html new file mode 100644 index 0000000..8315ea9 --- /dev/null +++ b/ToolBox/templates/Login.html @@ -0,0 +1,36 @@ + + + + + + ToolBox | Login + + + + + +
+
+

Login

+

Please Enter Your Login Details

+
+
+ +
+
+ +
+ + +
+

Don't have an account yet? Register Account.

+
+
+ + diff --git a/ToolBox/templates/Professional.html b/ToolBox/templates/Professional.html new file mode 100644 index 0000000..45ac3ae --- /dev/null +++ b/ToolBox/templates/Professional.html @@ -0,0 +1,57 @@ + + + + + + Professional Dashboard + + + + + +
+

Professional Dashboard

+ + +
+
Service Requests
+
+ +
+
+ + + + +
+ + + + + diff --git a/ToolBox/templates/Registration.html b/ToolBox/templates/Registration.html new file mode 100644 index 0000000..963174a --- /dev/null +++ b/ToolBox/templates/Registration.html @@ -0,0 +1,87 @@ + + + + + + ToolBox|Registration + + + + + +
+ +
+

Register

+

Hello Customer, Enter your details here.

+
+
+ +
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + +
+

or Have an Account? Login

+
+ +
+
+ + + + + + + diff --git a/ToolBox/templates/Service_booking.html b/ToolBox/templates/Service_booking.html new file mode 100644 index 0000000..04c70a8 --- /dev/null +++ b/ToolBox/templates/Service_booking.html @@ -0,0 +1,131 @@ + + + + + + ToolBox | Book Appointment + + + + + + + + + +
+

Book an Appointment for {{ service }}

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ +
+
+
+ + + + + + +
+
+ +
+ © 2023 Copyright: + toolbox.com +
+
+ + + + + diff --git a/ToolBox/templates/Services.html b/ToolBox/templates/Services.html new file mode 100644 index 0000000..3396d56 --- /dev/null +++ b/ToolBox/templates/Services.html @@ -0,0 +1,117 @@ + + + + + + ToolBox | Services + + + + + + + + + +
+ {% for service in services %} + + {% endfor %} +
+ + + + +
+
+
+ + + + + + +
+
+ +
+ © 2023 Copyright: + toolbox.com +
+
+ + + + + + diff --git a/ToolBox/templates/Vendor.html b/ToolBox/templates/Vendor.html new file mode 100644 index 0000000..c7b14df --- /dev/null +++ b/ToolBox/templates/Vendor.html @@ -0,0 +1,68 @@ + + + + + + Vendor Dashboard + + + + + +
+

Vendor Dashboard

+ + +
+
Manage Items
+
+ + +
+
+
+ + + + + + + + diff --git a/ToolBox/templates/cart.html b/ToolBox/templates/cart.html new file mode 100644 index 0000000..f6e9d68 --- /dev/null +++ b/ToolBox/templates/cart.html @@ -0,0 +1,107 @@ + + + + + + Your Cart | ToolBox + + + + + + + +
+ + +

Rental History

+ {% if rentals %} + + + + + + + + + + + {% for rental in rentals %} + + + + + + + {% endfor %} + +
Tool IDNameRental DateReturn Date
{{ rental[1] }}{{ rental[3] }}{{ rental[7] }}{{ rental[8] }}
+ {% else %} +

No rental history found.

+ {% endif %} + +

Service Bookings

+ {% if service_bookings %} + + + + + + + + + + + {% for booking in service_bookings %} + + + + + + + {% endfor %} + +
Service IDNameAppointment DateAppointment Time
{{ booking[1] }}{{ booking[3] }}{{ booking[8] }}{{ booking[9] }}
+ {% else %} +

No service bookings found.

+ {% endif %} + +

Purchase History

+ {% if purchases %} + + + + + + + + + + {% for purchase in purchases %} + + + + + + {% endfor %} + +
Purchase IDTool IDPurchase Date
{{ purchase[0] }}{{ purchase[1] }}{{ purchase[3] }}
+ {% else %} +

No purchase history found.

+ {% endif %} +
+ + + + + diff --git a/ToolBox/templates/rent.html b/ToolBox/templates/rent.html new file mode 100644 index 0000000..789cf13 --- /dev/null +++ b/ToolBox/templates/rent.html @@ -0,0 +1,184 @@ + + + + + + ToolBox | Rent + + + + + + + + +
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+ +
+ {% for rental_tool in rental_tools %} +
+
+ + Tool image + +
+
+ {{ rental_tool[1] }} +
+ {{ rental_tool[2] }}% off +
£{{ rental_tool[3] }} per day
+ Rent Now +
+
+
+ {% endfor %} +
+ + + +
+ +
+
+
+ + + + + + +
+
+ +
+ © 2023 ToolBox. All rights reserved. +
+
+ + + + + + diff --git a/ToolBox/templates/rental_booking.html b/ToolBox/templates/rental_booking.html new file mode 100644 index 0000000..0523042 --- /dev/null +++ b/ToolBox/templates/rental_booking.html @@ -0,0 +1,220 @@ + + + + + + ToolBox | Rent Details + + + + + + + + +
+
+
+ Tool Image +
+
+

{{ rental_tool[1] }}

+

Rating: {{ rental_tool[5] }}/5

+

{{ rental_tool[2] }}% off

+

£ {{ rental_tool[3] }} per day

+ +
+
+ +
+ +
+
+

Specifications

+

{{ rental_tool[6] }}

+
+
+ +
+ +
+
+

Customer Reviews

+ {% for review in reviews %} +
+

{{ review[0] }}

+

Rating: {{ review[1] }}/5

+

{{ review[2] }}

+
+ {% endfor %} +
+
+
+ + +
+
+ + +
+ + + + + +
+
+
+ + +
+ +
+
+
+
+ + + + +
+
+
+ + + + + + +
+
+

ToolBox - A One-Stop Shop for All Your Tool Needs.

+
+
+
+ © 2024 ToolBox +
+
+ + + + + +