Fork me on GitHub

图书馆管理系统功能实现第一阶段

语言:JAVA

框架:Springboot + Mybatis

工具:redis  redis可视化工具

前端模拟工具:postman

在前面知识的铺垫下,我尝试着自己独立实现一个系统,想了很久决定做一个图书馆管理系统,用来练练手。我们要来了解一下图书管理系统都要做啥,都需要什么表,都需要实现哪些功能。

图书馆管理系统项目代码下载地址:https://github.com/yeyuting-1314/library-2.0.git

首先,我们知道,图书管理系统中肯定要有借书、还书,这是两个最核心的功能,然后还要有用户注册登陆,管理员管理书籍,定期上架图书或者下架图书等等,综合来看,我们将图书管理系统功能规划如下:

查看图书列表、借阅图书、归还书籍、用户注册、用户登陆   这几个是普通用户应该具备的功能

查看图书借阅记录、用户登陆  这是普通管理员应该有的权限

用户登陆、新增图书进入图书列表、下架图书  这是超级管理员应该有的权限

因此,由此可知,数据库的设计需要涉及到如下数据表:

1. 用户个人信息表   用户名  用户学生号 用户登陆密码

2. 图书借阅记录表  借书学生号  所借书籍编号  借书/还书时间  书籍状态(借书/还书)

3. 图书信息表   图书名  图书编号  图书出版社  书籍类型

4. 用户角色表  角色id  角色名(中文翻译) 角色名(英文)  这里分中英文是因为英文角色名在角色控制权限中要用到 中文的角色名为了便于用户识别角色

5. 用户角色关联表  用户学生号   角色id

6. 资源表  资源id  资源名字  资源url   这里是将所有所有接口都进行了封装进入数据库 便于为用户分配对应权限进行访问

7. 角色资源关联表  角色id  资源id

总的来说,数据表大致就是这七张了,我们接下来就开始进行项目的准备工作了。

一、准备工作

1. 数据库设计,我们第一阶段先实现前三张表,先把图书馆管理系统功能都给实现,角色权限都先给到普通用户,等到第二阶段的时候再将端口分配出去给到普通管理员和超级管理员。

(1)用户信息表

create table library.sys_user (
    `id` int NOT NULL AUTO_INCREMENT, 
    `user_name` varchar(50) default null , 
    `user_id` varchar(50) default null , 
    `user_password` varchar(50) default null 
);

(2)书籍信息表

create table library.sys_book (
    `id` int NOT NULL AUTO_INCREMENT, 
    `book_name` varchar(50) default null , 
    `book_code` varchar(50) default null , 
    `book_publisher` varchar(50) default null ,
    `book_type` varchar(50) default null
);

(3)借阅记录表

create table library.borrowing_records (
    `id` int NOT NULL AUTO_INCREMENT, 
    `user_id` varchar(50) default null , 
    `book_code` varchar(50) default null , 
    `operate_time` TIMESTAMP DEFAULT now() ,
    `borrowing_status` varchar(10) default null
);

对数据表进行插入操作:

insert into library.sys_book
(id , book_name , book_code , book_publisher , book_type) 
values 
(1, "Java" , "111111" , "北京出版社" , "计算机")

insert into library.sys_book
(id , book_name , book_code , book_publisher , book_type) 
values 
(2, "web" , "111112" , "天津出版社" , "计算机")

insert into library.sys_book
(id , book_name , book_code , book_publisher , book_type) 
values 
(3, "安徒生童话" , "111113" , "内蒙古出版社" , "文学")

2. redis环境搭建

(1)先启动redis服务器如下  如果之前没有安装过reids的话可以看redis安装教程 https://www.cnblogs.com/yeyuting/p/14206888.html ,这是我之前写的一篇博客,里面有其他内容,主要看redis安装启动即可。redis服务器和下面要用的可视化界面安装程序通过网盘的形式分享:

链接:https://pan.baidu.com/s/1QTYrlWQYIwv32z0LKTJnSg
提取码:seqe

 

 

 (2)redis可视化界面连接redis ,安装redis可视化界面的目的在于我们能更好的看到redis中都粗出了哪些数据,便于我们的存取操作。redis可视化界面安装程序在上面一并分享了,安装过程较简单,一直下一步即可,打开初始化界面后连接6379端口即可。

 

 

 3. 接下来还要准备前端模拟发数据的postman  之前如果没安装过的话也需要装一下 安装程序分享:

链接:https://pan.baidu.com/s/165B6HNNA-2FwpEzB15zBAg
提取码:lxxe

 

 

 4. 接下来就是spring boot项目搭建了

首先新建一个maven项目,然后对项目目录进行分类,便于后面不同代码放入不同目录

 

 

 

(1) application.properties文件对 mybatis配置  redis配置  数据库配置

#MySql配置
spring.datasource.url = jdbc:mysql://47.100.59.91:3306/library
spring.datasource.username=root
spring.datasource.password= Aa12345&_

#Mybatis配置
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=library.system.dto
mybatis.configuration.map-underscore-to-camel-case=true

#redis配置
spring.redis.host=localhost
spring.redis.port=6379

(2)pom文件引入依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--mybatis配置-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>
        <!--jdbc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <!--redis配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--jwt引入-->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.4.0</version>
        </dependency>


    </dependencies>

(3)实体类对应  这里三个实体对应数据库三个表  便于数据库内容映射到实体类中  由于类内容较为简单  加之项目代码也会分享出来,所以就不再进行赘述。

(4)前端返回头Results  result类实现  用于将后端拿到的数据返给前端  到时候看看项目代码就明白了 这里就不进行赘述。

(5)token生成加密和解密  在util目录下tokenUtil实现

(6)config目录下有拦截器和redis配置   拦截器的作用是判断访问接口是否带有token,从而判断之前用户是否登陆过,禁止没登录过的用户进行登陆  redis配置是因为实体对象读入reids时候要进行序列化 同时我们要将reids中key 和 value读取出来时需要对数据进行反序列化才能顺利读取到控制台输出,所以才有redis配置这一操作。

(7)controller层、service层、dao层注解都加上。

上面说了个大概  具体还是要看代码  如果有迷惑或者不明白的地方欢迎留言我们一起讨论。

接下来就开始实现各个功能了.

二、功能实现

1. 用户注册

controller层:

//用户注册
    @PostMapping("/registerUser")
    public Result registerUser(@RequestBody SysUser sysUser){
        Result result = Results.successWithData(
                userService.RegisterUser(sysUser) , BaseEnums.SUCCESS.code() , BaseEnums.SUCCESS.desc()) ;
        return result ;
    }

service层:

//用户注册
    public Object RegisterUser(SysUser sysUser) ;


//用户注册
    public Object RegisterUser(SysUser sysUser){
        SysUser sysUser1 = userMapper.selectUserByUserId(sysUser) ;
        if(sysUser1 != null && sysUser1.equals(null)){
            return "用户已存在,请登陆!" ;
        }
        Boolean result = userMapper.insertOneUser(sysUser) ;
        return result ;
    }

dao层:

public Boolean insertOneUser(SysUser sysUser) ;

public SysUser selectUserByUserId(SysUser sysUser) ;
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="library.system.dao.UserMapper">
    <resultMap id="userMap" type="library.system.dto.SysUser">
        <result property="id" column="id"/>
        <result property="userName" column="user_name"/>
        <result property="userId" column="user_id"/>
        <result property="userPassword" column="user_password"/>
    </resultMap>

    <insert id="insertOneUser">
        insert into sys_user
        (user_name , user_id ,user_password)
        values
        (#{userName} , #{userId} , #{userPassword})
    </insert>

    <select id="selectUserByUserId" resultMap="userMap">
        select * from sys_user where user_id = #{userId}
    </select>

</mapper>

这样一来,注册功能就实现了,前端post模拟发注册请求:

 

 

 这样一来,用户注册就顺利实现了。

2. 用户借书与还书

controller层:

//用户角色 借阅书本
    @PostMapping("/borrowBooks")
    public Result borrowBooks(@RequestParam("bookCode") String bookCode ,
                              HttpServletRequest request) {
        Result result = Results.successWithData(userService.borrowBooks(bookCode ,request)) ;
        return result ;
    }

    //用户角色 还书
    @PostMapping("returnBooks")
    public Result returnBooks (@RequestParam("bookCode") String bookCode ,
                               HttpServletRequest request){
        Result result = Results.successWithData(userService.returnBooks(bookCode,request)) ;
        return result ;
    }

service层:

//图书借阅操作
    public Boolean borrowBooks(String bookCode , HttpServletRequest request) ;

    //还书操作
    public Boolean returnBooks(String bookCode , HttpServletRequest request) ;
public Boolean borrowBooks(String bookCode , HttpServletRequest request){
        String token = request.getHeader("token") ;
        DecodedJWT jwt = tokenUtil.deToken(token) ;
        BorrowingRecords borrowingRecords = new BorrowingRecords() ;
        borrowingRecords.setUserId(jwt.getClaim("userId").asString());
        borrowingRecords.setBookCode(bookCode);
        borrowingRecords.setBorrowingStatus(Constant.BORROWBOOKS);
        return borrowingRecordsMapper.borrowBooks(borrowingRecords) ;
    }

    public Boolean returnBooks(String bookCode , HttpServletRequest request){
        String token = request.getHeader("token") ;
        DecodedJWT jwt = tokenUtil.deToken(token) ;
        BorrowingRecords borrowingRecords = new BorrowingRecords() ;
        borrowingRecords.setUserId(jwt.getClaim("userId").asString());
        borrowingRecords.setBookCode(bookCode);
        borrowingRecords.setBorrowingStatus(Constant.RETURNBOOKS);
        return borrowingRecordsMapper.returnBooks(borrowingRecords) ;
    }

dao层:

public Boolean borrowBooks(BorrowingRecords borrowingRecords) ;

public Boolean returnBooks(BorrowingRecords borrowingRecords) ;
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="library.system.dao.BorrowingRecordsMapper">
    <resultMap id="borrowingRecordsMap" type="library.system.dto.BorrowingRecords">
        <result property="userId" column="user_id"/>
        <result property="bookCode" column="book_code"/>
        <result property="operateTime" column="operate_time"/>
        <result property="borrowing_status" column="borrowingStatus"/>
    </resultMap>

    <select id="selectAllBorrowingRecords" resultMap="borrowingRecordsMap">
        select * from borrowing_records
    </select>

    <insert id="borrowBooks">
        insert into borrowing_records
        (user_id , book_code , borrowing_status)
        values
        (#{userId} , #{bookCode} , #{borrowingStatus})
    </insert>

    <insert id="returnBooks">
        insert into borrowing_records
        (user_id , book_code , borrowing_status)
        values
        (#{userId} , #{bookCode} , #{borrowingStatus})
    </insert>

</mapper>

这样一来,最初步的用户借书还书逻辑就实现了,其他功能就更加的简单了,这里就不进行赘述了,大家自行探索,探索途中有不明白的欢迎留言讨论。

三、收尾工作

我们这里对项目进行了一个大概的介绍,更加详细的内容就不进行介绍了,将项目核心功能说明白即可,具体想要学明白还是回去撸代码才行。在看代码过程中有问题欢迎浏览讨论。

至此结束。

posted @ 2021-03-04 18:48  叶语婷  阅读(747)  评论(0编辑  收藏  举报