96SEO 2026-02-20 09:01 0
id="content_views">
上节博客我们讲了实现分页查询和搜索功能,这篇博客我们继续完成增删改查操作,在前后端分离开发模式中,用户数据的增删改查(CRUD)是最基础也最核心的业务场景。

本文将详细介绍如何结合
组件库,实现一套功能完善、交互流畅的用户数据管理系统,涵盖表单验证、分页查询、批量操作等关键功能,为开发同类系统提供清晰的实现思路。
0)">一、实现新增数据
在
的映射文件中,通过<insert>标签编写插入
SQL,指定要插入的字段(username、birthday等),并通过#{字段名}接收实体类参数:
src="https://i-blog.csdnimg.cn/direct/d83bbf39200444b0b6c167894fb8e68a.png"
格式的表单数据,所以后端需要用@RequestBody注解接收(将
层的insert方法完成入库:
autocomplete="off">
prop="birthday"
placeholder="选择日期时间">
prop="sex"
value="男">
label="女"
value="女">
prop="address"
autocomplete="off">
#footer="">
class="dialog-footer">
false">取
设置提交的表单
用
el-dialog(弹窗)包裹el-form,实现“点击新增后弹出表单”
的交互;通过
model绑定表单数据(data.form),rules配置表单验证规则:
alt=""
src="https://i-blog.csdnimg.cn/direct/5b840bcb77df4f0988d69f241bd95646.png"
“新增”
按钮绑定
@click事件,触发handleAdd方法,将“表单弹窗显示状态”(
formVisible)设为true,同时清空之前的表单数据:
alt=""
src="https://i-blog.csdnimg.cn/direct/e8bb76e8385847df8e8af1cca7714cbe.png"
width="869">
5.script数据提交(注意点)
通过
reactive定义表单数据(form)、弹窗状态(formVisible)、验证规则(rules);点击“提交”
时,先通过
formRef做表单验证,验证通过后调用接口提交数据:
alt=""
src="https://i-blog.csdnimg.cn/direct/322d1bea4ae94260ba1fe57bfa984a66.png"
alt=""
src="https://i-blog.csdnimg.cn/direct/7dd6c4d5813e4129ba8c64e933cbecad.png"
width="836">
{request.get('/user/selectPage',
{//入参params:
data.pageSize,username:data.username,address:data.address}}).then(res
=>
是表单的引用formRef.value.validate((valid)
=>
验证通过的情况下request.post('/user/add',
data.form).then(res
//隐藏弹框ElMessage.success('新增成功')load()
//重新加载数据}
{ElMessage.error(res.msg)}})}})
const
的
<set>和<if>标签实现动态更新(只修改非空的字段),避免覆盖原有数据,同时通过where#{id}定位要修改的行:
alt=""
src="https://i-blog.csdnimg.cn/direct/61558ef1618041c0a04facb2f23755fb.png"
width="1128">
parametertype="com.qcby.springboot.entity.User">update
user
where test="username!=null">username=#{username},
test="birthday!=null">birthday=#{birthday},
test="sex!=null">sex=#{sex},
test="address!=null">address=#{address},
#{id}
controller层
用
@PostMapping("/update")定义修改接口,通过@RequestBody接收前端传递的(包含id的)User对象,调用
层的
update方法完成修改:
alt=""
src="https://i-blog.csdnimg.cn/direct/095ede5d25214252a60fd8f74312760b.png"
设置vue的修改和删除按钮
在
el-table-column的“操作”
列中,给修改按钮绑定
@click="handleEdit(scope.row)",点击时把当前行数据(scope.row)传给handleEdit方法:
alt=""
src="https://i-blog.csdnimg.cn/direct/7561db5d3f34400b8dcdf7a955364a41.png"
width="1397">
@click="handleEdit(scope.row)">
type="danger"
@click="del(scope.row.id)">
2.4
设置vue的数据提交
handleEdit方法接收表格行数据后,通过JSON.parse(JSON.stringify(row))深度拷贝数据(避免修改表单时直接影响表格原数据),再把拷贝后的数据赋值给data.form,同时打开弹窗(formVisible:alt=""
src="https://i-blog.csdnimg.cn/direct/95ef2cc6ec26428d8282ffc090d577d9.png"
“保存”
按钮时,通过
data.form.id是否存在,判断是“新增”
“修改”:
- 有
id(修改):调用update()方法- 无
id(新增):调用add()方法
update方法先做表单验证,验证通过后调用后端/user/update接口,把修改后的data.form(包含id)传给后端,成功后关闭弹窗并刷新表格:
JSON.parse(JSON.stringify(row))
true
是表单的引用formRef.value.validate((valid)
=>
验证通过的情况下request.post('/user/update',
data.form).then(res
falseElMessage.success('修改成功')load()}
else
{ElMessage.error(res.msg)}})}})
}
class="hljs">
class="card"
:prefix-icon="Search">
clearable=""
:prefix-icon="Search">
type="primary"
type="danger">批量删除
type="success">批量导入
type="info">批量导出
class="card"
@click="handleEdit(scope.row)">
type="danger"
@click="del(scope.row.id)">
v-model:current-page="data.pageNum"
v-model:page-size="data.pageSize"
layout="total,
@size-change="load">
autocomplete="off">
prop="birthday"
placeholder="选择日期时间">
prop="sex"
autocomplete="off">
prop="address"
autocomplete="off">
#footer="">
class="dialog-footer">
false">取
{request.get('/user/selectPage',
{//入参params:
data.pageSize,username:data.username,address:data.address}}).then(res
=>
是表单的引用formRef.value.validate((valid)
=>
验证通过的情况下request.post('/user/add',
data.form).then(res
//隐藏弹框ElMessage.success('新增成功')load()
//重新加载数据}
{ElMessage.error(res.msg)}})}})
handleEdit
JSON.parse(JSON.stringify(row))
true
是表单的引用formRef.value.validate((valid)
=>
验证通过的情况下request.post('/user/update',
data.form).then(res
falseElMessage.success('修改成功')load()}
else
{ElMessage.error(res.msg)}})}})
三、实现删除数据
xml配置
通过
<delete>标签编写删除语句,根据id(前端传递的用户主键)定位并删除对应行:
alt=""
src="https://i-blog.csdnimg.cn/direct/602a621c874b414aa7ad9a1bf1b2b8d6.png"
controller层
用
@PostMapping("/delete/{id}")定义接口,通过@PathVariable接收URL
路径中的
id(比如请求/delete/10,id就是10),再调用
层的
delete方法执行删除:
alt=""
src="https://i-blog.csdnimg.cn/direct/0ecd116f96ea4e5199d00d63dc16449d.png"
删除数据
del方法先通过ElMessageBox.confirm弹出确认框(避免误删),用户确认后调用后端/delete/{id}接口,删除成功后刷新表格:
alt=""
src="https://i-blog.csdnimg.cn/direct/40e4b910cc02494782042339e409bdad.png"
width="1146">
{ElMessageBox.confirm('删除后无法恢复,您确认删除吗?
',
'删除确认',
{ElMessage.success('删除成功')load()}
else
{ElMessage.error(res.msg)}})}).catch(err
=>
库提供的一个弹出框组件,主要用于显示各种类型的确认对话框、提示信息等。
的
<foreach>标签,把数组拼接成
incontroller层
用
@PostMapping("/delMore")定义批量删除接口,通过@RequestBodyInteger[]
class="hljs">@PostMapping("/delMore")
@ResponseBody
ids){System.out.println("ids="+ids);userService.deleteMore(ids);return
new
的多选事件 @selection-change="handleSelectionChange"
alt=""
src="https://i-blog.csdnimg.cn/direct/af8af5b2e853484993930978e80a9473.png"
width="1289">
4.4 添加批量删除按钮
alt=""
src="https://i-blog.csdnimg.cn/direct/da03056ee9844b6caa1673e9bb3a42e6.png"
width="1138">
@click="deleteBatch">批量删除
4.5 交互逻辑
定义批量删除数组,选中行的
id集合传给后端
alt=""
src="https://i-blog.csdnimg.cn/direct/a2f9e7a76eac45f482741a085b2d3dc1.png"
width="733">
{ElMessage.warning('请选择要删除的记录')return}//
ids
item.id);ElMessageBox.confirm('删除后无法恢复,您确认删除吗?
',
'删除确认',
{ElMessage.success('删除成功')loadData()}
else
id="E46n-1768913445127">五、前端全部代码
class="hljs">
class="card"
:prefix-icon="Search">
clearable=""
:prefix-icon="Search">
type="primary"
@click="deleteBatch">批量删除
class="card"
@selection-change="handleSelectionChange"
color:
type="selection":这指定该列将包含用于行选择的复选框。
它允许用户在表格中选择一行或多行。
-->
:formatter="dateFormat">
prop="sex"
@click="handleEdit(scope.row)">
type="danger"
@click="del(scope.row.id)">
v-model:current-page="data.pageNum"
layout="total,
@size-change="load">
title="信息"
autocomplete="off">
prop="birthday"
placeholder="选择日期时间">
prop="sex"
value="男">
label="女"
value="女">
prop="address"
autocomplete="off">
#footer="">
class="dialog-footer">
false">取
String(date.getDate()).padStart(2,
'0')return
是表单的引用formRef.value.validate((valid)
=>
验证通过的情况下request.post('/user/add',
data.form).then(res
//隐藏弹框ElMessage.success('新增成功')load()
//重新加载数据}
{ElMessage.error(res.msg)}})}})
const
JSON.parse(JSON.stringify(row))
true
是表单的引用formRef.value.validate((valid)
=>
验证通过的情况下request.post('/user/update',
data.form).then(res
falseElMessage.success('修改成功')load()}
else
{ElMessage.error(res.msg)}})}})
//删除数据
{ElMessageBox.confirm('删除后无法恢复,您确认删除吗?
',
'删除确认',
{ElMessage.success('删除成功')load()}
else
{ElMessage.error(res.msg)}})}).catch(err
=>
{ElMessage.warning('请选择数据')return}ElMessageBox.confirm('删除后无法恢复,您确认删除吗?
',
'删除确认',
{request.delete('/user/deleteBatch',
data:
{ElMessage.success('批量删除成功')load()}
else
{ElMessage.error(res.msg)}})}).catch(err
=>
class="post-meta-container">
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback