Jeremy DUCOURTHIAL 3 years ago
commit b05a087af6

@ -6,6 +6,7 @@ npm install --save mysql
npm install --save express npm install --save express
npm install -g nodemon npm install -g nodemon
npm install --save-dev nodemon npm install --save-dev nodemon
npm install crypto-js
npm install --save axios npm install --save axios

@ -3,6 +3,22 @@ const express = require('express');
const cors=require("cors"); const cors=require("cors");
const bodyparser = require('body-parser'); const bodyparser = require('body-parser');
const nodemailer = require('nodemailer');
const CryptoJS = require('crypto-js');
// Créer un transporteur de mail
let transporter = nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 587,
// secure: true, // utiliser SSL
auth: {
user: 'stageodinnonoffi@gmail.com',
pass: 'pjjlofjkpnfpwkiz'
}
});
const db = mysql.createConnection({ const db = mysql.createConnection({
host: 'lfbn-cle-1-568-58.w92-157.abo.wanadoo.fr', host: 'lfbn-cle-1-568-58.w92-157.abo.wanadoo.fr',
user: 'crmuser', user: 'crmuser',
@ -257,13 +273,37 @@ app.post('/User/Add', (req, res) => {
let form = req.body; let form = req.body;
console.log(form); console.log(form);
let rand_pass = "";
const carac="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&*#-+@!$%?/()[]{}0123456789&*#-+@!$%?/()[]{}";
for(var i=0;i<10;i++)
{
rand_pass += carac[Math.floor(Math.random()*carac.length)];
}
const sql = `INSERT INTO users(lastname, firstname, idrole, login, password, phone, mail) VALUES ('${form.lastname}', '${form.firstname}', '${form.idrole}', '${form.login}', '${form.password}', '${form.phone}', '${form.mail}')`; const sql = `INSERT INTO users(lastname, firstname, idrole, login, password, phone, mail) VALUES ('${form.lastname}', '${form.firstname}', '${form.idrole}', '${form.login}', '${CryptoJS.SHA256(rand_pass).toString(CryptoJS.enc.Hex)}', '${form.phone}', '${form.mail}')`;
db.query(sql , (err, result) => { db.query(sql , (err, result) => {
if (err) throw err; if (err) throw err;
console.log(result); console.log(result);
res.send('Post added...' + result.insertId); res.send('Post added...' + result.insertId);
}); });
let mailOptions = {
from: '"JTT CRM" <JTT@CRM.fr>',
to: form.mail,
subject: "Connexion a JTTCRM",
text: "Voici ton mot de passe : " + rand_pass,
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.log(error);
} else {
console.log('Email sent with mdp: ' + info.response);
}
});
}); });
app.put('/User/Update/:id', (req, res) => { app.put('/User/Update/:id', (req, res) => {
@ -402,4 +442,27 @@ app.get('/Event/:iduser', (req, res) => {
console.log(result); console.log(result);
res.send(result); res.send(result);
}); });
});
app.post('/Mail/Avertir', (req, res) => {
// Définir les options du mail
let form = req.body;
console.log(form)
let mailOptions = {
from: '"JTT CRM" <JTT@CRM.fr>',
to: 'Jeremy.DUCOURTHIALE@etu.uca.fr',
subject: form.objet,
text: form.raison
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.log(error);
res.send(false)
} else {
console.log('Email sent: ' + info.response);
res.send(true)
}
});
}); });

@ -18,6 +18,7 @@
"corps": "^0.1.0", "corps": "^0.1.0",
"cors": "^2.8.5", "cors": "^2.8.5",
"crypto-js": "^4.1.1", "crypto-js": "^4.1.1",
"crypto-js": "^4.1.1",
"express": "^4.18.2", "express": "^4.18.2",
"fullcalendar": "^5.11.3", "fullcalendar": "^5.11.3",
"googleapis": "^105.0.0", "googleapis": "^105.0.0",
@ -1408,6 +1409,14 @@
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
"integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
}, },
"node_modules/cryptojs": {
"version": "2.5.3",
"resolved": "https://registry.npmjs.org/cryptojs/-/cryptojs-2.5.3.tgz",
"integrity": "sha512-+rdPl1UCxE8s3R94NNn+zMKOiI4MJ7dyh3X0c5uBL3btDr4zQ6acd7f9mY7Wb5MrccZEi2Rrha3OEtLcc5XXog==",
"engines": {
"node": "*"
}
},
"node_modules/csstype": { "node_modules/csstype": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
@ -3987,6 +3996,11 @@
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
"integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
}, },
"cryptojs": {
"version": "2.5.3",
"resolved": "https://registry.npmjs.org/cryptojs/-/cryptojs-2.5.3.tgz",
"integrity": "sha512-+rdPl1UCxE8s3R94NNn+zMKOiI4MJ7dyh3X0c5uBL3btDr4zQ6acd7f9mY7Wb5MrccZEi2Rrha3OEtLcc5XXog=="
},
"csstype": { "csstype": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",

@ -13,6 +13,7 @@ import Calendrier from './pages/Calendrier';
import Repertoire from './pages/Repertoire'; import Repertoire from './pages/Repertoire';
import Parametres from './pages/Parametres'; import Parametres from './pages/Parametres';
import Chargement from './pages/Chargement'; import Chargement from './pages/Chargement';
import MailPourAdmin from './pages/MailPourAdmin';
import AddContact from './components/Contact/AddContact' import AddContact from './components/Contact/AddContact'
import { Component } from 'fullcalendar'; import { Component } from 'fullcalendar';
import RestartPassword from './pages/RestartPassword'; import RestartPassword from './pages/RestartPassword';
@ -41,6 +42,7 @@ const App = () => {
<Route path="/Repertoire" element={<Repertoire />} /> <Route path="/Repertoire" element={<Repertoire />} />
<Route path="/Parametres" element={<Parametres />} /> <Route path="/Parametres" element={<Parametres />} />
<Route path="/Chargement" element={<Chargement />} /> <Route path="/Chargement" element={<Chargement />} />
<Route path="/MailPourAdmin" element={<MailPourAdmin />} />
<Route path="/Repertoire/add" element={<AddContact />} /> <Route path="/Repertoire/add" element={<AddContact />} />
</Routes> </Routes>
</BrowserRouter> </BrowserRouter>

@ -44,7 +44,6 @@ function Admin_create() {
} }
else { else {
setLoginError(false); setLoginError(false);
values.password = CryptoJS.SHA256(values.password).toString(CryptoJS.enc.Hex);
api.post('/User/Add', values).then (function(response) { api.post('/User/Add', values).then (function(response) {
console.log(response.data); console.log(response.data);
@ -71,7 +70,6 @@ function Admin_create() {
<p>Email :</p> <p>Email :</p>
<p>Rôle :</p> <p>Rôle :</p>
<p>Identifiant :</p> <p>Identifiant :</p>
<p>Mot de passe :</p>
</div> </div>
</tr> </tr>
<tr className="two-2"> <tr className="two-2">
@ -90,7 +88,6 @@ function Admin_create() {
))} ))}
</Select> </Select>
<input id="identifiant" name='login' className="texte_zone" type="text" placeholder="Identifiant..." required/> <input id="identifiant" name='login' className="texte_zone" type="text" placeholder="Identifiant..." required/>
<input id="password" name='password' className="texte_zone" type="password" placeholder="Mot de passe..." required/>
</tr> </tr>
</table> </table>
<p>{loginError === true?"L'identifiant existe déja":''}</p> <p>{loginError === true?"L'identifiant existe déja":''}</p>

@ -0,0 +1,99 @@
import React, {useState} from 'react';
import NavigationDashboard from '../components/NavigationDashboard';
import axios from 'axios';
import Session from 'react-session-api';
import { useNavigate } from 'react-router-dom';
const api = axios.create({
baseURL: 'http://localhost:8080'
})
const MailPourAdmin = () => {
const [mailError, setMailError] = useState(false);
const [objetError, setObjetError] = useState(false);
const [descriptionError, setDescriptionError] = useState(false);
const [theme, setTheme] = useState("light");
const navigate = useNavigate();
if (localStorage.getItem('theme') && localStorage.getItem("theme") !== '' && localStorage.getItem("theme") !== theme) {
setTheme(localStorage.getItem("theme"))
}
function sendMail(e) {
e.preventDefault();
const formData = new FormData(e.currentTarget);
const values = Object.fromEntries(formData.entries());
console.log(values);
if (values.objet === '') {
setObjetError(true)
} else {
setObjetError(false)
}
if (values.raison === '') {
setDescriptionError(true)
} else {
setDescriptionError(false)
}
if (values.objet === '' || values.raison === '') {
return
}
values.objet = values.objet + "[user id : " + Session.get("idUser") + "]"
api.post('/Mail/Avertir',values).then (function(response) {
if (response.data) {
navigate('/dashboard')
}
else {
setMailError(true)
// e.reset();
}
});
}
return (
<body className={theme}>
<link rel="stylesheet" href="https://unicons.iconscout.com/release/v4.0.0/css/line.css"></link>
<div className="page_mailAdmin">
<div className="haut_de_page">
<h2 className="titre">Avertir un administrateur</h2>
<div className="rechLogo">
<img className="logo" srcSet="./LogoApp.svg" />
</div>
</div>
<div className="bas_de_page">
<NavigationDashboard />
<form className="form" onSubmit={sendMail}>
<div className="Mail">
<div className="object">
<p className="name">Objet</p>
<input name="objet" type="text" placeholder="Objet de l'alerte" />
</div>
<div className="value">
<p className="name">Raison</p>
<textarea name="raison" placeholder="Raison de l'alerte" rows="10" cols="180" />
</div>
<p>{mailError === true?"Le mail n'a pas pu être envoyé":''}</p>
<p>{objetError === true?"L'objet est obligatoire":''}</p>
<p>{descriptionError === true?"La description est obligatoire":''}</p>
<div className="submit">
<button className="button" type="submit">
Envoyer
</button>
</div>
</div>
</form>
</div>
</div>
</body>
);
};
export default MailPourAdmin;

@ -37,7 +37,9 @@ const Parametre = () => {
<div className="one_milieu"> <div className="one_milieu">
<p className="text_one_milieu">Signaler un problème</p> <p className="text_one_milieu">Signaler un problème</p>
<div className='bouton_submit'> <div className='bouton_submit'>
<button className="bouton_signalerPB" type="submit">Signaler</button> <NavLink to="/MailPourAdmin">
<button className="bouton_signalerPB" >Signaler</button>
</NavLink>
</div> </div>
</div> </div>
<div className="one_bas"> <div className="one_bas">

@ -0,0 +1,201 @@
body {
.page_mailAdmin {
display: flex;
flex-direction: column;
justify-content: space-evenly;
width: auto;
height: 100vh;
.haut_de_page {
display: flex;
flex-direction: row;
justify-content: space-between;
padding: 50px;
width: auto;
height: 10%;
align-items: center;
margin: 10px 10px 5px 10px;
background: rgba(255, 255, 255, 0.3);
border-radius: 15px;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
backdrop-filter: blur(3px);
-webkit-backdrop-filter: blur(15px);
.titre {
font-size: 40px;
}
.rechLogo {
display: flex;
flex-direction: row;
justify-content: space-between;
.logo {
display: flex;
width: 100px;
height: 100px;
}
}
}
.bas_de_page {
display: flex;
flex-direction: row;
justify-content: space-between;
width: auto;
height: 86%;
.nav_bar_verticale {
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
width: 5%;
margin: 5px 5px 10px 10px;
background: rgba(255, 255, 255, 0.3);
border-radius: 15px;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
backdrop-filter: blur(3px);
-webkit-backdrop-filter: blur(15px);
.parti_one {
display: flex;
flex-direction: row;
justify-content: space-around;
align-items: center;
width: 100%;
height: 18%;
}
.parti_two {
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
width: 100%;
height: 35%;
}
.parti_three {
display: flex;
flex-direction: row;
justify-content: space-around;
align-items: center;
margin-top: 15px;
width: 100%;
height: 18%;
}
.parti_four {
display: flex;
flex-direction: row;
justify-content: space-around;
align-items: center;
width: 100%;
height: 18%;
}
.button {
display: flex;
object-fit: cover;
background-color: transparent;
border: none;
cursor: pointer;
.logo_nav_bar{
display: flex;
margin: 10px;
height: 50px;
width: 50px;
}
}
}
.Mail {
display: flex;
flex-direction: column;
justify-content: space-evenly;
width: 94.3%;
height: auto;
margin: 5px 10px 10px 5px;
background: rgba(255, 255, 255, 0.3);
border-radius: 15px;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
backdrop-filter: blur(3px);
-webkit-backdrop-filter: blur(15px);
.object {
display: flex;
flex-direction: column;
justify-content: space-evenly;
margin: 13px;
width: auto;
height: 40%;
background: rgba(255, 255, 255, 0.1);
border-radius: 15px;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
backdrop-filter: blur(3px);
-webkit-backdrop-filter: blur(15px);
.input {
margin: 13px;
width: 65%;
}
}
.value {
display: flex;
flex-direction: column;
justify-content: space-evenly;
margin-left: 13px;
margin-right: 13px;
width: auto;
height: 40%;
background: rgba(255, 255, 255, 0.1);
border-radius: 15px;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
backdrop-filter: blur(3px);
-webkit-backdrop-filter: blur(15px);
.textArea {
resize: none;
margin: 13px;
}
}
.submit {
display: flex;
flex-direction: column;
justify-content: space-evenly;
margin: 13px;
width: auto;
height: 15%;
background: rgba(255, 255, 255, 0.1);
border-radius: 15px;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
backdrop-filter: blur(3px);
-webkit-backdrop-filter: blur(15px);
.button {
width: 20%;
margin: 13px;
}
}
}
}
}
}

@ -251,7 +251,7 @@ body {
.center { .center {
position: absolute; position: absolute;
top: 84%; top: 84%;
right: 2%; right: 1.75%;
transform: translate(-50%, -50%); transform: translate(-50%, -50%);
input[type="checkbox"] { input[type="checkbox"] {

@ -8,4 +8,5 @@
@import "./components/parametre"; @import "./components/parametre";
@import "./components/repertoire"; @import "./components/repertoire";
@import "./components/chargement"; @import "./components/chargement";
@import "./components/contact/addContact"; @import "./components/contact/addContact";;
@import "./components/mailPourAdmin";
Loading…
Cancel
Save