2025-07-20 21:56:00 +08:00
|
|
|
|
package handlers
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"encoding/json"
|
|
|
|
|
|
"fmt"
|
2025-07-27 08:06:55 +08:00
|
|
|
|
"io"
|
2025-07-20 21:56:00 +08:00
|
|
|
|
"net/http"
|
|
|
|
|
|
"strings"
|
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
|
|
"github.com/ctwj/urldb/utils"
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// VersionResponse 版本响应结构
|
|
|
|
|
|
type VersionResponse struct {
|
|
|
|
|
|
Success bool `json:"success"`
|
|
|
|
|
|
Data interface{} `json:"data"`
|
|
|
|
|
|
Message string `json:"message"`
|
|
|
|
|
|
Time time.Time `json:"time"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetVersion 获取版本信息
|
|
|
|
|
|
func GetVersion(c *gin.Context) {
|
|
|
|
|
|
versionInfo := utils.GetVersionInfo()
|
|
|
|
|
|
|
|
|
|
|
|
response := VersionResponse{
|
|
|
|
|
|
Success: true,
|
|
|
|
|
|
Data: versionInfo,
|
|
|
|
|
|
Message: "版本信息获取成功",
|
2025-07-29 14:00:01 +08:00
|
|
|
|
Time: utils.GetCurrentTime(),
|
2025-07-20 21:56:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
c.JSON(http.StatusOK, response)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetVersionString 获取版本字符串
|
|
|
|
|
|
func GetVersionString(c *gin.Context) {
|
|
|
|
|
|
versionString := utils.GetVersionString()
|
|
|
|
|
|
|
|
|
|
|
|
response := VersionResponse{
|
|
|
|
|
|
Success: true,
|
|
|
|
|
|
Data: map[string]string{
|
|
|
|
|
|
"version": versionString,
|
|
|
|
|
|
},
|
|
|
|
|
|
Message: "版本字符串获取成功",
|
2025-07-29 14:00:01 +08:00
|
|
|
|
Time: utils.GetCurrentTime(),
|
2025-07-20 21:56:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
c.JSON(http.StatusOK, response)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetFullVersionInfo 获取完整版本信息
|
|
|
|
|
|
func GetFullVersionInfo(c *gin.Context) {
|
|
|
|
|
|
fullInfo := utils.GetFullVersionInfo()
|
|
|
|
|
|
|
|
|
|
|
|
response := VersionResponse{
|
|
|
|
|
|
Success: true,
|
|
|
|
|
|
Data: map[string]string{
|
|
|
|
|
|
"version_info": fullInfo,
|
|
|
|
|
|
},
|
|
|
|
|
|
Message: "完整版本信息获取成功",
|
2025-07-29 14:00:01 +08:00
|
|
|
|
Time: utils.GetCurrentTime(),
|
2025-07-20 21:56:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
c.JSON(http.StatusOK, response)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// CheckUpdate 检查更新
|
|
|
|
|
|
func CheckUpdate(c *gin.Context) {
|
|
|
|
|
|
currentVersion := utils.GetVersionInfo().Version
|
|
|
|
|
|
|
|
|
|
|
|
// 从GitHub API获取最新版本信息
|
|
|
|
|
|
latestVersion, err := getLatestVersionFromGitHub()
|
|
|
|
|
|
if err != nil {
|
2025-07-27 08:06:55 +08:00
|
|
|
|
// 如果GitHub API失败,使用当前版本作为最新版本
|
|
|
|
|
|
latestVersion = currentVersion
|
2025-07-20 21:56:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
hasUpdate := utils.IsVersionNewer(latestVersion, currentVersion)
|
|
|
|
|
|
|
|
|
|
|
|
response := VersionResponse{
|
|
|
|
|
|
Success: true,
|
|
|
|
|
|
Data: map[string]interface{}{
|
|
|
|
|
|
"current_version": currentVersion,
|
|
|
|
|
|
"latest_version": latestVersion,
|
|
|
|
|
|
"has_update": hasUpdate,
|
|
|
|
|
|
"update_available": hasUpdate,
|
|
|
|
|
|
"update_url": "https://github.com/ctwj/urldb/releases/latest",
|
|
|
|
|
|
},
|
|
|
|
|
|
Message: "更新检查完成",
|
2025-07-29 14:00:01 +08:00
|
|
|
|
Time: utils.GetCurrentTime(),
|
2025-07-20 21:56:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
c.JSON(http.StatusOK, response)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// getLatestVersionFromGitHub 从GitHub获取最新版本
|
|
|
|
|
|
func getLatestVersionFromGitHub() (string, error) {
|
2025-07-27 08:06:55 +08:00
|
|
|
|
// 首先尝试从VERSION文件URL获取最新版本
|
|
|
|
|
|
versionURL := "https://raw.githubusercontent.com/ctwj/urldb/refs/heads/main/VERSION"
|
|
|
|
|
|
|
|
|
|
|
|
resp, err := http.Get(versionURL)
|
|
|
|
|
|
if err == nil && resp.StatusCode == http.StatusOK {
|
|
|
|
|
|
defer resp.Body.Close()
|
|
|
|
|
|
body, err := io.ReadAll(resp.Body)
|
|
|
|
|
|
if err == nil {
|
|
|
|
|
|
version := strings.TrimSpace(string(body))
|
|
|
|
|
|
if version != "" {
|
|
|
|
|
|
return version, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 如果VERSION文件获取失败,尝试GitHub API获取最新Release
|
2025-07-20 21:56:00 +08:00
|
|
|
|
url := "https://api.github.com/repos/ctwj/urldb/releases/latest"
|
|
|
|
|
|
|
2025-07-27 08:06:55 +08:00
|
|
|
|
resp, err = http.Get(url)
|
2025-07-20 21:56:00 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return "", err
|
|
|
|
|
|
}
|
|
|
|
|
|
defer resp.Body.Close()
|
|
|
|
|
|
|
|
|
|
|
|
if resp.StatusCode != http.StatusOK {
|
|
|
|
|
|
return "", fmt.Errorf("GitHub API返回状态码: %d", resp.StatusCode)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var release struct {
|
|
|
|
|
|
TagName string `json:"tag_name"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if err := json.NewDecoder(resp.Body).Decode(&release); err != nil {
|
|
|
|
|
|
return "", err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 移除版本号前的 'v' 前缀
|
|
|
|
|
|
version := strings.TrimPrefix(release.TagName, "v")
|
|
|
|
|
|
return version, nil
|
|
|
|
|
|
}
|