从 PHP 到 AI + Golang,程序员自救转型手记(四十七):列表通用排序接口实现(增量重排法)

发布时间:2026/8/2 5:15:05

从 PHP 到 AI + Golang,程序员自救转型手记(四十七):列表通用排序接口实现(增量重排法)
这是一个系列 Blog作者将以一个 PHP 全栈工程师的身份利用 AI 工具claude code、codex、deepseek、豆包等从零开始学习 golang 语言并最终完成 ai-go-admingithub | gitee开源项目的制作全程记录分享。在上一期我们进行了 “再次优化基类”本期将完成列表通用排序接口实现增量重排法列表通用排序接口实现增量重排法实现初版的提示词继续啃BuildAdmin的老本参考../badmin-v2.3.7-full/app/admin/library/traits/Backend.php中的sortable方法在当前项目的基类internal/handler/base.go和internal/repository/base.go和internal/service/base.go中实现sort方法并注册路由前端传递的参数有move: moveRow[table.pk!], // 移动行 target: targetRow[table.pk!], // 目标行 sort: table.filter?.sort, // 排序字段权重字段 order: table.filter?.order, // 排序方式 direction: evt.newIndexevt.oldIndex ?down:up, // 拖拽方向忽略参考代码中的$dataLimitAdminIds忽略参考代码中的 “当前是否以权重字段排序” 检查即只检查当前排序和默认排序字段不检查有序保证字段功能需求分析前端拖动排序如将权重为1的行排序行拖动至权重为5的行目标权重行或目标行所谓增量重排法也可以称做区间位移法实现的是将涉及到的行权重值全部按算法重设以达到视觉上的排序调整比起全量重排增量重排法影响范围更小比起交换重排重排后的顺序更加合理。难点/注意点如下复用List列表方法的排序和过滤规则确保执行重新排序时查得的数据列表和前端的一样。只支持以weigh权重字段排序时进行重排操作字段名是可以自定义的只使用权重字段是因为重排是修改权重字段值实现的假设以创建时间排序重排功能不可能去修改创建时间。用户当前可能以weigh asc和weigh desc两种方式进行排序并且可能将排序行向上拖或者向下拖需要全部考虑到位。目标行的权重值不只一行比如目标行权重为5但数据表中权重值为5的行有很多。不要一个 SQL 修改一行而是尽量一个 SQL 完成一类权重值的全部修改比如权重值 目标权重的行全部1不能一条一条的遍历去改。AI 实现后控制器层的代码很简单主要是新增了Sort方法及其请求体结构体定义并注册了sort路由。主要功能实现是在服务层所以服务层问题也最多weigh 字段名不固定实现排序功能期间需要读取目标行的权重值但字段名是不固定的go 里边没有$row[$weigh]这种写法所以 AI 使用了反射的方式去读取权重值反射首先是实现复杂二是性能一般拖拽排序其实无需考虑性能但我们还是直接改为从前端传递目标行权重值即可服务端直接读取并使用去掉反射相关代码。AI 根据需求实现后接受的前端变量名为target_weigh由于我们服务端不需要使用排序行的权重值只需要目标行的权重值这里将target_weigh改名为更简洁的weigh即可。并且AI 将weigh的类型定义为any这里直接固定为int64。改为 Generics API在这种需要比较复杂的 update 语句时AI 又开始忘记AGENTS.md中的规则了这里强行要求它改为Generics API// 原来的iferr:tx.Model(new(T)).Where(weighField bulkOp ?,weigh).Where(pkField ?,move).UpdateColumn(weighField,gorm.Expr(weighField updateOp ?,weighRowsCount)).Error;err!nil{returnerr}// 改为gtx:gorm.G[T](tx)iferr:gtx.Where(weighField bulkOp ?,weigh).Where(pkField ?,move).UpdateColumn(weighField,gorm.Expr(weighField updateOp ?,weighRowsCount));err!nil{returnerr}// 且 gtx 后续复用另外重排实现内必需使用一下传统 API 的Pluck方法当然也可以使用Generics API的Select方法去选择字段只是这样又需要反射读取结构体中数据库列名对应的字段值了没必要。反转切片代码优化实现重排时有一段反转数组的代码// 向下拖动时反转保证等权重区间内相对顺序不变ifdirectiondown{fori,j:0,len(weighIDs)-1;ij;i,ji1,j-1{weighIDs[i],weighIDs[j]weighIDs[j],weighIDs[i]}}在Go 1.25 提供了slices.Reverse方法可以直接使用简化为// 向下拖动时反转保证等权重区间内相对顺序不变ifdirectiondown{slices.Reverse(weighIDs)}多余的封装AI 帮忙封装了一个exprOffset函数用于组装一些排序用的查询表达式但其对整体无益且不被Sort方法以外的地方复用这里让它直接改为在Sort方法内封装为闭包函数即可不要放在Sort方法外边。BUG我在测试前首先让 AI 直接再写一点调试代码打印出Sort方法内执行的所有SQL然后前端进行操作对比我的需求与执行的SQL发现一处排序错误代码我们已经review过了没有发现明显问题应该是某处细节上的逻辑错误这里直接把日志给 AI并加以描述提示词好像有 BUG排序后有权重值重复的行我有权重值为1,2,3的行入参move1 target3时执行的SQL有以下2026/07/25 00:19:34 C:/Users/yang/Desktop/admin/internal/service/base.go:148[0.709ms][rows:1]SELECTidFROMadmin_rulesWHERE weigh3ORDER BY weigh DESC,id DESC2026/07/25 00:19:34 C:/Users/yang/Desktop/admin/internal/service/base.go:171[0.525ms][rows:0]UPDATEadmin_rulesSETweighweigh -1,updated_at2026-07-25 00:19:34.578WHERE weigh3ANDid12026/07/25 00:19:34 C:/Users/yang/Desktop/admin/internal/service/base.go:201[0.628ms][rows:1]UPDATEadmin_rulesSETweigh3,updated_at2026-07-25 00:19:34.578WHEREid12026/07/25 00:19:34 C:/Users/yang/Desktop/admin/internal/service/base.go:213[0.541ms][rows:1]UPDATEadmin_rulesSETweigh2,updated_at2026-07-25 00:19:34.579WHEREid3最终结果是有两行的权重值均为2这与目标不符应该不出现重复的权重才对对比参考代码../badmin-v2.3.7-full/app/admin/library/traits/Backend.php的sortable方法找出原因找到原因了。对比PHP代码的bulk update逻辑PHP正确// updateMethod dec → WHERE weigh target// updateMethod inc → WHERE weigh target-where(weigh,$updateMethoddec?:,$weigh)Go错误// updateOp - → bulkOp ← 反了// updateOp → bulkOp bulkOp:ifupdateOp{bulkOp}dec权重 −1应该影响权重比目标小的行让它们再减给拖动行腾位置。我把 和 写反了。嚯AI 居然还会犯这种逻辑错误。

相关新闻

VisionPro中CogGraphicLabel动态文本标注:从原理到工业视觉实战

VisionPro中CogGraphicLabel动态文本标注:从原理到工业视觉实战

2026/8/2 5:05:04

1. 项目概述:在VisionPro中动态显示文本标签在机器视觉项目开发中,尤其是在使用康耐视VisionPro这类强大的工具时,我们经常遇到一个看似简单却至关重要的需求:如何在图像上清晰、动态地显示文本信息。这个信息可能是检测结果&…

《javaweb的基础》0基础学习前端内容--vue框架

《javaweb的基础》0基础学习前端内容--vue框架

2026/8/2 5:05:04

首先申明,这是基础内容,为的是带大家了解vue这个内容,尝试学习vue基础知识,其实vue是一个很大的知识体系,这里我简单的讲述了一下对于前后端数据传输后的数据最基本的处理,不涉及生态,只是对交互…

从Google Earth提取实景三维模型:SfM重建实战指南

从Google Earth提取实景三维模型:SfM重建实战指南

2026/8/2 5:05:04

1. 项目概述:从数字地球到三维资产 几年前,我接手一个城市微更新项目,需要快速获取项目地块及周边环境的精确三维模型作为设计基底。当时第一反应就是打开Google Earth——这个几乎人人都用过的“数字地球仪”。它的三维视图如此逼真&#xf…

Labelme JSON转Mask:语义分割数据预处理核心技术与实战

Labelme JSON转Mask:语义分割数据预处理核心技术与实战

2026/8/2 6:15:07

1. 项目概述:从标注文件到像素级掩码的转换在计算机视觉,特别是语义分割任务中,我们经常遇到一个看似简单却至关重要的环节:如何将标注工具(如Labelme)生成的JSON文件,转换成模型训练所需的Mask…

低成本打造7英寸副屏:硬件选型、软件配置与效率提升全攻略

低成本打造7英寸副屏:硬件选型、软件配置与效率提升全攻略

2026/8/2 6:15:07

1. 项目概述:为什么你需要一块副屏?如果你和我一样,每天面对着一块主显示器,同时开着代码编辑器、浏览器、通讯软件、终端和性能监控面板,那么你一定经历过那种在十几个窗口间疯狂切换的焦躁感。主屏幕再大&#xff0c…

Spring AI 系列(三):RAG 开发必知——两种 Advisor 到底怎么选?附完整代码实现

Spring AI 系列(三):RAG 开发必知——两种 Advisor 到底怎么选?附完整代码实现

2026/8/2 6:15:07

Spring AI 系列(三):RAG 开发必知——两种 Advisor 到底怎么选?附完整代码实现 Spring AI 提供了对常见 RAG 流程的开箱支持,通过 Advisor API 实现,向量数据库存储着AI模型所不知道的数据,当用…

技术博客内容聚合平台实践:OpenClaw 如何采集公开优质内容并生成每日技术内参

技术博客内容聚合平台实践:OpenClaw 如何采集公开优质内容并生成每日技术内参

2026/8/2 6:15:07

一、引言在信息爆炸的时代,技术从业者每天需要面对海量的技术博客、官方文档、行业资讯和开源项目动态。如果逐一打开各个博客站点、论坛和 Newsletter,不但耗时巨大,而且很难区分内容质量的高低,往往会陷入“每天阅读上百篇文章&…

SortMeRNA安装与实战:从环境配置到rRNA污染过滤全流程指南

SortMeRNA安装与实战:从环境配置到rRNA污染过滤全流程指南

2026/8/2 6:15:07

1. 项目概述:为什么SortMeRNA是rRNA污染过滤的“瑞士军刀”在宏基因组或转录组数据分析的流水线里,拿到原始测序数据后的第一步清洗工作,往往不是去除低质量碱基,而是剔除那些“不请自来”的核糖体RNA序列。这些rRNA序列&#xff…

搅拌设备机架各材质优缺点详解

搅拌设备机架各材质优缺点详解

2026/8/2 6:05:07

结合丰享搅拌设备落地工况,针对以上五种常用机架材质,逐一拆解真实优点、行业短板、适用边界,解决选型低配生锈、高配浪费、材质用错变形腐蚀等问题。1、普通喷漆碳钢 Q235-B优点:成本最低、焊接性能好、整体刚性稳定、不易变形、…

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

2026/8/2 0:04:43

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经从网易云音乐下载了心爱的歌曲&am…

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

2026/8/2 0:04:43

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比工程导读:本文深入讨论 分布式配置中心选型实战:Nacos与Consul在创业场景下的对比 在生产工程实践中的核心落地方案。基于 分布式架构与微服务设计 视角,剖析实际痛点、架…

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

2026/8/2 0:04:43

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案 【免费下载链接】MoneyPrinterPlus AI一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上,赚钱从来没有这么容易过! 支持本地语音模型chatTTS,fasterwhisper,…

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

2026/8/2 0:04:43

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经从网易云音乐下载了心爱的歌曲&am…

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

2026/8/2 0:04:43

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比工程导读:本文深入讨论 分布式配置中心选型实战:Nacos与Consul在创业场景下的对比 在生产工程实践中的核心落地方案。基于 分布式架构与微服务设计 视角,剖析实际痛点、架…

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

2026/8/2 0:04:43

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案 【免费下载链接】MoneyPrinterPlus AI一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上,赚钱从来没有这么容易过! 支持本地语音模型chatTTS,fasterwhisper,…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/1 0:03:03

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/2 5:08:03

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/2 1:50:52

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…