Node.js සහ MySQL E-Learning වෙබ් අඩවිය

ශිෂ්‍ය සහ ගුරු උපකරණ පුවරු සහිත සම්පූර්ණ e-learning වෙබ් අඩවියක් Node.js සහ Express.js සමඟ නිර්මාණය කරමු.

1. හැඳින්වීම (Introduction)

මෙම නිබන්ධනය මගින්, e-learning platform එකක් නිර්මාණය කරන්නේ කෙසේදැයි පියවරෙන් පියවර කියාදෙනු ලැබේ. මෙහිදී අපි Node.js (JavaScript runtime), Express.js (web framework), MySQL (database), සහ Bootstrap (front-end framework) භාවිතා කරමු.

ප්‍රධාන තාක්ෂණයන්:
  • Backend: Node.js, Express.js
  • Database: MySQL (mysql2 package)
  • Templating: EJS (Embedded JavaScript)
  • Security: bcryptjs (password hashing), express-session (sessions)

2. ව්‍යාපෘති සැකසුම (Project Setup)

පළමුව, Node.js ව්‍යාපෘතියක් ආරම්භ කර අවශ්‍ය packages ස්ථාපනය කරගනිමු.

1. නව ෆෝල්ඩරයක් සාදා එයට පිවිසෙන්න: mkdir e-learning-node && cd e-learning-node

2. Node.js ව්‍යාපෘතිය ආරම්භ කරන්න:

npm init -y

3. අවශ්‍ය packages ස්ථාපනය කරන්න:

npm install express mysql2 ejs bcryptjs express-session

3. ව්‍යාපෘතියේ ව්‍යුහය (Project Structure)

අපගේ Node.js ව්‍යාපෘතිය සඳහා පහත පරිදි ෆෝල්ඩර සහ ගොනු ව්‍යුහයක් සකසා ගනිමු.


/e-learning-node/
|-- config/
|   `-- db.js
|-- routes/
|   |-- auth.js
|   |-- student.js
|   `-- teacher.js
|-- views/
|   |-- partials/
|   |   |-- header.ejs
|   |   `-- footer.ejs
|   |-- login.ejs
|   |-- register.ejs
|   |-- student_dashboard.ejs
|   `-- teacher_dashboard.ejs
|-- public/
|   `-- css/
|       `-- style.css
|-- node_modules/
|-- package.json
|-- package-lock.json
`-- server.js

4. දත්ත සමුදාය සැකසීම (MySQL Database)

මෙම කොටස PHP නිබන්ධනයේ ආකාරයටම වේ. elearning_db නමින් දත්ත සමුදායක් සහ users, lessons, student_progress යන වගු නිර්මාණය කරගන්න.


-- පරිශීලකයන් (users) සඳහා වගුව
CREATE TABLE `users` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `full_name` VARCHAR(100) NOT NULL,
  `email` VARCHAR(100) NOT NULL UNIQUE,
  `password` VARCHAR(255) NOT NULL,
  `user_type` ENUM('student', 'teacher') NOT NULL,
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- (lessons සහ student_progress වගුද මෙලෙසම සාදන්න)

5. Server සහ Database සම්බන්ධතාවය

config/db.js

MySQL දත්ත සමුදාය සමඟ සම්බන්ධ වීමට connection pool එකක් සාදමු.


const mysql = require('mysql2');

const pool = mysql.createPool({
    host: 'localhost',
    user: 'root', // ඔබගේ username
    password: '', // ඔබගේ password
    database: 'elearning_db',
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0
});

// සිංහල භාෂාව සඳහා utf8mb4 භාවිතා කිරීම වඩාත් සුදුසුයි
pool.query('SET NAMES utf8mb4');

module.exports = pool.promise();
server.js (ප්‍රධාන ගොනුව)

Express server එක සකසා, middleware වින්‍යාස කර, routes සම්බන්ධ කරමු.


const express = require('express');
const session = require('express-session');
const path = require('path');

const app = express();
const port = 3000;

// Middleware
app.use(express.urlencoded({ extended: true }));
app.use(express.static(path.join(__dirname, 'public')));
app.use(session({
    secret: 'your-secret-key', // Use a strong secret key
    resave: false,
    saveUninitialized: true,
}));

// View Engine Setup
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));

// Routes
const authRoutes = require('./routes/auth');
app.use('/', authRoutes);
// (student and teacher routes will be added here)

app.listen(port, () => {
    console.log(`Server is running on http://localhost:${port}`);
});

6. පොදු මාර්ග (Public Routes)

routes/auth.js

Login, register, සහ logout ක්‍රියාවලි සඳහා routes මෙහි අඩංගු වේ.


const express = require('express');
const bcrypt = require('bcryptjs');
const db = require('../config/db');
const router = express.Router();

// GET /login
router.get('/login', (req, res) => {
    res.render('login', { error: null });
});

// POST /login
router.post('/login', async (req, res) => {
    const { email, password } = req.body;
    try {
        const [rows] = await db.query('SELECT * FROM users WHERE email = ?', [email]);
        if (rows.length === 0) {
            return res.render('login', { error: 'මෙම විද්‍යුත් තැපෑල ලියාපදිංචි වී නොමැත!' });
        }

        const user = rows[0];
        const isMatch = await bcrypt.compare(password, user.password);

        if (!isMatch) {
            return res.render('login', { error: 'මුරපදය වැරදියි!' });
        }

        req.session.userId = user.id;
        req.session.userType = user.user_type;

        if (user.user_type === 'student') {
            res.redirect('/student/dashboard');
        } else {
            res.redirect('/teacher/dashboard');
        }
    } catch (err) {
        console.error(err);
        res.status(500).send('Server Error');
    }
});

// (register සහ logout routes මෙහි එක් කරන්න)

module.exports = router;

7. Dashboard Routes

Dashboard වෙත පිවිසීමට පෙර පරිශීලකයා login වී ඇත්දැයි පරීක්ෂා කිරීමට middleware එකක් සාදමු.

Authentication Middleware

// Middleware to check if user is authenticated
function isAuthenticated(req, res, next) {
    if (req.session.userId) {
        return next();
    }
    res.redirect('/login');
}

// Middleware to check user role
function isStudent(req, res, next) {
    if (req.session.userType === 'student') {
        return next();
    }
    res.status(403).send('Access Denied');
}
// (Create isTeacher middleware similarly)
routes/student.js

const express = require('express');
const router = express.Router();
// Import middleware functions

router.get('/dashboard', isAuthenticated, isStudent, (req, res) => {
    res.render('student_dashboard');
});

module.exports = router;

8. අවසාන සටහන් (Final Notes)

මෙම නිබන්ධනය මගින් Node.js e-learning වෙබ් අඩවියක මූලික රාමුවක් ලබා දේ. මෙය තවදුරටත් දියුණු කිරීමට ඔබට හැකිය.

වැඩිදුර දියුණු කිරීම්:
  • ORM එකක් (Sequelize or TypeORM) භාවිතා කිරීම.
  • API security සඳහා JWT (JSON Web Tokens) භාවිතා කිරීම.
  • Frontend framework එකක් (React, Vue, or Angular) සමඟ API එකක් ලෙස භාවිතා කිරීම.
  • File uploads (පාඩම් සඳහා PDF/Video) සඳහා multer වැනි package එකක් භාවිතා කිරීම.