我们希望用户可以自己控制是否要模糊查询

用户可以自由的选择字段去查询。

如上图,我在前端页面准备了

  • 多选框:决定是否模糊查询。(True or False)
  • 下拉选择框:决定要查询关键词的所属字段
  • 输入框:决定关键词
  • 按钮:发起请求

肯定要传参数的,所有这个接口请求方式设置为Post。考虑到方便接收参数,我们使用post的param方式传参(不了解这个的可以看我之前的笔记 https://www.cnblogs.com/mllt/p/17990445/project202401-14)

export function user_search(data){
return postWithParams("/users/search",data)
}

现在我们先编写按钮事件 userSearch()

const userSearch=()=>{
//配置参数
let data={
"like":checked.value,//是否模糊查询
"key":ziduan_select.value,//字段名称
"word":keyword.value//关键词 }
//发送请求
user_search(data).then((res)=>{
if(res["code"]===1){
message.success(res["msg"]);
dataSource.value=res["data"]
}else {
message.error(res["msg"]);
}
})
}

接下来去编写后端接口

Controller:

    // 条件查询
@PostMapping("/search")
public ResponseEntity<?> searchUsers(@RequestParam boolean like,@RequestParam String key,@RequestParam String word) {
List<Users> users = usersService.searchUsers(like, key, word);
return ResponseEntity.success(users);
}

Service

    List<Users> searchUsers(boolean like, String key, String word);

ServiceImpl

 @Override
public List<Users> searchUsers(boolean like, String key, String word) {
if(like){
return usersMapper.searchUsersLike(key,word);
}else{
return usersMapper.searchUsersNoLike(key,word);
}
}

mapper

    //自定义字段模糊查询
@Select("select * from users where `${key}` LIKE CONCAT('%', #{word}, '%')")
List<Users> searchUsersLike(@Param("key") String key, @Param("word") String word);
@Select("select * from users where `${key}` = #{word}")
List<Users> searchUsersNoLike(String key, String word);

完毕,就是如此简单。

我把前端的这个组件的完整代码贴出来

<script setup>
import {PlusSquareOutlined,SearchOutlined} from "@ant-design/icons-vue";
import {onMounted, reactive, ref} from "vue";
import {user_delete_by_id, user_get_list, user_search, user_update} from "../../../apis/UserApi.js";
import { cloneDeep } from 'lodash-es';
import {message} from "ant-design-vue"; onMounted(()=>{
user_get_list().then((res)=>{
dataSource.value=res.data
//对得到的用户数据进行处理,以显示在表格中
})
})
const columns = [
{
title: '操作',
dataIndex: 'operation',
width: '20%',
},
{
title: '用户ID',
dataIndex: 'userId',
width: '10%',
},
{
title: '昵称',
dataIndex: 'userNickname',
width: '10%',
},
{
title: '账号',
dataIndex: 'userAccount',
width: '10%',
},
{
title: '身份',
dataIndex: 'userIdentity',
width: '10%',
}, {
title: '权限',
dataIndex: 'remarks',
width: '10%',
},
{
title: '注册时间',
dataIndex: 'userRegTime',
width: '25%',
}, ];
const dataSource = ref([]);
const editableData = reactive({});
const edit = key => {
editableData[key] = cloneDeep(dataSource.value.filter(item => key === item.userId)[0]);
};
const save = key => {
Object.assign(dataSource.value.filter(item => key === item.userId)[0], editableData[key]);
delete editableData[key];
// 找到要更新的用户的索引
const userIndex = dataSource.value.findIndex(item => key === item.userId)
// 调用更新用户的函数
const updatedUser = dataSource.value[userIndex];
console.log(updatedUser)
user_update(updatedUser)
.then(response => {
// 处理响应,例如显示成功消息
// console.log('User updated successfully', response);
message.success(response["msg"])
})
.catch(error => {
// 处理错误,例如显示错误消息
// console.error('Failed to update user', error);
message.error(error)
}); };
const cancel = key => {
delete editableData[key];
};
const formatDate= (dateTimeStr)=> {
if (dateTimeStr === '' || dateTimeStr==null) {
return ''; // 返回空字符串或者其他占位符
}
// 使用 Date 对象解析日期时间字符串
const date = new Date(dateTimeStr);
// 检查日期对象是否有效
if (isNaN(date.getTime())) {
return ''; // 返回空字符串或者其他占位符
}
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
} const checked = ref(true);
const keyword=ref("")
const ziduan_select=ref("user_id")
const ziduan=ref([{
value: 'user_id',
label: '用户ID',
},
{
value: 'user_nickname',
label: '昵称',
},
{
value: 'user_account',
label: '用户账号',
},])
const onDelete = key => {
let uid = key
dataSource.value = dataSource.value.filter(item => item.userId !== key);
user_delete_by_id(uid).then((res)=>{
if(res["code"]===1){
message.success(res["msg"]);
}else {
message.error(res["msg"]);
}
})
}; const userSearch=()=>{
//配置参数
let data={
"like":checked.value,//是否模糊查询
"key":ziduan_select.value,//字段名称
"word":keyword.value//关键词 }
//发送请求
user_search(data).then((res)=>{
if(res["code"]===1){
message.success(res["msg"]);
dataSource.value=res["data"]
}else {
message.error(res["msg"]);
}
})
}
</script> <template>
<br>
<div class="mytable">
<a-breadcrumb>
<a-breadcrumb-item><a href="/">主页</a></a-breadcrumb-item>
<a-breadcrumb-item><a href="/user">用户管理</a></a-breadcrumb-item>
</a-breadcrumb>
<br>
<hr>
<br>
<a-space>
<a-checkbox v-model:checked="checked">模糊查询</a-checkbox> <a-select
v-model:value="ziduan_select"
style="width: 100px"
:options="ziduan"
></a-select> <a-input v-model:value="keyword" placeholder="请输入关键词"/> <a-button type="primary" @click="userSearch">
<template #icon>
<SearchOutlined />
</template>
搜索
</a-button> <a-button type="primary" >
<template #icon>
<PlusSquareOutlined />
</template>
新增用户
</a-button>
</a-space> </div> <br>
<a-table class="mytable" :columns="columns" :data-source="dataSource" bordered>
<template #bodyCell="{ column, text, record }">
<template v-if="['userNickname', 'userIdentity', 'userStatus','remarks'].includes(column.dataIndex)">
<div>
<a-input
v-if="editableData[record.userId]"
v-model:value="editableData[record.userId][column.dataIndex]"
style="margin: -5px 0"
/>
<template v-else>
{{ text }}
</template>
</div>
</template>
<template v-else-if="column.dataIndex==='userRegTime'">
{{formatDate(text)}}
</template>
<template v-else-if="column.dataIndex === 'operation'">
<div class="editable-row-operations">
<span v-if="editableData[record.userId]">
<a-typography-link @click="save(record.userId)" style="margin: 14px">保存</a-typography-link> <a-popconfirm style="margin: 14px" title="放弃更改?" ok-text="放弃" cancel-text="取消" @confirm="cancel(record.userId)">
<a>取消</a>
</a-popconfirm>
</span>
<span v-else>
<a @click="edit(record.userId)">编辑</a>
</span>
</div> <a-popconfirm
v-if="dataSource.length"
title="确认删除?"
ok-text="确定" cancel-text="取消"
@confirm="onDelete(record.userId)"
>
<a>删除</a>
</a-popconfirm>
</template>
</template>
</a-table>
</template> <style scoped>
.mytable{
margin: 0 auto;max-width: 960px;width: 90%; border-radius:5px;box-shadow: 0 5px 15px 2px rgba(0,0,0,0.2);padding: 1em;box-sizing: border-box;background: rgba(255,255,255,0.9) }
</style>

2024年1月Java项目开发指南16:用户自由选择字段查询、是否模糊查询的更多相关文章

  1. java 实现用户自由选择字段实现导出EXCEL表格

    package com.thinkgem.jeesite.common.utils.excel; import java.io.File; import java.io.OutputStream; i ...

  2. 转:Java项目开发规范参考

    Java项目开发规范参考 - KevinLee的博客 - 博客频道 - CSDN.NEThttp://blog.csdn.net/u011383131/article/details/51227860 ...

  3. IDEA 学习笔记之 Java项目开发深入学习(2)

    Java项目开发深入学习(2): 查找变量被用到的地方 编译当前文件 增加变量watch 注意:我使用了keymap (eclipse模板),所以很多快捷键和eclipse一样. F5单步调试进入函数 ...

  4. IDEA 学习笔记之 Java项目开发深入学习(1)

    Java项目开发深入学习(1): 定义编译输出路径: 继承以上工程配置 重新定义新的项目编译路径 添加source目录:点击添加,再点击移除: 编译项目: 常用快捷键总结: Ctrl+Space 代码 ...

  5. IDEA 学习笔记之 Java项目开发

    Java项目开发: 新建模块: 添加JDK: 导入本地Jars: 从远程Maven仓库下载: 创建package: 新建类/接口/枚举等: 字体太小,改字体: Duplicate Scheme 修改编 ...

  6. 《Maven在Java项目开发中的应用》论文笔记(十七)

    标题:Maven在Java项目开发中的应用 一.基本信息 时间:2019 来源:山西农业大学 关键词:Maven:Java Web:仓库:开发人员:极限编程; 二.研究内容 1.Maven 基本原理概 ...

  7. 收藏基本Java项目开发的书

    一.Java项目开发全程实录 第1章 进销存管理系统(Swing+SQL Server2000实现) 第2章企业内部通信系统(Swing+JavaDB实现) 第3章 企业人事管理系统( Swing+H ...

  8. Java项目开发中实现分页的三种方式一篇包会

    前言   Java项目开发中经常要用到分页功能,现在普遍使用SpringBoot进行快速开发,而数据层主要整合SpringDataJPA和MyBatis两种框架,这两种框架都提供了相应的分页工具,使用 ...

  9. 详细介绍idea实现javaweb项目登入注册(华东交通大学教务处信息管理系统)、模糊查询

    详细介绍idea实现javaweb项目登入注册(华东交通大学教务处信息管理系统).模糊查询 1,创建数据库,我的用户名:root 密码:root,数据库名称:lianwei,表名:login 2,效果 ...

  10. Java项目开发

    项目开发整体构建: MVC+DAO设计模式 用面向对象的方式理解和使用数据库,一个数据库对应一个java项目 数据库--项目 表--类 字段--属性 表中的一条数据--类的一个对象 M:模型层 Jav ...

随机推荐

  1. gadget驱动框架(二)

    usb_composite_driver的创建于注册 源码:drivers/usb/legacy/serial.c //创建usb_composite_driver static struct usb ...

  2. C# 如何理解装箱和拆箱 ?

    装箱和拆箱就是C# 中数据类型的转换 : 装箱:值类型转换对象类型(引用类型,复杂类型) 拆箱:对象类型转换值类型 object obj=null; //引用类型 obj=1; //装箱 boxing ...

  3. ⼯作中有做过数据处理吗? tree 组件 根据 pid 寻找父节点

    主要是在组件和后端返回的数据之间,或者组件产⽣的数据和需要提交给后端的数据之间,有可能会出 现结构对不上,这个时候可能会处理⼀下,举个例⼦,⽐如说我们常⽤的tree型组件要求必须是嵌套的 tree型数 ...

  4. 鲸鸿动能广告助力App流量高效变现,促进商业增长

    广告是App开发者实现流量变现的常用方法之一.当App积累了一定数量的用户后,开发者需要考虑如何有效地将流量转化为收入,以支持App的商业可持续增长. HarmonyOS SDK广告服务(Ads Ki ...

  5. 在mac上配置nginx 并将前端的打包文件运行

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  6. Curve 分布式存储在 KubeSphere 中的实践

    Curve 介绍 Curve 是网易开发的现代存储系统,目前支持文件存储 (CurveFS) 和块存储 (CurveBS).现在它作为一个沙盒项目托管在 CNCF. Curve 是一个高性能.轻量级操 ...

  7. LDAP和SSO

    什么是LDAP(Lightweight Directory Access Protocol)?很多公司会使用各种开源平台(例如: gitlab. Jenkins. chat 等等),维护这些账号是一件 ...

  8. CentOS7.4 安装 11204 ASM GI 组件时:ohasd failed to start

    前段时间某客户要求在CENTOS7上部署Oracle 11.2.0.4 single instance && ASM存储,遇到一个比较头疼的问题,好在已经处理完了. 在图形化执行安装程 ...

  9. [Go] 如何妥善处理 TCP 代理中连接的关闭

    如何妥善处理 TCP 代理中连接的关闭 相比较于直接关闭 TCP 连接,只关闭 TCP 连接读写使用单工连接的场景较少,但通用的 TCP 代理也需要考虑这部分场景. 背景 今天在看老代码的时候,发现一 ...

  10. js常用函数 _01 关于 model()、substr() 和 正则表达式的使用

    js常用函数 _01 关于 model().substr() 和 正则表达式的使用 1.model() Bootstrap 模态框(Modal)插件 模态框(Modal)是覆盖在父窗体上的子窗体.通常 ...