当前位置:   article > 正文

spring MVC 简单案例(3)我的书架管理系统

spring MVC 简单案例(3)我的书架管理系统

一、创建项目

最后修改以下 spring 版本 为 2.7.17

Java 版本为 8

同时在 

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.7.17</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.ameris</groupId>
  12. <artifactId>spring-book</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>spring-book</name>
  15. <description>spring-book</description>
  16. <url/>
  17. <licenses>
  18. <license/>
  19. </licenses>
  20. <developers>
  21. <developer/>
  22. </developers>
  23. <scm>
  24. <connection/>
  25. <developerConnection/>
  26. <tag/>
  27. <url/>
  28. </scm>
  29. <properties>
  30. <java.version>8</java.version>
  31. </properties>
  32. <dependencies>
  33. <dependency>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-starter-web</artifactId>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.projectlombok</groupId>
  39. <artifactId>lombok</artifactId>
  40. <optional>true</optional>
  41. </dependency>
  42. <dependency>
  43. <groupId>org.springframework.boot</groupId>
  44. <artifactId>spring-boot-starter-test</artifactId>
  45. <scope>test</scope>
  46. </dependency>
  47. </dependencies>
  48. <build>
  49. <plugins>
  50. <plugin>
  51. <groupId>org.springframework.boot</groupId>
  52. <artifactId>spring-boot-maven-plugin</artifactId>
  53. <configuration>
  54. <excludes>
  55. <exclude>
  56. <groupId>org.projectlombok</groupId>
  57. <artifactId>lombok</artifactId>
  58. </exclude>
  59. </excludes>
  60. </configuration>
  61. </plugin>
  62. </plugins>
  63. </build>
  64. </project>

二、前端代码

三、接口定义

客户端

1.我需要什么服务

2.我能提供什么参数,是否有这个参数

3.对方提供给我的信息,是否满足我的需求

服务器

1.提供什么服务

2.需要什么参数

3.处理之后,需要给客户端响应什么数据

3.1 登录

URL:/user/login

参数:

userName 用户名

password 密码

返回:

true:用户名和密码正确

false:用户名或密码错误

3.2 书籍列表

URL:/book/getList

参数:

返回:图书列表

List<BookInfo>

四、创建类

4.1 图书信息 BookInfo

id,书名,作者,数量,定价,出版社,状态

4.2 图书控制器 BookController

4.3 用户控制器 UserController

五、编写后端代码

5.1 userController

  1. package com.ameris.springbook;
  2. import org.springframework.util.StringUtils;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. import javax.servlet.http.HttpSession;
  6. @RestController
  7. @RequestMapping("/user")
  8. public class UserController {
  9. @RequestMapping("/login")
  10. public boolean login(String userName, String password, HttpSession session){
  11. //校验参数
  12. if(!StringUtils.hasLength(userName)||
  13. "".equals(userName)||
  14. !StringUtils.hasLength(password)||
  15. "".equals(password)
  16. ){
  17. return false;
  18. }
  19. //校验用户名密码是否正确
  20. if("admin".equals(userName) && "admin".equals(password)){
  21. //存session
  22. session.setAttribute("userName",userName);
  23. return true;
  24. }
  25. return false;
  26. }
  27. }

5.2 BookController

  1. package com.ameris.springbook;
  2. import org.springframework.web.bind.annotation.RequestMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. import java.math.BigDecimal;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import java.util.Random;
  8. @RestController
  9. @RequestMapping("/book")
  10. public class BookController {
  11. @RequestMapping("/getList")
  12. public List<BookInfo> getList(){
  13. //1.从数据库获取 list
  14. //采用Mock的方式(构造虚假的数据进行测试)
  15. List<BookInfo> bookInfos = mockBookData();
  16. //2.对数据进行处理(例如:对书记借阅状态进行转换)
  17. for (BookInfo bookinfo:
  18. bookInfos) {
  19. if (bookinfo.getState() == 1){
  20. bookinfo.setStateCN("可借阅");
  21. } else if (bookinfo.getState() == 2) {
  22. bookinfo.setStateCN("不可借阅");
  23. }
  24. }
  25. //3.返回数据
  26. return bookInfos;
  27. }
  28. /**
  29. * 构造假的数据 进行测试
  30. * @return
  31. */
  32. public List<BookInfo> mockBookData(){
  33. List<BookInfo> bookInfos = new ArrayList<>();
  34. for (int i = 1; i <= 15; i++) {
  35. BookInfo bookInfo = new BookInfo();
  36. bookInfo.setId(i);
  37. bookInfo.setBookName("图书"+i);
  38. bookInfo.setAuthor("作者"+i);
  39. bookInfo.setCount(i*15+3);
  40. bookInfo.setPrice(new BigDecimal(new Random().nextInt(100)));
  41. bookInfo.setPublish("出版社"+1);
  42. bookInfo.setState(i%5==0?2:1);
  43. bookInfos.add(bookInfo);//放入list
  44. }
  45. return bookInfos;
  46. }
  47. }

 

六、测试后端接口

七、完成前端代码

7.1 login.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. <link rel="stylesheet" href="css/bootstrap.min.css">
  8. <link rel="stylesheet" href="css/login.css">
  9. <script type="text/javascript" src="js/jquery.min.js"></script>
  10. </head>
  11. <body>
  12. <div class="container-login">
  13. <div class="container-pic">
  14. <img src="pic/computer.png" width="350px">
  15. </div>
  16. <div class="login-dialog">
  17. <h3>登陆</h3>
  18. <div class="row">
  19. <span>用户名</span>
  20. <input type="text" name="userName" id="userName" class="form-control">
  21. </div>
  22. <div class="row">
  23. <span>密码</span>
  24. <input type="password" name="password" id="password" class="form-control">
  25. </div>
  26. <div class="row">
  27. <button type="button" class="btn btn-info btn-lg" onclick="login()">登录</button>
  28. </div>
  29. </div>
  30. </div>
  31. <script src="js/jquery.min.js"></script>
  32. <script>
  33. function login() {
  34. $.ajax({
  35. type: "post",
  36. url: "/user/login",
  37. data: {
  38. userName: $("#userName").val(),
  39. password: $("#password").val()
  40. },
  41. success: function (result) {
  42. if (result == true) {
  43. //验证成功,跳转页面到图书列表页
  44. location.href = "book_list.html";
  45. } else {
  46. alert("用户名或密码错误!");
  47. }
  48. }
  49. });
  50. }
  51. </script>
  52. </body>
  53. </html>

7.2 book_list.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>图书列表展示</title>
  7. <link rel="stylesheet" href="css/bootstrap.min.css">
  8. <link rel="stylesheet" href="css/list.css">
  9. <script type="text/javascript" src="js/jquery.min.js"></script>
  10. <script type="text/javascript" src="js/bootstrap.min.js"></script>
  11. <script src="js/jq-paginator.js"></script>
  12. </head>
  13. <body>
  14. <div class="bookContainer">
  15. <h2>图书列表展示</h2>
  16. <div class="navbar-justify-between">
  17. <div>
  18. <button class="btn btn-outline-info" type="button" onclick="location.href='book_add.html'">添加图书</button>
  19. <button class="btn btn-outline-info" type="button" onclick="batchDelete()">批量删除</button>
  20. </div>
  21. </div>
  22. <table>
  23. <thead>
  24. <tr>
  25. <td>选择</td>
  26. <td class="width100">图书ID</td>
  27. <td>书名</td>
  28. <td>作者</td>
  29. <td>数量</td>
  30. <td>定价</td>
  31. <td>出版社</td>
  32. <td>状态</td>
  33. <td class="width200">操作</td>
  34. </tr>
  35. </thead>
  36. <tbody>
  37. <tr>
  38. <td><input type="checkbox" name="selectBook" value="1" id="selectBook" class="book-select"></td>
  39. <td>1</td>
  40. <td>大秦帝国第一册</td>
  41. <td>我是作者</td>
  42. <td>23</td>
  43. <td>33.00</td>
  44. <td>北京出版社</td>
  45. <td>可借阅</td>
  46. <td>
  47. <div class="op">
  48. <a href="book_update.html?bookId=1">修改</a>
  49. <a href="javascript:void(0)" onclick="deleteBook(1)">删除</a>
  50. </div>
  51. </td>
  52. </tr>
  53. </tbody>
  54. </table>
  55. <div class="demo">
  56. <ul id="pageContainer" class="pagination justify-content-center"></ul>
  57. </div>
  58. <script>
  59. //已进入列表网页,就开始加载书籍列表
  60. getBookList();
  61. function getBookList() {
  62. //发起ajax请求
  63. $.ajax({
  64. type: "get",
  65. url: "/book/getList",
  66. success: function (bookinfos) {
  67. console.log(bookinfos);
  68. var finalHtml = "";//创建一个标签
  69. for (var book of bookinfos) {
  70. //拼接html
  71. //将book的数据拼接到 finalhtml里
  72. finalHtml += '<tr>';
  73. finalHtml += '<td><input type="checkbox" name="selectBook" value="' + book.id + '" id="selectBook" class="book-select"></td>';
  74. finalHtml += '<td>' + book.id + '</td>';
  75. finalHtml += '<td>' + book.bookName + '</td>';
  76. finalHtml += '<td>' + book.author + '</td>';
  77. finalHtml += '<td>' + book.count + '</td>';
  78. finalHtml += '<td>' + book.price + '</td>';
  79. finalHtml += '<td>' + book.publish + '</td>';
  80. finalHtml += '<td>' + book.stateCN + '</td>';
  81. finalHtml += '<td>';
  82. finalHtml += '<div class="op">';
  83. finalHtml += '<a href="book_update.html?bookId=' + book.id + '">修改</a>';
  84. finalHtml += '<a href="javascript:void(0)" onclick="deleteBook(' + book.id + ')">删除</a>';
  85. finalHtml += '</div>';
  86. finalHtml += '</td>';
  87. finalHtml += '</tr>';
  88. //将这个finalhtml加紧 <tbody>里
  89. $("tbody").html(finalHtml);
  90. }
  91. }
  92. })
  93. }
  94. //翻页信息
  95. $("#pageContainer").jqPaginator({
  96. totalCounts: 100, //总记录数
  97. pageSize: 10, //每页的个数
  98. visiblePages: 5, //可视页数
  99. currentPage: 1, //当前页码
  100. first: '<li class="page-item"><a class="page-link">首页</a></li>',
  101. prev: '<li class="page-item"><a class="page-link" href="javascript:void(0);">上一页<\/a><\/li>',
  102. next: '<li class="page-item"><a class="page-link" href="javascript:void(0);">下一页<\/a><\/li>',
  103. last: '<li class="page-item"><a class="page-link" href="javascript:void(0);">最后一页<\/a><\/li>',
  104. page: '<li class="page-item"><a class="page-link" href="javascript:void(0);">{{page}}<\/a><\/li>',
  105. //页面初始化和页码点击时都会执行
  106. onPageChange: function (page, type) {
  107. console.log("第" + page + "页, 类型:" + type);
  108. }
  109. });
  110. function deleteBook(id) {
  111. var isDelete = confirm("确认删除?");
  112. if (isDelete) {
  113. //删除图书
  114. alert("删除成功");
  115. }
  116. }
  117. function batchDelete() {
  118. var isDelete = confirm("确认批量删除?");
  119. if (isDelete) {
  120. //获取复选框的id
  121. var ids = [];
  122. $("input:checkbox[name='selectBook']:checked").each(function () {
  123. ids.push($(this).val());
  124. });
  125. console.log(ids);
  126. alert("批量删除成功");
  127. }
  128. }
  129. </script>
  130. </div>
  131. </body>
  132. </html>

 

八、调试 

 如果遇到问题,打断点调试,shif+f9

然后发送请求,代码将会执行到断点的位置停下。

选中要分析的代码,右键 点击 evaluate,就可以分析了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/890662
推荐阅读
相关标签
  

闽ICP备14008679号