SpringBoot和Vue 实现增删改查、分页查询、模糊查询

文章目录

  • 前言
  • 统一的设置返回类型
  • Vue安装axios,封装request
  • 查询所有的用户
    • 前端页面请求
    • 后端接口编写
  • 条件查询
    • 前台请求
    • 后台处理请求
  • 分页查询
    • 前台发送请求
    • 后台接受请求
  • 新增、编辑管理员信息
    • 前台
    • 后台
  • 删除操作
    • 前台请求
    • 后台

前言

SpringBoot实现增删改查、分页查询、模糊查询。

统一的设置返回类型

统一的返回数据结构可以使代码更加清晰易懂,方便阅读和维护。例如,当所有接口都返回相同格式的 JSON 数据时,开发人员可以轻松地理解和使用返回的数据,而无需猜测不同接口返回的数据格式。

public class Result {private static final String SUCCESS = "0";private static final String ERROR = "-1";private String code;private String msg;private Object data;public static Result success() {Result result = new Result();result.setCode(SUCCESS);return result;}public static Result success(Object data) {Result result = new Result();result.setCode(SUCCESS);result.setData(data);return result;}public static Result error(String msg) {Result result = new Result();result.setCode(ERROR);result.setMsg(msg);return result;}
}

Vue安装axios,封装request

npm i axios -S

在src目录下,创建一个utils包,用来存放我们自己定义的工具,在utils包里创建一个request.js,来封装request请求

import axios from 'axios'// 创建一个axios对象出来
const request = axios.create({baseURL: 'http://localhost:8080',timeout: 5000
})// request 拦截器
// 可以自请求发送前对请求做一些处理
// 比如统一加token,对请求参数统一加密
request.interceptors.request.use(config => {config.headers['Content-Type'] = 'application/json;charset=utf-8';// config.headers['token'] = user.token;  // 设置请求头return config
}, error => {return Promise.reject(error)
});// response 拦截器
// 可以在接口响应后统一处理结果
request.interceptors.response.use(response => {// response.data即为后端返回的Resultlet res = response.data;// 兼容服务端返回的字符串数据if (typeof res === 'string') {res = res ? JSON.parse(res) : res}return res;},error => {console.log('err' + error) // for debugreturn Promise.reject(error)}
)export default request

查询所有的用户

前端页面请求

我们前端规定要发送的请求和数据是什么。

export default {name: "AdminView",data() {return {tableData: []}},created() {this.load();},methods: {load() {request.get("/admin").then(res => {if (res.code === '0') {this.tableData = res.data;}})},}
}

后端接口编写

controller
Service
Mapper

@CrossOrigin
@RestController
@RequestMapping("/admin")
public class AdminController {AdminService adminService;@Autowiredpublic AdminController(AdminService adminService){this.adminService=adminService;}@GetMappingpublic Result getUser(){List<User> list=adminService.getUser();return Result.success(list);}
}
public interface AdminService {public List<User> getUser();
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.AdminMapper"><!--2. 基于xml的方式--><select id="getUser" resultType="com.example.entity.User">select * from user</select></mapper>

在这里插入图片描述

如果出现了跨域问题
在这里插入图片描述在controller上加个注解:@CrossOrigin

条件查询

我们的条件查询就是根据电话号码和名字进行模糊查询,下面就让我们开始。

前台请求

按钮控件

<el-input v-model="params.name" style="width: 200px" placeholder="请输入姓名"></el-input>
<el-input v-model="params.phone" style="width: 200px; margin-left: 5px" placeholder="请输入电话"></el-input>
<el-button type="warning" style="margin-left: 10px" @click="findBySearch()">查询</el-button>

创建数据

// data里定义一个params
params: {name: '',phone: ''
},

发送请求

// methods里定义一个findBySearch
findBySearch() {request.get("/admin/search", {params: this.params}).then(res => {if (res.code === '0') {this.tableData = res.data;} else {}})
},

后台处理请求

定义实体类Parms接受参数
这里是接受 前端发送的请求

public class Params {private String name;private String phone;
}

定义Controller

 @GetMapping("/search")public Result findBySearch(Params params){List<Admin> list=adminService.finBySearch(params);return Result.success(list);}

Service层

  @Overridepublic List<Admin> finBySearch(Params params) {return adminMapper.findBySearch(params);}

Mapper层

  List<Admin> findBySearch(@Param("params") Params params);
    <select id="findBySearch" resultType="com.example.entity.Admin">select * from admin<where><if test="params != null and params.name != null and params.name != ''">and name like concat('%', #{ params.name }, '%')</if><if test="params != null and params.phone != null and params.phone != ''">and phone like concat('%', #{ params.phone }, '%')</if></where></select>

加一个小功能,清空查询

<el-button type="warning" @click="reset()">清空</el-button>
reset(){this.params={name:'',phone:''}this.findBySearch()
}

分页查询

前台发送请求

设置页面

<div style="margin-top: 10px"><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="params.pageNum":page-sizes="[5, 10, 15, 20]":page-size="params.pageSize"layout="total, sizes, prev, pager, next":total="total"></el-pagination>
</div>
1. @size-change="handleSizeChange"这也是一个事件绑定,表示当用户改变每页显示的条数 (page-size) 时,会触发 handleSizeChange 方法。
handleSizeChange 方法需要自行定义,负责处理用户改变每页显示条数的逻辑,例如更新 params.pageSize 和重新获取数据。
2. @current-change="handleCurrentChange"
这也是事件绑定。当用户改变当前页 (current-page) 时,会触发 handleCurrentChange 方法。
handleCurrentChange 方法需要自行定义,负责处理用户改变当前页的逻辑,例如更新 params.pageNum 和重新获取数据。
3. :current-page="params.pageNum"这是绑定,将组件属性 (current-page) 与数据对象 (params) 的属性 (pageNum) 绑定在一起。
在这种情况下,el-pagination 组件的当前页号 (current-page) 将被设置为 params 对象的 pageNum 属性的值。
4. :page-sizes="[5, 10, 15, 20]"
这是使用数组指定 el-pagination 组件中显示的页面大小(每页显示的条目数)的选项。
通过此设置,用户可以选择每页显示 5、10、15 或 20 项。
5. :page-size="params.pageSize"
这也是绑定,将 el-pagination 组件的 page-size 属性与 params 对象的 pageSize 属性绑定在一起。
通过此设置,el-pagination 组件中当前选定的页面大小将被设置为 params 对象的 pageSize 属性的值。
6. layout="total, sizes, prev, pager, next"这是使用字符串指定 el-pagination 组件的布局。
"total" 显示总条目数。
"sizes" 显示页面大小选项。
"prev" 显示上一页按钮。
"pager" 显示当前页号和总页数。
"next" 显示下一页按钮。
通过此设置,将显示总条目数、页面大小选项、上一页和下一页按钮以及当前页号和总页数。
7. :total="total"这也是绑定,将 el-pagination 组件的 total 属性与变量 total 绑定在一起。
通过此设置,总条目数将显示在 el-pagination 组件中。

发送请求

params: {name: '',phone: '',pageNum: 1,pageSize: 5
},
total: 0

后台接受请求

  1. 在pom.xml 加载 分页插件
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.10</version>
</dependency>
  1. 在application.yml拷贝好分页配置
pagehelper:helper-dialect: mysqlreasonable: truesupport-methods-arguments: trueparams: count=countSql

PageHelper 配置解释
helper-dialect: 指定数据库方言,这里设置为 mysql,表示使用 MySQL 数据库方言。

reasonable: 开启合理化查询,可以自动优化分页查询语句,提高效率。

support-methods-arguments: 开启对方法参数的支持,可以自动从方法参数中获取分页参数。

params: 配置分页参数,这里配置了 count=countSql,表示使用 countSql 方法计算总记录数。

  1. 编写Controller接口
@GetMapping("/search")
public Result findBySearch(Params params) {PageInfo<Admin> info = adminService.findBySearch(params);return Result.success(info);
}
  1. Service接口
public PageInfo<Admin> findBySearch(Params params) {// 开启分页查询PageHelper.startPage(params.getPageNum(), params.getPageSize());// 接下来的查询会自动按照当前开启的分页设置来查询List<Admin> list = adminDao.findBySearch(params);return PageInfo.of(list);
}
  1. Mapper层接口
  <select id="findBySearch" resultType="com.example.entity.Admin">select * from admin<where><if test="params != null and params.name != null and params.name != ''">and name like concat('%', #{ params.name }, '%')</if><if test="params != null and params.phone != null and params.phone != ''">and phone like concat('%', #{ params.phone }, '%')</if></where></select>

新增、编辑管理员信息

前台

构造页面

<el-button type="warning" style="margin-left: 10px" @click="add()">新增</el-button><el-dialog title="请填写信息" :visible.sync="dialogFormVisible" width="30%"><el-form :model="form"><el-form-item label="姓名" label-width="15%"><el-input v-model="form.name" autocomplete="off" style="width: 90%"></el-input></el-form-item><el-form-item label="性别" label-width="15%"><el-radio v-model="form.sex" label="男"></el-radio><el-radio v-model="form.sex" label="女"></el-radio></el-form-item><el-form-item label="年龄" label-width="15%"><el-input v-model="form.age" autocomplete="off" style="width: 90%"></el-input></el-form-item><el-form-item label="电话" label-width="15%"><el-input v-model="form.phone" autocomplete="off" style="width: 90%"></el-input></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button @click="dialogFormVisible = false">取 消</el-button><el-button type="primary" @click="submit()">确 定</el-button></div></el-dialog>

构造请求

add() {this.form = {};this.dialogFormVisible = true;
},
submit() {request.post("/admin", this.form).then(res => {if (res.code === '0') {this.$message({message: '操作成功',type: 'success'});this.dialogFormVisible = false;this.findBySearch();} else {this.$message({message: res.msg,type: 'success'});}})
}

后台

controller层

 @PostMapping()public Result insert(@RequestBody Admin admin) {adminService.add(admin);return Result.success();}

Service

public Result add(Admin admin) {
//        // 1. 用户名一定要有,否则不让新增(后面需要用户名登录)if (admin.getName() == null || "".equals(admin.getName())) {throw new CustomException("用户名不能为空");}// 2. 进行重复性判断,同一名字的管理员不允许重复新增:只要根据用户名去数据库查询一下就可以了Admin user = adminMapper.findByName(admin.getName());if (user != null) {// 说明已经有了,这里我们就要提示前台不允许新增了throw new CustomException("该用户名已存在,请更换用户名");}//初始化一个密码if (admin.getPassword() == null) {admin.setPassword("123456");}if (admin.getId() == null) {adminMapper.insert(admin);} else {adminMapper.updateById(admin);}return Result.success();}

Mapper

    int insert(Admin admin);
<insert id="insert" parameterType="com.example.entity.Admin" useGeneratedKeys="true">insert into admin<trim prefix="(" suffix=")" suffixOverrides=","><if test="id != null">id,</if><if test="username != null">username,</if><if test="password != null">password,</if><if test="name != null">name,</if><if test="phone != null">phone,</if><if test="email != null">email,</if><if test="avatar != null">avatar,</if><if test="role != null">role,</if></trim><trim prefix="values (" suffix=")" suffixOverrides=","><if test="id != null">#{id},</if><if test="username != null">#{username},</if><if test="password != null">#{password},</if><if test="name != null">#{name},</if><if test="phone != null">#{phone},</if><if test="email != null">#{email},</if><if test="avatar != null">#{avatar},</if><if test="role != null">#{role},</if></trim></insert>

删除操作

前台请求

  del(id) {request.delete("/admin/" + id).then(res => {if (res.code === '0') {this.$message({message: '删除成功',type: 'success'});this.findBySearch();} else {this.$message({message: res.msg,type: 'success'});}})
},

后台

controller

  /*** 删除操作* @param id* @return*/@DeleteMapping("/{id}")public Result delete(@PathVariable Integer id) {adminService.delete(id);return Result.success();}

service

  public void delete(Integer id) {adminMapper.deleteById(id);}

mapper

  int deleteById(Integer id);
  <delete id="deleteById">delete from adminwhere id=#{id}</delete>

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

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

相关文章

出口内销双循环,诺赛特企业走出发展新路子

在外贸圈这个深水池中&#xff0c;企业的命脉早已与规模、市场地位等因素牢牢绑定。大型外贸企业掌握大资源、大曝光&#xff0c;不用为订单发愁&#xff1b;中型外贸企业&#xff0c;投入相当大的人力、财力、物力&#xff0c;孤注一掷&#xff0c;虎口夺食&#xff1b;小型外…

LLM 大模型框架 LangChain 可观测性最佳实践

LLM&#xff08;Large Language Model&#xff09;大模型的可观测性是指对模型内部运行过程的理解和监控能力。由于LLM大模型通常具有庞大的参数量和复杂的网络结构&#xff0c;因此对其内部状态和运行过程的理解和监控是一个重要的问题。 什么是 LangChain&#xff1f; Lang…

中华财险启动“3·15”金融消费者权益保护教育宣传活动!

2024年中国银行保险业“3•15”消费者权益保护教育宣传活动拉开帷幕。中华财险始终坚持“中华保险•服务中华”&#xff0c;切实履行险企责任&#xff0c;为主动保护金融消费者合法权益&#xff0c;在国家监督管理总局和中华保险集团的指导下&#xff0c;全面开展“3•15” 金融…

吼!原来教师这样发布学生成绩,轻松没烦恼

在教育的日常工作中&#xff0c;发布学生成绩往往是一项繁琐而重要的任务。教师们需要确保每位学生及家长能准确、及时地了解到学习成果。然而&#xff0c;传统的纸质成绩单或逐个通知的方式不仅耗时耗力&#xff0c;还容易出错。那么&#xff0c;有没有一种方法能够让教师们轻…

前端请求的错误处理

全局考虑&#xff1a; 错误需要从三个方面考虑&#xff0c;范围一次减小&#xff1a; 网络层 > 协议层 > 应用层

全球IT外包的趋势与发展

随着全球化进程的不断深化&#xff0c;IT外包已经成为众多企业的关键战略之一。IT外包是将企业的信息技术需求委托给第三方服务提供商&#xff0c;以在成本、效率和核心业务专注方面取得优势。在全球化的大背景下&#xff0c;IT外包的发展呈现出一系列新的趋势。 首先&#xff…

【ChatGPT实践】Claude 3全面升级:多模态+100万Token上下文长度,碾压OpenAI?

最近几天这张图在ai圈很火。 前几天&#xff0c;Anthropic发布了其新一代大语言模型Claude 3系列,包括Claude 3 Opus、Sonnet和Haiku三种规模&#xff0c;分别代表了超大杯、大杯和中杯。其中Sonnet版本在官网可以免费体验&#xff1a;https://claude.ai 最强的Opus版本&#x…

Nodejs web服务器之GET、POST请求初次体验

一、认识http请求 步骤 1.DNS解析域名&#xff0c;找到ip地址&#xff0c;建立TCP连接&#xff0c;发起http请求 2.服务器接收到http请求&#xff0c;进行处理&#xff0c;返回数据 3.客户端接收到返回的数据&#xff0c;处理数据&#xff08;比如渲染页面&#xff09; 二、no…

element多选框select下拉框数据回显的问题value.push is not a function

文章目录 问题描述 问题描述 今天在使用Element UI el-select组件遇到了一个问题&#xff0c;如下图&#xff1a; 下拉框里的值选中了&#xff0c;但是文本框里没有值 这是 el-select组件代码,我这里是用了一个多选框&#xff0c;options的值是在后端查询的&#xff0c;form.we…

Batch Nomalization 迁移学习

Batch Nomalization 1.Batch Nomalization原理 图像预处理过程中通常会对图像进行标准化处理&#xff0c;这样能够加速网络的收敛。就是按照channel去求均值和方差&#xff0c;然后原数据减均值除标准差&#xff0c;使我们的feature map满足均值为0&#xff0c;方差为1的分布…

three.js如何实现简易3D机房?(三)显示信息弹框/标签

接上一篇&#xff1a; three.js如何实现简易3D机房&#xff1f;(二&#xff09;模型加载的过渡动画&#xff1a;http://t.csdnimg.cn/onbWY 目录 七、创建信息展示弹框 1.整体思路 &#xff08;1&#xff09;需求&#xff1a; &#xff08;2&#xff09;思路&#xff1a;…

网康科技 NS-ASG 应用安全网关 SQL注入漏洞复现(CVE-2024-2022)

0x01 产品简介 网康科技的NS-ASG应用安全网关是一款软硬件一体化的产品,集成了SSL和IPSec,旨在保障业务访问的安全性,适配所有移动终端,提供多种链路均衡和选择技术,支持多种认证方式灵活组合,以及内置短信认证、LDAP令牌、USB KEY等多达13种认证方式。 0x02 漏洞概述 …

C语言第三十六弹---文件操作(中)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 文件操作 1、文件的顺序读写 1.1、顺序读写函数介绍 1.1.1、fgetc 与 fputc 1.1.2、fgets 与 fputs 1.1.3、fscanf 与 fprintf 1.1.4、fread 与 fwrite 1.…

全志D1s开发板裸机开发之坏境搭建

环境搭建 开发板介绍 张天飞老师编写的《RISC-V体系结构编程与实践》&#xff0c;里面的源码是基于 QEMU 模拟器的&#xff0c;可以认为它是一款虚拟的开发板。如果需要在真实开发板上学习&#xff0c;可以使用百问网的 DongshanPI-D1S 开发板。 DongshanPI-D1S 是百问网推出…

Python web自动化测试 —— 文件上传!

​文件上传三种方式&#xff1a; &#xff08;一&#xff09;查看元素标签&#xff0c;如果是input&#xff0c;则可以参照文本框输入的形式进行文件上传 方法&#xff1a;和用户输入是一样的&#xff0c;使用send_keys 步骤&#xff1a;1、找到定位元素&#xff0c;2&#…

Git分支操作

Git分支操作 理解分支查看当前分支git branch 查看有几个分支git branch 新分支的名字 创建新分支git checkout -b 分支名 直接创建并切换到该分支下 切换分支git checkout 分支名 切换到指定分支 合并分支git merge 分支名 合并指定名字的分支 删除分支git branch -d 分支 删…

Linux:kubernetes(k8s)探针的简介(7)

相当于我们用于监控容器的一个东西&#xff0c;通过给我们的不同探针来判断容器内的状态情况&#xff0c;实现故障的一个自动恢复。 我们在上一章的yaml文件中写入了一个这个东西 那么他什么情况下重启&#xff0c;就是通过探针进行一个监控&#xff0c;加入监控某一个端口&…

云原生(一)、linux快速上手

Linux是一种开源的Unix-like操作系统内核。它是由Linus Torvalds于1991年首次发布&#xff0c;其后经过全球的自由软件社区的持续开发和改进。Linux内核是操作系统的核心部分&#xff0c;但通常与GNU项目合作&#xff0c;以形成完整的操作系统&#xff0c;被称为Linux发行版&am…

ROS从入门到精通4-2:Docker安装ROS、可视化仿真与终端复用

目录 0 专栏介绍1 Docker安装ROS2 Docker可视化仿真2.1 显示配置2.2 启动容器 3 终端复用工具3.1 session操作3.2 window操作3.3 pane操作3.4 其他操作 0 专栏介绍 本专栏旨在通过对ROS的系统学习&#xff0c;掌握ROS底层基本分布式原理&#xff0c;并具有机器人建模和应用ROS…

机器学习项目的流程:从数据到部署

目录 前言1 数据收集1.1 任务定义与数据需求明确1.2 数据采集与清洗 2 模型训练2.1 数据预处理2.2 选择适当的模型2.3 模型训练与调优2.4 模型评估 3 模型部署3.1 部署环境准备3.2 模型集成3.3 测试和优化 4 模型维护和更新4.1 模型性能监测4.2 数据漂移处理4.3 定期更新模型 结…