PHP转AI+Golang:管理员模型与热重载配置
时间:2026-07-27 | 作者:星际追番人 | 阅读:0这是一个系列记录,作者以 PHP 全栈工程师的身份,借助 AI 工具(Claude Code、Codex、DeepSeek、豆包等)从零开始学习 Golang。最终完成 ai-go-mall(GitHub / Gitee)开源项目的制作,全程将过程分享出来。
上一期已经搞定了 CLAUDE.md 文件和目录结构。这一期要完成两件事:设计管理员模型,以及配置热重载。
设计管理员模型 / 数据表
终于开始建表了。既然用了 GORM,就按它的规范来设计模型,然后通过自动迁移(AutoMigrate)直接建表。后续修改模型时,表结构也会跟着自动更新,省心不少。
技术方案上,先把一些安全的防护(反 XSS、跨域、节流)往后放。先实现后台核心功能,再考虑安全防护不迟。之前已经实现了自动迁移的支持,所以新模型只需要放在 model 目录下,并调用 Register 注册即可。系统启动时就会自动建表。
自动迁移优化
目前的注册写法是 Register(&Admin{}),一次只能注册一个模型。但实际开发中,多个关联模型常常放在同一个文件里。比如 admin.go 里就会放 Admin、AdminGroup、AdminRule 至少三个。所以第一步,把 Register 改成支持任意数量参数,变成 Register(&Admin{}, &AdminGroup{}, &AdminRule{}) 这种写法。
直接让 Claude Code 动手:把 @internal/model/model.go 中的 Register 函数改为可变参数,就像 db.AutoMigrate(&User{}, &Product{}, &Order{}) 那样。
# 大模型是概率生成,不是固定查表,再加上采样策略、上下文、版本等影响,同问题输出都会有差异,以下 AI 输出、包括生成的代码仅供参考,可直接忽略,继续向下查看如何寻找问题和完成整改
现在我了解了当前的实现。修改 Register 函数支持可变参数:
● Update(internalmodelmodel.go)Added 3 lines, removed 2 lines
3 var models []any
4
5 // 注册需要自动迁移的模型,各模型文件内可通过 init() 机制实现自动调用
6 -func Register(m any) {
7 - models = append(models, m)
6 +// 支持一次注册多个模型,如 Register(&User{}, &Product{}, &Order{})
7 +func Register(models ...any) {
8 + registered = append(registered, models...)
9 }
10
11 // 返回所有已注册的模型,供 database.Init 的 AutoMigrate 使用
● 还需要把变量名 models 改为 registered,避免与参数名冲突...
需求很简单,总共没改几行,一看就知道对不对。核心代码就这一句:
func Register(models ...any) {
registered = append(registered, models...)
}
管理员模型设计
当然,也可以直接让 Claude Code 参考 GORM 的文档来设计模型。提了几个具体要求:
- 在
internal/model/admin.go中,遵循 GORM 的语法约定 - 不要嵌入
gorm.Model,而是单独定义所有字段——因为gorm.Model没有字段注释,字段排序也无法控制;把ID放第一位,UpdatedAt、CreatedAt、DeletedAt按顺序放在最后 - 每个字段都要有中文注释(ID 字段注释写 “ID” 即可)
- 字段标签要有规范顺序,
comment总是放第一位,因为所有字段都会有注释 - 管理员模型字段包括:
ID, Username, Nickname, A vatar, Email, Mobile, LoginFailure, LastLoginAt, LastLoginIp, Password, Bio, Status, UpdatedAt, CreatedAt, DeletedAt
经过人工微调后,模型设计得很工整。其中 varchar 的 64 / 128 / 255 没有特别深意,就是为了好看加比较合理的长度。Status 字段没有使用 enum 类型,方便开发者自行扩展其他状态值。
type Admin struct {
ID uint `gorm:"comment:ID;primarykey;autoIncrement"`
Username string `gorm:"comment:用户名;type:varchar(64)"`
Nickname string `gorm:"comment:昵称;type:varchar(64)"`
A vatar string `gorm:"comment:头像;type:varchar(255)"`
Email string `gorm:"comment:邮箱;type:varchar(128)"`
Mobile string `gorm:"comment:手机号;type:varchar(16)"`
LoginFailure uint `gorm:"comment:连续登录失败次数"`
LastLoginAt time.Time `gorm:"comment:上次登录时间"`
LastLoginIp string `gorm:"comment:上次登录IP;type:varchar(64)"`
Password string `gorm:"comment:密码;type:varchar(255)"`
Bio string `gorm:"comment:个人简介;type:varchar(255)"`
Status string `gorm:"comment:状态:enable=启用,disable=禁用;type:varchar(64)"`
UpdatedAt time.Time `gorm:"comment:更新时间"`
CreatedAt time.Time `gorm:"comment:创建时间"`
DeletedAt gorm.DeletedAt `gorm:"comment:删除时间;index"`
}
热重载配置
改完代码总是要手动执行 go run cmd/api/main.go,次数多了就烦。配置好开发环境的热重载,能省不少时间。Go 语言本身没有自带这类功能,Gin 框架官方推荐用 Air 实现热重载。
安装和配置 Air 其实很简单,不过还是让 Claude Code 来干——直接告诉它:安装配置 Air(github.com/air-verse/air)实现开发环境热重载。
用 Claude Code 安装的好处是:生成的配置文件会根据当前项目目录结构自动适配,并且自带了注释说明。这里需要说明一点:Air 并不是作为当前项目的依赖安装的,而是通过 go install 安装到了 $GOPATH/bin,只有 .air.toml 配置文件放在项目根目录。作者也研究过能不能把配置文件换成 YAML 格式——这样项目中就少一种 TOML 文件格式——可惜答案是:不行。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- PHP创建数据库的SQL语句教程
- 时间:2026-08-23
-
- PHP安全替换配置文件内容的方法与实战技巧
- 时间:2026-08-20
-
- PHP后台管理系统开发从入门到精通实战指南
- 时间:2026-08-19
-
- PHP中如何验证含星号通配符的括号字符串是否有效
- 时间:2026-08-18
-
- PHP中如何验证带星号通配符的括号字符串是否有效
- 时间:2026-08-18
-
- PHP中按分号分割含嵌套分号的多条SQL语句方法
- 时间:2026-08-18
-
- PHP循环中下拉框选项变更事件绑定方法及键盘导航支持
- 时间:2026-08-18
-
- PHP表单提交多个选中月份并显示对应数据的方法
- 时间:2026-08-18
精选合集
更多大家都在玩
大家都在看
更多-
- 为什么湿头发更容易断裂 蚂蚁庄园今日答案9.15
- 时间:2026-09-14
-
- 蚂蚁庄园今天答题答案2026年9月15日
- 时间:2026-09-14
-
- 蚂蚁庄园答题今日答案2026年9月15日
- 时间:2026-09-14
-
- 蚂蚁庄园小课堂2026年9月15日最新题目答案
- 时间:2026-09-14
-
- 小鸡答题今天的答案是什么2026年9月15日
- 时间:2026-09-14
-
- 蚂蚁庄园每日答题答案2026年9月15日
- 时间:2026-09-14
-
- 糖尿病患者禁食所有含糖食物吗 蚂蚁庄园今日答案9月15日
- 时间:2026-09-14
-
- 2026年9月14日蚂蚁新村答案
- 时间:2026-09-14
