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

打印 上一主题 下一主题

主题 1039|帖子 1039|积分 3121

第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开辟项目教程》)。
        云借阅图书管理系统主要实现了两大功能模块:用户登录模块和图书管理模块,用户登录模块主要用于实现用户的登录与注销;图书管理模块主要用于管理图书,如新书推荐、图书借阅等。
云借阅系统功能结构图

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)创建数据库
  1. CREATE DATABASE cloudlibrary;
复制代码
(2)选择所创建的数据库
  1. USE cloudlibrary;
复制代码
(3)导入数据库文件
这里假设该文件在F盘的根目次下,导入命令如下所示
  1. 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实现了一个转发功能,在访问时会转发到登录页面,其实现代码如下所示。
   
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!-- 访问时自动转发到登录页面 -->
  4. <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方法。
  1. public class User implements Serializable {
  2.     private Integer id; //用户id
  3.     private String name; //用户名称
  4.     private String password; //用户密码
  5.     private String email; //用户邮箱(用户账号)
  6.     private String role; //用户角色
  7.     private String status; //用户状态
  8.     ...
  9.     getter/setter方法
  10. }
复制代码
STEP 02 实现DAO:

  创建一个用户接口UserMapper,并在接口中定义login()方法,login()方法通过用户账号和用户密码查询用户信息。
  1. public interface UserMapper {
  2.     // 使用@Select注解定义SQL查询语句
  3.     // 从user表中选择所有字段,条件是user_email和user_password匹配,并且user_status不等于'1'
  4.     @Select("select * from user where user_email=#{email} AND user_password=#{password} AND user_status!='1'")
  5.    
  6.     // 使用@Results注解定义查询结果与Java对象属性的映射关系
  7.     @Results(id = "userMap", value = {
  8.         // 使用@Result注解定义具体的映射关系
  9.         // id属性设置为true,表示user_id是主键
  10.         // column属性指定数据库表中的字段名,property属性指定Java对象中的属性名
  11.         @Result(id = true, column = "user_id", property = "id"),
  12.         // 这里应该还有其他字段的映射关系,但图片中未显示
  13.     })
  14.    
  15.     ...
  16.     // 定义login方法,接受一个User类型的参数
  17.     User login(User user);
  18. }
复制代码
   STEP 03 实现Service:

  (1)创建UserService接口,并在该接口中定义login()方法,login()方法通过用户账号和用户密码查询用户信息。
   
  1. package com.itheima.service;
  2. import com.itheima.domain.User;
  3. /**
  4. * 用户接口
  5. */
  6. public interface UserService {
  7.     /**
  8.      * 通过User的用户账号和用户密码查询用户信息
  9.      */
  10.     User login(User user);
  11. }
复制代码
   (2)创建UserService接口的实现类UserServiceImpl,在类中重写接口的login()方法。
   
  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.stereotype.Service;
  3. @Service
  4. public class UserServiceImpl implements UserService {
  5.     // 注入UserMapper对象
  6.     @Autowired
  7.     private UserMapper userMapper;
  8.     /**
  9.      * 通过User的用户账号和用户密码查询用户信息
  10.      */
  11.     @Override
  12.     public User login(User user) {
  13.         return userMapper.login(user);
  14.     }
  15. }
复制代码
STEP 04 实现Controller:

   创建用户控制器类UserController,类中定义用户登录的方法login()。
   
  1. import javax.servlet.http.HttpServletRequest;
  2. @RequestMapping("/login")
  3. public String login(User user, HttpServletRequest request) {
  4.     User u = userService.login(user);
  5.     if (u != null) {
  6.         request.getSession().setAttribute("USER_SESSION", u);
  7.         return "redirect:/admin/main.jsp";
  8.     } else {
  9.         request.setAttribute("msg", "用户名或密码错误");
  10.         return "forward:/admin/login.jsp";
  11.     }
  12.     // ...其他代码此处省略
  13. }
复制代码
STEP 05 实现登录页面功能:

     在15.3.3节中引入页面资源时,已经把登录页面login.jsp导入到项目中了,登录页面主要包含一个登录表单。
      
  1. <form id="loginform" class="sui-form" action="${pageContext.request.contextPath}/login" method="post">
  2.     <div class="input-prepend">
  3.         <span class="add-on loginname">用户名</span>
  4.         <input type="text" placeholder="企业邮箱" class="span2 input-xfat" name="email">
  5.     </div>
  6.     <div class="input-prepend">
  7.         <span class="add-on loginpwd">密码</span>
  8.         <input type="password" placeholder="请输入密码" class="span2 input-xfat" name="password">
  9.     </div>
  10.     <!-- 其他代码此处省略 -->
  11. </form>
复制代码
   STEP 06 启动项目,登录测试:

    在实行登录操作之前,先检察一下数据库中user表中的数据。
   

                 将项目部署到Tomcat服务器并启动项目,访问登录页面,在登录页面中分别输入账号itheima@itcast.cn和密码123456,单击“登录”按钮登录系统,登录乐成后系统后台首页如图所示。
        

   
         15.4.2 实现登录验证

           在系统中实现用户登录模块中的登录验证功能。
      其他系统访问系统首页的情况
              虽然现在已经实现了用户登录功能,但此功能还并不完善。假设控制器类中也存在其他访问系统首页的方法,那么用户完全可以绕过登录步调,而直接通过访问该方法进入系统后台首页。为了验证上述假设,在UserController控制器类中新增一个方法toMainPage(),用于跳转到系统后台首页,其代码如右图所示。
                        
  1. // 跳转到系统后台首页的方法
  2. @RequestMapping("/toMainPage")
  3. public String toMainPage() {
  4.     return "main"; // 返回视图名称,通常对应于一个JSP页面或Thymeleaf模板
  5. }
复制代码
           如上代码中toMainPage()方法只用于页面跳转。toMainPage()方法会处理URL为toMainPage的请求,并跳转到名称为main的页面。
          直接访问系统后台首页时的页面跳转
            当其他系统访问系统首页时,此时,不进行用户登录,直接在欣赏器访问跳转到系统后台首
    页的地点http://localhost:8080/cloudlibrary/toMainPage,页面跳转如下图所示。
   

   
            从上图能看出来,未登录也能直接访问到系统后台首页。显然,让未登录的用户直接访问到系统的后台页面,将是非常不安全的。
      办理直接访问后台首页的方法
           未登录用户也能直接访问到系统后台首页,这对系统来说是不安全的。为了制止此种情况的发生,提拔系统的安全性,可以创建一个拦截器来拦截全部请求。当用户处于登录状态时,直接放行该用户的请求;假如用户没有登录,但是访问的是登录相关的请求,也放行;否则将请求转发到登录页面,并提示用户登录。
   拦截器的实行流程图
   

   
   用户登录验证的具体实现如下。
      
    STEP 01 创建登录拦截器类:

    创建登录拦截器类ResourcesInterceptor,用于对用户访问进行拦截控制。
     
  1. // ...其他代码此处省略
  2. User user = (User) request.getSession().getAttribute("USER_SESSION");
  3. String uri = request.getRequestURI(); // 获取请求的路径
  4. // 如果用户是已登录状态,放行
  5. if (user != null) {
  6.     return true;
  7. }
  8. // 用户登录的相关请求,放行
  9. if (uri.indexOf("login") >= 0) {
  10.     return true;
  11. }
  12. // 其他情况都直接跳转到登录页面
  13. request.setAttribute("msg", "您还没有登录,请先登录!");
  14. request.getRequestDispatcher("/admin/login.jsp").forward(request, response);
  15. return false;
  16. // ...其他代码此处省略
复制代码
      
    STEP 02 配置拦截器:

    在SpringMvcConfig配置类中重写addInterceptors()方法,将自定义的资源拦截器添加到拦截器注册类中,重写的addInterceptors()方法具体代码如下所示。
     
  1. // 在拦截器注册类中添加自定义拦截器。addPathPatterns()方法设置拦截的路径;excludePathPatterns()方法设置不拦截的路径
  2. @Override
  3. public void addInterceptors(InterceptorRegistry registry) {
  4.     registry.addInterceptor(new ResourcesInterceptor())
  5.             .addPathPatterns("/**")
  6.             .excludePathPatterns("/css/**", "/js/**", "/img/**");
  7. }
复制代码
  STEP 03 检察运行结果:

       启动cloudlibrary项目,不进行用户登录,直接访问跳转到系统后台页面的地
    址http://localhost:8080/cloudlibrary/toMainPage,页面跳转如图所示。
   

         
            从图中可以看出,未登录的用户直接实行访问控制器方法后,并没有乐成跳转到系统后台首页,而是转发到了系统登录页面,同时在登录页面中也给出了用户未登录的提示信息。这表明用户登录验证功能已乐成实现。
      15.4.3 注销登录

   在系统中实现用户登录模块中的注销登录功能。
   接下来,实现用户登录模块的注销登录功能,具体实现如下。
      
         STEP 01 main.jsp 文件中,“注销”超链接的代码如下:

   
  1. <ul class="nav navbar-nav">
  2.     <li class="dropdown user user-menu">
  3.         <a>
  4.             <img src="${pageContext.request.contextPath}/img/user.jpg" class="user-image" alt="User Image">
  5.             <span class="hidden-xs">${USER_SESSION.name}</span>
  6.         </a>
  7.     </li>
  8.     <li class="dropdown user user-menu">
  9.         <a href="${pageContext.request.contextPath}/logout">
  10.             <span class="hidden-xs">注销</span>
  11.         </a>
  12.     </li>
  13. </ul>
复制代码
                  STEP 02 

                        在UserController控制器类中新增一个注销登录的方法logout(),该方法中,起首扫除Session中的用户信息,然后跳转到登录页面。logout()方法的具体代码如下所示。
     
  1. @RequestMapping("/logout")
  2. public String logout(HttpServletRequest request) {
  3.     try {
  4.         HttpSession session = request.getSession();
  5.         session.invalidate(); // 销毁Session
  6.         return "forward:/admin/login.jsp";
  7.     } catch (Exception e) {
  8.         e.printStackTrace();
  9.         request.setAttribute("msg", "系统错误");
  10.         return "forward:/admin/login.jsp";
  11.     }
  12. }
复制代码
         STEP 03

                      至此,注销登录的功能就实现了。重启项目并登录系统后,单击系统后台页面中的“注销”链接,跳转到的页面如图所示。
         

             从图中可以看出,用户黑马程序员的登录状态已经被注销,并跳转到了登录页面。
            



















免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

东湖之滨

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表