基于springboot的中国国家图书馆管理系统项目(管理功能)

中国国家图书馆管理系统项目介绍

项目背景

中国国家图书馆公司(狗头)委托我开发一个一个专门的中国国家图书馆,出售外星人电子产品以及周边,实现了以下功能。
本项目尚未搭载了服务器,网址给定:
链接: 外星人官方网站.

项目功能

  • 登录
  • 注册
  • 后台系统
  • 前端展示
  • 用户系统
  • 租借记录
  • 充值消费

项目技术

  • 项目框架:springboot
  • 数据库框架:mybaits
  • 前端技术:JS、JQuery、Ajax

项目模块

持久层:依据业务要求规划相关的SQL语句,以及进行配置
业务层:核心功能控制、业务操作以及异常处理
控制层:接受请求,处理响应
前端开发:JS、JQuery、Ajax
单元测试:junit

项目要求

  • JDK8
  • maven3.6.1
  • 数据库mysql5.1
  • idea

中国国家图书馆管理系统项目开发流程

第一节 登录

1. 持久层

  • 创建基本用户类
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    /**
     * id       int not null primary key auto_increment,
     * username varchar(12), --用户名
     * password varchar(12)  -- 密码
     */
    private int id;
    private String username;
    private String password;
    private Double money;
}
  • mapper
<?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="com.example.mapper.UserMapper">

    <select id="logincheck" parameterType="user" resultType="user">
        select *
        from `ssm-library`.user
        <where>
            <if test="username != null and username != ''">
                and `username` = #{username}
            </if>
            <if test="password != null and password != ''">
                AND `password` = #{password}
            </if>
        </where>
    </select>

    <select id="checkUserName" parameterType="String" resultType="String">
        select *
        from `ssm-library`.user
        <where>
            <if test="username != null and username != ''">
                AND `username` = #{username}
            </if>
        </where>
    </select>
</mapper>

2. 业务层

  • 登录功能的service接口和实现
public interface UserService {
    //登录验证
    User logincheck(User user);

    //注册
    void register(User user);


    //检查是否用户存在
    String checkUserName(String username);

    List<User> getAllUser();

    User getUserByName(String name);

    //条件查询
    List<User> conditionQuery(User user);


}

  • impl
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    @Override
    public User logincheck(User user) {
        return userMapper.logincheck(user);

    }

    @Override
    public void register(User user) {
        userMapper.register(user);

    }

    @Override
    public String checkUserName(String username) {
        return userMapper.checkUserName(username);
    }


    @Override
    public List<User> getAllUser() {
        return userMapper.getAllUser();
    }

    @Override
    public User getUserByName(String name) {
        return userMapper.getUserByName(name);
    }


    @Override
    public List<User> conditionQuery(User user) {
        return userMapper.conditionQuery(user);
    }
}


3. 控制层


    //登录验证
    @RequestMapping("/login")
    public String login(@RequestParam("username") String username,
                        @RequestParam("password") String password,
                        Model model, HttpServletRequest request, User user) {

        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        redisTemplate.opsForValue().set(username, password);
        redisTemplate.opsForValue().set("username", username);
//这里使用token整合shiro实现权限-认证
        HttpSession session = request.getSession();
        session.setAttribute("UserSession", username);
        try {
            subject.login(token);
            model.addAttribute("username", username);
            if (("admin").equals(username)) {
                return "redirect:/admin/list";
            } else {
                return "redirect:/user/list";
            }

        } catch (UnknownAccountException e) {
            model.addAttribute("msg", "用户名错误");
            return "index";
        } catch (IncorrectCredentialsException e) {
            model.addAttribute("msg", "密码错误");
            return "index";
        }

    }

4. 前端页面

在这里插入图片描述

  • 导入jsp依赖
        <!-- 引入 jsp,-->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>
  • 前端页面核心
<p text="${msg}" style="color: limegreen"></p>
<form class="form-signin" action="<%=request.getContextPath()%>/login">
    <img class="mb-4" src="<%=request.getContextPath()%>/resource/images/三井寿.jpg" alt="" width="100" height="150">
    <h1 class="h3 mb-3 font-weight-normal">请登录</h1>
    <label for="username" class="sr-only">账号</label>
    <input type="text" name="username" id="username" class="form-control" placeholder="账号" required="" autofocus="">
    <label for="password" class="sr-only">密码</label>
    <input type="password" name="password" id="password" class="form-control" placeholder="密码" required="">
    <div class="checkbox mb-3">
        <label>
            <input type="checkbox" value="remember-me"> 记住我
        </label>
    </div>
    <%--    <button class="btn btn-lg btn-primary btn-block" type="submit">登录</button>--%>
    <%--    <a href="register.jsp" class="btn btn-lg btn-primary btn-block" type="submit">注册</a>--%>

    <a href="register" type="submit" class="btn btn-primary btn-lg">注册</a>
    <button type="submit" class="btn btn-primary btn-lg">登录</button>

    <p class="mt-5 mb-3 text-muted">© 2021</p>
</form>

第二节 注册

1. 持久层

@Component
@Mapper
public interface UserMapper {
    //登录验证
    User logincheck(User user);

    //注册
    void register(User user);

    //检查是否用户存在
    String checkUserName(String username);

    List<User> getAllUser();

    User getUserByName(String name);

    //条件查询
    List<User> conditionQuery(User user);

}
<?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="com.example.mapper.UserMapper">
 <insert id="register" parameterType="user">
        insert into `ssm-library`.user(username, password)
        value (#{username},#{password})
    </insert>

    <select id="getUserByName" parameterType="String" resultType="user">
        select * from `ssm-library`.user where username=#{username}

    </select>

    <select id="getAllUser" resultType="user">
        select * from `ssm-library`.user
    </select>


    <!--根据条件查询-->
    <select id="conditionQuery" resultType="user" parameterType="user">
        select * from `ssm-library`.user
        <where>
            <if test="name != null and name != ''">
                username = #{username}
            </if>
            <if test="author != null and author != ''">
                and password=#{password}
            </if>
        </where>
    </select>


</mapper>

2. 业务层

public interface UserService {
    //登录验证
    User logincheck(User user);

    //注册
    void register(User user);


    //检查是否用户存在
    String checkUserName(String username);

    List<User> getAllUser();

    User getUserByName(String name);

    //条件查询
    List<User> conditionQuery(User user);


@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    @Override
    public User logincheck(User user) {
        return userMapper.logincheck(user);

    }

    @Override
    public void register(User user) {
        userMapper.register(user);

    }

    @Override
    public String checkUserName(String username) {
        return userMapper.checkUserName(username);
    }


    @Override
    public List<User> getAllUser() {
        return userMapper.getAllUser();
    }

    @Override
    public User getUserByName(String name) {
        return userMapper.getUserByName(name);
    }


    @Override
    public List<User> conditionQuery(User user) {
        return userMapper.conditionQuery(user);
    }

//    @Override
//    public List<Book> conditionQuery(Book book) {
//        return bookMapper.conditionQuery(book);
//    }


}

3. 控制层

    //注册
    @RequestMapping("/registering")
    public String register(@RequestParam String username, @RequestParam String password, Model model) {
        User user = new User();
        String s = userService.checkUserName(username);
        if (s == null) {
            user.setUsername(username);
            user.setPassword(password);
            userService.register(user);
            return "redirect:/user/list";
        } else {
            model.addAttribute("fail", "该用户存在");
            System.out.println("该用户存在");
            return "register";
        }
    }

4. 前端页面

在这里插入图片描述

<body class="text-center" style="background: url(/resource/images/spyder.jpg)">
<form class="form-signin" action="${pageContext.request.contextPath}/registering">
    <img class="mb-4" src="<%=request.getContextPath()%>/resource/images/123.jpg" alt="" width="100" height="150">
    <h1 class="h3 mb-3 font-weight-normal">请登录</h1>
    <label for="username" class="sr-only">账号</label>
    <input type="text" name="username" id="username" class="form-control" placeholder="账号" required="" autofocus="">
    <label for="password" class="sr-only">密码</label>
    <input type="password" name="password" id="password" class="form-control" placeholder="密码" required="">
    <div class="checkbox mb-3">
        <label>
            <input type="checkbox" value="remember-me"> 记住我
        </label>
    </div>
    <button type="submit" class="btn btn-primary btn-lg">注册</button>
    <a href="index" class="btn btn-primary btn-lg">登录</a>
    <p class="mt-5 mb-3 text-muted">© 2021</p>
</form>

这里可以用Ajax去升级,以防代码的冗余;

第三节 后台系统

  • 用户管理:User的增删改查
  • 图书管理:图书的增删改查

1. 持久层

  • mapper接口

@Mapper
public interface BookMapper {
    /**
     * * bookId int not null primary key auto_increment, --图书id
     * * name   varchar(50),                             --图书名
     * * author varchar(50),                             --图书作者
     * * press  varchar(50),                             --图书出版社
     * * price  double(6, 2                              --图书单价
     *
     * @param book
     * @return
     */

    // 增
    int addBook(Book book);

    // 删
    int deleteBook(int bookId);

    // 根据name查一个
    List<Book> queryBookByName(String BookName);

    // 改
    int updateBook(Book book);

    // 查所有
    List<Book> queryAllBook();

    // 根据id查一个
    Book queryBookById(int bookId);

    //条件查询
    List<Book> conditionQuery(Book book);

    //模糊查询
    List<Book> ListQuery(String value);

    //the number of Book
    // 增
    int addBookNum(String BookName);

    // 删
    int deleteBookNum(String BookName);

    // 改
    int updateBookNum(String BookName);

}

  • 持久层xml
<?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="com.example.mapper.BookMapper">
    <!--    `name`, `author`, `press`, `price`-->
    <!--增-->
    <insert id="addBook" parameterType="book">
        insert into `ssm-library`.book(name, author, press, price)
        values (#{name}, #{author}, #{press}, #{price})
    </insert>

    <!--删-->
    <delete id="deleteBook" parameterType="int">
        delete
        from `ssm-library`.book
        where bookId = #{bookId}
    </delete>

    <!--改-->
    <update id="updateBook" parameterType="book">
        update `ssm-library`.book
        set name=#{name},
        author=#{author},
        press=#{press},
        price=#{price}
        where bookId = #{bookId}
    </update>

    <!--查所有-->
    <select id="queryAllBook" resultType="book">
        select *
        from `ssm-library`.book
    </select>

    <!--根据id查一个-->
    <select id="queryBookById" resultType="book" parameterType="int">
        select *
        from `ssm-library`.book
        where bookId = #{bookId}
    </select>


    <!--根据name查一个-->
    <select id="queryBookByName" resultType="book" parameterType="String">
        select *
        from `ssm-library`.book
        where name = #{BookName}
    </select>

    <!--根据条件查询-->
    <select id="conditionQuery" resultType="Book" parameterType="Book">
        select * from `ssm-library`.book
        <where>
            <if test="name != null and name != ''">
                name = #{name}
            </if>
            <if test="author != null and author != ''">
                and author=#{author}
            </if>
            <if test="press != null and press != ''">
                and press=#{press}
            </if>
        </where>
    </select>

    <select id="ListQuery" resultType="Book">
        select * from `ssm-library`.book where NAME like '%#{value}%'
    </select>


    <!--    增减图书的数量-->
    <!--    如何选择合适的sql语句进行修改-->
    <!--删-->
    <delete id="addBookNum" parameterType="int">
        delete
        from `ssm-library`.book
        where NAME = #{BookName}
    </delete>


</mapper>

2. 业务层

public interface BookService {
    // 增
    int addBook(Book book);

    // 删
    int deleteBook(int bookId);

    // 改
    int updateBook(Book book);

    // 查所有
    List<Book> queryAllBook();

    // 根据id查一个
    Book queryBookById(int bookId);


    // 根据name查一个
    List<Book> queryBookByName(String BookName);


    //条件查询
    List<Book> conditionQuery(Book book);


    //模糊查询
    List<Book> ListQuery(String value);


    //the number of Book
    // 增
    int addBookNum(String BookName);

    // 删
    int deleteBookNum(String BookName);

    // 改
    int updateBookNum(String BookName);
}

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookMapper bookMapper;

    @Override
    public int addBook(Book book) {
        return bookMapper.addBook(book);
    }

    @Override
    public int deleteBook(int bookId) {
        return bookMapper.deleteBook(bookId);
    }

    @Override
    public int updateBook(Book book) {
        return bookMapper.updateBook(book);
    }

    @Override
    public List<Book> queryAllBook() {
        return bookMapper.queryAllBook();
    }

    @Override
    public Book queryBookById(int bookId) {
        return bookMapper.queryBookById(bookId);
    }


    @Override
    public List<Book> queryBookByName(String BookName) {
        return bookMapper.queryBookByName(BookName);
    }

    @Override
    public List<Book> conditionQuery(Book book) {
        return bookMapper.conditionQuery(book);
    }


    @Override
    public List<Book> ListQuery(String value) {
        return bookMapper.ListQuery(value);
    }

    @Override
    public int addBookNum(String BookName) {
        return bookMapper.addBookNum(BookName);
    }

    @Override
    public int deleteBookNum(String BookName) {
        return bookMapper.deleteBookNum(BookName);
    }

    @Override
    public int updateBookNum(String BookName) {
        return bookMapper.updateBookNum(BookName);
    }


}


3. 控制层

@Controller
public class AdminController {
    @Autowired
    private BookService bookServiceImpl;

    @Autowired
    private UserService userService;

    //查询所有user并分页显示
    @GetMapping("/users/list")
    public String queryAllUser(
            @RequestParam(value = "page", defaultValue = "1") Integer page,
            Model model) {
        //获取指定页数据,每页显示5条数据
        PageHelper.startPage(page, 5);
        //紧跟的第一个select方法被分页
        List<User> users = userService.getAllUser();
        System.out.println(users);
        model.addAttribute("users", users);
        //使用PageInfo包装数据 navigatePages表示导航标签的数量
        PageInfo pageInfo = new PageInfo(users, 5);
        model.addAttribute("pageInfo", pageInfo);
        return "admin/Usermanager";
    }
    @GetMapping("/admin/delete/{bookId}")
    public String deletebook(@PathVariable("bookId") int bookId) {
        int i = bookServiceImpl.deleteBook(bookId);
        return "redirect:/admin/list";
    }
    @RequestMapping("/register")
    public String register() {
        return "register";  // redirect 重定向/跳转
    }

    @GetMapping("/admin/toadd")
    public String toaddbook() {
        return "admin/add";  // redirect 重定向/跳转
    }


    @PostMapping("/admin/add")
    public String addbook(Book book) {
        int i = bookServiceImpl.addBook(book);
        return "redirect:/admin/list";  // redirect 重定向/跳转
    }

    @GetMapping("/queryBookById/{bookId}")
    public String querybookById(@PathVariable("bookId") int bookId, Model model) {
        Book book = bookServiceImpl.queryBookById(bookId);
        model.addAttribute("book", book);
        return "user/update";  //转发(默认为)
    }

    @PostMapping("/user/update")
    public String queryBookById(Book book) {
        System.out.println(book);
        int i = bookServiceImpl.updateBook(book);
        return "redirect:/user/list";
    }


    @GetMapping("/user/delete/{bookId}")
    public String deletebook(@PathVariable("bookId") int bookId) {
        int i = bookServiceImpl.deleteBook(bookId);
        return "redirect:/user/list";
    }

    @GetMapping("/conditionQuery")
    public String conditionQuery(Book book, Model model) {
        List<Book> books = bookServiceImpl.conditionQuery(book);
        model.addAttribute("books", books);
        return "user/list";
    }

}

4. 前端页面

在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/225fc78f04b545769186e3fc796bf5ab.png

    <div>
        <p> 个人账户余额: ${user.money} 用户名: ${user.username} </p>
        <a style="float: right;margin: 5px;" class="btn btn-primary"></a>
        <a style="float: right;margin: 5px;" class="btn btn-primary"
           href="${pageContext.request.contextPath}/logout">注销</a>
        <a href="/user/torecharge" class="btn btn-info">充值界面</a>

        <a href="/single_user/list" class="btn btn-info">个人藏书室</a>
    </div>
    <div>
        <form style="float: left;margin: 5px;" class="form-inline"
              action="${pageContext.request.contextPath}/conditionQuery" method="get">
            <div class="form-group">
                <label for="name">图书名</label>
                <input type="text" name="name" class="form-control" id="name">
            </div>
            <div class="form-group">
                <label for="author">图书作者</label>
                <input type="text" name="author" class="form-control" id="author">
            </div>
            <div class="form-group">
                <label for="press">图书出版社</label>
                <input type="text" name="press" class="form-control" id="press">
            </div>

            <button type="submit" class="btn btn-info">查询</button>
        </form>
    </div>




    <table class="table table-striped">
        <tr>
            <th>序号</th>
            <th>图书名</th>
            <th>图书作者</th>
            <th>图书出版社</th>
            <th>图书单价</th>
            <th>&nbsp;&nbsp;&nbsp;&nbsp;操作</th>
        </tr>
        <c:forEach items="${books}" var="book" varStatus="s">
            <tr>
                <td>${s.count}</td>
                <td>${book.name}</td>
                <td>${book.author}</td>
                <td>${book.press}</td>
                <td>${book.price}</td>
                <td>${book.bootNum}</td>
                <td>
                        <%--                    这个方法需要修改--%>
                    <a href="${pageContext.request.contextPath}/single_user/purchase/${book.name}"
                       class="btn btn-success">付费购买(下载)</a>
                    <a href="${pageContext.request.contextPath}/single_user/queryBookByName/${book.name}"
                       class="btn btn-success" style="color: royalblue">试读借阅</a>
                        <%--                    <a href="${pageContext.request.contextPath}/queryBookById/${book.bookId}" class="btn btn-success">归还</a>--%>
                </td>
            </tr>
        </c:forEach>

    </table>
    <%--分页导航标签--%>
    <div class="row">
        <div class="col-md-6">
            第${pageInfo.pageNum}页,共${pageInfo.pages}页,共${pageInfo.total}条记录
        </div>
        <div class="col-md-6 offset-md-4">
            <nav aria-label="Page navigation example">
                <ul class="pagination pagination-sm">
                    <li class="page-item"><a class="page-link"
                                             href="${pageContext.request.contextPath}/user/list?page=1">首页</a></li>
                    <c:if test="${pageInfo.hasPreviousPage}">
                        <li class="page-item"><a class="page-link"
                                                 href="${pageContext.request.contextPath}/user/list?page=${pageInfo.pageNum-1}">上一页</a>
                        </li>
                    </c:if>
                    <c:forEach items="${pageInfo.navigatepageNums}" var="page">
                        <c:if test="${page==pageInfo.pageNum}">
                            <li class="page-item active"><a class="page-link" href="#">${page}</a></li>
                        </c:if>
                        <c:if test="${page!=pageInfo.pageNum}">
                            <li class="page-item"><a class="page-link"
                                                     href="${pageContext.request.contextPath}/user/list?page=${page}">${page}</a>
                            </li>
                        </c:if>
                    </c:forEach>
                    <c:if test="${pageInfo.hasNextPage}">
                        <li class="page-item"><a class="page-link"
                                                 href="${pageContext.request.contextPath}/user/list?page=${pageInfo.pageNum+1}">下一页</a>
                        </li>
                    </c:if>
                    <li class="page-item"><a class="page-link"
                                             href="${pageContext.request.contextPath}/user/list?page=${pageInfo.pages}">末页</a>
                    </li>
                </ul>
            </nav>
        </div>
    </div>

第四节 前端展示

第五节 用户系统

第六节 租借记录

外星人商城项目总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、项目简介 本项目是一套基于SpringBoot的图书管理系统,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本、软件工具、项目说明等,该项目可以直接作为毕设使用。 项目都经过严格调试,确保可以运行! 二、技术实现 ​后台框架:SpringBoot ​数据库:MySQL 开发环境:JDK、IDEA、Tomcat 三、系统功能 本图书管理系统主要包含两种角色:读者和管理员。读者只能对个人信息的查阅、修改,图书的查询,而管理员则可以进行图书信息及借阅信息的管理。 具体实现功能如下: (1)系统登录。分为普通读者登录和管理员登录。 (2)系统管理。系统管理包括管理员设置,以及图书类别设置。管理员设置包括管理员信息的设置以及密码的设置。图书类别的设置只有管理员才可以对他进行新增,修改和删除。 (3)图书管理。包括图书信息管理,图书信息查询。只有管理员才可以对图书进行管理,图书查询是帮助读者方便查找图书信息。 (4)读者管理。读者管理包括读者信息管理,以及读者信息的查询。读者信息查询可以根据读者的姓名和编号进行查询。读者信息管理只对管理员有用,只有管理员可以添加读者,修改和删除读者的信息。 (5)图书借阅管理。图书借阅包括图书的借阅,归还以及续借。图书的借阅以及归还只对管理员起作用,只有通过管理员才可以进行图书的借阅以及归还。读者只能对图书进行续借的操作。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值