feat(marketing): 新增营销图管理模块

- 新增 marketing 模块:model/repository/service/handler 四层架构
- 数据模型:marketing_categories、marketing_templates、marketing_user_downloads
- 小程序端接口:分类列表、模板列表/详情、下载记录、广告回调
- 管理后台接口:分类/模板 CRUD、下载统计(X-Admin-Token 鉴权)
- 路由注册:接入现有 AuthMiddleware,新增 AdminTokenMiddleware
- Web 管理后台:单页面 Vue3 + Element Plus(分类管理、模板管理、数据概览)

Closes #37, #38, #39, #40

Made-with: Cursor
This commit is contained in:
nepiedg
2026-03-06 07:36:05 +00:00
parent 5f492929df
commit ac49e1458c
17 changed files with 1599 additions and 1 deletions
+18 -1
View File
@@ -19,6 +19,10 @@ import (
expiry "wx_service/internal/expiry"
lawyerhandler "wx_service/internal/lawyer/handler"
lawyerservice "wx_service/internal/lawyer/service"
marketinghandler "wx_service/internal/marketing/handler"
marketingmodel "wx_service/internal/marketing/model"
marketingrepo "wx_service/internal/marketing/repository"
marketingservice "wx_service/internal/marketing/service"
membershiphandler "wx_service/internal/membership/handler"
membershipmodel "wx_service/internal/membership/model"
membershipservice "wx_service/internal/membership/service"
@@ -65,6 +69,9 @@ func main() {
&smokemodel.SmokeAIAdviceUnlock{},
&smokemodel.SmokeAINextSmoke{},
&smokemodel.SmokeMotivationQuote{},
&marketingmodel.MarketingCategory{},
&marketingmodel.MarketingTemplate{},
&marketingmodel.MarketingDownload{},
); err != nil {
log.Fatalf("auto migrate failed: %v", err)
}
@@ -127,8 +134,18 @@ func main() {
}
expiryHandler := expiry.NewHandler(expiryService)
categoryRepo := marketingrepo.NewCategoryRepository(database.DB)
templateRepo := marketingrepo.NewTemplateRepository(database.DB)
downloadRepo := marketingrepo.NewDownloadRepository(database.DB)
categorySvc := marketingservice.NewCategoryService(categoryRepo)
templateSvc := marketingservice.NewTemplateService(templateRepo)
downloadSvc := marketingservice.NewDownloadService(downloadRepo, templateRepo)
marketingCategoryHandler := marketinghandler.NewCategoryHandler(categorySvc)
marketingTemplateHandler := marketinghandler.NewTemplateHandler(templateSvc)
marketingDownloadHandler := marketinghandler.NewDownloadHandler(downloadSvc)
// 6) 注册路由:把 URL 映射到 handler
routes.Register(router, database.DB, authHandler, videoHandler, smokeHandler, redeemCodeHandler, uploadHandler, oaOAuthHandler, sessionCache, lawyerHandler, expiryHandler)
routes.Register(router, database.DB, authHandler, videoHandler, smokeHandler, redeemCodeHandler, uploadHandler, oaOAuthHandler, sessionCache, lawyerHandler, expiryHandler, config.AppConfig.Admin.Token, marketingCategoryHandler, marketingTemplateHandler, marketingDownloadHandler)
// 7) 启动监听端口
addr := ":" + config.AppConfig.Server.Port