MySql结合element-plus pagination的分页查询

news2024/11/20 1:28:49

实现效果如下:

重点:使用mysql查询的limit和offset

原生SQL写法:

select c.id as deptid,c.name as department,position,a.name staffname,'2024-11' as shijian
,CASE WHEN b.shijian IS NULL THEN 'no' ELSE 'yes' END AS submit
from fa_wecom_staff a left JOIN fa_kpi_table b on a.userid=b.staff_id AND shijian = '2024-11' 
LEFT JOIN fa_wecom_department c ON a.department=c.id
WHERE phone<>'' AND b.shijian IS NOT NULL
GROUP BY a.name,userid,b.shijian
LIMIT 100 OFFSET 1;
 

limit对应分页插件的参数pageSize,offset对应分页参数的pageNum,计算公式如下:

offset = pageNum==1 ? 1  : (pageNum-1)*pageSize;

后端写法(php)

    public function searchnotsubmit($pageNum=1,$pageSize=10,$shijian=null,$department_id=null,$department_value=null,$status=null){
        $where = ' AND 1=1';
        if(!empty($department_id)){
            $where .= ' AND c.id in ('.$department_id.')';
        }
        if(!empty($department_value)){
            $where .= ' AND c.name in ("'.$department_value.'")';
        }
        if(!empty($status)){
            if($status=='未提交') $where .= ' AND b.shijian IS NULL';
            if($status=='已提交') $where .= ' AND b.shijian IS NOT NULL';
        }
         $sql = "select c.id as deptid,c.name as department,position,a.name staffname,'$shijian' as shijian
,CASE WHEN b.shijian IS NULL THEN '未提交' ELSE '已提交' END AS submit
from fa_wecom_staff a left JOIN fa_kpi_table b on a.userid=b.staff_id AND shijian = '$shijian' 
LEFT JOIN fa_wecom_department c ON a.department=c.id
WHERE phone<>'' $where GROUP BY a.name,userid,b.shijian";
        $total = count(Db::query($sql));
        $offset = $pageNum==1 ? 1 : ($pageNum-1)*$pageSize;
        $row = Db::query($sql." LIMIT $pageSize OFFSET $offset;");
        $this->success('查询成功',['total'=>$total,'data'=>$row]);
    }

前端局部代码(pagination分页组件)

<el-pagination @size-change="onHandleSizeChange" @current-change="onHandleCurrentChange" class="mt15"
				:pager-count="10" :page-sizes="[10, 20, 30, 50, 100, 200, 500]" v-model:current-page="search_params.pageNum" background
				v-model:page-size="search_params.pageSize" layout="total, sizes, prev, pager, next, jumper"
				:total="tableData.total">
			</el-pagination>

完整前端页面(vue3)

<template>
	<div v-if="1" class="system-dic-container layout-padding">
		<NoticeBar
				text="🎉🎉🔥功能更新: "
			/>
		<el-segmented v-if="true" v-model="value" :options="options" size="default" @change="handleSp(value)" />
		<el-card shadow="hover" class="layout-padding-auto">
			<div v-if="1" class="system-user-search d_flex mb15">
				<div class="search_info mb15">
					<div class="inline_block mb15">
						<span>部门下拉:</span>
						<el-cascader
							v-model="search_params.d"
							:options="alldepartment"
							:props="alldepartmentProps"
							show-all-levels="false"
							placeholder="下拉/输入部门名称"
							filterable
							@change="handleChangeDept"
							/>
					</div>
					<div class="inline_block mb15">
						<span>部门:</span>
							<el-input
								v-model="search_params.department_value"
								style="width: 240px"
								placeholder="请输入部门名称"
								clearable
							/>
					</div>
					<!-- <div class="ml10 inline_block mb15">
						<span>部门成员:</span>
						<el-input
								v-model="search_params.staff_value"
								style="width: 240px"
								placeholder="请输入姓名"
								clearable
							/>
					</div>-->
					<div class="ml10 inline_block mb15">
						<span>流程状态:</span>
						<el-select v-model="search_params.status" :filterable="true" placeholder=""
						style="width: 240px">
						<el-option
						v-for="(item,index) in ['已提交','未提交']"
						:key="index"
						:label="item"
						:value="item"
						/>
					</el-select>
					</div> 
					<div class="ml10 inline_block mb15">
						<span>绩效日期:</span>
						<el-date-picker v-model="search_params.shijian" type="month" placeholder="选择绩效年月"
							@change="slideMonthFun">
						</el-date-picker>
					</div>
				</div>
				<div class="search_btn">
					<el-button size="large" type="primary" class="ml10" @click="searchFun()">
						<el-icon><ele-Search /></el-icon>
						查询
					</el-button>
					<el-button size="large" type="success" class="ml10" @click="resetFun()">
						<el-icon><ele-RefreshRight /></el-icon>
						重置
					</el-button>
				</div>
			</div>
			<el-table id="my-table1" :data="tableData.data" v-loading="tableData.loading" style="width: 100%"
				:height="cardDetailsTableHeight ? cardDetailsTableHeight-100 : 500"
				>
				<!-- <el-table-column type="selection" width="55" /> -->
				<el-table-column type="index" label="序号" width="80" />
				<el-table-column prop="department" label="部门" show-overflow-tooltip></el-table-column>
				<el-table-column prop="position" label="岗位名称" show-overflow-tooltip></el-table-column>
				<el-table-column prop="staffname" label="姓名" show-overflow-tooltip></el-table-column>
				<el-table-column prop="submit" label="状态" show-overflow-tooltip>
					<template #default="scope">
						<el-tag type="success" v-if="scope.row.submit == '已提交'">已提交</el-tag>
						<el-tag type="error" v-else-if="scope.row.submit == '未提交'">未提交</el-tag>
					</template>
				</el-table-column>
				<el-table-column prop="shijian" label="绩效日期" show-overflow-tooltip></el-table-column>
				<el-table-column label="操作" width="150">
					<template #default="scope">
						<el-button size="small" text type="primary"
							@click="preview">查看</el-button>
						<el-button size="small" text type="primary"
							@click="notice">发通知</el-button>
					</template>
				</el-table-column>
			</el-table>
			<el-pagination @size-change="onHandleSizeChange" @current-change="onHandleCurrentChange" class="mt15"
				:pager-count="10" :page-sizes="[10, 20, 30, 50, 100, 200, 500]" v-model:current-page="search_params.pageNum" background
				v-model:page-size="search_params.pageSize" layout="total, sizes, prev, pager, next, jumper"
				:total="tableData.total">
			</el-pagination>
		</el-card>
		<DicDialog ref="dicDialogRef" @refresh="searchFun()" />
	</div>

</template>

<script setup lang="ts" name="systemDic">
import { defineAsyncComponent, reactive, onMounted, ref,nextTick } from 'vue';
import { ElMessage, ElNotification } from 'element-plus';
import { Session } from '/@/utils/storage';
import { formatDate } from '/@/utils/formatTime';
import FileSaver from 'file-saver'
import * as XLSX from 'xlsx';
import { getAlldepartmentlistApi, hrApi } from '/@/api/kpi/index';
// 引入组件
const DicDialog = defineAsyncComponent(() => import('/@/views/hr/dialog/dialogKPITemplate.vue'));
const NoticeBar = defineAsyncComponent(() => import('/@/components/noticeBar/index.vue'));
const value = ref('全部')

const options = ['全部', '已提交', '未提交']
function handleSp(e: any) {
	if (e == '全部') {
		search_params.value.status = ''
		getTableData()
	} else {
		search_params.value.status = e
		getTableData()
	}
}

const alldepartment = ref(null)
// 定义变量内容
const dicDialogRef = ref();
const tableData = reactive({
	data: [],
	total: 0,
	loading: false,
});

// 表格高度
const cardDetailsTableHeight: any = ref()
// 动态设置表格高度
const getCardDetailsTableHeight = () => {
	let tableH = 370; //距离页面下方的高度
	let tableHeightDetil = window.innerHeight - tableH;
	if (tableHeightDetil <= 100) {
		cardDetailsTableHeight.value = 100;
	} else {
		cardDetailsTableHeight.value = window.innerHeight - tableH;
	}
};
// 监听窗口变化动态设置表格高度
window.onresize = () => {
	getCardDetailsTableHeight()
}
// 查询参数
const search_params = ref({
	shijian: formatDate(new Date(), 'YYYY-mm'),
	department_value: '',
	department_id: '',
	staff_value: '',
	status: null,
	d:null,
	pageNum: 1,  //当前页码
	pageSize: 10,  //每页显示数量
})

function preview () {
	ElMessage.info('查看功能尚未开发')
}
function notice () {
	ElMessage.info('通知功能尚未开发')
}


//请求表格数据
const getTableData = async () => {
	tableData.loading = true;
	// 默认加上当前审批者id
	let res = await hrApi().searchNotSubmit(search_params.value)

	tableData.loading = false;
	if (res.code === 1) {
		tableData.data = res.data.data;
		tableData.total = res.data.total;
	} else if (res.code == 0) {
		ElMessage.error(res.msg)
	}
};
// 1、初次渲染,获取部门信息
getdepartmentlistFun()
async function getdepartmentlistFun() {
	getTableData()
}

// 查询
const searchFun = () => {
	getTableData()
}

// 重置
const resetFun = () => {
	search_params.value = {
		shijian: '',
		department_value: '',
		department_id: '',
		staff_value: '',
		status: null,
		d:null,
		pageNum: 1,  //当前页码
		pageSize: 10,  //每页显示数量
	}
	getTableData()
}

// 切换月份
const slideMonthFun = (e: any) => {
	if (e != null) {
		search_params.value.shijian = formatDate(e, 'YYYY-mm');
	}
}

// function changePageFun() {
// 	getTableData()
// }

// 每页显示数量改变
const onHandleSizeChange = (val: number) => {
	search_params.value.pageSize = val;
	getTableData()
};
// 分页改变
const onHandleCurrentChange = (val: number) => {
	search_params.value.pageNum = val;
	getTableData()
};

// const alldepartmentProps = {multiple: true,emitPath:true}
// // 部门下拉改变
const handleChangeDept = (val: any) => {
	search_params.value.department_id = val.join(',');
};
// 页面加载时
onMounted(() => {
	getCardDetailsTableHeight()
	nextTick(() => {
		// console.log('DOM已更新');
	})

	getAlldepartmentlistApi().then((res)=>{
		if(res.code==1){
			alldepartment.value = res.data
		}
	})
});
</script>

<style lang="scss" scoped>
.calculate_status {
	background-color: #fff;
	margin-bottom: 10px;
	border: 1px solid #e4e7ed;
	border-radius: 4px;
	padding: 10px 15px;

	.item_sum {
		display: flex;
		justify-content: space-between;
		align-items: center;
		overflow: hidden;

		.li {
			display: flex;
			flex-direction: column;
			align-items: center;
			padding: 0 5px;

			.label {
				margin-bottom: 7px;
				font-size: 15px;
				color: #7f7f7f;
			}

			.num {
				font-size: 18px;
				color: #535353;

				&.has_num {
					color: #e51515;
					font-weight: bold;
				}
			}
		}
	}
}

.inline_block {
	display: inline-block;
}

.d_flex {
	display: flex;
	flex-wrap: wrap;
}
</style>

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

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

相关文章

学习笔记019——Ubuntu部署tomcat

1、下载Tomcat压缩包。本人下载的版本是&#xff1a;apache-tomcat-8.5.77.tar.gz 2、将压缩包上传到Ubuntu某个目录。 本人存放的目录是 /opt 目录下, 命令解压&#xff1a; ## 解压tomcat压缩包 tar -zxvf apache-tomcat-8.5.77.tar.gz 3、vim打开bin目录的setclasspath…

【JavaSE】(6)抽象类和接口

目录 一、抽象类 1、什么是抽象类 2、抽象类的特点 3、抽象类的作用 4、抽象类示例代码 二、接口 1、什么是接口 2、接口的书写建议 3、接口的特点 4、实现多个接口 5、接口能“忘记类型” 6、接口间的继承 7、接口的应用 7.1、引用类型的比较--Comparable 和 Co…

Git学习教程(更新中)

持续更新完善中… 1 Git简介 1.1 Git是什么&#xff1f; Git是一个开源的分布式版本控制系统&#xff0c;由Linus Torvalds创建&#xff0c;用于有效、高速地处理从小到大的项目版本管理。它能够记录项目文件的变更历史&#xff0c;让多个开发者可以协作开发同一个项目&#…

TON商城与Telegram App:生态融合与去中心化未来的精彩碰撞

随着区块链技术的快速发展&#xff0c;去中心化应用&#xff08;DApp&#xff09;逐渐成为了数字生态的重要组成部分。而Telegram作为全球领先的即时通讯应用&#xff0c;不仅仅满足于传统的社交功能&#xff0c;更在区块链领域大胆探索&#xff0c;推出了基于其去中心化网络的…

〔 MySQL 〕数据类型

目录 1.数据类型分类 2 数值类型 2.1 tinyint类型 2.2 bit类型 2.3 小数类型 2.3.1 float 2.3.2 decimal 3 字符串类型 3.1 char 3.2 varchar 3.3 char和varchar比较 4 日期和时间类型 5 enum和set mysql表中建立属性列&#xff1a; 列名称&#xff0c;类型在后 n…

两行命令搭建深度学习环境(Docker/torch2.5.1+cu118/命令行美化+插件),含完整的 Docker 安装步骤

深度学习环境的配置过于繁琐&#xff0c;所以我制作了两个基础的镜像&#xff0c;希望可以帮助大家节省时间&#xff0c;你可以选择其中一种进行安装&#xff0c;版本说明&#xff1a; base 版本基于 pytorch/pytorch:2.5.1-cuda11.8-cudnn9-devel&#xff0c;默认 python 版本…

免费实时图片编辑工具:MagicQuill

参看&#xff1a; https://huggingface.co/spaces/AI4Editing/MagicQuill 人工智能交互式图像编辑&#xff1a;可以制定涂改增加删除

前端学习八股资料CSS(五)

更多详情&#xff1a;爱米的前端小笔记&#xff0c;更多前端内容&#xff0c;等你来看&#xff01;这些都是利用下班时间整理的&#xff0c;整理不易&#xff0c;大家多多&#x1f44d;&#x1f49b;➕&#x1f914;哦&#xff01;你们的支持才是我不断更新的动力&#xff01;找…

翼鸥教育:从OceanBase V3.1.4 到 V4.2.1,8套核心集群升级实践

引言&#xff1a;自2021年起&#xff0c;翼鸥教育便开始应用OceanBase社区版&#xff0c;两年间&#xff0c;先后部署了总计12套生产集群&#xff0c;其中核心集群占比超过四分之三&#xff0c;所承载的数据量已突破30TB。自2022年10月&#xff0c;OceanBase 社区发布了4.2.x 版…

如何在 Ubuntu 22.04 上安装 ownCloud

简介 ownCloud 是一个开源的个人云存储平台&#xff0c;它允许用户在本地服务器上存储和同步文件&#xff0c;提供了一个类似于 Dropbox 或 Google Drive 的服务&#xff0c;但是更加注重隐私和数据控制。以下是 ownCloud 的一些基础使用简介&#xff1a; 文件存储&#xff1…

使用Mybatis向Mysql中的插入Point类型的数据全方位解析

1. 结果 希望每一个能够看到结果的人都能自己装载进去&#xff01;加油&#xff01; 2.代码 2.1TestMapper import org.apache.ibatis.annotations.*; import java.util.Date; import java.util.List;/*** author Administrator*/ Mapper public interface TestMapper {/*…

web——sqliabs靶场——第六关——报错注入和布尔盲注

这一关还是使用报错注入和布尔盲注 一. 判断是否有sql注入 二. 判断注入的类型 是双引号的注入类型。 3.报错注入的检测 可以使用sql报错注入 4.查看库名 5. 查看表名 6.查看字段名 7. 查具体字段的内容 结束 布尔盲注 结束

鸿蒙实战:页面跳转传参

文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙项目2.2 编写首页代码2.3 新建第二个页面 3. 测试效果4. 实战总结 1. 实战概述 本次实战&#xff0c;学习如何在HarmonyOS应用中实现页面间参数传递。首先创建项目&#xff0c;编写首页代码&#xff0c;实现按钮跳转至第二个页面并…

数据结构(基本概念及顺序表——c语言实现)

基本概念&#xff1a; 1、引入 程序数据结构算法 数据&#xff1a; 数值数据&#xff1a;能够直接参加运算的数据&#xff08;数值&#xff0c;字符&#xff09; 非数值数据&#xff1a;不能够直接参加运算的数据&#xff08;字符串、图片等&#xff09; 数据即是信息的载…

一.安装版本为19c的Oracle数据库管理系统(Oracle系列)

1.数据库版本信息&#xff1a; 版本信息&#xff1a; 或者直接由命令查出来&#xff1a; 2.操作系统的版本信息 3.安装包下载与上传 可以去oracle官网下载也可以从其他人的百度网盘链接中下载&#xff1a; 使用xftp工具或者其他的工具&#xff08;mobaxterm&#xff09;上传到l…

从 IDC 到云原生:稳定性提升 100%,成本下降 50%,热联集团的数字化转型与未来展望

作者&#xff1a;金峰&#xff08;项良&#xff09;、朱永林、赵世振&#xff08;寰奕&#xff09; 公司简介 杭州热联集团股份有限公司成立于 1997 年 10 月&#xff0c;是隶属杭州市实业投资集团的国有控股公司。公司专业从事国际、国内钢铁贸易黑色大宗商品及产业服务&…

说说软件工程中的“协程”

在软件工程中&#xff0c;协程&#xff08;coroutine&#xff09;是一种程序运行的方式&#xff0c;可以理解成“协作的线程”或“协作的函数”。以下是对协程的详细解释&#xff1a; 一、协程的基本概念 定义&#xff1a;协程是一组序列化的子过程&#xff0c;用户能像指挥家…

MinIO 的 S3 over RDMA 计划: 为高速人工智能数据基础设施设定对象存储新标准

随着 AI 和机器学习的需求不断加速&#xff0c;数据中心网络正在迅速发展以跟上步伐。对于许多企业来说&#xff0c;400GbE 甚至 800GbE 正在成为标准选择&#xff0c;因为数据密集型和时间敏感型 AI 工作负载需要高速、低延迟的数据传输。用于大型语言处理、实时分析和计算机视…

怀旧游戏打卡清单(TODO)

感觉忙碌了好久好久&#xff0c;真的好想休息一下。。 整理一下将来休息时候的打卡清单&#xff0c;不工作了去个海边狂打游戏&#xff0c;想想就惬意啊。当然&#xff0c;最好找个work from home&#xff0c;去海边找个酒店上班。挣钱休息两不误。。。 能不能实现另说&#xf…

《Python制作动态爱心粒子特效》

一、实现思路 粒子效果&#xff1a; – 使用Pygame模拟粒子运动&#xff0c;粒子会以爱心的轨迹分布并运动。爱心公式&#xff1a; 爱心的数学公式&#xff1a; x16sin 3 (t),y13cos(t)−5cos(2t)−2cos(3t)−cos(4t) 参数 t t 的范围决定爱心形状。 动态效果&#xff1a; 粒子…