- 绪论:系统简介、设计目的以及设计内容等。
- 系统简介:
无人停车场自动管理系统是一种基于现代科技手段,实现停车场自动化、智能化管理的系统。该系统通过集成先进的计算机技术、物联网技术、自动化技术、人工智能等,实现对停车场内车辆的高效、安全、便捷管理,提高停车场的运营效率,提升了用户体验,为车主提供了更加便捷、高效的停车服务。
- 设计目的:
- 提高管理效率:减少人工干预,通过自动化和智能化手段提升管理效率。
- 优化资源利用:精确控制停车位的使用情况,避免资源浪费和拥堵。
- 提升用户体验:通过预约、导航等功能提升用户的停车体验和便利性。
- 降低运营成本:减少人力成本和能源消耗,提高运营效益和经济性。
- 增强安全保障:通过智能监控、车牌识别等技术手段,确保停车场内车辆和人员的安全,及时发现并处理异常情况。
- 设计内容:
- 车辆识别与进出管理:通过车牌识别、二维码识别等技术手段,实现车辆快速进出停车场,并记录车辆信息。
- 车位引导与分配:利用车位检测传感器和车位管理系统,实时掌握停车场内车位使用情况,引导车辆快速找到空闲车位。
- 自助缴费系统:支持多种支付方式(如现金、银行卡、移动支付等),实现用户自助缴费,减少人工收费环节。
- 智能监控系统:通过高清摄像头、红外传感器等设备,实时监控停车场内车辆和人员动态,确保停车场安全。
- 数据分析与决策支持:收集停车场运营数据,进行统计分析,为停车场管理提供决策支持,优化资源配置。
- 系统维护与升级:建立完善的系统维护和升级机制,确保系统稳定运行,并根据实际需求进行功能扩展和性能提升。
- 需求分析
- 系统目标
- 提高停车效率:通过智能化管理和实时数据分析,优化停车位的利用率,减少用户寻找停车位的时间。
- 降低管理成本:减少人工管理的需求,通过自动化系统减少运营成本和管理费用。
- 提升用户体验:通过便捷的预约、支付和导航功能,提升用户的停车体验和满意度。
- 系统结构
- 前端界面:包括用户交互界面,如车辆进出闸口、自助缴费终端、车位引导显示屏等,包括移动端App和Web端界面。
- 后端服务:处理业务逻辑和数据管理,包括车辆进出管理、停车位分配、费用计算、支付处理等核心功能。
- 数据库:存储系统所需的各类数据,包括用户信息、停车记录、支付信息等。
- 硬件设备:如车辆识别系统、自动闸机、传感器等,用于实现系统的自动化管理功能。
- 功能用例分析
用例一:车辆进入
用例名称: | 车辆进入 |
简要说明: | 系统通过车牌识别技术自动识别车辆,记录车辆信息,并引导车辆进入空闲车位。 |
前置条件: | 车牌识别系统正常运行。 停车场有足够的空闲车位。 车辆驶入车牌识别区域。 |
事件流: | 1.车辆驶入车牌识别区域。 2.车牌识别系统识别车牌并记录车辆信息。 3.系统查找空闲车位。 4.系统通过指示灯、显示屏或移动设备等方式引导车辆进入空闲车位。 |
正常结果: | 车辆信息被准确记录。 车辆顺利进入空闲车位。 |
异常结果: | 车牌识别失败,车辆信息无法记录。 无空闲车位,车辆无法进入。 |
用例二:停车位分配
用例名称: | 停车位分配 |
简要说明: | 系统根据车辆信息、车位使用情况和用户需求,自动分配空闲车位。 |
前置条件: | 停车场管理系统正常运行。 停车场存在空闲车位。 |
事件流: | 1.系统接收车辆进入请求。 2.系统检查车辆信息、车位使用情况和用户需求。 3.系统根据预设的分配策略自动分配空闲车位。 4.系统记录分配结果。 |
正常结果: | 空闲车位被成功分配。 分配结果被准确记录。 |
异常结果: | 无空闲车位可供分配。 分配过程中出现异常,导致车位分配失败。 |
用例三:费用计算
用例名称: | 费用计算 |
简要说明: | 根据停车时长和车辆类型计算停车费用。 |
前置条件: | 车辆已离开停车场。 车辆信息已被系统记录。 |
事件流: | 1.车辆离开停车场时,系统记录离开时间。 2.系统根据车辆进入和离开时间计算停车时长。 3.系统根据车辆类型和停车时长计算停车费用。 4.系统记录计算结果。 |
正常结果: | 停车费用被准确计算。 计算结果被记录以供后续查询和支付。 |
异常结果: | 停车时长计算错误,导致费用计算不准确。 车辆类型信息缺失或错误,导致费用计算错误。 |
用例四:支付功能
用例名称: | 支付功能 |
简要说明: | 支持多种支付方式,如现金、银行卡、移动支付等,实现用户自助缴费。 |
前置条件: | 用户已生成停车费用。 停车场支持多种支付方式。 |
事件流: | 1.用户选择支付方式(现金、银行卡、移动支付等)。 2.用户根据所选支付方式进行支付操作。 3.系统验证支付信息。 4.支付成功后,系统更新支付状态。 |
正常结果: | 用户成功支付停车费用。 支付状态被更新为已支付。 |
异常结果: | 支付信息验证失败,支付失败。 支付过程中出现异常,导致支付失败。 |
用例五:车位预约
用例名称: | 车位预约 |
简要说明: | 用户可以通过移动应用或网页端提前预约车位,避免到场后无车位可停的尴尬情况。如果有意外情况也可以取消预约。 |
前置条件: | 用户已注册并登录。停车场支持车位预约功能。停车场存在空闲车位可供预约。 |
事件流: | 1.用户选择预约时间和车位类型。 2.用户提交预约请求。 3.系统验证用户信息和车位可用性。 4.预约成功后,系统发送预约确认信息给用户。 5.用户如有需要,可以取消预约。 |
正常结果: | 车位预约成功。 用户收到预约确认信息。 |
异常结果: | 无空闲车位可供预约。 用户信息验证失败,预约失败。 预约过程中出现异常,导致预约失败。 |
用例六:数据查询
用例名称: | 数据查询 |
简要说明: | 用户可以通过系统查询自己的停车记录、费用明细等信息。 |
前置条件: | 用户已注册并登录。 |
事件流: | 1.用户选择查询类型(如停车记录、费用明细)。 2.用户输入查询条件(如车牌号、时间段)。 3.用户提交查询请求。 4.系统根据查询条件检索用户数据。 4.1 如果未找到相关数据,则显示无结果信息。 4.2 如果找到相关数据,则继续下一步。 5.系统展示查询结果给用户。 |
正常结果: | 用户成功查询到自己的停车记录、费用明细等信息。 |
异常结果: | 查询条件无效或格式错误,导致查询失败。 系统在查询过程中出现异常,导致查询失败。 |
用例七:报表与统计分析
用例名称: | 报表与统计分析 |
简要说明: | 系统统计停车场的使用情况和收入,并生成管理报表和分析报告。 |
前置条件: | 系统已收集足够的停车数据和收入数据。 |
事件流: | 1.系统定时(如每日、每周、每月)触发报表生成任务。 2.系统从数据库中检索停车数据和收入数据。 3.系统对数据进行聚合、计算和分析。 4.系统根据预设的报表模板生成管理报表和分析报告。 5.系统将生成的报表和报告存储到指定位置,并可供管理人员查看和下载。 |
正常结果: | 系统成功生成管理报表和分析报告。 管理人员能够查看和下载生成的报表和报告。 |
异常结果: | 数据检索过程中出现异常,导致报表生成失败。 报表模板缺失或损坏,导致报表生成失败。 生成的报表或报告格式错误或内容不准确。 |
- 性能需求
- 响应时间:系统应能在短时间内响应用户请求,如车辆识别、车位分配等操作的响应时间应控制在几秒内。
- 并发用户数:系统应能支持一定数量的并发用户同时操作,确保在高峰时段仍能保持良好的性能和稳定性。
- 数据准确性:系统应确保存储和传输的数据准确无误,避免数据丢
- 数据处理能力:快速准确地处理大量的车辆进出记录和支付信息。
- 失或错误导致的问题。
- 可扩展性:系统应具备良好的可扩展性,能够根据实际需求进行功能扩展和性能提升。
- 安全性:系统应保障数据的安全性,包括数据加密、用户权限控制等,防止数据泄露和非法访问。
- 系统分析
- 静态模型设计(类图)
Car
属性:
plateNumber , entranceTime , exitTime , isParked
方法:
enterParkingLot(), exitParkingLot(), calculateParkingFee()
ParkingLot
属性:
Lots, currentOccupancy
方法:
findAvailableSpace(), enterCar(), exitCar(), calculateTotalOccupancy()
ParkingSpace
属性:
spaceID, status, occupiedCar
方法:
Occupy(), release(), isAvailable()
User
属性:
userID, name, paymentInfo, cars
方法:
payForParking(), addCar(), removeCar()
PaymentDetails
属性:
paymentMethod, cardNumber, accountDetails
方法:
processPayment()
ParkingRate
属性:
ratePerHour, maxDailyRate
方法:
calculateFee()
NotificationService
属性:
Subscribers, notificationChannel
方法:
subscribe(), unsubscribe(), sendNotification()
关联关系:
Car 与 User:一个用户可以拥有多辆车,这是一个一对多的关联关系。
Car 与 ParkingSpace:一辆车在某一时刻可以占用一个停车位,这是一个一对一的临时关联关系。
User 与 PaymentDetails:一个用户可以有一个支付详情,用于支付停车费用,这是一个一对一的关联关系。
聚合关系:
ParkingLot 与 ParkingSpace:停车场由多个停车位成,这是一个聚合关系。
依赖关系:
ParkingLot 与 ParkingRate:停车场使用停车费率来计算停车费用,这是一种依赖关系。
- 动态模型设计(顺序图或协作图,活动图等)
用户进入停车场,停车场寻找一个空闲的停车位,并设置该停车位为被占用状态。
车辆停放在该停车位上,并开始计时。
一段时间后,用户离开停车场。
停车场将停车位设置为空闲状态。
停车场计算停车费用。
停车场从用户那里获取支付详情。
停车场处理支付,如果支付成功,则发送收据给用户。
- 系统设计
1. 体系结构设计
前端层:负责与用户进行交互,提供直观的用户界面(UI)。
业务逻辑层:处理用户请求,调用后端服务,执行业务逻辑,并将结果返回给前端。
数据访问层:负责与数据库进行交互,执行数据增删改查(CRUD)操作。
数据库层:存储系统所需的数据,确保数据的安全性和一致性。
各个模块之间的分工明确,前端层负责展示和接收数据,业务逻辑层负责处理业务逻辑和调用服务,数据访问层负责与数据库交互,数据库层负责数据存储。
2. 系统数据库设计
逻辑模型设计:
物理模型设计:
3. 输入输出设计
输入设计:
- 车牌识别:
摄像头:安装在停车场入口和出口,用于捕捉进入和离开车辆的车牌图像。
车牌识别算法:对摄像头捕捉的图像进行处理,提取车牌信息,并将其与数据库中的记录进行比对。
- 预约信息:
用户可以通过手机应用、网页或电话进行停车位的预约。
输入信息包括车牌号、预计到达时间、停车时长等。
- 支付信息:
用户可以选择在停车前、停车后或离场前进行支付。
输入信息包括支付方式(如微信支付、支付宝、银行卡等)、支付金额等。
- 远程控制指令:
停车场管理人员可以通过远程控制系统发送指令,如开启或关闭道闸、调整停车位指示等。
- 传感器数据:
停车场内的传感器(如车位占用传感器、温度/湿度传感器等)将实时数据发送到系统。
输出设计:
- 道闸控制:
根据车牌识别结果或预约信息,系统控制道闸的开启或关闭。
- 停车位指示:
通过LED屏幕、指示灯或移动应用向用户显示空闲停车位的位置。
- 支付确认:
用户完成支付后,系统通过移动应用、短信或语音提示等方式向用户确认支付成功。
- 实时监控画面:
通过摄像头和监控软件,向管理人员提供停车场的实时监控画面。
- 统计数据:
系统定期生成停车场的运营统计数据,如车辆进出量、停车时长、收入等,并通过报表或图表的形式展示给管理人员。
- 报警信息:
当系统检测到异常情况(如车辆异常停留、设备故障等)时,通过声音、灯光或移动应用向管理人员发送报警信息。
- 用户反馈:
系统提供用户反馈渠道(如在线调查、客服热线等),收集用户对停车场服务的意见和建议。
4. 进一步细化对象设计
Car 类
属性:
plateNumber: String,车牌号码
entranceTime: DateTime,车辆进入时间
exitTime: DateTime,车辆离开时间
isParked: Bool,表示车辆是否已停放方法
方法:
enterParkingLot(ParkingLot, ParkingSpace): 进入停车场并停放在指定车位
exitParkingLot(ParkingLot, ParkingSpace): 离开停车场并释放车位
calculateParkingFee(ParkingRate): 根据停车费率计算停车费用
ParkingLot 类
属性:
lots: List<ParkingSpace>,表示停车场的所有车位
capacity: Int,停车场的最大容量
currentOccupancy: Int,当前停车场的已占用车位数
方法:
findAvailableSpace(): 查找一个空闲的车位
enterCar(Car, ParkingSpace): 允许车辆进入停车场并停放在指定车位
exitCar(Car, ParkingSpace): 处理车辆离开停车场并释放车位
calculateTotalOccupancy() : 计算当前停车场的已占用车位数
ParkingSpace 类
属性:
spaceID: Int,车位的唯一标识符
status: Enum(如 Available, Occupied),表示车位的状态
occupiedCar: Option,表示当前停放在该车位的车辆(如果车位被占用)
方法:
occupy(car: Car): 将车辆停放在该车位并更新状态为 Occupied
release(): 释放车位并更新状态为 Available
isAvailable(): 检查车位是否空闲
User 类
属性:
userID: Int,用户的唯一标识符
name: String,用户的姓名
paymentInfo: PaymentDetails 对象,用户的支付信息
cars: List<Car>,包含 Car 对象,表示用户所拥有的车辆
方法:
payForParking(Car, ParkingRate): 为指定车辆支付停车费用
addCar(car: Car): 添加一辆车到用户的车辆列表中
removeCar(car: Car): 从用户的车辆列表中移除一辆车
PaymentDetails 类
属性:
paymentMethod: Enum(如 Cash, Card, Online 等),支付方式
cardNumber: String,如果是银行卡支付,则为银行卡号
accountDetails: String,其他支付方式的账户详情
方法:
processPayment(): 处理支付并返回支付状态
NotificationService 类
属性:
Subscribers:List<User>,要订阅的订阅者对象。
notificationChannel:Enum,通知的发送渠道
方法:
subscribe(User,notificationChannel):订阅通知服务,指定他们希望接收通知的渠道。
unsubscribe(User):取消订阅通知服务。
sendNotification():发送通知给指定的订阅者或所有订阅者
- 系统开发
1. 开发工具选择
集成开发环境(IDE):IntelliJ IDEA
硬件环境:windows 11
前端开发框架:Vue.js
编程语言:JavaScript
数据库管理系统:MySQL
3. 关键开发环节设计
1. 车位更新
核心逻辑:
依赖:导入必要的库和模型,如Express模型。
路由定义:创建一个处理车位更新请求的路由。
处理请求:
接收前端发送的车位状态更新请求(如空闲、占用等)。
根据请求中的车位ID或其他标识找到对应的车位记录。
更新数据库中的车位状态。
如有需要,可以触发其他操作,如通知正在等待车位的用户或发送系统通知。
响应:返回更新结果给前端。
javascript
const express = require('express');
const mongoose = require('mongoose');
const ParkingSpace = require('../models/ParkingSpace');
const router = express.Router();
router.put('/parking-spaces/:spaceId/status', async (req, res) => {
const { spaceId } = req.params;
const { status } = req.body; // 'available', 'occupied' 等
try {
const space = await ParkingSpace.findByIdAndUpdate(spaceId, { status }, { new: true });
if (!space) {
return res.status(404).json({ message: 'Parking space not found' });
}
res.json({ message: 'Parking space status updated successfully', space });
} catch (error) {
res.status(500).json({ message: 'Failed to update parking space status' });
}
});
module.exports = router;
2. 车辆进出
核心逻辑:
车辆进入:
前端:用户扫描车牌或输入车牌信息,发起进入请求。
后端:接收请求,查找空闲车位,分配车位并更新数据库中的车位状态和车辆信息。如有需要,可以通过Socket.IO发送实时通知给等待用户或管理员。
响应:返回进入成功信息给前端,包括分配的车位信息。
车辆离开:
前端:用户扫描车牌或输入车牌信息,发起离开请求。
后端:接收请求,验证车辆信息,更新数据库中的车位状态为空闲,并删除或更新车辆信息。如有需要,可以通过Socket.IO发送实时通知给等待用户或管理员。
响应:返回离开成功信息给前端。
javascript
router.post('/entry', async (req, res) => {
const { plateNumber } = req.body;
// 查找空闲车位逻辑...
// 分配车位并更新数据库...
const spaceId = 'someSpaceId'; // 实际开发中从数据库或其他逻辑获取
// 更新车位状态和车辆信息
await ParkingSpace.findByIdAndUpdate(spaceId, { status: 'occupied', plateNumber });
// 返回成功信息给前端
res.json({ message: 'Vehicle entry successful', spaceId });
});
javascript
wx.request({
url: 'https://yourapi.com/entry',
method: 'POST',
data: { plateNumber: '粤A12345' },
success: (res) => {
// 处理成功逻辑,如显示分配的车位信息
console.log('Vehicle entry successful', res.data);
},
fail: (error) => {
// 处理失败逻辑
console.error('Failed to enter vehicle', error);
}
});