拖动排序与置顶的Java实现

文章目录

  • 1、需求分析
  • 2、表设计
  • 3、接口设计
  • 4、业务层
  • 5、数据层

整理个需求的实现思路。

1、需求分析

列表展示了一系列产品,现要支持通过拖动来给产品排序,也要支持单个产品的置顶、删除。类似CSDN的专栏文章管理。

在这里插入图片描述

2、表设计

现要支持对列表的产品进行拖动排序,考虑新增个hot_sort字段,代表产品的先后顺序(或者热门程度)。关于表设计,可在原来的 t_product表中直接新加个hot_sort字段。如果有其他业务字段,也可新建个中间表,核心字段:t_product表的product_id、热门排序字段hot_sort、其余业务字段。

//示例
ALTER TABLE t_product ADD hot_sort INT;
//值越小越靠前

3、接口设计

关于接口实现,考虑让前端传两个productId,一个是被移动的产品的ID(productId),一个则是移动目标点的产品的ID(afterProductId)。如此,通过比较这两个ID对应产品的hot_sort字段值的大小关系,就可一个接口实现前移、后移、置顶:

  • targetProductId传空,置顶
  • afterProductId > productId,后移
  • afterProductId < productId,前移

以下为示意代码:

//Dto类
@Data
@ToString
public class SortDto {private String afterProductId;private String productId;}

Controller:

@Resource
private Service service;/*** 拖动排序:前移、后移、置顶*/
@PostMapping("/update/sort")
public Result updateSort(@RequestBody SortDto dto) {return Result.success(service.updateProductSort(dto));}/*** 删除产品*/@GetMapping("/delete")
public Result updateSort(String productId) {return Result.success(service.deleteProduct(productId));}

4、业务层

Service层,直接写实现类:

@Resource
private ProductMapper mapper;public class ServiceImpl implements Service {@Overridepublic int updateProductSort(SortDto dto) {//必要的参数和权限校验,略...//被移动的产品ProductPo targetPo = mapper.selectById(dto.getProductId);Assert.notNull(targetPo);//用于更新的产品对象ProductPo updatePo = new ProductPo();updatePo.setId(targetPo.getProductId);   //其他属性略,可直接BeanUtils.copyProperties()//afterProductId为空,代表置顶操作//非置顶if (StringUtils.isNotEmpty(dto.getAfterProductId)){//移动目标点的产品IDProductPo afterPo = mapper.selectById(dto.getAfterProductId);Assert.notNull(afterPo);//前移if (afterPo.getHotSort() < targetPo.getHotSort() && targetPo.getHotSort() - afterPo.getHotSort() > 1) {//产品前移,受影响的产品要后移mapper.moveBack(afterPo.getHotSort(), targetPo.getHotSort());//被移动的产品放到目标位置的产品之后updatePo.setHotSort(afterPo.getHotSort() + 1 );return mapper.updateById(updatePo);//后移} else if (afterPo.getHotSort() > targetPo.getHotSort() && afterPo.getHotSort() - targetPo.getHotSort() > 1) {//产品后移,受影响的产品要前移mapper.moveBefore(afterPo.getHotSort(), targetPo.getHotSort());//被移动的产品放到目标位置的产品之后,但此时目标位置的产品已经前进一步,这里不再需要+1updatePo.setHotSort(afterPo.getHotSort());return mapper.updateById(updatePo);			}} else {//置顶mapper.moveTop(targetPo.getHotSort);   //处理因置顶产品而受影响的其他产品的sort值updatePo.setHotSort(0);  //赋0,置顶return mapper.updateById(updatePo);}return 1;  //如果两个Id都一样,也不用处理,直接返回个操作成功也无所谓}@Overridepublic int deleteProduct(String productId) {//必要的业务和权限校验,略ProductPo po = mapper.selectById(productId);Assert.notNull(po);int size = mapper.selectCount(new QueryWrapper<>());//让被删产品后面的产品全部前进一格mapper.moveBefore(size,po.getHotSort());return mapper.deleteById(productId);}}

5、数据层

Mapper接口略,相关SQL:

在这里插入图片描述

<update id="moveBack" parameterType="int">update t_productset hot_sort = hot_sort + 1where hot_sort &gt; #{beforeSort}and hot_sort &lt; #{moveSort}
</update><update id="moveBefore" parameterType="int">update t_productset hot_sort = hot_sort - 1where hot_sort &gt; #{moveSort}and hot_sort &lt;= #{beforeSort}
</update><update id="moveTop" parameterType="int">update t_productset hot_sort = hot_sort + 1where hot_sort &lt; #{moveSort}
</update>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

融入Facebook的世界:探索数字化社交的魅力

融入Facebook的世界&#xff0c;是一场数字化社交的奇妙之旅。在这个广袤的虚拟社交空间中&#xff0c;人们可以尽情展现自己、分享生活&#xff0c;与全球朋友、家人和同事保持紧密联系&#xff0c;共同探索社交互动的乐趣与魅力。让我们深入了解这个世界的魅力所在&#xff1…

ASP.NET-Server.HtmlEncode

目录 背景: 1.转义特殊字符&#xff1a; 2.防止跨站脚本攻击&#xff08;XSS&#xff09;&#xff1a; 3.确保输出安全性&#xff1a; 4.保留原始文本形式&#xff1a; 5.与用户输入交互安全&#xff1a; 实例说明: 不用Server.HtmlEncode 效果展示: 用Server.HtmlEnc…

多场成像,快速提高机器视觉检测能力--51camera

多阵列CMOS传感器与芯片级涂层二向色滤光片相结合&#xff0c;可在单次扫描中同时捕获明场、暗场和背光图像。 多场成像是一种新的成像技术&#xff0c;它可以在不同的光照条件下同时捕获多幅图像。再加上时间延迟积分(TDI)&#xff0c;这种新兴的成像技术可以克服许多限制的传…

【敬伟ps教程】视频动画

文章目录 视频文档视频时间轴帧动画视频文档 工作区需由[基本功能]切换为[动感] 可以看到我们需从时间的维度来编辑动态视觉图像 时间轴:从时间的维度来编辑动态视觉图像 PS提供的时间轴有两种:1、视频时间轴;2、动画时间轴 新建视频文档,点击新建或Ctrl+N,预设选择“胶…

springboot276基于JS的个人云盘管理系统的设计与实现

个人云盘管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装个人云盘管理系统软件来发挥其…

3.自定义工程目录配置CMakeLists

问题背景 熟悉stm32keil开发的都知道&#xff0c;我们在编写不同的外设时&#xff0c;通常都会单独编写一个app文件夹或者是user文件夹之类的来存放不同外设功能的源文件和头文件。 在前面一节2.构建第一个工程并烧录到ESP32开发板-CSDN博客中&#xff0c;我们是使用了一个乐鑫…

【联邦学习贡献评估-参与方贡献评估方案的介绍】

在明确如何度量参与方组合数据价值的基础上, 本篇介绍如何进一步度量参与方在联邦合作中的贡献, 具体介绍如下 4 种参与方贡献评估方案. 个体法 将参与方自身数据的价值度量或者相关变体作为该参与方的贡献. 个体法可以基于任何 数据价值度量指标进行, 特别地, 有个体信誉、个…

Python面试笔记

Python面试笔记 PythonQ. Python中可变数据类型与不可变数据类型&#xff0c;浅拷贝与深拷贝详解Q. 解释什么是lambda函数&#xff1f;它有什么好处&#xff1f;Q. 什么是装饰器&#xff1f;Q. 什么是Python的垃圾回收机制&#xff1f;Q. Python内置函数dir的用法&#xff1f;Q…

SpringBoot整合Activiti7——实战之请假流程(普通)

文章目录 代码实现xml文件部署流程启动流程查询任务填写请假单部门审批 请假流程&#xff1a;开始-填写请假单-部门审批-结束 代码实现 xml文件 <?xml version"1.0" encoding"UTF-8"?> <definitions xmlns"http://www.omg.org/spec/BPMN/…

服务器段的连接端口和监听端口编程实现

new ServerSocket(int)是开启监听端口&#xff0c;并不是连接端口。真正的连接端口是随机开辟的空闲端口&#xff0c;当连接创建完成后&#xff0c;监听关口可以继续等待下一次连接请求&#xff0c;处于空闲等待状态。 编程实现方式 1 、主线程一直处于阻塞等待状态&#xff0c…

编程高级陷阱-破坏原有生态

今天聊点有意思的&#xff0c;昨天写了一个链表翻转&#xff0c;说一说里面大家会遇到的坑&#xff0c;具体可以看 教你三指针拿捏链表翻转-CSDN博客 有这样一个场景&#xff0c;给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回…

汇总全网免费API,持续更新(新闻api、每日一言api、音乐。。。)

Public&FreeAPI 网址&#xff1a;apis.whyta.cn &#xff08;推荐&#xff09; UomgAPI 网址&#xff1a;https://api.uomg.com 教书先生 网址&#xff1a;https://api.oioweb.cn/ 山海API https://api.shserve.cn/ 云析API铺 https://api.a20safe.com/ 韩小韩…

提交数据加快百度搜索引擎收录

百度站长工具做了更新&#xff0c;百度收录的地址分享如下&#xff0c;新站点提交后&#xff0c;可以加快百度收录。 普通收录_加快网站内容抓取&#xff0c;快速提交数据工具_站长工具_网站支持_百度搜索资源平台普通收录工具可实时向百度推送数据&#xff0c;创建并提交site…

【Git】Github 上commit后,绿格子contribution却不显示?不知道怎么弥补?解决方法在这里

github 上commit后&#xff0c;绿格子&#xff08;contribution&#xff09;却不显示 问题描述 今天一直在github上面commit代码&#xff0c;但是github中并没有显示自己的contribution&#xff08;没有绿色的格子&#xff09;&#xff0c;全是空白&#xff0c;网上一查是因为…

tcp/ip协议2实现的插图,数据结构8 (30 - 32章)

(201) 201 三十0 中断优先级补充 (202) 202 三十1 TCP的用户需求 函tcp_usrreq一 (203) 203 三十2 TCP的用户需求 函tcp_usrreq二 (204) 204 三十3 TCP的用户需求 函tcp_usrreq三 (205) 205 三十4 TCP的用户需求 函tcp_usrreq四 (206) 206 三十5 TCP的用户需求 函tcp_usrreq五 …

Python爬虫:原理与实战

引言 在当今的信息时代&#xff0c;互联网上的数据如同浩瀚的海洋&#xff0c;充满了无尽的宝藏。Python爬虫作为一种高效的数据抓取工具&#xff0c;能够帮助我们轻松地获取这些数据&#xff0c;并进行后续的分析和处理。本文将深入探讨Python爬虫的原理&#xff0c;并结合实战…

AHU 汇编 实验二

一、实验名称&#xff1a;实验二 不同寻址方式的灵活运用 二、实验内容&#xff1a;定义数组a[6]&#xff0c;用多种寻址方式访问对应元素&#xff0c;实现&#xff08;a[0]a[1]&#xff09;*(a[2]-a[3])/a[4],将结果保存在内存a[5]中&#xff0c;用debug查询结果。 实验过程&a…

19 OpenCV 霍夫曼变换检测圆

文章目录 cv::HoughCircles算子参数示例 cv::HoughCircles 因为霍夫圆检测对噪声比较敏感&#xff0c;所以首先要对图像做中值滤波。 基于效率考虑&#xff0c;Opencv中实现的霍夫变换圆检测是基于图像梯度的实现&#xff0c;分为两步&#xff1a; 检测边缘&#xff0c;发现可能…

空气源热泵、地源热泵和水源热泵三种热泵的优缺点和选型比较

空气源热泵 空气源热泵是由电动机驱动的,利用空气中的热量作为低温热源,经过空调冷凝器或蒸发器进行热交换,然后通过循环系统,提取或释放热能,利用机组循环系统将能量转移到建筑物内用户需求。 1、适用范围广:适用温度范围在-7至40℃,并且一年四季全天候使用,不受阴、…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:PluginComponent)

提供外部应用组件嵌入式显示功能&#xff0c;即外部应用提供的UI可在本应用内显示。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。本组件为系统接口。 子组件 无 接口 PluginComponent(value:…