从 PHP 到 AI + Golang,程序员自救转型手记(四十):基类改造
这是一个系列 Blog作者将以一个 PHP 全栈工程师的身份利用 AI 工具claude code、codex、deepseek、豆包等从零开始学习 golang 语言并最终完成 ai-go-admingithub | gitee开源项目的制作全程记录分享。在上一期我们进行了 “前端上传组件实现”本期将完成基类改造基类改造基类严格来讲不是 go 里边的概念在本 blog 中使用它范指 基控制器、基服务、基仓储接下来就是做出第一个后台的管理功能了在此之前对基类进行完善这是一个及其需要细心和周全考虑的工作各大基类的每一行代码都需要是最佳实践扩展性拉满性能拉满。基类改造 前端表格组件一起作者整整花了将近两周时间基类改造情况如下每一个小节一般就是提交给 AI 的一个需求一般一个需要需要多轮对话才能完成然后边修改边人工review最终再完成测试基仓储改造利用 gorm.Statement.Schema 检查字段是否存在必需特意写明利用gorm.Statement.Schema因为直接告诉AI需要一个检查字段是否存在的方法的话它会根据当前模型写一大堆代码预解析出Schema并缓存我测试了一下这种方案还是各大 AI 模型的首选方案实际上当然是没有必要的直接伸手向GORM拿就行了。最终检查字段是否存在方法的签名为func (r *Repository[T]) FieldExists(field string) (bool, error)获取主键字段方法依旧是利用gorm.Statement.Schema获取主键字段调用GORM Statement.Parse方法解析模型数据该函数内部会复用GORM的Schema缓存。复合主键模型返回GORM识别的优先主键字段最终方法签名为func (r *Repository[T]) PrimaryKeyField() (string, error)代码如下// FieldExists 检查当前模型是否包含指定字段// 同时支持 Go 字段名和数据库列名Statement.Parse 会复用 GORM 的 Schema 缓存func(r*Repository[T])FieldExists(fieldstring)(bool,error){fieldstrings.TrimSpace(field)iffield{returnfalse,nil}stmt:gorm.Statement{DB:r.DB()}iferr:stmt.Parse(new(T));err!nil{returnfalse,err}returnstmt.Schema.LookUpField(field)!nil,nil}增加 Count 方法此方法用于获取数据条数签名为func (r *Repository[T]) Count(c *gin.Context, opts Options) (int64, error)使用opts.Scopes忽略opts中的分页、排序、字段选择等。已有方法改造先定义一个所有方法通用的Options结构体// Options 通用仓库操作选项各选项可按需使用typeOptionsstruct{Omit[]string// 排除出入库字段将在 Create、Update、List 等方法中应用至 GORM 的 Select 方法Select[]string// 选择出入库字段其余同上Scopes[]func(*gorm.Statement)// 将在 List 和 Get 等方法中直接传递给 GORM 的 Scopes 方法可以自定义 查询、排序、分页 等等PrimaryKeystring// 主键值提供则会在 Get 方法中作为 Where 的参数}基仓储 List 改造丰富入参和功能如下// 原来的func(r*Repository[T])List(c*gin.Context,scopes...func(*gorm.Statement))([]T,error)// 改为func(r*Repository[T])List(c*gin.Context,opts Options)([]T,error)即将scopes参数改为optsopts里边可以传递scopes并且额外还可以传递排序字段、选择排除字段等选项未来要扩展也很方便List方法内根据opts确定如何读取数据另外对于Select和Omit字段我并没有使用FieldExists方法对字段名逐一确定是否存在开发者需自行对传入的字段名负责程序不会对未知字段报警。基仓储 Create / Update / Get 改造仓储层的Create / Update / Get方法也需要增加opts Options参数并应用上这些配置。在Create / Update方法内Select / Omit配置决定入库字段。在Get方法内不仅可以使用Select / Omit来决定出库字段也支持scopes和PrimaryKey主键值选项若提供了PrimaryKeyGet会拼接类似这样的查询条件Where(pk ?, opts.PrimaryKey)同时并不会忽略scopes。基控制器、基服务改造首先是整体规划的改变比如控制器要支持更多的请求数据本次改造支持了排序、分页、多字段条件查询等特别是服务层的List方法首先看基仓储的List方法它太简单了如下func(r*Repository[T])List(c*gin.Context,opts Options)([]T,error){q:gorm.G[T](r.DB()).Scopes(opts.Scopes...)// 出库字段的选择与忽略iflen(opts.Select)0{qq.Select(strings.Join(opts.Select,,))}iflen(opts.Omit)0{qq.Omit(opts.Omit...)}returnq.Find(c.Request.Context())}可以看到仓储层主要是接受了一个Scopes函数切片这意味着我们前端传递的排序、分页、多字段条件查询等都需要在服务层构建为Scopes然后直接传递给仓储层使用Select和Omit逻辑为和其他方法保持统一并未使用Scopes的方式定义。基控制器接受主键的方式优化旧的主键接受固定接受为int类型如下id,err:strconv.ParseUint(c.Param(id),10,64)新的接受方式首先变量改名为更加通用的pk然后直接接受为string并以string类型直接传递至 服务、仓储 等各层如下pk:c.Param(pk)只在需要做比较、计算时再根据当前模型的主键类型转为 int 即可且一般无需转换因为对于 GORM 来说主键传的是 int 或 string生成的 SQL 都是一样的。服务层 List 方法响应字段增加list接口目前直接响应单个data字段内容是对应模型中的数据需要改为data.list数据、data.total数据条数使用仓储层的Count方法分页支持基控制器额外接受page和limit参数传递给服务层由服务层建立一个Paginate Scopes最终传递给仓储的List方法该方法支持Scopes能直接使用分页器。排序支持基本同上。多字段条件查询支持对应基服务internal/service/base.go的BuildWhereScopes方法最终会返回多个scopes。前端传递的查询条件是这样的{wheres:[{field:username,operator:NOT ILIKE,value:test,}]}BuildWhereScopes会根据以上前端传值组装where实现起来非常简单主要是operator它代表 SQL 运算符号需要支持很多比如,,,LIKE,ILIKE,IS NULL等这里有一个小坑,,这类符号在传输时很可能被转义掉这里需要写一个转换函数如下// GetOperatorByAlias 符号类运算符别名 → SQL 运算符funcGetOperatorByAlias(opstring)string{switchop{caseeq,:returncasene:return!casegt:returncasegte:returncaselt:returncaselte:returndefault:returnop// LIKE、IN、NOT IN 等单词运算符直接透传}}然后前端使用operator: eq、operator: ne等就行了不要使用原始符号。未来还会再次完善支持字段白名单、操作符号白名单、OR 条件等测试IS NOT NULL 无效在人工测试中找到一个review没发现的问题list接口筛选数据时操作符使用IS NOT NULL无效查看了代码发现 AI 居然犯了个很低级的错误switchop{caseIS NULL,IS NOT NULL:scopesappend(scopes,func(stmt*gorm.Statement){stmt.Where(w.Field IS NULL)})}操作符号为IS NULL和IS NOT NULL时都是固定的stmt.Where(w.Field IS NULL)改为stmt.Where(w.Field op)才对。不兼容范围查询switchop{caseBETWEEN:scopesappend(scopes,func(stmt*gorm.Statement){stmt.Where(w.Field BETWEEN ? AND ?,w.Value)})}如上w.Value只有一个但是BETWEEN需要一个范围值解决方案也很简单前端传递数组或简单的以,分割多个值后端这边再切一下即可。

相关新闻

5个常用的网页制作软件和建站系统,省时又省力!

5个常用的网页制作软件和建站系统,省时又省力!

当你想建立一个网站和站群时,你会需要一款强大且便于使用的网页制作软件或建站工具。在这篇文章中,我们将为你推荐5款常用的网页制作软件或建站系统,帮助你在网页制作中省时又省力! 1. PageAdmin PageAdmin是一款国产企业级网站…

2026/7/30 7:33:12 阅读更多 →
2026论文神级降AI率平台大曝光:三步操作让AI痕迹消失无踪

2026论文神级降AI率平台大曝光:三步操作让AI痕迹消失无踪

2026年的学术战场已经彻底变了天,论文写法和审查标准都在经历一场静默的革命。过去那种只要把查重率压下去就能过关的日子一去不复返了,现在的学生不仅要面对传统查重系统的严苛筛查,还要在AI痕迹检测上如履薄冰。随着AI写作工具的普及&#…

2026/7/30 7:33:12 阅读更多 →
如何在Unity游戏中实现实时自动翻译:XUnity.AutoTranslator终极指南

如何在Unity游戏中实现实时自动翻译:XUnity.AutoTranslator终极指南

如何在Unity游戏中实现实时自动翻译:XUnity.AutoTranslator终极指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语游戏中的对话和菜单而烦恼吗?XUnity.AutoTranslator…

2026/7/30 7:33:12 阅读更多 →

最新新闻

Harris角点检测算法原理与Matlab完整实现指南

Harris角点检测算法原理与Matlab完整实现指南

基于Matlab的Harris角点特征检测系统完整解析与实战 在图像处理和计算机视觉领域,角点检测是一项基础而重要的技术。无论是三维重建、目标跟踪还是图像配准,准确检测图像中的角点都是关键的第一步。Harris角点检测算法作为经典且实用的方法,自…

2026/7/30 7:38:14 阅读更多 →
2024提示工程架构师:从技巧到系统设计的转型

2024提示工程架构师:从技巧到系统设计的转型

1. 2024年提示工程架构师的角色演变 三年前我刚接触提示工程时,这个岗位还被称为"AI魔术师"——只需要掌握几个神奇的prompt模板就能让大模型输出令人惊叹的结果。但到了2024年,这个角色已经发生了翻天覆地的变化。上周我在评审团队成员的提示…

2026/7/30 7:38:14 阅读更多 →
爆火!Opus 5游戏提示词“挑战循环”,网友24小时肝出翻版《星际拓荒》

爆火!Opus 5游戏提示词“挑战循环”,网友24小时肝出翻版《星际拓荒》

最近,一个Opus 5游戏提示词在𝕏上火了,百万人在线围观。网友Anshu用它24小时从零做出翻版《星际拓荒》,原作者也手搓出《使命召唤》Opus 5版。提示词背后逻辑该提示词名为「挑战循环」。主Agent拆解任务,子Agent干活&a…

2026/7/30 7:38:14 阅读更多 →
STM32标准外设库(SPL)官方下载与工程搭建全指南

STM32标准外设库(SPL)官方下载与工程搭建全指南

1. 为什么STM32标准外设库依然值得你花时间下载如果你刚开始接触STM32,或者正在使用像STM32F103C8T6这样的经典“蓝桥杯”芯片,那么“标准外设库”这个词你肯定绕不过去。现在网上铺天盖地都是HAL库和CubeMX的教程,很多人可能会问&#xff1a…

2026/7/30 7:38:14 阅读更多 →
LangChain入门保姆级教程|LCEL+Runnable彻底玩转AI链式开发

LangChain入门保姆级教程|LCEL+Runnable彻底玩转AI链式开发

哈喽各位码友!学 LangChain 的小伙伴应该都有过这种烦恼:Prompt 模板、大模型、输出解析器、检索器 全都学会了,但都是零散的"单体组件",调用起来要逐行写代码,繁琐又难复用!今天就带大家解锁 La…

2026/7/30 7:38:13 阅读更多 →
TPFanCtrl2终极指南:ThinkPad风扇智能控制完整解决方案

TPFanCtrl2终极指南:ThinkPad风扇智能控制完整解决方案

TPFanCtrl2终极指南:ThinkPad风扇智能控制完整解决方案 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 你是否曾被ThinkPad风扇的"过山车式"噪音…

2026/7/30 7:37:13 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻