尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

从 PHP 到 AI + Golang,程序员自救转型手记(五十九):前后端自定义后台入口实现

从 PHP 到 AI + Golang,程序员自救转型手记(五十九):前后端自定义后台入口实现 这是一个系列 Blog作者将以一个 PHP 全栈工程师的身份利用 AI 工具claude code、codex、deepseek、豆包等从零开始学习 golang 语言并最终完成 ai-go-admingithub | gitee开源项目的制作欢迎 star~全程记录分享。在上一期我们进行了 “后台系统配置管理实现”本期将完成自定义后台入口实现自定义后台入口实现作为一个后台管理系统开发者能够自定义入口还算比较重要比如可以将域名/admin进入后台改为域名/dfwef1dki能够实现隐藏入口的目的。服务端先直接问问AI我要实现 “自定义后台入口” 的功能前端注册路由我已有方案现在的问题是gin 这边注册的 /admin 路由在什么地方修改合适能否走现有的文件配置系统还是只能使用固定常量所有注册/admin的路由的地方都使用该常量作为前缀是否有更好的办法其实我个人也是优先考虑文件配置方案这里之所以提供常量选项是因为配置总是需要先读取了才有而我们的路由注册是利用了init实现自动发现使用配置或许会不太方便AI 首先给出的方案也是使用文件配置系统实现增加一个app.admin_path配置项它说常量方案技术上可行但有一个限制改常量需要重新编译。实际上使用配置也是需要重新编译的因为就算配置重载了路由也不会重新注册要实现路由重新注册那就麻烦了还得清理旧的路由等没必要。也就是说重新编译是不可避免的而使用文件配置系统或者常量方式都可以实现需求。那当然是文件配置系统常量没有配置项方便和易管理不过配置名由 AI 生成的app.admin_path改为server.admin_base_route_path路由路径属于server层面的配置不应该放在app下让 AI 开始实现。review时看懂了 AI 的实现思路以往我们的路由注册是子模块在init()内调用路由注册函数如下funcinit(){registry.Register(func(r*gin.Engine){repo:repoCommon.NewConfigRepository()svc:svcRoutine.NewConfigService(repo)h:handlerRoutine.NewConfigHandler(svc,repo)group:r.Group(/admin/routine/config)h.RegisterRoutes(group)})}init()函数会在包载入时被自动执行而registry.Register函数会将传入的路由注册函数全部收集起来然后系统的入口文件内会统一调用router.Setup完成所有路由的注册// Setup 遍历所有已注册的路由模块传入 Engine 完成注册funcSetup(r*gin.Engine){for_,fn:rangeregistry.Routes{fn(r)}}AI 的自定义入口思路是先定义一个registry.RegisterAdmin它不是接受Engine而是接受一个gin 的路由 group我们只需要将后台的路由注册函数由registry.Register换为registry.RegisterAdmin即可funcinit(){registry.RegisterAdmin(func(group*gin.RouterGroup){repo:repoAdmin.NewAdminRuleRepository()svc:svcAuth.NewAuthAdminRuleService(repo)h:handlerAuth.NewAuthAdminRuleHandler(svc)subGroup:group.Group(/auth/rule)h.RegisterRoutes(subGroup)})}router.Setup现在会单独注册全部的后台路由并且为它传递adminGroup如下// Setup 遍历所有已注册的路由模块传入 Engine 完成注册funcSetup(r*gin.Engine){for_,fn:rangeregistry.Routes{fn(r)}// 后台路由分组adminGroup:r.Group(config.Get().Server.AdminBaseRoutePath)// 注册全部后台路由for_,fn:rangeregistry.AdminRoutes{fn(adminGroup)}}额外还发现了以下细节点需额外处理AdminLog 中间件可以移动注册位置以前AdminLog中间件是在serve.go中全局注册的// 注册管理员操作日志中间件engine.Use(middleware.AdminLog())现在可以直接改到router.Setup的后台路由分组上。funcSetup(r*gin.Engine){for_,fn:rangeregistry.Routes{fn(r)}adminGroup:r.Group(config.Get().Server.AdminBaseRoutePath)// 注册管理员操作日志中间件adminGroup.Use(middleware.AdminLog())for_,fn:rangeregistry.AdminRoutes{fn(adminGroup)}}BuildCheckPath 的改动优化BuildCheckPath的内部会先去掉传入字符串的/admin/前缀相当于以前是写死的admin 路由前缀字面量现在我们要支持自定义此处自然也应该使用变量替换即config.Get().Server.AdminBaseRoutePath/替换/admin/。但 AI 实现的是BuildCheckPath额外接受一个adminPath参数而不是自己去读config数据funcBuildCheckPath(fullPathstring,adminPathstring)这里完全可以改为函数内自行读取因为此函数本来就在infra文件夹内不是pkg之类的公共包。以上只是一个案例这里让 AI 将所有适合自行读取admin 路由前缀配置的全部都自行读取不要加参数去传。前端前端自定义后台入口是本来就支持的我们的admin路由前缀全部都是使用的常量需要修改时调整常量值就行了。前端请求函数修改前端请求函数还是在请求原本的/admin并没有使用admin路由前缀常量而在API请求函数里边该常量其实非常不方便全局替换的方式更加合理在请求封装src\utils\request.ts的拦截器中// 自定义后台入口支持将请求 URL 中的 /admin 前缀替换为实际配置的后台路径// opts.replaceCustomAdminPath 默认为 trueif(opts.replaceCustomAdminPath!falseadminBaseRoutePath!/admin/^\/admin\//.test(config.url!)){config.urlconfig.url!.replace(/^\/admin\//,adminBaseRoutePath/)}如上请求接口和注册路由时前端终究需要知道自定义的后台入口值是多少所以避免不了有泄露的可能所以我开篇只是将此功能描述为还算比较重要
返回列表