Mini Project Report (Conference Management System) (2) (1)
Mini Project Report (Conference Management System) (2) (1)
Submitted by
Nandhini S (953622205029)
BACHELOR OF TECHNOLOGY
RAJAPALAYAM-626 117
APRIL 2025
1
BONAFIDE CERTIFICATE
SIGNATURE SIGNATURE
Dr. ANUSUYA. V Mrs. RETHINAKUMARI. M
HEAD OF THE DEPARTMENT SUPERVISOR
Department of Information Technology Assistant Professor
Ramco Institute of Technology Department of Information Technology
Rajapalayam-626117 Ramco Institute of Technology
Rajapalayam-626117.
The project report submitted for the viva voce held on ………….
2
INTERNAL EXAMINER EXTERNAL EXAMINER
3
DECLARATION
Place: Rajapalayam.
Date: / /2025.
4
ACKNOWLEDGEMENT
First and foremost, I express my utmost gratitude to our Chairman, Shri. P.R.
Venketrama Raja, B.E., MBA., for his remarkable support and encouragement
toward the improvement of the college.
I am also indebted to Dr. V. Anusuya, M.E., Ph.D., Associate Professor and Head,
Department of Information Technology, for providing the necessary lab facilities to
complete my work.
I am very much thankful to all the staff members of the Department of Information
Technology for the various ways in which they supported me during the completion
of my project.
Last but not least, I extend my sincere thanks to my friends and family members for
their unwavering support and encouragement throughout my project journey.
Signature
ABSTRACT
The Conference Management System (CMS) is a comprehensive, open-source platform
designed to streamline the planning, organization, and execution of academic and
professional conferences. In today’s fast-paced world, managing large-scale events with
multiple participants, sessions, and complex schedules can be a daunting task. The CMS
offers an intuitive and efficient solution, automating processes such as abstract
submissions, paper reviews, scheduling, registration, and attendee management.
Developed with a focus on flexibility, performance, and user-centric design, the CMS
is fully scalable to accommodate conferences of any size. It supports integration with
popular conference platforms and provides tools for generating reports, managing
conference materials, and fostering networking among attendees. Fully offline and free
of third-party integrations, the system ensures data privacy and security for all involved.
2
TABLE OF CONTENTS
3
1. INTRODUCTION
Problem Statement:
4
1.2 EXISTING SYSTEM
In many academic and professional settings, the existing systems used for managing
conferences are either:
• Manual methods involving emails, spreadsheets, and documents, which are error-
prone and difficult to coordinate.
• Generic event management tools that lack features specific to academic conferences
such as peer review workflows, paper revision tracking, and automated scheduling.
• Outdated or fragmented systems that do not support scalability, user-friendliness, or
integration with tools like plagiarism checkers, indexing services
5
● Participant registration and payment handling.
6
● Analytics and reporting for submissions, reviews, and attendance.
Key Benefits:
This chapter outlines the hardware and software prerequisites required to develop and
deploy the Conference Management System (CMS), which will be built using HTML,
CSS, React, Node.js (Express).
7
2.1 HARDWARE & SOFTWARE REQUIREMENTS
HARDWARE REQUIREMENTS
RAM 4 GB 8 GB or more
SOFTWARE REQUIREMENTS
8
2.2 SOFTWARE REQUIREMENTS SPECIFICATION (SRS)
1. Introduction
● Purpose
To build a web-based Conference Management System that facilitates the
management of academic or professional conferences. The system will support
paper submission, peer review, scheduling, registration, and participant
communication in an efficient and centralized manner.
● Scope
The CMS will serve conference organizers, authors, reviewers, and participants. It
will enable paper handling, reviewer assignment, session planning, registration, and
reporting via a browser-accessible interface. The system will automate repetitive
administrative tasks and improve transparency and coordination.
2. Functional Requirements
● User Authentication and Roles
Secure login system for Admin, Authors, Reviewers, and Participants using JWT
and sessions.
● Review Management
Reviewers can view assigned papers, submit evaluations, and provide
recommendations.
● Schedule Management
Admin can create conference schedules, assign sessions, and link accepted papers
to presentation slots.
● Registration Module
Participants can register, pay fees, and receive confirmation via email.
9
Generate downloadable reports on submissions, reviewer activity, registration
status, and session details.
10
3. Non-Functional Requirements
● Security
JWT authentication, bcrypt password hashing, role-based access control, and input
validation.
● Usability
Intuitive and responsive interface using React.js, accessible on desktop and mobile
browsers.
● Portability
Can run on any system supporting Node.js and MySQL (e.g., Windows, Linux,
macOS).
● Scalability
Designed to handle large-scale conferences with hundreds of users and submissions.
● Maintainability
Modular code structure using Express middleware and React components for easier
updates and enhancements.
3. SYSTEM DESIGN
System design defines the logical structure of modules and interactions. The CMS consists
of distinct but interconnected modules that collaborate to support the full lifecycle of a
conference—from submission to presentation.
3.1 PROPOSED SYSTEM – MODULES OF THE SYSTEM
1. Login & Authentication Module
o Provides role-based login for Admin, Authors, Reviewers, and Participants.
o Implements session and token-based security.
2. Paper Management Module
o Authors can submit, update, or withdraw papers.
o Papers are stored in MySQL with metadata and file references.
3. Reviewer Management Module
o Admin assigns reviewers; prevents conflict of interest using email and
subject area matching.
o Reviewers access submissions and submit evaluations.
4. Scheduling Module
11
o Admin creates and edits conference schedules.
12
o Maps accepted papers to time slots and rooms.
5. Registration & Payment Module
o Handles participant registration with form validation and payment gateway
integration.
o Issues confirmation emails automatically.
6. Review & Evaluation Module
o Reviewers enter ratings and comments.
o Admin can monitor review progress and generate decisions.
7. Reports Module
o Generates statistics and downloadable reports: submission numbers, review
timelines, accepted papers, and participant lists.
8. Notifications Module
o Sends reminders, announcements, and updates via email and system alerts.
13
B. Activity Diagram
C. Class Diagram
14
D. Communication Diagram
E. Sequence Diagram
15
F. State Chart
4. IMPLEMENTATION / METHODOLOGY
The development of the Conference Management System follows a modular and
component-based architecture, enabling scalability, maintainability, and team
collaboration. The system is structured using React.js for the frontend, and Node.js with
Express.js for the backend. It follows the principle of separation of concerns, keeping
frontend components, backend services, and business logic decoupled for improved
flexibility and reusability.
Development Methodology Used
Frontend
● Technology: React.js
● Approach: Responsive, component-based user interface
Key Features:
● Utilizes functional components and React Hooks (useState, useEffect, etc.) for
efficient state management.
● Implements React Router for seamless navigation between pages and routes.
● Form validation and interactivity are handled using:
16
o Formik – for managing form state.
o Yup – for schema-based validation.
o Custom validation logic where necessary
for additional flexibility.
Backend
17
● Data Transmission:
18
o Deployment over HTTPS is strongly recommended to ensure encrypted and
secure data transfer.
4.1 CODING
conferenceController.js:
const Conference = require("../models/conference");
const createConference = async (req, res) => {
console.log(req.params);
Conference.createConference(req)
.then((conference) => {
res.status(201).json({
conference,
});
})
.catch((error) => res.status(400).json({ error: error.message }));
};
const getAllConferences = async (req, res) => {
Conference.getAllConferences(req)
.then((conferences) => {
res.status(200).json({
conferences,
});
})
.catch((error) => res.status(400).json({ error: error.message }));
};
//conference registration
const conferenceRegistration = async (req, res) => {
Conference.conferenceRegistration(req)
.then((conference) => {
res.status(200).json({
conference,
});
})
.catch((error) => res.status(400).json({ error: error.message }));
};
//cancel registration
const cancelRegistration = async (req, res) => {
Conference.cancelConferenceRegistration(req)
.then((conference) => {
res.status(200).json({
conference,
});
})
.catch((error) => res.status(400).json({ error: error.message }));
};
const getConferenceById = async (req, res) => {
19
const id = req.params.id;
Conference.getConferenceById(id)
.then((conference) => {
res.status(200).json({
conference,
});
})
.catch((error) => res.status(400).json({ error: error.message }));
};
const editConference = async (req, res) => {
Conference.editConference(req)
.then((conference) => {
res.status(200).json({
conference,
});
})
.catch((error) => res.status(400).json({ error: error.message }));
};
const deleteConference = async (req, res) => {
Conference.deleteConference(req)
.then((conference) => {
res.status(200).json({
conference,
});
})
.catch((error) => res.status(400).json({ error: error.message }));
};
const viewConference = async (req, res) => {
console.log("in view conference contoller");
Conference.viewConference(req)
.then((conference) => {
res.status(201).json({
conference,
});
})
.catch((error) => res.status(400).json({ error: error.message }));
};
const removeUserFromConferences = async (req, res) => {
Conference.removeUserFromConferences(req)
.then((ack) => {
res.status(200).json({
ack,
});
})
.catch((error) => res.status(400).json({ error: error.message }));
};
20
const removeConferencesOfOrg = async (req, res) => {
Conference.removeConferencesOfOrg(req)
.then((ack) => {
res.status(200).json({
ack,
});
})
.catch((error) => res.status(400).json({ error: error.message }));
};
module.exports = {
createConference,
getAllConferences,
getConferenceById,
editConference,
deleteConference,
conferenceRegistration,
cancelRegistration,
viewConference,
removeUserFromConferences, // call when user is deleted
removeConferencesOfOrg, // call when org is deleted
};
orgController.js:
const Org = require("../models/org");
const jwt = require("jsonwebtoken");
const createToken = (id) => {
return jwt.sign({ id }, process.env.JWT_SECRET, {
expiresIn: process.env.JWT_EXPIRES_IN,
});
};
const allOrgs = async (req, res) => {
Org.find()
.then((orgs) => {
res.status(200).json({
orgs,
});
})
.catch((error) => res.status(400).json({ error: error.message }));
};
const getOrgById = async (req, res) => {
const emailId = req.params.emailid;
Org.getOrgById(emailId)
.then((org) => {
res.status(200).json({
org,
});
21
})
.catch((error) => res.status(400).json({ error: error.message }));
};
const myConferences = async (req, res) => {
const id = req.params.id;
Org.myConferences(id)
.then((conferences) => {
res.status(200).json({
conferences,
});
})
.catch((error) => res.status(400).json({ error: error.message }));
};
const signupOrg = async (req, res) => {
const { orgname, email, password } = req.body;
Org.signup(orgname, email, password)
.then((org) => {
const token = createToken(org._id);
res.status(201).json({
email,
token,
});
})
.catch((error) => res.status(400).json({ error: error.message }));
};
const loginOrg = async (req, res) => {
const { email, password } = req.body;
Org.login(email, password)
.then((org) => {
const token = createToken(org._id);
res.status(200).json({
email,
token,
});
})
.catch((error) => res.status(400).json({ error: error.message }));
};
const updateOrg = async (req, res) => {
const { email, password } = req.body;
Org.update(email, password)
.then((org) => {
res.status(200).json({
org,
});
})
22
.catch((error) => res.status(400).json({ error: error.message }));
};
const deleteOrg = async (req, res) => {
const { email } = req.body;
Org.findOneAndDelete({ email })
.then((org) => {
res.status(200).json({
org,
});
})
.catch((error) => res.status(400).json({ error: error.message }));
};
// update org accepted status
const updateOrgAcceptedStatus = async (req, res) => {
const { email } = req.body;
Org.findOne({ email })
.then((org) => {
org.accepted = !org.accepted;
org.save();
res.status(200).json({
org,
});
})
.catch((error) => res.status(400).json({ error: error.message }));
};
module.exports = {
signupOrg,
loginOrg,
updateOrg,
deleteOrg,
allOrgs,
getOrgById,
updateOrgAcceptedStatus,
myConferences,
};
uploadController.js:
const fs = require("fs");
const { google } = require("googleapis");
const { JWT } = require("google-auth-library");
const User = require("../models/user");
// authenticate with google
const authenticateGoogle = () => {
const auth = new google.auth.GoogleAuth({
keyFile: "../key-file.json",
scopes: "https://www.googleapis.com/auth/drive",
23
});
return auth;
};
const keyFile = require("../key-file.json");
const client = new JWT({
email: keyFile.client_email,
key: keyFile.private_key,
scopes: ["https://www.googleapis.com/auth/drive"],
});
const drive = google.drive({
version: "v3",
auth: authenticateGoogle(),
});
// upload to google drive
const uploadToGoogleDrive = async (file, auth) => {
const fileMetadata = {
name: file.originalname,
parents: ["1ADFpHcBEnWz632M913g xy8nuDO4fkz"], // Change it according to your
desired parent folder id
};
const media = {
mimeType: file.mimetype,
body: fs.createReadStream(file.path),
};
const response = await drive.files.create({
requestBody: fileMetadata,
media: media,
fields: "id",
});
return response;
};
const deleteFile = (filePath) => {
fs.unlink(filePath, () => {
console.log("file deleted");
});
};
const uploadPaper = async (req, res) => {
const { email, confid } = req.query;
console.log(email, confid);
const auth = authenticateGoogle();
const response = await uploadToGoogleDrive(req.file, auth);
deleteFile(req.file.path);
const user = await User.findOne({ email });
user.papers.push({
title: req.body.originalname,
fileUrl: response.data.id,
24
conference: confid,
});
console.log(response.data.id);
await user.save();
requireAuth.js:
const jwt = require("jsonwebtoken");
const User = require("../models/user");
const requireAuth = (req, res, next) => {
const { authorization } = req.headers;
if (!authorization) {
return res.status(401).send({ error: "You must be logged in." });
}
const token = authorization.replace("Bearer ", "");
jwt.verify(token, process.env.SECRET_KEY, async (err, payload) => {
if (err) {
25
return res.status(401).send({ error: "You must be logged in." });
}
const { _id } = payload;
req.user = await User.findOne({ _id }).select("_id"); // adding req.user to the request object
await next();
});
};
module.exports = requireAuth;
conferenceRoutes.js:
const express = require("express");
const conferenceController = require("../controllers/conferenceController.js");
const router = express.Router();
const {
createConference,
getAllConferences,
getConferenceById,
editConference,
deleteConference,
conferenceRegistration
, cancelRegistration,
viewConference,
removeUserFromConferences, // call when user is deleted
removeConferencesOfOrg, // call when org is deleted
} = require("../controllers/conferenceController");
const requireAuth = require("../middlewares/requireAuth");
router.post("/create", createConference);
router.get("/all", getAllConferences);
router.get("/:id", getConferenceById);
router.patch("/register/:id", conferenceRegistration);
router.patch("/cancelRegistration/:id", cancelRegistration);
router.get("/get", viewConference);
router.patch("/edit", editConference);
router.delete("/delete/:id", deleteConference);
router.patch("/removeUser", removeUserFromConferences);
router.delete("/remove-conferences-of-Org",removeConferencesOfOrg);
module.exports = router;
orgRoutes.js:
const express = require("express");
const router = express.Router();
const {
loginOrg,
signupOrg,
updateOrg,
deleteOrg,
26
allOrgs,
getOrgById,
updateOrgAcceptedStatus,
myConferences,
} = require("../controllers/orgController");
router.get("/", allOrgs);
router.get("/:emailid", getOrgById);
router.get("/:id/myConferences", myConferences);
router.post("/signup", signupOrg);
router.post("/login", loginOrg);
router.patch("/update", updateOrg);
router.delete("/delete", deleteOrg);
router.patch("/update/accepted", updateOrgAcceptedStatus);
module.exports = router;
uploadRoutes.js:
const express = require("express");
const router = express.Router();
const Multer = require("multer");
const { uploadPaper, getPaper } = require("../controllers/uploadController");
const multer = Multer({
storage: Multer.diskStorage({
destination: function (req, file, callback) {
callback(null, `${ dirname}/../papers`);
},
filename: function (req, file, callback) {
callback(
null,
file.fieldname + "_" + Date.now() + "_" + file.originalname
);
},
}),
limits: {
fileSize: 5 * 1024 * 1024,
},
});
roter.get("/paper", getPaper);
// router.use(multer.single("file"));
router.post("/paper", multer.single("file"), uploadPaper);
module.exports = router;
userRoutes.js:
const express = require("express");
const router = express.Router();
const {
loginUser,
27
signupUser,
updateUser,
updateUserProfile,
deleteUser,
getAllUsers,
getUserById,
uploadProfilePicture,
getProfilePic,
removeProfilePic,
uploadPaper,
} = require("../controllers/userController");
router.get("/", getAllUsers);
router.get("/:id", getUserById);
router.post("/signup", signupUser);
router.post("/login", loginUser);
router.patch("/update", updateUser);
router.patch("/updateProfile/:id", updateUserProfile);
router.patch("/upload-pic", uploadProfilePicture);
router.delete("/delete", deleteUser);
router.get("/show-pic/:id", getProfilePic);
router.patch("/remove-pic/:id", removeProfilePic);
router.post("/uploads/:id", uploadPaper);
module.exports = router;
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + React</title>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"
/>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>
AdminNavbar.jsx:
import React, { useState } from "react";
28
import "../assets/CSS/style.css";
// Bootstrap CSS
import "bootstrap/dist/css/bootstrap.min.css";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faSearch, faSignOut } from "@fortawesome/free-solid-svg-icons";
import $ from "jquery";
import { Link } from "react-router-dom";
import { useAuthContext } from "../hooks/useAuthContext";
import { useLogout } from "../hooks/useLogout";
const AdminNavbar = () => {
const { logout } = useLogout();
const { user } = useAuthContext();
const handleClick = () => {
logout();
};
return (
<>
<nav className="global-nav-bar admin-nav">
<Link onClick={handleClick} className="admin-nav-right-logout-span">
<div
className="admin-nav-right-logout-span"
style={{ cursor: "pointer" }}
onClick={handleClick}
>
<FontAwesomeIcon icon={faSignOut} style={{}} />
<p className="admin-nav-right-logout-span-txt" style={{ padding: "0", margin: "0",
marginLeft: "5px" }}>
LOGOUT
</p>
</div>
</Link>
</nav>
</>
);
};
export default AdminNavbar;
Footer.jsx:
import React from "react";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import {
faHouse,
faEnvelope,
faPhone,
} from "@fortawesome/free-solid-svg-icons";
import { Link } from "react-router-dom";
29
const Footer = () => {
const handleGoToTop = () => {
window.scrollTo({ top: 0, behavior: "smooth" });
};
return (
<>
<footer className="text-center text-lg-start text-black">
<div className="container p-4 pb-0">
<section className="">
<div className="row">
<div className="col-md-3 col-lg-3 col-xl-3 mx-auto mt-3">
<h4 className="text-uppercase mb-4">
Conference Management Site
</h4>
<p>
Lorem ipsum dolor sit amet consectetur, adipisicing elit.
Corrupti, harum. A illo hic cumque. Animi, exercitationem est.
Ipsum, similique officia.
</p>
</div>
<hr className="w-100 clearfix d-md-none" />
<div className="col-md-2 col-lg-2 col-xl-2 mx-auto mt-3">
<h5 className="text-uppercase mb-4">
<b>Sections</b>
</h5>
<p>
<Link className="text-black" onClick={handleGoToTop}>
Back To Top
</Link>
</p>
<p>
<Link className="text-black" to="/privacy-policy">
Privacy Policy
</Link>
</p>
{/* <p>
<a className="text-black" href="#organizations">Organizations</a>
</p> */}
</div>
<hr className="w-100 clearfix d-md-none" />
<div className="col-md-4 col-lg-3 col-xl-3 mx-auto mt-3">
<h5 className="text-uppercase mb-4 mx-3">
<b>Contact</b>
</h5>
<p>
<FontAwesomeIcon
30
icon={faHouse}
className="mx-3 text-secondary"
/>
Gandhinagar, Gujarat, India
</p>
<p>
<FontAwesomeIcon
icon={faEnvelope}
className="mx-3 text-secondary"
/>{" "}
[email protected]
</p>
<p>
<FontAwesomeIcon
icon={faPhone}
className="mx-3 text-secondary"
/>{" "}
+ 279 234 567 88
</p>
</div>
</div>
</section>
</div>
</footer>
</>
);
};
export default Footer;
App.jsx:
import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom";
import { useAuthContext } from "./hooks/useAuthContext";
import Home from "./pages/Home";
import HomeConf from "./pages/HomeConf";
import Login from "./pages/Login";
import Signup from "./pages/Signup";
import PasswordReset from "./pages/PasswordReset";
import AdminLogin from "./pages/AdminLogin";
import AdminDashboard from "./pages/AdminDashboard";
import OrgLogin from "./pages/OrgLogin";
import OrgSignup from "./pages/OrgSignup";
import OrgDashboard from "./pages/OrgDashboard";
import UserDashboard from "./pages/UserDashboard";
import Choice from "./pages/choice";
import UserProfile from "./pages/UserProfile";
import OrgProfile from "./pages/OrgProfile";
31
import TestUpload from "./pages/TestUpload";
import CallForPaper from "./pages/CallForPaper";
import Error from "./pages/Error";
import Privacy from "./pages/privacy";
import Papers from "./pages/Papers";
function App() {
const { user, org } = useAuthContext(); // will be used to provide functionality of private routes
return (
<>
<BrowserRouter>
<Routes>
{/* admin routes */}
<Route
element={
!user || user.user.role !== "admin" ? (
<AdminLogin />
):(
<Navigate to="/admin/dashboard" />
)
}
path="/admin/login"
/>
<Route
element={
user && user.user.role === "admin" ? (
<AdminDashboard />
):(
<Navigate to="/admin/login" />
)
}
path="/admin/dashboard"
/>
{/* general routes */}
{/* public routes */}
<Route element={<Home />} path="/" />
<Route
element={!user && !org ? <Choice /> : <Navigate to="/" />}
path="/choice"
/>
<Route
element={!user ? <Login /> : <Navigate to="/" />}
path="/login"
/>
<Route
element={!user ? <Signup /> : <Navigate to="/" />}
path="/signup"
32
/>
<Route
element={org ? <OrgDashboard /> : <Navigate to="/choise" />}
path="org-dashboard"
/>
<Route
element={!org ? <OrgLogin /> : <Navigate to="/" />}
path="/org-login"
/>
<Route
element={!org ? <OrgSignup /> : <Navigate to="/" />}
path="/org-signup"
/>
<Route
element={org ? <OrgDashboard /> : <Navigate to="/choice" />}
path="/dashboard"
/>
<Route
element={
user ? (
<UserProfile />
) : org ? (
<OrgProfile />
):(
<Navigate to="/choice" />
)
}
path="/profile"
/>
<Route element={<PasswordReset />} path="/password-reset" />
<Route element={<Privacy />} path="/privacy-policy" />
<Route element={<TestUpload />} path="test-upload" />
<Route element={<HomeConf />} path="/conferences" />
<Route
element={
user && user.user.role === "publisher" ? (
<CallForPaper />
):(
<Navigate to="/choice" />
)
}
path="/call-for-paper"
/>
<Route element={<Papers />} path="/conference/papers" />
<Route element={<Error />} path="*" />
</Routes>
33
</BrowserRouter>
</>
);
}
export default App;
index.css:
*{
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: "Open Sans", sans-serif !important;
}
body {
min-height: 100vh;
}
a{
text-decoration: none;
}
.container-fluid {
margin: 0 !important;
overflow: hidden !important;
}
Main.jsx:
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import { AuthContextProvider } from "./context/AuthContext";
import './index.css'
ReactDOM.createRoot(document.getElementById("root")).render(
<React.StrictMode>
<AuthContextProvider>
<App />
</AuthContextProvider>
</React.StrictMode>
);
34
4.2 TEST CASES
5. EXPERIMENTAL RESULTS
The developed Conference Management System was deployed and tested in a local
server environment using XAMPP. It effectively supported key functionalities such as
user registration, session scheduling, speaker management, and attendee interactions.
● User Registration: Users were able to register securely and create
personalized profiles.
● Session Scheduling: Admins could create, manage, and schedule
conference sessions and track attendee participation.
● Speaker Management: Speakers were able to submit their abstracts, update session
details, and interact with the admin.
● Attendee Interaction: Attendees could browse sessions, register for specific
talks, and receive notifications about their upcoming sessions.
● Data Consistency: All user, session, and speaker data was stored consistently
across the system, ensuring seamless functionality.
● Usability and Responsiveness: The system was tested across various devices
and browsers (Chrome, Firefox), confirming that it was fully responsive and
user- friendly.
35
The system was validated in terms of functionality, usability, and performance, and it met
the expected objectives for conference management.
36
37
38
39
40
41
42
43
44
45
46
6. CONCLUSION
REFERENCES
48