Laptop Management
Laptop Management
This system can be used by organizations to manage their inventory of laptops, track
assignments to employees, and schedule maintenance.
Project Features
User Roles
1. Admin: Manage laptops, assign laptops to employees, track status, and view
reports.
2. Employee: View assigned laptops, request new laptops, or report issues.
Core Features
Frontend Tasks
1. Admin Dashboard:
○ Overview cards for:
■ Total laptops.
■ Assigned laptops.
■ Available laptops.
■ Laptops under maintenance.
○ Manage Laptops:
■ Add a new laptop with details (e.g., brand, model, serial number,
purchase date).
■ Update or delete existing laptops.
○ Employee Assignment:
■ Assign laptops to employees (search employees by name/email).
■ Reassign or unassign laptops.
■
2.Employee Portal:
● View assigned laptop details (brand, model, serial number, condition).
● Request a new laptop (form submission).
● Report an issue (with description and priority level).
Backend Tasks
Evaluation Criteria
Technologies Used:
• Frontend: React, HTML, CSS
• Backend: Java (Spring Boot)
• Database: MySQL
• Other Tools: Postman (for API testing)
Frontend (React) communicates with the Backend (Java Spring Boot) using
RESTful APIs. Communicates with the backend using HTTP requests (GET, POST,
PUT, DELETE).
Backend (Java Spring Boot) interacts with a MySQL database to store laptop
and employee information. Receives requests, processes business logic, and
interacts with the database. Stores laptop and employee data.
Data Flow:
• React sends requests to Spring Boot backend.
• Spring Boot processes these requests and interacts with the database.
• Responses are sent back to React, which displays them on the user interface.
Interfaces of the Application:
Admin Dashboard:
Manage Laptops:
Assign Laptop:
Employee Portal:
Backend Code
Controller:
AssignmentController.java
package com.laptopmanagementsystem.laptopmanagementsystem.Controller;
import com.laptopmanagementsystem.laptopmanagementsystem.Entity.Assignment;
import
com.laptopmanagementsystem.laptopmanagementsystem.Repository.AssignmentRepository;
import com.laptopmanagementsystem.laptopmanagementsystem.Repository.EmployeeRepository;
import com.laptopmanagementsystem.laptopmanagementsystem.Repository.LaptopRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.List;
@RestController
@RequestMapping("/api/assignments")
public class AssignmentController {
@Autowired
private AssignmentRepository assignmentRepository;
@Autowired
private LaptopRepository laptopRepository;
@Autowired
private EmployeeRepository employeeRepository;
@PostMapping
public ResponseEntity<Assignment> assignLaptop(@RequestParam Long laptopId,
@RequestParam Long employeeId) {
return laptopRepository.findById(laptopId)
.flatMap(laptop -> employeeRepository.findById(employeeId)
.map(employee -> {
Assignment assignment = new Assignment();
assignment.setLaptop(laptop);
assignment.setEmployee(employee);
assignment.setAssignedAt(LocalDateTime.now()); // Ensure this method is
available
return ResponseEntity.ok(assignmentRepository.save(assignment));
}))
.orElse(ResponseEntity.notFound().build());
}
}
EmployeeController.java
package com.laptopmanagementsystem.laptopmanagementsystem.Controller;
import com.laptopmanagementsystem.laptopmanagementsystem.Entity.Employee;
import com.laptopmanagementsystem.laptopmanagementsystem.Repository.EmployeeRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/employees")
public class EmployeeController {
@Autowired
private EmployeeRepository employeeRepository;
@GetMapping
public ResponseEntity<List<Employee>> getAllEmployees() {
return ResponseEntity.ok(employeeRepository.findAll());
}
@PostMapping
public ResponseEntity<Employee> addEmployee(@RequestBody Employee employee) {
return ResponseEntity.ok(employeeRepository.save(employee));
}
@GetMapping("/{id}")
public ResponseEntity<Employee> getEmployeeById(@PathVariable Long id) {
return employeeRepository.findById(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
@PutMapping("/{id}")
public ResponseEntity<Employee> updateEmployee(@PathVariable Long id, @RequestBody
Employee updatedEmployee) {
return employeeRepository.findById(id)
.map(employee -> {
employee.setName(updatedEmployee.getName());
employee.setEmail(updatedEmployee.getEmail());
employee.setDepartment(updatedEmployee.getDepartment());
return ResponseEntity.ok(employeeRepository.save(employee));
}).orElse(ResponseEntity.notFound().build());
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteEmployee(@PathVariable Long id) {
employeeRepository.deleteById(id);
return ResponseEntity.noContent().build();
}
}
IssueController.java
package com.laptopmanagementsystem.laptopmanagementsystem.Controller;
import com.laptopmanagementsystem.laptopmanagementsystem.Entity.Issue;
import com.laptopmanagementsystem.laptopmanagementsystem.Repository.IssueRepository;
import com.laptopmanagementsystem.laptopmanagementsystem.Repository.LaptopRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.List;
@RestController
@RequestMapping("/api/issues")
public class IssueController {
@Autowired
private IssueRepository issueRepository;
@Autowired
private LaptopRepository laptopRepository;
@PostMapping
public ResponseEntity<Issue> reportIssue(@RequestParam Long laptopId, @RequestBody Issue
issue) {
return laptopRepository.findById(laptopId)
.map(laptop -> {
issue.setLaptop(laptop);
issue.setStatus(Issue.Status.OPEN);
issue.setReportedAt(LocalDateTime.now());
return ResponseEntity.ok(issueRepository.save(issue));
}).orElse(ResponseEntity.notFound().build());
}
@GetMapping
public ResponseEntity<List<Issue>> getAllIssues() {
return ResponseEntity.ok(issueRepository.findAll());
}
@GetMapping("/laptop/{laptopId}")
public ResponseEntity<List<Issue>> getIssuesByLaptop(@PathVariable Long laptopId) {
return ResponseEntity.ok(issueRepository.findByLaptopId(laptopId));
}
@PutMapping("/{id}/status")
public ResponseEntity<Issue> updateIssueStatus(@PathVariable Long id, @RequestBody
Issue.Status status) {
return issueRepository.findById(id)
.map(issue -> {
issue.setStatus(status);
return ResponseEntity.ok(issueRepository.save(issue));
}).orElse(ResponseEntity.notFound().build());
}
}
LaptopController.java
package com.laptopmanagementsystem.laptopmanagementsystem.Controller;
import com.laptopmanagementsystem.laptopmanagementsystem.Entity.Laptop;
import com.laptopmanagementsystem.laptopmanagementsystem.Repository.LaptopRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/laptops")
public class LaptopController {
@Autowired
private LaptopRepository laptopRepository;
@PostMapping
public ResponseEntity<Laptop> addLaptop(@RequestBody Laptop laptop) {
return ResponseEntity.ok(laptopRepository.save(laptop));
}
@GetMapping
public ResponseEntity<List<Laptop>> getAllLaptops() {
return ResponseEntity.ok(laptopRepository.findAll());
}
@PutMapping("/{id}")
public ResponseEntity<Laptop> updateLaptop(@PathVariable Long id, @RequestBody Laptop
updatedLaptop) {
return laptopRepository.findById(id)
.map(laptop -> {
laptop.setBrand(updatedLaptop.getBrand());
laptop.setModel(updatedLaptop.getModel());
laptop.setSerialNumber(updatedLaptop.getSerialNumber());
laptop.setStatus(updatedLaptop.getStatus());
laptop.setPurchaseDate(updatedLaptop.getPurchaseDate());
return ResponseEntity.ok(laptopRepository.save(laptop));
}).orElse(ResponseEntity.notFound().build());
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteLaptop(@PathVariable Long id) {
laptopRepository.deleteById(id);
return ResponseEntity.noContent().build();
}
}
MaintanceController.java
package com.laptopmanagementsystem.laptopmanagementsystem.Controller;
import com.laptopmanagementsystem.laptopmanagementsystem.Entity.Maintenance;
import com.laptopmanagementsystem.laptopmanagementsystem.Repository.LaptopRepository;
import
com.laptopmanagementsystem.laptopmanagementsystem.Repository.MaintenanceRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.List;
@RestController
@RequestMapping("/api/maintenance")
public class MaintenanceController {
@Autowired
private MaintenanceRepository maintenanceRepository;
@Autowired
private LaptopRepository laptopRepository;
Entity:
Assignment.java
package com.laptopmanagementsystem.laptopmanagementsystem.Entity;
import jakarta.persistence.*;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import java.time.LocalDateTime;
@Data
@NoArgsConstructor
@RequiredArgsConstructor
@Entity
@Table(name = "assignments")
public class Assignment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "laptop_id", nullable = false)
private Laptop laptop;
@ManyToOne
@JoinColumn(name = "employee_id", nullable = false)
private Employee employee;
Employee.java
package com.laptopmanagementsystem.laptopmanagementsystem.Entity;
import jakarta.persistence.*;
import lombok.Data;
@Data
@Entity
@Table(name = "employees")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
Issue.java
package com.laptopmanagementsystem.laptopmanagementsystem.Entity;
import com.laptopmanagementsystem.laptopmanagementsystem.Entity.Laptop;
import jakarta.persistence.*;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@Entity
@Table(name = "issues")
public class Issue {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "laptop_id", nullable = false)
private Laptop laptop;
@Enumerated(EnumType.STRING)
private Priority priority; // ENUM: LOW, MEDIUM, HIGH
@Enumerated(EnumType.STRING)
private Status status; // ENUM: OPEN, IN_PROGRESS, RESOLVED
Laptop.java
package com.laptopmanagementsystem.laptopmanagementsystem.Entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.persistence.*;
import lombok.Data;
import java.time.LocalDate;
@Data
@Entity
@Table(name = "laptops")
public class Laptop {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Enumerated(EnumType.STRING)
private Status status; // ENUM: AVAILABLE, ASSIGNED, MAINTENANCE
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm a z")
private LocalDate purchaseDate;
Maintenance.java
package com.laptopmanagementsystem.laptopmanagementsystem.Entity;
import jakarta.persistence.*;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@Entity
@Table(name = "maintenance")
public class Maintenance {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "laptop_id", nullable = false)
private Laptop laptop;
@Enumerated(EnumType.STRING)
private Status status; // ENUM: PENDING, COMPLETED
Repository:
AssignmentRepository.java
package com.laptopmanagementsystem.laptopmanagementsystem.Repository;
import com.laptopmanagementsystem.laptopmanagementsystem.Entity.Assignment;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
EmployeeRepository.java
package com.laptopmanagementsystem.laptopmanagementsystem.Repository;
import com.laptopmanagementsystem.laptopmanagementsystem.Entity.Employee;
import org.springframework.data.jpa.repository.JpaRepository;
IssueRepository.java
package com.laptopmanagementsystem.laptopmanagementsystem.Repository;
import com.laptopmanagementsystem.laptopmanagementsystem.Entity.Issue;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
LaptopRepository.java
package com.laptopmanagementsystem.laptopmanagementsystem.Repository;
import com.laptopmanagementsystem.laptopmanagementsystem.Entity.Laptop;
import org.springframework.data.jpa.repository.JpaRepository;
LaptopManagenmentSystemApplication.java
package com.laptopmanagementsystem.laptopmanagementsystem;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class LaptopmanagementsystemApplication {
SpringApplication.run(LaptopmanagementsystemApplication.class, args);
}
}
Frontend Code:
AssignLaptops.jsx
useEffect(() => {
const loadEmployees = async () => {
try {
const response = await fetch("http://localhost:8080/api/employees");
if (!response.ok) {
throw new Error("Failed to fetch employees");
}
const data = await response.json();
setEmployees(data);
} catch (error) {
console.error("Error fetching employees:", error);
}
};
loadEmployees();
}, []);
if (!response.ok) {
throw new Error("Failed to assign laptop");
}
return (
<div className="assign-laptops">
<h1>Assign Laptop</h1>
<select onChange={(e) => setSelectedEmployee(e.target.value)}>
<option value="">Select Employee</option>
{employees.map((employee) => (
<option key={employee.id} value={employee.id}>
{employee.name}
</option>
))}
</select>
<input
type="text"
placeholder="Laptop ID"
onChange={(e) => setLaptopId(e.target.value)}
/>
<button onClick={handleAssignLaptop}>Assign</button>
</div>
);
};
Dashboard.jsx
useEffect(() => {
const loadOverview = async () => {
try {
const response = await fetch("http://localhost:8080/api/overview");
if (!response.ok) {
throw new Error("Failed to fetch overview data");
}
const data = await response.json();
setOverview(data);
} catch (error) {
console.error("Error fetching overview:", error);
}
};
loadOverview();
}, []);
return (
<div className="dashboard">
<h1>Admin Dashboard</h1>
<div className="cards">
<div className="card">Total Laptops: {overview.total}</div>
<div className="card">Assigned Laptops: {overview.assigned}</div>
<div className="card">Available Laptops: {overview.available}</div>
<div className="card">Under Maintenance: {overview.maintenance}</div>
</div>
</div>
);
};
EmployeePortal.jsx
useEffect(() => {
const loadLaptop = async () => {
try {
const response = await fetch("http://localhost:8080/api/employee/laptop");
if (!response.ok) {
throw new Error("Failed to fetch assigned laptop");
}
const data = await response.json();
setLaptop(data);
} catch (error) {
console.error("Error fetching laptop:", error);
}
};
loadLaptop();
}, []);
if (!response.ok) {
throw new Error("Failed to report issue");
}
return (
<div className="employee-portal">
<h1>Employee Portal</h1>
<h2>Your Assigned Laptop</h2>
{laptop ? (
<div>
<p>Brand: {laptop.brand}</p>
<p>Model: {laptop.model}</p>
<p>Condition: {laptop.status}</p>
</div>
):(
<p>No laptop assigned yet.</p>
)}
<h2>Report Issue</h2>
<textarea
placeholder="Describe the issue"
onChange={(e) => setIssue({ ...issue, description: e.target.value })}
/>
<select onChange={(e) => setIssue({ ...issue, priority: e.target.value })}>
<option value="Low">Low</option>
<option value="Medium">Medium</option>
<option value="High">High</option>
</select>
<button onClick={handleReportIssue}>Submit</button>
</div>
);
};
export default EmployeePortal;
ManageLaptops.jsx
useEffect(() => {
loadLaptops();
}, []);
setNewLaptop({ brand: "", model: "", serialNumber: "", purchaseDate: "" });
alert("Laptop added successfully!");
loadLaptops(); // Reload the laptops list
} catch (error) {
console.error("Error adding laptop:", error);
}
};
return (
<div className="manage-laptops">
<h1>Manage Laptops</h1>
<div className="add-laptop-form">
<h2>Add New Laptop</h2>
<input
type="text"
placeholder="Brand"
value={newLaptop.brand}
onChange={(e) => setNewLaptop({ ...newLaptop, brand: e.target.value })}
/>
<input
type="text"
placeholder="Model"
value={newLaptop.model}
onChange={(e) => setNewLaptop({ ...newLaptop, model: e.target.value })}
/>
<input
type="text"
placeholder="Serial Number"
value={newLaptop.serialNumber}
onChange={(e) =>
setNewLaptop({ ...newLaptop, serialNumber: e.target.value })
}
/>
<input
type="date"
value={newLaptop.purchaseDate}
onChange={(e) =>
setNewLaptop({ ...newLaptop, purchaseDate: e.target.value })
}
/>
<button onClick={handleAddLaptop}>Add Laptop</button>
</div>
</div>
);
};
App.js
function App() {
return (
<Router>
<div className="app-container">
<header className="app-header">
<h1>Laptop Management System</h1>
<nav className="app-nav">
<Link to="/">Dashboard</Link>
<Link to="/manage-laptops">Manage Laptops</Link>
<Link to="/assign-laptops">Assign Laptops</Link>
<Link to="/employee-portal">Employee Portal</Link>
</nav>
</header>
<main className="app-main">
<Routes>
<Route path="/" element={<Dashboard />} />
<Route path="/manage-laptops" element={<ManageLaptops />} />
<Route path="/assign-laptops" element={<AssignLaptops />} />
<Route path="/employee-portal" element={<EmployeePortal />} />
</Routes>
</main>
<footer className="app-footer">
<p>© 2024 Laptop Management System</p>
</footer>
</div>
</Router>
);
}