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

我们希望用户可以自己控制是否要模糊查询
用户可以自由的选择字段去查询。
如上图,我在前端页面准备了
- 多选框:决定是否模糊查询。(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:用户自由选择字段查询、是否模糊查询的更多相关文章
- java 实现用户自由选择字段实现导出EXCEL表格
package com.thinkgem.jeesite.common.utils.excel; import java.io.File; import java.io.OutputStream; i ...
- 转:Java项目开发规范参考
Java项目开发规范参考 - KevinLee的博客 - 博客频道 - CSDN.NEThttp://blog.csdn.net/u011383131/article/details/51227860 ...
- IDEA 学习笔记之 Java项目开发深入学习(2)
Java项目开发深入学习(2): 查找变量被用到的地方 编译当前文件 增加变量watch 注意:我使用了keymap (eclipse模板),所以很多快捷键和eclipse一样. F5单步调试进入函数 ...
- IDEA 学习笔记之 Java项目开发深入学习(1)
Java项目开发深入学习(1): 定义编译输出路径: 继承以上工程配置 重新定义新的项目编译路径 添加source目录:点击添加,再点击移除: 编译项目: 常用快捷键总结: Ctrl+Space 代码 ...
- IDEA 学习笔记之 Java项目开发
Java项目开发: 新建模块: 添加JDK: 导入本地Jars: 从远程Maven仓库下载: 创建package: 新建类/接口/枚举等: 字体太小,改字体: Duplicate Scheme 修改编 ...
- 《Maven在Java项目开发中的应用》论文笔记(十七)
标题:Maven在Java项目开发中的应用 一.基本信息 时间:2019 来源:山西农业大学 关键词:Maven:Java Web:仓库:开发人员:极限编程; 二.研究内容 1.Maven 基本原理概 ...
- 收藏基本Java项目开发的书
一.Java项目开发全程实录 第1章 进销存管理系统(Swing+SQL Server2000实现) 第2章企业内部通信系统(Swing+JavaDB实现) 第3章 企业人事管理系统( Swing+H ...
- Java项目开发中实现分页的三种方式一篇包会
前言 Java项目开发中经常要用到分页功能,现在普遍使用SpringBoot进行快速开发,而数据层主要整合SpringDataJPA和MyBatis两种框架,这两种框架都提供了相应的分页工具,使用 ...
- 详细介绍idea实现javaweb项目登入注册(华东交通大学教务处信息管理系统)、模糊查询
详细介绍idea实现javaweb项目登入注册(华东交通大学教务处信息管理系统).模糊查询 1,创建数据库,我的用户名:root 密码:root,数据库名称:lianwei,表名:login 2,效果 ...
- Java项目开发
项目开发整体构建: MVC+DAO设计模式 用面向对象的方式理解和使用数据库,一个数据库对应一个java项目 数据库--项目 表--类 字段--属性 表中的一条数据--类的一个对象 M:模型层 Jav ...
随机推荐
- Flutter 实现骨架屏
什么是骨架屏 在客户端开发中,我们总是需要等待拿到服务端的响应后,再将内容呈现到页面上,那么在用户发起请求到客户端成功拿到响应的这段时间内,应该在屏幕上呈现点什么好呢? 答案是:骨架屏 那么什么是骨架 ...
- EAS(能量感知调度)绿色节能调度器
能量感知调度(EAS)使调度程序能够预测其决策对 CPU 消耗的电量的影响. EAS 依赖于 CPU 的能量模型 (EM) 来为每个任务选择省电的 CPU,同时要求对执行任务的吞吐量的影响最小. EA ...
- C# 根据主键ID查询数据库的数据 反射和泛型实现
// 引入命名空间 using Zhu.ADO.NET.DBProxy; using Zhu.ADO.NET.Models.models; Console.WriteLine("====== ...
- AI之道|诺奖对AI的偏爱是真魔幻【悟空非空也】
一.背景 回归 2024 年诺贝尔物理学奖被授予 John J.Hopfield(霍普菲尔德) 和 Geoffrey E.Hinton(辛顿),当时物理学界都震惊了,纷纷在打听霍普菲尔德和辛顿,他们两 ...
- C#/.NET/.NET Core技术前沿周刊 | 第 10 期(2024年10.14-10.20)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- 三大主流负载均衡软件对比(LVS+Nginx+HAproxy)
LVS: 优点 : 1.抗负载能力强.性能高,能达到F5硬件的60%:对内存和cpu资源消耗比较低2.工作在网络4层,通过vrrp协议转发(仅作分发之用),具体的流量由linux内核处理,因此没有流量 ...
- k8s 中的 Gateway API 的背景和简介【k8s 系列之四】
〇.Gateway API 的背景 第一阶段:Service 初始的 Kubernetes 内部服务向外暴露,使用的是自身的 LoadBlancer 和 NodePort 类型的 Service. 在 ...
- vite 设置网络代理
参考文档:vite 官网.node-http-proxy 完整示例: export default defineConfig({ server: { proxy: { // 字符串简写写法 '/foo ...
- GPU 环境搭建指南:如何在裸机、Docker、K8s 等环境中使用 GPU
本文主要分享在不同环境,例如裸机.Docker 和 Kubernetes 等环境中如何使用 GPU. 跳转阅读原文:GPU 环境搭建指南:如何在裸机.Docker.K8s 等环境中使用 GPU 1. ...
- Logback日志文件失效
2021-07-30碰到加了logback-spring.xml依然不生效的问题,特此记录. 发现问题 在项目中引入logback-spring.xml文件,该文件配置了会在项目根目录下生成logs文 ...