从 PHP 到 AI + Golang,程序员自救转型手记(五十九):前后端自定义后台入口实现
ä» PHP å° AI + Golangï¼ç¨åºåèªæè½¬åæè®°ï¼äºåä¹ï¼ï¼åå端èªå®ä¹åå°å ¥å£å®ç°
å¦ç çè± 2026-08-08 0 é 读4åéè¿æ¯ä¸ä¸ªç³»å Blogï¼ä½è å°ä»¥ä¸ä¸ª PHP å ¨æ å·¥ç¨å¸ç身份ï¼å©ç¨ AI å·¥å ·ï¼claude codeãcodexãdeepseekãè±å çï¼ï¼ä»é¶å¼å§å¦ä¹ golang è¯è¨ï¼å¹¶æç»å®æ ai-go-adminï¼github | 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() å
è°ç¨è·¯ç±æ³¨å彿°ï¼å¦ä¸
func init() {
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 å®ææ³¨å
func Setup(r *gin.Engine) {
for _, fn := range registry.Routes {
fn(r)
}
}
AI çèªå®ä¹å
¥å£æè·¯æ¯ï¼å
å®ä¹ä¸ä¸ª registry.RegisterAdminï¼å®ä¸æ¯æ¥å Engineï¼èæ¯æ¥åä¸ä¸ª gin çè·¯ç± groupï¼æä»¬åªéè¦å°åå°çè·¯ç±æ³¨å彿°ç± registry.Register æ¢ä¸º registry.RegisterAdmin å³å¯ï¼
func init() {
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 å®ææ³¨å
func Setup(r *gin.Engine) {
for _, fn := range registry.Routes {
fn(r)
}
// åå°è·¯ç±åç»
adminGroup := r.Group(config.Get().Server.AdminBaseRoutePath)
// 注åå
¨é¨åå°è·¯ç±
for _, fn := range registry.AdminRoutes {
fn(adminGroup)
}
}
é¢å¤è¿åç°äºä»¥ä¸ç»èç¹éé¢å¤å¤çï¼
AdminLog ä¸é´ä»¶å¯ä»¥ç§»å¨æ³¨åä½ç½®
以å AdminLog ä¸é´ä»¶æ¯å¨ serve.go ä¸å
¨å±æ³¨åçï¼
// 注å管çåæä½æ¥å¿ä¸é´ä»¶
engine.Use(middleware.AdminLog())
ç°å¨å¯ä»¥ç´æ¥æ¹å° router.Setup ç åå°è·¯ç±åç» ä¸ã
func Setup(r *gin.Engine) {
for _, fn := range registry.Routes {
fn(r)
}
adminGroup := r.Group(config.Get().Server.AdminBaseRoutePath)
// 注å管çåæä½æ¥å¿ä¸é´ä»¶
adminGroup.Use(middleware.AdminLog())
for _, fn := range registry.AdminRoutes {
fn(adminGroup)
}
}
BuildCheckPath çæ¹å¨ä¼å
BuildCheckPath çå
é¨ä¼å
å»æä¼ å
¥å符串ç /admin/ åç¼ï¼ç¸å½äºä»¥åæ¯åæ»ç admin è·¯ç±åç¼åé¢éï¼ç°å¨æä»¬è¦æ¯æèªå®ä¹ï¼æ¤å¤èªç¶ä¹åºè¯¥ä½¿ç¨åéæ¿æ¢ï¼å³ config.Get().Server.AdminBaseRoutePath+"/" æ¿æ¢ /admin/ã
ä½ AI å®ç°çæ¯ BuildCheckPath é¢å¤æ¥åä¸ä¸ª adminPath åæ°ï¼è䏿¯èªå·±å»è¯» config æ°æ®ï¼
func BuildCheckPath(fullPath string, adminPath string)
è¿éå®å
¨å¯ä»¥æ¹ä¸ºå½æ°å
èªè¡è¯»åï¼å 为æ¤å½æ°æ¬æ¥å°±å¨ infra æä»¶å¤¹å
ï¼ä¸æ¯ pkg ä¹ç±»çå
Œ
±å
ã
以ä¸åªæ¯ä¸ä¸ªæ¡ä¾ï¼è¿é让 AI å°ææéåèªè¡è¯»å admin è·¯ç±åç¼é
ç½® çï¼å
¨é¨é½èªè¡è¯»åï¼ä¸è¦å åæ°å»ä¼ ã
å端
å端èªå®ä¹åå°å
¥å£æ¯æ¬æ¥å°±æ¯æçï¼æä»¬ç admin è·¯ç±åç¼å
¨é¨é½æ¯ä½¿ç¨ç 常é ï¼éè¦ä¿®æ¹æ¶ï¼è°æ´å¸¸éå¼å°±è¡äºã
å端请æ±å½æ°ä¿®æ¹
å端请æ±å½æ°è¿æ¯å¨è¯·æ±åæ¬ç /adminï¼å¹¶æ²¡æä½¿ç¨ admin è·¯ç±åç¼å¸¸éï¼èå¨ API 请æ±å½æ°é边该常éå
¶å®é叏䏿¹ä¾¿ï¼å
¨å±æ¿æ¢çæ¹å¼æ´å åçï¼å¨è¯·æ±å°è£
src\utils\request.ts çæ¦æªå¨ä¸ï¼
// èªå®ä¹åå°å
¥å£æ¯æï¼å°è¯·æ± URL ä¸ç /admin åç¼æ¿æ¢ä¸ºå®é
é
ç½®çåå°è·¯å¾
// opts.replaceCustomAdminPath é»è®¤ä¸º true
if (opts.replaceCustomAdminPath !== false && adminBaseRoutePath !== '/admin' && /^\/admin\//.test(config.url!)) {
config.url = config.url!.replace(/^\/admin\//, adminBaseRoutePath + '/')
}
å¦ä¸ï¼è¯·æ±æ¥å£å注åè·¯ç±æ¶ï¼å端ç»ç©¶éè¦ç¥éèªå®ä¹çåå°å ¥å£å¼æ¯å¤å°ï¼æä»¥é¿å ä¸äºææ³é²çå¯è½ï¼æä»¥æå¼ç¯åªæ¯å°æ¤åè½æè¿°ä¸ºï¼è¿ç®æ¯è¾éè¦
Aitishiku.com