System Overview
Urban vehicle density has surged, creating significant challenges in locating available parking. Drivers often waste considerable time circling blocks to find a spot. This parking management application addresses the issue by providing real-time visibility into parking availability, enabling drivers to quickly identify and secure vacant spaces.
Client Features: Dashboard, space search, space reservation, user profile, booking history, and feedback management.
Administrator Features: Announcement management, parking space administration, reservation oversight, loyalty point configuration, complaint handling, and system settings.
Technical Architecture
- Frontend: HTML, CSS, JavaScript, jQuery, Layui
- Backend: Spring, MyBatis, Apache Shiro, Thymeleaf
- Database: MySQL 5.7 / 8.0
- Build Tool: Maven 3.x
- Runtime Environment: JDK 1.8, Apache Tomcat (7.x / 8.x / 9.x)
Deployment Guide
- Initialize a MySQL database corresponding to the project schema and execute the provided SQL script to import the tables.
- Import the Maven project into your IDE (IntelliJ IDEA recommended, though Eclipse or MyEclipse are compatible).
- Locate the configuration properties file (e.g.,
config.properties) and update the JDBC connection parameters (URL, username, password) to match your local database environment. - Build the project with Maven, deploy it to your Tomcat server, and launch the application.
Core Implementation
SpotController
Handles parking spot discovery, filtering, and the reservation workflow, including dynamic pricing based on user loyalty points.
package com.parking.controller;
import com.parking.entity.ParkingSpot;
import com.parking.entity.Reservation;
import com.parking.entity.Member;
import com.parking.service.SpotService;
import com.parking.service.ReservationService;
import com.parking.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpSession;
import java.util.List;
@Controller
@RequestMapping("/spots")
public class SpotController {
@Autowired
private SpotService spotService;
@Autowired
private ReservationService reservationService;
@Autowired
private MemberService memberService;
@GetMapping("/available")
public String listAvailableSpots(Model model) {
List<ParkingSpot> spots = spotService.fetchAllSpots();
model.addAttribute("spotData", spots);
model.addAttribute("totalSpots", spots.size());
return "spot-listing";
}
@PostMapping("/filter")
public String filterSpots(@RequestParam("state") int state, Model model) {
model.addAttribute("currentState", state);
if (state == -1) {
model.addAttribute("spotData", spotService.fetchAllSpots());
} else {
List<ParkingSpot> filteredSpots = spotService.fetchByState(state);
model.addAttribute("spotData", filteredSpots);
model.addAttribute("totalSpots", filteredSpots.size());
}
return "spot-listing";
}
@GetMapping("/view/{id}")
public String viewSpotDetails(@PathVariable("id") int spotId, Model model) {
ParkingSpot spot = spotService.findSpotById(spotId);
model.addAttribute("spotInfo", spot);
return "spot-detail";
}
@PostMapping("/book/{id}")
public String bookSpot(HttpSession session, @PathVariable("id") int spotId) {
ParkingSpot spot = spotService.findSpotById(spotId);
Member member = (Member) session.getAttribute("activeUser");
int loyaltyPoints = member.getLoyaltyPoints();
spot.setOccupied(true);
if (spotService.modifySpotState(spot)) {
Reservation res = new Reservation();
res.setMemberId(member.getId());
res.setSpotId(spotId);
double basePrice = spot.getRate();
if (loyaltyPoints >= 500) {
res.setAmount(basePrice * 0.7);
} else if (loyaltyPoints >= 300) {
res.setAmount(basePrice * 0.8);
} else if (loyaltyPoints >= 100) {
res.setAmount(basePrice * 0.9);
} else {
res.setAmount(basePrice);
}
if (reservationService.createReservation(res)) {
member.setLoyaltyPoints(loyaltyPoints + 10);
memberService.updateMemberPoints(member);
}
}
return "redirect:/reservations/history";
}
}
FeedbackController
Manages user feedback submissions, allowing members to post inquiries or complaints and review their previous messages.
package com.parking.controller;
import com.parking.entity.Feedback;
import com.parking.entity.Member;
import com.parking.service.FeedbackService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpSession;
import java.util.List;
@Controller
@RequestMapping("/feedback")
public class FeedbackController {
@Autowired
private FeedbackService feedbackService;
@PostMapping("/submit")
public String submitFeedback(HttpSession session, @ModelAttribute("feedbackForm") Feedback feedback, Model model) {
Member member = (Member) session.getAttribute("activeUser");
feedback.setMemberId(member.getId());
feedback.setMemberName(member.getUsername());
feedbackService.saveFeedback(feedback);
List<Feedback> history = feedbackService.fetchByMemberId(member.getId());
model.addAttribute("feedbackList", history);
return "user-feedback";
}
@GetMapping("/remove/{id}")
public String removeFeedback(HttpSession session, @PathVariable("id") int feedbackId, Model model) {
feedbackService.deleteFeedback(feedbackId);
Member member = (Member) session.getAttribute("activeUser");
List<Feedback> history = feedbackService.fetchByMemberId(member.getId());
model.addAttribute("feedbackList", history);
return "user-feedback";
}
@GetMapping("/member/{id}")
public String viewMemberFeedback(@PathVariable("id") int memberId, Model model) {
List<Feedback> history = feedbackService.fetchByMemberId(memberId);
model.addAttribute("feedbackList", history);
return "user-feedback";
}
}