第15章 云借阅图书管理系统
学习目标/Target
- 了解云借阅图书管理系统架构
- 了解云借阅图书管理系统的文件组织结构
- 认识系统环境搭建步调
- 掌握登录模块功能的实现
- 掌握图书管理模块功能的编写
- 掌握访问权限控制的实现
章节概述/Summary
本章将通过前面章节学习的SSM(Spring+Spring MVC+MyBatis)框架知识来实现一个简单的云借阅图书管理系统。云借阅图书管理系统在开辟过程中,整合了三大框架,并在框架整合的基础上实现了系统功能。
目次/Contents
15.1 系统概述
了解系统概述,可以大概说出云借阅系统的功能结构、系统的结构层次、文件组织结构和系统开辟运行环境。
15.1.1 系统功能介绍
云借阅系统功能模块介绍
本系统后台使用SSM框架编写,前台页面使用当前主流的Bootstrap和jQuery框架编写。(关于Bootstrap的知识,可参考黑马程序员编著的《响应式Web开辟项目教程》)。
云借阅图书管理系统主要实现了两大功能模块:用户登录模块和图书管理模块,用户登录模块主要用于实现用户的登录与注销;图书管理模块主要用于管理图书,如新书推荐、图书借阅等。
云借阅系统功能结构图
15.1.2 系统架构设计
云借阅系统结构层次
根据功能的不同,云借阅图书管理系统项目结构可以分别为以下几个层次。
- 长期对象层(长期层或长期化层):该层由多少长期化类(实体类)构成。
- 数据访问层(DAO层):该层由多少DAO接口和MyBatis映射文件构成。DAO接口的名称统一以Mapper结尾,且MyBatis的映射文件名称要与接口的名称雷同。
- 业务逻辑层(Service层):该层由多少Service接口和实现类构成。逻辑层主要用于实现系统的业务逻辑。
- Web表现层:该层主要包括Spring MVC中的Controller类和JSP页面。
云借阅系统各个层次的关系和作用
15.1.3 文件组织结构
云借阅系统项目文件组织结构
15.1.4 系统开辟及运行环境
云借阅系统的开辟环境
云借阅图书管理系统开辟环境如下。
- 操作系统:Windows 7。
- Web服务器:Tomcat 8.5.24。
- Java开辟包:JDK 8。
- 开辟工具:IntelliJ IDEA 2019.3.2。
- 数据库:MySQL 5.7.17。
- 欣赏器:Mozilla Firefox 84.0(64位)。
15.2 数据库设计
认识数据库数据,可以大概独立完成数据库设计。
云借阅系统所涉及的表
云借阅图书管理系统中主要包括用户登录和图书管理两大模块,用户登录模块会用到用户表,图书管理模块会用到图书信息表。除此之外,在图书管理模块中,每次图书借阅完成后,系统会记载图书借阅情况,因此,图书管理模块还须要一个借阅记载表。
用户表(user)的表结构
图书信息表(book)的表结构(1)
图书信息表(book)的表结构(2)
借阅记载表(record)的表结构
15.3 系统环境搭建
15.3.1 须要引入的依靠
认识系统环境搭建,可以大概搭建开辟环境。
云借阅系统需引入三大框架的依靠
由于云借阅图书管理系统基于SSM框架和Maven开辟,因此须要在项目中引入这三大框架的依靠。此外,项目中还涉及到数据库连接、JSTL标签等,因此还要引入数据库连接、JSTL标签等其他依靠。整个系统所须要引入的依靠如下所示。
Spring、Spring MVC、MyBatis框架相关的依靠
- Spring框架相关的依靠:spring-context(Spring上下文);spring-tx(Spring事务管理);spring-jdbc(Spring JDBC)。
- Spring MVC框架相关的依靠:spring-webmvc(Spring MVC核心)。
- MyBatis框架相关的依靠:mybatis(MyBatis核心)。
分页插件、MyBatis与Spring整合、数据库、ServletAPI相关的依靠
- 分页插件相关的依靠:pagehelper(分页插件)。
- MyBatis与Spring整合的依靠:mybatis-spring(MyBatis与Spring整合)。
- 数据库驱动依靠:mysql-connector-java(mysql的数据库驱动)。
- 数据源相关依靠:druid(阿里提供的数据库连接池)。
- ServletAPI相关的依靠:jsp-api(jsp页面使用request等对象)servlet-api
- (java文件使用request等对象)。
JSTL标签库、 Jackson相关的依靠
- JSTL标签库相关依靠:jstl(jsp标准标签库);taglibs(taglibs指令);
- Jackson相关依靠:jackson-core(jackson核心);jackson-databind(jackson数据转换);jackson-annotations(jackson核心注解)。
15.3.2 准备数据库资源
通过SQL命令导入sql文件
通过MySQL 5.7 Command Line Client登录数据库后,创建一个名称为cloudlibrary的数据库。通过SQL命令将书的资源中提供的cloudlibrary.sql文件导入到cloudlibrary数据库中,即可导入云借阅图书管理系统所使用的全部数据。
导入数据的SQL命令
创建数据库并导入数据的具体SQL命令如下。
(1)创建数据库
- CREATE DATABASE cloudlibrary;
复制代码 (2)选择所创建的数据库
(3)导入数据库文件
这里假设该文件在F盘的根目次下,导入命令如下所示
- source F:\cloudlibrary.sql;
复制代码 除了使用命令导入数据库文件之外,还可以通过其他数据库管理工具导入数据库文件,如Navicat Premium和SQLyog等。
15.3.3 准备项目环境
创建项目,引入依靠
接下来,根据第14章14.2.1节中的思绪整合SSM框架,并在SSM整合之后引入已经提供好的页面资源,具体如下所示。
在IntelliJ IDEA中,创建一个名称为cloudlibrary的MavenWeb项目,将系统所须要的依靠配置到项目标pom.xml文件中。
编写配置文件和配置类
(1)在项目标src\main\resources目次下创建数据库连接信息的配置文件jdbc.properties,jdbc.properties配置文件配置的内容除了连接的数据库须要换成cloudlibrary,其他的都和第14章的14.1.3节一样,这里不再重复演示。
(2)本项目使用纯注解的方式整合SSM框架,使用配置类替换框架的相关配置文件。在项目标src\main\java目次下创建一个名称为com.itheima.config的类包,并在config类包下分别创建并配置以下6个配置类。
config类包下的配置类
- ServletContainersInitConfig.java:用于初始化Servlet容器的配置类。
- JdbcConfig.java:用于读取数据库连接信息的配置类。
- MyBatisConfig.java:MyBatis相关的配置类。
- SpringConfig.java:Spring相关的配置类。
- SpringMvcConfig.java:Spring MVC相关的配置类。
- EncodingFilter.java:编码拦截器。
引入页面资源
将项目运行所须要的CSS文件、图片、js和JSP文件按照项目文件组织结构引入到项目中。此中系统首页index.jsp实现了一个转发功能,在访问时会转发到登录页面,其实现代码如下所示。
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!-- 访问时自动转发到登录页面 -->
- <jsp:forward page="/admin/login.jsp"/>
复制代码 页面结果展示
将项目发布到Tomcat服务器中,启动项目cloudlibrary,并在欣赏器中访问项目首页,访问地点为http://localhost:8080/cloudlibrary/index.jsp,访问结果如图所示。
15.4 用户登录模块
在系统中实现用户登录模块中的用户登录功能。
15.4.1 用户登录
用户登录流程图
从图中可以看出,用户登录过程中起首要验证用户名和密码是否正确,假如正确,可以乐成登录系统,系统会主动跳转到主页;假如错误,则在登录页面给出错误提示信息。
STEP 01 创建长期化类:
创建用户长期化类User,并在User类中定义用户相关属性以及相应的getter/setter方法。
- public class User implements Serializable {
- private Integer id; //用户id
- private String name; //用户名称
- private String password; //用户密码
- private String email; //用户邮箱(用户账号)
- private String role; //用户角色
- private String status; //用户状态
- ...
- getter/setter方法
- }
复制代码 STEP 02 实现DAO:
创建一个用户接口UserMapper,并在接口中定义login()方法,login()方法通过用户账号和用户密码查询用户信息。
- public interface UserMapper {
- // 使用@Select注解定义SQL查询语句
- // 从user表中选择所有字段,条件是user_email和user_password匹配,并且user_status不等于'1'
- @Select("select * from user where user_email=#{email} AND user_password=#{password} AND user_status!='1'")
-
- // 使用@Results注解定义查询结果与Java对象属性的映射关系
- @Results(id = "userMap", value = {
- // 使用@Result注解定义具体的映射关系
- // id属性设置为true,表示user_id是主键
- // column属性指定数据库表中的字段名,property属性指定Java对象中的属性名
- @Result(id = true, column = "user_id", property = "id"),
- // 这里应该还有其他字段的映射关系,但图片中未显示
- })
-
- ...
- // 定义login方法,接受一个User类型的参数
- User login(User user);
- }
复制代码 STEP 03 实现Service:
(1)创建UserService接口,并在该接口中定义login()方法,login()方法通过用户账号和用户密码查询用户信息。
- package com.itheima.service;
- import com.itheima.domain.User;
- /**
- * 用户接口
- */
- public interface UserService {
- /**
- * 通过User的用户账号和用户密码查询用户信息
- */
- User login(User user);
- }
复制代码 (2)创建UserService接口的实现类UserServiceImpl,在类中重写接口的login()方法。
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- @Service
- public class UserServiceImpl implements UserService {
- // 注入UserMapper对象
- @Autowired
- private UserMapper userMapper;
- /**
- * 通过User的用户账号和用户密码查询用户信息
- */
- @Override
- public User login(User user) {
- return userMapper.login(user);
- }
- }
复制代码 STEP 04 实现Controller:
创建用户控制器类UserController,类中定义用户登录的方法login()。
- import javax.servlet.http.HttpServletRequest;
- @RequestMapping("/login")
- public String login(User user, HttpServletRequest request) {
- User u = userService.login(user);
- if (u != null) {
- request.getSession().setAttribute("USER_SESSION", u);
- return "redirect:/admin/main.jsp";
- } else {
- request.setAttribute("msg", "用户名或密码错误");
- return "forward:/admin/login.jsp";
- }
- // ...其他代码此处省略
- }
复制代码 STEP 05 实现登录页面功能:
在15.3.3节中引入页面资源时,已经把登录页面login.jsp导入到项目中了,登录页面主要包含一个登录表单。
- <form id="loginform" class="sui-form" action="${pageContext.request.contextPath}/login" method="post">
- <div class="input-prepend">
- <span class="add-on loginname">用户名</span>
- <input type="text" placeholder="企业邮箱" class="span2 input-xfat" name="email">
- </div>
- <div class="input-prepend">
- <span class="add-on loginpwd">密码</span>
- <input type="password" placeholder="请输入密码" class="span2 input-xfat" name="password">
- </div>
- <!-- 其他代码此处省略 -->
- </form>
复制代码 STEP 06 启动项目,登录测试:
在实行登录操作之前,先检察一下数据库中user表中的数据。
将项目部署到Tomcat服务器并启动项目,访问登录页面,在登录页面中分别输入账号itheima@itcast.cn和密码123456,单击“登录”按钮登录系统,登录乐成后系统后台首页如图所示。
15.4.2 实现登录验证
在系统中实现用户登录模块中的登录验证功能。
其他系统访问系统首页的情况
虽然现在已经实现了用户登录功能,但此功能还并不完善。假设控制器类中也存在其他访问系统首页的方法,那么用户完全可以绕过登录步调,而直接通过访问该方法进入系统后台首页。为了验证上述假设,在UserController控制器类中新增一个方法toMainPage(),用于跳转到系统后台首页,其代码如右图所示。
- // 跳转到系统后台首页的方法
- @RequestMapping("/toMainPage")
- public String toMainPage() {
- return "main"; // 返回视图名称,通常对应于一个JSP页面或Thymeleaf模板
- }
复制代码 如上代码中toMainPage()方法只用于页面跳转。toMainPage()方法会处理URL为toMainPage的请求,并跳转到名称为main的页面。
直接访问系统后台首页时的页面跳转
当其他系统访问系统首页时,此时,不进行用户登录,直接在欣赏器访问跳转到系统后台首
页的地点http://localhost:8080/cloudlibrary/toMainPage,页面跳转如下图所示。
从上图能看出来,未登录也能直接访问到系统后台首页。显然,让未登录的用户直接访问到系统的后台页面,将是非常不安全的。
办理直接访问后台首页的方法
未登录用户也能直接访问到系统后台首页,这对系统来说是不安全的。为了制止此种情况的发生,提拔系统的安全性,可以创建一个拦截器来拦截全部请求。当用户处于登录状态时,直接放行该用户的请求;假如用户没有登录,但是访问的是登录相关的请求,也放行;否则将请求转发到登录页面,并提示用户登录。
拦截器的实行流程图
用户登录验证的具体实现如下。
STEP 01 创建登录拦截器类:
创建登录拦截器类ResourcesInterceptor,用于对用户访问进行拦截控制。
- // ...其他代码此处省略
- User user = (User) request.getSession().getAttribute("USER_SESSION");
- String uri = request.getRequestURI(); // 获取请求的路径
- // 如果用户是已登录状态,放行
- if (user != null) {
- return true;
- }
- // 用户登录的相关请求,放行
- if (uri.indexOf("login") >= 0) {
- return true;
- }
- // 其他情况都直接跳转到登录页面
- request.setAttribute("msg", "您还没有登录,请先登录!");
- request.getRequestDispatcher("/admin/login.jsp").forward(request, response);
- return false;
- // ...其他代码此处省略
复制代码
STEP 02 配置拦截器:
在SpringMvcConfig配置类中重写addInterceptors()方法,将自定义的资源拦截器添加到拦截器注册类中,重写的addInterceptors()方法具体代码如下所示。
- // 在拦截器注册类中添加自定义拦截器。addPathPatterns()方法设置拦截的路径;excludePathPatterns()方法设置不拦截的路径
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- registry.addInterceptor(new ResourcesInterceptor())
- .addPathPatterns("/**")
- .excludePathPatterns("/css/**", "/js/**", "/img/**");
- }
复制代码 STEP 03 检察运行结果:
启动cloudlibrary项目,不进行用户登录,直接访问跳转到系统后台页面的地
址http://localhost:8080/cloudlibrary/toMainPage,页面跳转如图所示。
从图中可以看出,未登录的用户直接实行访问控制器方法后,并没有乐成跳转到系统后台首页,而是转发到了系统登录页面,同时在登录页面中也给出了用户未登录的提示信息。这表明用户登录验证功能已乐成实现。
15.4.3 注销登录
在系统中实现用户登录模块中的注销登录功能。
接下来,实现用户登录模块的注销登录功能,具体实现如下。
STEP 01 main.jsp 文件中,“注销”超链接的代码如下:
- <ul class="nav navbar-nav">
- <li class="dropdown user user-menu">
- <a>
- <img src="${pageContext.request.contextPath}/img/user.jpg" class="user-image" alt="User Image">
- <span class="hidden-xs">${USER_SESSION.name}</span>
- </a>
- </li>
- <li class="dropdown user user-menu">
- <a href="${pageContext.request.contextPath}/logout">
- <span class="hidden-xs">注销</span>
- </a>
- </li>
- </ul>
复制代码 STEP 02
在UserController控制器类中新增一个注销登录的方法logout(),该方法中,起首扫除Session中的用户信息,然后跳转到登录页面。logout()方法的具体代码如下所示。
- @RequestMapping("/logout")
- public String logout(HttpServletRequest request) {
- try {
- HttpSession session = request.getSession();
- session.invalidate(); // 销毁Session
- return "forward:/admin/login.jsp";
- } catch (Exception e) {
- e.printStackTrace();
- request.setAttribute("msg", "系统错误");
- return "forward:/admin/login.jsp";
- }
- }
复制代码 STEP 03
至此,注销登录的功能就实现了。重启项目并登录系统后,单击系统后台页面中的“注销”链接,跳转到的页面如图所示。
从图中可以看出,用户黑马程序员的登录状态已经被注销,并跳转到了登录页面。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |