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

实现效果如下:

重点:使用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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue使用List.reduce实现统计

需要对集合的某些元素的值进行计算时&#xff0c;可以在计算属性中使用forEach方法 1.语法&#xff1a;集合.reduce ( ( 定义阶段性累加后的结果 , 定义遍历的每一项 ) > 定义每一项求和逻辑执行后的返回结果 , 定义起始值 ) 2、简单使用场景&#xff1a;例如下面…

Spring Boot汽车资讯:科技与速度的交响

3系统分析 3.1可行性分析 通过对本汽车资讯网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本汽车资讯网站采用SSM框架&#xff0c;JAVA作为开发语言&#…

前端页面自适应等比例缩放 Flexible+rem方案

在移动互联网时代&#xff0c;随着智能手机和平板电脑的普及&#xff0c;前端开发者面临的一个重要挑战是如何让网页在不同尺寸和分辨率的设备上都能良好地显示。为了应对这一挑战&#xff0c;阿里巴巴的前端团队开发了 flexible.js&#xff0c;旨在提供一种简单有效的解决方案…

记录一下在原有的接口中增加文件上传☞@RequestPart

首先&#xff0c;咱声明一下&#xff1a; RequestBody和 MultipartFile 不可以 同时使用&#xff01;&#xff01;&#xff01; 因为这两者预期的请求内容类型不同。RequestBody 预期请求的 Content-Type 是 application/json 或 application/xml&#xff0c;而 MultipartFile …

HTML5实现剪刀石头布小游戏(附源码)

文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面 2.效果和源码源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/143798520 HTM…

[Qt platform plugin问题] Could not load the Qt platform plugin “xcb“

Qt platform plugin 是 Qt 应用程序启动时加载的插件。不同的平台有不同的插件。 常见的插件有:linuxfb Wayland xcb 简单来说就是启动一个GUI程序, 离不开这些插件.选择其中一个就好 出现这个问题要么就是没有插件&#xff0c;要么就是插件依赖的库没有。 要么就是插件选则的…

【qt】控件2

1.frameGeometry和Geometry区别 frameGeometry是开始从红圈开始算&#xff0c;Geometry从黑圈算 程序证明&#xff1a;使用一个按键&#xff0c;当按键按下,qdebug打印各自左上角的坐标&#xff08;相当于屏幕左上角&#xff09;&#xff0c;以及窗口大小 Widget::Widget(QWid…

Idea中创建和联系MySQL等数据库

备注&#xff1a;电脑中要已下好自己需要的MySQL数据库软件 MySQL社区版下载链接&#xff1a; https://dev.mysql.com/downloads/installer/ 优点&#xff1a; 1.相比与在命令行中管理数据库&#xff0c;idea提供了图形化管理&#xff0c;简单明了&#xff1b; 2.便于与后端…

【Unity】网格系统:物体使用网格坐标定位

需求分析 前面物体放置在地板上都是地板任意位置放置&#xff0c;本节开始对物体放置的位置做限制。 建立网格&#xff0c;网格可以设置起始世界坐标、单元格大小和规格&#xff1b;单元格中包括内部物体的信息&#xff1b;物体的位置通过网格的坐标确定&#xff1b;单元格中…

网络协议(4)拥塞控制

之前已经说过了tcp也是会考虑网络的情况的&#xff0c;也就是当网络出现问题的时候tcp不会再对报文进行重传。当所有的用户在网络不好的时候都不会对丢失的报文进行重传。这样就会防止网络瘫痪。 这样的机制也就是tcp会进行拥塞控制。 拥塞控制 所谓的慢启动看下面这张图就能…

集群聊天服务器(8)用户登录业务

目录 登录状态业务层代码数据模型层代码记录用户的连接信息以及线程安全问题客户端异常退出业务 登录状态 登录且状态变为online 业务层代码 #include "chatservice.hpp" #include "public.hpp" #include <string> #include <muduo/base/Loggi…

生成自签名证书并配置 HTTPS 使用自签名证书

生成自签名证书 1. 运行 OpenSSL 命令生成证书和私钥 在终端中输入以下命令&#xff0c;生成自签名证书和私钥文件&#xff1a; sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout self_signed.key -out self_signed.pem-x509&#xff1a;生成自签名证书。…

鸿蒙HarmonyOS 地图定位到当前位置 site查询等操作

应用服务Map使用 地图定位 地点查询及导航 周边查询 点位标记定义等 地图定位 前提地图已经能正常显示&#xff0c;若不能显示请大家参考之前的那篇如何显示地图的博文 地图相关的api 位置效果图&#xff1a; module.json5配置权限 "requestPermissions": [{&…

matlab-fmincon函数做优化、optimoptions用法

定义&#xff1a; x fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) 含义&#xff1a;从 x0 开始&#xff0c;尝试在满足线性等式 Aeq*x beq 以及不等式 A*x ≤ b、 c(x) ≤ 0 和 ceq(x) 0 的情况下寻找 fun 中所述的函数的最小值点 x。对 x 中的设计变量定义一组下界…

prop校验,prop和data区别

prop:组件上注册的一些自定义属性 prop作用&#xff1a;向子组件传递数据 特点&#xff1a; 可以传递任意数量&#xff0c;任意类型的prop 父组件 &#xff08;一个个地传递比较麻烦&#xff0c;可以直接打包成一个对象传过去&#xff0c;然后通过点属性接收&#xff09; <t…

K8S containerd拉取harbor镜像

前言 接前面的环境 K8S 1.24以后开始启用docker作为CRI&#xff0c;这里用containerd拉取 参考文档 正文 vim /etc/containerd/config.toml #修改内容如下 #sandbox_image "registry.aliyuncs.com/google_containers/pause:3.10" systemd_cgroup true [plugins.…

ClickHouse的介绍、安装、数据类型

1、介绍和安装 1.1、简介 ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库&#xff08;DBMS&#xff09;&#xff0c;使用C语言编写&#xff0c;主要用于在线分析处理查询&#xff08;OLAP&#xff09;&#xff0c;能够使用SQL查询实时生成分析数据报告。 OLAP&…

Websocket如何分块处理数据量超大的消息体

若我们服务端一次性最大处理的字节数是1M,而客户端发来了2M的数据&#xff0c;此时服务端的数据就要被切割成两次传输解码。Http协议中有分块传输&#xff0c;而在Websocket也可以分块处理超大的消息体。在jsr356标准中使用javax.websocket.MessageHandler.Partial可以分块处理…

卡尔曼滤波学习资料汇总

卡尔曼滤波学习资料汇总 其实&#xff0c;当初的目的&#xff0c;是为了写 MPU6050 的代码的&#xff0c;然后不知不觉学了那么多&#xff0c;也是因为好奇、感兴趣吧 有些还没看完&#xff0c;之后笔记也会同步更新的 学习原始材料 【卡尔曼滤波器】1_递归算法_Recursive P…

Javaweb-day13事务管理AOP

spring的事务管理&spring框架的第二大核心AOP面向切面编程 spring框架的第一大核心是前面讲的IOC控制反转 事务管理 事务回顾 概念&#xff1a;事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;这些操作要么同时成功&#xff0c;要么同时失败。…