mirror of
https://gitlab.com/nekoya/web.git
synced 2025-04-15 18:27:08 +02:00
Merge branch 'main' of https://gitlab.com/nekoya/web
This commit is contained in:
commit
d237aad3d6
10 changed files with 390 additions and 32 deletions
35
index.js
35
index.js
|
@ -1,10 +1,15 @@
|
|||
const express = require('express')
|
||||
const bodyParser = require('body-parser')
|
||||
const session = require('express-session')
|
||||
const app = express()
|
||||
var express = require("express");
|
||||
var cookieParser = require("cookie-parser");
|
||||
var logger = require("morgan");
|
||||
var bodyParser = require("body-parser");
|
||||
const app = express();
|
||||
|
||||
app.use(express.static('public'))
|
||||
app.set('view engine', 'ejs')
|
||||
app.use(bodyParser.urlencoded({ extended: true }));
|
||||
app.use(bodyParser.json());
|
||||
app.use(logger("dev"));
|
||||
app.use(express.json());
|
||||
app.use(express.urlencoded({ extended: false }));
|
||||
app.use(cookieParser());
|
||||
|
||||
const indexRouter = require('./routes/index');
|
||||
const api = require('./routes/api');
|
||||
|
@ -12,6 +17,18 @@ const api = require('./routes/api');
|
|||
app.use('/', indexRouter);
|
||||
app.use('/api', api);
|
||||
|
||||
app.listen('3000', ()=> {
|
||||
console.log('Server sudah berjalan di port 3000')
|
||||
})
|
||||
app.use("/", indexRouter);
|
||||
|
||||
app.use(function (req, res, next) {
|
||||
res.header("Access-Control-Allow-Origin", "*");
|
||||
res.header(
|
||||
"Access-Control-Allow-Headers",
|
||||
"Origin, X-Requested-With, Content-Type, Accept"
|
||||
);
|
||||
next();
|
||||
});
|
||||
|
||||
app.listen("3000", () => {
|
||||
console.log("Server is running on port : 3000");
|
||||
});
|
||||
module.exports = app;
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "nekoya",
|
||||
"name": "Nekoya",
|
||||
"version": "1.0.0",
|
||||
"description": "Web application for Nekoya ~",
|
||||
"description": "Nekoya Website",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"dev": "npm i && nodemon index.js",
|
||||
|
|
108
public/css/register-error.css
Normal file
108
public/css/register-error.css
Normal file
|
@ -0,0 +1,108 @@
|
|||
body {
|
||||
font-family: 'Poppins', sans-serif;
|
||||
background-color: #1b1c1e;
|
||||
}
|
||||
|
||||
.nav-color {
|
||||
background-color: #212226;
|
||||
}
|
||||
|
||||
.nav-radius {
|
||||
border-bottom-left-radius: 20px;
|
||||
border-bottom-right-radius: 20px;
|
||||
}
|
||||
|
||||
.card {
|
||||
position: center;
|
||||
margin: auto;
|
||||
text-align: center;
|
||||
border-radius: 20px;
|
||||
background-color: #212226;
|
||||
}
|
||||
|
||||
.icon {
|
||||
position: center;
|
||||
margin: auto;
|
||||
width: 70%;
|
||||
height: 70%;
|
||||
}
|
||||
|
||||
.btn {
|
||||
background-color: darkred;
|
||||
border-color: darkred;
|
||||
border-radius: 100px;
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
.btn:hover {
|
||||
background-color: red;
|
||||
border-color: red;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 766px) {
|
||||
.card h2 {
|
||||
font-size: 7vw;
|
||||
}
|
||||
|
||||
.card h5 {
|
||||
font-size: 5vw;
|
||||
}
|
||||
|
||||
.navbar-brand {
|
||||
width: 11vw;
|
||||
height: 11vw;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@media screen and (min-width: 767px) {
|
||||
.card h2 {
|
||||
font-size: 4vw;
|
||||
}
|
||||
|
||||
.card h5 {
|
||||
font-size: 2vw;
|
||||
}
|
||||
|
||||
.navbar-brand {
|
||||
width: 8vw;
|
||||
height: 8vw;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@media screen and (min-width: 993px) {
|
||||
.card h2 {
|
||||
font-size: 3vw;
|
||||
}
|
||||
|
||||
.card h5 {
|
||||
font-size: 1.3vw;
|
||||
}
|
||||
|
||||
.navbar-brand {
|
||||
width: 6vw;
|
||||
height: 6vw;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@media screen and (min-width: 1400px) {
|
||||
.card h2 {
|
||||
font-size: 4vw;
|
||||
}
|
||||
|
||||
.card h5 {
|
||||
font-size: 2vw;
|
||||
}
|
||||
|
||||
.navbar-brand {
|
||||
width: 6vw;
|
||||
height: 6vw;
|
||||
}
|
||||
|
||||
:focus {
|
||||
outline: 0 !important;
|
||||
box-shadow: 0 0 0 0 rgba(0, 0, 0, 0) !important;
|
||||
}
|
||||
}
|
|
@ -1,5 +1,10 @@
|
|||
const express = require('express')
|
||||
const router = express.Router()
|
||||
var registerlogin = require("./registerlogin");
|
||||
|
||||
router.post("/register", registerlogin.register);
|
||||
router.post("/login", registerlogin.login);
|
||||
router.get("/verify-email", registerlogin.verifyemail);
|
||||
|
||||
router.get('/', (_req, res) => {
|
||||
res.render('pages/index');
|
||||
|
@ -49,13 +54,6 @@ router.get('/register', (_req, res) => {
|
|||
res.render('pages/register')
|
||||
})
|
||||
|
||||
router.get('/register-verification-completed', (_req, res) => {
|
||||
res.render('pages/register-verification-completed')
|
||||
})
|
||||
|
||||
router.get('/register-verification-sent', (_req, res) => {
|
||||
res.render('pages/register-verification-sent')
|
||||
})
|
||||
router.get('/about-us', (_req, res) => {
|
||||
res.render('pages/about-us')
|
||||
})
|
||||
|
|
200
routes/registerlogin.js
Normal file
200
routes/registerlogin.js
Normal file
|
@ -0,0 +1,200 @@
|
|||
const bcrypt = require("bcrypt");
|
||||
const saltRounds = 10;
|
||||
var nodemailer = require("nodemailer");
|
||||
var randtoken = require("rand-token");
|
||||
var db_connect = require("../db.js");
|
||||
|
||||
//send email
|
||||
function sendEmail(email, token) {
|
||||
var email = email;
|
||||
var token = token;
|
||||
var mail = nodemailer.createTransport({
|
||||
host: "mail.chocola.dev",
|
||||
port: 587,
|
||||
secure: false,
|
||||
auth: {
|
||||
user: "nekoya@chocola.dev",
|
||||
pass: "Nekoya123.",
|
||||
},
|
||||
tls: {
|
||||
rejectUnauthorized: false,
|
||||
},
|
||||
});
|
||||
var mailOptions = {
|
||||
from: "nekoya@chocola.dev",
|
||||
to: email,
|
||||
subject: "Account Verification - Nekoya",
|
||||
html:
|
||||
'<p>Hello!!! Please click this link <a href="http://localhost:3000/verify-email?token=' +
|
||||
token +
|
||||
'">link</a> to verify your account!!! Thanks!!!</p>',
|
||||
};
|
||||
mail.sendMail(mailOptions, function (error, info) {
|
||||
if (error) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
exports.register = async function (req, res) {
|
||||
if (
|
||||
!req.body.email ||
|
||||
!req.body.password ||
|
||||
!req.body.first_name ||
|
||||
!req.body.last_name
|
||||
) {
|
||||
// Empty Fields
|
||||
res.render("pages/register-error");
|
||||
} else {
|
||||
db_connect.query(
|
||||
"SELECT * FROM users WHERE email = ?",
|
||||
[req.body.email],
|
||||
async function (error, response, fields) {
|
||||
if (error) {
|
||||
// Error
|
||||
res.render("pages/register-error");
|
||||
} else {
|
||||
if (response.length > 0) {
|
||||
// Email Exists
|
||||
res.render("pages/register-error");
|
||||
} else {
|
||||
const encryptedPassword = await bcrypt.hash(
|
||||
req.body.password,
|
||||
saltRounds
|
||||
);
|
||||
var users = {
|
||||
first_name: req.body.first_name,
|
||||
last_name: req.body.last_name,
|
||||
email: req.body.email,
|
||||
password: encryptedPassword,
|
||||
};
|
||||
db_connect.query(
|
||||
"INSERT INTO users SET ?",
|
||||
users,
|
||||
function (error, response, fields) {
|
||||
if (error) {
|
||||
console.log("An error has occured...", error);
|
||||
// Error
|
||||
res.render("pages/register-error");
|
||||
} else {
|
||||
var email = req.body.email;
|
||||
db_connect.query(
|
||||
'SELECT * FROM users WHERE email ="' + email + '"',
|
||||
function (err, result) {
|
||||
if (err) throw err;
|
||||
console.log(result[0]);
|
||||
if (result.length > 0) {
|
||||
var token = randtoken.generate(20);
|
||||
if (result[0].verify == 0) {
|
||||
var sent = sendEmail(email, token);
|
||||
if (sent != "0") {
|
||||
var data = {
|
||||
token: token,
|
||||
};
|
||||
db_connect.query(
|
||||
'UPDATE users SET ? WHERE email ="' + email + '"',
|
||||
data,
|
||||
function (err, result) {
|
||||
if (err) throw err;
|
||||
}
|
||||
);
|
||||
// Success and has been sent
|
||||
res.render("pages/register-verification-sent");
|
||||
} else {
|
||||
// Error
|
||||
res.render("pages/register-error");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
console.log("2");
|
||||
// Email isnt registered
|
||||
res.render("pages/register-error");
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
exports.login = async function (req, res) {
|
||||
var email = req.body.email;
|
||||
var password = req.body.password;
|
||||
db_connect.query(
|
||||
"SELECT * FROM users WHERE email = ?",
|
||||
[email],
|
||||
async function (error, response, fields) {
|
||||
const passCheck = await bcrypt.compare(password, response[0].password);
|
||||
if (error) {
|
||||
res.send({
|
||||
code: 400,
|
||||
failed: "An error has occured...",
|
||||
});
|
||||
} else {
|
||||
if (response.length > 0) {
|
||||
if (passCheck) {
|
||||
if (response[0].verify == 0) {
|
||||
res.send({
|
||||
code: 204,
|
||||
success: "Sorry You havent verified your email",
|
||||
});
|
||||
} else {
|
||||
res.send({
|
||||
code: 200,
|
||||
success: "Login Successful!!",
|
||||
});
|
||||
}
|
||||
} else {
|
||||
res.send({
|
||||
code: 204,
|
||||
success: "Sorry Email and password does not match",
|
||||
});
|
||||
}
|
||||
} else {
|
||||
res.send({
|
||||
code: 204,
|
||||
success: "Sorry Email does not exits",
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
/* verification email link */
|
||||
exports.verifyemail = function (req, res, next) {
|
||||
db_connect.query(
|
||||
'SELECT * FROM users WHERE token ="' + req.query.token + '"',
|
||||
function (err, result) {
|
||||
if (err) throw err;
|
||||
console.log(result[0].verify);
|
||||
if (result[0].verify == 0) {
|
||||
if (result.length > 0) {
|
||||
var data = {
|
||||
verify: 1,
|
||||
};
|
||||
db_connect.query(
|
||||
'UPDATE users SET ? WHERE email ="' + result[0].email + '"',
|
||||
data,
|
||||
function (err, result) {
|
||||
if (err) throw err;
|
||||
}
|
||||
);
|
||||
res.render("pages/register-verification-completed");
|
||||
} else {
|
||||
console.log("2");
|
||||
res.render("pages/register-verification-completed");
|
||||
}
|
||||
} else {
|
||||
res.render("pages/register-verification-completed");
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
|
@ -41,6 +41,8 @@
|
|||
<link href="/css/register-verification-completed.css" rel="stylesheet">
|
||||
<% } else if(state == "register-verification-sent") { %>
|
||||
<link href="/css/register-verification-sent.css" rel="stylesheet">
|
||||
<% } else if(state == "register-error") { %>
|
||||
<link href="/css/register-error.css" rel="stylesheet">
|
||||
<% } else if(state == "forgot-password") { %>
|
||||
<link href="/css/forgot-password.css" rel="stylesheet">
|
||||
<% } else if(state == "otp") { %>
|
||||
|
|
|
@ -13,22 +13,22 @@
|
|||
<div class="col">
|
||||
<div class="card text-white col-md-8 col-lg-6 col-xl-5">
|
||||
<h1 class="card-header text-white">Login</h1>
|
||||
<lottie-player autoplay background="transparent" class="icon" loop speed="1"
|
||||
<lottie-player style="display: -webkit-box;-webkit-box-pack: center;" autoplay background="transparent" class="icon" loop speed="1"
|
||||
src="https://assets3.lottiefiles.com/packages/lf20_myor1trh.json"></lottie-player>
|
||||
<div class="card-body">
|
||||
<form class="px-4 py-3">
|
||||
<form class="px-4 py-3" action="login" method="POST">
|
||||
<div class="form-group" style="text-align: left;">
|
||||
<a data-feather="mail" href="" style="font-size: 40px;"></a>
|
||||
<label for="exampleDropdownFormEmail1">Email</label>
|
||||
<input class="form-control input-sm text-center" id="exampleDropdownFormEmail1"
|
||||
placeholder="Email address" type="email">
|
||||
<label for="email">Email</label>
|
||||
<input class="form-control input-sm text-center" id="email" name="email"
|
||||
placeholder="Email Address" type="email">
|
||||
</div>
|
||||
<div class="form-group" style="text-align: left;">
|
||||
<a data-feather="lock" href="" style="font-size: 40px;"></a>
|
||||
<label for="exampleDropdownFormPassword1">Password</label>
|
||||
<label for="password">Password</label>
|
||||
<div class="input-group">
|
||||
<input class="form-control input-sm text-center" id="exampleDropdownFormPassword1"
|
||||
name="password" placeholder="Password" type="password">
|
||||
<input class="form-control input-sm text-center" id="password" name="password"
|
||||
placeholder="Password" type="password">
|
||||
<div class="input-group-append">
|
||||
<span class="input-group-text">
|
||||
<i class="fa fa-eye" onclick="revealhidePassword()"></i>
|
||||
|
@ -39,7 +39,7 @@
|
|||
<div class="options-01 hoverlogin-1" style="word-break: keep-all;">
|
||||
<label class="remember-me text-left"><input name="" type="checkbox">Remember
|
||||
me</label>
|
||||
<a href="forgot-password" style="margin-left: 15%; font-size: 10pt;">Forgot
|
||||
<a href="forgot-password.html" style="margin-left: 15%; font-size: 10pt;">Forgot
|
||||
your
|
||||
password?</a>
|
||||
</div>
|
||||
|
@ -48,12 +48,12 @@
|
|||
<div class="links">
|
||||
<div class="google">
|
||||
<i><a href=""></a><img class="google-icon-svg lazyload"
|
||||
src="./img/google.webp"
|
||||
src="./assets/google.webp"
|
||||
style="height: 30px; width: 30px; margin: 0 30px; padding-top: -3px"/><span></span></i>
|
||||
</div>
|
||||
<div class="facebook">
|
||||
<i><a href=""></a><img class="facebook-icon-svg lazyload"
|
||||
src="./img/facebook.webp"
|
||||
src="./assets/facebook.webp"
|
||||
style="height: 30px; width: 30px; margin: 0 30px; padding-top: -3px"><span></span></i>
|
||||
</div>
|
||||
</div>
|
||||
|
|
33
views/pages/register-error.ejs
Normal file
33
views/pages/register-error.ejs
Normal file
|
@ -0,0 +1,33 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
|
||||
<%- include('../layouts/header.ejs', {title: 'Register', state: 'register-error'}); %>
|
||||
|
||||
<body>
|
||||
<%- include('../layouts/navbar.ejs', {types: 'v2', title: 'Register'}); %>
|
||||
<br>
|
||||
|
||||
|
||||
<div data-aos="fade-in" data-aos-delay="500" class="container">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="card col-md-6 col-lg-6 col-xl-8">
|
||||
<div class="card-header" style="color: cyan;">
|
||||
<h2>ERROR</h2>
|
||||
</div>
|
||||
<lottie-player style="display: -webkit-box;-webkit-box-pack: center;" autoplay background="transparent" class="icon" loop speed="1"
|
||||
src="https://assets5.lottiefiles.com/temp/lf20_QYm9j9.json"></lottie-player>
|
||||
<div class="card-body">
|
||||
<h5 class="card-text" style="color: cyan;">An error has occured... Make sure to check if you have empty fields, or if your email has been registered before. Click the button below to get back to the register page.</h5>
|
||||
<br style="display: block;content: ' ';margin: 1vw 0;line-height: 1vw;">
|
||||
<a class="btn btn-primary" href="register">Register</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%- include('../layouts/footer.ejs', {state: 'register-error'}); %>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -22,7 +22,7 @@
|
|||
Using the button
|
||||
below..</h6>
|
||||
<br style="display: block;content: ' ';margin: 1vw 0;line-height: 1vw;">
|
||||
<a class="btn btn-primary" href="login.html">Sign in</a>
|
||||
<a class="btn btn-primary" href="login">Sign in</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
<lottie-player style="display: -webkit-box;-webkit-box-pack: center;" autoplay background="transparent" class="icon" loop speed="1"
|
||||
src="https://assets10.lottiefiles.com/datafiles/JAmX1SNojoncImC/data.json"></lottie-player>
|
||||
<div class="card-body">
|
||||
<form class="px-4 py-3" action="api/register" method="POST">
|
||||
<form class="px-4 py-3" action="register" method="POST">
|
||||
<div class="form-group">
|
||||
<input class="form-control input-sm text-center" id="first_name" name="first_name"
|
||||
placeholder="First Name" type="text">
|
||||
|
@ -43,7 +43,7 @@
|
|||
<button class="btn btn-register btn-primary" type="submit" >Register</button>
|
||||
<br style="display: block;content: ' '; margin: 1vw 0; line-height: 1vw;">
|
||||
<div class="hoversignin-1 text-center">
|
||||
<a href="login.html">Already have an account ?? Click here to Sign In !!</a>
|
||||
<a href="login">Already have an account ?? Click here to Sign In !!</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
|
Loading…
Add table
Reference in a new issue