vue+elementui前端分页展示且需要根据指定字段合并单元格,后端需要指定pagehelper分页插件分页位置

前端效果图
在这里插入图片描述

后端操作

首先根据需要合并的字段进行分组且分页查询,然后再连表查询。

注意这里与常规的分页查询不同,常规的分页查询是对整个sql语句执行完之后,对整个结果进行分页处理,而我们这里需要先对分组之后的结果进行分页处理。所以需要改变分页的逻辑。代码如下:

首先继承MySqlDialect,重写getPageSql方法,主要思路对sql语句进行字符串替换,在指定位置进行分页逻辑拼接

public class MySqlDialectCustom extends MySqlDialect {
    @Override
    public String getPageSql(String sql, Page page, CacheKey pageKey) {
        Pattern compileFixed = Pattern.compile("/\\*fixed\\*/");
        String compileLimit = "/\\*limit\\*/";

        if (compileFixed.matcher(sql).find()) {
            if (page.getStartRow() == 0) {
                sql = sql.replaceFirst(compileLimit, " LIMIT ? ");
            } else {
                sql = sql.replaceFirst(compileLimit, " LIMIT ?, ? ");
            }
            return sql;
        }
        return super.getPageSql(sql, page, pageKey);
    }
}

修改配置文件加上配置

# PageHelper分页插件
pagehelper:
  helperDialect: xxx.xxx.util.MySqlDialectCustom #上面类的全限定类名

在需要修改分页位置的地方加入占位标志即可;比如按照本例,是根据日期和工号进行合并操作。所以需要先根据日期和工号进行分组操作得到组数据再进行分组操作然后将得到的结果当做一张子表再和原表进行内连接操作得到其他需要的字段

    <select id="selectPieceworkInfoList" parameterType="PiecewortInfoDTO" resultType="PieceworkInfoVO">
        /*fixed*/
        select rpi.id, rpi.piecework_date, rpi.product_id, dept_thrid_id, dept_fourth_id, rpi.staff_id,temp.pieceworkFee
        from rfw_piecework_info rpi
        INNER join (SELECT staff_id,piecework_date, sum(unit_price*capacity_num) as pieceworkFee FROM rfw_piecework_info
        GROUP BY staff_id, piecework_date /*limit*/) temp on rpi.staff_id=temp.staff_id and
        rpi.piecework_date=temp.piecework_date
        order by rpi.piecework_date,rpi.staff_id
    </select>

这样操作之后得到的结果确实是按分组之后的结果进行了分页处理,比如一页10条数据,上述sql一般会查询出大于10条的数据,然后经过前端处理之后合并成10条数据进行展示。

注意:上述查询的结果确实进行了分页处理,但是插件自带的总数配置还是整个sql语句的总数 不是我们分组分页之后的总数,所以需要额外再写一条sql统计分组之后的总条数

前端处理

主要使用elementui的table组件的span-method方法进行合并单元格处理

以下是通义千问提供的代码示例,可直接运行本地查看调整效果,并参考改造自己的代码

问:假设前端elementui有个table组件,里面有日期,工号,产品字段,现在需要根据日期和工号字段进行合并操作,产品不合并还是多行展示,如果日期和工号相同,就合并日期和工号使用table的span-method,生成完整的vue文件

答:

<template>
  <div id="app">
    <el-table
      :data="tableData"
      style="width: 100%"
      border
      :span-method="arraySpanMethod"
    >
      <el-table-column prop="date" label="日期" width="180"></el-table-column>
      <el-table-column prop="workNo" label="工号" width="180"></el-table-column>
      <el-table-column prop="product" label="产品"></el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  name: 'App',
  data() {
    return {
      tableData: [
        { date: '2023-04-01', workNo: '001', product: 'Product A' },
        { date: '2023-04-01', workNo: '001', product: 'Product B' },
        { date: '2023-04-02', workNo: '002', product: 'Product C' },
        { date: '2023-04-03', workNo: '003', product: 'Product D' },
        { date: '2023-04-03', workNo: '003', product: 'Product E' },
      ],
    };
  },
  methods: {
    arraySpanMethod({ row, column, rowIndex, columnIndex }) {
      // 仅针对日期和工号列进行处理
      if (columnIndex < 2) {
        const currentKey = `${row.date}-${row.workNo}`;
        const prevRow = rowIndex > 0 ? this.tableData[rowIndex - 1] : null;
        const prevKey = prevRow ? `${prevRow.date}-${prevRow.workNo}` : '';

        // 如果当前行与上一行的日期和工号相同,则计算需要的rowspan
        if (currentKey === prevKey) {
          // 由于我们不希望产品列合并,直接返回让当前列为非展示状态即可
          return { rowspan: 0, colspan: 0 };
        } else {
          // 查找相同日期和工号的连续行数
          let rowspan = 1;
          while(rowIndex + rowspan < this.tableData.length &&
          `${this.tableData[rowIndex + rowspan].date}-${this.tableData[rowIndex + rowspan].workNo}` === currentKey) {
            rowspan++;
          }
          return { rowspan, colspan: 1 };
        }
      }
      // 对于产品列,不需要特殊处理,直接返回默认的单个单元格
      return { rowspan: 1, colspan: 1 };
    },
  },
};
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

效果图如下:

在这里插入图片描述

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您提供一些基本的代码模板。 首先,您需要Vue项目中安装Element UI并导入相关组件。你可以使用npm安装Element UI: ``` npm i element-ui -S ``` 接下来,您需要vue组件中导入Element UI的分页组件: ```javascript <template> <div> <el-table :data="tableData"> // 表格列 </el-table> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage" :page-sizes="[10, 20, 30, 50]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination> </div> </template> <script> import { Table, Pagination } from 'element-ui'; export default { components: { Table, Pagination }, data() { return { tableData: [], currentPage: 1, pageSize: 10, total: 0 } }, methods: { fetchData() { // 向后端请求数据 }, handleSizeChange(val) { this.pageSize = val; this.fetchData(); }, handleCurrentChange(val) { this.currentPage = val; this.fetchData(); } }, mounted() { this.fetchData(); } } </script> ``` 在上述代码中,`Table`和`Pagination`是导入的组件,`tableData`是表格数据,`currentPage`和`pageSize`是当前页码和每页显示的数据条数,`total`是总数据量。在`el-pagination`标签中,我们绑定了`size-change`和`current-change`事件,分别对应每页显示的数据条数和当前页码的改变。在`handleSizeChange`和`handleCurrentChange`方法中,我们可以进行数据请求,刷新表格数据。 当然,上述代码只是一个简单的示例,您需要根据您的具体需求进行相应的改动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值