Partie admin
This commit is contained in:
parent
ffa19ba1ba
commit
f9a22d418b
6
package-lock.json
generated
Normal file
6
package-lock.json
generated
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"name": "Projet-Dev-Web-Ing1",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {}
|
||||
}
|
||||
256
projet_admin/css/styles.css
Normal file
256
projet_admin/css/styles.css
Normal file
@ -0,0 +1,256 @@
|
||||
/* General Reset */
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
background-color: #f4f4f4;
|
||||
}
|
||||
|
||||
/* Container */
|
||||
.container {
|
||||
display: flex;
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
/* Sidebar */
|
||||
.sidebar h2 {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.sidebar nav ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.sidebar nav ul li {
|
||||
margin: 15px 0;
|
||||
}
|
||||
|
||||
.sidebar nav ul li a {
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
padding: 10px;
|
||||
display: block;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.sidebar nav ul li a:hover {
|
||||
background-color: #555;
|
||||
}
|
||||
|
||||
/* Main Content */
|
||||
.main-content {
|
||||
flex-grow: 1;
|
||||
padding: 20px;
|
||||
background-color: #fff;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
header {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
header h1 {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
/* Cards Section */
|
||||
.cards {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.card {
|
||||
background: #e3e3e3;
|
||||
padding: 20px;
|
||||
border-radius: 8px;
|
||||
text-align: center;
|
||||
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.card h3 {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
/* Media Query for Responsive Design */
|
||||
@media (max-width: 768px) {
|
||||
.sidebar {
|
||||
width: 70px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.sidebar h2 {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.sidebar nav ul li {
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
.sidebar nav ul li a {
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.main-content {
|
||||
padding: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
/* User Management Section */
|
||||
.user-management {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.user-form {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr auto;
|
||||
gap: 10px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.user-form input {
|
||||
padding: 10px;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.user-form button {
|
||||
padding: 10px;
|
||||
background-color: #28a745;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.user-form button:hover {
|
||||
background-color: #218838;
|
||||
}
|
||||
|
||||
.user-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.user-table th, .user-table td {
|
||||
padding: 10px;
|
||||
border: 1px solid #ccc;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.user-table th {
|
||||
background-color: #f4f4f4;
|
||||
}
|
||||
|
||||
.action-button {
|
||||
background-color: #dc3545;
|
||||
color: white;
|
||||
border: none;
|
||||
padding: 5px 10px;
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.action-button:hover {
|
||||
background-color: #c82333;
|
||||
}
|
||||
|
||||
/* Add this to your existing CSS */
|
||||
|
||||
/* User Management Section */
|
||||
.user-management {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.user-form {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr auto;
|
||||
gap: 10px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.user-form input {
|
||||
padding: 10px;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.user-form button {
|
||||
padding: 10px;
|
||||
background-color: #28a745;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.user-form button:hover {
|
||||
background-color: #218838;
|
||||
}
|
||||
|
||||
.user-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.user-table th, .user-table td {
|
||||
padding: 10px;
|
||||
border: 1px solid #ccc;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.user-table th {
|
||||
background-color: #f4f4f4;
|
||||
}
|
||||
|
||||
.access-level {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.assign-button, .revoke-button, .adjust-points-button {
|
||||
background-color: #007bff;
|
||||
color: white;
|
||||
border: none;
|
||||
padding: 5px 10px;
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.assign-button:hover {
|
||||
background-color: #0069d9;
|
||||
}
|
||||
|
||||
.revoke-button {
|
||||
background-color: #dc3545;
|
||||
}
|
||||
|
||||
.revoke-button:hover {
|
||||
background-color: #c82333;
|
||||
}
|
||||
|
||||
/* Add this to your existing CSS */
|
||||
|
||||
/* User Logs Section */
|
||||
.user-logs {
|
||||
margin-top: 40px;
|
||||
}
|
||||
|
||||
.log-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.log-table th, .log-table td {
|
||||
padding: 10px;
|
||||
border: 1px solid #ccc;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.log-table th {
|
||||
background-color: #f4f4f4;
|
||||
}
|
||||
0
projet_admin/database/logs.json
Normal file
0
projet_admin/database/logs.json
Normal file
0
projet_admin/database/points.json
Normal file
0
projet_admin/database/points.json
Normal file
0
projet_admin/database/users.json
Normal file
0
projet_admin/database/users.json
Normal file
132
projet_admin/http/User.php
Normal file
132
projet_admin/http/User.php
Normal file
@ -0,0 +1,132 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="../css/styles.css">
|
||||
<title>User</title>
|
||||
<style>
|
||||
/* Add this to your existing CSS */
|
||||
|
||||
/* User Management Section */
|
||||
.user-management {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.user-form {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr auto;
|
||||
gap: 10px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.user-form input {
|
||||
padding: 10px;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.user-form button {
|
||||
padding: 10px;
|
||||
background-color: #28a745;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.user-form button:hover {
|
||||
background-color: #218838;
|
||||
}
|
||||
|
||||
.user-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.user-table th,
|
||||
.user-table td {
|
||||
padding: 10px;
|
||||
border: 1px solid #ccc;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.user-table th {
|
||||
background-color: #f4f4f4;
|
||||
}
|
||||
|
||||
.access-level {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.assign-button,
|
||||
.revoke-button {
|
||||
background-color: #007bff;
|
||||
color: white;
|
||||
border: none;
|
||||
padding: 5px 10px;
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.assign-button:hover {
|
||||
background-color: #0069d9;
|
||||
}
|
||||
|
||||
.revoke-button {
|
||||
background-color: #dc3545;
|
||||
}
|
||||
|
||||
.revoke-button:hover {
|
||||
background-color: #c82333;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<?php include("sidebar.php"); ?>
|
||||
|
||||
<body>
|
||||
<main class="main-content">
|
||||
<header>
|
||||
<h1>User Management</h1>
|
||||
<p>Manage users from this panel.</p>
|
||||
</header>
|
||||
<section class="user-management">
|
||||
<form id="userForm" class="user-form">
|
||||
<input type="text" id="username" placeholder="Username" required>
|
||||
<input type="email" id="email" placeholder="Email" required>
|
||||
<button type="submit">Add User</button>
|
||||
</form>
|
||||
<table class="user-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Username</th>
|
||||
<th>Email</th>
|
||||
<th>Access Level</th>
|
||||
<th>Points</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="userList">
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
<section class="user-logs">
|
||||
<h2>Login History and Action Logs</h2>
|
||||
<table class="log-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Username</th>
|
||||
<th>Action</th>
|
||||
<th>Timestamp</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="logList">
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
</main>
|
||||
</body>
|
||||
<script src="../js/script.js"></script>
|
||||
|
||||
</html>
|
||||
17
projet_admin/http/frontend.php
Normal file
17
projet_admin/http/frontend.php
Normal file
@ -0,0 +1,17 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Admin Dashboard - User Management</title>
|
||||
<link rel="stylesheet" href="../css/styles.css">
|
||||
</head>
|
||||
<?php include("sidebar.php"); ?>
|
||||
|
||||
<body>
|
||||
<nav id="navigation"></nav>
|
||||
<script src="../js/script.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
10
projet_admin/http/index.js
Normal file
10
projet_admin/http/index.js
Normal file
@ -0,0 +1,10 @@
|
||||
import { createRoot } from 'react-dom/client';
|
||||
|
||||
function NavigationBar() {
|
||||
// TODO: Actually implement a navigation bar
|
||||
return <h1>Hello from React!</h1>;
|
||||
}
|
||||
|
||||
const domNode = document.getElementById('navigation');
|
||||
const root = createRoot(domNode);
|
||||
root.render(<NavigationBar />);
|
||||
52
projet_admin/http/sidebar.php
Normal file
52
projet_admin/http/sidebar.php
Normal file
@ -0,0 +1,52 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title><i class="fas fa-head-side-brain"></i></title>
|
||||
<link rel="stylesheet" href="../css/styles.css">
|
||||
<style>
|
||||
body {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
main {
|
||||
flex-grow: 1; /* Permet au contenu principal de prendre tout l'espace restant */
|
||||
padding: 20px;
|
||||
}
|
||||
html,
|
||||
body {
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
width: 250px;
|
||||
background-color: #333;
|
||||
color: #fff;
|
||||
padding: 20px;
|
||||
height: 100vh;
|
||||
/* Sidebar prend toute la hauteur visible de l'écran */
|
||||
box-sizing: border-box;
|
||||
/* inclut padding dans la largeur/hauteur */
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<aside class="sidebar">
|
||||
<h2>Admin Panel</h2>
|
||||
<nav>
|
||||
<ul>
|
||||
<li><a href="frontend.php">Dashboard</a></li>
|
||||
<li><a href="User.php">Users</a></li>
|
||||
<li><a href="#">Settings</a></li>
|
||||
<li><a href="#">Reports</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</aside>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
106
projet_admin/js/script.js
Normal file
106
projet_admin/js/script.js
Normal file
@ -0,0 +1,106 @@
|
||||
// script.js
|
||||
|
||||
let users = [];
|
||||
let logs = [];
|
||||
|
||||
document.getElementById('userForm').addEventListener('submit', function(event) {
|
||||
event.preventDefault();
|
||||
|
||||
const username = document.getElementById('username').value;
|
||||
const email = document.getElementById('email').value;
|
||||
|
||||
const user = {
|
||||
id: Date.now(),
|
||||
username: username,
|
||||
email: email,
|
||||
accessLevel: 'User', // Default access level
|
||||
points: 0, // Default points
|
||||
logins: [] // Array to track login timestamps
|
||||
};
|
||||
|
||||
users.push(user);
|
||||
logAction(username, 'User added');
|
||||
renderUserList();
|
||||
this.reset(); // Clear the form
|
||||
});
|
||||
|
||||
function renderUserList() {
|
||||
const userList = document.getElementById('userList');
|
||||
userList.innerHTML = ''; // Clear the list before rendering
|
||||
|
||||
users.forEach((user) => {
|
||||
const row = document.createElement('tr');
|
||||
row.innerHTML = `
|
||||
<td>${user.username}</td>
|
||||
<td>${user.email}</td>
|
||||
<td>
|
||||
<select class="access-level" onchange="changeAccessLevel(${user.id}, this.value)">
|
||||
<option value="Admin" ${user.accessLevel === 'Admin' ? 'selected' : ''}>Admin</option>
|
||||
<option value="User" ${user.accessLevel === 'User' ? 'selected' : ''}>User</option>
|
||||
<option value="Guest" ${user.accessLevel === 'Guest' ? 'selected' : ''}>Guest</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<span>${user.points}</span>
|
||||
<input type="number" min="0" id="points-${user.id}" style="width:60px" placeholder="Adjust" />
|
||||
<button class="adjust-points-button" onclick="adjustPoints(${user.id})">Adjust</button>
|
||||
</td>
|
||||
<td>
|
||||
<button class="action-button" onclick="deleteUser(${user.id})">Delete</button>
|
||||
</td>
|
||||
`;
|
||||
userList.appendChild(row);
|
||||
});
|
||||
}
|
||||
|
||||
function deleteUser(userId) {
|
||||
const user = users.find(user => user.id === userId);
|
||||
if (user) {
|
||||
logAction(user.username, 'User deleted');
|
||||
}
|
||||
users = users.filter(user => user.id !== userId);
|
||||
renderUserList();
|
||||
}
|
||||
|
||||
function changeAccessLevel(userId, newLevel) {
|
||||
const user = users.find(user => user.id === userId);
|
||||
if (user) {
|
||||
const oldLevel = user.accessLevel;
|
||||
user.accessLevel = newLevel;
|
||||
logAction(user.username, `Access level changed from ${oldLevel} to ${newLevel}`);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustPoints(userId) {
|
||||
const inputField = document.getElementById(`points-${userId}`);
|
||||
const pointsToAdd = parseInt(inputField.value) || 0;
|
||||
|
||||
const user = users.find(user => user.id === userId);
|
||||
if (user) {
|
||||
user.points += pointsToAdd; // Adjust points based on the input value
|
||||
logAction(user.username, `Points adjusted by ${pointsToAdd}`);
|
||||
inputField.value = ''; // Clear the input
|
||||
renderUserList(); // Re-render the user list
|
||||
}
|
||||
}
|
||||
|
||||
function logAction(username, action) {
|
||||
const timestamp = new Date().toLocaleString();
|
||||
logs.push({username, action, timestamp});
|
||||
renderLogList();
|
||||
}
|
||||
|
||||
function renderLogList() {
|
||||
const logList = document.getElementById('logList');
|
||||
logList.innerHTML = ''; // Clear the list before rendering
|
||||
|
||||
logs.forEach(log => {
|
||||
const row = document.createElement('tr');
|
||||
row.innerHTML = `
|
||||
<td>${log.username}</td>
|
||||
<td>${log.action}</td>
|
||||
<td>${log.timestamp}</td>
|
||||
`;
|
||||
logList.appendChild(row);
|
||||
});
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user