条件分页查询
搜索表单
代码实现
(1)在 views/emp/index.vue 中的 <script setup>l</script> 中增加如下 js 代码
js
import { ref } from "vue";
const searchEmp = ref({
name: "",
gender: "",
date: [],
begin: "",
end: "",
});
const search = () => {
// 处理查询逻辑
console.log("Search:", searchEmp.value);
};
const clear = () => {
// 清空表单
searchEmp.value = {
name: "",
gender: "",
date: [],
};
search();
};(2)在 views/emp/index.vue 中的 <template></template> 中增加如下 js 代码
js
<h1>员工管理</h1> <br>
<el-form :inline="true" :model="searchEmp">
<el-form-item label="姓名">
<el-input v-model="searchEmp.name" placeholder="请输入员工姓名"></el-input>
</el-form-item>
<el-form-item label="性别">
<el-select v-model="searchEmp.gender" placeholder="请选择">
<el-option label="男" value="1"></el-option>
<el-option label="女" value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item label="入职日期">
<el-date-picker
v-model="searchEmp.date"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="YYYY-MM-DD"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="search">查询</el-button>
<el-button @click="clear">清空</el-button>
</el-form-item>
</el-form>⚠️注意:在element-plus中,提供的日期选择组件,最终提交的值的格式,如果为 2024-02-01 这种格式,需要设置value-format属性为 YYYY-MM-DD
时间问题分析
(1)通过测试,我们可以看到,输入的入职日期的搜索条件,用的是 element-plus 的日期范围组件,开始时间和结束时间,两个值,是封装到了一个数组中
(2)而通过接口接口文档,我们可以可以看到最终在查询员工列表数据时,搜索条件中,入职日期的开始时间 和 结束时间,是两个值,一个是 begin 开始时间,一个是 end 结束时间
(3)那么此时,我们就需要将 searchEmp 对象中的 date 这个数组的值,解析出来,复制给 begin 和 end。而且,一旦 date 的值发生变化,我们就需要重新计算 begin 和 end 这两个时间,把数组中的第一个元素,赋值给 begin;第二个元素,赋值给 end

watch 监听
需求分析
查询中包含起始时间和结束时间,需要将两个变量赋值给参数然后传递给后端,这两个时间是随时变化的,这时就可以借助 watch 监听实现数据的动态变化与赋值
基本介绍
(1)作用:侦听一个或多个响应式数据源,并在数据源变化时调用所给的回调函数
(2)用法
导入 watch 函数
执行 watch 函数,传入要侦听的响应式数据源(ref 对象)和回调函数
监听单个数据源

监听对象的单个属性

监听对象的全部属性
、
第三个可选参数,常见两个选项
deep(boolean):是否深度侦听,默认浅层侦听
immediate(boolean):是否在侦听创建时立即触发回调函数
Tlias 实现
在输入的时间发生变化时,自动为 searchEmp 中的 begin,end 两个属性赋值
具体代码如下,在 views/emp/index.vue 文件中的 <script></script> 中增加 watch 监听
js
import { ref, watch } from "vue";
const searchEmp = ref({
name: "",
gender: "",
date: [],
begin: "",
end: "",
});
//侦听searchEmp中的date属性
watch(
() => searchEmp.value.date,
(newValue, oldValue) => {
if (newValue.length == 2) {
searchEmp.value.begin = newValue[0];
searchEmp.value.end = newValue[1];
} else {
searchEmp.value.begin = "";
searchEmp.value.end = "";
}
}
);
const search = () => {
// 处理查询逻辑
console.log("Search:", searchEmp.value);
};
const clear = () => {
// 清空表单
searchEmp.value = {
name: "",
gender: "",
date: [],
begin: "",
end: "",
};
search();
};表格展示与分页
views/emp/index.vue 完整代码如下
vue
<script setup>
import { ref, watch } from "vue";
const searchEmp = ref({
name: "",
gender: "",
date: [],
begin: "",
end: "",
});
//侦听searchEmp中的date属性
watch(
() => searchEmp.value.date,
(newValue, oldValue) => {
if (newValue.length == 2) {
searchEmp.value.begin = newValue[0];
searchEmp.value.end = newValue[1];
} else {
searchEmp.value.begin = "";
searchEmp.value.end = "";
}
}
);
const search = () => {
// 处理查询逻辑
console.log("Search:", searchEmp.value);
};
const clear = () => {
// 清空表单
searchEmp.value = {
name: "",
gender: "",
date: [],
};
search();
};
// 示例数据
const empList = ref([
{
id: 1,
username: "jinyong",
password: "123456",
name: "金庸",
gender: 1,
image:
"https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-02-00-27-53B.jpg",
job: 2,
salary: 8000,
entryDate: "2015-01-01",
deptId: 2,
deptName: "教研部",
createTime: "2022-09-01T23:06:30",
updateTime: "2022-09-02T00:29:04",
},
]);
// 分页配置
const currentPage = ref(1);
const pageSize = ref(10);
const total = ref(0);
// 分页处理
const handleSizeChange = (val) => {
search();
};
const handleCurrentChange = (val) => {
search();
};
</script>
<template>
<h1>员工管理</h1>
<br />
<el-form :inline="true" :model="searchEmp">
<el-form-item label="姓名">
<el-input
v-model="searchEmp.name"
placeholder="请输入员工姓名"
></el-input>
</el-form-item>
<el-form-item label="性别">
<el-select v-model="searchEmp.gender" placeholder="请选择">
<el-option label="男" value="1"></el-option>
<el-option label="女" value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item label="入职日期">
<el-date-picker
v-model="searchEmp.date"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="YYYY-MM-DD"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="search">查询</el-button>
<el-button @click="clear">清空</el-button>
</el-form-item>
</el-form>
<el-button type="primary" @click=""> + 新增员工</el-button>
<el-button type="danger" @click=""> - 批量删除</el-button>
<br /><br />
<!-- 表格 -->
<el-table :data="empList" border style="width: 100%">
<el-table-column
type="selection"
width="55"
align="center"
></el-table-column>
<el-table-column
prop="name"
label="姓名"
width="120"
align="center"
></el-table-column>
<el-table-column label="性别" width="120" align="center">
<template #default="scope">
{{ scope.row.gender == 1 ? "男" : "女" }}
</template>
</el-table-column>
<el-table-column label="头像" width="120" align="center">
<template #default="scope">
<img :src="scope.row.image" width="40" class="img" align="center" />
</template>
</el-table-column>
<el-table-column
prop="deptName"
label="部门名称"
width="120"
align="center"
></el-table-column>
<el-table-column label="职位" width="120" align="center">
<template #default="scope">
<span v-if="scope.row.job == 1">班主任</span>
<span v-else-if="scope.row.job == 2">讲师</span>
<span v-else-if="scope.row.job == 3">学工主管</span>
<span v-else-if="scope.row.job == 4">教研主管</span>
<span v-else-if="scope.row.job == 5">咨询师</span>
<span v-else>其他</span>
</template>
</el-table-column>
<el-table-column
prop="entryDate"
label="入职日期"
width="180"
align="center"
></el-table-column>
<el-table-column
prop="updateTime"
label="最后操作时间"
width="200"
align="center"
></el-table-column>
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button size="small" type="primary" @click="">编辑</el-button>
<el-button size="small" type="danger" @click="">删除</el-button>
</template>
</el-table-column>
</el-table>
<br />
<!-- 分页 -->
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:page-sizes="[10, 20, 30, 40]"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
>
</el-pagination>
</template>
<style scoped></style>页面交互
(1)在 src/api 目录下再定义一个 emp.js
我们可以一次性将增删改查相关的 api 操作的函数都定义好
js
import request from "@/utils/request";
//查询员工列表数据
export const queryPageApi = (name, gender, begin, end, page, pageSize) =>
request.get(
`/emps?name=${name}&gender=${gender}&begin=${begin}&end=${end}&page=${page}&pageSize=${pageSize}`
);
//新增
export const addApi = (emp) => request.post("/emps", emp);
//根据ID查询
export const queryInfoApi = (id) => request.get(`/emps/${id}`);
//修改
export const updateApi = (emp) => request.put("/emps", emp);
//删除
export const deleteApi = (ids) => request.delete(`/emps?ids=${ids}`);(2)在 src/views/emp/index.vue 文件中完成页面交互实现
vue
<script setup>
import { ref, watch, onMounted } from "vue";
import { queryPageApi } from "@/api/emp";
const searchEmp = ref({
name: "",
gender: "",
date: [],
begin: "",
end: "",
});
//侦听searchEmp中的date属性
watch(
() => searchEmp.value.date,
(newValue, oldValue) => {
if (newValue.length == 2) {
searchEmp.value.begin = newValue[0];
searchEmp.value.end = newValue[1];
} else {
searchEmp.value.begin = "";
searchEmp.value.end = "";
}
}
);
onMounted(() => {
search();
});
//查询员工
const search = async () => {
console.log("Search:", searchEmp.value);
const result = await queryPageApi(
searchEmp.value.name,
searchEmp.value.gender,
searchEmp.value.begin,
searchEmp.value.end,
currentPage.value,
pageSize.value
);
if (result.code) {
empList.value = result.data.rows;
total.value = result.data.total;
}
};
const clear = () => {
// 清空表单
searchEmp.value = {
name: "",
gender: "",
date: [],
begin: "",
end: "",
};
search();
};
// 示例数据
const empList = ref([
{
id: 1,
username: "jinyong",
password: "123456",
name: "金庸",
gender: 1,
image:
"https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-02-00-27-53B.jpg",
job: 2,
salary: 8000,
entryDate: "2015-01-01",
deptId: 2,
deptName: "教研部",
createTime: "2022-09-01T23:06:30",
updateTime: "2022-09-02T00:29:04",
},
]);
// 分页配置
const currentPage = ref(1);
const pageSize = ref(10);
const total = ref(0);
// 分页处理
const handleSizeChange = (val) => {
search();
};
const handleCurrentChange = (val) => {
search();
};
</script>
<template>
<h1>员工管理</h1>
<br />
<el-form :inline="true" :model="searchEmp">
<el-form-item label="姓名">
<el-input
v-model="searchEmp.name"
placeholder="请输入员工姓名"
></el-input>
</el-form-item>
<el-form-item label="性别">
<el-select v-model="searchEmp.gender" placeholder="请选择">
<el-option label="男" value="1"></el-option>
<el-option label="女" value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item label="入职日期">
<el-date-picker
v-model="searchEmp.date"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="YYYY-MM-DD"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="search">查询</el-button>
<el-button @click="clear">清空</el-button>
</el-form-item>
</el-form>
<el-button type="primary" @click=""> + 新增员工</el-button>
<el-button type="danger" @click=""> - 批量删除</el-button>
<br /><br />
<!-- 表格 -->
<el-table :data="empList" border style="width: 100%">
<el-table-column
type="selection"
width="55"
align="center"
></el-table-column>
<el-table-column
prop="name"
label="姓名"
width="120"
align="center"
></el-table-column>
<el-table-column label="性别" width="120" align="center">
<template #default="scope">
{{ scope.row.gender == 1 ? "男" : "女" }}
</template>
</el-table-column>
<el-table-column label="头像" width="120" align="center">
<template #default="scope">
<img :src="scope.row.image" width="40" class="img" align="center" />
</template>
</el-table-column>
<el-table-column
prop="deptName"
label="部门名称"
width="120"
align="center"
></el-table-column>
<el-table-column label="职位" width="120" align="center">
<template #default="scope">
<span v-if="scope.row.job == 1">班主任</span>
<span v-else-if="scope.row.job == 2">讲师</span>
<span v-else-if="scope.row.job == 3">学工主管</span>
<span v-else-if="scope.row.job == 4">教研主管</span>
<span v-else-if="scope.row.job == 5">咨询师</span>
<span v-else>其他</span>
</template>
</el-table-column>
<el-table-column
prop="entryDate"
label="入职日期"
width="180"
align="center"
></el-table-column>
<el-table-column
prop="updateTime"
label="最后操作时间"
width="200"
align="center"
></el-table-column>
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button size="small" type="primary" @click="">编辑</el-button>
<el-button size="small" type="danger" @click="">删除</el-button>
</template>
</el-table-column>
</el-table>
<br />
<!-- 分页 -->
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:page-sizes="[10, 20, 30, 40]"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
>
</el-pagination>
</template>
<style scoped></style>