From 1d9b15ad90102357f2cb867f77677759371ee150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A5=A5=E8=B6=85?= Date: Mon, 29 Jan 2024 18:57:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=95=E4=BD=93=E5=BA=94=E7=94=A8=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E7=9A=84=E6=97=B6=E5=80=99=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E8=BF=9B=E5=85=A5=E4=BF=AE=E6=94=B9=E7=94=A8=E6=88=B7=E5=90=8D?= =?UTF-8?q?=E5=AF=86=E7=A0=81=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/web/actions/default/index/index.go | 14 +++ internal/web/actions/default/index/init.go | 1 + .../web/actions/default/index/initPassword.go | 104 ++++++++++++++++++ web/views/@default/index/initPassword.css | 38 +++++++ web/views/@default/index/initPassword.css.map | 1 + web/views/@default/index/initPassword.html | 44 ++++++++ web/views/@default/index/initPassword.js | 7 ++ web/views/@default/index/initPassword.less | 42 +++++++ 8 files changed, 251 insertions(+) create mode 100644 internal/web/actions/default/index/initPassword.go create mode 100644 web/views/@default/index/initPassword.css create mode 100644 web/views/@default/index/initPassword.css.map create mode 100644 web/views/@default/index/initPassword.html create mode 100644 web/views/@default/index/initPassword.js create mode 100644 web/views/@default/index/initPassword.less diff --git a/internal/web/actions/default/index/index.go b/internal/web/actions/default/index/index.go index 1a51243e..c790427d 100644 --- a/internal/web/actions/default/index/index.go +++ b/internal/web/actions/default/index/index.go @@ -18,6 +18,7 @@ import ( "github.com/TeaOSLab/EdgeCommon/pkg/langs/codes" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/systemconfigs" "github.com/iwind/TeaGo/actions" "github.com/iwind/TeaGo/lists" "github.com/iwind/TeaGo/types" @@ -121,6 +122,19 @@ func (this *IndexAction) RunGet(params struct { // 删除Cookie loginutils.UnsetCookie(this.Object()) + // 检查单体实例是否已经被初始化 + { + settingResp, err := this.RPC().SysSettingRPC().ReadSysSetting(this.AdminContext(), &pb.ReadSysSettingRequest{Code: systemconfigs.SettingCodeStandaloneInstanceInitialized}) + if err != nil { + this.ErrorPage(err) + return + } + if string(settingResp.ValueJSON) == "0" { + this.RedirectURL("/initPassword") + return + } + } + this.Show() } diff --git a/internal/web/actions/default/index/init.go b/internal/web/actions/default/index/init.go index ed9b8d45..722b58b2 100644 --- a/internal/web/actions/default/index/init.go +++ b/internal/web/actions/default/index/init.go @@ -10,6 +10,7 @@ func init() { Prefix(""). GetPost("/", new(IndexAction)). GetPost("/index/otp", new(OtpAction)). + GetPost("/initPassword", new(InitPasswordAction)). EndAll() }) } diff --git a/internal/web/actions/default/index/initPassword.go b/internal/web/actions/default/index/initPassword.go new file mode 100644 index 00000000..8726ea64 --- /dev/null +++ b/internal/web/actions/default/index/initPassword.go @@ -0,0 +1,104 @@ +// Copyright 2024 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . + +package index + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/systemconfigs" + "github.com/iwind/TeaGo/actions" + "net/http" +) + +type InitPasswordAction struct { + actionutils.ParentAction +} + +func (this *InitPasswordAction) Init() { + this.Nav("", "", "") +} + +func (this *InitPasswordAction) RunGet(params struct{}) { + isNotInitialized, err := this.isNotInitialized() + if err != nil { + this.ErrorPage(err) + return + } + if !isNotInitialized { + this.RedirectURL("/") + return + } + + this.Data["username"] = "admin" + this.Data["password"] = "" + + this.Show() +} + +func (this *InitPasswordAction) RunPost(params struct { + Username string + Password string + + Must *actions.Must + CSRF *actionutils.CSRF +}) { + isNotInitialized, err := this.isNotInitialized() + if err != nil { + this.ErrorPage(err) + return + } + if !isNotInitialized { + this.ResponseWriter.WriteHeader(http.StatusForbidden) + return + } + + params.Must. + Field("username", params.Username). + Require("请输入登录用户名"). + Match(`^[a-zA-Z0-9_]+$`, "用户名中只能包含英文、数字或下划线"). + Field("password", params.Password). + Require("请输入密码") + + // 查找ID + adminResp, err := this.RPC().AdminRPC().FindAdminWithUsername(this.AdminContext(), &pb.FindAdminWithUsernameRequest{Username: "admin" /** 固定的 **/}) + if err != nil { + this.ErrorPage(err) + return + } + if adminResp.Admin == nil { + this.Fail("数据错误,请将数据库中的edgeAdmins表中的用户名修改为admin后再试") + return + } + var adminId = adminResp.Admin.Id + + // 修改密码 + _, err = this.RPC().AdminRPC().UpdateAdminLogin(this.AdminContext(), &pb.UpdateAdminLoginRequest{ + AdminId: adminId, + Username: params.Username, + Password: params.Password, // raw + }) + if err != nil { + this.ErrorPage(err) + return + } + + // 修改为初始化完成 + _, err = this.RPC().SysSettingRPC().UpdateSysSetting(this.AdminContext(), &pb.UpdateSysSettingRequest{ + Code: systemconfigs.SettingCodeStandaloneInstanceInitialized, + ValueJSON: []byte("1"), + }) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} + +func (this *InitPasswordAction) isNotInitialized() (bool, error) { + settingResp, err := this.RPC().SysSettingRPC().ReadSysSetting(this.AdminContext(), &pb.ReadSysSettingRequest{Code: systemconfigs.SettingCodeStandaloneInstanceInitialized}) + if err != nil { + return false, err + } + return string(settingResp.ValueJSON) == "0", nil +} diff --git a/web/views/@default/index/initPassword.css b/web/views/@default/index/initPassword.css new file mode 100644 index 00000000..e5f9235c --- /dev/null +++ b/web/views/@default/index/initPassword.css @@ -0,0 +1,38 @@ +.form-box { + position: fixed; + top: 2em; + bottom: 0; + left: 0; + right: 0; +} +form { + position: fixed; + width: 21em; + top: 50%; + left: 50%; + margin-left: -10em; + margin-top: -16em; +} +form .header { + text-align: center; + font-size: 1em !important; +} +form p { + font-size: 0.8em; + margin-top: 0.3em; + margin-bottom: 0; + font-weight: normal; + padding: 0; +} +form .comment { + margin-top: 0.5em; + padding: 0.5em; + color: gray; +} +@media screen and (max-width: 512px) { + form { + width: 80%; + margin-left: -40%; + } +} +/*# sourceMappingURL=initPassword.css.map */ \ No newline at end of file diff --git a/web/views/@default/index/initPassword.css.map b/web/views/@default/index/initPassword.css.map new file mode 100644 index 00000000..4ba8e5f8 --- /dev/null +++ b/web/views/@default/index/initPassword.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["initPassword.less"],"names":[],"mappings":"AAAA;EACI,eAAA;EACA,QAAA;EACA,SAAA;EACA,OAAA;EACA,QAAA;;AAGJ;EACI,eAAA;EACA,WAAA;EACA,QAAA;EACA,SAAA;EACA,kBAAA;EACA,iBAAA;;AANJ,IAQC;EACC,kBAAA;EACA,yBAAA;;AAVF,IAaC;EACC,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,mBAAA;EACA,UAAA;;AAlBF,IAqBC;EACC,iBAAA;EACA,cAAA;EACA,WAAA;;AAIF,mBAAqC;EACjC;IACI,UAAA;IACA,iBAAA","file":"initPassword.css"} \ No newline at end of file diff --git a/web/views/@default/index/initPassword.html b/web/views/@default/index/initPassword.html new file mode 100644 index 00000000..40775693 --- /dev/null +++ b/web/views/@default/index/initPassword.html @@ -0,0 +1,44 @@ + + + + + 初始化系统 + + {$TEA.VUE} + {$TEA.SEMANTIC} + + + + + + +
+
+
+ +
+
+ 设置管理员初始密码 +
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/web/views/@default/index/initPassword.js b/web/views/@default/index/initPassword.js new file mode 100644 index 00000000..f8eb82d2 --- /dev/null +++ b/web/views/@default/index/initPassword.js @@ -0,0 +1,7 @@ +Tea.context(function () { + this.success = function () { + teaweb.success("用户名和密码保存成功,现在去登录", function () { + window.location = "/" + }) + } +}) \ No newline at end of file diff --git a/web/views/@default/index/initPassword.less b/web/views/@default/index/initPassword.less new file mode 100644 index 00000000..4de95032 --- /dev/null +++ b/web/views/@default/index/initPassword.less @@ -0,0 +1,42 @@ +.form-box { + position: fixed; + top: 2em; + bottom: 0; + left: 0; + right: 0; +} + +form { + position: fixed; + width: 21em; + top: 50%; + left: 50%; + margin-left: -10em; + margin-top: -16em; + + .header { + text-align: center; + font-size: 1em !important; + } + + p { + font-size: 0.8em; + margin-top: 0.3em; + margin-bottom: 0; + font-weight: normal; + padding: 0; + } + + .comment { + margin-top: 0.5em; + padding: 0.5em; + color: gray; + } +} + +@media screen and (max-width: 512px) { + form { + width: 80%; + margin-left: -40%; + } +} \ No newline at end of file