A distinguish Library Manage System based on Django,
随着科学技术的发展,人类对知识的需求也不断地增长,在这种形势下,书籍就渐渐地成为人们获取并增长知识的主要途径,然而,图书馆管理也告别了传统的人工管理,开始采用数字化的计算机管理的方式,这使得图书管理变得越来越人性化,受到了公众的好评。在本项目中,我们也设计了一个独具特色的图书馆管理系统,主要分为登录注册模块、系统前台模块和系统后台模块三大部分,实现图书信息、读者信息、管理员信息的浏览、查询、添加、修改和删除等功能,方便用户了解图书信息,从而实现图书馆管理的自动化。
随着图书出版数量的增加,图书馆的规模增大,传统的图书管理模式的缺陷也越越明显:图书存放混乱、人工查询图书耗时耗力、借阅管理难度大等等,因此,取而代之的将是数字自动化的图书馆管理模式,图书馆管理系统市场需求也大大增加。目前,各大图书馆、书店都采取了图书管理系统对自身的图书进行管理,大大地节约了人力物力和财力,提高了工作的效率和准确程度,也使图书查找变得简单快捷,打破了传统的手工查找模式,实现了图书上传、查询、借阅、还书、续借一条线自动化服务。
新型的图书馆管理系统采用数字化,打破时空界限,读者不用去到图书馆就能查询图书馆的图书,也能登录自己的账户实行续借,还可以随时获取图书馆的最新公告信息,实现足不出户知天下事,非常方便。对于图书馆管理员来说更是一个福音,所有的图书流通步骤都实现了自动化,大大提高了工作效率,减轻了工作量,而且图书的管理也更加有效。
我们的项目是一个“另类”的图书管理系统。与众不同的地方在于它是一个交互型的图书管理系统,在前台我们有评论和点赞机制来链接用户与用户、用户与书籍,用户可在前台实现对书籍的借阅、评论、收藏、点赞与归还等操作;在后台,管理员可对用户产生的信息进行操作(审核通过或删除等)。 🎈 对于普通用户:我们在前台设计了书籍点赞、书籍评论和评论点赞,利用热评机制(点赞数)和热门书籍机制(点赞数、借阅数和评论数)为普通用户在首页推送其可能感兴趣的书籍和相关评论,在书籍详细信息页面也会展示书籍相关评论,在用户信息界面,普通用户可管理关于自己的借阅关系以及个人资料的修改,为用户提供更个性化的服务。 🎈 对于管理员:我们为管理员设计了专门的后台管理系统,并将管理员分为普通管理员和超级管理员两个类别。超级管理员可设置及撤销管理员的权限,所有管理员都可在后台实现对用户、书籍、借阅关系和网站的系统管理,为管理员提供更简便的管理方式。
(1)Redis:用于实现缓存系统。 (2)MySQL:用于数据存储。 (3)Django:Python Web开发框架。 (4)bootstrap+jQuery+Ajax:用于开发前端页面,以及实现交互效果。
项目开发平台为Windows10
,开发IDE为PyCharm202003
,python版本为3.8.9
,注意PyCharm需要使用专业版,使用社区版无法进行Django项目的开发,并且19年以前版本的PyCharm即使是专业版也无法进行Django项目的开发。
项目运行环境为Python3.8.9
,Redis3.2.100
,MySQL8.0.27
,python依赖包分别为django==3.1.2
、faker
、redis==2.10.6
。
Django是项目的核心开发框架。
Django的MVT设计模式由Model(模型), View(视图) 和Template(模板)三部分组成,分别对应单个app目录下的models.py, views.py和templates文件夹。它们看似与MVC设计模式不太一致,其实本质是相同的。
Django MVT设计模式中最重要的是视图(view), 因为它同时与模型(model)和模板(templates)进行交互。当用户发来一个请求(request)时,Django会对请求头信息进行解析,解析出用户需要访问的url地址,然后根据路由urls.py中的定义的对应关系把请求转发到相应的视图处理。视图会从数据库读取需要的数据,指定渲染模板,最后返回响应数据。
其流程如下:
Redis是一个开源的键值对(Key-Value)存储分布式数据库,因其运行时数据存储在内存之中,所以性能极高,并且Redis支持字符串,哈希,列表等多种数据类型,因其可以分布式布置并且支持key的过期等特性,因此常被用来设计缓存系统。
Redis在项目中用于实现web缓存系统,我们采用了3.2.100的Redis以及2.10.6版本的Redis驱动(python),主要缓存页面以及一些Json数据。
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
MySQL在项目中用于数据的存储。
Bootstrap,来自 Twitter,是目前最受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷。
jQuery 是一个 JavaScript 函数库,使用jQuery可以使得极大简化JavaScript编程,并且 jQuery 兼容于包括IE在内的所有主流浏览器。
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。
Bootstrap在项目中用于前端页面的开发,jQuery用于前端交互效果的实现,Ajax用于实现前端与服务器的通信。传统网页开发三剑客HTML,CSS和JavaScript在在这里不再提及。
本系统开发的总目标是实现部图书借阅管理的系统化、常规化和自动化。主要分为登录注册模块、系统前台模块和系统后台模块三大部分,实现图书信息、读者信息、管理员信息的浏览、查询、添加、修改和删除等功能,方便用户了解图书信息。本系统能够对图书进行注册登记,也就是将图书的基本信息(如:书名、作者、出版社等信息)预先存入数据库中,供用户检索和借阅;能够对借阅人进行注册登记,包括记录借阅人的用户名、昵称、邮箱等信息,提供方便的查询方法;能以借阅人账号对借阅人信息进行检索或以用户名称查询用户信息, 提供统计分析功能。可以展现出图书库存与借阅数,提供淘汰、损坏、丢失的书行修改和删除功能。提供较为完善的差错控制与友好的用户界面,尽量避免错误操作。 能够对使用该管理系统的用户进行管理,按照不同的工作职能提供不同的功能授权。
本图书管理系统的系统功能包括:(1)登录注册模块(包括登录、注册功能);(2)系统前台模块(包括图书的查找、借阅、收藏、点赞和评论,对个人资料的修改等功能);(3)系统后台模块(包括用户、书籍、借阅和网站的管理)。
该页面基本信息包括书苑Logo,用户登录(账号、密码)和管理员登录(账号、密码)以及与注册界面、首页的交互。
该页面基本信息包括书苑Logo,用户名、账号、密码、邮箱、性别、生日、个人简介以及与登录界面、首页的交互。
本站系统前台包括首页、个人资料、图书基本信息、全部分类、排行榜、分类导航栏和页脚几个部分。
该页面主要包括本苑推荐、学霸推荐、男神喜欢和女神最爱四个版块,其次是最新入库、评分最高和书评最多三个排行榜,顶部是本站的分类导航栏,底部是页脚。
此块界面会将我们网站中的所有分类展示出来,我们所有分类包括学习资源、科技、名著、小说、历史、报刊杂志、医疗卫生、语言类、重生,其他,用户可进入全部分类直观的查找其分类对应书籍。
此页面包括书名,作者,出版社,出版日期,图书标签,图书评分,书籍简介,图书评论、点赞、借阅、收藏,全部章节目录,同类图书推荐。
此页面包括我的收藏、我的借阅、我的评论、历史借阅、修改密码、修改资料、收件箱、发信息给管理员八个版块;其次,该页面也可展示用户类型、注册时间和热度,顶部是本站的分类导航栏,底部是页脚。
我们网站排行榜分为评分榜,评论榜、各分类推荐和最新入库四种排行榜,其中各分类推荐排行需用户在分类导航栏点击某个分类才即可显示,其他三个排行在首页显示。
我们的系统后台只有普通管理员和超级管理员才能登陆,主要分为用户管理(超级管理员权限、用户信息管理、新增用户)、借阅管理(在借管理、逾期管理、历史记录)、书籍管理(分类管理、书籍管理、新增书籍)和网站管理(待审核评论、留言板管理、公告管理)四个大类,再加上一个涵盖主要管理操作的主页,其分为逾期、在借、书籍、用户、留言板、待审核评论六个模块,方便管理员进行操作。
本系统面向的是读者和管理员,读者登录只能到达系统前台,进行图书信息的查看,个人资料的查看和修改,书籍的查找、借阅、点赞、收藏和评论;管理员登录之后可以进入前台和后台两个界面,在系统后台可进行用户、书籍、在借和网站的查看与管理。
注:数据表在设计时id列将不算在内。
用户实体总共有昵称,账号,密码,账号类型,需要更改密码标志,邮箱,性别,生日,简介,备注,注册时间,信息更改时间以及还是那个词登陆时间共13个属性。
分类实体有分类名,简介,创建时间和信息更改时间共4个属性。
书籍实体有IBSN,书籍名,作者,出版社,出版日期,分类(外键),总库存,当前库存,历史借阅次数,总评论数,点赞数,评分,章节,简介,入库时间以及信息更改时间共16个属性。
评论实体有评论用户(外键),评论书籍(外键),评论内容,是否已通过审核标志,点赞数,创建时间以及信息更改时间共7个属性。
书籍点赞实体有用户(外键),书籍(外键),创建时间以及信息更改时间共4个属性。
评论点赞实体有用户(外键),评论(外键),创建时间以及信息更改时间共4个属性。
书籍收藏实体有用户(外键),书籍(外键),创建时间以及信息更改时间共4个属性。
书籍借阅实体有用户(外键),书籍(外键),创建时间,约定归还时间以及最终归还时间共5个属性。
用户留言实体有用户(外键),留言标题,留言内容,创建时间以及是否已读标志共5个属性。
网站公告实体有发起用户(外键),接收用户(外键),公告类型,公告标题,公告内容,创建时间以及是否已读标志共7个属性。
我们的登录界面背景采用JavaScript来实现随机图片,每次刷新所展示的图片随机。
登录界面包括普通用户登录和管理员登录。我们的用户等级分为:超级管理员、管理员和普通用户。普通用户账号只能在普通用户界面登录,管理员账号和超级管理员账号可以在普通用户界面和管理员界面登录。
普通用户通过注册界面注册,若想成为管理员即可联系超级管理修改权限,而管理员没有修改账号类型的权限。
注册账号时服务器会向注册邮箱发送确认邮件,用户需要通过点击邮件内链接进行注册确认。
我们的首页分为前台和后台。普通用户登录则进入前台,在管理员入口无法登录;而管理员在普通用户入口可进入前台,在管理员入口则进入后台。
普通用户首页我们设计了评论和点赞机制来链接用户与用户、用户与书籍,用户可对书籍的借阅、评论、收藏、点赞与归还等进行操作操作。首页分为:本苑推荐、学习推荐、女生和男生四个版块。用户可根据自己的兴趣爱好选择对应板块,方便用户找到想要的书籍。用户也可在搜索栏搜索本苑库存里的图书,本苑提供的字段搜索有书籍名、作者名和出版社的模糊搜索。本苑图书系统会将最新入库、评分最高和书评最多的排行榜展示在首页,为用户提供更优质的选择。每本书籍中的热评会展示在首页上,方便用户参考并选择借阅相应书籍。
我们的搜索系统是将作者名、出版社和书名为字段进行绑定,在首页搜索栏搜索关键字,系统将展示出含有相关搜索文字的作者名、出版社和书名的书籍。若搜索结果不如意,则可通过搜索结果界面的搜索栏继续搜索。相关步骤如下:
首页最上方导航栏包括分类、排行榜、用户主页以及只有管理员才能进的小黑屋,普通用户无法进入小黑屋。
- 导航栏展示:
- 管理员进入秘密基地:
如果用户或管理员在登录后10分钟内没有任何操作(与后台没有交互),则登录会话过期,要求用户重新登录;
用户登录后,在本网站的每个界面都会有本站的专属页脚:唯君不思,无我不为。(书苑仅供课程使用,若有版权冲突请及时联系。)作者:王磊,张玉君,梁楚兰。
用户登录系统后,点击系统界面会出现不同颜色的有本站特性的字弹出来,或者点击页面左下角的“小姐姐”,可意会它所说的话。
书籍借阅页面包括详细信息、书籍具体目录、书籍库存、评分等。每本书侧边栏提供给读者评论,可发表自己的言论和对本书的评价,提供给其他用户推不推荐借阅本图书,用户评论后需后台管理员对本评论进行筛选,若符合要求即可登上图书侧边栏评论。用户可根据自己的需求来借阅或收藏图书,也可对图书进行点赞,点赞数高的书籍可登上首页本苑推荐。同理,本书评论栏被点赞数高的用户也可登上首页在热评进行评论展示。页面最下方我们为用户推荐同种类别书籍,让用户感受更个性化的体验,让用户能够更方便快捷的找到图书。
用户点击借阅图书后,系统会弹出借阅弹窗,用户可根据自己的需求选择借阅时长,而有底纹部分不可更改。用户借阅后,可在个人资料找到所借阅的图书。当用户对本图书感兴趣时可对图书进行收藏,收藏后的图书可在个人资料中我的收藏中找到。
- 错误演示:系统为自动筛选出优质评论,故评论字长不能少于10个字符。
导航栏有九大分类,方便用户查找相关分类,分类页面会将相关书籍展示在分类页面,每个分类页面都支持书籍搜索,左侧也会提供给用户同类推荐,推荐按评分高低排列。分类书籍展示会将书籍名、作者、出版社、出版日期、库存、评分和评论数展示,让用户更直观的查找相关书籍信息。
此块界面会将我们网站中的所有分类展示出来,如若用户在导航栏查找不到想查找的类型,用户可进入全部分类直观的查找其分类对应书籍。
我们网站的排行榜系统对评分,评论和入库时间设计排行。每个排行榜中的书名、作者、出版社和分类字段都采用了超链接,方便用户进入书籍借阅以及同一作者和同一出版社的书籍查找,用户也可通过分类标签找到同类型书籍。
个人信息界面可以看到用户自己所收藏、借阅、历史借阅的书及自己的评论。用户也可在此修改自己的信息,也可以对此网站发表自己的建议与反馈给我们,本苑站内信息会存放在收件箱方便用户阅读与了解,用户发表的评论总赞数会统计在个人首页热度上,热度数能体现一个用户发表评论的优质度,以及此用户对其大众的影响度,激发用户阅读兴趣及优质评论的发表率。
收藏界面我们采用书籍图片方式展示所收藏书籍,让界面不在单调如一,让用户明了的看到自己收藏的书,激发用户阅读兴趣。
逾期书籍管理员会给予信息提示,并会在个人主页展示其逾期书籍。
用户发表的言论会在我的评论中存档,用户可对不想保留评论进行删除操作,用户发表评论后,会出现在管理员评论审核界面,当管理员通过后才会展示在书籍界面,用户可在此界面看到其评论的审核状态、内容、评论时间以及评论书籍。
用户借阅过并且已还的书籍会展示在历史借阅中,用户若想二刷或三刷此书可进入图书界面进行再次借阅,用户不想让其展示可对其进行删除操作。
管理员发送的信息出来登录网站后的弹窗之外,所有用户都可在此查看。
用户可以向管理员发送反馈,反馈对本网站的建议。
普通管理员及超级管理员都可在管理员界面登录,普通用户没有登录权限。
后台主要是负责管理本苑中的书籍、用户等,并对他们。导航栏最上方为我们网站的logo,象征这我们书苑“唯君不思,无我不为”。管理员首页会将常用的用户、书籍、在借、逾期、待审评论和留言板的管理展示在主页,管理员可以更明了的选择其需要管理部分进行操作,管理员想对其他内容进行操作可以在左侧导航栏进行其他功能进行操作。
- 普通管理
-
超级管理
超级管理用户首页导航栏具有特有权限:权限管理。其他用户不会出现这类选项卡。
管理员点击左侧导航栏自己的名字将进入修改个人信息界面。
- 普通管理员
- 普通管理员只能修改基本资料、通知用户修改密码以及删除用户的权限。
管理员和超级管理员可在后台新增用户,管理员新增的用户只能是普通用户,而超级管理新增用户可以自由设置类型。
- 超级管理员:
超级管理员将普通用户设置为管理员后,可在权限管理看到其设置成功的管理员,超级管理可将管理员降级为普通用户。
管理员可通过书籍管理编辑书籍信息及分类。例如6.5.3中的演示。
- 界面:
-
演示:
注意:章节设置要用英文逗号隔开!
-
后台展示:
在书籍信息板块可以看到刚刚新建的图书,在书籍信息板块还可以点击编辑设置其分类,方便用户查找。
-
设置分类:
注意:章节设置要用英文逗号隔开!
- 设置成功即可查看
-
-
前台展示:
一个完美的书籍就上传成功啦!
- 管理员可对“失踪人口”用户逾期很久的书籍进行管理,将其借阅从后台进行删除处理。
- 管理员可更改用户还书时间。
管理员可通知逾期用户还书,也对逾期信息进行修改,修改其还书时间。
所有借过并还了的书籍可展示在此。
管理员发送的公告所有用户都可收到,管理员可通过网站公告告知用户信息。
用户对某本书评论后,系统会将其发至管理员处,管理员可以对评论进行审核,通过则可展示在书本信息页面,拒绝的评论则不会出现在书本信息页面。
- 留言查看
管理员可以通过右上角信息图标在右侧浮窗快速查看收到的用户留言。
-
留言管理
管理员可以在留言管理对收到的留言吸取反馈,对垃圾留言可以作删除处理。
对于一个高访问的web系统来说,缓存是一个不可缺少的重要组成部分。因为若是一直对数据库进行IO操作,那么就要求数据库拥有强大的读写性能,而传统的关系型数据库在处理高并发的场景确实效果不是太理想。因此我们需要设计一个有效的缓存系统来减少对数据库的IO操作。
所谓缓存,就是将数据存放在计算最近的位置以加快处理速度,无论是在软件中还是web系统中,都是改变性能的第一选择。
在我们的项目中,我们有一些页面是几乎不会进行改变的,例如书籍详细信息页面,排行榜页面和分类页面,对于书籍详细信息页面,基本能够变化的只是书籍的热门评论,但是用户提交的评论需要经过后台管理员的审核,且想要追赶上热梦评论需要一定时间,所以书籍详细信息页面几乎可以看做一个静态页面,而这个静态页面,可能几个小时才会更新一次,排行榜页面和分类页面也是同理。
但是书籍详细信息页面是在我们后台查找出对应书籍的信息后填充我们的书籍详细信息页面模板生成的,每次访问页面都会对数据库进行一次查询操作,因此我们可以直接将这一页面进行缓存,键设为书籍id即可,值设为这一页面的html文本。
其他对于页面的缓存大致也是同理,都是通过对页面html文本值的缓存来实现的。
同时在我们的项目中,虽然我们的导航栏是动态生成的(因为每次重新生成数据后排在前的分类名和分类页链接会有所改变),但是从全局来看,这个导航栏基本也是不会变化的。我们生成导航栏的逻辑是在前台网页中向服务器发送Ajax请求,然后服务器返回包括分类名和分类id的json数据给前台,前台再解析json数据去构造导航栏。
我们可以发现,这个返回的json数据在一个较长的时间内(24小时)基本也是不会变化的,因此这个json数据也可以放进我们的缓存系统中加快我们的处理速度。
其他对Ajax请求的缓存也是同理,都是通过对json数据的缓存来实现的。
在我们的项目中,对于web缓存我们如上所言主要实现了对页面的缓存以及对Ajax请求结果的缓存。
我们的缓存建立在函数的执行上,基本思路是在每个我们要缓存的函数执行前,根据函数名和参数拼接成一个字符串(若是Ajax请求则将POST的数据一起拼接上去),依靠这一个统一的拼接方式,我们拿着这个字符串去缓存系统中查找有没有对应的键值对,若有,则直接用缓存系统的数据来拼装我们的返回值(因为缓存系统中存储的只是字符串,需要进一步进行类型转换),然后直接返回。如果在缓存系统中没有命中,那么就正常执行函数并将函数的返回值提取出我们要缓存的部分放入缓存系统中并设置好对应的过期时间。
数据库缓存这部分主要是MySQL,MySQL有自带的缓存,开启即可。
因为我们的项目是一个书城系统,我们需要有大量的数据来填充我们的各个页面,并且随着开发版本的迭代,数据的格式可能会改变,因此手动输入数据是不可取的方式,因此我们写了一个数据生成器。
-
测试:
注意:章节设置要用英文逗号隔开!
-
后台测试:
在书籍信息板块可以看到刚刚新建的图书,在书籍信息板块还可以点击编辑设置其分类,方便用户查找。
-
设置分类:
注意:章节设置要用英文逗号隔开!
- 设置成功即可查看
-
-
前台测试:
一个完美的书籍就上传成功啦!
Great things in business are never done by one person. They’re done by a team of people.
通过这次项目合作,我们小组深刻的认识到了团队合作的重要性,一个人可以走得快,但是一群人才能走得远。
我们从一开始就将这个项目以毕设的要求而非课程作业的要求来做,虽然中间遇到了很多困难,在这个项目中,由于团队的三位成员都没有学过软件设计,需要重新学习js,ajax等很多技术,导致我们在前后端的接口设计上出现了一些瑕疵,导致有段时间所有接口基本都没法使用,另外前后台与后端的接口有部分重合而可以合并,而这在我们一开始是没有预料到的,这都是以后我们在前期架构软件时可以吸取的经验和教训。
在设计项目的时候,我们有意的保持了系统的可扩展性。例如我们所有前后端的接口都是通过同一个url进行访问,而通过其中传递数据operation字段的名称再去分发给各自的处理函数;我们同时将我们设计的缓存系统和用户权限验证系统从后端逻辑处理中抽离出来,与逻辑处理部分耦合度极低,之后再扩展系统的时候我们的缓存系统和权限验证系统都可以很方便的运用到新扩展的部分上去。
最后的最后,感谢老师能够给我们这样的一次机会让我们将所学用于实践中,并做出一个能让我们自己暂时满意的作品。也感谢团队中每位成员在这一个月的项目期间所做的每一份努力,那份万字的总结报告和我们美观且运行良好的系统就是对我们这段时间努力最佳的回报。回顾本次项目历程,虽然我们途中遇到的困难很多,但在一次次地寻找方法解决困难的过程中,不仅锻炼了我们的意志和能力,还掌握了很多新知识、新技能。让我们为以后的学习,打下了坚实的基础。
唯君不思,无我不为~耶耶耶!