声名
提示:这里没有完整的项目流程,只记录了动态查询网页的重点内容。 如何搭建一个完整项目流程:基于 Spring Mvc 一个简单项目的基本流程 <用户注册功能>(校正版)
提示:以下是本篇文章正文内容,下面案例可供参考
一、后端
1. mapper(非重点)
1. 接口文件
定义了方法:
List<UserInfo> findAll();
2. 映射文件
编写了查询信息的SQL语句:
<select id="findAll" resultType="com.upc.oa.po.UserInfo">
select userId, userName, userRealName, userSex, userEmail
from user_info
where userStatus=1
</select>
3. 测试(略)
2. 业务逻辑(重点)
上次博客中提到过,业务逻辑存在的必要性即处理数据。这此我们分页查询数据,则从mapper获取的数据,将在业务逻辑中进行分页处理,在反馈给控制器时已经是分页处理后的数据了。
1. 配置PageHelper
在pom.xml文件空白处,右键选择Generate-Dependency-搜索pagehelper-选择pagehelper-spring-boot-starter 1.3.1,效果如下:
2. 创建接口
使用新的实体类PageInfo作为业务逻辑的返回值类型。这是PageHelper里一种数据类型,将原来的List结构体数据转化为PageInfo实体类后,可自动封装处理List数据,变成分页处理后的结果。在service接口文件中写:
package com.upc.oa.service;
import com.github.pagehelper.PageInfo;
import com.upc.oa.dto.UserinfoDto;
import com.upc.oa.po.UserInfo;
import java.util.List;
public interface UserInfoService {
PageInfo<UserInfo> findAll(int pageNum, int pageSize);
}
3. 创建impl
这里需要将mapper查询到的数据,封装为PageInfo类型,然后反馈给控制器
package com.upc.oa.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.upc.oa.dto.UserinfoDto;
import com.upc.oa.mapper.UserinfoMapper;
import com.upc.oa.po.UserInfo;
import com.upc.oa.service.UserInfoService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class UserInfoServiceImpl implements UserInfoService {
@Resource
private UserinfoMapper userinfoMapper;
@Override
public PageInfo<UserInfo> findAll(int pageNum, int pageSize) {
PageInfo<UserInfo> page=null;
PageHelper.startPage(pageNum,pageSize);
List<UserInfo> users=null;
users=userinfoMapper.findAll();
page=new PageInfo<>(users,4);
return page;
}
}
4. 测试
业务逻辑也是可以测试的。
- 创建测试文件,选择要测试的接口
- 添加注解,编写参数,测试业务逻辑即可
package com.upc.oa.service;
import com.github.pagehelper.PageInfo;
import com.upc.oa.po.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class UserInfoServiceTest {
@Resource
private UserInfoService userInfoService;
@Test
void findAll() {
int pageNum= 1;
int pageSize= 3;
PageInfo<UserInfo> page = userInfoService.findAll(pageNum,pageSize);
System.out.println(page);
}
}
3. 控制器(重点)
1. 创建控制器
注意控制器返回的数据类型也是PageInfo
package com.upc.oa.controller;
import com.github.pagehelper.PageInfo;
import com.upc.oa.dto.UserinfoDto;
import com.upc.oa.po.UserInfo;
import com.upc.oa.service.UserInfoService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private UserInfoService userInfoService;
@RequestMapping("/findAll")
public PageInfo<UserInfo> findAll(int pageNum, int pageSize){
return userInfoService.findAll(pageNum,pageSize);
}
}
2. 测试控制器
- 启动XXXApplicaton
一定要启动成功,正常运行才可进入后续步骤 - 选择Idea自己的插件
界面介绍: - 配置界面
- 测试
二、前端(重点)
先在static文件夹下,创建users.html文件
1. 配置jQuery、bootstrap
bootstrap: 提供大量的Css样式和少量Js组键。Css中有一种选择器叫类选择器,我们定义类名,然后编写这个类选择器的修饰内容,我们需要修饰谁,就在谁那里添加class=“类名”。而bootStrap是自己定义好了一堆Css的类选择器函数,我们自己直接在控件中添加自己想要的class=""即可进行修饰。 使用方法: 访问官网,使用模板套用即可BootStrap模板
1.1 搭载jquery
在static文件夹下,创建jquery文件夹,将jquery-3.6.0.min.js复制到该文件夹下
2. 搭载bootstrap
- 复制bootstrap文件夹
- 粘贴到static中,目录结构如下即可
3. 配置jQuery、bootstrap
采用拖拽方法将需要的文件直接拖拽到title标签下方空白处,注意拖拽顺序!
4. ReBuild 项目
2. 编写Html文件:
1. 触发事件
全选功能为例:
Html部分
<thead>
<tr>
<td>
<input type="checkbox" id="chall" onclick="selectAllCk(this.checked)">
</td>
<td>账号</td>
<td>真实姓名</td>
<td>性别</td>
<td>操作</td>
</tr>
</thead>
Script部分
<script>
function selectAllCk(f){
jQuery("input[name='ids']").prop("checked",f);
}
</script>
2. 使用jQuery传递数据/语句
在Script脚本中,反引号中可以编写Html语句,使用jQuery传递到对应控件即可执行
在表体显示数据为例:
Html部分
<tbody id="data">
</tbody>
Script部分
// 1.获取查询的数据
var arrs=rst.list;
var trs = '';
// 利用循环+反引号,获取了多少数据,就创建多少条语句
for (var i=0;i<arrs.length;i++){
//获取每一行对应的用户对象的信息
var u=arrs[i];
// 创建语句
trs=trs+`
<tr>
<td>
<input type="checkbox" name="ids" value="${u.userId}">
</td>
<td>${u.userName}</td>
<td>${u.userRealName}</td>
<td>${u.userSex==1?'男':'女'}</td>
<td>${u.userEmail}</td>
<td>
<a href="#" >删除</a>
<a href="#" >编辑</a>
</td>
</tr>
`;
}
// 把处理trs代码字符串添加到Html部分中,id为data的控件中
jQuery("#data").html(trs)
3. 知识点
1. script与html的数据交互
- 在html设置触发事件,html可向脚本传递参数,而事件内容可修改html
- 在script,使用jQuery,获取对应id/name的数值
- 在script,通过jquery,定位id,可向html传递数据、甚至是html语句
4.完整的Html
完成了分页显示功能,里面html与script交织在一起,实在是没有找到一个好的方法来表示,只能把完整代码和注释放在这了,累了,毁灭吧。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="bootstrap-4.6.0-dist/css/bootstrap.min.css">
<script src="jquery/jquery-3.6.0.min.js"></script>
<script src="bootstrap-4.6.0-dist/js/bootstrap.min.js"></script>
<style type="text/css">
#top{
padding: 10px 20px;
text-align: right;
}
#page_div #right{
float: right;
}
#page_div #left{
float: left;
}
</style>
</head>
<body>
<div id="container">
<div id="top">
<button type="button" class="btn btn-danger btn-lg">批量删除</button>
</div>
<div id="bottom">
<table class="table table-bordered table-hover table-striped">
<thead>
<tr>
<td>
<input type="checkbox" id="chall" onclick="selectAllCk(this.checked)">
</td>
<td>账号</td>
<td>真实姓名</td>
<td>性别</td>
<td>操作</td>
</tr>
</thead>
<tbody id="data">
</tbody>
<tfoot>
<tr>
<td colspan="6">
<div id="page_div">
<div id="left">
当前页/总页数: <span id="pageNum"></span> / <span id="pages"></span> 总条数=<span id="totals"></span>
</div>
<div id="right">
</div>
</div>
</td>
<td></td>
<td></td>
<td></td>
</tr>
</tfoot>
</table>
</div>
</div>
<script>
function selectAllCk(f){
jQuery("input[name='ids']").prop("checked",f);
}
</script>
<script>
var pageNum = 1;
var pageSize = 3;
var pageNums = 0 ;
function init() {
var param={
"pageNum" : pageNum,
"pageSize" : pageSize
};
jQuery.post("user/findAll",param,function (rst) {
pageNums=rst.pages;
jQuery("#pages").html(pageNums);
jQuery("#pageNum").html(pageNum);
jQuery("#totals").html(rst.total);
var arrs=rst.list;
var trs = '';
for (var i=0;i<arrs.length;i++){
var u=arrs[i];
trs=trs+`
<tr>
<td>
<input type="checkbox" name="ids" value="${u.userId}">
</td>
<td>${u.userName}</td>
<td>${u.userRealName}</td>
<td>${u.userSex==1?'男':'女'}</td>
<td>${u.userEmail}</td>
<td>
<!-- 按钮,采用超链接 -->
<a href="#" >删除</a>
<a href="#" >编辑</a>
</td>
</tr>
`;
}
jQuery("#data").html(trs)
var nav=`
<ul class="pagination">
<li class="page-item">
<!-- 设置触发事件,当点击上一页,触发pageUtil事件,传入要前往的页(当前页的上一页) -->
<a href="#" class="page-link" οnclick="pageUtil(${pageNum-1})">上一页</a>
</li>
`;
var nums=rst.navigatepageNums;
for(var i=0;i<nums.length;i++)
{
nav+=` <!-- 如果当前页与页码数组中的某一页相等则,激活当前页 -->
<li class="page-item" ${pageNum==nums[i]?'active':''}>
<a href="#" class="page-link">${nums[i]}</a>
</li>
`;
}
nav=nav+`
<li class="page-item">
<!-- 设置触发事件,当点击下一页,触发pageUtil事件,传入要前往的页(当前页的下一页) -->
<a href="#" class="page-link" οnclick="pageUtil(${pageNum+1})">下一页</a>
</li>
</ul>
`;
jQuery("#right").html(nav);
})
}
jQuery(function () {
init();
})
</script>
<script>
function pageUtil(num) {
pageNum=num;
if(num<=1)
{
pageNum=1;
}
if(num>pageNums){
pageNum=pageNums;
}
init();
}
</script>
</body>
</html>
最终效果,除了删除功能没有实现,其他都是实现了,等我功力深了,再来填坑。
|