From df5ffe6be7de6980e9f93d24fcfa540e273e3e48 Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Wed, 15 Dec 2021 20:13:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9C=A8=E7=BA=BF=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E6=9C=80=E6=96=B0=E7=89=88=E6=9C=AC=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/const/const.go | 1 + .../default/settings/settingutils/helper.go | 1 + .../actions/default/settings/updates/index.go | 115 ++++++++++++++++++ .../actions/default/settings/updates/init.go | 19 +++ internal/web/import.go | 1 + .../@default/settings/updates/index.html | 25 ++++ web/views/@default/settings/updates/index.js | 24 ++++ 7 files changed, 186 insertions(+) create mode 100644 internal/web/actions/default/settings/updates/index.go create mode 100644 internal/web/actions/default/settings/updates/init.go create mode 100644 web/views/@default/settings/updates/index.html create mode 100644 web/views/@default/settings/updates/index.js diff --git a/internal/const/const.go b/internal/const/const.go index 3b0efcb2..ff3d7df4 100644 --- a/internal/const/const.go +++ b/internal/const/const.go @@ -18,4 +18,5 @@ const ( CookieSID = "edgesid" SystemdServiceName = "edge-admin" + UpdatesURL = "https://goedge.cn/api/boot/versions?os=${os}&arch=${arch}" ) diff --git a/internal/web/actions/default/settings/settingutils/helper.go b/internal/web/actions/default/settings/settingutils/helper.go index 812f7852..469a2d15 100644 --- a/internal/web/actions/default/settings/settingutils/helper.go +++ b/internal/web/actions/default/settings/settingutils/helper.go @@ -37,6 +37,7 @@ func (this *Helper) BeforeAction(actionPtr actions.ActionWrapper) (goNext bool) } tabbar.Add("安全设置", "", "/settings/security", "", this.tab == "security") tabbar.Add("IP库", "", "/settings/ip-library", "", this.tab == "ipLibrary") + tabbar.Add("检查更新", "", "/settings/updates", "", this.tab == "updates") } tabbar.Add("个人资料", "", "/settings/profile", "", this.tab == "profile") tabbar.Add("登录设置", "", "/settings/login", "", this.tab == "login") diff --git a/internal/web/actions/default/settings/updates/index.go b/internal/web/actions/default/settings/updates/index.go new file mode 100644 index 00000000..0e2b51e2 --- /dev/null +++ b/internal/web/actions/default/settings/updates/index.go @@ -0,0 +1,115 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package updates + +import ( + "encoding/json" + teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/iwind/TeaGo/maps" + "github.com/iwind/TeaGo/types" + stringutil "github.com/iwind/TeaGo/utils/string" + "io/ioutil" + "net/http" + "strings" +) + +type IndexAction struct { + actionutils.ParentAction +} + +func (this *IndexAction) Init() { + this.Nav("", "updates", "") +} + +func (this *IndexAction) RunGet(params struct{}) { + this.Data["version"] = teaconst.Version + + this.Show() +} + +func (this *IndexAction) RunPost(params struct { +}) { + type Response struct { + Code int `json:"code"` + Message string `json:"message"` + Data interface{} `json:"data"` + } + + var apiURL = teaconst.UpdatesURL + apiURL = strings.ReplaceAll(apiURL, "${os}", "linux") //runtime.GOOS) + apiURL = strings.ReplaceAll(apiURL, "${arch}", "amd64") // runtime.GOARCH) + resp, err := http.Get(apiURL) + if err != nil { + this.Data["result"] = maps.Map{ + "isOk": false, + "message": "读取更新信息失败:" + err.Error(), + } + this.Success() + } + + defer func() { + _ = resp.Body.Close() + }() + data, err := ioutil.ReadAll(resp.Body) + if err != nil { + this.Data["result"] = maps.Map{ + "isOk": false, + "message": "读取更新信息失败:" + err.Error(), + } + this.Success() + } + + var apiResponse = &Response{} + err = json.Unmarshal(data, apiResponse) + if err != nil { + this.Data["result"] = maps.Map{ + "isOk": false, + "message": "解析更新信息失败:" + err.Error(), + } + this.Success() + } + + if apiResponse.Code != 200 { + this.Data["result"] = maps.Map{ + "isOk": false, + "message": "解析更新信息失败:" + apiResponse.Message, + } + this.Success() + } + + var m = maps.NewMap(apiResponse.Data) + var dlHost = m.GetString("host") + var versions = m.GetSlice("versions") + if len(versions) > 0 { + for _, version := range versions { + var vMap = maps.NewMap(version) + if vMap.GetString("code") == "admin" { + var latestVersion = vMap.GetString("version") + if stringutil.VersionCompare(teaconst.Version, latestVersion) < 0 { + this.Data["result"] = maps.Map{ + "isOk": true, + "message": "有最新的版本v" + types.String(latestVersion) + "可以更新", + "hasNew": true, + "dlURL": dlHost + vMap.GetString("url"), + } + this.Success() + } else { + this.Data["result"] = maps.Map{ + "isOk": true, + "message": "你安装已经是最新版本,无需更新", + } + this.Success() + } + } + } + } + + this.Data["result"] = maps.Map{ + "isOk": false, + "message": "找不到更新信息", + } + this.Success() + + this.Success() +} diff --git a/internal/web/actions/default/settings/updates/init.go b/internal/web/actions/default/settings/updates/init.go new file mode 100644 index 00000000..d219021b --- /dev/null +++ b/internal/web/actions/default/settings/updates/init.go @@ -0,0 +1,19 @@ +package updates + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/configloaders" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/settingutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" + "github.com/iwind/TeaGo" +) + +func init() { + TeaGo.BeforeStart(func(server *TeaGo.Server) { + server. + Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeSetting)). + Helper(settingutils.NewHelper("updates")). + Prefix("/settings/updates"). + GetPost("", new(IndexAction)). + EndAll() + }) +} diff --git a/internal/web/import.go b/internal/web/import.go index 48afff1e..25c477b6 100644 --- a/internal/web/import.go +++ b/internal/web/import.go @@ -118,6 +118,7 @@ import ( _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/server" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/transfer" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/ui" + _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/updates" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/upgrade" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/user-ui" diff --git a/web/views/@default/settings/updates/index.html b/web/views/@default/settings/updates/index.html new file mode 100644 index 00000000..578dd153 --- /dev/null +++ b/web/views/@default/settings/updates/index.html @@ -0,0 +1,25 @@ +{$layout} + +
+
+ + + + + + + + + +
当前已安装版本v{{version}}
最新版本 +
+ 正在连接服务器检查更新... +
+
+ {{result.message}}
下载地址:{{result.dlURL}}
+ {{result.message}} +
+
+ + +
\ No newline at end of file diff --git a/web/views/@default/settings/updates/index.js b/web/views/@default/settings/updates/index.js new file mode 100644 index 00000000..ba188327 --- /dev/null +++ b/web/views/@default/settings/updates/index.js @@ -0,0 +1,24 @@ +Tea.context(function () { + this.isStarted = false + this.isChecking = true + this.result = {isOk: false, message: "", hasNew: false, dlURL: ""} + + this.start = function () { + this.isStarted = true + this.isChecking = true + + this.$delay(function () { + this.check() + }, 1000) + } + + this.check = function () { + this.$post("$") + .success(function (resp) { + this.result = resp.data.result + }) + .done(function () { + this.isChecking = false + }) + } +}) \ No newline at end of file