数据库课设——图书馆信息管理系统
写在最前面:项目是数据库课程设计作品,使用MySQL云数据库,SSM+Layui前后端开发。
本文是在作品制作过程中的一些记录,不是很条理,留作以后回顾和继续学习。
基本问题汇总
问:启动web项目时为什么需要容器?
答:需要容器将你的电脑变为服务器。
当启动一个WEB项目时,容器包括(JBoss、Tomcat等)首先会读取项目web.xml配置文件里的配置,当这一步骤没有出错并且完成之后,项目才能正常地被启动起来。
问:web.xml如何配置?
答:站在巨人的肩膀上
简单的说,web.xml用于配置Web应用的相关信息,如:监听器(listener)、过滤器(filter)、Servlet、相关参数、会话超时时间、安全验证方式、错误页面等。
问:web.xml的启动顺序是什么样的呢?
答:https://blog.csdn.net/u013984781/article/details/81282002
问:springmvc.xml配置?
答:https://blog.csdn.net/qq_33204709/article/details/81136484
配置成功:可以在输入test后获取到Controller内容。
问:spring和springmvc整合?
答:通过web.xml进行配置。包括spring的文件路径和监听器。
IDEA快捷键
ALT+INS=快速创建方法
Ctrl+/=注释
Ctrl+Shift+/=块注释
项目流程
先进行数据库需求分析和系统设计,之后进行表的建立。
通过gene文件使用Mybatis的逆向工程方法生成DAO层、Po层即xml实现方法。
生成的是最基础的内容,后续还要根据功能进行添加,其中Dao层和xml实现方法是一一对应的,在Dao层添加了新的接口,在xml文件中就要配置对应的实现方法。(xml中的内容就是对数据库的交互)
- 根据内容设计前端界面
项目使用的是Layui的模板作为前端界面,虽然有很多功能界面,但是其设计时大同小异的。
主页面主要涉及到三个方面:图表渲染区(layui.table的使用,同时在Dao层添加新的方法用于查询获取数据)、高级查询区(主要是图表上方的搜索栏,要配置画面的重载)、操作区(即用户可以点击的按钮,要绑定不同的方法以实现具体的功能)
- Controller层的配置
这一层主要是用于与前端交互,包括接收前端请求、页面的跳转等。
- service层的配置
这一层一般包含两个内容:接口和实现方法。
其实就是controller层的具体实现,通过调用Dao层的方法进行。
借书实现(最核心内容)
先进行内容查询
以供lendIndex进行数据获取与渲染
具体步骤如下:
- 先进行数据库查询语句构建,因为涉及到三张表,所以要联合查询
- 在Po层加入新的属性并加入set、get方法
- 查询并实现Dao层(包括接口与实现方法)
先定义一个新的接口:
再在实现方法中实现:(重点)
高级查询与拼接
- service接口设计与实现
- 在controller 层进行方法的定义与实现
- lendindex界面配置
进行高级查询设置
- 先进行查询栏设置(在Dao的实现方法中)
- 进行具体的查询设置以执行重载(同一文件)
一一绑定的方式发送信息到后台。
- 在后台进行值的获取
List<BookInfo> queryBookInfoAll(BookInfo bookInfo);
List<BookInfo> getBookCountByType();
进行删除操作
包括单行删除和多选删除
- 首先在主界面进行相关设置,包括值的获取和后端传递。
上图为操作栏监听,主要是进行选值的获取与相关函数的调用。
上图为前端向后端传递数据。
- controller的方法
要先进行数据的分割,再进行方法的调用。
- service层的完成
删除图书记录的同时也要进行图书状态修改。这也是要获取图书号的原因。
- Dao的方法定义与实现
最简单的sql语句删除即可。图书状态的更改在book_info项目里已经做好了。
进行书线查询
- 先在Po层添加一些类。
作用:在页面内容查询时会用到。
- 在Dao层添加接口并进行实现。
具体解释:rid和bid为查询参数,用于区别是哪一条时间线。
上为实现方法。也就是查询语句。其中关键在于查询名称要与上定义的映射关系匹配。
主要是注意一下column项,其值为对应的字典key。
- 之后在service层进行接口定义和实现。
实现很简单,就是将查询的内容包装在字典里进行传回。
- 在controller层进行方法的定义和实现。
其作用就是当前端点击时进行调用,接收前端传输的值并调用后端实现。对时间线类型进行了区分。
- 前端界面的修改:LookBookIndex
值已经传入,进行渲染即可。
登录界面处理
包含验证码功能
Controller层设置
添加页面的跳转:login页面。
验证码工具与投入
后续研究,和拦截器一样。
验证码的调用与更新。
登录验证设置
controller层的对应方法如下:
接受前端的值(即输入框里的值),与数据库里获取的值进行对比验证。
实际用户名和密码的获取
- Dao层定义接口与实现
提供传递的参数查询对应数据并进行传回(一个anmin)
- service层的实现
接受控制层调用并调用Dao层的方法。
- controller层实现
主页面设置
目前布局(快速跳转和图书统计)
静态页面设置(welcome)
controller层设计(主要进行图书数据的传入)
通过addAttribute将获取到的数据进行封装并传入前端。model
- service层的接口设置与实现
一个方法即可,定义在bookinfo ,通过图书类型获取图书数目。
- Dao层接口设计与实现
- 主页面写入
主页面设置
饼状图设置
顶层配置
一个容器,定义宽度和高度,用于存放图形。模块引入
具体可以查看网址:https://layui.org.cn/doc/element/table.html
- Echart初始化与绘制
具体参见:https://echarts.apache.org/examples/zh/index.html#chart-type-pie
只需要改动一些数据即可。
登录拦截器设置(改进,登录+权限设置)
导入一个新的包
方法的重写(解释与关联login)
有三个拦截器方法。
下面进行代码的具体介绍:
preHandle方法
该方法将在请求处理之前进行调用。
SpringMVC 中的Interceptor 是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor。
每个Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor 中的preHandle方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值Boolean 类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;
当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法。
postHandle方法
由preHandle 方法的解释我们知道这个方法包括后面要说到的afterCompletion 方法都只能是在当前所属的Interceptor 的preHandle 方法的返回值为true 时才能被调用。
postHandle 方法,顾名思义就是在当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。
postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行,这和Struts2 里面的Interceptor 的执行过程有点类型。Struts2 里面的Interceptor 的执行过程也是链式的,只是在Struts2 里面需要手动调用ActionInvocation 的invoke 方法来触发对下一个Interceptor或者是Action的调用,然后每一个Interceptor中在invoke方法调用之前的内容都是按照声明顺序执行的,而invoke 方法之后的内容就是反向的。
afterCompletion方法
该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。
具体的拦截器流程可以看一下这篇文章:https://www.cnblogs.com/jing99/p/11147152.html
spring mvc设置
静态资源配置
springmvc:
web.xml:
拦截器改进(增强)
- 思路:先理清拦截器流程,再解释一下静态资源的配置及其作用。
读者界面设置(修改密码、读者信息、退出)
登录界面的身份判断
在登录时选择类型。
controller层的接收、判断与状态存储
将接收到的用户状态信息写入session。
注意:session相关(来自网络)
1、request.getSession()
可以帮你得到HttpSession类型的对象,通常称之为session对象,session对象的作用域为一次会话,通常浏览器不关闭,保存的值就不会消失,当然也会出现session超时。服务器里面可以设置session的超时时间,web.xml中有一个session timeout的地方,tomcat默认为30分钟.
2、session.setAttribute(“key”,value)
;是session设置值的方法,原理同java中的HashMap的键值对,意思也就是key现在为“user”;存放的值为userName,userName应该为一个String类型的变量吧?看你自己的定义。
3、可以使用session.getAttribute(“key”)
;来取值,以为着你能得到userName的值。
4、注意:getAttribute的返回值类型是Object,需要向下转型,转成你的userName类型的,简单说就是存什么,取出来还是什么。
5、setAttribute和getAttribute就是基于HashMap的put方法和get方法实现的,一般叫键值对或者key-value,即通过键找到值。例如你的名字和你的人的关系,只要一叫你的名字,你就会喊到,通过你的名字来找你的人,简单说这就是键值对的概念。
index主页的初始化方法
通过查询保存的session的值来进行类型的判断以使用不同的初始化方法。
上图是init2的初始化,也就是读者界面的初始化。最重要的是href的值,与控制层的对应,根据控制层的定义来返回固定的界面。
上图是控制层对应的时间线查询方法。注意其传递的参数,与时间线1的不同,是只查询此用户的信息。
读者图书查询界面的返回与设计(减少一些功能)
增加了status=3时为预借,
- 图书查询界面保留edit和delete按钮,用作预借书和取消预借。
- 增加两个方法:预借和取消,改变图书状态。
- 在后端实现这两个方法
控制层定义方法
业务层进行调用实现,其实就是进行状态的变换。(0-2与2-0)
- 数据库建立事件,定时更新数据库。
定时任务设置参考:https://cloud.tencent.com/developer/article/1888329
问题汇总
- ==删除借阅记录时又错误(单行无法删除)==
Failed to complete request: java.lang.NumberFormatException: For input string: “”
是类型错误,即把“”转换为long是错误。
已经解决:将bookId换为bookid.在lendlistmapper中查看导入的符号。
还有:可以直接调用data.id和data.bookid获取内容,不需要进行组合获取。(单行删除时)
- ==还没有设置图书信息中的借阅状态==
已经解决,在BookInfoIndex中添加对应项并查询。
还书可以无限换,已经还的也可以。并且会更新时间
==借阅表的时间显示又问题。比如说借阅时间一直为现在的时间。==
已经解决,是lenddate和lendDate的问题
- 异常还书错误,应该是因为remarks原因。
可以破碎还书,其他不行。并且丢失会显示在借书状态。
- 时间线问题,错误的请求,应该是类型不对。
已经解决。主要原因在于:字典的对应错误,要改成指定的名称,否则会导致传输的值为空,无法显示。
登录拦截器和其他(读者等)
可以美化一下主页,例如已有的统计+多几个表。
借书时判断是否已经借书,还书时判断是否已经还书。hu
异常还书也要看一下。也是逾期还书和丢失、破损要加钱一些具体细节的记录:比如注解的作用、session的使用、方法参数的传递等。
http://c.biancheng.net/servlet2/httpservletrequest.html
上文是一个很重要的部分。