from django.db import models # Create your models here. from django.db import models from django.contrib.auth.models import AbstractUser # 使用了django原生的user表 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) # 预定的人 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) class Meta: # 联合唯一不能重复,限制了不能一个时间出现2次预定 unique_together = ( ('room', 'date', 'time_id'), ) def __str__(self): return str(self.user) + "预定了" + str(self.room)
from django.shortcuts import render, HttpResponse, redirect from app01 import models from django.contrib import auth import datetime import json # Create your views here. def login(request): if request.method == "POST": user = request.POST.get("user") pwd = request.POST.get("pwd") print(user, pwd) user = auth.authenticate(username=user, password=pwd) print(user) if user: auth.login(request, user) # request.user 将user的值注册到session中 return redirect("/index/") return render(request, "login.html") def index(request): # 取到当前日期 date = datetime.datetime.now().date() # 接受前端post数据更新数据库 if request.method == "POST": Book_add = json.loads(request.POST.get("Book_add")) Book_del = json.loads(request.POST.get("Book_del")) # 定义一个返回前端的字典 book_stadus = {"stadus": 0, "msg": ""} # 删除数据 if Book_del: print(Book_del) for k, v in Book_del.items(): for time_id in v: models.Book.objects.filter(room_id=k, time_id=time_id).delete() book_stadus['stadus'] = 1 book_stadus['msg'] = "取消成功预定成功" # 添加数据库 if Book_add: for k, v in Book_add.items(): for time_id in v: add_book = models.Book.objects.create(user_id=request.user.pk, date=date, room_id=k, time_id=time_id) book_stadus['stadus'] = 2 book_stadus['msg'] = "添加预定成功" return HttpResponse(json.dumps(book_stadus)) time_choices = models.Book.time_choices room_list = models.Room.objects.all() # 取到当前时间的值 book_list = models.Book.objects.filter(date=date) # 在前端模板系统页面所实现的功能有限,后端好一些 htmls = "" # 取到了所有的会议室和数量 # [<Room: 301 会议室>, <Room: 302会议室>, <Room: 303会议室>, <Room: 304会议室>, <Room: 305会议室>, <Room: 306会议室>] for room in room_list: htmls += "<tr><td>{}({})</td>".format(room.caption, room.num) # 1~13点的选择 for time_choice in time_choices: flag = False # 找到今天已经预定的房间的pk值 for book in book_list: if book.room.pk == room.pk and book.time_id == time_choice[0]: # 意味着这个单元格已经被预定了 flag = True break if flag: if request.user.pk == book.user.pk: htmls += "<td class='active click_event users' room_id={} time_id={}>{}</td>".format(room.pk, time_choice[ 0], book.user.username) else: htmls += "<td class='another_active ' room_id={} time_id={}>{}</td>".format(room.pk, time_choice[0], book.user.username) else: # 每一个方格上都让他有自己的id值 htmls += "<td class='click_event ' room_id={} time_id={}></td>".format(room.pk, time_choice[0]) htmls += "</tr>" return render(request, "index.html", locals())
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!--配置手机端适应--> <meta name="viewport" content="width=device-width,initial-scale=1"> <!--配置css文件 核心CSS样式压缩文件--> <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="/static/font-awesome-4.7.0/css/font-awesome.css"> <!--配置jQuery--> <script src="/static/bootstrap/jQuery.js"></script> <!--配置 核心Boot script JS压缩文件--> <script src="/static/bootstrap/js/bootstrap.min.js"></script> <style> .active { {#优先级问题#} background-color: orange !important; } .another_active { background-color: #2b669a; color: white; } #msg { position: relative; top: 0px; } </style> </head> <body> <div class="container"> <div class="row"> <div class="col-md-13 col-md-offset-0"> <h3>会议室预定系统({{ date|date:"Y-m-d " }})</h3> <table class="table table-bordered table table-striped"> <thead> <tr> <th>会议室/时间</th> {% for time in time_choices %} <th>{{ time.1 }}</th> {% endfor %} </tr> </thead> <tbody> {{ htmls|safe }} <!--需要在后端做--> </tbody> </table> <span id="msg" class="pull-right"></span> <div> <button id="updata_meeting" type="submit" class="btn btn-success pull-right">确认提交</button> </div> </div> </div> </div> {% csrf_token %} </body> <script> //获取选中会议室的数据(最难) var POST_DATA = { // 定义了一个添加的列表和一个删除的列表 "ADD_room": {}, "DEL_room": {}, }; // 给每个时间格子绑定点击事件 $(".click_event").on("click", function () { // 在点击的一瞬间 var room_id = $(this).attr("room_id"); var time_id = $(this).attr("time_id"); {#alert($(this).hasClass('active'));#} //点击后将添加颜色 if ($(this).hasClass('active')) { $(this).removeClass('active'); $(this).text(''); // 如果点击取消的值是当前登录用户已经选择的会议室 if ($(this).hasClass('users')) { if (POST_DATA.DEL_room[room_id]) { POST_DATA.DEL_room[room_id].push(time_id) } else { // time_id必须定义一个列表 方便点击push放值 POST_DATA.DEL_room[room_id] = [time_id]; } } else { POST_DATA.ADD_room[room_id].pop(time_id); //如果当前的列表为空,我就把key也删除 if (POST_DATA.ADD_room[room_id].length === 0) { delete POST_DATA.ADD_room[room_id] } } } else { if ($(this).hasClass('users')) { $(this).addClass('active'); $(this).text('{{ request.user }}'); //应为他已经是选择好的,所以把他删除了 delete POST_DATA.DEL_room[room_id] } else { $(this).addClass('active'); $(this).text('{{ request.user }}'); if (POST_DATA.ADD_room[room_id]) { POST_DATA.ADD_room[room_id].push(time_id) } else { // time_id必须定义一个列表 方便点击push放值 POST_DATA.ADD_room[room_id] = [time_id]; } } } }); //向后端发送数据 $("#updata_meeting").on("click", function () { $.ajax({ url: "/index/", type: "POST", data: { //当时对象的时候一点要记得json一下在发送过去 'csrfmiddlewaretoken': $("input[name='csrfmiddlewaretoken']").val(), "Book_add": JSON.stringify(POST_DATA.ADD_room), "Book_del": JSON.stringify(POST_DATA.DEL_room), }, success: function (arg) { arg = JSON.parse(arg); if (arg.stadus == 2) { $("#msg").text(arg.msg); $("#msg").css('color', 'hotpink'); var t1 = window.setTimeout(function () { $("#msg").text(""); }, 2000) } else { $("#msg").text(arg.msg); $("#msg").css('color', 'red'); var t1 = window.setTimeout(function () { $("#msg").text(""); }, 2000) } $("#msg").text(arg.msg); $("#msg").css('color', 'red'); var t1 = window.setTimeout(function () { location.reload(); }, 3000) } }); //清空POST_DATA列表 //获取选中会议室的数据(最难) POST_DATA = { // 定义了一个添加的列表和一个删除的列表 "ADD_room": {}, "DEL_room": {}, } }) </script> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!--配置手机端适应--> <meta name="viewport" content="width=device-width,initial-scale=1"> <!--配置css文件 核心CSS样式压缩文件--> <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="/static/font-awesome-4.7.0/css/font-awesome.css"> <!--配置jQuery--> <script src="/static/bootstrap/jQuery.js"></script> <!--配置 核心Boot script JS压缩文件--> <script src="/static/bootstrap/js/bootstrap.min.js"></script> <style> .top_move{ margin-top: 100px; } </style> </head> <body> <div class="container top_move"> <div class="row"> <div class="col-md-6 col-md-offset-3"> <form action="/login/" method="post"> {% csrf_token %} <p > 用户名: <input type="text" class="form-control" name="user"> </p> <p > 密码: <input type="password" class="form-control" name="pwd"> </p> <button type="submd" class="btn btn-success">提交</button> </form> </div> </div> </div> </body> </html>