diff --git a/internal/rpc/rpc_client.go b/internal/rpc/rpc_client.go index 0641e3c0..4ed6e9e5 100644 --- a/internal/rpc/rpc_client.go +++ b/internal/rpc/rpc_client.go @@ -364,6 +364,14 @@ func (this *RPCClient) ACMETaskRPC() pb.ACMETaskServiceClient { return pb.NewACMETaskServiceClient(this.pickConn()) } +func (this *RPCClient) ACMEProviderRPC() pb.ACMEProviderServiceClient { + return pb.NewACMEProviderServiceClient(this.pickConn()) +} + +func (this *RPCClient) ACMEProviderAccountRPC() pb.ACMEProviderAccountServiceClient { + return pb.NewACMEProviderAccountServiceClient(this.pickConn()) +} + func (this *RPCClient) UserRPC() pb.UserServiceClient { return pb.NewUserServiceClient(this.pickConn()) } diff --git a/internal/web/actions/default/servers/certs/acme/accounts/createPopup.go b/internal/web/actions/default/servers/certs/acme/accounts/createPopup.go new file mode 100644 index 00000000..0998c79d --- /dev/null +++ b/internal/web/actions/default/servers/certs/acme/accounts/createPopup.go @@ -0,0 +1,100 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package accounts + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/actions" + "github.com/iwind/TeaGo/maps" +) + +type CreatePopupAction struct { + actionutils.ParentAction +} + +func (this *CreatePopupAction) Init() { + this.Nav("", "", "") +} + +func (this *CreatePopupAction) RunGet(params struct { + ProviderCode string +}) { + this.Data["providerCode"] = params.ProviderCode + + // 服务商列表 + providersResp, err := this.RPC().ACMEProviderRPC().FindAllACMEProviders(this.AdminContext(), &pb.FindAllACMEProvidersRequest{}) + if err != nil { + this.ErrorPage(err) + return + } + + var providerMaps = []maps.Map{} + for _, provider := range providersResp.AcmeProviders { + providerMaps = append(providerMaps, maps.Map{ + "name": provider.Name, + "code": provider.Code, + "description": provider.Description, + "requireEAB": provider.RequireEAB, + "eabDescription": provider.EabDescription, + }) + } + + this.Data["providers"] = providerMaps + + this.Show() +} + +func (this *CreatePopupAction) RunPost(params struct { + Name string + ProviderCode string + EabKid string + EabKey string + + Must *actions.Must + CSRF *actionutils.CSRF +}) { + var accountId int64 + defer func() { + this.CreateLogInfo("创建ACME服务商账号 %d", accountId) + }() + + params.Must. + Field("name", params.Name). + Require("请输入账号名称"). + Field("providerCode", params.ProviderCode). + Require("请选择服务商") + + providerResp, err := this.RPC().ACMEProviderRPC().FindACMEProviderWithCode(this.AdminContext(), &pb.FindACMEProviderWithCodeRequest{AcmeProviderCode: params.ProviderCode}) + if err != nil { + this.ErrorPage(err) + return + } + + var provider = providerResp.AcmeProvider + if provider == nil { + this.Fail("请选择服务商") + } + + if provider.RequireEAB { + params.Must. + Field("eabKid", params.EabKid). + Require("请输入EAB Kid"). + Field("eabKey", params.EabKey). + Require("请输入EAB HMAC Key") + } + + createResp, err := this.RPC().ACMEProviderAccountRPC().CreateACMEProviderAccount(this.AdminContext(), &pb.CreateACMEProviderAccountRequest{ + Name: params.Name, + ProviderCode: params.ProviderCode, + EabKid: params.EabKid, + EabKey: params.EabKey, + }) + if err != nil { + this.ErrorPage(err) + return + } + accountId = createResp.AcmeProviderAccountId + + this.Success() +} diff --git a/internal/web/actions/default/servers/certs/acme/accounts/delete.go b/internal/web/actions/default/servers/certs/acme/accounts/delete.go new file mode 100644 index 00000000..37fb5cbb --- /dev/null +++ b/internal/web/actions/default/servers/certs/acme/accounts/delete.go @@ -0,0 +1,26 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package accounts + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" +) + +type DeleteAction struct { + actionutils.ParentAction +} + +func (this *DeleteAction) RunPost(params struct { + AccountId int64 +}) { + defer this.CreateLogInfo("删除ACME服务商账号 %d", params.AccountId) + + _, err := this.RPC().ACMEProviderAccountRPC().DeleteACMEProviderAccount(this.AdminContext(), &pb.DeleteACMEProviderAccountRequest{AcmeProviderAccountId: params.AccountId}) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/servers/certs/acme/accounts/index.go b/internal/web/actions/default/servers/certs/acme/accounts/index.go new file mode 100644 index 00000000..3680f71d --- /dev/null +++ b/internal/web/actions/default/servers/certs/acme/accounts/index.go @@ -0,0 +1,61 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package accounts + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/maps" +) + +type IndexAction struct { + actionutils.ParentAction +} + +func (this *IndexAction) Init() { + this.Nav("", "", "account") +} + +func (this *IndexAction) RunGet(params struct{}) { + countResp, err := this.RPC().ACMEProviderAccountRPC().CountAllEnabledACMEProviderAccounts(this.AdminContext(), &pb.CountAllEnabledACMEProviderAccountsRequest{}) + if err != nil { + this.ErrorPage(err) + return + } + var count = countResp.Count + var page = this.NewPage(count) + this.Data["page"] = page.AsHTML() + + accountsResp, err := this.RPC().ACMEProviderAccountRPC().ListEnabledACMEProviderAccounts(this.AdminContext(), &pb.ListEnabledACMEProviderAccountsRequest{ + Offset: page.Offset, + Size: page.Size, + }) + if err != nil { + this.ErrorPage(err) + return + } + + var accountMaps = []maps.Map{} + for _, account := range accountsResp.AcmeProviderAccounts { + var providerMap maps.Map + if account.AcmeProvider != nil { + providerMap = maps.Map{ + "name": account.AcmeProvider.Name, + "code": account.AcmeProvider.Code, + "requireEAB": account.AcmeProvider.RequireEAB, + } + } + + accountMaps = append(accountMaps, maps.Map{ + "id": account.Id, + "isOn": account.IsOn, + "name": account.Name, + "eabKid": account.EabKid, + "eabKey": account.EabKey, + "provider": providerMap, + }) + } + this.Data["accounts"] = accountMaps + + this.Show() +} diff --git a/internal/web/actions/default/servers/certs/acme/accounts/updatePopup.go b/internal/web/actions/default/servers/certs/acme/accounts/updatePopup.go new file mode 100644 index 00000000..5efd5a79 --- /dev/null +++ b/internal/web/actions/default/servers/certs/acme/accounts/updatePopup.go @@ -0,0 +1,108 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package accounts + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/actions" + "github.com/iwind/TeaGo/maps" +) + +type UpdatePopupAction struct { + actionutils.ParentAction +} + +func (this *UpdatePopupAction) Init() { + this.Nav("", "", "") +} + +func (this *UpdatePopupAction) RunGet(params struct { + AccountId int64 +}) { + // 账号信息 + accountResp, err := this.RPC().ACMEProviderAccountRPC().FindEnabledACMEProviderAccount(this.AdminContext(), &pb.FindEnabledACMEProviderAccountRequest{AcmeProviderAccountId: params.AccountId}) + if err != nil { + this.ErrorPage(err) + return + } + var account = accountResp.AcmeProviderAccount + if account == nil { + this.NotFound("ACMEProviderAccount", params.AccountId) + return + } + + var providerMap maps.Map + if account.AcmeProvider != nil { + providerMap = maps.Map{ + "name": account.AcmeProvider.Name, + "code": account.AcmeProvider.Code, + "description": account.AcmeProvider.Description, + "eabDescription": account.AcmeProvider.EabDescription, + "requireEAB": account.AcmeProvider.RequireEAB, + } + } + + this.Data["account"] = maps.Map{ + "id": account.Id, + "name": account.Name, + "isOn": account.IsOn, + "providerCode": account.ProviderCode, + "eabKid": account.EabKid, + "eabKey": account.EabKey, + "provider": providerMap, + } + + this.Show() +} + +func (this *UpdatePopupAction) RunPost(params struct { + AccountId int64 + Name string + ProviderCode string + EabKid string + EabKey string + + Must *actions.Must + CSRF *actionutils.CSRF +}) { + defer this.CreateLogInfo("修改ACME服务商账号 %d", params.AccountId) + + params.Must. + Field("name", params.Name). + Require("请输入账号名称"). + Field("providerCode", params.ProviderCode). + Require("请选择服务商") + + providerResp, err := this.RPC().ACMEProviderRPC().FindACMEProviderWithCode(this.AdminContext(), &pb.FindACMEProviderWithCodeRequest{AcmeProviderCode: params.ProviderCode}) + if err != nil { + this.ErrorPage(err) + return + } + + var provider = providerResp.AcmeProvider + if provider == nil { + this.Fail("请选择服务商") + } + + if provider.RequireEAB { + params.Must. + Field("eabKid", params.EabKid). + Require("请输入EAB Kid"). + Field("eabKey", params.EabKey). + Require("请输入EAB HMAC Key") + } + + _, err = this.RPC().ACMEProviderAccountRPC().UpdateACMEProviderAccount(this.AdminContext(), &pb.UpdateACMEProviderAccountRequest{ + AcmeProviderAccountId: params.AccountId, + Name: params.Name, + EabKid: params.EabKid, + EabKey: params.EabKey, + }) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/servers/certs/acme/create.go b/internal/web/actions/default/servers/certs/acme/create.go index c98032db..18139f6c 100644 --- a/internal/web/actions/default/servers/certs/acme/create.go +++ b/internal/web/actions/default/servers/certs/acme/create.go @@ -35,15 +35,31 @@ func (this *CreateAction) RunGet(params struct{}) { } userMaps = append(userMaps, maps.Map{ - "id": user.Id, - "description": description, - "email": user.Email, + "id": user.Id, + "description": description, + "email": user.Email, + "providerCode": user.AcmeProviderCode, }) } this.Data["users"] = userMaps + // 证书服务商 + providersResp, err := this.RPC().ACMEProviderRPC().FindAllACMEProviders(this.AdminContext(), &pb.FindAllACMEProvidersRequest{}) + if err != nil { + this.ErrorPage(err) + return + } + var providerMaps = []maps.Map{} + for _, provider := range providersResp.AcmeProviders { + providerMaps = append(providerMaps, maps.Map{ + "name": provider.Name, + "code": provider.Code, + }) + } + this.Data["providers"] = providerMaps + // 域名解析服务商 - providersResp, err := this.RPC().DNSProviderRPC().FindAllEnabledDNSProviders(this.AdminContext(), &pb.FindAllEnabledDNSProvidersRequest{ + dnsProvidersResp, err := this.RPC().DNSProviderRPC().FindAllEnabledDNSProviders(this.AdminContext(), &pb.FindAllEnabledDNSProvidersRequest{ AdminId: this.AdminId(), UserId: 0, }) @@ -51,15 +67,15 @@ func (this *CreateAction) RunGet(params struct{}) { this.ErrorPage(err) return } - providerMaps := []maps.Map{} - for _, provider := range providersResp.DnsProviders { - providerMaps = append(providerMaps, maps.Map{ + dnsProviderMaps := []maps.Map{} + for _, provider := range dnsProvidersResp.DnsProviders { + dnsProviderMaps = append(dnsProviderMaps, maps.Map{ "id": provider.Id, "name": provider.Name, "typeName": provider.TypeName, }) } - this.Data["providers"] = providerMaps + this.Data["dnsProviders"] = dnsProviderMaps this.Show() } diff --git a/internal/web/actions/default/servers/certs/acme/index.go b/internal/web/actions/default/servers/certs/acme/index.go index d039ec03..7eec22ab 100644 --- a/internal/web/actions/default/servers/certs/acme/index.go +++ b/internal/web/actions/default/servers/certs/acme/index.go @@ -136,6 +136,26 @@ func (this *IndexAction) RunGet(params struct { if task.AcmeUser == nil { continue } + + // 服务商 + var providerMap maps.Map + if task.AcmeUser.AcmeProvider != nil { + providerMap = maps.Map{ + "name": task.AcmeUser.AcmeProvider.Name, + "code": task.AcmeUser.AcmeProvider.Code, + } + } + + // 账号 + var accountMap maps.Map + if task.AcmeUser.AcmeProviderAccount != nil { + accountMap = maps.Map{ + "id": task.AcmeUser.AcmeProviderAccount.Id, + "name": task.AcmeUser.AcmeProviderAccount.Name, + } + } + + // DNS服务商 dnsProviderMap := maps.Map{} if task.AuthType == "dns" && task.DnsProvider != nil { dnsProviderMap = maps.Map{ @@ -170,8 +190,10 @@ func (this *IndexAction) RunGet(params struct { "id": task.Id, "authType": task.AuthType, "acmeUser": maps.Map{ - "id": task.AcmeUser.Id, - "email": task.AcmeUser.Email, + "id": task.AcmeUser.Id, + "email": task.AcmeUser.Email, + "provider": providerMap, + "account": accountMap, }, "dnsProvider": dnsProviderMap, "dnsDomain": task.DnsDomain, diff --git a/internal/web/actions/default/servers/certs/acme/users/accountsWithCode.go b/internal/web/actions/default/servers/certs/acme/users/accountsWithCode.go new file mode 100644 index 00000000..121e6f88 --- /dev/null +++ b/internal/web/actions/default/servers/certs/acme/users/accountsWithCode.go @@ -0,0 +1,33 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package users + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/maps" +) + +type AccountsWithCodeAction struct { + actionutils.ParentAction +} + +func (this *AccountsWithCodeAction) RunPost(params struct { + Code string +}) { + accountsResp, err := this.RPC().ACMEProviderAccountRPC().FindAllACMEProviderAccountsWithProviderCode(this.AdminContext(), &pb.FindAllACMEProviderAccountsWithProviderCodeRequest{AcmeProviderCode: params.Code}) + if err != nil { + this.ErrorPage(err) + return + } + var accountMaps = []maps.Map{} + for _, account := range accountsResp.AcmeProviderAccounts { + accountMaps = append(accountMaps, maps.Map{ + "id": account.Id, + "name": account.Name, + }) + } + this.Data["accounts"] = accountMaps + + this.Success() +} diff --git a/internal/web/actions/default/servers/certs/acme/users/createPopup.go b/internal/web/actions/default/servers/certs/acme/users/createPopup.go index 41fd1828..5cf902b9 100644 --- a/internal/web/actions/default/servers/certs/acme/users/createPopup.go +++ b/internal/web/actions/default/servers/certs/acme/users/createPopup.go @@ -16,12 +16,30 @@ func (this *CreatePopupAction) Init() { } func (this *CreatePopupAction) RunGet(params struct{}) { + // 服务商 + providersResp, err := this.RPC().ACMEProviderRPC().FindAllACMEProviders(this.AdminContext(), &pb.FindAllACMEProvidersRequest{}) + if err != nil { + this.ErrorPage(err) + return + } + var providerMaps = []maps.Map{} + for _, provider := range providersResp.AcmeProviders { + providerMaps = append(providerMaps, maps.Map{ + "code": provider.Code, + "name": provider.Name, + "requireEAB": provider.RequireEAB, + }) + } + this.Data["providers"] = providerMaps + this.Show() } func (this *CreatePopupAction) RunPost(params struct { - Email string - Description string + Email string + ProviderCode string + AccountId int64 + Description string Must *actions.Must CSRF *actionutils.CSRF @@ -29,11 +47,29 @@ func (this *CreatePopupAction) RunPost(params struct { params.Must. Field("email", params.Email). Require("请输入邮箱"). - Email("请输入正确的邮箱格式") + Email("请输入正确的邮箱格式"). + Field("providerCode", params.ProviderCode). + Require("请选择所属服务商") + + providerResp, err := this.RPC().ACMEProviderRPC().FindACMEProviderWithCode(this.AdminContext(), &pb.FindACMEProviderWithCodeRequest{ + AcmeProviderCode: params.ProviderCode, + }) + if err != nil { + this.ErrorPage(err) + return + } + if providerResp.AcmeProvider == nil { + this.Fail("找不到要选择的证书") + } + if providerResp.AcmeProvider.RequireEAB && params.AccountId <= 0 { + this.Fail("此服务商要求必须选择或创建服务商账号") + } createResp, err := this.RPC().ACMEUserRPC().CreateACMEUser(this.AdminContext(), &pb.CreateACMEUserRequest{ - Email: params.Email, - Description: params.Description, + Email: params.Email, + Description: params.Description, + AcmeProviderCode: params.ProviderCode, + AcmeProviderAccountId: params.AccountId, }) if err != nil { this.ErrorPage(err) @@ -42,9 +78,10 @@ func (this *CreatePopupAction) RunPost(params struct { // 返回数据 this.Data["acmeUser"] = maps.Map{ - "id": createResp.AcmeUserId, - "description": params.Description, - "email": params.Email, + "id": createResp.AcmeUserId, + "description": params.Description, + "email": params.Email, + "providerCode": params.ProviderCode, } // 日志 diff --git a/internal/web/actions/default/servers/certs/acme/users/index.go b/internal/web/actions/default/servers/certs/acme/users/index.go index 9e1fa39e..a2efb090 100644 --- a/internal/web/actions/default/servers/certs/acme/users/index.go +++ b/internal/web/actions/default/servers/certs/acme/users/index.go @@ -40,11 +40,31 @@ func (this *IndexAction) RunGet(params struct{}) { } userMaps := []maps.Map{} for _, user := range usersResp.AcmeUsers { + // 服务商 + var providerMap maps.Map + if user.AcmeProvider != nil { + providerMap = maps.Map{ + "name": user.AcmeProvider.Name, + "code": user.AcmeProvider.Code, + } + } + + // 账号 + var accountMap maps.Map + if user.AcmeProviderAccount != nil { + accountMap = maps.Map{ + "id": user.AcmeProviderAccount.Id, + "name": user.AcmeProviderAccount.Name, + } + } + userMaps = append(userMaps, maps.Map{ "id": user.Id, "email": user.Email, "description": user.Description, "createdTime": timeutil.FormatTime("Y-m-d H:i:s", user.CreatedAt), + "provider": providerMap, + "account": accountMap, }) } this.Data["users"] = userMaps diff --git a/internal/web/actions/default/servers/certs/acme/users/updatePopup.go b/internal/web/actions/default/servers/certs/acme/users/updatePopup.go index de998db0..c2a7153e 100644 --- a/internal/web/actions/default/servers/certs/acme/users/updatePopup.go +++ b/internal/web/actions/default/servers/certs/acme/users/updatePopup.go @@ -29,10 +29,30 @@ func (this *UpdatePopupAction) RunGet(params struct { return } + // 服务商 + var providerMap maps.Map + if user.AcmeProvider != nil { + providerMap = maps.Map{ + "name": user.AcmeProvider.Name, + "code": user.AcmeProvider.Code, + } + } + + // 账号 + var accountMap maps.Map + if user.AcmeProviderAccount != nil { + accountMap = maps.Map{ + "id": user.AcmeProviderAccount.Id, + "name": user.AcmeProviderAccount.Name, + } + } + this.Data["user"] = maps.Map{ "id": user.Id, "email": user.Email, "description": user.Description, + "provider": providerMap, + "account": accountMap, } this.Show() diff --git a/internal/web/actions/default/servers/certs/init.go b/internal/web/actions/default/servers/certs/init.go index 21297d23..c7f47a95 100644 --- a/internal/web/actions/default/servers/certs/init.go +++ b/internal/web/actions/default/servers/certs/init.go @@ -3,6 +3,7 @@ package certs import ( "github.com/TeaOSLab/EdgeAdmin/internal/configloaders" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/certs/acme" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/certs/acme/accounts" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/certs/acme/users" "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" "github.com/iwind/TeaGo" @@ -13,9 +14,7 @@ func init() { server. Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeServer)). Helper(NewHelper()). - Data("teaSubMenu", "cert"). - Prefix("/servers/certs"). Data("leftMenuItem", "cert"). Get("", new(IndexAction)). @@ -31,7 +30,7 @@ func init() { Get("/selectPopup", new(SelectPopupAction)). Get("/datajs", new(DatajsAction)). - // ACME + // ACME任务 Prefix("/servers/certs/acme"). Data("leftMenuItem", "acme"). Get("", new(acme.IndexAction)). @@ -40,13 +39,23 @@ func init() { GetPost("/updateTaskPopup", new(acme.UpdateTaskPopupAction)). Post("/deleteTask", new(acme.DeleteTaskAction)). + // ACME用户 Prefix("/servers/certs/acme/users"). Get("", new(users.IndexAction)). GetPost("/createPopup", new(users.CreatePopupAction)). GetPost("/updatePopup", new(users.UpdatePopupAction)). Post("/delete", new(users.DeleteAction)). GetPost("/selectPopup", new(users.SelectPopupAction)). + Post("/accountsWithCode", new(users.AccountsWithCodeAction)). + // ACME账号 + Prefix("/servers/certs/acme/accounts"). + Get("", new(accounts.IndexAction)). + GetPost("/createPopup", new(accounts.CreatePopupAction)). + GetPost("/updatePopup", new(accounts.UpdatePopupAction)). + Post("/delete", new(accounts.DeleteAction)). + + // EndAll() }) } diff --git a/web/public/js/components/server/http-webp-config-box.js b/web/public/js/components/server/http-webp-config-box.js index 134798d0..ab03de33 100644 --- a/web/public/js/components/server/http-webp-config-box.js +++ b/web/public/js/components/server/http-webp-config-box.js @@ -75,6 +75,7 @@ Vue.component("http-webp-config-box", { +
选中后表示开启自动WebP压缩。
diff --git a/web/views/@default/servers/certs/acme/@menu.html b/web/views/@default/servers/certs/acme/@menu.html index 9a6fbc42..bb461fa6 100644 --- a/web/views/@default/servers/certs/acme/@menu.html +++ b/web/views/@default/servers/certs/acme/@menu.html @@ -2,4 +2,5 @@| 选择用户 | +||||||||||||||||||||||||
| 选择服务商 * | ++ + | +|||||||||||||||||||||||
| 选择用户 * |
@@ -98,10 +107,10 @@
选择DNS服务商 * |
- |
+ 用于自动创建域名解析记录。 diff --git a/web/views/@default/servers/certs/acme/create.js b/web/views/@default/servers/certs/acme/create.js index a9c9188d..2bfa9783 100644 --- a/web/views/@default/servers/certs/acme/create.js +++ b/web/views/@default/servers/certs/acme/create.js @@ -28,6 +28,8 @@ Tea.context(function () { this.createUser = function () { let that = this teaweb.popup("/servers/certs/acme/users/createPopup", { + height: "27em", + width: "44em", callback: function (resp) { teaweb.successToast("创建成功") @@ -40,13 +42,23 @@ Tea.context(function () { that.users.unshift({ id: acmeUser.id, description: description, - email: acmeUser.email + email: acmeUser.email, + providerCode: acmeUser.providerCode }) } }) } + this.providerCode = "" + this.changeProvider = function () { + this.userId = 0 + } + this.doUser = function () { + if (this.providerCode.length == 0) { + teaweb.warn("请选择一个证书服务商") + return + } if (this.userId == 0) { teaweb.warn("请选择一个申请证书的用户") return diff --git a/web/views/@default/servers/certs/acme/index.html b/web/views/@default/servers/certs/acme/index.html index 43680c59..d5f6d0ab 100644 --- a/web/views/@default/servers/certs/acme/index.html +++ b/web/views/@default/servers/certs/acme/index.html @@ -42,10 +42,12 @@{{task.acmeUser.email}}
- |
-
+
+
|
diff --git a/web/views/@default/servers/certs/acme/users/createPopup.html b/web/views/@default/servers/certs/acme/users/createPopup.html
index 84728a84..ba1ddb11 100644
--- a/web/views/@default/servers/certs/acme/users/createPopup.html
+++ b/web/views/@default/servers/certs/acme/users/createPopup.html
@@ -11,6 +11,31 @@
用于自动注册用户的邮箱。 所属服务商 * |
+
+
+ |
+ 所属服务商账号 *(可选) |
+
+ |
+
+
+
+
+
+
+ [添加]
+
+ 备注 |
diff --git a/web/views/@default/servers/certs/acme/users/createPopup.js b/web/views/@default/servers/certs/acme/users/createPopup.js
new file mode 100644
index 00000000..1a14ef79
--- /dev/null
+++ b/web/views/@default/servers/certs/acme/users/createPopup.js
@@ -0,0 +1,54 @@
+Tea.context(function () {
+ this.providerCode = ""
+ this.selectedProvider = null
+ this.accounts = []
+ this.accountId = 0
+
+ this.changeProvider = function () {
+ this.accountId = 0
+
+ if (this.providerCode.length == 0) {
+ return
+ }
+
+ let that = this
+ let provider = this.providers.$find(function (k, v) {
+ return v.code == that.providerCode
+ })
+ if (provider == null) {
+ return
+ }
+
+ this.selectedProvider = provider
+
+ this.$post(".accountsWithCode")
+ .params({
+ code: provider.code
+ })
+ .success(function (resp) {
+ this.accounts = resp.data.accounts
+ })
+ }
+
+ this.addAccount = function () {
+ let that = this
+ teaweb.popup("/servers/certs/acme/accounts/createPopup?providerCode=" + this.providerCode, {
+ height: "24em",
+ callback: function () {
+ teaweb.successToast("创建成功,已自动选中", 1500, function () {
+ that.$post(".accountsWithCode")
+ .params({
+ code: that.providerCode
+ })
+ .success(function (resp) {
+ that.accounts = resp.data.accounts
+
+ if (that.accounts.length > 0) {
+ that.accountId = that.accounts[0].id
+ }
+ })
+ })
+ }
+ })
+ }
+})
\ No newline at end of file
diff --git a/web/views/@default/servers/certs/acme/users/index.html b/web/views/@default/servers/certs/acme/users/index.html
index d208add9..2b8a8f96 100644
--- a/web/views/@default/servers/certs/acme/users/index.html
+++ b/web/views/@default/servers/certs/acme/users/index.html
@@ -14,13 +14,19 @@
|
|