University Laboratory Management System with Vue.js and Spring Boot
Laboratory Category Management
This component enables administrators to classify and manage various types of laboratories. By grouping labs into categories, it facilitates unified management, maintenance, and policy application. For instance, safety protocols and staff qualifications can be standardized across similar lab types, enhancing operational efficiency. This module also aids in comparative analysis and long-term strategic planning for lab resources.
Laboratory Asset Registry
The asset registry provides a comprehensive system to cataloging all items within a laboratory, including equipment, instruments, and documentation. It supports registration, querying, and statistical analysis of assets. This ensures accurate tracking of item locations, custodians, and usage status, there by preventing loss and promoting accountability. Standardized procedures established here contribute to overall lab menagement quality.
Experiment Administration
This module streamlines the management of experimental resources such as devices, reagents, and literature. It offers functionalities for resource reservation, borrowing, and returns. Additionally, it monitors environmental conditions and safety compliance to mitigate risks. The system logs experimental procedures, results, and analyses, providing valuable data for research and educational purposes. It also assists in scheduling experiments based on curriculum and student needs.
Equipment Inventory Control
Focused on the lifecycle of lab equipment, this module handles information logging, usage statistics, and maintenance scheduling. It helps identify underutilized assets to improve investment returns. Users can check equipment availability, location, and condition, reducing delays caused by unavailability or malfunction. Maintenance records ensure timely servicing, extending equipment lifespan and preventing accidents.
Experiment Session Scheduling
This component manages student participation in experiments by creating and tracking session bookings. It functions as a testing ground for order processing logic, ensuring reliability and security. The module validates booking requests, assigns time slots, and processes reservations, contributing to efficient lab utilization. Data collected from bookings can inform future optimizations.
Sample Code
Paginated Equipment Query
@GetMapping("/fetchGears")
@Operation(summary = "Retrieve lab equipment with pagination")
public ResponseEntity<PageResponse<LabGear>> fetchGears(
@ModelAttribute LabGear gearFilter,
@ModelAttribute PaginationRequest pagination) {
Specification<LabGear> spec = (root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
if (StringUtils.hasText(gearFilter.getName())) {
predicates.add(cb.like(root.get("name"), "%" + gearFilter.getName() + "%"));
}
if (gearFilter.getLabRoomId() != null) {
predicates.add(cb.equal(root.get("labRoomId"), gearFilter.getLabRoomId()));
}
return cb.and(predicates.toArray(new Predicate[0]));
};
Page<LabGear> gearPage = labGearRepository.findAll(spec,
PageRequest.of(pagination.getPage(), pagination.getSize()));
PageResponse<LabGear> response = new PageResponse<>(gearPage);
return ResponseEntity.ok(response);
}
Generate Experiment Time Slots
@GetMapping("/generateSlots")
@Operation(summary = "Generate experiment time slots")
public ResponseEntity<String> generateSlots(
@RequestParam String roomId,
@RequestParam String procedureId,
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date,
@RequestParam String timeBlock,
@RequestParam int slotCount,
@RequestParam BigDecimal fee) {
LabRoom room = labRoomService.findById(roomId)
.orElseThrow(() -> new EntityNotFoundException("Lab room not found"));
LabProcedure procedure = labProcedureService.findById(procedureId)
.orElseThrow(() -> new EntityNotFoundException("Procedure not found"));
for (int i = 1; i <= slotCount; i++) {
LabSessionBooking slot = new LabSessionBooking();
slot.setLabRoom(room);
slot.setProcedure(procedure);
slot.setSessionDate(date);
slot.setTimeBlock(timeBlock);
slot.setSlotNumber(i);
slot.setFee(fee);
slot.setBooked(false);
labSessionBookingRepository.save(slot);
}
return ResponseEntity.ok("Slots generated successfully");
}
Book an Experiment Slot
@PostMapping("/bookSlot")
@Operation(summary = "Book an experiment slot")
public ResponseEntity<String> bookSlot(@RequestParam String slotId) {
UserAccount currentUser = securityContext.getCurrentUser();
LabSessionBooking slot = labSessionBookingRepository.findById(slotId)
.orElseThrow(() -> new EntityNotFoundException("Booking slot not found"));
if (slot.isBooked()) {
return ResponseEntity.badRequest().body("Slot already booked");
}
slot.setBooked(true);
slot.setBookedAt(LocalDateTime.now());
slot.setUser(currentUser);
labSessionBookingRepository.save(slot);
return ResponseEntity.ok("Slot booked successfully");
}