从 PHP 到 AI + Golang,程序员自救转型手记(八):设计管理员模型、热重载配置

发布时间:2026/6/26 6:56:11
从 PHP 到 AI + Golang,程序员自救转型手记(八):设计管理员模型、热重载配置 这是一个系列 Blog作者将以一个 PHP 全栈工程师的身份利用 AI 工具claude code、codex、deepseek、豆包等从零开始学习 golang 语言并最终完成 ai-go-mallgithub | gitee开源项目的制作全程记录分享。在上一期我们已经完成 “建立 CLAUDE.md 文件、整理目录结构”本期将完成设计管理员模型、热重载配置设计管理员模型/数据表开始建表了用了GORM按它的规范设计模型然后使用自动迁移AutoMigrate就能完成建表而且修改模型时表结构也会随之自动更新。我打算先实现一些后台功能后再考虑反 XSS、跨域、节流等功能我们之前已经实现了自动迁移的支持新的模型只需要建立于 model 目录并调用Register函数注册即可系统启动时就会自动建表了。自动迁移优化目前注册自动迁移模型的语法是Register(Admin{})一次只能注册单个模型而多个相关联的模型是可以放入一个模型文件中的比如admin.go模型文件中可以放Admin、AdminGroup、AdminRule至少三个模型定义所以我们首先将Register函数改为支持接受任意数量的参数实现Register(Admin{}, AdminGroup{}, AdminRule{})这种写法。直接要求 cc将 internal/model/model.go 中的 Register 函数改为支持任意数量的参数就像 db.AutoMigrate(User{}, Product{}, Order{}) 一样# 大模型是概率生成不是固定查表再加上采样策略、上下文、版本等影响同问题输出都会有差异以下 AI 输出、包括生成的代码仅供参考可直接忽略继续向下查看如何寻找问题和完成整改现在我了解了当前的实现。修改 Register 函数支持可变参数 ● Update(internal\model\model.go)⎿ Added3lines, removed2lines3var models[]any45// 注册需要自动迁移的模型各模型文件内可通过 init()机制实现自动调用6-funcRegister(m any){7- modelsappend(models, m)6// 支持一次注册多个模型如 Register(User{},Product{},Order{})7func Register(models...any){8 registeredappend(registered, models...)9}1011// 返回所有已注册的模型供 database.Init 的 AutoMigrate 使用 ● 还需要把变量名 models 改为 registered避免与参数名冲突...很简单的需求总共没改几行一眼就能确定新的代码没问题核心是funcRegister(models...any){registeredappend(registered,models...)}管理员模型设计当然也可以直接让 cc 参考 GORM 的文档设计模型于 internal\model\admin.go 中以 GORM 的语法约定https://gorm.io/zh_CN/docs/models.html定义管理员模型并注册自动迁移不要嵌入gorm.Model而是单独定义所有字段因为它没有字段注释且字段排序无法控制请将ID字段放在第一位UpdatedAt、CreatedAt、DeletedAt字段按顺序放在最后每个字段都需要有中文注释ID 字段除外以ID作为注释即可有规范有顺序的填写字段标签可参考已有的模型定义其中comment总是放在第一位因为所有字段都会有comment管理员模型的字段有ID, Username, Nickname, Avatar, Email, Mobile, LoginFailure, LastLoginAt, LastLoginIp, Password, Bio, Status, UpdatedAt, CreatedAt, DeletedAtPS作者这里以往设计过很多次管理员表所以直接复制了之前的建表 SQL并让其他 AI 将字段名整理出来贴了进去一般历往无设计时可以让 AI 全新设计这份新建模型的提示词以后也可以用目前是否全面合理也不一定边用边完善吧人工微调之后设计很工整其中 varchar 的 64 128 255 没啥特别的意义就是为了好看 比较合理的长度Status 字段没有使用 enum 类型以便开发者可自行扩展其他状态值。typeAdminstruct{IDuintgorm:comment:ID;primarykey;autoIncrementUsernamestringgorm:comment:用户名;type:varchar(64)Nicknamestringgorm:comment:昵称;type:varchar(64)Avatarstringgorm:comment:头像;type:varchar(255)Emailstringgorm:comment:邮箱;type:varchar(128)Mobilestringgorm:comment:手机号;type:varchar(16)LoginFailureuintgorm:comment:连续登录失败次数LastLoginAt time.Timegorm:comment:上次登录时间LastLoginIpstringgorm:comment:上次登录IP;type:varchar(64)Passwordstringgorm:comment:密码;type:varchar(255)Biostringgorm:comment:个人简介;type:varchar(255)Statusstringgorm:comment:状态:enable启用,disable禁用;type:varchar(64)UpdatedAt time.Timegorm:comment:更新时间CreatedAt time.Timegorm:comment:创建时间DeletedAt gorm.DeletedAtgorm:comment:删除时间;index}热重载配置修改代码后总是需要重新执行go run cmd/api/main.go命令配置好开发环境的代码更新自动热重载可以省很多事golang 语言本身或标准库中没有自带类似功能Gin 框架推荐使用 Air 实现热重载。其实安装和配置 Air 很简单不过这里还是让 cc 来完成直接告诉它安装配置 Airhttps://github.com/air-verse/air 实现开发环境热重载功能PS作者安装依赖是一般都会带上 github 或其他官方链接这是很有必要的主要避免 AI 安装了盗版依赖包比如某个黑客写了个 https://github.com/hacker/air-true并全网发布各类教程/宣发文章此时若我们的提示词不带官方仓库链接AI 可能会联网搜索 golang air 依赖随即被网文所骗且它还能正常运行只是额外携带了病毒代码半夜用你的电脑/服务器挖坑或当做肉鸡使用。使用 cc 安装还是有好处的生成的配置文件有根据项目目录结构适应且写了注释这里需要注意的是 air 并不是作为当前项目的依赖而是 go install 到了 $GOPATH/bin只.air.toml配置文件是在当前项目根目录这里作者也做了研究配置文件能不能换为YAML格式避免项目中又多一种toml文件格式可惜答案是不行。