Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions course-selection.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<link rel="stylesheet" href="style.css">
<title>Select Courses</title>
</head>
<body>
<header>
<h1>Select Your Courses</h1>
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/">Dashboard</a></li>
<li><a href="/">Profile</a></li>
</ul>
</nav>
</header>

<main>
<form id="course-selection-form">
<div class="courses">
<label><input type="checkbox" name="courses" value="node js">Node JS</label>
<label><input type="checkbox" name="courses" value="python">Python</label>
<label><input type="checkbox" name="courses" value="dart">Dart</label>
</div>
<button type="submit">Save Selection</button>
</form>
</main>
<footer>
<p>&copy; 2024 Your Lms</p>
</footer>
<script src="script.js"></script>


</body>



</html>
52 changes: 52 additions & 0 deletions script.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,59 @@
// scripts.js

document.addEventListener('DOMContentLoaded', () => {
const courseSelectionForm = document.getElementById('course-selection-form');
if (courseSelectionForm) {
courseSelectionForm.addEventListener('submit', async (e) => {
e.preventDefault();
const formData = new FormData(courseSelectionForm);
const courses = [];
formData.forEach((value, key) => {
if (key === 'courses') courses.push(value);

}
);
try{
const response = await fetch ('/select-courses', {
method: 'POST',
headers: {
'Content-Type': 'application/json'

},
body: JSON.stringify({courses})
}
);
if (response.ok){
alert('Course selection saved successfully');
}else{
alert('Failed to save course selection');

}

}catch(error){
console.error('Error:', error);
}
});
}

const coursesList = document.getElementById('courses-list');
if (coursesList){
fetch('/get-selected-courses')
.then(response => response.json())
.then(data => {
data.courses.forEach(course => {
const li = document.createElement('li');
li.textContent = course;
coursesList.appendChild(li);
});
});
}
});

document.addEventListener('DOMContentLoaded', () => {
const registerForm = document.getElementById('register-form');
const loginForm = document.getElementById('login-form');
const logoutForm = document.getElementById('logout-form');


registerForm.addEventListener('submit', async (e) => {
e.preventDefault();
Expand All @@ -26,6 +77,7 @@ document.addEventListener('DOMContentLoaded', () => {
}
} catch (error) {
console.error('Error:', error);
alert('An error occured.');
}
});

Expand Down
73 changes: 67 additions & 6 deletions server.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,17 @@ app.use(session({
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'learning_management'
password: '101500@Lydiah',
database: 'learning_management_system'
});

// Connect to MySQL
connection.connect((err) => {
if (err) {
console.error('Error connecting to MySQL: ' + err.stack);
console.error('Error connecting to DB: ' + err.stack);
return;
}
console.log('Connected to MySQL as id ' + connection.threadId);
console.log('Connected to DB as id ' + connection.threadId);
});

// Serve static files from the default directory
Expand Down Expand Up @@ -60,6 +60,13 @@ const User = {
connection.query('SELECT * FROM ' + this.tableName + ' WHERE username = ?', username, callback);
}
};
const Course = {
tableName: 'courses',
getAllCourses: function(callback){
connection.query('SELECT * FROM' + this.tableName, callback);

}
};

// Registration route
app.post('/register', [
Expand Down Expand Up @@ -148,6 +155,42 @@ app.get('/dashboard', (req, res) => {
res.render('dashboard', { fullName: userFullName });
});

//Route to save selected courses for a user
app.post('/selected-courses', (req,res) => {
const userId = req.session.user.id;
const courses = req.body.courses;
const sql = 'INSERT INTO user_courses(user_id, course_id) VALUES?';
const values = courses.map(courseId => userId, courseId);
connection.query(sql, [values], (err, result) => {
if (err) {
console.error('Error inserting selected courses:', err);
return res.status(500).send('Error saving course selection');
}
res.send('Course selection saved successfully');
});
});

// Route to fetch selected courses for a user
app.get('/get-selected-courses', (req, res) => {
const userId = req.session.user.id;
const sql = `
SELECT c.name
FROM user_courses uc
JOIN courses c ON uc.course_id = c.id
WHERE uc.user_id = ?
`;
connection.query(sql, [userId], (err, results) => {
if (err) {
console.error('Error fetching selected courses:', err);
return res.status(500).send('Error fetching selected courses');
}
const courses = results.map(row => row.name);
res.json({ courses });
});
});



// Route to retrieve course content
app.get('/course/:id', (req, res) => {
const courseId = req.params.id;
Expand All @@ -160,9 +203,27 @@ app.get('/course/:id', (req, res) => {
res.json(result);
});
});
// Route to fetch leaderboard data
app.get('/leaderboard', (req, res) => {
const sql = `
SELECT u.username AS name, SUM(score) AS score
FROM user_courses uc
JOIN users u ON uc.user_id = u.id
GROUP BY u.id
ORDER BY score DESC
LIMIT 10
`;
connection.query(sql, (err, results) => {
if (err) {
console.error('Error fetching leaderboard data:', err);
return res.status(500).send('Error fetching leaderboard data');
}
res.json(results);
});
});

// Start server
const PORT = process.env.PORT || 3000;
const PORT = process.env.PORT || 4000;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
});