从 PHP 到 AI + Golang,程序员自救转型手记(四十一):增加管理员账号管理接口

这是一个系列 Blog,作者将以一个 PHP 全栈工程师的身份,利用 AI 工具(claude code、codex、deepseek、豆包等):从零开始学习 golang 语言,并最终完成 ai-go-admin(github | gitee)开源项目的制作,全程记录分享。

在上一期,我们进行了 "基类改造",本期将完成:增加管理员账号管理接口

增加管理员账号管理接口

我们之前已经准备好了基控制器、仓储和服务,同时 Admin 模型也已经定义,此时可以直接让 AI 基于这些东西,直接完成接口的创建。

这里提供向 AI 详细的模型位置和新文件位置:创建 /admin/auth/admin 管理员账号管理 CRUD 接口,基于 @internal/model/admin.go 的 Admin 模型在 @internal/handler/admin/auth/ 建立 AuthAdminHandler 控制器,并建立对应的服务,仓储可以直接使用 internal\repository\admin\admin.go(做管理员登录时建立的)。

账号管理接口零定制版

受益于我们创建的基类非常完善,创建这样一个 CRUD 接口,如果不做任何定制的话,代码量非常少:

控制器:internal\handler\admin\auth\admin.go

go 复制代码
package auth

import (
	"github.com/ai-go-hub/ai-go-admin/internal/handler"
	"github.com/ai-go-hub/ai-go-admin/internal/model"
	svcAuth "github.com/ai-go-hub/ai-go-admin/internal/service/admin/auth"

	"github.com/gin-gonic/gin"
)

// AuthAdminHandler 管理员账号管理控制器
type AuthAdminHandler struct {
	*handler.Handler[model.Admin]
	svc *svcAuth.AuthAdminService
}

// NewAuthAdminHandler 创建管理员账号管理控制器实例
func NewAuthAdminHandler(svc *svcAuth.AuthAdminService) *AuthAdminHandler {
	return &AuthAdminHandler{
		Handler: handler.NewHandler(svc,
			handler.WithOmitFields(handler.OmitFields{
				// 创建时忽略以下字段不入库
				Create: []string{"id", "login_failure", "last_login_at", "last_login_ip", "deleted_at"},
			}),
		),
		svc: svc,
	}
}

// RegisterRoutes 注册路由
func (h *AuthAdminHandler) RegisterRoutes(group *gin.RouterGroup) {
	// 这种写法可自动挂载重写后的方法
	handler.RegisterBaseRoutes(h, group)
}

服务:internal\service\admin\auth\admin.go

go 复制代码
package auth

import (
	"github.com/ai-go-hub/ai-go-admin/internal/model"
	repoAdmin "github.com/ai-go-hub/ai-go-admin/internal/repository/admin"
	"github.com/ai-go-hub/ai-go-admin/internal/service"
)

// AuthAdminService 管理员账号管理服务
type AuthAdminService struct {
	service.IService[model.Admin]
	repo *repoAdmin.AdminRepository
}

// NewAuthAdminService 创建管理员账号管理服务实例
func NewAuthAdminService(repo *repoAdmin.AdminRepository) *AuthAdminService {
	return &AuthAdminService{
		IService: service.NewService(repo),
		repo:     repo,
	}
}

接口个性化改造

管理员账号管理接口,当然不是零定制版就能搞定的,主要是有以下数据验证项:

数据验证

如果是单纯的字段必填的话,可以在 Admin 模型增加 binding:"required" 即可,如下:

go 复制代码
Password string `gorm:"comment:密码;type:varchar(255);not null" json:"-" binding:"required"`

但是管理员的新增接口,password 字段是必填的,而编辑接口,password 字段则是留空则不修改,而且还要在服务层,对密码进行加密入库,所以我选择自定义 DTO,如下:

go 复制代码
// AdminUpdateRequest 更新管理员请求参数
type AdminUpdateRequest struct {
	Username string `json:"username" binding:"required"`
	Nickname string `json:"nickname" binding:"required"`
	Avatar   string `json:"avatar"`
	Email    string `json:"email"`
	Mobile   string `json:"mobile"`
	Password string `json:"password"`
	Bio      string `json:"bio"`
	Status   string `json:"status" binding:"required"`
}

// AdminCreateRequest 创建管理员请求参数
type AdminCreateRequest struct {
	AdminUpdateRequest
	Password string `json:"password" binding:"required"`
}

考虑到服务层还得对密码加密入库,我们直接对控制器和服务层的 新增、编辑 两个方法进行重写:

  • 一、方便使用以上 DTO 接受请求数据;
  • 二、密码入库方便(新增是直接加密入库,编辑是有设定密码才入库);
  • 三、用户名重复检查也做到了服务层(涉及多字段关联的验证,一律建议放在服务层)。

管理员权限

目前的管理员管理还不支持设定 管理员分组 字段,有了这个字段才能决定管理员有那些权限,甚至能否新建管理员等,由于目前还没有管理员分组功能,只能留待后续完善。

相关推荐
EatFan9 小时前
Spring Boot 4 落地观察:从 yudao-cloud、matecloud、JPower 看国产脚手架的升级路线与迁移清单
java·spring boot·后端·spring cloud·微服务·后端开发·jdk 21
波力海苔夹心脆67510 小时前
C# 序列化与反序列化详解:System.Text.Json、Newtonsoft.Json、XmlSerializer 用法、特性选项与安全实践
经验分享·后端·c#·json·.net
JavaGuide11 小时前
NVIDIA 又开源了!这次给 AI Agent 加上权限管控
前端·后端
excel11 小时前
prisma 如何处理数据库竞态
前端·数据库·后端
IT_陈寒14 小时前
Java线程池这破玩意,差点让我周末加班排查到凌晨
前端·人工智能·后端
弈栈录14 小时前
Java AI 应用的异步化与高并发设计
java·后端·架构
凤山老林15 小时前
Spring Boot 集成 iText 7 实现动态 PDF 生成与电子签章:合同、报表场景实战
spring boot·后端·pdf·itext7·电子签章
孙启超15 小时前
【AI开发之Rust】第 19 课:UniFFI 导出核心能力
开发语言·后端·rust
ServBay15 小时前
基于Jev的浏览器Agent插件狂揽 21k star,3分钟教你解放双手
后端·aigc·ai编程