会议室预订系统(meeting room booking system)

本文介绍了使用Django实现会议室预订系统的过程,包括目标及业务流程、表结构设计、系统登录、前端数据处理和视图处理。重点讲解了模型设计、用户认证、数据处理、前端AJAX交互以及预订和取消的逻辑处理。
摘要由CSDN通过智能技术生成

一、目标及业务流程

期望效果:

业务流程:

  1. 用户登录
  2. 预定会议室
  3. 退订会议室
  4. 选择日期;今日以及以后日期

二、表结构设计和生成

1、models.py(用户继承AbstractUser)

from django.db import models
# Create your models here.
from django.db import models
from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser):
    """用户信息表"""
    tel = models.CharField(max_length=32)

class Room(models.Model):
    """会议室表"""
    caption = models.CharField(max_length=32)   # 会议室名字
    num = models.IntegerField()   # 会议室容纳人数
    def __str__(self):
        return self.caption

class Book(models.Model):
    """会议室预订信息"""
    user = models.ForeignKey("UserInfo", on_delete=models.CASCADE)   # CASCADE级联删除
    room = models.ForeignKey("Room", on_delete=models.CASCADE)
    date = models.DateField()  # 日期
    time_choices = (    # 时段
        (1, '8:00'),
        (2, '9:00'),
        (3, '10:00'),
        (4, '11:00'),
        (5, '12:00'),
        (6, '13:00'),
        (7, '14:00'),
        (8, '15:00'),
        (9, '16:00'),
        (10, '17:00'),
        (11, '18:00'),
        (12, '19:00'),
        (13, '20:00'),
    )
    time_id = models.IntegerField(choices=time_choices)    # 存数字,choices参数
    class Meta:
        unique_together = (   # 三个联合唯一,防止有人重复预定
            ('room', 'date', 'time_id'),
        )
    def __str__(self):
        return str(self.user) + "预定了" + str(self.room)

注意:

(1)Django中提供了AbstractUser类,可以用来自由定制需要的model
from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser):
    """用户信息表"""
    tel = models.CharField(max_length=32)

  如上所示,即可在Django的基础上添加我们所需要的信息。

(2)设置model的时候,设置三个字段联合唯一
class Book(models.Model):
    """会议室预订信息"""
    ....
    class Meta:
        unique_together = (   # 三个联合唯一,防止有人重复预定
            ('room', 'date', 'time_id'),
        )

   存的是key 显示的是value,且只能存key

2、修改配置文件settings.py,覆盖默认的User模型

  Django允许你通过修改setting.py文件中的 AUTH_USER_MODEL 设置覆盖默认的User模型,其值引用一个自定义的模型。

AUTH_USER_MODEL = "app01.UserInfo"

  上面的值表示Django应用的名称(必须位于INSTALLLED_APPS中)和你想使用的User模型的名称。

注意:在创建任何迁移或者第一次运行 manager.py migrate 前设置 AUTH_USER_MODEL

  设置AUTH_USER_MODEL数据库结构有很大的影响。改变了一些会使用到的表格,并且会影响到一些外键和多对多关系的构造。在你有表格被创建后更改此设置是不被 makemigrations 支持的,并且会导致你需要手动修改数据库结构,从旧用户表中导出数据,可能重新应用一些迁移。

3、数据迁移及创建超级用户

$ python3 manage.py makemigrations
$ python3 manage.py migrate

  这里遇到了一个问题:创建项目时没有创建应用,手动通过manage.py startapp user创建子项目,修改AUTH_USER_MODEL后执行makemigrations一直报错,找不到app01。

  创建两个超级用户:

MacBook-Pro:MRBS hqs$ python3 manage.py createsuperuser
Username: yuan
Password:yuan1234

MacBook-Pro:MRBS hqs$ python3 manage.py createsuperuser
Username: alex
Password:alex1234

三、系统登录login

urls.py:

from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.login),
    path('index/', views.index),
    path('book/', views.book),
]

简单login.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post">
    用户名:<input type="text" name="user">
    密码:<input type="password" name="pwd">
    <input type="submit">
</form>
</body>
</html>

login视图函数:

from django.shortcuts import render, redirect
# Create your views here.
from django.contrib import auth

def login(request):
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")

        user = auth.authenticate(username=user, password=pwd)
        if user:
            # 登录成功
            auth.login(request, user)   # 注册request.user,可以拿到登录用户对象所有信息
            redirect("/index/")

    return render(request, "login.html")

  注意:auth模块的authenticate()方法,提供了用户认证,如果认证信息有效,会返回一个  User  对象;如果认证失败,则返回None。

四、index部分

1、引入admin组件(后台数据管理组件)并完成admin注册

admin.py:

from django.contrib import admin
# Register your models here.
from app01.models import *

admin.site.register(UserInfo)
admin.site.register(Book)
admin.site.register(Room)

2、在数据库添加数据

  

  

3、index视图函数数据处理和index.html模板渲染

def index(request):
    # 取当前日期
    date = datetime.datetime.now().date()
    print(date)  # 2018-08-17
    # 取预约日期,没有指定取当前日期
    book_date = request.GET.get("book_date", date)
    print(book_date)  # 2018-08-17

    # 拿到预定表中的时段
    time_choices = Book.time_choices
    # 拿到所有的会议室
    room_list = Room.objects.all()
    # 拿到预定信息
    book_list = Book.objects.filter(date=book_date)

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值