Python+Flask的毕业设计-基于人脸识别的停车场管理系统项目实战(附源码+论文)
大家好!我是岛上程序猿,感谢您阅读本文,欢迎一键三连哦。
精彩专栏推荐👇🏻👇🏻👇🏻
开发环境
- 开发语言:Python
- 框架:flask
- Python版本:python3.7.7
- 数据库:mysql 5.7
- 数据库工具:Navicat11
- 开发软件:PyCharm
- 浏览器:谷歌浏览器
演示视频
python207基于人脸识别的停车场管理系统
论文目录
【如需全文请按文末获取联系】


一、项目简介
本论文采用人脸识别技术设计并实现了一套停车场管理系统。以方便管理、科技进步为理念,选择Python作为开发语言,MySQL作为后台数据库,PyCharm和VSCode作为开发环境。借助OpenCV人脸识别库和Flask微框架,系统充分运用人工智能技术,实现对停车场用户的高效识别和管理,使用户在无需携带物理凭证的情况下迅速进出停车场,提高了停车的便捷性和效率。
二、系统设计
2.1软件功能模块设计
3.3.1 用户角色
用户注册,登录:注册时候,调用电脑的摄像头,进行人脸录入注册,输入车牌号,手机号,姓名,账号,身份证等。
车位查看:查看车位状态,是空的还是被占用。
刷脸停车:人脸刷脸,然后成功后开始计时,是电脑当前系统时间,停车前20分钟不收费,21分钟到1小时,按1小时算。
点击离开:点击按钮离场,结算费用,点击时候,离开时间是电脑系统的时间。
在线支付:按照系统进行时间计算的费用支付。
3.3.2 管理员角色
管理员信息管理:可以对登录后的管理员进行自主的信息管理,可以更改一些信息,例如账号密码等等。
注册用户管理,审核:对是该平台的用户进行管理,可以给用户进行增删改除等等操作。
车位信息管理:对车位的信息进行管理。
停车费设置:设置1小时多少钱。
停车信息管理:某个用户,停车多久,费用多少,停车时间,离开时间。
在线支付管理:可以对系统内用户产生的一系列多个的支付信息进行一系列的管理。
支付信息统计:对已经支付的信息进行可视化的展示。
2.2数据库设计
在进行分析后得出本次需要的表大致如下所示:
用户表:存放用户的个人信息,其中包括用户在注册时的各项内容,以及用户的人脸信息,否则没办法进行识别。
车位表:储存的就是车位的信息,几号车位,听了哪个车等等。
停车记录表:记录停车的一些具体信息,例如哪个车停的,时间是多少。
管理员表:存放管理员的个人信息,例如账号密码,姓名年龄等等信息。
注册用户审核表:用于审核注册用户的信息,包括用户在注册时的各项内容,以及用户的人脸信息。
停车费设置表:停车时长等等信息计算停车费。
在线支付管理表:记录用户的在线支付信息。
支付信息统计表:用于统计支付信息。
根据以上信息做出了对应的数据库表er结构,具体如图所示:
三、系统项目部分截图
3.1用户模块的实现
(1)注册:在该模块可以进行注册,包括填写信息身份证姓名等等信息。
(2)登录:注册时候便可以进行登陆操作。
(3)用户首页:在这里可以选择对应的停车位进行停车。
3.2管理员模块的实现
(1)管理员登录:管理员进行登录后可以对信息进行管理操作。
(2)管理员首页:在这里可以大致的了解有的功能。
(3)停车场管理:可以对停车场车位情况价格担当进行管理。
四、部分核心代码
import csv
import datetime
import os
import random
import re
import sys
import time
from io import BytesIO
from utils.paginater import Paginater
from flask import Blueprint, request, jsonify, render_template, session, redirect, Response
from werkzeug.utils import secure_filename
workdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, workdir)
from logger import Logger
from exts import db
from .models import *
PAGE_SIZE = 5
bp = Blueprint('', '__name__', url_prefix='')
logger = Logger(logname='inference_views.log', loglevel=5, logger='inference').getlog()
@bp.route('/index', methods=['GET'])
def index():
"""
:return:
"""
# for i in range(1,101):
# c = Car_manage(carport=i,genre=0)
# db.session.add(c)
# db.session.commit()
user_num = User.query.count()
all_carport = Car_manage.query.count()
remain_carport = 0
for c in Car_manage.query.all():
# 如果停车位的车牌为空
if not c.carnum:
remain_carport += 1
# 获取每日的收入
money_day = 0
charge_obj = Charge.query.all()
for c in charge_obj:
if c.pay_time.date() == datetime.datetime.now().date():
money_day += c.money
# 记录数
car_manage_count = Car_record.query.count()
# 环形图数据
# A区总共车位
A_cars = Car_manage.query.filter(Car_manage.carport >= 1, Car_manage.carport <= 25)
A_cars_use = 0
Asum = 0
# A区使用中车位
for c in A_cars:
if c.carnum:
A_cars_use += 1
Asum += 1
A_remain = Asum - A_cars_use
B_cars = Car_manage.query.filter(Car_manage.carport >= 26, Car_manage.carport <= 50)
B_cars_use = 0
Bsum = 0
for c in B_cars:
if c.carnum:
B_cars_use += 1
Bsum += 1
B_remain = Bsum - B_cars_use
C_cars = Car_manage.query.filter(Car_manage.carport >= 51, Car_manage.carport <= 75)
C_cars_use = 0
Csum = 0
for c in C_cars:
if c.carnum:
C_cars_use += 1
Csum += 1
C_remain = Csum - C_cars_use
D_cars = Car_manage.query.filter(Car_manage.carport >= 76, Car_manage.carport <= 100)
D_cars_use = 0
Dsum = 0
for c in D_cars:
if c.carnum:
D_cars_use += 1
Dsum += 1
D_remain = Dsum - D_cars_use
# 柱状图数据
today = datetime.datetime.now()
day1 = today - datetime.timedelta(days=6)
day2 = today - datetime.timedelta(days=5)
day3 = today - datetime.timedelta(days=4)
day4 = today - datetime.timedelta(days=3)
day5 = today - datetime.timedelta(days=2)
day6 = today - datetime.timedelta(days=1)
car_record_obj = Car_record.query.filter(Car_record.genre == 1).all()
day1_in = 0
day1_out = 0
day2_in = 0
day2_out = 0
day3_in = 0
day3_out = 0
day4_in = 0
day4_out = 0
day5_in = 0
day5_out = 0
day6_in = 0
day6_out = 0
today_in = 0
today_out = 0
for c in car_record_obj:
if c.begintime.month == day1.month and c.begintime.day == day1.day:
day1_in += 1
elif c.begintime.month == day2.month and c.begintime.day == day2.day:
day2_in += 1
elif c.begintime.month == day3.month and c.begintime.day == day3.day:
day3_in += 1
elif c.begintime.month == day4.month and c.begintime.day == day4.day:
day4_in += 1
elif c.begintime.month == day5.month and c.begintime.day == day5.day:
day5_in += 1
elif c.begintime.month == day6.month and c.begintime.day == day6.day:
day6_in += 1
elif c.begintime.month == today.month and c.begintime.day == today.day:
today_in += 1
else:
pass
if c.endtime.month == day1.month and c.endtime.day == day1.day:
day1_out += 1
elif c.endtime.month == day2.month and c.endtime.day == day2.day:
day2_out += 1
elif c.endtime.month == day3.month and c.endtime.day == day3.day:
day3_out += 1
elif c.endtime.month == day4.month and c.endtime.day == day4.day:
day4_out += 1
elif c.endtime.month == day5.month and c.endtime.day == day5.day:
day5_out += 1
elif c.endtime.month == day6.month and c.endtime.day == day6.day:
day6_out += 1
elif c.endtime.month == today.month and c.endtime.day == today.day:
today_out += 1
else:
pass
# 还有今日停入未离开,暂时未被记录
car_manage_obj = Car_manage.query.filter(Car_manage.genre == 1)
for c in car_manage_obj:
# 判断同一个月
if c.begintime.month == today.month and c.begintime.day == today.day:
today_in += 1
elif c.begintime.month == day1.month and c.begintime.day == day1.day:
day1_in += 1
elif c.begintime.month == day2.month and c.begintime.day == day2.day:
day2_in += 1
elif c.begintime.month == day3.month and c.begintime.day == day3.day:
day3_in += 1
elif c.begintime.month == day4.month and c.begintime.day == day4.day:
day4_in += 1
elif c.begintime.month == day5.month and c.begintime.day == day5.day:
day5_in += 1
elif c.begintime.month == day6.month and c.begintime.day == day6.day:
day6_in += 1
else:
pass
today = today.strftime('%m-%d')
day1 = day1.strftime('%m-%d')
day2 = day2.strftime('%m-%d')
day3 = day3.strftime('%m-%d')
day4 = day4.strftime('%m-%d')
day5 = day5.strftime('%m-%d')
day6 = day6.strftime('%m-%d')
price = Price.query.filter(Price.id == 1).first()
return render_template('index.html', user_num=user_num, all_carport=all_carport,
remain_carport=remain_carport, money_day=money_day,
car_manage_count=car_manage_count, A_remian=A_remain,
B_remian=B_remain, C_remian=C_remain, D_remian=D_remain,
today=today, day1=day1, day2=day2, day3=day3, day4=day4,
day5=day5, day6=day6, day1_in=day1_in, day2_in=day2_in,
day3_in=day3_in, day4_in=day4_in, day5_in=day5_in,
day6_in=day6_in,price=price,
today_in=today_in, day1_out=day1_out, day2_out=day2_out,
day3_out=day3_out, day4_out=day4_out, day5_out=day5_out,
day6_out=day6_out, today_out=today_out)
@bp.route('/user_info', methods=['GET'])
def user_info():
return redirect('/user_paging')
def chargecount(start_time, end_time):
"""
车费计算
:param start_time:
:param end_time:
:return:
"""
price = Price.query.filter(Price.id==1).first()
baitian = price.day
wanshang = price.night
top_price = price.top
start_seconds = time.mktime(start_time.timetuple()) * 1000 + start_time.microsecond / 1000
end_seconds = time.mktime(end_time.timetuple()) * 1000 + end_time.microsecond / 1000
time_span = end_seconds - start_seconds
day_span = int(time_span / 1000 / 3600 / 24)
hour_span = int(time_span / 1000 / 3600 % 24)
minute_span = int(time_span / 1000 / 60 % 60)
# 判断是否为同一天
if start_time.date() == end_time.date():
money = 0
# 同一天
# 判断是否只停车半小时
if hour_span == 0 and minute_span < 30:
print(start_time, end_time, day_span, hour_span, minute_span, money)
return money
else:
# 超过半小时
# 判断是早晨还是晚上
if 7 <= start_time.hour < 19:
# 早晨停车
if 7 <= end_time.hour < 19:
# 在晚间之前离开
if minute_span != 0:
money = baitian * (hour_span + 1)
else:
money = baitian * hour_span
else:
# 在晚间离开
if minute_span != 0:
money = (18 - start_time.hour) * baitian + (hour_span - 17 + start_time.hour) * wanshang
else:
money = (18 - start_time.hour) * baitian + (hour_span - 18 + start_time.hour) * wanshang
elif start_time.hour >= 19:
# 晚上停车
if minute_span != 0:
money = wanshang * (hour_span + 1)
else:
money = wanshang * hour_span
else:
if end_time.hour < 7:
if minute_span != 0:
money = wanshang * (hour_span + 1)
else:
money = wanshang * hour_span
elif 7 <= end_time.hour < 16:
if minute_span != 0:
money = (6 - start_time.hour) * wanshang + baitian * (1 + start_time.hour)
else:
money = (6 - start_time.hour) * wanshang + baitian * (1 + start_time.hour)
pass
else:
money = top_price
if money > top_price:
money = top_price
print(start_time, end_time, day_span, hour_span, minute_span, money)
return money
else:
print(start_time, end_time, day_span, hour_span, minute_span, money)
return money
else:
# 非同一天
money = 0
money_day = 0
if day_span > 0:
# 停留超过24h
new_start_time = start_time + datetime.timedelta(days=day_span)
print(new_start_time)
money_day = top_price * day_span
# 在判断离开时超过24h收费的部分
if 7 <= new_start_time.hour < 19:
if 7 <= end_time.hour < 19:
if minute_span != 0:
money = baitian * (hour_span + 1)
print(1)
else:
money = baitian * hour_span
print(2)
elif 0 <= end_time.hour < 7 or 19 <= end_time.hour <= 23:
if minute_span != 0:
money = (18 - new_start_time.hour) * baitian + (hour_span - 17 + start_time.hour) * wanshang
print(3)
else:
money = (18 - new_start_time.hour) * baitian + (hour_span - 18 + start_time.hour) * wanshang
print(4)
elif new_start_time.hour >= 19:
if minute_span != 0:
money = wanshang * (hour_span + 1)
print(5)
else:
money = wanshang * hour_span
print(6)
else:
if end_time.hour < 7:
if minute_span != 0:
money = wanshang * (hour_span + 1)
print(7)
else:
money = wanshang * hour_span
print(8)
elif 7 <= end_time.hour < 16:
if minute_span != 0:
money = (6 - new_start_time.hour) * wanshang + baitian * (1 + hour_span)
print(9)
else:
money = (6 - new_start_time.hour) * wanshang + baitian * hour_span
print(10)
pass
else:
money = top_price
if money > top_price:
money = top_price + money_day
print(start_time, end_time, day_span, hour_span, minute_span, money)
return money
else:
money += money_day
print(start_time, end_time, day_span, hour_span, minute_span, money)
return money
else:
# 未超过24h,但不是同一天
if hour_span == 0 and minute_span < 30:
print(start_time, end_time, day_span, hour_span, minute_span, money)
return money
else:
if start_time.hour <= 18:
money = top_price
else:
if end_time.hour >= 5:
money = top_price
else:
if minute_span != 0:
money = wanshang * (hour_span + 1)
else:
money = wanshang * hour_span
if money > top_price:
money = top_price
print(start_time, end_time, day_span, hour_span, minute_span, money)
return money
else:
print(start_time, end_time, day_span, hour_span, minute_span, money)
return money
@bp.route('/user_add', methods=['GET', 'POST'])
def user_add():
if request.method == 'POST':
name = request.form.get('name')
phone = request.form.get('phone')
carnum = request.form.get('carnum')
level = request.form.get('vip-radios')
begintime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
pattern = re.compile(r'^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$')
result = pattern.match(phone)
print(name, phone, carnum, level)
is_exists = User.query.filter(User.carnum == carnum).first()
print(is_exists)
if name and phone and carnum and level:
# 判断手机号是否合法
if not result:
return render_template('user_add.html', error3='请输入正确的手机号')
# 判断车牌号是否存在
elif is_exists:
return render_template('user_add.html', error1='该车牌号已存在')
else:
level = int(level)
if level == 1:
endtime = (datetime.datetime.now() + datetime.timedelta(days=31)).strftime("%Y-%m-%d %H:%M:%S")
charge = Charge(pay_time=datetime.datetime.now(), money=150)
elif level == 2:
endtime = (datetime.datetime.now() + datetime.timedelta(days=93)).strftime("%Y-%m-%d %H:%M:%S")
charge = Charge(pay_time=datetime.datetime.now(), money=425)
elif level == 3:
endtime = (datetime.datetime.now() + datetime.timedelta(days=186)).strftime("%Y-%m-%d %H:%M:%S")
charge = Charge(pay_time=datetime.datetime.now(), money=810)
elif level == 4:
endtime = (datetime.datetime.now() + datetime.timedelta(days=365)).strftime("%Y-%m-%d %H:%M:%S")
charge = Charge(pay_time=datetime.datetime.now(), money=1530)
else:
pass
db.session.add(charge)
db.session.commit()
user = User(name=name, carnum=carnum, phone=phone, level=level, begintime=begintime, sfz='1',
face_id='',
endtime=endtime, password='123')
db.session.add(user)
db.session.commit()
# 如果车辆先停入,之后再办理会员
try:
car_obj = Car_manage.query.get(carnum=carnum)
car_obj.genre = 1
db.session.commit()
money = chargecount(car_obj.begintime, datetime.datetime.now())
# 办理会员前需要支付的费用
if not Extra_charge.query.filter(carnum=carnum):
extra_charge = Extra_charge(carnum=carnum,
vip_begintime=car_obj.begintime.strftime(
"%Y-%m-%d %H:%M:%S"),
vip_deadline=datetime.datetime.now().strftime(
"%Y-%m-%d %H:%M:%S"), is_valid=1,
money=money)
db.session.add(extra_charge)
db.session.commit()
else:
extra_charge = Extra_charge.query.filter(Extra_charge.carnum == carnum).first()
extra_charge.vip_begintime = car_obj.begintime.strftime("%Y-%m-%d %H:%M:%S")
extra_charge.vip_deadline = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
extra_charge.is_valid = True
extra_charge.money = money
db.session.commit()
except Exception as e:
pass
time.sleep(2)
return redirect('/user_paging')
else:
print('error')
return render_template('user_add.html', error2='请填写完整!')
else:
return render_template('user_add.html')
@bp.route('/', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
else:
# 处理POST请求的逻辑
# 获取到用户提交的用户名和密码
account = request.form.get('account')
pwd = request.form.get('pwd')
print(account, pwd)
if not account or not pwd:
return render_template('login.html', error='账号密码不能为空!')
else:
try:
check = db.session.query(Administrator).filter(Administrator.account == account).first()
if check.password == pwd:
session['is_login'] = 1
return redirect('/index')
else:
return render_template('login.html', error='输入账号密码错误!')
except Exception as e:
print(e)
return render_template('login.html', error='输入账号密码错误!')
@bp.route('/index2', methods=['GET', 'POST'])
def index2():
total_car = Car_manage.query.filter(Car_manage.genre == 0).count()
A_cars = Car_manage.query.filter(Car_manage.carport >= 1, Car_manage.carport <= 25).all()
B_cars = Car_manage.query.filter(Car_manage.carport >= 26, Car_manage.carport <= 50).all()
C_cars = Car_manage.query.filter(Car_manage.carport >= 51, Car_manage.carport <= 75).all()
D_cars = Car_manage.query.filter(Car_manage.carport >= 76, Car_manage.carport <= 100).all()
return render_template('index2.html', A_cars=A_cars, B_cars=B_cars, C_cars=C_cars, D_cars=D_cars,
total_car=total_car)
@bp.route('/face/<leibie>', methods=['GET', 'POST'])
def face(leibie):
return render_template('face.html', leibie=leibie)
@bp.route('/register_user', methods=['GET', 'POST'])
def register_user():
if request.method == 'GET':
current_face_id = User.query.order_by(User.id.desc())[0].face_id
face_id = int(current_face_id) + 1
return render_template('userRegister.html', face_id=face_id)
else:
name = request.form.get('name')
password = request.form.get('password')
sfz = request.form.get('sfz')
phone = request.form.get('phone')
card = request.form.get('card')
face_id = request.form.get('face_id')
user_obj = User(name=name, password=password, sfz=sfz, phone=phone, carnum=card, face_id=face_id)
db.session.add(user_obj)
db.session.commit()
return redirect('/login_user')
@bp.route('/login_user', methods=['GET', 'POST'])
def login2():
if request.method == 'GET':
return render_template('userLogin.html')
else:
# 处理POST请求的逻辑
# 获取到用户提交的用户名和密码
account = request.form.get('account')
pwd = request.form.get('pwd')
print(account, pwd)
if not account or not pwd:
return render_template('userLogin.html', error='账号密码不能为空!')
else:
try:
check = db.session.query(User).filter(User.name == account).first()
if check.password == pwd:
session['is_login'] = 1
session['username'] = account
return redirect('/index2')
else:
return render_template('userLogin.html', error='输入账号密码错误!')
except Exception as e:
print(e)
return render_template('userLogin.html', error='输入账号密码错误!')
@bp.route('/user_del', methods=['GET', 'POST'])
def user_del():
id = request.form.get('id')
# 如果车辆在停车场内,需要将记录改为临时用户
car_obj = User.query.filter(User.id == id).first()
carnum = car_obj.carnum
# 判断该车是否在停车场中
try:
# 存在
car = Car_manage.query.filter(Car_manage.carnum == carnum).first()
car.genre = 2
db.session.commit()
except Exception as e:
# 不存在
pass
finally:
db.session.delete(car_obj)
db.session.commit()
@bp.route('/user_edit', methods=['GET', 'POST'])
def user_edit():
# 查询要编辑对象的id
id = request.args.get('id')
# 根据id查到要编辑对象
user_obj = User.query.filter(User.id == id).first()
if request.method == 'POST':
name = request.form.get('name')
phone = request.form.get('phone')
carnum = request.form.get('carnum')
pattern = re.compile(r'^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$')
result = pattern.match(phone)
if name and phone and carnum:
# 判断手机号是否合法
if not result:
return render_template('user_edit.html', error1='请输入正确的手机号')
else:
# 讨论修改车牌号带来的影响
# 未更改车牌号
if user_obj.carnum == carnum:
user_obj.name = name
user_obj.phone = phone
user_obj.carnum = carnum
db.session.commit()
return redirect('/user_paging')
else:
# 更改了车牌号
# 判断车牌号是否已经存在
count = User.query.filter(carnum=carnum).count()
if count == 1:
# 已有用户有该车牌
print(count)
return render_template('user_edit.html', error2='该车牌号已存在')
else:
# 可以更改
# 判断更换的车牌号是否已经在停车场
car = Car_manage.query.filter(carnum=carnum)
if not car:
# 不在停车场
# 判断原车牌号车是否在停车场
try:
car_obj = Car_manage.query.get(carnum=user_obj.carnum)
car_obj.carnum = carnum
db.session.commit()
# 注意需要去admin手动添加车牌图片
except Exception as e:
# 不在停车场
pass
finally:
# 将该车牌从license_plate表中移除
License_plate.query.filter(car_num=user_obj.carnum).delete()
user_obj.name = name
user_obj.phone = phone
user_obj.carnum = carnum
db.session.commit()
time.sleep(2)
return redirect('/user_paging')
else:
# 需要更换的车牌号已经在停车场了(为临时车而非其他用户)
return render_template('user_edit.html', error2='该车牌号已存在')
else:
return render_template('user_edit.html', user_obj=user_obj)
@bp.route('/user_renewal', methods=['GET', 'POST'])
def user_renewal():
id = request.args.get('id')
user_obj = User.query.filter(User.id == id).first()
carnum = user_obj.carnum
formertime = user_obj.endtime
if request.method == 'POST':
level = request.form.get('vip-radios')
if not level:
return render_template('user_renewal.html', error='选择不能为空!')
else:
if user_obj.level != 0:
if level == "1":
newtime = (formertime + datetime.timedelta(days=31)).strftime("%Y-%m-%d %H:%M:%S")
charge = Charge(pay_time=datetime.datetime.now(), money=150)
elif level == "2":
newtime = (formertime + datetime.timedelta(days=93)).strftime("%Y-%m-%d %H:%M:%S")
charge = Charge(pay_time=datetime.datetime.now(), money=425)
elif level == "3":
newtime = (formertime + datetime.timedelta(days=186)).strftime("%Y-%m-%d %H:%M:%S")
charge = Charge(pay_time=datetime.datetime.now(), money=810)
else:
newtime = (formertime + datetime.timedelta(days=365)).strftime("%Y-%m-%d %H:%M:%S")
charge = Charge(pay_time=datetime.datetime.now(), money=1530)
else:
if level == "1":
newtime = (datetime.datetime.now() + datetime.timedelta(days=31)).strftime("%Y-%m-%d %H:%M:%S")
charge = Charge(pay_time=datetime.datetime.now(), money=150)
elif level == "2":
newtime = (datetime.datetime.now() + datetime.timedelta(days=93)).strftime("%Y-%m-%d %H:%M:%S")
charge = Charge(pay_time=datetime.datetime.now(), money=425)
elif level == "3":
newtime = (datetime.datetime.now() + datetime.timedelta(days=186)).strftime("%Y-%m-%d %H:%M:%S")
charge = Charge(pay_time=datetime.datetime.now(), money=810)
else:
newtime = (datetime.datetime.now() + datetime.timedelta(days=365)).strftime("%Y-%m-%d %H:%M:%S")
charge = Charge(pay_time=datetime.datetime.now(), money=1530)
db.session.add(charge)
db.session.commit()
user_obj.level = level
user_obj.begintime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
user_obj.endtime = newtime
db.session.commit()
try:
car_obj = Car_manage.query.get(carnum=carnum)
car_obj.genre = 1
db.session.commit()
now_time = datetime.datetime.now()
if now_time > formertime:
# 过期
if car_obj.begintime > formertime:
# 在到期后停进来
money = chargecount(car_obj.begintime, datetime.datetime.now())
if not Extra_charge.query.filter(carnum=carnum):
extra_charge = Extra_charge(carnum=carnum,
vip_begintime=car_obj.begintime.strftime("%Y-%m-%d %H:%M:%S"),
vip_deadline=datetime.datetime.now().strftime(
"%Y-%m-%d %H:%M:%S"), is_valid=True, money=money)
db.session.add(extra_charge)
db.session.commit()
else:
Extra_charge.query.filter(carnum=carnum).update(
vip_begintime=car_obj.begintime.strftime("%Y-%m-%d %H:%M:%S"),
vip_deadline=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), is_valid=True,
money=money)
else:
# 在到期前进来
money = chargecount(formertime, datetime.datetime.now())
if not Extra_charge.query.filter(carnum=carnum):
extra_charge = Extra_charge(carnum=carnum,
vip_begintime=formertime.strftime("%Y-%m-%d %H:%M:%S"),
vip_deadline=datetime.datetime.now().strftime(
"%Y-%m-%d %H:%M:%S"), is_valid=True, money=money)
db.session.add(extra_charge)
db.session.commit()
else:
Extra_charge.query.filter(carnum=carnum).update(
vip_begintime=formertime.strftime("%Y-%m-%d %H:%M:%S"),
vip_deadline=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), is_valid=True,
money=money)
else:
# 没过期
pass
except Exception as e:
pass
return redirect('/user_info')
else:
return render_template('user_renewal.html', user_obj=user_obj)
@bp.route('/user_paging', methods=['GET', 'POST'])
def user_paging():
# 从URL中取参数page,这个参数与pageinanter.py生成的HTML代码片段有关
cur_page_num = request.args.get('page')
if not cur_page_num:
cur_page_num = "1"
# 取得总记录数
total_count = User.query.count()
# 设定每一页显示多少条记录
one_page_lines = 6
# 页面上共展示多少页码标签
page_maxtag = 9
# 生成Paginater类的实例化对象
page_obj = Paginater(url_address='/user_paging/', cur_page_num=cur_page_num, total_rows=total_count,
one_page_lines=one_page_lines, page_maxtag=page_maxtag)
# 对表中的数据进行切片,取出属于本页的记录
all_users = User.query.all()[page_obj.data_start:page_obj.data_end]
if request.method == 'POST':
dropown = request.form.get('search_field')
if dropown == 'user_name':
keyword = request.form.get('keyword')
all_users = User.query.filter(name=keyword)
if not all_users:
# 空
error = '未查询到相关内容!'
return render_template('user_info.html', error=error)
else:
return render_template('user_info.html', all_users=all_users)
if dropown == 'car_num':
keyword = request.form.get('keyword')
all_users = User.query.filter(carnum=keyword)
if not all_users:
# 空
error = '未查询到相关内容!'
return render_template('user_info.html', error=error)
else:
return render_template('user_info.html', all_users=all_users)
else:
return render_template('user_info.html', all_users=all_users, page_nav=page_obj.html_page())
@bp.route('/car_import', methods=['GET', 'POST'])
def car_import():
# 显示车牌图片
# 没有入库的车辆列表
# car_list = []
# outside_obj = License_plate.query.filter(is_inside=False)
# for o in outside_obj:
# car_list.append(o.car_img)
# 获取刚刚进来的车辆
carnum = session.get('carnum', '沪E12345')
# 存放空停车位的列表
remain_list = []
# 获取停车场空余车位
remain_obj = Car_manage.query.filter(carnum__isnull=True)
for r in remain_obj:
remain_list.append(r.carport)
# 从在外车辆中随机选择一个
# car = random.choice(car_list)
# 读取图片
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
url = './media/' + str(new_car.car_img)
image = get_file_content(url)
if request.method == 'POST':
carnum = request.form.get('carnum')
new_car.car_num = carnum
db.session.commit()
# 从剩余车位中随机选择一个
carport = random.choice(remain_list)
begintime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
try:
is_user = User.query.get(carnum=carnum)
if is_user:
# 还要判断是否过期
if is_user.level != 0:
genre = 1
else:
genre = 2
except Exception as e:
genre = 2
finally:
carport_obj = Car_manage.query.get(carport=carport)
carport_obj.carnum = carnum
carport_obj.begintime = begintime
carport_obj.genre = genre
db.session.commit()
message = '{}刚刚停入{}号车位中'.format(carport_obj.carnum, carport_obj.carport)
session['message'] = message
# 将该车辆设为车场内车辆
try:
car_obj = License_plate.query.get(car_img=new_car.car_img)
car_obj.is_inside = True
cir = Car_in_record(carnum=carnum, begintime=begintime, carport=carport)
db.session.add(cir)
db.session.commit()
# 将图片放入carport_imgs
path = './media/carport_imgs/' + str(new_car.car_img).split('/')[1]
with open(path, 'wb') as f:
f.write(image)
f.close()
except Exception as e:
pass
return redirect('/car_port/')
else:
try:
res = Park_discern(image)
carnum = res['words_result']['number']
return render_template('car_import.html', carport_url=new_car.car_img, carnum=carnum)
except Exception as e:
print(e)
return Response('识别发生错误!')
@bp.route('/car_exit', methods=['GET', 'POST'])
def car_exit():
"""
车辆离场
:return:
"""
# 获取出行的车辆
carnum = session.get('carnum', '沪E12345')
if request.method == 'GET':
car_obj = Car_manage.query.filter(Car_manage.carnum == carnum).first()
begintime = car_obj.begintime
money = chargecount(begintime, datetime.datetime.now())
print(money)
global deadline
deadline = None
level = '临时用户'
is_vip = 0
start_seconds = time.mktime(begintime.timetuple()) * 1000 + begintime.microsecond / 1000
end_seconds = time.mktime(
datetime.datetime.now().timetuple()) * 1000 + datetime.datetime.now().microsecond / 1000
time_span = end_seconds - start_seconds
day_span = int(time_span / 1000 / 3600 / 24)
hour_span = int(time_span / 1000 / 3600 % 24)
minute_span = int(time_span / 1000 / 60 % 60)
park_time = str(day_span) + '天' + str(hour_span) + '小时' + str(minute_span) + '分钟'
session['payment'] = {'carnum': carnum, 'money': money, 'level': level, 'park_time': park_time,
'deadline': deadline, 'is_vip': is_vip}
return redirect('/pay')
@bp.route('/car_port', methods=['GET', 'POST'])
def car_port():
# A区总共车位
A_cars = Car_manage.query.filter(Car_manage.carport >= 1, Car_manage.carport <= 25)
A_cars_use = 0
Asum = 0
# A区使用中车位
for c in A_cars:
if c.carnum:
A_cars_use += 1
Asum += 1
B_cars = Car_manage.query.filter(Car_manage.carport >= 26, Car_manage.carport <= 50)
B_cars_use = 0
Bsum = 0
for c in B_cars:
if c.carnum:
B_cars_use += 1
Bsum += 1
C_cars = Car_manage.query.filter(Car_manage.carport >= 51, Car_manage.carport <= 75)
C_cars_use = 0
Csum = 0
for c in C_cars:
if c.carnum:
C_cars_use += 1
Csum += 1
D_cars = Car_manage.query.filter(Car_manage.carport >= 76, Car_manage.carport <= 100)
D_cars_use = 0
Dsum = 0
for c in D_cars:
if c.carnum:
D_cars_use += 1
Dsum += 1
message = session.get('message')
car_in_record = Car_in_record.query.order_by(Car_in_record.id.desc())[:5]
car_out_record = Car_out_record.query.order_by(Car_out_record.id.desc())[:5]
# 如果message为空
if not message:
is_message = 0
session['message'] = None
return render_template('car_port.html',
Asum=Asum, A_cars_use=A_cars_use, Bsum=Bsum, B_cars_use=B_cars_use, Csum=Csum,
C_cars_use=C_cars_use, Dsum=Dsum, D_cars_use=D_cars_use, is_message=is_message,
car_in_record=car_in_record, car_out_record=car_out_record)
else:
is_message = 1
session['message'] = None
return render_template('car_port.html',
Asum=Asum, A_cars_use=A_cars_use, Bsum=Bsum, B_cars_use=B_cars_use, Csum=Csum,
C_cars_use=C_cars_use, Dsum=Dsum, D_cars_use=D_cars_use, is_message=
is_message, message=message, car_in_record=car_in_record, car_out_record=car_out_record)
@bp.route('/car_record', methods=['GET', 'POST'])
def car_record():
return redirect('/car_record_paging')
@bp.route('/car_port_pagingA', methods=['GET', 'POST'])
def car_port_pagingA():
# 从URL中取参数page,这个参数与pageinanter.py生成的HTML代码片段有关
cur_page_num = request.args.get('page')
if not cur_page_num:
cur_page_num = "1"
# 取得总记录数
total_count = Car_manage.query.filter(carport__range=[1, 25], carnum__isnull=False).count()
# 设定每一页显示多少条记录
one_page_lines = 5
# 页面上共展示多少页码标签
page_maxtag = 6
# 生成Paginater类的实例化对象
page_obj = Paginater(url_address='/car_port_pagingA', cur_page_num=cur_page_num, total_rows=total_count,
one_page_lines=one_page_lines, page_maxtag=page_maxtag)
# 对表中的数据进行切片,取出属于本页的记录
all_cars = Car_manage.query.filter(carport__range=[1, 25], carnum__isnull=False).order_by('carport')[
page_obj.data_start:page_obj.data_end]
return render_template('car_port_info.html', all_cars=all_cars, page_nav=page_obj.html_page())
@bp.route('/car_port_pagingB', methods=['GET', 'POST'])
def car_port_pagingB():
# 从URL中取参数page,这个参数与pageinanter.py生成的HTML代码片段有关
cur_page_num = request.args.get('page')
if not cur_page_num:
cur_page_num = "1"
# 取得总记录数
total_count = Car_manage.query.filter(Car_manage.carport > 26, Car_manage.carport < 50,
Car_manage.carnum is not None).count()
# 设定每一页显示多少条记录
one_page_lines = 5
# 页面上共展示多少页码标签
page_maxtag = 6
# 生成Paginater类的实例化对象
page_obj = Paginater(url_address='/car_port_pagingB/', cur_page_num=cur_page_num, total_rows=total_count,
one_page_lines=one_page_lines, page_maxtag=page_maxtag)
# 对表中的数据进行切片,取出属于本页的记录
all_cars = Car_manage.query.filter(carport__range=[26, 50], carnum__isnull=False).order_by('carport')[
page_obj.data_start:page_obj.data_end]
return render_template('car_port_info.html', all_cars=all_cars, page_nav=page_obj.html_page())
@bp.route('/car_port_pagingC', methods=['GET', 'POST'])
def car_port_pagingC():
# 从URL中取参数page,这个参数与pageinanter.py生成的HTML代码片段有关
cur_page_num = request.args.get('page')
if not cur_page_num:
cur_page_num = "1"
# 取得总记录数
total_count = Car_manage.query.filter(Car_manage.carport > 51, Car_manage.carport < 75,
Car_manage.carnum is not None).count()
# 设定每一页显示多少条记录
one_page_lines = 5
# 页面上共展示多少页码标签
page_maxtag = 6
# 生成Paginater类的实例化对象
page_obj = Paginater(url_address='/car_port_pagingC/', cur_page_num=cur_page_num, total_rows=total_count,
one_page_lines=one_page_lines, page_maxtag=page_maxtag)
# 对表中的数据进行切片,取出属于本页的记录
all_cars = Car_manage.query.filter(carport__range=[51, 75], carnum__isnull=False).order_by('carport')[
page_obj.data_start:page_obj.data_end]
return render_template('car_port_info.html', all_cars=all_cars, page_nav=page_obj.html_page())
@bp.route('/car_port_pagingD', methods=['GET', 'POST'])
def car_port_pagingD():
# 从URL中取参数page,这个参数与pageinanter.py生成的HTML代码片段有关
cur_page_num = request.GET.get('page')
if not cur_page_num:
cur_page_num = "1"
# 取得总记录数
total_count = Car_manage.query.filter(carport__range=[76, 100], carnum__isnull=False).count()
# 设定每一页显示多少条记录
one_page_lines = 5
# 页面上共展示多少页码标签
page_maxtag = 6
# 生成Paginater类的实例化对象
page_obj = Paginater(url_address='/car_port_pagingD/', cur_page_num=cur_page_num, total_rows=total_count,
one_page_lines=one_page_lines, page_maxtag=page_maxtag)
# 对表中的数据进行切片,取出属于本页的记录
all_cars = Car_manage.query.filter(carport__range=[76, 100], carnum__isnull=False).order_by('carport')[
page_obj.data_start:page_obj.data_end]
return render_template('car_port_info.html', {'all_cars': all_cars, 'page_nav': page_obj.html_page()})
@bp.route('/car_port_info/<id>', methods=['GET', 'POST'])
def car_port_info(id):
if id == "1":
return redirect('/car_port_pagingA')
elif id == "2":
return redirect('/car_port_pagingB')
elif id == "3":
return redirect('/car_port_pagingC')
else:
return redirect('/car_port_pagingD')
@bp.route('/car_record_paging', methods=['GET', 'POST'])
def car_record_paging():
# 从URL中取参数page,这个参数与pageinanter.py生成的HTML代码片段有关
cur_page_num = request.args.get('page')
if not cur_page_num:
cur_page_num = "1"
# 取得总记录数
total_count = Car_record.query.count()
# 设定每一页显示多少条记录
one_page_lines = 10
# 页面上共展示多少页码标签
page_maxtag = 6
# 生成Paginater类的实例化对象
page_obj = Paginater(url_address='/car_record_paging/', cur_page_num=cur_page_num, total_rows=total_count,
one_page_lines=one_page_lines, page_maxtag=page_maxtag)
# 对表中的数据进行切片,取出属于本页的记录
all_cars = Car_record.query.all()[page_obj.data_start:page_obj.data_end]
return render_template('car_record.html', all_cars=all_cars, page_nav=page_obj.html_page())
@bp.route('/chefei', methods=['GET', 'POST'])
def chefei():
if request.method == 'GET':
price = Price.query.filter(Price.id == 1).first()
return render_template('car_import.html', price=price)
else:
day = request.form.get('day')
night = request.form.get('night')
top = request.form.get('top')
price = Price.query.filter(Price.id == 1).first()
price.day = day
price.night = night
price.top = top
db.session.commit()
return redirect('/chefei')
@bp.route('/pay', methods=['GET', 'POST'])
def pay():
if request.method == 'GET':
carnum = session.get('payment')['carnum']
money = session.get('payment')['money']
level = session.get('payment')['level']
if session.get('payment')['is_vip'] == 1:
deadline = session.get('payment')['deadline']
else:
deadline = None
park_time = session.get('payment')['park_time']
return render_template('pay.html', carnum=carnum, money=money, level=level, park_time=park_time,
deadline=deadline)
else:
# 添加车流纪录信息
carnum = request.form.get('carnum')
car_obj = Car_manage.query.filter(Car_manage.carnum == carnum).first()
begintime = car_obj.begintime
endtime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
genre = car_obj.genre
money = session.get('payment')['money']
try:
User.query.get(carnum=carnum)
money = 0
except Exception as e:
pass
carport_obj = Car_manage.query.filter(Car_manage.carnum == carnum).first()
cr = Car_record(carnum=carnum, begintime=begintime, endtime=endtime, genre=genre, money=money)
cor = Car_out_record(carnum=carnum, endtime=endtime, carport=carport_obj.carport)
db.session.add(cr)
db.session.add(cor)
db.session.commit()
# 将此车位清空
session['is_in'] = '0'
carport = carport_obj.carport
carport_obj.carnum = None
carport_obj.begintime = None
carport_obj.endtime = None
carport_obj.genre = 0
db.session.commit()
# 将收入写入表中
c = Charge(pay_time=datetime.datetime.now(), money=money)
db.session.add(c)
db.session.commit()
# 将该车辆设为车场外车辆
try:
# car_obj = License_plate.query.filter(License_plate.car_num==carnum).first()
# car_obj.is_inside = False
# db.session.commit()
# 将carport_imgs对应图片删除
path = './media/carport_imgs/' + str(car_obj.car_img).split('/')[1]
if os.path.exists(path):
os.remove(path)
cor = Car_out_record(carnum=carnum, endtime=endtime, carport=carport)
db.session.add(cor)
db.session.commit()
except Exception as e:
return Response('发生未知错误!')
finally:
time.sleep(2)
return redirect('/index')
# test
@bp.route('/test', methods=['GET', 'POST'])
def test():
if request.method == 'GET':
return render_template('test.html')
else:
try:
img = request.FILES.get('car_img')
if img is None:
# 没有选择图片,而直接点击检测
error = '请选择一张图片!'
return render_template('test.html', error=error)
else:
# 先需要判断该车牌是否已经存在
is_exist = License_plate.query.filter(car_img='car_imgs/' + str(img)).count()
# 如果不存在
if is_exist == 0:
new_car = License_plate(car_img=img, is_inside=False)
db.session.add(new_car)
db.session.commit()
session['id'] = new_car.id
time.sleep(2)
return redirect('/car_import/')
else:
# 如果存在,要判断该车应该是在内还是在外
is_inside = License_plate.query.get(car_img='car_imgs/' + str(img)).is_inside
# 内
if is_inside == True:
error = '该车已经在停车场中!'
return render_template('test.html', error=error)
# 外
else:
out_car = License_plate.query.get(car_img='car_imgs/' + str(img))
session['id'] = out_car.id
return redirect('/car_import/')
except Exception as e:
error = '未知错误'
return render_template('test.html', error=error)
@bp.route('/test2', methods=['GET', 'POST'])
def test2():
if request.method == 'GET':
return render_template('test2.html')
else:
try:
img = request.FILES.get('car_img')
# 先需要判断该车牌是否已经存在
is_exist = License_plate.query.filter(car_img='car_imgs/' + str(img)).count()
# 如果不存在
if is_exist == 0:
error = '未检测到该车!'
return render_template('test2.html', error=error)
else:
# 如果存在,要判断该车应该是在内还是在外
is_inside = License_plate.query.get(car_img='car_imgs/' + str(img)).is_inside
# 内
if is_inside == True:
in_car = License_plate.query.get(car_img='car_imgs/' + str(img))
session['id'] = in_car.id
return redirect('/car_exit/')
# 外
else:
error = '未检测到该车!'
return render_template('test2.html', error=error)
except Exception as e:
# 没有选择图片,而直接点击检测
error = '请选择一张图片!'
@bp.route('/analysis', methods=['GET'])
def analysis():
"""
:return:
"""
return render_template('analysis.html')
@bp.route('/movies', methods=['get'])
def movies():
return render_template('movies.html')
@bp.route('/user', methods=['get'])
def user():
return render_template('user.html')
@bp.route('/text', methods=['get'])
def texts():
return render_template('text.html')
@bp.route('/login_out', methods=['get'])
def login_out():
"""
注销登录
:return:
"""
# 删除session
if session.get("username"):
del session["username"]
return redirect('/')
@bp.route('/collect_face', methods=['POST'])
def collect_face():
print("开始采集人脸")
face_id = request.form.get('face_id')
name = request.form.get('name')
print(name)
user_obj = User.query.filter(User.name == name).first()
if user_obj:
return jsonify({'msg': '人脸已存在,无须重复录入!', 'statusCode': '500'})
time.sleep(1)
from .recognize_face.workAttendanceSystem import WAS
frame = WAS()
result = frame.register_cap(name, face_id)
# user_obj.face_id = face_id
# db.session.commit()
return jsonify({'msg': 'ok', 'statusCode': '200'})
@bp.route('/detection', methods=['POST'])
def detection():
from .recognize_face.workAttendanceSystem import WAS
frame = WAS()
file = request.files['file']
leibie = request.form.get('leibie')
filename = secure_filename(file.filename)
file_path = os.path.join(workdir, 'static/upload', filename)
file.save(file_path)
print("开始验证")
face_id = frame.punchcard_cap(file_path)
print("人脸ID", face_id)
if not face_id:
return jsonify({'msg': '识别失败,未识别到人脸!', 'statusCode': '500'})
user_obj = User.query.filter(User.face_id == face_id).first()
is_exists = Car_manage.query.filter(Car_manage.carnum == user_obj.carnum).first()
if is_exists:
return jsonify({'msg': '{}已经进场, 无需重复进场!'.format(user_obj.carnum), 'statusCode': '500'})
if leibie == 'car1':
chewei = Car_manage.query.filter(Car_manage.carport >= 1, Car_manage.carport <= 25).all()[0]
elif leibie == 'car2':
chewei = Car_manage.query.filter(Car_manage.carport >= 26, Car_manage.carport <= 50).all()[0]
elif leibie == 'car3':
chewei = Car_manage.query.filter(Car_manage.carport >= 51, Car_manage.carport <= 75).all()[0]
else:
chewei = Car_manage.query.filter(Car_manage.carport >= 76, Car_manage.carport <= 100).all()[0]
cir = Car_in_record(carnum=user_obj.carnum, carport=chewei.carport)
chewei.genre = 1
chewei.begintime = datetime.datetime.now()
chewei.carnum = user_obj.carnum
session['is_in'] = '1'
session['carnum'] = user_obj.carnum
db.session.add(cir)
db.session.commit()
return jsonify({'msg': '{}停车成功!'.format(user_obj.carnum), 'statusCode': '200'})
获取源码或论文
如需对应的论文或源码,以及其他定制需求,也可以下方微信联系我。
更多推荐

所有评论(0)