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