diff --git a/internal/web/actions/default/servers/certs/acme/updateTaskPopup.go b/internal/web/actions/default/servers/certs/acme/updateTaskPopup.go index 0b4ad8f7..5af40565 100644 --- a/internal/web/actions/default/servers/certs/acme/updateTaskPopup.go +++ b/internal/web/actions/default/servers/certs/acme/updateTaskPopup.go @@ -1,6 +1,7 @@ package acme import ( + "encoding/json" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/dns/domains/domainutils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" @@ -25,7 +26,7 @@ func (this *UpdateTaskPopupAction) RunGet(params struct { this.ErrorPage(err) return } - task := taskResp.AcmeTask + var task = taskResp.AcmeTask if task == nil { this.NotFound("acmeTask", params.TaskId) return @@ -74,7 +75,7 @@ func (this *UpdateTaskPopupAction) RunGet(params struct { this.ErrorPage(err) return } - providerMaps := []maps.Map{} + var providerMaps = []maps.Map{} for _, provider := range providersResp.DnsProviders { providerMaps = append(providerMaps, maps.Map{ "id": provider.Id, @@ -93,7 +94,7 @@ func (this *UpdateTaskPopupAction) RunPost(params struct { AcmeUserId int64 DnsProviderId int64 DnsDomain string - Domains []string + DomainsJSON []byte AutoRenew bool AuthURL string @@ -123,11 +124,20 @@ func (this *UpdateTaskPopupAction) RunPost(params struct { } } - if len(params.Domains) == 0 { + var domains = []string{} + if len(params.DomainsJSON) > 0 { + err := json.Unmarshal(params.DomainsJSON, &domains) + if err != nil { + this.Fail("解析域名数据失败:" + err.Error()) + return + } + } + + if len(domains) == 0 { this.Fail("请输入证书域名列表") } - realDomains := []string{} - for _, domain := range params.Domains { + var realDomains = []string{} + for _, domain := range domains { domain = strings.ToLower(domain) if params.AuthType == "dns" { if !strings.HasSuffix(domain, "."+dnsDomain) && domain != dnsDomain { diff --git a/web/public/js/components/server/domains-box.js b/web/public/js/components/server/domains-box.js index 1337ea14..81b13863 100644 --- a/web/public/js/components/server/domains-box.js +++ b/web/public/js/components/server/domains-box.js @@ -1,6 +1,6 @@ // 域名列表 Vue.component("domains-box", { - props: ["v-domains", "name"], + props: ["v-domains", "name", "v-support-wildcard"], data: function () { let domains = this.vDomains if (domains == null) { @@ -11,11 +11,47 @@ Vue.component("domains-box", { if (this.name != null && typeof this.name == "string") { realName = this.name } + + let supportWildcard = true + if (typeof this.vSupportWildcard == "boolean") { + supportWildcard = this.vSupportWildcard + } + return { domains: domains, + + mode: "single", // single | batch + batchDomains: "", + isAdding: false, addingDomain: "", - realName: realName + + isEditing: false, + editingIndex: -1, + + realName: realName, + supportWildcard: supportWildcard + } + }, + watch: { + vSupportWildcard: function (v) { + if (typeof v == "boolean") { + this.supportWildcard = v + } + }, + mode: function (mode) { + let that = this + setTimeout(function () { + if (mode == "single") { + if (that.$refs.addingDomain != null) { + that.$refs.addingDomain.focus() + } + } else if (mode == "batch") { + if (that.$refs.batchDomains != null) { + that.$refs.batchDomains.focus() + } + } + }, 100) } }, methods: { @@ -27,6 +63,11 @@ Vue.component("domains-box", { }, 100) }, confirm: function () { + if (this.mode == "batch") { + this.confirmBatch() + return + } + let that = this // 删除其中的空格 @@ -39,54 +80,155 @@ Vue.component("domains-box", { return } - // 基本校验 - if (this.addingDomain[0] == "~") { - let expr = this.addingDomain.substring(1) - try { - new RegExp(expr) - } catch (e) { - teaweb.warn("正则表达式错误:" + e.message, function () { + if (this.supportWildcard) { + if (this.addingDomain[0] == "~") { + let expr = this.addingDomain.substring(1) + try { + new RegExp(expr) + } catch (e) { + teaweb.warn("正则表达式错误:" + e.message, function () { + that.$refs.addingDomain.focus() + }) + return + } + } + } else { + if (/[*~^]/.test(this.addingDomain)) { + teaweb.warn("当前只支持添加普通域名,域名中不能含有特殊符号", function () { that.$refs.addingDomain.focus() }) return } } - this.domains.push(this.addingDomain) + if (this.isEditing && this.editingIndex >= 0) { + this.domains[this.editingIndex] = this.addingDomain + } else { + this.domains.push(this.addingDomain) + } this.cancel() + this.change() + }, + confirmBatch: function () { + let domains = this.batchDomains.split("\n") + let realDomains = [] + let that = this + let hasProblems = false + domains.forEach(function (domain) { + if (hasProblems) { + return + } + if (domain.length == 0) { + return + } + if (that.supportWildcard) { + if (domain == "~") { + let expr = domain.substring(1) + try { + new RegExp(expr) + } catch (e) { + hasProblems = true + teaweb.warn("正则表达式错误:" + e.message, function () { + that.$refs.batchDomains.focus() + }) + return + } + } + } else { + if (/[*~^]/.test(domain)) { + hasProblems = true + teaweb.warn("当前只支持添加普通域名,域名中不能含有特殊符号", function () { + that.$refs.batchDomains.focus() + }) + return + } + } + realDomains.push(domain) + }) + if (hasProblems) { + return + } + if (realDomains.length == 0) { + teaweb.warn("请输入要添加的域名", function () { + that.$refs.batchDomains.focus() + }) + return + } + + realDomains.forEach(function (domain) { + that.domains.push(domain) + }) + this.cancel() + this.change() + }, + edit: function (index) { + this.addingDomain = this.domains[index] + this.isEditing = true + this.editingIndex = index + let that = this + setTimeout(function () { + that.$refs.addingDomain.focus() + }, 50) }, remove: function (index) { this.domains.$remove(index) + this.change() }, cancel: function () { this.isAdding = false + this.mode = "single" + this.batchDomains = "" + this.isEditing = false + this.editingIndex = -1 this.addingDomain = "" + }, + change: function () { + this.$emit("change", this.domains) } }, template: `
- + [正则] [后缀] [泛域名] {{domain}} -   + +   +   + + +   +   +
-
+
+
+ +
- +
+ +
+
+ +
 
-

支持普通域名(example.com)、泛域名(*.example.com)、域名后缀(以点号开头,如.example.com)和正则表达式(以波浪号开头,如~.*.example.com)。

+

支持普通域名(example.com)、泛域名(*.example.com)、域名后缀(以点号开头,如.example.com)和正则表达式(以波浪号开头,如~.*.example.com)。

+

只支持普通域名(example.comwww.example.com)。

diff --git a/web/public/js/components/server/origin-list-box.js b/web/public/js/components/server/origin-list-box.js index 6608d1ac..0573444f 100644 --- a/web/public/js/components/server/origin-list-box.js +++ b/web/public/js/components/server/origin-list-box.js @@ -9,6 +9,7 @@ Vue.component("origin-list-box", { methods: { createPrimaryOrigin: function () { teaweb.popup("/servers/server/settings/origins/addPopup?originType=primary&" + this.vParams, { + width: "45em", height: "27em", callback: function (resp) { teaweb.success("保存成功", function () { @@ -19,6 +20,7 @@ Vue.component("origin-list-box", { }, createBackupOrigin: function () { teaweb.popup("/servers/server/settings/origins/addPopup?originType=backup&" + this.vParams, { + width: "45em", height: "27em", callback: function (resp) { teaweb.success("保存成功", function () { @@ -29,6 +31,7 @@ Vue.component("origin-list-box", { }, updateOrigin: function (originId, originType) { teaweb.popup("/servers/server/settings/origins/updatePopup?originType=" + originType + "&" + this.vParams + "&originId=" + originId, { + width: "45em", height: "27em", callback: function (resp) { teaweb.success("保存成功", function () { diff --git a/web/views/@default/servers/certs/acme/create.html b/web/views/@default/servers/certs/acme/create.html index 79d67450..debec2a1 100644 --- a/web/views/@default/servers/certs/acme/create.html +++ b/web/views/@default/servers/certs/acme/create.html @@ -126,7 +126,7 @@ 证书域名列表 * - +

需要申请的证书中包含的域名列表,所有域名必须是同一个顶级域名使用HTTP认证方式时,域名中不能含有通配符

@@ -134,7 +134,7 @@ 自动续期 -

在免费证书临近到期之前,是否尝试自动续期。

+

选中后,表示在免费证书临近到期之前尝试自动续期。

diff --git a/web/views/@default/servers/certs/acme/index.html b/web/views/@default/servers/certs/acme/index.html index bea95516..58088fee 100644 --- a/web/views/@default/servers/certs/acme/index.html +++ b/web/views/@default/servers/certs/acme/index.html @@ -28,7 +28,7 @@
有任务在执行中,可能需要的时间较长,请耐心等待。
- +
diff --git a/web/views/@default/servers/certs/acme/index.js b/web/views/@default/servers/certs/acme/index.js index 1ca55cef..91bd0537 100644 --- a/web/views/@default/servers/certs/acme/index.js +++ b/web/views/@default/servers/certs/acme/index.js @@ -8,6 +8,7 @@ Tea.context(function () { this.updateTask = function (taskId) { teaweb.popup("/servers/certs/acme/updateTaskPopup?taskId=" + taskId, { + width: "45em", height: "26em", callback: function () { teaweb.success("保存成功,如果证书域名发生了改变,请重新执行生成新证书", function () { diff --git a/web/views/@default/servers/certs/acme/updateTaskPopup.html b/web/views/@default/servers/certs/acme/updateTaskPopup.html index 9b349263..24916202 100644 --- a/web/views/@default/servers/certs/acme/updateTaskPopup.html +++ b/web/views/@default/servers/certs/acme/updateTaskPopup.html @@ -30,7 +30,7 @@ @@ -38,7 +38,7 @@
ACME用户
证书域名列表 * - +

需要申请的证书中包含的域名列表,所有域名必须是同一个顶级域名使用HTTP认证方式时,域名中不能含有通配符

自动续期 -

在免费证书临近到期之前,是否尝试自动续期。

+

选中后,表示在免费证书临近到期之前尝试自动续期。