图书馆预约系统是为了缓解高校图书馆座位紧缺,为大学生提供及时的座位供其使用。本系统可以实现用户座位预约,管理员可以对在用户的预约信息进行管理,查询用户的预约记录,用户可以自行注册,也可对密码进行更改。
在本系统中用户需先自行注册,拥有用户名,然后以用户名和密码登录系统,自行选择预约时段和座位进行预约。一个座位在一个预约时段只允许一个用户对其进行预约,该用户预约后即对该座位进行锁定,座位信息后方显示“不可预约”。
管理员可查看用户的预约信息对其进行管理,用户也可自行登录查看预约记录或取消预约,在离开时进行签离。
该功能的的设计和实现主要是基于数据库的增查实现的,注册时获取用户输入的相关信息,对于提交的信息作出相关的逻辑验证(1.账户是否存在2.两次密码是否非空且一致3.其他)若符合相关的条件限制,写入到数据库用户表的相关信息中;登录时获取用户输入的相关的信息,对于提交的信息做出相关的业务逻辑验证(1.用户账号是否存在2.账户密码是否一致3.其他)若符合相关的条件限制,跳转页面,不符合相关的业务逻辑设计,返回错误信息;
该功能主要是基于数据库的增删改查实现的,当用户的相关操作,符合相关的业务逻辑设计的情况之下,可以对数据库的用户表实现增删改查的操作,实现相关的业务;
该功能主要是基于数据库的增删改查实现的,当用户的相关操作,符合相关的业务逻辑设计的时候,可以对数据库的座位表实现增删改查的操作,实现相关的业务;
该功能是基于数据库信息的改查操作实现的:
1.将座位ID更新到用户表中
2.更新座位表中的座位状态
3.查询用户表中的座位的ID,根据ID查询座位表,将相关信息展示到个人页面
由此即可完成预约操作,取消预约操作与此一致:
1.将用户的座位ID置为默认值
2.更新座位表中的座位状态
该操作主要基于数据库的改查操作实现的,查询用户表中的座位的ID,根据ID查询座位表,将相关信息展示到个人页面,完成个人信息的展示;充值功能则是获取用户输入的信息,当用户提交的信息符合相关的业务逻辑(1.信息非空2.金额>=0),根据当前用户的账号,查询对应余额,并在此基础上更新余额为账号余额+充值余额,完成账户余额充值的操作;
中间件:利用条件判断,判断相关路径,其符合预定的业务逻辑的时候,进行相关的页面跳转操作;
轮播图:主要是基于js和css技术现实的;
我们的系统具有一定的框架性,因此对关键技术的复用性较高,用到关键技术的模块主要包括注册登录、用户的增删改查、座位的增删改查、座位预约以及个人信息。
首先当数据库中未保存信息时需要进行注册,注册时要输入两次密码,如果前后不一致时则报错;账号不能重复,如果重复则报错,涉及到对数据库的增加操作。相关代码如下:
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})
对增删改查技术我们进行了复用,主要包括对注册用户的增删改查以及对图书馆座位的增删改查,这里我们以图书馆座位为例,进行技术代码展示。
在座位预约界面进行座位信息的总体展示,主要为查询数据库中的信息,由于数据信息较多因此我们使用了分页技术与查询技术,用户可以通过查询书库代号来选择座位。相关代码如下:
#座位管理
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(' 首页 '.format(1))
# 上一页
if pagenum > 1:
page_str_list.append(' 上一页 '.format(pagenum - 1))
else:
page_str_list.append(' 上一页 '.format(1))
#range()左闭右开
for i in range(start_page, end_page + 1):
# ele='{} '.format(i,i)
if i == pagenum:
ele = '{} '.format(i, i)
else:
ele = '{} '.format(i, i)
page_str_list.append(ele)
# 下一页
if pagenum < total_page:
page_str_list.append(' 下一页 '.format(pagenum + 1))
else:
page_str_list.append(' 下一页 '.format(total_page))
# 尾页
page_str_list.append(' 尾页 '.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")
用户通过点击座位预约按钮来预约座位,我们通过捕获座位的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})
用户点击“个人信息”后可以在一个界面上显示信息,并可以对自己的账户进行充值操作。用户输入一定的金额,点击充值按钮,账户余额自动增加,主要涉及到了数据库更新与类型转换的技术。相关代码如下:
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.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余额充值
近年来,随着大学生数量逐渐增多学生的就业压力越来越大,越来越多的学生选择在课余时间去图书馆补充自己的专业知识,以提高自己的竞争力。图书馆在配合学校的教学工作的情况下,面临着很多的困难,其中很重要的一方面就是图书馆学生占座乱问题,不方便图书馆工作人员进行管理。所以我们组这次做的是一个图书馆的作为预约系统,我们对于这个系统是比较熟悉的,我们小组实现了登录注册、注册用户的增删改查以及对图书馆座位的增删改查、座位预约和个人信息模块中的充值功能,在这次课程设计中我们也遇到了各种各样的问题,最终通过上网查询和同学探讨完成。我们也发现对于许多知识,我们并没有完全掌握,还是存在知识上的漏洞。在今后的学习中,我们也会要不断提高自身的能力,不仅仅局限于课本上的知识,还要综合运用到实践中。