测试开发【Mock平台】09开发:项目管理(五)搜索、删除和Table优化

【Mock平台】为系列测试开发教程,从0到1编码带你一步步使用Spring Boot 和 Antd React框架完成搭建一个测试工具平台,希望作为一个实战项目对各位的测试开发学习之路有帮助,大奇一个专注测试技术干货原创与分享的家伙。

Mock平台系统项目基本配置,我们已经完成了展示,增加、修改,这个模块的进度其实已经差不多80%了,在本分享中将收下尾,为数据表格配置分页,实现简单搜索功能,以及删除功能,还会掌握如何自定义格式化列数据。

1.优化Table展示

表格形式的数据,一般未来累计超过20条的非常建议为其增加分页功能,在antd中Table组件有自带这个配置,但在之前的逻辑实现中特意关掉了,内部其实嵌套的也是Pagination分页组件,下边将详细演示内嵌和独立使用两种形式。

1.1 Pagination组件

分页组件在数据量大且加载/渲染所有数据将花费很多时间时,可以利用分页器组件进行页码浏览,要使用它需要导入组件 import{ Pagination }from'antd';其中基础配置属性** **total总数量,会根每页条数 pageSize(默认是10条)计算多少页,另外还有一个重要方法 onChange指页码或 pageSize 改变时回调,function(page, pageSize)参数是改变后的页码及每页条数。

参考官方例子给项目列表Table下方增加此组件,为了先做个演示测试,数据固定给50条,并主动开启

  • showSizeChanger 展示 pageSize 切换器,组件默认 total 大于 50 时为 true
  • pageSizeOptions 数组 指定每页可以显示多少条
import{ Pagination }from'antd';/* 分页相关 */
const pageChange = (page, pageSize) => {console.log(`分页变化值 Page:${page}, PageSize:${pageSize}`);
}...省略...
</Table>
<br/>  
<Paginationtotal={100}onChange={pageChange}showSizeChanger={true}pageSizeOptions={[5,10,20,30,50]}
/>

当点击切换页,下拉选择改变每页显示的数量时候,可以直观的看到的两个参数数值的变化,如下图:
image.png

因此在实现项目表格分页上,只需要在onChange里请求之前文章后服务分页查询接口,并将统计的总数动态赋值,就能实现优化改造。这里参考代码有些注意的地方:

  • 不要忘记server.js 的接口配置;
export async function searchProducts(params) {return request('/api/mock/project/search', {method: 'GET',params});
}
  • 定义了些中间变量存储各类数据;
  • 换了fetchData方法函数替代原有请求列表,并且是参数化请求,避免React闭包问题;
  • 列表查询接口还有一个项目名称模糊查询字段,组合请求参数时不要忘记;
  // const {data:useProjectList, error, loading, run: reloadProjectList} = useRequest(getProductList);const [data, setData] = useState();const [loading, setLoading] = useState(false);const [current, setCurrent] = useState(1);const [pageSize, setPageSize] = useState(10);const [total, setTotal] = useState();const fetchData = (name, current, pageSize) => {setLoading(true);searchProducts({name:name, current:current, pageSize: pageSize}).then(reps => {setData(reps.data);setTotal(reps.total);setLoading(false);});};/* 分页相关 */const pageChange = (page, pageSize) => {setCurrent(page);setPageSize(pageSize);fetchData('', page, pageSize);}// 页面首次请求项目列表数据初始化useEffect(() => {fetchData('', current, pageSize);}, []);
  • 对原有数据来要做变方法和变量替换,核心部分如下,其他根据IDE提示解决或者参考源代码;
<Tableloading={loading}rowKey="id"pagination={false}columns={projectColumns}dataSource={data}
/>
<br/>
<Paginationtotal={total}current={current}pageSize={pageSize}onChange={pageChange}showSizeChanger={true}pageSizeOptions={[5,10,20,30,50]}
/>

代码开发调试效果如演示GIF

这里其实有个问题,就是当切换每页数量时候,当前选中页面还是之前的,如果条数从小条切到大,就有当前页数超出新的页数量总数情况,解决办法如果pageSize有变更,初始化默认页为第一页。

const pageChange = (page, size) => {// 如果改变了size 将其page设置为第一页let tmpPage = 1;if(size !== pageSize){tmpPage = 1} else {tmpPage = page;}setCurrent(tmpPage);setPageSize(size);fetchData('', tmpPage, size);}

1.2 Table自带分页

对于Table组件是有内置的分页功能,其实也就是Pagination组件,并对其做了封装得以使用更简单

https://ant.design/components/table-cn/#components-table-demo-ajax

image.png

有了上边1.1基础,改造起来就简单多了,只需将Pagination部分内容以JSON赋值方式赋值给Table中的pagination即可。

<Tableloading={loading}rowKey="id"pagination={{total:total,current:current,pageSize:pageSize,onChange: pageChange,showSizeChanger:true,pageSizeOptions:[5,10,20,30,50]}}columns={projectColumns}dataSource={data}
/>

可以看到包括样式在内,自动展示了分页,并且尝试测试切换也均正常,不过我的例子中单独的变量定义的有点多,你们可以尝试参考官方Table远程加载数据例子再优化一版。
image.png

1.3 列表数据格式化

在表格数据展示中其中我们可以看到类型一栏显示还是数据库里的字段,所以这里说明下如何实现格式展示,方法和操作相似,使用 render 自定义请求一个方法,此方法根据类型判断返回相应文字和组件。

const formatType = (txtType) =>{if (txtType === 'public') {return <Tag>公共项目</Tag>} else if (txtType === 'private') {return <Tag>私有项目</Tag>} else {return <Tag>未知类型</Tag>}}// 表单列const projectColumns = [...{dataIndex:"type",title:"类型",render: (text, _) => (formatType(text)),},...]

代码中实现的是将英文关键词转换成对应的中文进行显示,并用Tag标签包裹。
image.png

之后其他想做数据格式化展示,或多列合并一条,再或根据不同值展示不同样式等等,都可以使用此方法,当然后边有一种 ProTable 高级表格的时候,它提供多种类型数据展示提供了内置格式化,后续用到再进行详细说明。

2.搜索功能

在优化Table显示需求中替换带分页查询的接口时,我们预留的一个searchName 参数,对于多数据的展示如果能有个主要信息的搜索功能才比较完美,这里利用 Grid栅格Form行内表单 组件实现。

https://ant.design/components/grid-cn/
https://ant.design/components/form-cn/#components-form-demo-layout

Grid 用于布局,基于行(row)和列(col)来定义信息区块的外部框架,笔者因为对CSS不熟,不能熟练的用于DIV做一些样式布局,所以就常用栅格来控制行和列来达到想要的区域块布局效果。
**Form **行内是表单布局一种,一行的显示样式,常用于搜索、快捷编辑等场景。
参考两个组件官方API说明,最终我们要实现如下的页面效果:
image.png

这里由于之前表单的操作已经实战过Form的用法,所以就直接给出了参考代码,其中style是简单样式,实现右边6个栅格区域按钮靠右对齐。

 <Row><Col span={18}><Form layout="inline"onFinish={...todo实现提交代码...}><Form.Item name="searchName" label="项目名称"><Input></Input></Form.Item><Form.Item><Button htmlType="submit">搜索</Button></Form.Item></Form></Col><Col span={6}><ButtononClick={addAction}type="primary"style={{marginBottom: 16,marginRight: 20,float: "right"}}>项目添加</Button></Col>
</Row>

最后补充下表单提交的实现代码

// 搜索
const onSearch = (values) => {fetchData(values.searchName, current, pageSize)
};// return 内表单修改部分
<Form layout="inline"onFinish={onSearch}
>

输入一个关键点击搜索测试一下OK,但参考代码到这里会有交互缺陷,如果给定的关键词搜索的结果也是多页,那么我在切换页面或者页数量的时候,由于之前代码name都写死的空值,所以又会变成全量查询,这个问题的优化留个思考题吧,看看是你会怎么做?
image.png
ps:项目源代码中有我的优化答案可以进行参考

3.项目删除功能

实现完了编辑功能,操作列里还有一个删除操作,一般为了防止删除这种危险动作是误操作,将会用到上一篇中的确认对话框知识点,不过这里将用到官方例子里的 showPromiseConfirm即确定按钮触发会有等待,明确得到返回成功后关闭对话框。

3.1 删除接口

此接口没在之前的 Mock平台-05开发:项目管理(一)后端接口 准备好,需要现实现,MVC全部的代码如下,不再赘述Springboot API实现知识点,不会或者忘记的翻下系列第五篇回看下。这里需要特别强调下,这里删除是个软删除,所以要对数据库表增加一个字段 is_del (0-默认,1-删除)来做标记,实际删除就是更新此字段为删除状态。

MockProjectMapper.java

/**
* 删除项目,软删除标记is_del=1
* @param id
* @return 影响数量 更新成功默认1
*/
@Update({"UPDATE mock_project SET mp_state=1 WHERE mp_id=#{id}"})
Boolean removeProject(Integer id);

MockProjectService.java

RespResult removeMockProject(Integer id);

MockProjectServiceImpl.java

@Override
public RespResult removeMockProject(Integer id) {Boolean markResult = mockProjectMapper.removeProject(id);if (markResult){return RespResult.success();}return RespResult.failure(RespCode.DATA_REMOVE_ERROR);
}

MockProjectController.java

@PostMapping(value = "/project/remove")
public RespResult removeProject(@Param("id") Integer id){return mockProjectService.removeMockProject(id);
}

3.2 删除交互

对于前度删除功能交互的实现,先按照流程先定义服务请求接口

export async function removeProduct(id) {return request('/api/mock/project/remove?id='+id, {method: 'POST'});
}

动态生成确认对话框需要导入Modal组件里的子项 confirm 主要的三个属性和两个方法

  • title 对话显示的标题
  • icon 引用icon图标组件
  • content 详细的内容,支持ReactNode
  • onOk 点击确定按钮触发
  • onCancel 点击取消按钮触发,不做逻辑处理默认为关闭对话框
const { confirm } = Modal;
import { removeProduct } from "@/pages/Project/service";
....省略...// 删除操作
const deleteConfirmWithPromise = (record) => {confirm({title: '删除确认?',icon: <ExclamationCircleOutlined />,content: `确定要删除【${record?.name}】吗?`,async onOk() {const result = await removeProduct(record.id);if(result.success){message.success('删除项目成功!');// 成功后刷新fetchData(sName, current, pageSize);} else{message.error('删除项目失败!');}},onCancel() {},});};

表格操作栏删除按钮添加deleteConfirmWithPromise并把所在行数据传过去。

{dataIndex:"option",title:"操作",render: (text, record) => (<Space><a onClick={()=>editAction(record)}>编辑</a>
+    <a onClick={()=>deleteConfirmWithPromise(record)}>删除</a></Space>
),},

按例重启前后端服务,进行删除取消/确认/删除成功页面刷新的用例测试。

花了大篇幅在比较简单需求的项目管理上,是为务牢基础为后边核心逻辑更轻松,另外学习是一个过程,尤其是基础知识薄弱的,一定不要是看会,而是动手实战,进而有自己的想法和移花接木的本领,最终从务实角度来讲能在实际工作中业务上应用,哪怕是务虚为了KPI、“钱途“也要做点什么。

最后预告系列分享开发实战部分终于要进入核心部分的实现,比如分类Tree,接口管理,Mock拦截等实战内容,欢迎长期关注哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/118838.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数电再回顾

最近&#xff0c;花了点时间回顾数字电路&#xff0c;放几张我觉得比较好的截图&#xff0c;记录学习过程。 附录&#xff1a; 计算机是如何保存1和0的 - 知乎 (zhihu.com) 只读存储器ROM || ROM实现逻辑函数 || 数电 - 知乎 (zhihu.com) ROM的组成原理 -解决方案-华强电子网…

chatgpt谈论日本排放污水事件

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 近日&#xff0c;世界发生了让人义愤填膺的时间——日本排放核污水。这件事情是那么的突然且不计后果&#xff0c;海洋是我们全人类共同的财产&#xff0c;而日本却想用自己一己私欲将全人类的安全置之度外&#xff0c…

工厂方法模式的概述和使用

目录 一、工厂方法模式概述1. 定义2. 使用动机 二、工厂方法模式结构1. 模式结构2. 时序图 三、工厂方法模式的使用实例四、工厂方法模式的优缺点五、工厂方法模式在Java中应用 原文链接 一、工厂方法模式概述 1. 定义 工厂方法模式(Factory Method Pattern)又称为工厂模式&…

基于Laravel通用型内容建站企业官网系统源码 可免费商用

是一个基于 Laravel 企业内容建站系统。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;免费且不限制商业使用 2023年08月23日增加了以下12个特性&#xff1a; [新功能] 手机端Banner支持…

数学建模--粒子群算法(PSO)的Python实现

目录 1.开篇提示 2.算法流程简介 3.算法核心代码 4.算法效果展示 1.开篇提示 """ 开篇提示: 这篇文章是一篇学习文章,思路和参考来自:https://blog.csdn.net/weixin_42051846/article/details/128673427?utm_mediumdistribute.pc_relevant.none-task-blog-…

thinkPHP项目搭建

1 宝塔添加站点 &#xff08;1&#xff09;打开命令提示行&#xff0c;输入以下命令&#xff0c;找到hosts文件。 for /f %P in (dir %windir%\WinSxS\hosts /b /s) do copy %P %windir%\System32\drivers\etc & echo %P & Notepad %P &#xff08;2&#xff09;添加域…

数据库-DQL

DQL&#xff1a;用来查询数据库表中的记录 关键字&#xff1a;SELECT 语法&#xff1a; select&#xff1a;字段列表 from&#xff1a;表名列表 where&#xff1a;条件列表 group by&#xff1a;分组列表 having&#xff1a;分组后条件列表 order by&#xff1a;排序字段列表…

2022年12月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:区间合并 给定 n 个闭区间 [ai; bi],其中i=1,2,…,n。任意两个相邻或相交的闭区间可以合并为一个闭区间。例如,[1;2] 和 [2;3] 可以合并为 [1;3],[1;3] 和 [2;4] 可以合并为 [1;4],但是[1;2] 和 [3;4] 不可以合并。 我们的任务是…

Stable Diffuse 之 本地环境部署/安装包下载搭建过程简单记录

Stable Diffuse 之 本地环境部署/安装包下载搭建过程简单记录 目录 Stable Diffuse 之 本地环境部署/安装包下载搭建过程简单记录 一、简单介绍 二、注意事项 三、环境搭建 git 下载和安装 python 下载和安装 stable-diffusion-webui 下载和安装 测试 stable diffuse w…

构造函数与成员变量初始化

C自学精简教程 目录(必读) 1 为什么需要定义构造函数&#xff1f; 构造函数主要用来给成员变量初始化。 让类对象有一个良好的开始状态。 2 构造函数初始化成员变量 下面我们来完善上一篇文章中的几个构造函数。 让这些构造函数完成给成员变量初始化的职责。 为此&#…

24.排序,插入排序,交换排序

目录 一. 插入排序 &#xff08;1&#xff09;直接插入排序 &#xff08;2&#xff09;折半插入排序 &#xff08;3&#xff09;希尔排序 二. 交换排序 &#xff08;1&#xff09;冒泡排序 &#xff08;2&#xff09;快速排序 排序&#xff1a;将一组杂乱无章的数据按一…

(六)k8s实战-存储管理

一、Volumes 1、HostPath 【使用场景&#xff1a;容器目录 挂载到 主机目录】 【可以持久化到主机上】 将节点上的文件或目录挂载到 Pod 上&#xff0c;此时该目录会变成持久化存储目录&#xff0c;即使 Pod 被删除后重启&#xff0c;也可以重新加载到该目录&#xff0c;该目…

【算法题】1761. 一个图中连通三元组的最小度数

题目&#xff1a; 给你一个无向图&#xff0c;整数 n 表示图中节点的数目&#xff0c;edges 数组表示图中的边&#xff0c;其中 edges[i] [ui, vi] &#xff0c;表示 ui 和 vi 之间有一条无向边。 一个 连通三元组 指的是 三个 节点组成的集合且这三个点之间 两两 有边。 连…

恢复数据的利器:易我数据恢复终身技术版v16.2.0.0

EaseUS Data Recovery Wizard为全球提供数据恢复方案,用于误删数据数据,电脑误删文件恢复,格式化硬盘数据恢复,手机U盘数据恢复等,RAID磁盘阵列数据恢复,分区丢失及其它未知原因丢失的数据恢复,简单易用轻松的搞定数据恢复。 特点描述 - 易我数据恢复中文便携版&#xff0c;无…

Kitchen Hook

双扛厨房排钩&#xff1a;挂刀具

HuggingFace 简介

HuggingFace 简介 0. HuggingFace 简介1. HuggingFace 官网地址2. HuggingFace 标准研发流程3. HuggingFace 工具集4. 编码工具4.1 编码工具介绍4.2 使用编码工具 5. 数据集工具5.1 数据集工具介绍5.2 使用数据集工具 6. 评价指标工具6.1 评价指标工具介绍6.2 使用评价指标工具…

vmware 16增加硬盘容量并在Ubuntu 18.04上边格式化并挂载

参考了《增加 VM虚拟机硬盘容量》 《Linux学习之分区挂载》中有给VMWare 16虚拟机添加一块硬盘的内容&#xff0c;需要先参考添加硬盘。 sudo mkfs.ext4 /dev/sda4给/dev/sda4进行ext4格式化。 sudo mkdir /mountsda4新建一个挂载目录。 sudo mount -t ext4 /dev/sda4 /mo…

gitlab升级

1.下载需要的版本 wget -c https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-15.7.6-ce.0.el7.x86_64.rpm --no-check-certificate gitlab-ce-15.4.6-ce.0.el7.x86_64.rpm gitlab-ce-15.7.6-ce.0.el7.x86_64.rpm gitlab-ce-15.9.7-ce.0.el7.x86_64.rpm g…

可扩展的Blender插件开发汇总

成熟的 Blender 3D 插件是令人惊奇的事情。作为 Python 和 Blender 的新手,我经常发现自己被社区中的人们创造的强大的东西弄得目瞪口呆。坦率地说,其中一些包看起来有点神奇,当自我怀疑或冒名顶替综合症的唠叨声音被打破时,很容易想到“如果有人能做出可以做xxx的东西就好…

JS踩坑: for let 和 for var的区别

最近踩了一个js的坑 踩坑代码 如下两段代码&#xff0c;看起来没什么区别&#xff0c;但是实际运行效果却不一样 for (let i 0; i < 10; i) {console.log("for:" i);setTimeout(() > {console.log("setTimeout:" i);}, 1000); }输出&#xff1…