Python图书馆座位预约系统

前言:

今天给大家分享一个基于PythonWeb(django)框架开发的一款Web项目(图书馆座位预约系统),如下是项目的简介:

项目名称:基于Django的图书馆座位预约系统.

项目实现功能:用户的登陆注册,用户可以预约学校的图书馆座位(几号图书馆什么时间(日期+上午/下午/晚上)几号座位),如果a用户选中了某一个图书馆的某个时间段的某个作为则该作为会被标记为不可选中状态,用户可以查看并且取消自己的预约的座位信息情况,如果用户违规使用座位或者没有按时使用已预约座位将会收到后台的警告,同时用户可以对自己的账号数据信息惊醒修改等.

项目涉及技术:Python,Django,MySQL,BootStrap,Web

项目分析:

项目数据库搭建:

from django.db import models
from django.utils.safestring import mark_safe

# 学生表
class Students(models.Model):
    id = models.AutoField(verbose_name="编号", primary_key=True)
    name = models.CharField(verbose_name="姓名", max_length=22, default='')
    password = models.CharField(verbose_name="密码", max_length=32, default='')
    phone = models.CharField(verbose_name="手机号", max_length=11, default='')
    email = models.CharField(verbose_name="邮箱", max_length=22, default='')
    time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
    photo = models.FileField(verbose_name="头像", default='', upload_to="Students/photo/")
    is_active = models.BooleanField(verbose_name="活跃状态", default=True)
    def admin_sample(self):
        return mark_safe('<img src="/media/%s" height="60" width="60" />' % (self.photo,))
    admin_sample.short_description = '学生图片'
    admin_sample.allow_tags = True
    def __str__(self):
        return self.name
    class Meta:
        # 数据库列表名
        db_table = 'Students'
        # 后台管理名
        verbose_name_plural = '学生管理'
# 自习室信息表
class Rooms(models.Model):
    id = models.AutoField(verbose_name="编号", primary_key=True)
    name = models.CharField(verbose_name="名称", max_length=22, default='')
    number = models.IntegerField(verbose_name="座位数量", default=0)
    photo = models.FileField(verbose_name="头像", default='', upload_to="Room/photo/")
    time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
    is_active = models.BooleanField(verbose_name="活跃状态", default=True)

    def admin_sample(self):
        return mark_safe('<img src="/media/%s" height="60" width="60" />' % (self.photo,))

    admin_sample.short_description = '图书馆图片'
    admin_sample.allow_tags = True

    def __str__(self):
        return self.name

    class Meta:
        # 数据库列表名
        db_table = 'Room'
        # 后台管理名
        verbose_name_plural = '自习室管理'

# 预约管理
class Bookings(models.Model):
    id = models.AutoField(verbose_name="编号", primary_key=True)
    students = models.ForeignKey(verbose_name="学生", to='Students', null=True, on_delete=models.CASCADE)
    number = models.IntegerField(verbose_name="预约座位号", default=0)
    room = models.ForeignKey(verbose_name="自习室", to='Rooms', on_delete=models.CASCADE, null=True)
    booking_day = models.CharField(verbose_name="预定日期", max_length=22, default=0)
    # 1.上午 2.下午 3.晚自习
    time_choice = (
        (1, '上午'),
        (2, '下午'),
        (3, '晚自习'),
    )
    period = models.IntegerField(verbose_name="时间", choices=time_choice, default=1)
    time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
    is_active = models.BooleanField(verbose_name="活跃状态", default=True)

    def __str__(self):
        return self.students.name

    class Meta:
        # 数据库列表名
        db_table = 'Booking'
        # 后台管理名
        verbose_name_plural = '预约管理'

    def admin_sample(self):
        return mark_safe('<img src="/media/%s" height="60" width="60" />' % (self.students.photo,))

    admin_sample.short_description = '学生图片'
    admin_sample.allow_tags = True


# 警告管理
class Integrals(models.Model):
    id = models.AutoField(verbose_name="编号", primary_key=True)
    student = models.ForeignKey(verbose_name="学生", to='Students', on_delete=models.CASCADE)
    title = models.CharField(verbose_name="警告题目", max_length=220, default='')
    text = models.TextField(verbose_name="警告内容内容", max_length=220, default='')
    time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
    is_active = models.BooleanField(verbose_name="活跃状态", default=True)

    def __str__(self):
        return self.student.name

    class Meta:
        # 数据库列表名
        db_table = 'Integral'
        # 后台管理名称
        verbose_name_plural = '学生警告管理'

    def admin_sample(self):
        return mark_safe('<img src="/media/%s" height="60" width="60" />' % (self.student.photo,))

    admin_sample.short_description = '学生图片'
    admin_sample.allow_tags = True


# 公告管理
class Text(models.Model):
    id = models.AutoField(verbose_name="编号", primary_key=True)
    title = models.CharField(verbose_name="题目", max_length=120, default='')
    text = models.TextField(verbose_name="内容", default='')
    time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
    is_active = models.BooleanField(verbose_name="活跃状态", default=True)

    def __str__(self):
        return self.text

    class Meta:
        # 数据库列表名
        db_table = 'Text'
        # 后台管理名
        verbose_name_plural = '提示管理'




# python manage.py makemigrations
# python manage.py migrate
# python manage.py createsuperuser

后端views代码:

from django.shortcuts import render, HttpResponseRedirect
from django.utils import timezone
from login.models import *


# 01显示自习室信息
def bookings(request):
    try:
        room = Rooms.objects.filter(is_active=True)
    except Exception as e:
        room = None
    return render(request, '../templates/index/Bookings.html', {"room": room})


# 02预约座位
def seat(request, id):
    try:
        room = Rooms.objects.get(id=id)  # 选择的自习室信息
        rooms = Rooms.objects.filter(is_active=True)  # 所有自习室信息
    except Exception as e:
        print(e)
        return
    if request.method == "GET":
        room_selected = request.GET.get('room_id')
        # 选择时间
        if room_selected:
            # 判断用户选择的时间
            time_selected_r = int(request.GET.get('day'))  # 日期
            time_selected_s = int(request.GET.get('time'))  # 时间
            # 日期判断
            d1 = timezone.now()
            time = int(d1.day)
            if time_selected_r == 1:  # 当天
                time = time
            elif time_selected_r == 2:  # 明天
                time = time + 1
            if time > 31:
                time = 1

            if d1.month < 10 and time < 10:
                booking_day = str(d1.year) + '-0' + str(d1.month) + '-0' + str(time)
            elif d1.month < 10 and time > 10:
                booking_day = str(d1.year) + '-0' + str(d1.month) + '-' + str(time)
            elif d1.month > 10 and time < 10:
                booking_day = str(d1.year) + '-' + str(d1.month) + '-0' + str(time)
            else:
                booking_day = str(d1.year) + '-' + str(d1.month) + '-' + str(time)

            try:
                room_1 = Rooms.objects.get(id=room_selected)  # 找到对应的自习室

                bookinged = Bookings.objects.filter(
                    period=time_selected_s,
                    room_id=room_selected,
                    is_active=True,
                    booking_day=booking_day
                ).all().values('number')

                seat_booked_list = []
                for i in list(bookinged):
                    seat_booked_list.append(i['number'])


            except Exception as e:

                return
            seat_list = []
            # 填充座位列表
            for i in range(room.number + 1):
                seat_list.append(i)
            seat_list.remove(0)

            return render(request, '../templates/index/seat_id.html', {"room": room,
                                                                       "rooms": rooms,
                                                                       "seat": seat_list,
                                                                       "seat_booked": seat_booked_list,
                                                                       "room_id": room_selected,
                                                                       "time_selected_r": time_selected_r,
                                                                       "time_selected_s": time_selected_s,
                                                                       "room_1": room_1.name,
                                                                       })
        # 没选时间
        else:
            return render(request, '../templates/index/seat.html', {"room": room,
                                                                    "rooms": rooms,
                                                                    "room_id": room.id})
    elif request.method == 'POST':
        room_1 = request.POST['room']  # 自习室
        number = request.POST['number']  # 座位号
        period = request.POST['time']  # 时间段
        name = request.session.get("name")  # 用户名
        name = name['name']  # 用户名
        day = request.POST['day']  # 今天或明天

        # 日期判断
        d1 = timezone.now()  # 当前时间
        time = int(d1.day)  # 当前的日期(天数)
        if int(day) == 1:
            time = time
        elif int(day) == 2:
            time = time + 1


        if d1.month < 10 and time < 10:
            booking_day = str(d1.year) + '-0' + str(d1.month) + '-0' + str(time)
        elif d1.month < 10 and time > 10:
            booking_day = str(d1.year) + '-0' + str(d1.month) + '-' + str(time)
        elif d1.month > 10 and time < 10:
            booking_day = str(d1.year) + '-' + str(d1.month) + '-0' + str(time)
        else:
            booking_day = str(d1.year) + '-' + str(d1.month) + '-' + str(time)

        # 判断本人有没有已经预约了座位
        name = request.session.get('name')
        name = name['name']
        try:
            student = Students.objects.get(name=name)
            book = Bookings.objects.filter(
                students_id=student.id,
                period=period,
                is_active=True,
                booking_day=booking_day
            )

        except Exception as e:
            print(e)
            return
        if book:
            msg = "alert"
            return render(request, '../templates/index/seat.html',
                          {"rooms": rooms, "room": room, "room_id": room.id, "msg": msg})
        else:
            try:
                student = Students.objects.get(name=name)
                booking = Bookings.objects.create(
                    students=student,
                    number=number,
                    room_id=room_1,
                    period=period,
                    booking_day=booking_day
                )
            except Exception as e:
                print(e)
            return HttpResponseRedirect('/index/recording/')


# 03查看预约信息
def recording(request):
    student = request.session.get('name')
    student = student['name']
    id = request.GET.get('id')
    # 取消预约
    if id:
        try:
            booking = Bookings.objects.get(id=id)
        except Exception as e:
            print(e)
            return
        booking.is_active = False
        booking.save()
        return HttpResponseRedirect("/index/recording/")

    # 获取预约信息
    try:
        student = Students.objects.get(name=student).id
        booking = Bookings.objects.filter(is_active=True, students_id=student).order_by('-time')
    except Exception as e:
        print(e)
        return
    # 日期判断
    d1 = timezone.now()
    day = int(d1.day)
    return render(request, '../templates/index/Recording.html', {"booking": booking, "day": day})


# 04警告信息
def warn(request):
    student = request.session.get('name')
    student = student['name']
    try:
        student = Students.objects.get(name=student)
        integrals = Integrals.objects.filter(is_active=True, student_id=student.id)
    except Exception as e:
        print(e)
        return
    return render(request, '../templates/index/warn.html', {"integrals": integrals})
项目实现效果截图:

结尾:

需要该项目或有Python项目相关的问题的同学可以关注私信我,或者下方 名片加我微信交流~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追寻定义的熊百涛!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值