数据人与超自然意识 发表于 2024-7-28 01:26:50

简单使用SpringMVC写一个图书管理系统的登入功能和图书展示功能

准备好前端的代码

这里已经准备好了前端的代码,这里仅仅简单的先容登入功能,和展示图书列表的功能。
如图:
https://i-blog.csdnimg.cn/direct/5247cc26ac8e43f8a9302d35ceb7c980.png
如上图所示,这里的前端代码还是比力多的,在这里我先容,login.html另有book_list.html这两个。
login.html
如代码:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <link rel="stylesheet" href="css/login.css">
    <script type="text/javascript" src="js/jquery.min.js"></script>
</head>

<body>
<div class="container-login">
    <div class="container-pic">
      <img src="pic/computer.png" width="350px">
    </div>
    <div class="login-dialog">
      <h3>登陆</h3>
      <div class="row">
            <span>用户名</span>
            <input type="text" name="userName" id="userName" class="form-control">
      </div>
      <div class="row">
            <span>密码</span>
            <input type="password" name="password" id="password" class="form-control">
      </div>
      <div class="row">
            <button type="button" class="btn btn-info btn-lg" onclick="login()">登录</button>
      </div>
    </div>
</div>
<script src="js/jquery.min.js"></script>
<script>
    function login() {
      //前端参数校验省略
      $.ajax({
            url:"/user/login",
            type: "post",
            data: {
                userName: $("#userName").val(),
                password: $("#password").val()
            },
            success: function(result){
                if(result==""){
                  //登录成功
                  location.href = "book_list.html";
                }else{
                  alert(result);
                }
            }
      });
      // location.href = "book_list.html";
    }
</script>
</body>

</html> 上述代码的核心在这一块,如图:
https://i-blog.csdnimg.cn/direct/ae0e22a2cc8f4cc5a1cb4dfc18efa8c7.png
这里的代码是和后端做交互的,后端的url为/user/login ,哀求的类型为post哀求,然后转达数据,后端再返回效果,如果登入成功就跳转到,“book_list.html”的界面,展示图书。
book_list.html
如代码:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>图书列表展示</title>
    <link rel="stylesheet" href="css/bootstrap.min.css">

    <link rel="stylesheet" href="css/list.css">
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <script type="text/javascript" src="js/bootstrap.min.js"></script>
    <script src="js/jq-paginator.js"></script>

</head>

<body>
<div class="bookContainer">
    <h2>图书列表展示</h2>
    <div class="navbar-justify-between">
      <div>
            <button class="btn btn-outline-info" type="button" onclick="location.href='book_add.html'">添加图书</button>
            <button class="btn btn-outline-info" type="button" onclick="batchDelete()">批量删除</button>
      </div>
    </div>

    <table>
      <thead>
      <tr>
            <td>选择</td>
            <td class="width100">图书ID</td>
            <td>书名</td>
            <td>作者</td>
            <td>数量</td>
            <td>定价</td>
            <td>出版社</td>
            <td>状态</td>
            <td class="width200">操作</td>
      </tr>
      </thead>
      <tbody>
      <!-- <tr>
            <td><input type="checkbox" name="selectBook" value="1" id="selectBook" class="book-select"></td>
            <td>1</td>
            <td>大秦帝国第一册</td>
            <td>我是作者</td>
            <td>23</td>
            <td>33.00</td>
            <td>北京出版社</td>
            <td>可借阅</td>
            <td>
                <div class="op">
                  <a href="book_update.html?bookId=1">修改</a>
                  <a href="javascript:void(0)" onclick="deleteBook(1)">删除</a>
                </div>
            </td>
      </tr> -->


      </tbody>
    </table>

    <div class="demo">
      <ul id="pageContainer" class="pagination justify-content-center"></ul>
    </div>
    <script>

      getBookList();
      function getBookList() {
            $.ajax({
                type: "get",
                url: "/book/getList",
                success: function(books){
                  if(books==null){
                        return;
                  }
                  var finalHtml = "";
                  for(var book of books){
                        //拼接HTML
                        finalHtml +='<tr>';
                        finalHtml +='<td><input type="checkbox" name="selectBook" value="'+book.bookId+'" id="selectBook" class="book-select"></td>';
                        finalHtml +='<td>'+book.bookId+'</td>';
                        finalHtml +='<td>'+book.bookName+'</td>';
                        finalHtml +='<td>'+book.author+'</td>';
                        finalHtml +='<td>'+book.num+'</td>';
                        finalHtml +='<td>'+book.price+'</td>';
                        finalHtml +='<td>'+book.publishName+'</td>';
                        finalHtml +='<td>'+book.stateCN+'</td>';
                        finalHtml +='<td>';
                        finalHtml +='<div class="op">';
                        finalHtml +='<a href="book_update.html?bookId='+book.bookId+'">修改</a>';
                        finalHtml +='<a href="javascript:void(0)" onclick="deleteBook('+book.bookId+')">删除</a>';
                        finalHtml +='</div>';
                        finalHtml +='</td></tr>';
                  }
                  $("tbody").html(finalHtml);
                }
            });
      }

      //翻页信息
      $("#pageContainer").jqPaginator({
            totalCounts: 100, //总记录数
            pageSize: 10,    //每页的个数
            visiblePages: 5, //可视页数
            currentPage: 1,//当前页码
            first: '<li class="page-item"><a class="page-link">首页</a></li>',
            prev: '<li class="page-item"><a class="page-link" href="javascript:void(0);">上一页<\/a><\/li>',
            next: '<li class="page-item"><a class="page-link" href="javascript:void(0);">下一页<\/a><\/li>',
            last: '<li class="page-item"><a class="page-link" href="javascript:void(0);">最后一页<\/a><\/li>',
            page: '<li class="page-item"><a class="page-link" href="javascript:void(0);">{{page}}<\/a><\/li>',
            //页面初始化和页码点击时都会执行
            onPageChange: function (page, type) {
                console.log("第"+page+"页, 类型:"+type);
            }
      });
      function deleteBook(id) {
            var isDelete = confirm("确认删除?");
            if (isDelete) {
                //删除图书
                alert("删除成功");
            }
      }
      function batchDelete() {
            var isDelete = confirm("确认批量删除?");
            if (isDelete) {
                //获取复选框的id
                var ids = [];
                $("input:checkbox:checked").each(function () {
                  ids.push($(this).val());
                });
                console.log(ids);
                alert("批量删除成功");
            }
      }

    </script>
</div>
</body>

</html> 上述代码,不做先容了,我是主要写后端的代码的,关于这篇文章,仅仅展示图书即可,没涉及到增删改查。
后端代码

第一步:我们就先准备好图书的实体类
如代码:
package com.bite.springbook.model;

import lombok.Data;

import java.math.BigDecimal;
@Data
public class BookInfo {
    private Integer bookId;
    private String bookName;
    private String author;
    private Integer num;
    private BigDecimal price;
    private String publishName;
    private Integer state; //1- 可借阅   2- 不可借阅
    private String stateCN;
}
这里我们必要学习,@Data这个注解的作用,这个注解是lombok这个工具内里的,这里他会主动封装好get和set方法,还会重写toStirng方法。
以上就是实体的属性。
第二步:这里我们先写登入功能
如代码:
package com.bite.springbook.controller;

import jakarta.servlet.http.HttpSession;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/user")
@RestController
public class UserController {
    @RequestMapping("/login")
    public String login(String userName , String password , HttpSession session){
      if(!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)){
            return "用户不能为空";
      }
      if(!"zhangsan".equals(userName) || !"123456".equals(password)){
            return "用户或密码错误";
      }
      session.setAttribute("username" , userName);
      return "";
    }
}
如上述所述,这里我们用StringUntils的haslength方法,判定输入是否为空,这样可以节省代码量,然后判定用户是否输入错误,其次存储session信息,最后返回效果,和前端校验。
登入代码这些就结束了。
第三步:誊写图书的展示功能
1)controller层
如代码:
package com.bite.springbook.controller;


import com.bite.springbook.model.BookInfo;
import com.bite.springbook.Service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RequestMapping("/book")
@RestController
public class BookController {

    @Autowired
    private BookService bookService;

    @RequestMapping("/getList")
    public List<BookInfo> getList(){
      List<BookInfo> bookInfos = bookService.getList();
      return bookInfos;
    }


}
这里我们主要是和前端响应数据用的,controller层调用service层,service层是用于处理业务数据的,这里我们用到了,依赖注入的属性注入来获取service层的对象,如代码中的@Autowired注解。
2)service层
如代码:
package com.bite.springbook.Service;

import com.bite.springbook.dao.BookDao;
import com.bite.springbook.model.BookInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class BookService {
    @Autowired
    private BookDao bookDao;
    public List<BookInfo> getList(){
      List<BookInfo> bookInfos = bookDao.mockData();
      for(BookInfo bookInfo : bookInfos){
            if (bookInfo.getState()==1){
                bookInfo.setStateCN("可借阅");
            }else {
                bookInfo.setStateCN("不可借阅");
            }
      }
      return bookInfos;
    }
}
如图这里通过调用dao层的数据,来举行处理,也用到了对属性注入依赖,在这里我们用到了@Service注解,为了把对象交给Spring管理,通过依赖注入就可以取到对象。
3)dao层
如代码:
package com.bite.springbook.dao;

import com.bite.springbook.model.BookInfo;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Repository
public class BookDao {
    public List<BookInfo> mockData() {
      List<BookInfo> bookInfos = new ArrayList<>();
      for (int i = 0; i < 15; i++) {
            BookInfo bookInfo = new BookInfo();
            bookInfo.setBookId(i);
            bookInfo.setBookName("图书"+i);
            bookInfo.setAuthor("作者"+i);
            bookInfo.setNum(15*i+1);
            bookInfo.setPrice(new BigDecimal(22*i+5-0.5*i));
            bookInfo.setPublishName("出版社"+i);
            bookInfo.setState(i%5==0?2:1);
            bookInfos.add(bookInfo);
      }
      return bookInfos;
    }
}
如图上述是主动生成的数据,到后面我会运用mybatis写一个完整的图书系统。这里的@Repository注解和service层的@Service作用一样。
如图运行效果:
https://i-blog.csdnimg.cn/direct/b76739f83593492fba4b6e996403b171.png
https://i-blog.csdnimg.cn/direct/d836cef315074ff28854b88e976a4f0a.png
等到后面,我会写一个完整的图书管理系统。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 简单使用SpringMVC写一个图书管理系统的登入功能和图书展示功能