vue+js+Java在分页的el-table里实现上移、下移;置顶

这里写目录标题

    • 一、上移、下移
    • 二、置顶

一、上移、下移

在这里插入图片描述
实现:上移到第一行后不能再上移,下移到最后一行不能下移,以及分页后能上移到前一页,下移能移到后一页;(新增sort排序字段)

<el-table :data="tableData3" style="width: 100%">
  <el-table-column prop="name" label="名称"/>
  <el-table-column label="图片">
    <template #default="scope">
      <viewer>
        <img title="点击查看大图" :src="scope.row.url" style="height:80px;width:120px;cursor: pointer">
      </viewer>
    </template>
  </el-table-column>
  <el-table-column label="操作" width="350">
    <template #default="scope">
      <el-button size="small" class="manage-button" :icon="Upload"
                 @click="up(scope)">上移
      </el-button>
      <el-button size="small" class="manage-button" :icon="Download"
                 @click="down(scope)">下移
      </el-button>
      <el-button size="small" class="manage-button" :icon="Edit"
                 @click="openEdit(scope.row)">编辑
      </el-button>
      <el-button size="small" class="manage-delete-button" :icon="Delete"
                 @click="delete(scope.row.id)">删除
      </el-button>
    </template>
  </el-table-column>
</el-table>
	filter() {
      let data = {
        type: 3,
        fileType: 'c',
        pageNum: this.filterInfo.pageNum,
        pageSize: this.filterInfo.pageSize,
        name: this.filterInfo.name,
      };
      let url = "/Ar/getAll";
      this.$request.post(url, data).then(res => {
        this.filterInfo.total = res.obj.total;
        this.filterInfo.pageNum = res.obj.current;
        this.filterInfo.pageSize = res.obj.size;
        this.filterInfo.pages = res.obj.pages;
        for (let item of res.obj.records) {
          //名为空时显示空
          if (item.name === null || item.name === '') {
            item.name = '空'
          }
          //图片为空时设置一个默认图片
          if (item.url !== null || item.url !== '') {
            item.url = window.location.origin + '/api/' + item.url
          } else {
            item.url = '空'
          }
        }
        this.tableData3 = res.obj.records;
      })
    },

	//上移
    up(item) {
      if (this.filterInfo.pageNum === 1 ||
          this.filterInfo.pageNum > 1 && item.$index > 0) {
        if (item.$index > 0) {
        //调用上移下移接口
          let data = {
            id: item.row.id,
            targetId: this.tableData3[item.$index - 1].id,
          }
          let url = "/Ar/upAr";
          this.$request.postForm(url, data).then(res => {
            if (res === 'success') {
              this.$msg.success('上移成功')
            } else {
              this.$msg.warning('上移失败')
            }
            //分页查询,拿到当前页数据
            this.filter();
          });
        } else {
          ElMessage({
            message: '已经是第一行了',
            type: 'warning'
          })
        }
      } else if (this.filterInfo.pageNum > 1 && item.$index === 0) {
        //如果当前页大于1,从临时表格tableDataTemp里拿targetId
        //如果处在非第一页的第一行,需要跨页上移
        this.tableDataTemp = [];
        //调用分页查询接口,但参数pageNum+1,拿到当前页的上一页数据
        let data = {
          type: 3,
          fileType: 'c',
          pageNum: this.filterInfo.pageNum - 1,
          pageSize: this.filterInfo.pageSize,
        };
        let url = "/Ar/getAll";
        this.$request.post(url, data).then(data => {
          this.tableDataTemp = data.obj.records;
          //调用上移下移接口
          let data1 = {
            id: item.row.id,
            targetId: this.tableDataTemp[this.filterInfo.pageSize-1].id,
          }
          let url1 = "/Ar/upAr";
          this.$request.postForm(url1, data1).then(res => {
            if (res === 'success') {
              this.$msg.success('上移成功')
            } else {
              this.$msg.warning('上移失败')
            }
            //分页查询,拿到当前页数据
            this.filter();
          })
        })
      }
    },


	//下移
    down(item) {
      if (this.filterInfo.pageNum === this.filterInfo.pages ||
          this.filterInfo.pageNum===1 && item.$index < this.tableData3.length-1){
        //如果只有一页或者处在最后一页,或者处在第一页非最后一行:当前表格长度决定最后一行
        if(item.$index < this.tableData3.length-1){
        //调用上移下移接口
          let data={
            id: item.row.id,
            targetId:this.tableData3[item.$index+1].id,
          }
          let url = "/Ar/upAr";
          this.$request.postForm(url,data).then(res => {
            if(res === 'success'){
              this.$msg.success('下移成功')
            }else {
              this.$msg.warning('下移失败')
            }
            //分页查询,拿到当前页数据
            this.filter();
          });
        }else {
          ElMessage({
            message: '已经是最后一行了',
            type: 'warning'
          })
        }
      }else {
        //从临时表格tableDataTemp里拿targetId
        //临时表格的pageNum是表格的pageNum+1,从而拿到表格下一页的第一行数据;需要跨页下移
        this.tableDataTemp = [];
        //调用分页查询接口,但参数pageNum+1,拿到当前页的下一页数据
        let data = {
          type: 3,
          fileType: 'c',
          pageNum:this.filterInfo.pageNum+1,
          pageSize:this.filterInfo.pageSize,
        };
        let url = "/Ar/getAll";
        this.$request.post(url,data).then(data=>{
          this.tableDataTemp = data.obj.records;
          //调用上移下移接口
          let data1={
            id: item.row.id,
            targetId: this.tableDataTemp[0].id,
          }
          let url1 = "/Ar/upAr";
          this.$request.postForm(url1,data1).then(res => {
            if(res === 'success'){
              this.$msg.success('下移成功')
            }else {
              this.$msg.warning('下移失败')
            }
            //分页查询,拿到当前页数据
            this.filter();
          })
        })
      }
    }

实体类:

	public class Ar {
        //id自增长
        @TableId(value = "id",type = IdType.AUTO)
        private Integer id;
        private String name;//官网名称
        private String url;
        private Integer sort;//排序(默认与id值一样)
        private Integer type;
        private String fileType;
        private String state;
        private Date createdDate;
        private Date stateDate;

        //不是数据库字段,标记不存在
        @TableField(exist = false)
        private Integer pageSize;
        @TableField(exist = false)
        private Integer pageNum;
}

Controller:

	/**
     * @Description:上移/下移
     **/
    @PostMapping("/upAr")
    public String upArDownLoad(@RequestParam(value = "id") Integer id,
                               @RequestParam(value = "targetId") Integer targetId) throws Exception{
        try{
            return arService.upAr(id,targetId);
        }catch (Exception e){
            e.printStackTrace();
            return "fail";
        }
    }

Service:

String upAr(Integer id,Integer targetId);

Impl:

	/**
     * @Description:上移/下移
     **/
    @Override
    public String upAr(Integer id,Integer targetId) {
        // 获取当前记录和前一个记录
        Ar currentRecord = arMapper.selectById(id);
        Ar previousRecord = arMapper.selectById(targetId);
        // 检查记录是否存在
        if (currentRecord == null || previousRecord == null) {
            // 如果任一记录不存在,返回错误信息或处理异常
            return "Record not found";
        }
        // 交换sort排序字段
        Integer sort = currentRecord.getSort();
        currentRecord.setSort(previousRecord.getSort());
        previousRecord.setSort(sort);

        // 更新数据库中的记录
        arMapper.updateById(currentRecord);
        arMapper.updateById(previousRecord);

        // 返回成功信息
        return "success";
    }

二、置顶

实现:新增top排序字段,数据先按照top值降序排序,然后按照id降序排序;
查询核心代码:

	<select id="getAll" resultType="org.jit.sose.entity.ag.Ar">
        select id, title, is_top as isTop ,created_date as createdDate, user_id as userId, type
        from ar
        where state != 'X' and type = 1
        <if test="date != null and date != ''">
            and date(created_date) = #{date}
        </if>
        <if test="isTop != null and isTop != ''">
            and is_top = #{isTop}
        </if>
        ORDER BY is_top DESC,id desc
    </select>

	<insert id="insertA" parameterType="org.jit.sose.entity.ag.Ar" useGeneratedKeys="true" keyProperty="id">
        insert into ar (title,is_top,user_Id,type) values (#{title},#{isTop},#{userId},#{type})
    </insert>

置顶核心代码:
前端传参数isTop值,默认为0,即不是置顶,为1即置顶;
根据isTop为0或1判断是否置顶;

	@Override
    public String update(Ar ar) {
        //isTop为1即置顶
        if (ar.getIsTop().equals(1)) {
            // 拿到当前isTop的最大值
            Integer isTopMax = arMapper.getMaxIsTop();
            // 如果当前isTop的最大值是0,说明还没有文稿置顶
            if (isTopMax.equals(0) || isTopMax==null) {
                // 当前isTop值为 1
                ar.setIsTop(1);
            } else {
                // 否则当前isTop值就是最大值加1
                ar.setIsTop(isTopMax + 1);
            }
        }
        //id是为空即新增;id不为空即为修改
        if(ar.getId() == null){
            arMapper.insertA(ar);
            return "success";
        }else{
            arMapper.updateById(ar);
            return "success";
        }

    }

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

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

相关文章

计算机因进程结束导致白屏

问题场景&#xff1a; 计算机卡顿利用&#xff08;右击计算机桌面底部任务栏->打开任务管理器->结束任务->或进程被意外结束导致白屏&#xff09; 问题描述 白屏 原因分析&#xff1a; 在结束进程时&#xff0c;导致 文件资源管理器 进程崩溃。 解决方案&#xf…

【YashanDB知识库】如何在备机节点上做备份和恢复

本文内容来自YashanDB官网&#xff0c;原文内容请见 https://www.yashandb.com/newsinfo/7817898.html?templateId1718516 问题现象 一主一备情况下&#xff0c;主机需要支持常规业务&#xff0c;为了不影响业务&#xff0c;在备机做备份恢复的场景。 问题的风险及影响 1、…

【Linux-多线程】线程互斥(锁和它的接口等)

一、线程互斥 我们把多个线程能够看到的资源叫做共享资源&#xff0c;我们对共享资源进行保护&#xff0c;就是互斥 1.多线程访问问题 【示例】见一见多线程访问问题&#xff0c;下面是一个抢票的代码&#xff0c;共计票数10000张&#xff0c;4个线程去抢 之前我们展示过封…

Kafka中的Topic和Partition有什么关系?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka中的Topic和Partition有什么关系&#xff1f;】面试题。希望对大家有帮助&#xff1b; Kafka中的Topic和Partition有什么关系&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Apache Kafka 中&#…

leetcode108:将有序数组转化为二叉搜索树

给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9] 也将被视为正确…

MyBatis执行一条sql语句的流程(源码解析)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 MyBatis执行一条sql语句的流程&#xff08;源码解析&#xff09; MyBatis执行sql语句的流程加载配置文件加载配置文件的流程 创建sqlsessionFactory对象解析Mapper创建sqlses…

python23-常用的第三方库01:request模块-爬虫

requests 模块是 Python 中的一个第三方库&#xff0c;用于发送 HTTP 请求。 它提供了一个简单且直观的 API&#xff0c;使得发送网络请求和解析响应变得非常容易。requests 模块支持各种 HTTP 方法&#xff0c;如 GET、POST、PUT、DELETE 等&#xff0c;并且具有处理 cookies…

TTL 传输中过期问题定位

问题&#xff1a; 工作环境中有一个acap的环境&#xff0c;ac的wan口ip是192.168.186.195/24&#xff0c;ac上lan上有vlan205&#xff0c;其ip子接口地址192.168.205.1/24&#xff0c;ac采用非nat模式&#xff0c;而是路由模式&#xff0c;在上级路由器上有192.168.205.0/24指向…

前端超大缓存IndexDB、入门及实际使用

文章目录 往期回顾项目实战初始化表获取列表新增表的数据项获取详情根据ID获取详情根据其他字段获取详情 删除数据 总结 往期回顾 在之前的文章中&#xff0c;我们介绍了IndexDB vs Cookies vs Session这几个的对比&#xff0c;但是没有做实际项目的演示&#xff0c;今天我们用…

vue3学习笔记(11)-组件通信

1.props 父传子 子传夫 父传子 接收用defineProps([]) 空字符串也是假 2.自定义事件 $event:事件对象 ref定义的数据在模板里面引用的时候可以不用.value 3.子传父 宏函数 触发事件 声明事件 defineEmits() 挂载之后3s钟触发 4.命名 肉串命名 5.任意组件通信 mitt pubs…

【高阶数据结构】红黑树封装map、set

红黑树封装map、set 1.源码及框架分析2.模拟实现map和set1.支持 insert 的实现2.支持 iterator 的实现3.map支持 operator [] 的实现 3.总代码1.RBTree.h2.Myset.h3.Mymap.h4.Test.cpp 1.源码及框架分析 SGI-STL30版本源代码&#xff0c;map和set的源代码在map/set/stl_map.h/…

多模态论文笔记——Coca

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍多模态模型Coca&#xff0c;在DALLE 3中使用其作为captioner基准模型的原因和优势。 文章目录 ALBEF论文模型结构组成训练目标 CoCa​论文模型结构CoCa…

WebGL之Tree.js

tree基于WebGL的库绘制展示3D图形使用场景包括: 网页游&#xff1a;创建交互式的3D游戏&#xff0c;提供沉浸式的游戏体验。数据可视&#xff1a;将复杂的数据以3D形式展示&#xff0c;便于用户理解和分析。产品展&#xff1a;在电商网站上展示产品的3D模型&#xff0c;提供更…

基于PyQt5的UI界面开发——图像与视频的加载与显示

介绍 这里我们的主要目标是实现一个基于PyQt5和OpenCV的图像浏览和视频播放应用。用户可以选择本地的图像或视频文件夹&#xff0c;进行图像自动播放和图像切换以及视频播放和调用摄像头等操作&#xff0c;并且支持图像保存功能。项目的核心设计包括文件路径选择、图像或视频的…

数据结构与算法之动态规划: LeetCode 62. 不同路径 (Ts版)

不同路径 https://leetcode.cn/problems/unique-paths/description/ 描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “…

java自定义注解对枚举类型参数的校验

目录 1.前提准备条件 1.1 pom.xml文件依赖: 1.2 枚举类&#xff1a; 1.3 controller接口&#xff1a; 1.4 实体参数&#xff1a; 1.5 knife4j的配置 2.实现要求 3.实现步骤 3.1 自定义注解类&#xff1a; 3.2 使用注解&#xff1a; 3.3 添加注解校验类&#xff1a; …

Type c系列接口驱动电路·内置供电驱动电路使用USB2.0驱动电路!!!

目录 前言 Type c常见封装类型 Type c引脚功能详解 Type c常见驱动电路详解 Type c数据手册 ​​​​​​​ ​​​​​​​ 编写不易&#xff0c;仅供学习&#xff0c;请勿搬运&#xff0c;感谢理解 常见元器件驱动电路文章专栏连接 LM7805系列降压芯片驱动电路…

Mybatis 01

JDBC回顾 select 语句 "select *from student" 演示&#xff1a; 驱动包 JDBC 的操作流程&#xff1a; 1. 创建数据库连接池 DataSource 2. 通过 DataSource 获取数据库连接 Connection 3. 编写要执⾏带 ? 占位符的 SQL 语句 4. 通过 Connection 及 SQL 创建…

基础数据结构--二叉树

一、二叉树的定义 二叉树是 n( n > 0 ) 个结点组成的有限集合&#xff0c;这个集合要么是空集&#xff08;当 n 等于 0 时&#xff09;&#xff0c;要么是由一个根结点和两棵互不相交的二叉树组成。其中这两棵互不相交的二叉树被称为根结点的左子树和右子树。 如图所示&am…

协议幻变者:DeviceNet转ModbusTCP网关开启机器手臂智能新纪元

技术背景DeviceNet是一种广泛应用于工业自动化领域的现场总线标准&#xff0c;它能够实现控制器与现场设备之间的高效通信&#xff0c;常用于连接各种传感器、执行器以及其他工业设备&#xff0c;如机器人、电机驱动器等&#xff0c;具有实时性强、可靠性高的特点。而ModbusTCP…