Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
陈曦
sub2api
Commits
57fd1722
Commit
57fd1722
authored
Dec 26, 2025
by
Forest
Browse files
refactor: 调整 server 目录结构
parent
8d7a4975
Changes
27
Hide whitespace changes
Inline
Side-by-side
backend/internal/server/routes/auth.go
0 → 100644
View file @
57fd1722
package
routes
import
(
"github.com/Wei-Shaw/sub2api/internal/handler"
"github.com/Wei-Shaw/sub2api/internal/server/middleware"
"github.com/gin-gonic/gin"
)
// RegisterAuthRoutes 注册认证相关路由
func
RegisterAuthRoutes
(
v1
*
gin
.
RouterGroup
,
h
*
handler
.
Handlers
,
jwtAuth
middleware
.
JWTAuthMiddleware
,
)
{
// 公开接口
auth
:=
v1
.
Group
(
"/auth"
)
{
auth
.
POST
(
"/register"
,
h
.
Auth
.
Register
)
auth
.
POST
(
"/login"
,
h
.
Auth
.
Login
)
auth
.
POST
(
"/send-verify-code"
,
h
.
Auth
.
SendVerifyCode
)
}
// 公开设置(无需认证)
settings
:=
v1
.
Group
(
"/settings"
)
{
settings
.
GET
(
"/public"
,
h
.
Setting
.
GetPublicSettings
)
}
// 需要认证的当前用户信息
authenticated
:=
v1
.
Group
(
""
)
authenticated
.
Use
(
gin
.
HandlerFunc
(
jwtAuth
))
{
authenticated
.
GET
(
"/auth/me"
,
h
.
Auth
.
GetCurrentUser
)
}
}
backend/internal/server/routes/common.go
0 → 100644
View file @
57fd1722
package
routes
import
(
"net/http"
"github.com/gin-gonic/gin"
)
// RegisterCommonRoutes 注册通用路由(健康检查、状态等)
func
RegisterCommonRoutes
(
r
*
gin
.
Engine
)
{
// 健康检查
r
.
GET
(
"/health"
,
func
(
c
*
gin
.
Context
)
{
c
.
JSON
(
http
.
StatusOK
,
gin
.
H
{
"status"
:
"ok"
})
})
// Claude Code 遥测日志(忽略,直接返回200)
r
.
POST
(
"/api/event_logging/batch"
,
func
(
c
*
gin
.
Context
)
{
c
.
Status
(
http
.
StatusOK
)
})
// Setup status endpoint (always returns needs_setup: false in normal mode)
// This is used by the frontend to detect when the service has restarted after setup
r
.
GET
(
"/setup/status"
,
func
(
c
*
gin
.
Context
)
{
c
.
JSON
(
http
.
StatusOK
,
gin
.
H
{
"code"
:
0
,
"data"
:
gin
.
H
{
"needs_setup"
:
false
,
"step"
:
"completed"
,
},
})
})
}
backend/internal/server/routes/gateway.go
0 → 100644
View file @
57fd1722
package
routes
import
(
"github.com/Wei-Shaw/sub2api/internal/handler"
"github.com/Wei-Shaw/sub2api/internal/server/middleware"
"github.com/gin-gonic/gin"
)
// RegisterGatewayRoutes 注册 API 网关路由(Claude/OpenAI 兼容)
func
RegisterGatewayRoutes
(
r
*
gin
.
Engine
,
h
*
handler
.
Handlers
,
apiKeyAuth
middleware
.
ApiKeyAuthMiddleware
,
)
{
// API网关(Claude API兼容)
gateway
:=
r
.
Group
(
"/v1"
)
gateway
.
Use
(
gin
.
HandlerFunc
(
apiKeyAuth
))
{
gateway
.
POST
(
"/messages"
,
h
.
Gateway
.
Messages
)
gateway
.
POST
(
"/messages/count_tokens"
,
h
.
Gateway
.
CountTokens
)
gateway
.
GET
(
"/models"
,
h
.
Gateway
.
Models
)
gateway
.
GET
(
"/usage"
,
h
.
Gateway
.
Usage
)
// OpenAI Responses API
gateway
.
POST
(
"/responses"
,
h
.
OpenAIGateway
.
Responses
)
}
// OpenAI Responses API(不带v1前缀的别名)
r
.
POST
(
"/responses"
,
gin
.
HandlerFunc
(
apiKeyAuth
),
h
.
OpenAIGateway
.
Responses
)
}
backend/internal/server/routes/user.go
0 → 100644
View file @
57fd1722
package
routes
import
(
"github.com/Wei-Shaw/sub2api/internal/handler"
"github.com/Wei-Shaw/sub2api/internal/server/middleware"
"github.com/gin-gonic/gin"
)
// RegisterUserRoutes 注册用户相关路由(需要认证)
func
RegisterUserRoutes
(
v1
*
gin
.
RouterGroup
,
h
*
handler
.
Handlers
,
jwtAuth
middleware
.
JWTAuthMiddleware
,
)
{
authenticated
:=
v1
.
Group
(
""
)
authenticated
.
Use
(
gin
.
HandlerFunc
(
jwtAuth
))
{
// 用户接口
user
:=
authenticated
.
Group
(
"/user"
)
{
user
.
GET
(
"/profile"
,
h
.
User
.
GetProfile
)
user
.
PUT
(
"/password"
,
h
.
User
.
ChangePassword
)
user
.
PUT
(
""
,
h
.
User
.
UpdateProfile
)
}
// API Key管理
keys
:=
authenticated
.
Group
(
"/keys"
)
{
keys
.
GET
(
""
,
h
.
APIKey
.
List
)
keys
.
GET
(
"/:id"
,
h
.
APIKey
.
GetByID
)
keys
.
POST
(
""
,
h
.
APIKey
.
Create
)
keys
.
PUT
(
"/:id"
,
h
.
APIKey
.
Update
)
keys
.
DELETE
(
"/:id"
,
h
.
APIKey
.
Delete
)
}
// 用户可用分组(非管理员接口)
groups
:=
authenticated
.
Group
(
"/groups"
)
{
groups
.
GET
(
"/available"
,
h
.
APIKey
.
GetAvailableGroups
)
}
// 使用记录
usage
:=
authenticated
.
Group
(
"/usage"
)
{
usage
.
GET
(
""
,
h
.
Usage
.
List
)
usage
.
GET
(
"/:id"
,
h
.
Usage
.
GetByID
)
usage
.
GET
(
"/stats"
,
h
.
Usage
.
Stats
)
// User dashboard endpoints
usage
.
GET
(
"/dashboard/stats"
,
h
.
Usage
.
DashboardStats
)
usage
.
GET
(
"/dashboard/trend"
,
h
.
Usage
.
DashboardTrend
)
usage
.
GET
(
"/dashboard/models"
,
h
.
Usage
.
DashboardModels
)
usage
.
POST
(
"/dashboard/api-keys-usage"
,
h
.
Usage
.
DashboardApiKeysUsage
)
}
// 卡密兑换
redeem
:=
authenticated
.
Group
(
"/redeem"
)
{
redeem
.
POST
(
""
,
h
.
Redeem
.
Redeem
)
redeem
.
GET
(
"/history"
,
h
.
Redeem
.
GetHistory
)
}
// 用户订阅
subscriptions
:=
authenticated
.
Group
(
"/subscriptions"
)
{
subscriptions
.
GET
(
""
,
h
.
Subscription
.
List
)
subscriptions
.
GET
(
"/active"
,
h
.
Subscription
.
GetActive
)
subscriptions
.
GET
(
"/progress"
,
h
.
Subscription
.
GetProgress
)
subscriptions
.
GET
(
"/summary"
,
h
.
Subscription
.
GetSummary
)
}
}
}
backend/internal/service/service.go
deleted
100644 → 0
View file @
8d7a4975
package
service
// Services 服务集合容器
type
Services
struct
{
Auth
*
AuthService
User
*
UserService
ApiKey
*
ApiKeyService
Group
*
GroupService
Account
*
AccountService
Proxy
*
ProxyService
Redeem
*
RedeemService
Usage
*
UsageService
Pricing
*
PricingService
Billing
*
BillingService
BillingCache
*
BillingCacheService
Admin
AdminService
Gateway
*
GatewayService
OpenAIGateway
*
OpenAIGatewayService
OAuth
*
OAuthService
OpenAIOAuth
*
OpenAIOAuthService
RateLimit
*
RateLimitService
AccountUsage
*
AccountUsageService
AccountTest
*
AccountTestService
Setting
*
SettingService
Email
*
EmailService
EmailQueue
*
EmailQueueService
Turnstile
*
TurnstileService
Subscription
*
SubscriptionService
Concurrency
*
ConcurrencyService
Identity
*
IdentityService
Update
*
UpdateService
TokenRefresh
*
TokenRefreshService
}
backend/internal/service/user_service.go
View file @
57fd1722
...
...
@@ -60,6 +60,15 @@ func NewUserService(userRepo UserRepository) *UserService {
}
}
// GetFirstAdmin 获取首个管理员用户(用于 Admin API Key 认证)
func
(
s
*
UserService
)
GetFirstAdmin
(
ctx
context
.
Context
)
(
*
model
.
User
,
error
)
{
admin
,
err
:=
s
.
userRepo
.
GetFirstAdmin
(
ctx
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"get first admin: %w"
,
err
)
}
return
admin
,
nil
}
// GetProfile 获取用户资料
func
(
s
*
UserService
)
GetProfile
(
ctx
context
.
Context
,
userID
int64
)
(
*
model
.
User
,
error
)
{
user
,
err
:=
s
.
userRepo
.
GetByID
(
ctx
,
userID
)
...
...
backend/internal/service/wire.go
View file @
57fd1722
...
...
@@ -76,7 +76,4 @@ var ProviderSet = wire.NewSet(
NewCRSSyncService
,
ProvideUpdateService
,
ProvideTokenRefreshService
,
// Provide the Services container struct
wire
.
Struct
(
new
(
Services
),
"*"
),
)
Prev
1
2
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment