4、SpringMVC 实战小项目【加法计算器、用户登录、留言板、图书管理系统】

4、SpringMVC 实战小项目【加法计算器、用户登录、留言板、图书管理系统】 SpringMVC 实战小项目 3.1 加法计算器3.1.1 准备⼯作前端 3.1.2 约定前后端交互接⼝需求分析接⼝定义请求参数:响应数据: 3.1.3 服

SpringMVC 实战小项目

3.1 加法计算器3.1.1 准备前端

3.1.2 同意前后端交互接口要求分析接口定义请求参数: 响应数据:

3.1.3 服务器代码

3.2 用户登录3.2.1 准备工作3.2.2 前后端交互接口约定3.2.3 服务端代码实现

3.3 留言板实现服务器端代码

3.4 图书馆管理系统后台准备

3.1 加法计算器

要求: 输入两个整数,然后单击“添加”按钮以显示计算结果。

3.1.1 准备作

创建SpringBoot项目:引入Spring Web依赖,并在项目中放置一个前端页面(课件中提供)。

前端

!DOCTYPE html

html lang=\’en\’

元字符集=\’UTF-8\’

元名称=\’视口\’内容=\’宽度=设备宽度,初始比例=1.0\’

标题文件/标题

/头

身体

表单操作=\’计算/求和\’方法=\’发布\’

h1计算器/h1

数字1:输入name=\’num1\’ type=\’text\’br

数字2:输入name=\’num2\’ type=\’text\’br

input type=\’提交\’ value=\’点击添加\’

/形状

/身体

/html

3.1.2 约定前后端交互接

需求分析

add计算函数将两个整数相加;客户端必须指定两个数字才能参与计算,服务器返回这两个整数的计算结果。

接定义

请求路径:计算/求和

请求方式:GET/POST

接口说明: 计算两个整数的相加。

请求参数:

示例: num1=5num2=3

响应数据:

内容类型: 文本/html

回复内容: 计算机计算结果: 8

3.1.3 服务器代码

@RestController

@RequestMapping(\’/calc\’)

公共类CalcController {

@RequestMapping(\’/sum\’)

公共字符串总和(整数num1,整数num2){

整数之和=num1+num2;

return \’h1计算机计算结果: \’+sum+\’/h1\’;

}

}

3.2 登录

需求: 当用户输入帐号和密码时,后端验证密码是否正确。

如果没有,前端将通知用户,当用户稍后访问主页时,他们将看到当前登录的用户。用户信息。

3.2.1 准备作

将前端页面放入您的项目中(随课件提供)

码云地址: 前端代码/用户登录

!DOCTYPE html

html lang=\’en\’

元字符集=\’UTF-8\’

标题登录页面/标题

/头

身体

h1 用户登录/h1

用户名:输入name=\’userName\’ type=\’text\’ id=\’userName\’br

密码:输入name=\’password\’ type=\’password\’ id=\’password\’br

输入类型=\’按钮\’值=\’登录\’onclick=\’登录()\’

脚本src=\’https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js\’/script

脚本

函数登录(){

$.ajax({

type: \’帖子\’,

url: \’/登录/检查\’,

数据:{

userName: $(\’#userName\’).val(),

密码: $(\’#password\’).val()

},

success: 函数(结果){

如果(结果==真){

//用户名和密码正确

location.href=\’index.html\’;

//location.assign(\’index.html\’);

//location.replace(\’index.html\’)

}除此之外{

alert(\’您的用户名或密码不正确!\’);

}

}

});

}

/剧本

/身体

/html

3.2.2 约定前后端交互接

需求分析

后端开发人员不需要显示前端页面;他们只需要提供两个功能。

登录页面:根据账号和密码验证输入的账号密码是否正确,如果当前有登录用户则通知前端主页:返回登录帐户,否则为空。

定义接口

验证接口

请求路径:/用户/登录

请求方式:POST

界面说明:检查您的账户密码是否正确

3.2.3 实现服务器端代码

@RequestMapping(\’/登录\’)

@RestController

公共类登录控制器{

@RequestMapping(\’/检查\’)

公共布尔检查(字符串用户名,字符串密码,HttpSession会话){

System.out.println(\’收到参数userName:\’+userName + \’,password:\’+password);

//检查帐号和密码是否为空

//if (userName==null || \’\’.equals(userName) || 密码==null || \’\’.equals(password)){

//返回假。

//}

if (!StringUtils.hasLength(用户名) || !StringUtils.hasLength(密码)){

返回假。

}

//检查账号和密码是否正确

//数据模拟

if (\’zhangsan\’.equals(用户名) \’123456\’.equals(密码)){

session.setAttribute(\’用户名\’,用户名);

返回真。

}

返回假。

}

@RequestMapping(\’/index\’)

公共字符串索引(HttpSession会话){

String userName=(String)session.getAttribute(\’userName\’);

返回用户名。

}

}

3.3 留板

需求:

界面如下

输入您的消息信息并单击发送。数据由后端存储。输入的白墙信息将显示在页面上。

元字符集=\’UTF-8\’

元名称=\’视口\’内容=\’宽度=设备宽度,初始比例=1.0\’

标题公告板/标题

风格

。容器{

宽度: 350 像素;

高度: 300 像素;

margin: 0 自动。

/* border: 1px 黑色*/

文本对齐:居中;

}

。灰色的{

颜色:灰色;

}

.container .row {

宽度: 350 像素;

高度: 40 像素;

显示器: Flex。

justify-content: 之间有空格;

对齐items:中心;

}

.container .row 输入{

宽度: 260 像素;

高度: 30 像素;

}

提交{

宽度: 350 像素;

高度: 40 像素;

背景颜色: 橙色;

颜色: 白色;

border: 无。

边距: 10px;

边框半径: 5px;

字体大小: 20px;

}

/风格

/头

身体

div 类=\’容器\’

h1 公告板/h1

如果您输入p class=\’grey\’ 并单击提交,信息将出现在/p 下面的空白处。

div 类=\’行\’

spanwho:/span 输入类型=\’文本\’名称=\’\’id=\’来自\’

/div

div 类=\’行\’

:/span 输入type=\’text\’ name=\’\’ id=\’to\’

/div

div 类=\’行\’

哪个span是:/span input type=\’text\’ name=\’\’ id=\’say\’

/div

input type=\’button\’ value=\’Submit\’ id=\’submit\’ onclick=\’submit()\’

!– divA 向B 发送: hello/div —

/div

脚本src=\’https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js\’/script

脚本

//页面加载时显示消息信息

//从后端获取消息信息并显示在页面上

$.ajax({

输入: \’获取\’,

url: \’/message/getList\’,

success:函数(消息){

for(消息变量消息){

var html=\’div\’+message.from+\’ 表示: \’+message.message+\’/div\’ 表示\’+message.to+\’;

$(\’.container\’).append(html);

}

}

});

函数提交() {

//1.获取消息内容。

var from=$(\’#from\’).val();

var to=$(\’#to\’).val();

var Say=$(\’#say\’).val();

if (从==\’\’ || 到==\’\’ || 说==\’\’) {

返回;

}

$.ajax({

type: \’帖子\’,

url: \’/消息/发布\’,

数据: {

从:开始,

至:至,

message: 说

},

success: 函数(结果){

如果(结果==真){

//添加成功

//2.构建节点

var divE=\’div\’ + from + \’right\’ + to + \’say :\’ +say + \’/div\’;

//3.向页面添加节点。

$(\’.container\’).append(divE);

//4.清除输入框值。

$(\’#from\’).val(\’\’);

$(\’#to\’).val(\’\’);

$(\’#say\’).val(\’\’);

}除此之外{

alert(\’发布失败\’);

}

}

});

}

/剧本

/身体

/html

实现服务器端代码

@数据

公共类消息信息{

私有整数ID;

来自私有字符串;

到私有字符串;

私人字符串消息。

私有整数删除标志;

私人日期创建时间;

私人日期更新时间;

}

@RequestMapping(\’/消息\’)

@RestController

公共类消息控制器{

@Autowired

私有MessageService消息服务;

私有ListMessageInfo messageInfos=new ArrayList();

@RequestMapping(\’/发布\’)

公共布尔公共消息(MessageInfo messageInfo){

if (!StringUtils.hasLength(messageInfo.getFrom())

|| !StringUtils.hasLength(messageInfo.getTo())

|| !StringUtils.hasLength(messageInfo.getMessage()){

返回假。

}

//暂时保存在内存中

//messageInfos.add(messageInfo);

//将数据存入mysql

messageService.insertMessage(messageInfo);

返回真。

}

@RequestMapping(\’/getList\’)

公共ListMessageInfo getList(){

返回messageService.queryList()。

}

}

3.4 图书管理系统

需求:

登录: 用户通过输入帐号和密码完成登录功能。 列表显示: 书籍显示

准备

!DOCTYPE html

html lang=\’en\’

元字符集=\’UTF-8\’

元名称=\’视口\’内容=\’宽度=设备宽度,初始比例=1.0\’

标题文件/标题

链接rel=\’stylesheet\’ href=\’css/bootstrap.min.css\’

链接rel=\’stylesheet\’ href=\’css/login.css\’

脚本类型=\’text/javascript\’ src=\’js/jquery.min.js\’/script

/头

身体

div class=\’容器登录\’

div class=\’容器照片\’

img src=\’pic/computer.png\’ width=\’350px\’

/div

div class=\’登录对话框\’

h3 登录/h3

div 类=\’行\’

跨度用户名/跨度

输入类型=\’文本\’名称=\’用户名\’id=\’用户名\’类=\’表单控件\’

/div

div 类=\’行\’

跨度密码/跨度

输入类型=\’密码\’名称=\’密码\’id=\’密码\’类=\’表单控制\’

/div

div 类=\’行\’

按钮type=\’button\’ class=\’btn btn-info btn-lg\’ onclick=\’login()\’ 登录/按钮

/div

/div

/div

脚本src=\’js/jquery.min.js\’/script

脚本

函数登录(){

$.ajax({

输入:\’帖子\’,

url: \’/用户/登录\’,

数据:{

userName: $(\”#userName\”).val(),
password: $(\”#password\”).val()
},
success:function(result){
console.log(result);
if(result.code==200 && result.data==true){
//验证成功
location.href = \”book_list.html\”;
}else{
alert(\”用户名或密码失败\”);
}
}
});

}
</script>
</body>
</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>
</tbody>
</table>
<div class=\”demo\”>
<ul id=\”pageContainer\” class=\”pagination justify-content-center\”></ul>
</div>
<script>
getBookList();
function getBookList() {
$.ajax({
type: \”get\”,
url: \”/book/getListByPage\” + location.search,
success: function (result) {
console.log(\”后端返回成功\”);
if (result.code == -1) {
alert(\”发生内部错误, 请联系管理员\”);
return;
}
var data = result.data;
var books = data.records;
console.log(books);
var finalHtml = \”\”;
for (var book of books) {
//拼接html
finalHtml += \'<tr>\’;
finalHtml += \'<td><input type=\”checkbox\” name=\”selectBook\” value=\”\’ + book.id + \’\” id=\”selectBook\” class=\”book-select\”></td>\’;
finalHtml += \'<td>\’ + book.id + \'</td>\’;
finalHtml += \'<td>\’ + book.bookName + \'</td>\’;
finalHtml += \'<td>\’ + book.author + \'</td>\’;
finalHtml += \'<td>\’ + book.count + \'</td>\’;
finalHtml += \'<td>\’ + book.price + \'</td>\’;
finalHtml += \'<td>\’ + book.publish + \'</td>\’;
finalHtml += \'<td>\’ + book.stateCN + \'</td>\’;
finalHtml += \'<td>\’;
finalHtml += \'<div class=\”op\”>\’;
finalHtml += \'<a href=\”book_update.html?bookId=\’ + book.id + \’\”>修改</a>\’;
finalHtml += \'<a href=\”javascript:void(0)\” οnclick=\”deleteBook(\’ + book.id + \’)\”>删除</a>\’;
finalHtml += \'</div>\’;
finalHtml += \'</td>\’;
finalHtml += \'</tr>\’;
}
$(\”tbody\”).html(finalHtml);
//处理翻页信息
//翻页信息
$(\”#pageContainer\”).jqPaginator({
totalCounts: data.count, //总记录数
pageSize: 10, //每页的个数
visiblePages: 5, //可视页数
currentPage: data.pageRequest.currentPage, //当前页码
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);
if (type == \”change\”) {
// console.log(\”book_list.html\”+location.search);
location.href = \”book_list.html?currentPage=\” + page;
}
}
});
},
error: function (error) {
console.log(error);
if (error != null && error.status == 401) {
location.href = \”login.html\”;
}
}
});
}
function deleteBook(id) {
var isDelete = confirm(\”确认删除?\”);//弹出确认框
if (isDelete) {
console.log(id);
//删除图书
$.ajax({
type: \”post\”,
url: \”/book/updateBook\”,
data: {
id: id,
status: 0
},
success: function (result) {
if (result.code == 200 && result.data == true) {
alert(\”删除成功\”);
location.href = \”book_list.html\”;
}
}
});
}
}
function batchDelete() {
var isDelete = confirm(\”确认批量删除?\”);
if (isDelete) {
//获取复选框的id
var ids = [];
$(\”input:checkbox[name=\’selectBook\’]:checked\”).each(function () {
ids.push($(this).val());
});
console.log(ids);
$.ajax({
type: \”post\”,
url: \”/book/batchDelete?ids=\” + ids,
success: function (result) {
if (result.code==200 && result.data == true) {
//删除成功
location.href = \”book_list.html\”;
} else {
alter(\”删除失败, 请联系管理员\”);
}
}
});
}
}
</script>
</div>
</body>
</html>

根据需求可以得知, 后端需要提供两个接⼝

账号密码校验接⼝: 根据输⼊⽤⼾名和密码校验登录是否通过图书列表: 提供图书列表信息

后端

@RequestMapping(\”/user\”)
@RestController
public class UserController {
@RequestMapping(\”/login\”)
public boolean login(String name, String password, HttpSession session){
//账号或密码为空
if (!StringUtils.hasLength(name) || !StringUtils.hasLength(password)){
return false;
}
//模拟验证数据, 账号密码正确
if(\”admin\”.equals(name) && \”admin\”.equals(password)){
session.setAttribute(\”userName\”,name);
return true;
}
//账号密码错误
return false;
}
}

@RequestMapping(\”/book\”)
@RestController
public class BookController {
@RequestMapping(\”/getList\”)
public List<BookInfo> getList(){
//获取数据
List<BookInfo> books = mockData();
//处理⻚⾯展⽰
for (BookInfo book:books){
if (book.getStatus()==1){
book.setStatusCN(\”可借阅\”);
}else {
book.setStatusCN(\”不可借阅\”);
}
}
return books;
}
/**
* 数据Mock 获取图书信息
*
* @return
*/
public List<BookInfo> mockData() {
List<BookInfo> books = new ArrayList<>();
for (int i = 0; i < 5; i++) {
BookInfo book = new BookInfo();
book.setId(i);
book.setBookName(\”书籍\” + i);
book.setAuthor(\”作者\” + i);
book.setCount(i * 5 + 3);
book.setPrice(new BigDecimal(new Random().nextInt(100)));
book.setPublish(\”出版社\” + i);
book.setStatus(1);
books.add(book);
}
return books;
}
}

#以上关于4、SpringMVC 实战小项目【加法计算器、用户登录、留言板、图书管理系统】的相关内容来源网络仅供参考,相关信息请以官方公告为准!

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91840.html

(0)
CSDN的头像CSDN
上一篇 2024年6月23日
下一篇 2024年6月23日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注