ajout backend UserAdmin
This commit is contained in:
parent
4e35764e4c
commit
68917bbcb0
@ -9,7 +9,6 @@ import io.vertx.ext.web.handler.CorsHandler;
|
|||||||
import io.vertx.ext.auth.jwt.JWTAuth;
|
import io.vertx.ext.auth.jwt.JWTAuth;
|
||||||
import io.vertx.ext.web.handler.JWTAuthHandler;
|
import io.vertx.ext.web.handler.JWTAuthHandler;
|
||||||
|
|
||||||
|
|
||||||
public class MainVerticle extends AbstractVerticle {
|
public class MainVerticle extends AbstractVerticle {
|
||||||
private DatabaseService databaseService;
|
private DatabaseService databaseService;
|
||||||
private Router router;
|
private Router router;
|
||||||
@ -17,32 +16,32 @@ public class MainVerticle extends AbstractVerticle {
|
|||||||
@Override
|
@Override
|
||||||
public void start(Promise<Void> startPromise) throws Exception {
|
public void start(Promise<Void> startPromise) throws Exception {
|
||||||
databaseService = new DatabaseService(vertx);
|
databaseService = new DatabaseService(vertx);
|
||||||
|
|
||||||
// Initialisation du fournisseur JWT
|
// Initialisation du fournisseur JWT
|
||||||
JWTAuth jwtAuth = JwtAuthProvider.createJwtAuth(vertx);
|
JWTAuth jwtAuth = JwtAuthProvider.createJwtAuth(vertx);
|
||||||
|
|
||||||
|
|
||||||
// Initialisation du routeur
|
// Initialisation du routeur
|
||||||
router = Router.router(vertx);
|
router = Router.router(vertx);
|
||||||
router.route().handler(BodyHandler.create());
|
router.route().handler(BodyHandler.create());
|
||||||
router.route().handler(CorsHandler.create()
|
router.route().handler(CorsHandler.create()
|
||||||
.addOrigin("*")
|
.addOrigin("*")
|
||||||
.allowedMethod(HttpMethod.GET)
|
.allowedMethod(HttpMethod.GET)
|
||||||
.allowedMethod(HttpMethod.POST)
|
.allowedMethod(HttpMethod.POST)
|
||||||
.allowedHeader("Content-Type")
|
.allowedHeader("Content-Type")
|
||||||
.allowedHeader("Authorization"));
|
.allowedHeader("Authorization"));
|
||||||
|
|
||||||
// Protéger toutes les routes commençant par "/api/"
|
// Protéger toutes les routes commençant par "/api/"
|
||||||
router.route("/api/*").handler(JWTAuthHandler.create(jwtAuth));
|
router.route("/api/*").handler(JWTAuthHandler.create(jwtAuth));
|
||||||
|
|
||||||
|
|
||||||
// Initialisation des handlers de requêtes
|
// Initialisation des handlers de requêtes
|
||||||
QueryObjects queryObjects = new QueryObjects(databaseService);
|
QueryObjects queryObjects = new QueryObjects(databaseService);
|
||||||
QueryWeatherData queryWeather = new QueryWeatherData(databaseService);
|
QueryWeatherData queryWeather = new QueryWeatherData(databaseService);
|
||||||
SetObjects setObjects = new SetObjects(databaseService);
|
SetObjects setObjects = new SetObjects(databaseService);
|
||||||
SetWeatherData setWeatherData = new SetWeatherData(databaseService);
|
SetWeatherData setWeatherData = new SetWeatherData(databaseService);
|
||||||
AuthHandler authHandler = new AuthHandler(databaseService, jwtAuth);
|
AuthHandler authHandler = new AuthHandler(databaseService, jwtAuth);
|
||||||
|
QueryUsers queryUsers = new QueryUsers(databaseService);
|
||||||
|
SetUser setUser = new SetUser(databaseService);
|
||||||
|
|
||||||
// Déclaration des routes
|
// Déclaration des routes
|
||||||
router.get("/objets").handler(queryObjects::getObjects);
|
router.get("/objets").handler(queryObjects::getObjects);
|
||||||
router.get("/objet").handler(queryObjects::getParticularObject);
|
router.get("/objet").handler(queryObjects::getParticularObject);
|
||||||
@ -53,22 +52,23 @@ public class MainVerticle extends AbstractVerticle {
|
|||||||
router.get("/getRange").handler(queryWeather::getRangeData);
|
router.get("/getRange").handler(queryWeather::getRangeData);
|
||||||
router.post("/modifRangeData").handler(setWeatherData::setRangeData);
|
router.post("/modifRangeData").handler(setWeatherData::setRangeData);
|
||||||
router.post("/deleteObject").handler(setObjects::deleteObject);
|
router.post("/deleteObject").handler(setObjects::deleteObject);
|
||||||
|
router.get("/users").handler(queryUsers::getUsers);
|
||||||
|
router.post("/setUserPoints").handler(setUser::setUserPoints);
|
||||||
// Routes d'authentification
|
// Routes d'authentification
|
||||||
router.post("/signup").handler(authHandler::handleSignup);
|
router.post("/signup").handler(authHandler::handleSignup);
|
||||||
router.post("/login").handler(authHandler::handleLogin);
|
router.post("/login").handler(authHandler::handleLogin);
|
||||||
|
|
||||||
// Création du serveur HTTP
|
// Création du serveur HTTP
|
||||||
vertx.createHttpServer()
|
vertx.createHttpServer()
|
||||||
.requestHandler(router)
|
.requestHandler(router)
|
||||||
.listen(8888)
|
.listen(8888)
|
||||||
.onSuccess(server -> {
|
.onSuccess(server -> {
|
||||||
System.out.println("HTTP server started on port " + server.actualPort());
|
System.out.println("HTTP server started on port " + server.actualPort());
|
||||||
startPromise.complete();
|
startPromise.complete();
|
||||||
})
|
})
|
||||||
.onFailure(throwable -> {
|
.onFailure(throwable -> {
|
||||||
throwable.printStackTrace();
|
throwable.printStackTrace();
|
||||||
startPromise.fail(throwable);
|
startPromise.fail(throwable);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
51
Back-end/src/main/java/com/example/starter/QueryUsers.java
Normal file
51
Back-end/src/main/java/com/example/starter/QueryUsers.java
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
package com.example.starter;
|
||||||
|
|
||||||
|
import io.vertx.core.json.JsonArray;
|
||||||
|
import io.vertx.core.json.JsonObject;
|
||||||
|
import io.vertx.ext.web.RoutingContext;
|
||||||
|
import io.vertx.sqlclient.Row;
|
||||||
|
|
||||||
|
public class QueryUsers {
|
||||||
|
private DatabaseService databaseService;
|
||||||
|
|
||||||
|
public QueryUsers(DatabaseService dtbS) {
|
||||||
|
this.databaseService = dtbS;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void getUsers(RoutingContext context) {
|
||||||
|
databaseService.pool
|
||||||
|
.query("SELECT * FROM users;")
|
||||||
|
.execute()
|
||||||
|
.onFailure(e -> {
|
||||||
|
System.err.println("Erreur de récupération de la BDD :" + e.getMessage());
|
||||||
|
context.response()
|
||||||
|
.setStatusCode(500)
|
||||||
|
.end(new JsonObject().put("error", "Erreur de récupération de la BDD").encode());
|
||||||
|
})
|
||||||
|
.onSuccess(rows -> {
|
||||||
|
JsonArray users = new JsonArray();
|
||||||
|
for (Row row : rows) {
|
||||||
|
int points=row.getInteger("points");
|
||||||
|
JsonObject user = new JsonObject()
|
||||||
|
.put("id", row.getInteger("id"))
|
||||||
|
.put("name", row.getString("name"))
|
||||||
|
.put("surname", row.getString("surname"))
|
||||||
|
.put("email", row.getString("email"))
|
||||||
|
.put("gender", row.getString("gender"))
|
||||||
|
.put("points",points);
|
||||||
|
if(points<=30){
|
||||||
|
user.put("role", "user");
|
||||||
|
}else if(points<=60){
|
||||||
|
user.put("role", "complexe");
|
||||||
|
}else if(points>=100){
|
||||||
|
user.put("role", "admin");
|
||||||
|
}
|
||||||
|
users.add(user);
|
||||||
|
}
|
||||||
|
context.response()
|
||||||
|
.putHeader("content-type", "application/json; charset=UTF-8")
|
||||||
|
.end(users.encode());
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
48
Back-end/src/main/java/com/example/starter/SetUser.java
Normal file
48
Back-end/src/main/java/com/example/starter/SetUser.java
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
package com.example.starter;
|
||||||
|
|
||||||
|
import io.vertx.core.json.JsonObject;
|
||||||
|
import io.vertx.ext.web.RoutingContext;
|
||||||
|
import io.vertx.sqlclient.Tuple;
|
||||||
|
|
||||||
|
public class SetUser {
|
||||||
|
private DatabaseService databaseService;
|
||||||
|
|
||||||
|
public SetUser(DatabaseService ddbs) {
|
||||||
|
this.databaseService = ddbs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserPoints(RoutingContext context) {
|
||||||
|
JsonObject body = context.body().asJsonObject();
|
||||||
|
if (body == null) {
|
||||||
|
context.response()
|
||||||
|
.setStatusCode(400)
|
||||||
|
.end(new JsonObject().put("error", "Corps de la requête manquant").encode());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Integer id = body.getInteger("id");
|
||||||
|
Integer points = body.getInteger("points");
|
||||||
|
|
||||||
|
databaseService.pool
|
||||||
|
.preparedQuery(
|
||||||
|
"UPDATE users SET points=? WHERE id=?")
|
||||||
|
.execute(Tuple.of(points,id))
|
||||||
|
.onFailure(e -> {
|
||||||
|
System.err.println("Erreur de récupération de la BDD :" + e.getMessage());
|
||||||
|
context.response()
|
||||||
|
.setStatusCode(500)
|
||||||
|
.end(new JsonObject().put("Erreur", "Erreur de récupération de la BDD").encode());
|
||||||
|
})
|
||||||
|
.onSuccess(rows -> {
|
||||||
|
if (rows.rowCount() == 0) {
|
||||||
|
context.response()
|
||||||
|
.setStatusCode(404)
|
||||||
|
.end(new JsonObject().put("error", "Utilisateur non trouvé").encode());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
context.response()
|
||||||
|
.putHeader("content-type", "application/json: charset=UTF-8")
|
||||||
|
.end(new JsonObject().put("success", "Les points de l'utilisateur ont bien été mis à jour").encode());
|
||||||
|
return;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,5 +1,8 @@
|
|||||||
import React, { useState } from "react";
|
import React, { useState,useEffect } from "react";
|
||||||
import Sidebar from "./sidebar.jsx";
|
import Sidebar from "./sidebar.jsx";
|
||||||
|
import { API_BASE_URL } from "../../config.js";
|
||||||
|
import axios from "axios";
|
||||||
|
|
||||||
|
|
||||||
const dashboardStyles = {
|
const dashboardStyles = {
|
||||||
mainContent: {
|
mainContent: {
|
||||||
@ -44,35 +47,7 @@ const dashboardStyles = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
function Dashboard() {
|
function Dashboard() {
|
||||||
// États simulés (dans une vraie application, ils viendraient d'une API ou d'un store global)
|
const [users, setUsers] = useState([]);
|
||||||
const [users, setUsers] = useState([
|
|
||||||
{
|
|
||||||
id: 1,
|
|
||||||
username: "Alice",
|
|
||||||
email: "alice@example.com",
|
|
||||||
accessLevel: "Admin",
|
|
||||||
},
|
|
||||||
{ id: 2, username: "Bob", email: "bob@example.com", accessLevel: "User" },
|
|
||||||
{
|
|
||||||
id: 3,
|
|
||||||
username: "Charlie",
|
|
||||||
email: "charlie@example.com",
|
|
||||||
accessLevel: "Guest",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 4,
|
|
||||||
username: "David",
|
|
||||||
email: "david@example.com",
|
|
||||||
accessLevel: "User",
|
|
||||||
},
|
|
||||||
{ id: 5, username: "Eva", email: "eva@example.com", accessLevel: "User" },
|
|
||||||
{
|
|
||||||
id: 6,
|
|
||||||
username: "Frank",
|
|
||||||
email: "frank@example.com",
|
|
||||||
accessLevel: "Admin",
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
const [logs, setLogs] = useState([
|
const [logs, setLogs] = useState([
|
||||||
{
|
{
|
||||||
id: 1,
|
id: 1,
|
||||||
@ -87,7 +62,11 @@ function Dashboard() {
|
|||||||
timestamp: new Date().toLocaleString(),
|
timestamp: new Date().toLocaleString(),
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
useEffect(() => {
|
||||||
|
axios.get(`${API_BASE_URL}/users`).then((response) => {
|
||||||
|
setUsers(response.data);
|
||||||
|
});
|
||||||
|
}, []);
|
||||||
return (
|
return (
|
||||||
<div style={{ display: "flex", minHeight: "100vh" }}>
|
<div style={{ display: "flex", minHeight: "100vh" }}>
|
||||||
<Sidebar />
|
<Sidebar />
|
||||||
@ -118,15 +97,15 @@ function Dashboard() {
|
|||||||
<tr>
|
<tr>
|
||||||
<th style={dashboardStyles.tableHeader}>Username</th>
|
<th style={dashboardStyles.tableHeader}>Username</th>
|
||||||
<th style={dashboardStyles.tableHeader}>Email</th>
|
<th style={dashboardStyles.tableHeader}>Email</th>
|
||||||
<th style={dashboardStyles.tableHeader}>Access Level</th>
|
<th style={dashboardStyles.tableHeader}>Niveau d'accès</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{users.slice(0, 5).map((user) => (
|
{users.slice(0, 5).map((user) => (
|
||||||
<tr key={user.id}>
|
<tr key={user.id}>
|
||||||
<td style={dashboardStyles.tableCell}>{user.username}</td>
|
<td style={dashboardStyles.tableCell}>{user.name}</td>
|
||||||
<td style={dashboardStyles.tableCell}>{user.email}</td>
|
<td style={dashboardStyles.tableCell}>{user.email}</td>
|
||||||
<td style={dashboardStyles.tableCell}>{user.accessLevel}</td>
|
<td style={dashboardStyles.tableCell}>{user.role}</td>
|
||||||
</tr>
|
</tr>
|
||||||
))}
|
))}
|
||||||
{users.length === 0 && (
|
{users.length === 0 && (
|
||||||
|
|||||||
@ -1,5 +1,7 @@
|
|||||||
import React, { useState } from "react";
|
import React, { useState,useEffect} from "react";
|
||||||
import Sidebar from "./sidebar.jsx";
|
import Sidebar from "./sidebar.jsx";
|
||||||
|
import { API_BASE_URL } from "../../config.js";
|
||||||
|
import axios from "axios";
|
||||||
|
|
||||||
const styles = {
|
const styles = {
|
||||||
mainContent: {
|
mainContent: {
|
||||||
@ -46,47 +48,48 @@ const styles = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
function User() {
|
function User() {
|
||||||
// États pour la gestion des utilisateurs, des logs, des champs du formulaire et des ajustements de points
|
|
||||||
const [users, setUsers] = useState([]);
|
const [users, setUsers] = useState([]);
|
||||||
const [logs, setLogs] = useState([]);
|
const [logs, setLogs] = useState([]);
|
||||||
const [username, setUsername] = useState("");
|
const [name, setname] = useState("");
|
||||||
const [email, setEmail] = useState("");
|
const [email, setEmail] = useState("");
|
||||||
const [pointsInput, setPointsInput] = useState({});
|
const [pointsInput, setPointsInput] = useState({});
|
||||||
|
|
||||||
// Ajout d'un utilisateur
|
|
||||||
const handleAddUser = (e) => {
|
const handleAddUser = (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const newUser = {
|
const newUser = {
|
||||||
id: Date.now(),
|
id: Date.now(),
|
||||||
username,
|
name,
|
||||||
email,
|
email,
|
||||||
accessLevel: "User", // Niveau d'accès par défaut
|
accessLevel: "User",
|
||||||
points: 0,
|
points: 0,
|
||||||
};
|
};
|
||||||
setUsers([...users, newUser]);
|
setUsers([...users, newUser]);
|
||||||
logAction(username, "User added");
|
logAction(name, "User added");
|
||||||
setUsername("");
|
setname("");
|
||||||
setEmail("");
|
setEmail("");
|
||||||
};
|
};
|
||||||
|
useEffect(() => {
|
||||||
// Suppression d'un utilisateur (fonction présente dans script.js)
|
axios.get(`${API_BASE_URL}/users`).then((response) => {
|
||||||
|
setUsers(response.data);
|
||||||
|
});
|
||||||
|
}, []);
|
||||||
const handleDeleteUser = (userId) => {
|
const handleDeleteUser = (userId) => {
|
||||||
const user = users.find((u) => u.id === userId);
|
const user = users.find((u) => u.id === userId);
|
||||||
if (user) {
|
if (user) {
|
||||||
logAction(user.username, "User deleted");
|
logAction(user.name, "User deleted");
|
||||||
}
|
}
|
||||||
setUsers(users.filter((u) => u.id !== userId));
|
setUsers(users.filter((u) => u.id !== userId));
|
||||||
};
|
};
|
||||||
|
|
||||||
// Changement du niveau d'accès via le menu déroulant (fonction issue de script.js)
|
|
||||||
const handleChangeAccessLevel = (userId, newLevel) => {
|
const handleChangeAccessLevel = (userId, newLevel) => {
|
||||||
setUsers(
|
setUsers(
|
||||||
users.map((user) => {
|
users.map((user) => {
|
||||||
if (user.id === userId) {
|
if (user.id === userId) {
|
||||||
const oldLevel = user.accessLevel;
|
const oldLevel = user.role;
|
||||||
user.accessLevel = newLevel;
|
user.role = newLevel;
|
||||||
|
/*ToDO*/
|
||||||
logAction(
|
logAction(
|
||||||
user.username,
|
user.name,
|
||||||
`Access level changed from ${oldLevel} to ${newLevel}`
|
`Access level changed from ${oldLevel} to ${newLevel}`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -95,26 +98,39 @@ function User() {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Ajustement des points d'un utilisateur (fonction issue de script.js)
|
|
||||||
const handleAdjustPoints = (userId) => {
|
const handleAdjustPoints = (userId) => {
|
||||||
const pointsToAdd = parseInt(pointsInput[userId]) || 0;
|
const pointsToAdd = parseInt(pointsInput[userId]) || 0;
|
||||||
setUsers(
|
setUsers(
|
||||||
users.map((user) => {
|
users.map((user) => {
|
||||||
if (user.id === userId) {
|
if (user.id === userId) {
|
||||||
user.points += pointsToAdd;
|
user.points += pointsToAdd;
|
||||||
logAction(user.username, `Points adjusted by ${pointsToAdd}`);
|
axios
|
||||||
|
.post(`${API_BASE_URL}/setUserPoints`, {
|
||||||
|
id:user.id,
|
||||||
|
points:user.points,
|
||||||
|
})
|
||||||
|
.then((response) => {
|
||||||
|
setMessRequete("Les points ont bien été enregistré !");
|
||||||
|
setEnregistre(true);
|
||||||
|
console.log("Ajout des points réussit :", response.data);
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
setMessRequete("Il y a eu une erreur dans l'ajout des points!");
|
||||||
|
console.error("Erreur lors de l'ajout des points :", error);
|
||||||
|
});
|
||||||
|
logAction(user.name, `Points ajustés par ${pointsToAdd}`);
|
||||||
}
|
}
|
||||||
return user;
|
return user;
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
// Réinitialiser la valeur de l'input pour cet utilisateur
|
|
||||||
setPointsInput({ ...pointsInput, [userId]: "" });
|
setPointsInput({ ...pointsInput, [userId]: "" });
|
||||||
};
|
};
|
||||||
|
|
||||||
// Fonction de journalisation des actions (définie dans script.js)
|
const logAction = (name, action) => {
|
||||||
const logAction = (username, action) => {
|
/*TODO*/
|
||||||
|
/*Ajouter le suivi dans un journal de log*/
|
||||||
const timestamp = new Date().toLocaleString();
|
const timestamp = new Date().toLocaleString();
|
||||||
setLogs([...logs, { id: Date.now(), username, action, timestamp }]);
|
setLogs([...logs, { id: Date.now(), name, action, timestamp }]);
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -129,10 +145,10 @@ function User() {
|
|||||||
<input
|
<input
|
||||||
style={styles.input}
|
style={styles.input}
|
||||||
type="text"
|
type="text"
|
||||||
id="username"
|
id="name"
|
||||||
placeholder="Username"
|
placeholder="name"
|
||||||
value={username}
|
value={name}
|
||||||
onChange={(e) => setUsername(e.target.value)}
|
onChange={(e) => setname(e.target.value)}
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
<input
|
<input
|
||||||
@ -152,9 +168,9 @@ function User() {
|
|||||||
<table style={styles.userTable}>
|
<table style={styles.userTable}>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th style={{ ...styles.thTd, ...styles.th }}>Username</th>
|
<th style={{ ...styles.thTd, ...styles.th }}>Nom</th>
|
||||||
<th style={{ ...styles.thTd, ...styles.th }}>Email</th>
|
<th style={{ ...styles.thTd, ...styles.th }}>Email</th>
|
||||||
<th style={{ ...styles.thTd, ...styles.th }}>Access Level</th>
|
<th style={{ ...styles.thTd, ...styles.th }}>Niveau d'accès</th>
|
||||||
<th style={{ ...styles.thTd, ...styles.th }}>Points</th>
|
<th style={{ ...styles.thTd, ...styles.th }}>Points</th>
|
||||||
<th style={{ ...styles.thTd, ...styles.th }}>Actions</th>
|
<th style={{ ...styles.thTd, ...styles.th }}>Actions</th>
|
||||||
</tr>
|
</tr>
|
||||||
@ -162,20 +178,20 @@ function User() {
|
|||||||
<tbody>
|
<tbody>
|
||||||
{users.map((user) => (
|
{users.map((user) => (
|
||||||
<tr key={user.id}>
|
<tr key={user.id}>
|
||||||
<td style={styles.thTd}>{user.username}</td>
|
<td style={styles.thTd}>{user.name}</td>
|
||||||
<td style={styles.thTd}>{user.email}</td>
|
<td style={styles.thTd}>{user.email}</td>
|
||||||
<td style={styles.thTd}>
|
<td style={styles.thTd}>
|
||||||
{/* Menu déroulant pour changer le niveau d'accès */}
|
{/* Menu déroulant pour changer le niveau d'accès */}
|
||||||
<select
|
<select
|
||||||
value={user.accessLevel}
|
value={user.role}
|
||||||
onChange={(e) =>
|
onChange={(e) =>
|
||||||
handleChangeAccessLevel(user.id, e.target.value)
|
handleChangeAccessLevel(user.id, e.target.value)
|
||||||
}
|
}
|
||||||
style={{ padding: "5px", borderRadius: "5px" }}
|
style={{ padding: "5px", borderRadius: "5px" }}
|
||||||
>
|
>
|
||||||
<option value="Admin">Admin</option>
|
<option value="admin">Admin</option>
|
||||||
<option value="User">User</option>
|
<option value="user">User</option>
|
||||||
<option value="Guest">Guest</option>
|
<option value="complexe">Complexe</option>
|
||||||
</select>
|
</select>
|
||||||
</td>
|
</td>
|
||||||
<td style={styles.thTd}>
|
<td style={styles.thTd}>
|
||||||
@ -225,11 +241,11 @@ function User() {
|
|||||||
</section>
|
</section>
|
||||||
{/* Tableau des logs */}
|
{/* Tableau des logs */}
|
||||||
<section className="user-logs" style={{ marginTop: "40px" }}>
|
<section className="user-logs" style={{ marginTop: "40px" }}>
|
||||||
<h2>Login History and Action Logs</h2>
|
<h2>Historique des connexions et journal des logs </h2>
|
||||||
<table style={styles.userTable}>
|
<table style={styles.userTable}>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th style={{ ...styles.thTd, ...styles.th }}>Username</th>
|
<th style={{ ...styles.thTd, ...styles.th }}>Nom</th>
|
||||||
<th style={{ ...styles.thTd, ...styles.th }}>Action</th>
|
<th style={{ ...styles.thTd, ...styles.th }}>Action</th>
|
||||||
<th style={{ ...styles.thTd, ...styles.th }}>Timestamp</th>
|
<th style={{ ...styles.thTd, ...styles.th }}>Timestamp</th>
|
||||||
</tr>
|
</tr>
|
||||||
@ -237,7 +253,7 @@ function User() {
|
|||||||
<tbody>
|
<tbody>
|
||||||
{logs.map((log) => (
|
{logs.map((log) => (
|
||||||
<tr key={log.id}>
|
<tr key={log.id}>
|
||||||
<td style={styles.thTd}>{log.username}</td>
|
<td style={styles.thTd}>{log.name}</td>
|
||||||
<td style={styles.thTd}>{log.action}</td>
|
<td style={styles.thTd}>{log.action}</td>
|
||||||
<td style={styles.thTd}>{log.timestamp}</td>
|
<td style={styles.thTd}>{log.timestamp}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user