1. 项目概述:校园智慧辅助停车系统的设计与实现
校园停车难问题一直是困扰师生日常出行的痛点。每到上下课高峰期,校园内经常出现车辆排队、乱停乱放的现象,不仅影响校园秩序,也存在安全隐患。基于Django框架开发的校园智慧辅助停车系统小程序,正是为了解决这一实际问题而设计的毕业设计项目。
这个系统采用了当前主流的技术栈组合:后端使用Django框架提供API服务,前端采用小程序形式实现移动端交互,数据库选用MySQL存储停车数据。系统实现了车位实时查询、预约停车、导航引导、费用结算等核心功能模块,为校园停车管理提供了智能化解决方案。
提示:Django作为Python生态中最成熟的Web框架之一,其自带的管理后台、ORM系统和安全机制特别适合快速开发此类管理系统。对于毕业设计项目来说,既能展示完整的技术体系,又不会因技术过于复杂而难以实现。
2. 系统架构设计
2.1 技术选型与架构模式
本系统采用典型的三层架构设计,分为表现层、业务逻辑层和数据访问层:
表现层:微信小程序作为前端载体,使用WXML+WXSS+JavaScript技术栈开发用户界面。小程序的选择主要基于以下考虑:
- 无需安装,扫码即用
- 开发成本低,生态完善
- 适合校园场景的高频使用需求
业务逻辑层:Django框架作为后端核心,主要处理:
- 用户认证与权限管理
- 停车业务逻辑处理
- 数据校验与接口提供
- 第三方服务集成(如支付)
数据访问层:MySQL关系型数据库存储结构化数据,包括:
- 用户信息
- 车位数据
- 订单记录
- 系统日志
这种分层架构的优势在于:
- 职责分离,便于团队协作开发
- 各层可独立扩展和优化
- 代码可维护性强
- 适合毕业设计的模块化评分要求
2.2 Django框架的核心配置
在Django项目的settings.py中,有几个关键配置值得注意:
python复制# 数据库配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'parking_system',
'USER': 'root',
'PASSWORD': 'yourpassword',
'HOST': 'localhost',
'PORT': '3306',
}
}
# 跨域配置
CORS_ALLOWED_ORIGINS = [
"https://yourdomain.com",
]
# 静态文件配置
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
# 缓存配置
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
}
}
注意:实际部署时,数据库密码等敏感信息应通过环境变量获取,不应直接硬编码在配置文件中。这是毕业设计中容易忽视的安全问题。
3. 核心功能模块实现
3.1 车位实时查询与预约系统
车位管理是系统的核心功能,主要涉及以下模型设计:
python复制class ParkingLot(models.Model):
name = models.CharField(max_length=100)
location = models.CharField(max_length=255)
total_spaces = models.IntegerField()
available_spaces = models.IntegerField()
status = models.BooleanField(default=True)
class Meta:
db_table = 'parking_lot'
class ParkingSpace(models.Model):
LOT_STATUS = (
(0, '空闲'),
(1, '已预约'),
(2, '已占用'),
(3, '维修中')
)
number = models.CharField(max_length=20)
lot = models.ForeignKey(ParkingLot, on_delete=models.CASCADE)
status = models.IntegerField(choices=LOT_STATUS, default=0)
type = models.CharField(max_length=50) # 普通/残疾人/电动车位
class Meta:
db_table = 'parking_space'
车位状态更新的关键逻辑:
python复制def update_space_status(space_id, new_status):
try:
space = ParkingSpace.objects.get(id=space_id)
if new_status == 1: # 预约
if space.status != 0:
raise Exception("车位当前不可预约")
space.status = 1
space.save()
# 更新停车场可用车位数
ParkingLot.objects.filter(id=space.lot.id).update(
available_spaces=F('available_spaces') - 1
)
return True
# 其他状态更新逻辑...
except Exception as e:
logger.error(f"更新车位状态失败: {str(e)}")
return False
3.2 用户认证与权限管理
系统采用Django自带的认证系统,并进行了扩展:
python复制from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
USER_TYPE = (
(1, '普通用户'),
(2, '停车场管理员'),
(3, '系统管理员')
)
phone = models.CharField(max_length=20)
user_type = models.IntegerField(choices=USER_TYPE, default=1)
license_plate = models.CharField(max_length=20, blank=True)
class Meta:
db_table = 'user'
# 自定义权限装饰器
def user_type_required(user_type):
def decorator(view_func):
@wraps(view_func)
def wrapped_view(request, *args, **kwargs):
if not request.user.is_authenticated:
return JsonResponse({'code': 403, 'msg': '请先登录'})
if request.user.user_type not in user_type:
return JsonResponse({'code': 403, 'msg': '权限不足'})
return view_func(request, *args, **kwargs)
return wrapped_view
return decorator
实操心得:Django的AbstractUser虽然提供了基础认证功能,但在实际项目中几乎都需要扩展。建议在项目初期就规划好用户模型,避免后期迁移数据的麻烦。
4. 数据库设计与优化
4.1 主要数据表结构
系统主要包含以下核心表:
-
用户表(user):
- id, username, password, email, phone, user_type等
-
停车场表(parking_lot):
- id, name, location, total_spaces, available_spaces等
-
车位表(parking_space):
- id, number, lot_id, status, type等
-
预约记录表(reservation):
- id, user_id, space_id, start_time, end_time, status等
-
停车记录表(parking_record):
- id, user_id, space_id, enter_time, exit_time, fee等
4.2 查询优化实践
对于高频查询如"获取可用车位",采用了以下优化措施:
python复制# 常规查询(效率较低)
spaces = ParkingSpace.objects.filter(lot_id=lot_id, status=0)
# 优化后的查询
spaces = ParkingSpace.objects.select_related('lot').only(
'number', 'type', 'lot__name'
).filter(
lot_id=lot_id,
status=0
).order_by('number')
优化点说明:
select_related减少查询次数(解决N+1问题)only限定返回字段,减少数据传输量- 添加索引提高查询速度
python复制class Migration(migrations.Migration):
operations = [
migrations.RunSQL(
"CREATE INDEX idx_space_lot_status ON parking_space(lot_id, status);"
)
]
5. 小程序端关键实现
5.1 地图集成与车位展示
小程序端使用腾讯地图SDK实现车位可视化:
javascript复制// 初始化地图
initMap() {
this.mapCtx = wx.createMapContext('parkingMap')
this.setData({
markers: [{
id: 1,
latitude: 39.90469,
longitude: 116.40717,
iconPath: '/images/parking.png',
width: 30,
height: 30
}]
})
}
// 获取附近停车场
getNearbyLots() {
wx.request({
url: 'https://yourdomain.com/api/lots/nearby',
data: {
lat: this.data.latitude,
lng: this.data.longitude,
radius: 2000
},
success: (res) => {
this.processLotData(res.data)
}
})
}
5.2 预约流程实现
完整的预约流程包括以下步骤:
- 用户选择目标车位
- 系统校验车位可用性
- 用户确认预约信息
- 生成预约记录
- 锁定车位状态
- 发送微信通知
关键代码示例:
javascript复制// 小程序端预约逻辑
makeReservation() {
if (!this.checkUserInfo()) {
wx.showToast({ title: '请先完善车辆信息', icon: 'none' })
return
}
wx.request({
url: 'https://yourdomain.com/api/reservation/create',
method: 'POST',
data: {
space_id: this.data.selectedSpace.id,
start_time: this.data.startTime,
end_time: this.data.endTime
},
success: (res) => {
if (res.data.code === 200) {
this.showReservationSuccess()
} else {
wx.showToast({ title: res.data.msg, icon: 'none' })
}
}
})
}
6. 系统部署与测试
6.1 生产环境部署方案
推荐部署架构:
- Nginx:反向代理和静态文件服务
- Gunicorn:WSGI应用服务器
- MySQL:数据库服务
- Redis:缓存和消息队列
部署步骤示例:
bash复制# 安装依赖
pip install -r requirements.txt
# 数据库迁移
python manage.py makemigrations
python manage.py migrate
# 收集静态文件
python manage.py collectstatic
# 启动Gunicorn
gunicorn parking_system.wsgi:application -w 4 -b 0.0.0.0:8000
6.2 关键测试用例
-
并发预约测试:
- 模拟多个用户同时预约同一车位
- 验证系统是否正确处理并发冲突
- 预期结果:只有一个用户预约成功
-
预约超时测试:
- 用户预约后未按时到达
- 验证系统是否自动释放车位
- 预期结果:15分钟后自动取消预约
-
支付流程测试:
- 完成停车后发起支付
- 验证支付结果是否正确更新停车记录
- 预期结果:支付成功后生成完整记录
测试结果表示例:
| 测试场景 | 测试步骤 | 预期结果 | 实际结果 | 是否通过 |
|---|---|---|---|---|
| 并发预约 | 5用户同时预约车位A | 仅1人成功 | 仅1人成功 | ✓ |
| 异常停车 | 车辆停留超24小时 | 系统报警 | 管理员收到通知 | ✓ |
| 支付异常 | 支付成功后网络中断 | 记录最终状态 | 状态正确更新 | ✓ |
7. 毕业设计实践建议
在指导数百名学生的毕业设计过程中,我总结出以下经验:
-
技术选型要适度:
- 不要盲目追求最新技术
- 选择有成熟社区支持的技术栈
- Django+小程序是稳妥的组合
-
功能设计要聚焦:
- 先完成核心功能(如车位预约)
- 再考虑扩展功能(如支付、导航)
- 避免功能过于分散导致无法完成
-
文档编写要同步:
- 开发过程中及时记录关键决策
- 截图保存各个阶段的成果
- 文档与代码保持同步更新
-
测试要全面:
- 单元测试覆盖核心逻辑
- 进行真实场景测试
- 邀请同学试用并反馈
避坑指南:很多同学在数据库设计阶段过于简单,导致后期频繁修改模型结构。建议在编码前花足够时间设计数据模型,可以使用工具如MySQL Workbench进行可视化设计。