图书馆座位预约系统(Django框架)

图书馆预约系统是为了缓解高校图书馆座位紧缺,为大学生提供及时的座位供其使用。本系统可以实现用户座位预约,管理员可以对在用户的预约信息进行管理,查询用户的预约记录,用户可以自行注册,也可对密码进行更改。

2 系统分析

在本系统中用户需先自行注册,拥有用户名,然后以用户名和密码登录系统,自行选择预约时段和座位进行预约。一个座位在一个预约时段只允许一个用户对其进行预约,该用户预约后即对该座位进行锁定,座位信息后方显示“不可预约”。

管理员可查看用户的预约信息对其进行管理,用户也可自行登录查看预约记录或取消预约,在离开时进行签离。

3 系统功能设计

3.1登录,注册(增查)

该功能的的设计和实现主要是基于数据库的增查实现的,注册时获取用户输入的相关信息,对于提交的信息作出相关的逻辑验证(1.账户是否存在2.两次密码是否非空且一致3.其他)若符合相关的条件限制,写入到数据库用户表的相关信息中;登录时获取用户输入的相关的信息,对于提交的信息做出相关的业务逻辑验证(1.用户账号是否存在2.账户密码是否一致3.其他)若符合相关的条件限制,跳转页面,不符合相关的业务逻辑设计,返回错误信息;

3.2用户管理(增删改查)

该功能主要是基于数据库的增删改查实现的,当用户的相关操作,符合相关的业务逻辑设计的情况之下,可以对数据库的用户表实现增删改查的操作,实现相关的业务;

3.3座位管理(增删改查)

该功能主要是基于数据库的增删改查实现的,当用户的相关操作,符合相关的业务逻辑设计的时候,可以对数据库的座位表实现增删改查的操作,实现相关的业务;

3.4座位预约(查改)

该功能是基于数据库信息的改查操作实现的:

1.将座位ID更新到用户表中

2.更新座位表中的座位状态

3.查询用户表中的座位的ID,根据ID查询座位表,将相关信息展示到个人页面

由此即可完成预约操作,取消预约操作与此一致:

1.将用户的座位ID置为默认值

2.更新座位表中的座位状态

3.5个人信息(查改)

该操作主要基于数据库的改查操作实现的,查询用户表中的座位的ID,根据ID查询座位表,将相关信息展示到个人页面,完成个人信息的展示;充值功能则是获取用户输入的信息,当用户提交的信息符合相关的业务逻辑(1.信息非空2.金额>=0),根据当前用户的账号,查询对应余额,并在此基础上更新余额为账号余额+充值余额,完成账户余额充值的操作;

3.6其他(中间件、轮播图)

中间件:利用条件判断,判断相关路径,其符合预定的业务逻辑的时候,进行相关的页面跳转操作;

轮播图:主要是基于js和css技术现实的;

4 关键技术

我们的系统具有一定的框架性,因此对关键技术的复用性较高,用到关键技术的模块主要包括注册登录、用户的增删改查、座位的增删改查、座位预约以及个人信息。

4.1注册登录模块

首先当数据库中未保存信息时需要进行注册,注册时要输入两次密码,如果前后不一致时则报错;账号不能重复,如果重复则报错,涉及到对数据库的增加操作。相关代码如下:

def register(request):

    if request.method=="GET":

        form = RegisterForm()

        return render(request,"register.html",{"form":form})

    form = RegisterForm(data=request.POST)

    if form.is_valid():

        account=request.POST.get("account")

        password=request.POST.get("password")

        password2=request.POST.get("password2")

        print(password)

        print(password2)

        wo=user.objects.filter(account=account).first()

        if not wo:

            if password2==password:

                passowrd3=md5(password2)         user.objects.create(account=account,password=passowrd3,money=0,seat=0,registime="1999-09-09")

                return render(request, "registrationSuccess.html")

            form.add_error("password2","密码不一致")

            form.add_error("password","密码不一致")

            return render(request, "register.html", {"form": form})

        form.add_error("account","账号已经存在")

        return render(request, "register.html", {"form": form})

    return render(request, "register.html", {"form": form})

用户名密码需要与数据库中的信息进行匹配验证,如果不一致则报错,如果一致则进行图片验证码的验证,验证通过则可以登录跳转到下一个界面。关键代码如下:

def image_code(request):

    # 调用pillow 生成验证码

    img,code = check_code()

    print(code)

    # 把验证码字符串存到session中,便于登录验证

    request.session["image_code"] = code

    # session超时60秒

    request.session.set_expiry(60)

    stream = BytesIO()

    img.save(stream, 'png')

    return HttpResponse(stream.getvalue())

def login(request):

    if request.method=="GET":

        form = LoginForm()

        return render(request,"login.html",{"form":form})

    form = LoginForm(data=request.POST)

    if form.is_valid():

 #       print(form.cleaned_data)

        code = form.cleaned_data.pop("code")

        image_code = request.session.get("image_code","")

        if code.upper() != image_code.upper():

            form.add_error("code","验证码错误")

            return render(request, "login.html", {"form": form})

        # 使错误回显

        admin_obj = models.user.objects.filter(**form.cleaned_data).first()

        if not admin_obj:

            form.add_error("password","用户名或密码错误")

            return render(request,"login.html",{"form":form})

        # 用户名和密码正确

        # 网站随机生成字符串写到浏览器,再写到session。保存到数据库中的表中

        request.session["name"]=admin_obj.account

        print(admin_obj.account)

        print("****************************************")

        request.session["info"]={"id":admin_obj.id,"name":admin_obj.account}

        #在重新设置session超时时间为7天

        request.session.set_expiry(60 * 60 * 24 * 7)

        return redirect("/index")

    return render(request, "login.html", {"form": form})

4.2增删改查模块

对增删改查技术我们进行了复用,主要包括对注册用户的增删改查以及对图书馆座位的增删改查,这里我们以图书馆座位为例,进行技术代码展示。

在座位预约界面进行座位信息的总体展示,主要为查询数据库中的信息,由于数据信息较多因此我们使用了分页技术与查询技术,用户可以通过查询书库代号来选择座位。相关代码如下:

#座位管理

def seat_list(request):

    #拿到搜索的值 如果没有设置为空

    data_dict = {}

    search_data = request.GET.get("q","")

    if search_data:

        data_dict["kind__contains"] = search_data  #kind__contains,按照kind进行检索

    pagenum = int(request.GET.get("page", 1))

    pagesize = 10  # 每页显示10条数据

    start_count = (pagenum - 1) * pagesize

    end_count = pagenum * pagesize

    # order_by

    seat_data = seatReservation.objects.all().filter(**data_dict).order_by("floor")

    seat_data = seat_data[start_count:end_count]


    #数据总条数

    total_count = seatReservation.objects.all().filter(**data_dict).order_by("floor").count()

    # 总页码计算 c(商),d(余数) = divmod(a,b)

    total_page, div = divmod(total_count, pagesize)

    if div:

        total_page += 1

    # 计算前5页和后5页

    plus = 5

    # 设置不要出现负值

    if total_page <= 2 * plus + 1:

        # 当数据库记录小于11

        start_page = 1

        end_page = total_page

    else:

        # 大于11,数据库数据较多

        if pagenum <= plus:

            # 不能有负值

            start_page = 1

            end_page = 2 * plus + 1

        else:

            # 设置不要超出总页码

            if (pagenum + plus) > total_page:

                start_page = pagenum - 2 * plus

                end_page = total_page

            else:

                start_page = pagenum - plus

                end_page = pagenum + plus

    page_str_list = []

    page_str_list.append(' <li><a href="?page={}">首页</a></li>'.format(1))

    # 上一页

    if pagenum > 1:

        page_str_list.append(' <li><a href="?page={}">上一页</a></li>'.format(pagenum - 1))

    else:

        page_str_list.append(' <li><a href="?page={}">上一页</a></li>'.format(1))

    #range()左闭右开

    for i in range(start_page, end_page + 1):

        # ele='<li ><a href="?page={}">{}</a></li>'.format(i,i)

        if i == pagenum:

            ele = '<li class="active"><a href="?page={}">{}</a></li>'.format(i, i)

        else:

            ele = '<li><a href="?page={}">{}</a></li>'.format(i, i)

        page_str_list.append(ele)

    # 下一页

    if pagenum < total_page:

        page_str_list.append(' <li><a href="?page={}">下一页</a></li>'.format(pagenum + 1))

    else:

        page_str_list.append(' <li><a href="?page={}">下一页</a></li>'.format(total_page))

    # 尾页

    page_str_list.append(' <li><a href="?page={}">尾页</a></li>'.format(total_page))

    page_string = mark_safe("".join(page_str_list))



    return render(request, "seat_list.html", {"seat_data": seat_data, "search_data": search_data, "page_string": page_string})

图书馆管理员可以对座位进行增加、修改座位信息、删除座位这三项操作,主要是对数据库信息的修改。相关代码如下:

def seat_add(request):

    if request.method == "GET":

        form = seatModleForm()

        return render(request, "seat_add.html", {"form":form})

    elif request.method == "POST":

        #用户post请求提交数据,数据校验

        form = seatModleForm(request.POST)

        if form.is_valid():  #判断是否合法

            form.save()

            return redirect("/seat/list")

    #校验失败

    return render(request, "seat_list.html", {"form":form})

#用ModelForm实现

class seatModleForm(forms.ModelForm):

    number = forms.CharField(max_length=2, label="座位号")

    class Meta:

        model = seatReservation

        fields = "__all__"


def seat_edit(request,nid):

    row_data = seatReservation.objects.filter(id=nid).first()

    if request.method == "GET":

        form = seatModleForm(instance=row_data)

        return render(request, "seat_edit.html", {"form": form})

    elif request.method == "POST":

        #用户post请求提交数据,数据校验

        form = seatModleForm(data=request.POST, instance=row_data)

        if form.is_valid():  #判断是否合法

            form.save()

            return redirect('/seat/list')

    #校验失败

    return render(request, "seat_edit.html", {"form": form})

def seat_delete(request,nid):

    seatReservation.objects.filter(id=nid).delete()

    return redirect("/seat/list")

4.3座位预约模块

用户通过点击座位预约按钮来预约座位,我们通过捕获座位的ID值来收到被预约座位的信息,从数据库中抓取相关信息并显示在相关界面上,同时对座位状态更改为“已占用”、“预约”按钮更改为“不可预约”、扣除用户余额。用户可以选择取消预约,则再次更改数据库状态,释放座位。相关代码如下:

def my_reserve(request,nid):

    row_data = seatReservation.objects.filter(id=nid).first()

    user1 = request.session.get("name")

    user_data=user.objects.filter(account=user1).first()

    user.objects.filter(account=user1).update(seat=nid)  #更新数据库用户座位信息

    user.objects.filter(account=user1).update(money=user_data.money-5)  #更新数据库用户余额信息

    seatReservation.objects.filter(id=nid).update(state=1)  #更新数据库座位状态为已占用

    return render(request, "my_reserve.html", {"row_data": row_data})
def reserve(request):

    user1 = request.session.get("name")

    print(user1)

    user_data=user.objects.filter(account=user1).first()

    print(user_data.seat)

    if user_data.seat == "0":

        suhao=0

        return render(request, "my_reserve.html", {"sunhao": suhao})

    print(user_data)

    seat_data = seatReservation.objects.filter(id=user_data.seat).first()

    return render(request, "my_reserve.html", {"row_data": seat_data})

4.4个人信息模块

用户点击“个人信息”后可以在一个界面上显示信息,并可以对自己的账户进行充值操作。用户输入一定的金额,点击充值按钮,账户余额自动增加,主要涉及到了数据库更新与类型转换的技术。相关代码如下:

class userform1(forms.ModelForm):

    class Meta:

        model=models.user

        fields=["account","money","seat","registime"]



class recharge(forms.Form):

    # 此处可以规定文本框的内容

    moneyC = forms.DecimalField(label="充值金额", widget=forms.NumberInput(attrs={"class":"form-control"}))



def personalInformation(request):

    user1 = request.session.get("name")

    user_money = user.objects.filter(account=user1).first()

    if request.method=="POST":

        # 用户post请求提交数据,数据校验

        #form3 = recharge(data=request.POST)

        form3 = request.POST.get("moneyC")

        print(user_money.money)

        print("11111111111111111111111")

        print(Decimal(form3))

        user.objects.filter(account=user1).update(money=user_money.money + Decimal(form3))

        return redirect("/personal/information")

    user_data = user.objects.filter(account=user1).first()

    form = userform1()

    form2 = recharge()

    return render(request, "personal_information.html", {'form': form, 'data': user_data, "form2": form2})

5 测试

5.1系统安全测试

系统为安全保密,运行系统需要管理员登录系统身份验证,口令修改权限为管理员本身。系统按操作权限分为管理员、用户俩个等级,进入必须进行身份验证。

5.2 功能测试

在这个图书馆的座位预约系统中我们小组实现了登录注册、注册用户的增删改查以及对图书馆座位的增删改查、座位预约和个人信息模块中的充值功能。

5.2.1 注册登录模块

首先当数据库中未保存信息时需要进行注册,注册时要输入两次密码,如果前后不一致时则报错;账号不能重复,如果重复则报错,实现效果如图5-2-1注册登录

图5-2-1注册登录

5.2.2 增删改查模块

增删改查中主要包括对注册用户的增删改查以及对图书馆座位的增删改查,这里我们以图书馆座位为例,在座位预约界面进行座位信息的总体展示,用户可以通过查询书库代号来选择座位。实现效果如图5-2-2座位添加

图5-2-2座位添加

5.2.3 座位预约模块

用户通过点击座位预约按钮来预约座位,我们通过捕获座位的ID值来收到被预约座位的信息,同时对座位状态更改为“已占用”、“预约”按钮更改为“不可预约”。实现效果如图5-2-3座位预约

图5-2-3座位预约

5.2.4 个人信息模块

用户点击“个人信息”后可以在一个界面上显示信息,并可以对自己的账户进行充值操作。用户输入一定的金额,点击充值按钮,账户余额自动增加,实现效果如图5-2-4余额充值。

图5-2-4余额充值

6 结论

近年来,随着大学生数量逐渐增多学生的就业压力越来越大,越来越多的学生选择在课余时间去图书馆补充自己的专业知识,以提高自己的竞争力。图书馆在配合学校的教学工作的情况下,面临着很多的困难,其中很重要的一方面就是图书馆学生占座乱问题,不方便图书馆工作人员进行管理。所以我们组这次做的是一个图书馆的作为预约系统,我们对于这个系统是比较熟悉的,我们小组实现了登录注册、注册用户的增删改查以及对图书馆座位的增删改查、座位预约和个人信息模块中的充值功能,在这次课程设计中我们也遇到了各种各样的问题,最终通过上网查询和同学探讨完成。我们也发现对于许多知识,我们并没有完全掌握,还是存在知识上的漏洞。在今后的学习中,我们也会要不断提高自身的能力,不仅仅局限于课本上的知识,还要综合运用到实践中。

  • 6
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
图书馆座位预约系统 一、主要功能 学生用户: 座位状态(可预约/已预约;电影院选座模式:可选座位显示为绿色;不可选座位显示为红色) 座位类型:单人(1楼)、双人(2楼)、四人(3楼)(需填写至少三人信息方可申请四人座位)、隔间(需填写至少三人信息方可申请四人座位);每种类型的座位为6×6摆放; 预约功能:学生凭学号登录该系统进行座位预约;与图书馆刷卡系统配合使用(此处能够模拟实现即可) 预约规则: 1.预约时间需提前至少30min;可自由选择座位剩余座位以及时常; 2.预约成功后,在预约时间的前后30min内刷卡进入图书馆视为有效; 3.进入图书馆时间超过预约时间30min预约失效,该座位状态变为可预约,其他同学可进行预约(假如有人定了八点到的,如果她八点没到,座位可以帮她保留30分钟;如果她30分钟之内来了,正常使用;如果30分钟后没来就将座位开放,其他同学可预约); 4.距离最迟进入图书馆的合法时间还剩10min时弹出警告框: a)内容:“座位预约即将失效,请按时进入图书馆学习; b)功能键:【确认】退出警告框; c)功能键:【取消预约】转入取消预约座位界面; 5.若该生未在有效时间进入图书馆其预约座位信誉分-1(总分3分),弹出警告框; a)内容:“由于您未能按时进入图书馆,本次信誉分-1” b)功能键:【详细信息】转入个人信息界面; 当信誉分减为0时,该生将被拉入信誉黑名单(此时不可申请座位),一周后恢复白名单;累计三次进入信誉黑名单需辅导员开证明再恢复白名单。 6.提前离开可使用结束使用功能;若未结束使用,刷卡离开2h后座位自动收回,座位状态变为可预约,可由其他同学预约使用同时该生信誉分-1(具体同5)。 (这个功能主要是防止有人申请了一天的座位大是刷个卡就走了,这样依然存在资源浪费现象;所以如果中途刷卡外出座位可以保留2h;2h之后座位收回,变为可预约状态供其他同学使用) 7.正常使用结束时提前10min弹出警告框 a)内容:剩余时间不足10min,如需继续使用请续时! b)功能键【不续时】:正常结束后该座位恢复“可预约”状态; c)功能键【续时】:进入续时界面 预约时常区间( 1h;上午(8:30-11:59);下午(12:00-17:59);晚上(18:00-21:40);全天 ) 续时功能​:(1)可选择继续使用当前座位;选择时常即可( 1h;上午(8:30-11:59);下 午(12:00-17:59);晚上(18:00-21:40);全天 ); (2)重新申请其他座位,即预约界面; 收藏心仪座位功能:学生可根据个人喜好添加心仪座位进入【我的收藏】,收藏夹的座位设置【一键预约】,若所收藏的座位为“可预约”状态则可通过点击【一键预约】进行预约,提示“预约成功,请在规定时间进入图书馆”;若为“已预约”状态,点击【一键预约】时提示“该座位已满!再看看其他座位吧!” 留言功能: (1)学生可在留言区给管理员(可查看留言者信息)留言进行:问题反馈、提问等;学生有权限查看其他留言但不可查看留言者信息;学生可对留言进行点赞;按点赞次数排序留言; (2)管理员可删除不良留言; 学生编辑、修改个人信息:学号、密码、联系电话、邮箱、当前信誉分。 统计当前在线总人数; 普通用户登录、管理员登录: (1)密码正确进入主页面,否则提示【密码错误,请重新输入】进入重新登录界面;管理员可以【修改管理员信息】; (2)若是系统管理员:2个功能块【账号信息】、【班级信息】; (3)若是座位管理员:进入座位表界面;可对座位表进行增删改查等操作; 管理员用户: (1)系统管理员 系统管理员可以登录管理员界面,进行班级信息管理,账号管理; 班级信息管理:可以添加、修改、删除、查看班级及班级信息; 可以修改存在班级的辅导员; 可以通过Excel文件的形式批量上传信息; 账号管理:可以添加,删除,修改账号;重置用户密码为初始值;将用户移出黑名单; (2)座位管理员 座位管理员可以添加,删除,修改座位信息,可以通过Excel文件的形式批量上传信息; (3)学生表信息:学号(主键)、账号密码、性别、班级、当前信誉分、邮箱、联系电话; (4)座位信息表:座位编号(主键)、座位当前状态、座位类型,备注; (5)预约表:座位编号、预约人学号、预约时段、剩余时间;
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

孙小小白

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

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

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

打赏作者

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

抵扣说明:

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

余额充值