ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于Django的城区停车位分时计费系统的设计与实现

基于Django的城区停车位分时计费系统的设计与实现 1. 项目背景与意义随着城市机动车保有量持续增长城区停车难、停车乱问题日益突出。传统停车收费多采用固定时段、固定价格模式难以反映不同时段停车需求的差异导致高峰时段车位紧张、低峰时段车位闲置。分时计费机制能够根据时段、区域和占用时长动态调整收费标准引导车主错峰停车提高车位周转率。本课题基于 Django 框架设计并实现一套城区停车位分时计费系统具有以下意义提升车位利用率通过分时定价引导车辆向低峰时段和空闲区域分流缓解核心区域停车压力。规范收费管理以系统自动计费替代人工收费减少漏收、错收提升管理效率。数据驱动决策积累停车时长、时段分布等数据为停车资源规划和费率调整提供依据。工程实践价值综合运用 Django、MySQL、Redis 等技术覆盖 Web 开发全流程适合作为毕业设计或课程项目。2. 系统技术栈本系统采用前后端分离与分层架构相结合的方式核心技术栈如下层次技术选型说明后端框架Django 4.x提供 ORM、Admin、认证、路由等基础能力数据库MySQL 8.0存储用户、车位、订单、费率等业务数据缓存Redis缓存热点数据、车位状态支撑并发计费前端Bootstrap 5 jQuery后台管理界面与用户端页面接口风格RESTful API使用 Django REST Framework 提供接口部署Nginx Gunicorn生产环境部署方案3. 系统功能模块设计系统按角色划分为管理员端和用户端两大模块整体功能结构如下用户管理注册、登录、个人信息维护、车牌绑定。车位管理车位区域划分、车位状态空闲/占用/预约管理。分时费率配置按工作日/节假日、高峰/平峰/低谷时段设置不同单价。停车订单入场登记、出场结算、订单查询与导出。计费引擎根据入场时间、出场时间和费率规则自动计算费用。数据统计按日/周/月统计收入、车位利用率、高峰时段分布。4. 数据库设计系统核心数据表包括用户表、车位表、费率表、订单表和区域表。以下为关键表结构设计-- 停车区域表 CREATE TABLE parking_area ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, location VARCHAR(100), hourly_base DECIMAL(6,2) DEFAULT 0 ); -- 车位表 CREATE TABLE parking_space ( id INT PRIMARY KEY AUTO_INCREMENT, area_id INT NOT NULL, code VARCHAR(20) NOT NULL, status TINYINT DEFAULT 0 COMMENT 0空闲 1占用 2预约, FOREIGN KEY (area_id) REFERENCES parking_area(id) ); -- 分时费率表 CREATE TABLE rate_rule ( id INT PRIMARY KEY AUTO_INCREMENT, area_id INT NOT NULL, day_type TINYINT COMMENT 0工作日 1节假日, start_time TIME NOT NULL, end_time TIME NOT NULL, price DECIMAL(6,2) NOT NULL, FOREIGN KEY (area_id) REFERENCES parking_area(id) ); -- 停车订单表 CREATE TABLE parking_order ( id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(32) NOT NULL UNIQUE, user_id INT NOT NULL, space_id INT NOT NULL, plate_no VARCHAR(20) NOT NULL, entry_time DATETIME NOT NULL, exit_time DATETIME NULL, total_fee DECIMAL(8,2) DEFAULT 0, status TINYINT DEFAULT 0 COMMENT 0进行中 1已完成, FOREIGN KEY (space_id) REFERENCES parking_space(id) );5. 核心代码实现5.1 分时计费引擎计费引擎是系统的核心根据入场和出场时间结合费率规则计算停车费用。实现思路是将停车时长按天拆分再按费率时段切分逐段累加费用。from datetime import datetime, time, timedelta from django.utils import timezone from .models import RateRule def calc_fee(area_id, entry_time, exit_time): 根据分时费率计算停车费用 if exit_time entry_time: return 0.0 total_fee 0.0 current entry_time while current exit_time: # 判断当天是工作日还是节假日 day_type 0 if current.weekday() 5 else 1 # 查询当前区域、当天类型下的费率规则 rules RateRule.objects.filter( area_idarea_id, day_typeday_type ).order_by(start_time) # 找到当前时刻所属的费率段 current_time current.time() matched_rule None for rule in rules: if rule.start_time current_time rule.end_time: matched_rule rule break if matched_rule is None: # 无匹配费率时按基础价计费 price 2.0 segment_end datetime.combine(current.date(), time(23, 59, 59)) timedelta(seconds1) else: price matched_rule.price segment_end datetime.combine(current.date(), matched_rule.end_time) # 计算本段时长分钟 segment_end min(segment_end, exit_time) minutes (segment_end - current).total_seconds() / 60 total_fee round(minutes / 60 * price, 2) current segment_end return round(total_fee, 2)5.2 停车入场接口入场时创建订单并更新车位状态使用 Redis 缓存车位状态以提升并发处理能力。import uuid from datetime import datetime from django.utils import timezone from rest_framework.views import APIView from rest_framework.response import Response from .models import ParkingSpace, ParkingOrder from django.core.cache import cache class EntryView(APIView): 车辆入场登记 def post(self, request): space_id request.data.get(space_id) plate_no request.data.get(plate_no) user request.user # 检查车位状态优先读缓存 cache_key fspace_status:{space_id} status cache.get(cache_key) if status is None: space ParkingSpace.objects.select_for_update().get(idspace_id) status space.status else: space ParkingSpace.objects.get(idspace_id) if status ! 0: return Response({code: 1, msg: 车位已被占用}) # 创建订单 order ParkingOrder.objects.create( order_nouuid.uuid4().hex[:16].upper(), useruser, spacespace, plate_noplate_no, entry_timetimezone.now(), status0 ) # 更新车位状态并写缓存 space.status 1 space.save(update_fields[status]) cache.set(cache_key, 1, timeout3600) return Response({code: 0, data: {order_no: order.order_no}})5.3 停车出场结算接口出场时调用计费引擎计算费用完成订单并释放车位。from django.utils import timezone from rest_framework.views import APIView from rest_framework.response import Response from .models import ParkingOrder, ParkingSpace from .fee_engine import calc_fee from django.core.cache import cache class ExitView(APIView): 车辆出场结算 def post(self, request): order_no request.data.get(order_no) order ParkingOrder.objects.select_related(space).get(order_noorder_no) if order.status ! 0: return Response({code: 1, msg: 订单已结算}) exit_time timezone.now() fee calc_fee(order.space.area_id, order.entry_time, exit_time) order.exit_time exit_time order.total_fee fee order.status 1 order.save() # 释放车位 space order.space space.status 0 space.save(update_fields[status]) cache.set(fspace_status:{space.id}, 0, timeout3600) return Response({ code: 0, data: { order_no: order.order_no, entry_time: order.entry_time.strftime(%Y-%m-%d %H:%M:%S), exit_time: exit_time.strftime(%Y-%m-%d %H:%M:%S), total_fee: fee } })5.4 分时费率配置模型费率规则通过 Django 模型管理支持按区域、日期类型和时段灵活配置。from django.db import models class RateRule(models.Model): 分时费率规则 DAY_TYPE_CHOICES ( (0, 工作日), (1, 节假日), ) area models.ForeignKey(ParkingArea, on_deletemodels.CASCADE, verbose_name所属区域) day_type models.SmallIntegerField(choicesDAY_TYPE_CHOICES, verbose_name日期类型) start_time models.TimeField(verbose_name开始时间) end_time models.TimeField(verbose_name结束时间) price models.DecimalField(max_digits6, decimal_places2, verbose_name单价(元/小时)) class Meta: verbose_name 分时费率 verbose_name_plural verbose_name ordering [area, day_type, start_time] def __str__(self): return f{self.area.name}-{self.get_day_type_display()}-{self.start_time}~{self.end_time}6. 系统测试与验证对系统核心功能进行测试重点验证分时计费的正确性。以下为典型测试用例用例编号场景入场时间出场时间预期费用TC-01工作日平峰时段停车10:0012:00按平峰单价×2小时TC-02工作日跨高峰时段08:0010:00高峰段平峰段分段计费TC-03跨天停车22:00当日08:00次日按两日费率分段累计TC-04节假日停车14:0016:00按节假日费率计算测试结果表明计费引擎能够正确处理单时段、跨时段、跨天等场景费用计算结果与手工核算一致。7. 总结与展望本文设计并实现了基于 Django 的城区停车位分时计费系统完成了用户管理、车位管理、分时费率配置、停车订单和自动计费等核心功能。系统采用 Django MySQL Redis 技术栈通过分时计费引擎实现了按时段动态定价有效提升了车位管理效率。后续可从以下方向继续完善引入车牌识别LPR实现无感入场出场。增加车位预约和导航功能提升用户体验。基于历史数据构建需求预测模型辅助费率动态调整。对接微信小程序或移动端扩展使用场景。
返回列表