nodejs + express + dynamic room generation with url generator
This commit is contained in:
parent
aa219ad431
commit
6f2c7df7e7
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
node_modules/
|
BIN
Kacper-Maj-Karta-projekt.pdf
Normal file
BIN
Kacper-Maj-Karta-projekt.pdf
Normal file
Binary file not shown.
52
index.html
52
index.html
@ -1,52 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" />
|
||||
<link href="./landing-page-css.css" rel="stylesheet" />
|
||||
<title>Document</title>
|
||||
<script type="text/javascript" defer src="index.js"></script>
|
||||
<!-- Bootstrap -->
|
||||
<!-- Font Awesome -->
|
||||
<link
|
||||
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
<!-- Google Fonts -->
|
||||
<link
|
||||
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
<!-- MDB -->
|
||||
<link
|
||||
href="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/3.0.0/mdb.min.css"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
|
||||
<!-- MDB -->
|
||||
<script
|
||||
type="text/javascript"
|
||||
defer src="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/3.0.0/mdb.min.js"
|
||||
></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="background">
|
||||
<div id="nav" >
|
||||
<img src="images/wwf-text.png" alt="text" class="wwf-text">
|
||||
<img src="images/logo-bez-tla.png" alt="logo" class="logo">
|
||||
<button id="create-room" class="centered button-create-room">Stwórz pokój!</button>
|
||||
</div>
|
||||
<div id="footer" class="fixed-bottom">
|
||||
<footer class="bg-grey text-center text-lg-start">
|
||||
<!-- Copyright -->
|
||||
<div class="text-center p-3" style="background-color: rgba(0, 0, 0, 0.4)">
|
||||
<a class="text-light">Stworzone przez Kacpra Maja na zajęcia Pracowni Programowania</a>
|
||||
<br/>
|
||||
<a class="text-light">Numer indeksu: s457990</a>
|
||||
</div>
|
||||
<!-- Copyright -->
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
5
index.js
5
index.js
@ -1,5 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
const button = document.getElementById("create-room");
|
||||
|
||||
button.addEventListener('click', () => console.log("dziala!"));
|
@ -1,70 +0,0 @@
|
||||
.wwf-text {
|
||||
/* wwf-text 1 */
|
||||
display: block;
|
||||
/* position: fixed; */
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
margin-top: -5%;
|
||||
transform: scale(0.4);
|
||||
filter: drop-shadow(-11px 8px 5px rgba(0, 0, 0, 0.63))
|
||||
}
|
||||
.logo {
|
||||
/* logo-bez-tla 1 */
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
margin-top:-12rem;
|
||||
transform: scale(0.8);
|
||||
filter: drop-shadow(-11px 11px 7px rgba(0, 0, 0, 0.63));
|
||||
}
|
||||
|
||||
|
||||
.background {
|
||||
|
||||
/* background-langing-page 1 */
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-position: center;
|
||||
left: 0px;
|
||||
top: 0px;
|
||||
|
||||
background-image: url(images/background-langing-page.png);
|
||||
}
|
||||
|
||||
|
||||
|
||||
.button-create-room {
|
||||
box-shadow:inset 0px 1px 0px 0px #cf866c;
|
||||
background:linear-gradient(to bottom, #d0451b 5%, #bc3315 100%);
|
||||
background-color:#d0451b;
|
||||
border-radius:25px;
|
||||
border:1px solid #942911;
|
||||
display:inline-block;
|
||||
cursor:pointer;
|
||||
color:#ffffff;
|
||||
font-family: Montserrat;
|
||||
font-size:25px;
|
||||
padding:10px 30px;
|
||||
text-decoration:none;
|
||||
text-shadow:0px 1px 0px #854629;
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
.button-create-room:hover {
|
||||
background:linear-gradient(to bottom, #bc3315 5%, #d0451b 100%);
|
||||
background-color:#bc3315;
|
||||
position:relative;
|
||||
top:-2px;
|
||||
}
|
||||
.button-create-room:active {
|
||||
position:relative;
|
||||
top:3px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
1777
package-lock.json
generated
Normal file
1777
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
26
package.json
Normal file
26
package.json
Normal file
@ -0,0 +1,26 @@
|
||||
{
|
||||
"name": "watch-with-friends",
|
||||
"version": "1.0.0",
|
||||
"description": "**Watch with friends** to projekt, który ma za zadanie umożliwić „spotkanie” się znajomych na wspólnym oglądaniu filmów w dobie pandemii. Postawiłem sobie za zadanie umożliwić połączenie możliwie wielu przyjaciół jednocześnie w jednym, generowanym losowo pokoju do którego dostęp otrzymują osoby, które dostaną unikatowy link. W pokoju tym użytkownicy poproszeni zostaną o ustawienie swojej nazwy a następnie mogą zarządzać puszczanym aktualnie filmem z YouTube, wkleić link do wybranego przez siebie filmu, dowolnie zatrzymywać i puszczać film. Jako dodatkowy element pokoju dodany zostanie chat, który będzie pozwalał na komunikację pomiędzy użytkownikami serwisu w czasie rzeczywistym.",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"start": "node src/index.js",
|
||||
"dev": "nodemon src/index.js --ignore src/utils/roomsIDs.json"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://git.wmi.amu.edu.pl/s457990/Watch-with-friends"
|
||||
},
|
||||
"author": "Kacper Maj",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"express": "^4.17.1",
|
||||
"fs": "0.0.1-security",
|
||||
"hbs": "^4.1.1",
|
||||
"mdbootstrap": "^4.19.2",
|
||||
"request": "^2.88.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"nodemon": "^2.0.7"
|
||||
}
|
||||
}
|
60
public/css/landing-page-css.css
Normal file
60
public/css/landing-page-css.css
Normal file
@ -0,0 +1,60 @@
|
||||
.wwf-text {
|
||||
/* wwf-text 1 */
|
||||
display: block;
|
||||
/* position: fixed; */
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
margin-top: -5%;
|
||||
transform: scale(0.4);
|
||||
filter: drop-shadow(-11px 8px 5px rgba(0, 0, 0, 0.63));
|
||||
}
|
||||
.logo {
|
||||
/* logo-bez-tla 1 */
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
margin-top: -12rem;
|
||||
transform: scale(0.8);
|
||||
filter: drop-shadow(-11px 11px 7px rgba(0, 0, 0, 0.63));
|
||||
}
|
||||
|
||||
.background {
|
||||
/* background-langing-page 1 */
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-position: center;
|
||||
left: 0px;
|
||||
top: 0px;
|
||||
|
||||
background-image: url(../img/background-langing-page.png);
|
||||
}
|
||||
|
||||
.button-create-room {
|
||||
box-shadow: inset 0px 1px 0px 0px #cf866c;
|
||||
background: linear-gradient(to bottom, #d0451b 5%, #bc3315 100%);
|
||||
background-color: #d0451b;
|
||||
border-radius: 25px;
|
||||
border: 1px solid #942911;
|
||||
display: inline-block;
|
||||
cursor: pointer;
|
||||
color: #ffffff;
|
||||
font-family: Montserrat;
|
||||
font-size: 25px;
|
||||
padding: 10px 30px;
|
||||
text-decoration: none;
|
||||
text-shadow: 0px 1px 0px #854629;
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
.button-create-room:hover {
|
||||
background: linear-gradient(to bottom, #bc3315 5%, #d0451b 100%);
|
||||
background-color: #bc3315;
|
||||
position: relative;
|
||||
top: -2px;
|
||||
}
|
||||
.button-create-room:active {
|
||||
position: relative;
|
||||
top: 3px;
|
||||
}
|
Before Width: | Height: | Size: 1.6 MiB After Width: | Height: | Size: 1.6 MiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 85 KiB |
30
public/js/landingPage.js
Normal file
30
public/js/landingPage.js
Normal file
@ -0,0 +1,30 @@
|
||||
'use strict';
|
||||
|
||||
const button = document.getElementById('create-room');
|
||||
const roomCreateForm = document.getElementById('create-room-form');
|
||||
const ID = () => Math.random().toString(36).substr(2, 12);
|
||||
|
||||
const sendDataJson = function (data) {
|
||||
fetch('/room', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify(data),
|
||||
})
|
||||
.then((response) => response.json())
|
||||
.then((data) => {
|
||||
console.log('Success:', data);
|
||||
})
|
||||
.catch((error) => {
|
||||
// console.error('Error:', error);
|
||||
});
|
||||
};
|
||||
|
||||
button.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
const idOfRoom = ID();
|
||||
sendDataJson({ id: idOfRoom });
|
||||
console.log('button dziala');
|
||||
location.href = `/room/${idOfRoom}`;
|
||||
});
|
94
room.html
94
room.html
@ -1,94 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" />
|
||||
<link href="./room-style.css" rel="stylesheet" />
|
||||
<script type="text/javascript" defer src="room.js"></script>
|
||||
<title>Document</title>
|
||||
|
||||
<!-- Bootstrap -->
|
||||
<!-- Font Awesome -->
|
||||
<link
|
||||
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
<!-- Google Fonts -->
|
||||
<link
|
||||
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
<!-- MDB -->
|
||||
<link
|
||||
href="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/3.0.0/mdb.min.css"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
|
||||
<!-- MDB -->
|
||||
<script
|
||||
type="text/javascript"
|
||||
defer src="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/3.0.0/mdb.min.js"
|
||||
></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="header">
|
||||
|
||||
<!-- navbar icon -->
|
||||
<nav class="navbar navbar-light bg-dark">
|
||||
<div class="container">
|
||||
<a class="navbar-brand" href="#">
|
||||
<img
|
||||
src="images/logo-bez-tla.png"
|
||||
height="120"
|
||||
alt=""
|
||||
loading="lazy"
|
||||
/>
|
||||
</a>
|
||||
|
||||
<!-- search form -->
|
||||
<form class="d-flex input-group w-50 ">
|
||||
<input type="search" class="form-control" id="yt-link" placeholder="Wklej link do filmu na youtubie" aria-label="Search"/>
|
||||
<button class="btn btn-outline-light" id="link-do-filmu-btn" type="button" data-mdb-ripple-color="light">
|
||||
Oglądaj!
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- YT PLAYER -->
|
||||
|
||||
<div class="row light-dark d-flex justify-content-center">
|
||||
<div class="col-md-8 d-flex justify-content-center">
|
||||
<div id="player">
|
||||
<iframe id="yt-player-iframe" width="900" height="500" src="https://www.youtube.com/embed/9YffrCViTVk" frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
||||
allowfullscreen></iframe>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<!-- CHAT -->
|
||||
<div id="chat" class="col-md-4 d-flex justify-content-center">
|
||||
dsadsa
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div id="footer" class="fixed-bottom">
|
||||
|
||||
<footer class="bg-grey text-center text-lg-start">
|
||||
<!-- Copyright -->
|
||||
<div class="text-center p-3" style="background-color: rgba(0, 0, 0, 0.4)">
|
||||
|
||||
<a class="text-light" href="https://mdbootstrap.com/">Stworzone przez Kacpra Maja na zajecia Pracowni Programowania</a>
|
||||
<br/>
|
||||
<a class="text-light" href="https://mdbootstrap.com/">Numer indeksu: 457990</a>
|
||||
</div>
|
||||
<!-- Copyright -->
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
55
src/index.js
Normal file
55
src/index.js
Normal file
@ -0,0 +1,55 @@
|
||||
const path = require('path');
|
||||
const express = require('express');
|
||||
const hbs = require('hbs');
|
||||
const request = require('request');
|
||||
const bodyParser = require('body-parser');
|
||||
const { addToJson, checkIfInJson } = require('./logic');
|
||||
require('./logic');
|
||||
|
||||
// Establishing the server
|
||||
const app = express();
|
||||
app.use(bodyParser.urlencoded({ extended: true }));
|
||||
app.use(bodyParser.json());
|
||||
app.use(bodyParser.raw());
|
||||
const port = process.env.PORT || 3000;
|
||||
|
||||
// Establishing routes to views directory
|
||||
const viewsPath = path.join(__dirname, '../templates/views');
|
||||
|
||||
// setup handlebars, engine, views locations
|
||||
app.set('view engine', 'hbs');
|
||||
app.set('views', viewsPath);
|
||||
|
||||
// setup static dir to serve
|
||||
app.use(express.static(path.join(__dirname, `../public`)));
|
||||
|
||||
//Establishing the routers for app.get
|
||||
app.get('', (req, res) => {
|
||||
res.render('index', {});
|
||||
});
|
||||
|
||||
app.post('/room', (req, res) => {
|
||||
// console.log(req.body.id);
|
||||
addToJson(req.body.id);
|
||||
// res.redirect('/room/:id');
|
||||
});
|
||||
app.get('/room/:id', (req, res) => {
|
||||
// sprawdzam czy id znajduje sie w jsonie aktualnie stworzonych pokojow, jesli tak to pozwalam sie podlaczyc
|
||||
// jak uzytkownik wychodzi to sprawdzam w socketIO ile ludzi podlaczonych jest aktualnie do pokoju
|
||||
// console.log(req.params.id);
|
||||
// console.log(checkIfInJson(req.params.id));
|
||||
if (!checkIfInJson(req.params.id)) return res.send('no found');
|
||||
|
||||
res.render('room', {});
|
||||
});
|
||||
app.get('*', (req, res) => {
|
||||
res.send('404', {
|
||||
title: 'page not found',
|
||||
pageName: '404 error',
|
||||
});
|
||||
});
|
||||
|
||||
// Deploying server
|
||||
app.listen(port, () => {
|
||||
console.log(`server is up on port ${port}`);
|
||||
});
|
34
src/logic.js
Normal file
34
src/logic.js
Normal file
@ -0,0 +1,34 @@
|
||||
const fs = require('fs');
|
||||
// dodac funkcje usuwania i filtrowania
|
||||
const loadFromJson = () => {
|
||||
try {
|
||||
const dataBuffer = fs.readFileSync('src/utils/roomsIDs.json');
|
||||
const dataJson = dataBuffer.toString();
|
||||
return JSON.parse(dataJson);
|
||||
} catch (e) {
|
||||
return [];
|
||||
}
|
||||
};
|
||||
|
||||
const addToJson = (id) => {
|
||||
const dataLoaded = loadFromJson();
|
||||
dataLoaded.push({
|
||||
id,
|
||||
});
|
||||
const dataJSON = JSON.stringify(dataLoaded);
|
||||
fs.writeFileSync('src/utils/roomsIDs.json', dataJSON);
|
||||
};
|
||||
|
||||
const checkIfInJson = (id) => {
|
||||
const data = loadFromJson();
|
||||
let inJson = false;
|
||||
data.forEach((roomID) => {
|
||||
// console.log(roomID.id);
|
||||
if (roomID.id === id) inJson = true;
|
||||
});
|
||||
return inJson;
|
||||
};
|
||||
module.exports = {
|
||||
addToJson,
|
||||
checkIfInJson,
|
||||
};
|
1
src/utils/roomsIDs.json
Normal file
1
src/utils/roomsIDs.json
Normal file
@ -0,0 +1 @@
|
||||
[{"id":"devroom"},{"id":"3fonw8h8u1c"},{"id":"msvq9gmd8x"},{"id":"35yw1clt8uj"},{"id":"v34lexnxkf"},{"id":"cjkxzo4ot5"},{"id":"p53znizk5n"}]
|
46
templates/views/index.hbs
Normal file
46
templates/views/index.hbs
Normal file
@ -0,0 +1,46 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" />
|
||||
<link href="/css/landing-page-css.css" rel="stylesheet" />
|
||||
<title>Document</title>
|
||||
<script type="text/javascript" defer src="/js/landingPage.js"></script>
|
||||
<!-- Bootstrap -->
|
||||
<!-- Font Awesome -->
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css" rel="stylesheet" />
|
||||
<!-- Google Fonts -->
|
||||
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet" />
|
||||
<!-- MDB -->
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/3.0.0/mdb.min.css" rel="stylesheet" />
|
||||
|
||||
<!-- MDB -->
|
||||
<script type="text/javascript" defer
|
||||
src="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/3.0.0/mdb.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="background">
|
||||
<div id="nav">
|
||||
<img src="/img/wwf-text.png" alt="text" class="wwf-text">
|
||||
<img src="/img/logo-bez-tla.png" alt="logo" class="logo">
|
||||
<form method="POST" id="create-room-form">
|
||||
<button type="submit" id="create-room" class="centered button-create-room">Stwórz pokój!</button>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
<div id="footer" class="fixed-bottom">
|
||||
<footer class="bg-grey text-center text-lg-start">
|
||||
<!-- Copyright -->
|
||||
<div class="text-center p-3" style="background-color: rgba(0, 0, 0, 0.4)">
|
||||
<a class="text-light">Stworzone przez Kacpra Maja na zajęcia Pracowni Programowania</a>
|
||||
<br />
|
||||
<a class="text-light">Numer indeksu: s457990</a>
|
||||
</div>
|
||||
<!-- Copyright -->
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
83
templates/views/room.hbs
Normal file
83
templates/views/room.hbs
Normal file
@ -0,0 +1,83 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" />
|
||||
<link href="/css/room-style.css" rel="stylesheet" />
|
||||
<script type="text/javascript" defer src="/js/room.js"></script>
|
||||
<title>Document</title>
|
||||
|
||||
<!-- Bootstrap -->
|
||||
<!-- Font Awesome -->
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css" rel="stylesheet" />
|
||||
<!-- Google Fonts -->
|
||||
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet" />
|
||||
<!-- MDB -->
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/3.0.0/mdb.min.css" rel="stylesheet" />
|
||||
|
||||
<!-- MDB -->
|
||||
<script type="text/javascript" defer
|
||||
src="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/3.0.0/mdb.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="header">
|
||||
|
||||
<!-- navbar icon -->
|
||||
<nav class="navbar navbar-light bg-dark">
|
||||
<div class="container">
|
||||
<a class="navbar-brand" href="#">
|
||||
<img src="/img/logo-bez-tla.png" height="120" alt="" loading="lazy" />
|
||||
</a>
|
||||
|
||||
<!-- search form -->
|
||||
<form class="d-flex input-group w-50 ">
|
||||
<input type="search" class="form-control" id="yt-link" placeholder="Wklej link do filmu na youtubie"
|
||||
aria-label="Search" />
|
||||
<button class="btn btn-outline-light" id="link-do-filmu-btn" type="button" data-mdb-ripple-color="light">
|
||||
Oglądaj!
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- YT PLAYER -->
|
||||
|
||||
<div class="row light-dark d-flex justify-content-center">
|
||||
<div class="col-md-8 d-flex justify-content-center">
|
||||
<div id="player">
|
||||
<iframe id="yt-player-iframe" width="900" height="500" src="https://www.youtube.com/embed/9YffrCViTVk"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
||||
allowfullscreen></iframe>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<!-- CHAT -->
|
||||
<div id="chat" class="col-md-4 d-flex justify-content-center">
|
||||
dsadsa
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div id="footer" class="fixed-bottom">
|
||||
|
||||
<footer class="bg-grey text-center text-lg-start">
|
||||
<!-- Copyright -->
|
||||
<div class="text-center p-3" style="background-color: rgba(0, 0, 0, 0.4)">
|
||||
|
||||
<a class="text-light" href="https://mdbootstrap.com/">Stworzone przez Kacpra Maja na zajecia Pracowni
|
||||
Programowania</a>
|
||||
<br />
|
||||
<a class="text-light" href="https://mdbootstrap.com/">Numer indeksu: 457990</a>
|
||||
</div>
|
||||
<!-- Copyright -->
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user