Skip to content

Commit c64f265

Browse files
committed
fix: fix some bug and ui && build v3.0.1-beta3
1 parent 67c1650 commit c64f265

File tree

4 files changed

+144
-19
lines changed

4 files changed

+144
-19
lines changed

cmd/server/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ func main() {
369369
log.Info("使用 Gin 路由器 (标准架构)")
370370
gin.SetMode(gin.ReleaseMode) // 设置为生产模式
371371

372-
ginRouter := router.SetupRouter(gormDB, sseService, sseManager, wsService)
372+
ginRouter := router.SetupRouter(gormDB, sseService, sseManager, wsService, Version)
373373

374374
// 配置静态文件服务
375375
if err := setupStaticFiles(ginRouter); err != nil {

internal/api/version.go

Lines changed: 53 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,11 @@ type GitHubRelease struct {
5353

5454
// UpdateInfo 更新信息结构
5555
type UpdateInfo struct {
56-
Current VersionInfo `json:"current"`
57-
Latest *GitHubRelease `json:"latest,omitempty"`
58-
HasUpdate bool `json:"hasUpdate"`
59-
UpdateContent string `json:"updateContent,omitempty"`
56+
Current VersionInfo `json:"current"`
57+
Stable *GitHubRelease `json:"stable,omitempty"`
58+
Beta *GitHubRelease `json:"beta,omitempty"`
59+
HasStableUpdate bool `json:"hasStableUpdate"`
60+
HasBetaUpdate bool `json:"hasBetaUpdate"`
6061
}
6162

6263
// UpdateResult 更新结果结构
@@ -87,7 +88,10 @@ func SetVersion(version string) {
8788
}
8889

8990
// setupVersionRoutes 设置版本相关路由
90-
func SetupVersionRoutes(rg *gin.RouterGroup) {
91+
func SetupVersionRoutes(rg *gin.RouterGroup, version string) {
92+
// 设置版本号
93+
SetVersion(version)
94+
9195
// 创建VersionHandler实例
9296
versionHandler := NewVersionHandler()
9397

@@ -124,24 +128,60 @@ func (h *VersionHandler) HandleCheckUpdate(c *gin.Context) {
124128
Arch: runtime.GOARCH,
125129
}
126130

127-
// 获取 GitHub 最新发布信息
128-
latest, err := h.getLatestRelease()
131+
// 获取所有发布信息
132+
releases, err := h.getReleaseHistory()
129133
if err != nil {
130134
c.JSON(http.StatusInternalServerError, gin.H{
131135
"success": false,
132-
"error": fmt.Sprintf("获取最新版本失败: %v", err),
136+
"error": fmt.Sprintf("获取版本信息失败: %v", err),
133137
})
134138
return
135139
}
136140

141+
var stableRelease, betaRelease *GitHubRelease
142+
143+
// 分离稳定版和测试版
144+
for _, release := range releases {
145+
if release.Draft {
146+
continue // 跳过草稿版本
147+
}
148+
149+
if release.Prerelease {
150+
// 这是测试版
151+
if betaRelease == nil {
152+
betaRelease = &release
153+
}
154+
} else {
155+
// 这是稳定版
156+
if stableRelease == nil {
157+
stableRelease = &release
158+
}
159+
}
160+
161+
// 如果都找到了,可以提前结束
162+
if stableRelease != nil && betaRelease != nil {
163+
break
164+
}
165+
}
166+
137167
// 检查是否有更新
138-
hasUpdate := h.compareVersions(Version, latest.TagName)
168+
hasStableUpdate := false
169+
hasBetaUpdate := false
170+
171+
if stableRelease != nil {
172+
hasStableUpdate = h.compareVersions(Version, stableRelease.TagName)
173+
}
174+
175+
if betaRelease != nil {
176+
hasBetaUpdate = h.compareVersions(Version, betaRelease.TagName)
177+
}
139178

140179
updateInfo := UpdateInfo{
141-
Current: current,
142-
Latest: latest,
143-
HasUpdate: hasUpdate,
144-
UpdateContent: latest.Body,
180+
Current: current,
181+
Stable: stableRelease,
182+
Beta: betaRelease,
183+
HasStableUpdate: hasStableUpdate,
184+
HasBetaUpdate: hasBetaUpdate,
145185
}
146186

147187
c.JSON(http.StatusOK, gin.H{

internal/router/router.go

Lines changed: 89 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,18 @@ import (
1010
"NodePassDash/internal/tag"
1111
"NodePassDash/internal/tunnel"
1212
"NodePassDash/internal/websocket"
13+
"fmt"
14+
"io"
1315
"net/http"
16+
"strings"
17+
"time"
1418

1519
"github.com/gin-gonic/gin"
1620
"gorm.io/gorm"
1721
)
1822

1923
// SetupRouter 创建并配置主路由器
20-
func SetupRouter(db *gorm.DB, sseService *sse.Service, sseManager *sse.Manager, wsService *websocket.Service) *gin.Engine {
24+
func SetupRouter(db *gorm.DB, sseService *sse.Service, sseManager *sse.Manager, wsService *websocket.Service, version string) *gin.Engine {
2125
r := gin.Default()
2226

2327
// 全局中间件
@@ -28,14 +32,17 @@ func SetupRouter(db *gorm.DB, sseService *sse.Service, sseManager *sse.Manager,
2832
c.JSON(http.StatusOK, gin.H{"status": "ok"})
2933
})
3034

35+
// 文档代理路由
36+
r.Any("/docs-proxy/*path", docsProxyHandler)
37+
3138
// API路由
32-
setupAPIRoutes(r, db, sseService, sseManager, wsService)
39+
setupAPIRoutes(r, db, sseService, sseManager, wsService, version)
3340

3441
return r
3542
}
3643

3744
// setupAPIRoutes 设置API路由
38-
func setupAPIRoutes(r *gin.Engine, db *gorm.DB, sseService *sse.Service, sseManager *sse.Manager, wsService *websocket.Service) {
45+
func setupAPIRoutes(r *gin.Engine, db *gorm.DB, sseService *sse.Service, sseManager *sse.Manager, wsService *websocket.Service, version string) {
3946
apiGroup := r.Group("/api")
4047
{
4148
// 创建服务实例
@@ -58,11 +65,89 @@ func setupAPIRoutes(r *gin.Engine, db *gorm.DB, sseService *sse.Service, sseMana
5865
api.SetupDashboardRoutes(apiGroup, dashboardService)
5966
api.SetupDataRoutes(apiGroup, db, sseManager, endpointService, tunnelService)
6067
api.SetupTagRoutes(apiGroup, tagService)
61-
api.SetupVersionRoutes(apiGroup)
68+
api.SetupVersionRoutes(apiGroup, version)
6269
api.SetupDebugRoutes(apiGroup)
6370
}
6471
}
6572

73+
// docsProxyHandler 文档代理处理器
74+
func docsProxyHandler(c *gin.Context) {
75+
// 获取路径参数
76+
path := c.Param("path")
77+
78+
// 构建目标 URL
79+
targetURL := fmt.Sprintf("https://raw.githubusercontent.com%s", path)
80+
81+
// 创建 HTTP 客户端
82+
client := &http.Client{
83+
Timeout: 30 * time.Second,
84+
}
85+
86+
// 创建请求
87+
req, err := http.NewRequest(c.Request.Method, targetURL, c.Request.Body)
88+
if err != nil {
89+
c.JSON(http.StatusInternalServerError, gin.H{"error": "创建请求失败"})
90+
return
91+
}
92+
93+
// 复制请求头(排除某些不需要的头)
94+
for name, values := range c.Request.Header {
95+
if !shouldSkipHeader(name) {
96+
for _, value := range values {
97+
req.Header.Add(name, value)
98+
}
99+
}
100+
}
101+
102+
// 发送请求
103+
resp, err := client.Do(req)
104+
if err != nil {
105+
c.JSON(http.StatusBadGateway, gin.H{"error": "代理请求失败"})
106+
return
107+
}
108+
defer resp.Body.Close()
109+
110+
// 复制响应头
111+
for name, values := range resp.Header {
112+
if !shouldSkipHeader(name) {
113+
for _, value := range values {
114+
c.Header(name, value)
115+
}
116+
}
117+
}
118+
119+
// 设置状态码
120+
c.Status(resp.StatusCode)
121+
122+
// 复制响应体
123+
_, err = io.Copy(c.Writer, resp.Body)
124+
if err != nil {
125+
// 日志记录错误,但不再发送响应(因为已经开始写入)
126+
fmt.Printf("复制响应体失败: %v\n", err)
127+
}
128+
}
129+
130+
// shouldSkipHeader 检查是否应该跳过某些头部
131+
func shouldSkipHeader(name string) bool {
132+
skipHeaders := []string{
133+
"Connection",
134+
"Proxy-Connection",
135+
"Proxy-Authenticate",
136+
"Proxy-Authorization",
137+
"Te",
138+
"Trailers",
139+
"Transfer-Encoding",
140+
"Upgrade",
141+
}
142+
143+
for _, skip := range skipHeaders {
144+
if strings.EqualFold(name, skip) {
145+
return true
146+
}
147+
}
148+
return false
149+
}
150+
66151
// corsMiddleware CORS中间件
67152
func corsMiddleware() gin.HandlerFunc {
68153
return func(c *gin.Context) {

web/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "vite-template",
33
"private": true,
4-
"version": "3.0.1-beta2",
4+
"version": "3.0.1-beta3",
55
"type": "module",
66
"scripts": {
77
"dev": "vite",

0 commit comments

Comments
 (0)