chore: 清理敏感与开发文档,仅同步代码

- 永久忽略并从仓库移除 开发文档/
- 移除并忽略 .env 与小程序私有配置
- 同步小程序/管理端/API与脚本改动

Made-with: Cursor
This commit is contained in:
卡若
2026-03-17 17:50:12 +08:00
parent 868b0a10d9
commit 76965adb23
443 changed files with 24175 additions and 64154 deletions

View File

@@ -1,9 +1,13 @@
package router
import (
"context"
"soul-api/internal/config"
"soul-api/internal/database"
"soul-api/internal/handler"
"soul-api/internal/middleware"
"soul-api/internal/redis"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
@@ -28,7 +32,11 @@ func Setup(cfg *config.Config) *gin.Engine {
rateLimiter := middleware.NewRateLimiter(100, 200)
r.Use(rateLimiter.Middleware())
r.Static("/uploads", "./uploads")
uploadDir := cfg.UploadDir
if uploadDir == "" {
uploadDir = "./uploads"
}
r.Static("/uploads", uploadDir)
api := r.Group("/api")
{
@@ -48,8 +56,12 @@ func Setup(cfg *config.Config) *gin.Engine {
admin.POST("/content", handler.AdminContent)
admin.PUT("/content", handler.AdminContent)
admin.DELETE("/content", handler.AdminContent)
admin.GET("/dashboard/stats", handler.AdminDashboardStats)
admin.GET("/dashboard/recent-orders", handler.AdminDashboardRecentOrders)
admin.GET("/dashboard/new-users", handler.AdminDashboardNewUsers)
admin.GET("/dashboard/overview", handler.AdminDashboardOverview)
admin.GET("/distribution/overview", handler.AdminDistributionOverview)
admin.GET("/dashboard/merchant-balance", handler.AdminDashboardMerchantBalance)
admin.GET("/distribution/overview", handler.AdminDistributionOverview)
admin.GET("/payment", handler.AdminPayment)
admin.POST("/payment", handler.AdminPayment)
admin.PUT("/payment", handler.AdminPayment)
@@ -65,34 +77,44 @@ func Setup(cfg *config.Config) *gin.Engine {
admin.POST("/withdraw-test", handler.AdminWithdrawTest)
admin.GET("/settings", handler.AdminSettingsGet)
admin.POST("/settings", handler.AdminSettingsPost)
admin.GET("/linked-miniprograms", handler.AdminLinkedMpList)
admin.POST("/linked-miniprograms", handler.AdminLinkedMpCreate)
admin.PUT("/linked-miniprograms", handler.AdminLinkedMpUpdate)
admin.DELETE("/linked-miniprograms/:id", handler.AdminLinkedMpDelete)
admin.GET("/referral-settings", handler.AdminReferralSettingsGet)
admin.POST("/referral-settings", handler.AdminReferralSettingsPost)
// 存客宝开放 API 辅助接口:设备列表(供链接人与事选择设备)
admin.GET("/ckb/devices", handler.AdminCKBDevices)
admin.GET("/author-settings", handler.AdminAuthorSettingsGet)
admin.POST("/author-settings", handler.AdminAuthorSettingsPost)
admin.GET("/shensheshou/query", handler.AdminShensheShouQuery)
admin.POST("/shensheshou/enrich", handler.AdminShensheShouEnrich)
admin.POST("/shensheshou/ingest", handler.AdminShensheShouIngest)
admin.PUT("/orders/refund", handler.AdminOrderRefund)
admin.GET("/users/:id/balance", handler.AdminUserBalanceGet)
admin.POST("/users/:id/balance/adjust", handler.AdminUserBalanceAdjust)
admin.GET("/users", handler.AdminUsersList)
admin.POST("/users", handler.AdminUsersAction)
admin.PUT("/users", handler.AdminUsersAction)
admin.DELETE("/users", handler.AdminUsersAction)
// 神射手 / 用户资料完善
admin.GET("/shensheshou/query", handler.AdminShensheShouQuery)
admin.POST("/shensheshou/ingest", handler.AdminShensheShouIngest)
admin.POST("/shensheshou/batch", handler.AdminShensheShouBatchQuery)
admin.POST("/shensheshou/enrich", handler.AdminShensheShouEnrich)
admin.GET("/orders", handler.OrdersList)
admin.GET("/gift-pay-requests", handler.AdminGiftPayRequestsList)
admin.GET("/user/track", handler.UserTrackGet)
admin.GET("/track/stats", handler.AdminTrackStats)
}
// ----- 鉴权 -----
api.POST("/auth/login", handler.AuthLogin)
api.POST("/auth/reset-password", handler.AuthResetPassword)
// ----- 书籍/章节 -----
// ----- 书籍/章节(只读,写操作由 /api/db/book 管理端路由承担) -----
api.GET("/book/all-chapters", handler.BookAllChapters)
api.GET("/book/parts", handler.BookParts)
api.GET("/book/chapters-by-part", handler.BookChaptersByPart)
api.GET("/book/chapter/:id", handler.BookChapterByID)
api.GET("/book/chapter/by-mid/:mid", handler.BookChapterByMID)
api.GET("/book/chapters", handler.BookChapters)
api.POST("/book/chapters", handler.BookChapters)
api.PUT("/book/chapters", handler.BookChapters)
api.DELETE("/book/chapters", handler.BookChapters)
// POST/PUT/DELETE /api/book/chapters 已移除:写操作须由管理端 /api/db/bookAdminAuth完成
api.GET("/book/hot", handler.BookHot)
api.GET("/book/recommended", handler.BookRecommended)
api.GET("/book/latest-chapters", handler.BookLatestChapters)
@@ -115,11 +137,15 @@ func Setup(cfg *config.Config) *gin.Engine {
// ----- 内容 -----
api.GET("/content", handler.ContentGet)
// ----- 定时任务 -----
api.GET("/cron/sync-orders", handler.CronSyncOrders)
api.POST("/cron/sync-orders", handler.CronSyncOrders)
api.GET("/cron/unbind-expired", handler.CronUnbindExpired)
api.POST("/cron/unbind-expired", handler.CronUnbindExpired)
// ----- 定时任务(须携带 X-Cron-Secret 请求头,与 .env CRON_SECRET 一致) -----
cron := api.Group("/cron")
cron.Use(middleware.CronAuth())
{
cron.GET("/sync-orders", handler.CronSyncOrders)
cron.POST("/sync-orders", handler.CronSyncOrders)
cron.GET("/unbind-expired", handler.CronUnbindExpired)
cron.POST("/unbind-expired", handler.CronUnbindExpired)
}
// ----- 数据库(管理端) -----
db := api.Group("/db")
@@ -144,36 +170,33 @@ func Setup(cfg *config.Config) *gin.Engine {
db.PUT("/users", handler.DBUsersAction)
db.DELETE("/users", handler.DBUsersDelete)
db.GET("/users/referrals", handler.DBUsersReferrals)
db.GET("/users/rfm", handler.DBUsersRFM)
db.GET("/users/journey-stats", handler.DBUsersJourneyStats)
db.GET("/vip-roles", handler.DBVipRolesList)
db.POST("/vip-roles", handler.DBVipRolesAction)
db.PUT("/vip-roles", handler.DBVipRolesAction)
db.DELETE("/vip-roles", handler.DBVipRolesAction)
db.GET("/vip-members", handler.DBVipMembersList)
db.GET("/match-records", handler.DBMatchRecordsList)
db.POST("/match-records/test", handler.DBMatchRecordInsertTest)
db.GET("/match-pool-counts", handler.DBMatchPoolCounts)
db.GET("/ckb-plan-stats", handler.CKBPlanStats)
db.GET("/ckb-leads", handler.DBCKBLeadList)
db.GET("/persons", handler.DBPersonList)
db.POST("/persons", handler.DBPersonSave)
db.DELETE("/persons", handler.DBPersonDelete)
db.GET("/link-tags", handler.DBLinkTagList)
db.POST("/link-tags", handler.DBLinkTagSave)
db.DELETE("/link-tags", handler.DBLinkTagDelete)
db.GET("/mentors", handler.DBMentorsList)
db.POST("/mentors", handler.DBMentorsAction)
db.PUT("/mentors", handler.DBMentorsAction)
db.DELETE("/mentors", handler.DBMentorsAction)
db.GET("/mentor-consultations", handler.DBMentorConsultationsList)
// 用户旅程规则
db.GET("/persons", handler.DBPersonList)
db.GET("/person", handler.DBPersonDetail)
db.POST("/persons", handler.DBPersonSave)
db.DELETE("/persons", handler.DBPersonDelete)
db.GET("/link-tags", handler.DBLinkTagList)
db.POST("/link-tags", handler.DBLinkTagSave)
db.DELETE("/link-tags", handler.DBLinkTagDelete)
db.GET("/ckb-leads", handler.DBCKBLeadList)
db.GET("/ckb-plan-stats", handler.CKBPlanStats)
db.GET("/user-rules", handler.DBUserRulesList)
db.POST("/user-rules", handler.DBUserRulesAction)
db.PUT("/user-rules", handler.DBUserRulesAction)
db.DELETE("/user-rules", handler.DBUserRulesAction)
// RFM 估值
db.GET("/users/rfm", handler.DBUsersRFM)
db.GET("/users/rfm-single", handler.DBUserRFMSingle)
// 用户旅程总览统计
db.GET("/users/journey-stats", handler.DBUsersJourneyStats)
}
// ----- 分销 -----
@@ -197,8 +220,7 @@ func Setup(cfg *config.Config) *gin.Engine {
// ----- 菜单 -----
api.GET("/menu", handler.MenuGet)
// ----- 订单 -----
api.GET("/orders", handler.OrdersList)
// /api/orders 已移入 admin 组(需鉴权),见下方
// ----- 支付 -----
api.POST("/payment/alipay/notify", handler.PaymentAlipayNotify)
@@ -255,6 +277,7 @@ func Setup(cfg *config.Config) *gin.Engine {
miniprogram.GET("/config", handler.GetPublicDBConfig)
miniprogram.POST("/login", handler.MiniprogramLogin)
miniprogram.POST("/phone-login", handler.WechatPhoneLogin)
miniprogram.POST("/dev/login-as", handler.MiniprogramDevLoginAs) // 开发专用:按 userId 切换账号
miniprogram.POST("/phone", handler.MiniprogramPhone)
miniprogram.GET("/pay", handler.MiniprogramPay)
miniprogram.POST("/pay", handler.MiniprogramPay)
@@ -262,6 +285,8 @@ func Setup(cfg *config.Config) *gin.Engine {
miniprogram.POST("/qrcode", handler.MiniprogramQrcode)
miniprogram.GET("/qrcode/image", handler.MiniprogramQrcodeImage)
miniprogram.GET("/book/all-chapters", handler.BookAllChapters)
miniprogram.GET("/book/parts", handler.BookParts)
miniprogram.GET("/book/chapters-by-part", handler.BookChaptersByPart)
miniprogram.GET("/book/chapter/:id", handler.BookChapterByID)
miniprogram.GET("/book/chapter/by-mid/:mid", handler.BookChapterByMID)
miniprogram.GET("/book/hot", handler.BookHot)
@@ -278,6 +303,7 @@ func Setup(cfg *config.Config) *gin.Engine {
miniprogram.POST("/ckb/join", handler.CKBJoin)
miniprogram.POST("/ckb/match", handler.CKBMatch)
miniprogram.POST("/ckb/lead", handler.CKBLead)
miniprogram.POST("/ckb/index-lead", handler.CKBIndexLead)
miniprogram.POST("/upload", handler.UploadPost)
miniprogram.DELETE("/upload", handler.UploadDelete)
miniprogram.GET("/user/addresses", handler.UserAddressesGet)
@@ -286,10 +312,10 @@ func Setup(cfg *config.Config) *gin.Engine {
miniprogram.PUT("/user/addresses/:id", handler.UserAddressesByID)
miniprogram.DELETE("/user/addresses/:id", handler.UserAddressesByID)
miniprogram.GET("/user/check-purchased", handler.UserCheckPurchased)
miniprogram.GET("/user/dashboard-stats", handler.UserDashboardStats)
miniprogram.GET("/user/profile", handler.UserProfileGet)
miniprogram.POST("/user/profile", handler.UserProfilePost)
miniprogram.GET("/user/purchase-status", handler.UserPurchaseStatus)
miniprogram.GET("/user/dashboard-stats", handler.UserDashboardStatsGet)
miniprogram.GET("/user/reading-progress", handler.UserReadingProgressGet)
miniprogram.POST("/user/reading-progress", handler.UserReadingProgressPost)
miniprogram.POST("/user/update", handler.UserUpdate)
@@ -311,6 +337,25 @@ func Setup(cfg *config.Config) *gin.Engine {
miniprogram.GET("/mentors/:id", handler.MiniprogramMentorsDetail)
miniprogram.POST("/mentors/:id/book", handler.MiniprogramMentorsBook)
miniprogram.GET("/about/author", handler.MiniprogramAboutAuthor)
// 埋点
miniprogram.POST("/track", handler.MiniprogramTrackPost)
// 规则引擎(用户旅程引导)
miniprogram.GET("/user-rules", handler.MiniprogramUserRulesGet)
// 余额
miniprogram.GET("/balance", handler.BalanceGet)
miniprogram.GET("/balance/transactions", handler.BalanceTransactionsGet)
miniprogram.POST("/balance/recharge", handler.BalanceRechargePost)
miniprogram.POST("/balance/recharge/confirm", handler.BalanceRechargeConfirmPost)
miniprogram.POST("/balance/refund", handler.BalanceRefundPost)
miniprogram.POST("/balance/consume", handler.BalanceConsumePost)
miniprogram.GET("/gift/link", handler.GiftLinkGet)
// 代付(美团式:代付页面)
miniprogram.POST("/gift-pay/create", handler.GiftPayCreate)
miniprogram.GET("/gift-pay/detail", handler.GiftPayDetail)
miniprogram.POST("/gift-pay/pay", handler.GiftPayPay)
miniprogram.POST("/gift-pay/cancel", handler.GiftPayCancel)
miniprogram.GET("/gift-pay/my-requests", handler.GiftPayMyRequests)
miniprogram.GET("/gift-pay/my-payments", handler.GiftPayMyPayments)
}
// ----- 提现 -----
@@ -332,11 +377,29 @@ func Setup(cfg *config.Config) *gin.Engine {
c.Status(204)
})
// 健康检查:返回状态版本号(版本号从 .env 的 APP_VERSION 读取,打包/上传前写入)
// 健康检查:返回状态版本号、数据库与 Redis 连接状态
r.GET("/health", func(c *gin.Context) {
dbStatus := "ok"
if sqlDB, err := database.DB().DB(); err != nil {
dbStatus = "error"
} else if err := sqlDB.Ping(); err != nil {
dbStatus = "disconnected"
}
redisStatus := "disabled"
if redis.Client() != nil {
if err := redis.Client().Ping(context.Background()).Err(); err != nil {
redisStatus = "disconnected"
} else {
redisStatus = "ok"
}
}
c.JSON(200, gin.H{
"status": "ok",
"version": cfg.Version,
"database": dbStatus,
"redis": redisStatus,
})
})