东湖之滨 发表于 3 天前

【基于轻量型架构的WEB开辟】课程 上|第15章 云借阅图书管理系统 《Java EE

第15章 云借阅图书管理系统

学习目标/Target  


[*]了解云借阅图书管理系统架构
[*]了解云借阅图书管理系统的文件组织结构
[*]认识系统环境搭建步调
[*]掌握登录模块功能的实现
[*]掌握图书管理模块功能的编写
[*]掌握访问权限控制的实现
章节概述/Summary 
        本章将通过前面章节学习的SSM(Spring+Spring MVC+MyBatis)框架知识来实现一个简单的云借阅图书管理系统。云借阅图书管理系统在开辟过程中,整合了三大框架,并在框架整合的基础上实现了系统功能。

目次/Contents


[*]        01 系统概述   

[*]        02 数据库设计   

[*]        03 系统环境搭建      

[*]        04 用户登录模块         

[*]        05 图书管理模块         

[*]        06 访问权限控制            





15.1 系统概述

        了解系统概述,可以大概说出云借阅系统的功能结构、系统的结构层次、文件组织结构和系统开辟运行环境。
15.1.1 系统功能介绍

云借阅系统功能模块介绍
        本系统后台使用SSM框架编写,前台页面使用当前主流的Bootstrap和jQuery框架编写。(关于Bootstrap的知识,可参考黑马程序员编著的《响应式Web开辟项目教程》)。
        云借阅图书管理系统主要实现了两大功能模块:用户登录模块和图书管理模块,用户登录模块主要用于实现用户的登录与注销;图书管理模块主要用于管理图书,如新书推荐、图书借阅等。
云借阅系统功能结构图
https://i-blog.csdnimg.cn/direct/81d698d4a32c4672afb541bcce733b05.png
15.1.2 系统架构设计

云借阅系统结构层次
   
根据功能的不同,云借阅图书管理系统项目结构可以分别为以下几个层次。


[*]长期对象层(长期层或长期化层):该层由多少长期化类(实体类)构成。
[*]数据访问层(DAO层):该层由多少DAO接口和MyBatis映射文件构成。DAO接口的名称统一以Mapper结尾,且MyBatis的映射文件名称要与接口的名称雷同。
[*]业务逻辑层(Service层):该层由多少Service接口和实现类构成。逻辑层主要用于实现系统的业务逻辑。
[*]Web表现层:该层主要包括Spring MVC中的Controller类和JSP页面。
云借阅系统各个层次的关系和作用
https://i-blog.csdnimg.cn/direct/00c04eef3d414590a31212031151344f.png
15.1.3 文件组织结构 

云借阅系统项目文件组织结构
https://i-blog.csdnimg.cn/direct/87362b8d71bd4b62a92e865d1fd465e0.png
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)的表结构
https://i-blog.csdnimg.cn/direct/7879e87f3ea54dcd9b00d513cfac39f4.png
图书信息表(book)的表结构(1)
https://i-blog.csdnimg.cn/direct/ab48bd244a06416da0ecd6d368b0dfb6.png
图书信息表(book)的表结构(2)
https://i-blog.csdnimg.cn/direct/48e44eb8b6ac471b86ba16266cd63b25.png
借阅记载表(record)的表结构
https://i-blog.csdnimg.cn/direct/a38a1a51ee0942f5baa5257926654902.png

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)选择所创建的数据库
USE cloudlibrary; (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,访问结果如图所示。
https://i-blog.csdnimg.cn/direct/dc0948f1fd8a4bb0b3003c4e3b161099.png

15.4 用户登录模块

在系统中实现用户登录模块中的用户登录功能。
15.4.1 用户登录

用户登录流程图
https://i-blog.csdnimg.cn/direct/c3eb0993c66345f280c2b02c898260aa.png
        从图中可以看出,用户登录过程中起首要验证用户名和密码是否正确,假如正确,可以乐成登录系统,系统会主动跳转到主页;假如错误,则在登录页面给出错误提示信息。
   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表中的数据。
    https://i-blog.csdnimg.cn/direct/3a3daeee44554864b930ee7a36e5b46e.png
                 将项目部署到Tomcat服务器并启动项目,访问登录页面,在登录页面中分别输入账号itheima@itcast.cn和密码123456,单击“登录”按钮登录系统,登录乐成后系统后台首页如图所示。
      https://i-blog.csdnimg.cn/direct/843714ee68b441df811a155cbfa470b4.png
   
         15.4.2 实现登录验证

         在系统中实现用户登录模块中的登录验证功能。
      其他系统访问系统首页的情况
              虽然现在已经实现了用户登录功能,但此功能还并不完善。假设控制器类中也存在其他访问系统首页的方法,那么用户完全可以绕过登录步调,而直接通过访问该方法进入系统后台首页。为了验证上述假设,在UserController控制器类中新增一个方法toMainPage(),用于跳转到系统后台首页,其代码如右图所示。
                         // 跳转到系统后台首页的方法
@RequestMapping("/toMainPage")
public String toMainPage() {
    return "main"; // 返回视图名称,通常对应于一个JSP页面或Thymeleaf模板
}            如上代码中toMainPage()方法只用于页面跳转。toMainPage()方法会处理URL为toMainPage的请求,并跳转到名称为main的页面。
          直接访问系统后台首页时的页面跳转
            当其他系统访问系统首页时,此时,不进行用户登录,直接在欣赏器访问跳转到系统后台首
    页的地点http://localhost:8080/cloudlibrary/toMainPage,页面跳转如下图所示。
    https://i-blog.csdnimg.cn/direct/9e13a2ef6a634458af497d41ed27a69c.png
   
            从上图能看出来,未登录也能直接访问到系统后台首页。显然,让未登录的用户直接访问到系统的后台页面,将是非常不安全的。
      办理直接访问后台首页的方法
           未登录用户也能直接访问到系统后台首页,这对系统来说是不安全的。为了制止此种情况的发生,提拔系统的安全性,可以创建一个拦截器来拦截全部请求。当用户处于登录状态时,直接放行该用户的请求;假如用户没有登录,但是访问的是登录相关的请求,也放行;否则将请求转发到登录页面,并提示用户登录。
   拦截器的实行流程图
   https://i-blog.csdnimg.cn/direct/9f006a7bd03e41b9bfabc57411f5a849.png
   
   用户登录验证的具体实现如下。
      
    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,页面跳转如图所示。
    https://i-blog.csdnimg.cn/direct/a3bc693a6e9d4b53b002e94552750eda.png
         
            从图中可以看出,未登录的用户直接实行访问控制器方法后,并没有乐成跳转到系统后台首页,而是转发到了系统登录页面,同时在登录页面中也给出了用户未登录的提示信息。这表明用户登录验证功能已乐成实现。
      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

                    至此,注销登录的功能就实现了。重启项目并登录系统后,单击系统后台页面中的“注销”链接,跳转到的页面如图所示。
         https://i-blog.csdnimg.cn/direct/16015eb2e730470eb19c5e441c6f07a8.png
           从图中可以看出,用户黑马程序员的登录状态已经被注销,并跳转到了登录页面。
            



















免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【基于轻量型架构的WEB开辟】课程 上|第15章 云借阅图书管理系统 《Java EE