feat: add jdcloud dns-01 applicant

This commit is contained in:
Fu Diwei
2025-02-19 23:57:22 +08:00
parent 469c24751e
commit 72896e052c
24 changed files with 502 additions and 15 deletions

View File

@@ -1,4 +1,4 @@
import { memo, useEffect, useState } from "react";
import { memo } from "react";
import { useTranslation } from "react-i18next";
import { ReadOutlined as ReadOutlinedIcon } from "@ant-design/icons";
import { Badge, Divider, Space, Typography } from "antd";

View File

@@ -27,6 +27,7 @@ import AccessFormGcoreConfig from "./AccessFormGcoreConfig";
import AccessFormGnameConfig from "./AccessFormGnameConfig";
import AccessFormGoDaddyConfig from "./AccessFormGoDaddyConfig";
import AccessFormHuaweiCloudConfig from "./AccessFormHuaweiCloudConfig";
import AccessFormJDCloudConfig from "./AccessFormJDCloudConfig";
import AccessFormKubernetesConfig from "./AccessFormKubernetesConfig";
import AccessFormLocalConfig from "./AccessFormLocalConfig";
import AccessFormNameDotComConfig from "./AccessFormNameDotComConfig";
@@ -131,6 +132,8 @@ const AccessForm = forwardRef<AccessFormInstance, AccessFormProps>(({ className,
return <AccessFormEdgioConfig {...nestedFormProps} />;
case ACCESS_PROVIDERS.HUAWEICLOUD:
return <AccessFormHuaweiCloudConfig {...nestedFormProps} />;
case ACCESS_PROVIDERS.JDCLOUD:
return <AccessFormJDCloudConfig {...nestedFormProps} />;
case ACCESS_PROVIDERS.KUBERNETES:
return <AccessFormKubernetesConfig {...nestedFormProps} />;
case ACCESS_PROVIDERS.LOCAL:

View File

@@ -0,0 +1,76 @@
import { useTranslation } from "react-i18next";
import { Form, type FormInstance, Input } from "antd";
import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod";
import { type AccessConfigForJDCloud } from "@/domain/access";
type AccessFormJDCloudConfigFieldValues = Nullish<AccessConfigForJDCloud>;
export type AccessFormJDCloudConfigProps = {
form: FormInstance;
formName: string;
disabled?: boolean;
initialValues?: AccessFormJDCloudConfigFieldValues;
onValuesChange?: (values: AccessFormJDCloudConfigFieldValues) => void;
};
const initFormModel = (): AccessFormJDCloudConfigFieldValues => {
return {
accessKeyId: "",
accessKeySecret: "",
};
};
const AccessFormJDCloudConfig = ({ form: formInst, formName, disabled, initialValues, onValuesChange: onValuesChange }: AccessFormJDCloudConfigProps) => {
const { t } = useTranslation();
const formSchema = z.object({
accessKeyId: z
.string()
.min(1, t("access.form.jdcloud_access_key_id.placeholder"))
.max(64, t("common.errmsg.string_max", { max: 64 }))
.trim(),
accessKeySecret: z
.string()
.min(1, t("access.form.jdcloud_access_key_secret.placeholder"))
.max(64, t("common.errmsg.string_max", { max: 64 }))
.trim(),
});
const formRule = createSchemaFieldRule(formSchema);
const handleFormChange = (_: unknown, values: z.infer<typeof formSchema>) => {
onValuesChange?.(values);
};
return (
<Form
form={formInst}
disabled={disabled}
initialValues={initialValues ?? initFormModel()}
layout="vertical"
name={formName}
onValuesChange={handleFormChange}
>
<Form.Item
name="accessKeyId"
label={t("access.form.jdcloud_access_key_id.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.jdcloud_access_key_id.tooltip") }}></span>}
>
<Input autoComplete="new-password" placeholder={t("access.form.jdcloud_access_key_id.placeholder")} />
</Form.Item>
<Form.Item
name="accessKeySecret"
label={t("access.form.jdcloud_access_key_secret.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.jdcloud_access_key_secret.tooltip") }}></span>}
>
<Input.Password autoComplete="new-password" placeholder={t("access.form.jdcloud_access_key_secret.placeholder")} />
</Form.Item>
</Form>
);
};
export default AccessFormJDCloudConfig;

View File

@@ -35,6 +35,7 @@ import { validDomainName, validIPv4Address, validIPv6Address } from "@/utils/val
import ApplyNodeConfigFormAWSRoute53Config from "./ApplyNodeConfigFormAWSRoute53Config";
import ApplyNodeConfigFormHuaweiCloudDNSConfig from "./ApplyNodeConfigFormHuaweiCloudDNSConfig";
import ApplyNodeConfigFormJDCloudDNSConfig from "./ApplyNodeConfigFormJDCloudDNSConfig";
type ApplyNodeConfigFormFieldValues = Partial<WorkflowNodeConfigForApply>;
@@ -145,6 +146,9 @@ const ApplyNodeConfigForm = forwardRef<ApplyNodeConfigFormInstance, ApplyNodeCon
case APPLY_DNS_PROVIDERS.HUAWEICLOUD:
case APPLY_DNS_PROVIDERS.HUAWEICLOUD_DNS:
return <ApplyNodeConfigFormHuaweiCloudDNSConfig {...nestedFormProps} />;
case APPLY_DNS_PROVIDERS.JDCLOUD:
case APPLY_DNS_PROVIDERS.JDCLOUD_DNS:
return <ApplyNodeConfigFormJDCloudDNSConfig {...nestedFormProps} />;
}
}, [disabled, initialValues?.providerConfig, fieldProvider, nestedFormInst, nestedFormName]);

View File

@@ -0,0 +1,61 @@
import { useTranslation } from "react-i18next";
import { Form, type FormInstance, Input } from "antd";
import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod";
type ApplyNodeConfigFormJDCloudDNSConfigFieldValues = Nullish<{
regionId: string;
}>;
export type ApplyNodeConfigFormJDCloudDNSConfigProps = {
form: FormInstance;
formName: string;
disabled?: boolean;
initialValues?: ApplyNodeConfigFormJDCloudDNSConfigFieldValues;
onValuesChange?: (values: ApplyNodeConfigFormJDCloudDNSConfigFieldValues) => void;
};
const initFormModel = (): ApplyNodeConfigFormJDCloudDNSConfigFieldValues => {
return {
regionId: "cn-north-1",
};
};
const ApplyNodeConfigFormJDCloudDNSConfig = ({
form: formInst,
formName,
disabled,
initialValues,
onValuesChange,
}: ApplyNodeConfigFormJDCloudDNSConfigProps) => {
const { t } = useTranslation();
const formSchema = z.object({
regionId: z
.string({ message: t("workflow_node.apply.form.jdcloud_dns_region_id.placeholder") })
.nonempty(t("workflow_node.apply.form.jdcloud_dns_region_id.placeholder"))
.trim(),
});
const formRule = createSchemaFieldRule(formSchema);
const handleFormChange = (_: unknown, values: z.infer<typeof formSchema>) => {
onValuesChange?.(values);
};
return (
<Form
form={formInst}
disabled={disabled}
initialValues={initialValues ?? initFormModel()}
layout="vertical"
name={formName}
onValuesChange={handleFormChange}
>
<Form.Item name="regionId" label={t("workflow_node.apply.form.jdcloud_dns_region_id_id.label")} rules={[formRule]}>
<Input placeholder={t("workflow_node.apply.form.jdcloud_dns_region_id.placeholder")} />
</Form.Item>
</Form>
);
};
export default ApplyNodeConfigFormJDCloudDNSConfig;

View File

@@ -24,6 +24,7 @@ export interface AccessModel extends BaseModel {
| AccessConfigForGname
| AccessConfigForGoDaddy
| AccessConfigForHuaweiCloud
| AccessConfigForJDCloud
| AccessConfigForKubernetes
| AccessConfigForLocal
| AccessConfigForNameDotCom
@@ -133,6 +134,11 @@ export type AccessConfigForHuaweiCloud = {
secretAccessKey: string;
};
export type AccessConfigForJDCloud = {
accessKeyId: string;
accessKeySecret: string;
};
export type AccessConfigForKubernetes = {
kubeConfig?: string;
};

View File

@@ -22,6 +22,7 @@ export const ACCESS_PROVIDERS = Object.freeze({
GODADDY: "godaddy",
EDGIO: "edgio",
HUAWEICLOUD: "huaweicloud",
JDCLOUD: "jdcloud",
KUBERNETES: "k8s",
LOCAL: "local",
NAMEDOTCOM: "namedotcom",
@@ -70,6 +71,7 @@ export const accessProvidersMap: Map<AccessProvider["type"] | string, AccessProv
[ACCESS_PROVIDERS.BAIDUCLOUD, "provider.baiducloud", "/imgs/providers/baiducloud.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
[ACCESS_PROVIDERS.HUAWEICLOUD, "provider.huaweicloud", "/imgs/providers/huaweicloud.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
[ACCESS_PROVIDERS.VOLCENGINE, "provider.volcengine", "/imgs/providers/volcengine.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
[ACCESS_PROVIDERS.JDCLOUD, "provider.jdcloud", "/imgs/providers/jdcloud.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
[ACCESS_PROVIDERS.AWS, "provider.aws", "/imgs/providers/aws.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
[ACCESS_PROVIDERS.GCORE, "provider.gcore", "/imgs/providers/gcore.png", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
[ACCESS_PROVIDERS.QINIU, "provider.qiniu", "/imgs/providers/qiniu.svg", [ACCESS_USAGES.DEPLOY]],
@@ -117,6 +119,7 @@ export const APPLY_DNS_PROVIDERS = Object.freeze({
ALIYUN_DNS: `${ACCESS_PROVIDERS.ALIYUN}-dns`,
AWS: `${ACCESS_PROVIDERS.AWS}`, // 兼容旧值,等同于 `AWS_ROUTE53`
AWS_ROUTE53: `${ACCESS_PROVIDERS.AWS}-route53`,
AZURE: `${ACCESS_PROVIDERS.AZURE}`, // 兼容旧值,等同于 `AZURE_DNS`
AZURE_DNS: `${ACCESS_PROVIDERS.AZURE}-dns`,
BAIDUCLOUD: `${ACCESS_PROVIDERS.BAIDUCLOUD}`, // 兼容旧值,等同于 `BAIDUCLOUD_DNS`
BAIDUCLOUD_DNS: `${ACCESS_PROVIDERS.BAIDUCLOUD}-dns`,
@@ -127,6 +130,8 @@ export const APPLY_DNS_PROVIDERS = Object.freeze({
GODADDY: `${ACCESS_PROVIDERS.GODADDY}`,
HUAWEICLOUD: `${ACCESS_PROVIDERS.HUAWEICLOUD}`, // 兼容旧值,等同于 `HUAWEICLOUD_DNS`
HUAWEICLOUD_DNS: `${ACCESS_PROVIDERS.HUAWEICLOUD}-dns`,
JDCLOUD: `${ACCESS_PROVIDERS.JDCLOUD}`, // 兼容旧值,等同于 `JDCLOUD_DNS`
JDCLOUD_DNS: `${ACCESS_PROVIDERS.JDCLOUD}-dns`,
NAMEDOTCOM: `${ACCESS_PROVIDERS.NAMEDOTCOM}`,
NAMESILO: `${ACCESS_PROVIDERS.NAMESILO}`,
NS1: `${ACCESS_PROVIDERS.NS1}`,
@@ -159,6 +164,7 @@ export const applyDNSProvidersMap: Map<ApplyDNSProvider["type"] | string, ApplyD
[APPLY_DNS_PROVIDERS.BAIDUCLOUD_DNS, "provider.baiducloud.dns"],
[APPLY_DNS_PROVIDERS.HUAWEICLOUD_DNS, "provider.huaweicloud.dns"],
[APPLY_DNS_PROVIDERS.VOLCENGINE_DNS, "provider.volcengine.dns"],
[APPLY_DNS_PROVIDERS.JDCLOUD_DNS, "provider.jdcloud.dns"],
[APPLY_DNS_PROVIDERS.AWS_ROUTE53, "provider.aws.route53"],
[APPLY_DNS_PROVIDERS.AZURE_DNS, "provider.azure.dns"],
[APPLY_DNS_PROVIDERS.CLOUDFLARE, "provider.cloudflare"],

View File

@@ -38,8 +38,8 @@
"access.form.aliyun_access_key_id.label": "Aliyun AccessKeyId",
"access.form.aliyun_access_key_id.placeholder": "Please enter Aliyun AccessKeyId",
"access.form.aliyun_access_key_id.tooltip": "For more information, see <a href=\"https://www.alibabacloud.com/help/en/acr/create-and-obtain-an-accesskey-pair\" target=\"_blank\">https://www.alibabacloud.com/help/en/acr/create-and-obtain-an-accesskey-pair</a>",
"access.form.aliyun_access_key_secret.label": "Aliyun AccessKey Secret",
"access.form.aliyun_access_key_secret.placeholder": "Please enter Aliyun AccessKey Secret",
"access.form.aliyun_access_key_secret.label": "Aliyun AccessKeySecret",
"access.form.aliyun_access_key_secret.placeholder": "Please enter Aliyun AccessKeySecret",
"access.form.aliyun_access_key_secret.tooltip": "For more information, see <a href=\"https://www.alibabacloud.com/help/en/acr/create-and-obtain-an-accesskey-pair\" target=\"_blank\">https://www.alibabacloud.com/help/en/acr/create-and-obtain-an-accesskey-pair</a>",
"access.form.aws_access_key_id.label": "AWS AccessKeyId",
"access.form.aws_access_key_id.placeholder": "Please enter AWS AccessKeyId",
@@ -133,6 +133,12 @@
"access.form.huaweicloud_secret_access_key.label": "Huawei Cloud SecretAccessKey",
"access.form.huaweicloud_secret_access_key.placeholder": "Please enter Huawei Cloud SecretAccessKey",
"access.form.huaweicloud_secret_access_key.tooltip": "For more information, see <a href=\"https://support.huaweicloud.com/intl/en-us/usermanual-ca/ca_01_0003.html\" target=\"_blank\">https://support.huaweicloud.com/intl/en-us/usermanual-ca/ca_01_0003.html</a>",
"access.form.jdcloud_access_key_id.label": "JD Cloud AccessKeyId",
"access.form.jdcloud_access_key_id.placeholder": "Please enter JD Cloud AccessKeyId",
"access.form.jdcloud_access_key_id.tooltip": "For more information, see <a href=\"https://docs.jdcloud.com/en/account-management/accesskey-management\" target=\"_blank\">https://docs.jdcloud.com/en/account-management/accesskey-management</a>",
"access.form.jdcloud_access_key_secret.label": "JD Cloud AccessKeySecret",
"access.form.jdcloud_access_key_secret.placeholder": "Please enter JD Cloud AccessKeySecret",
"access.form.jdcloud_access_key_secret.tooltip": "For more information, see <a href=\"https://docs.jdcloud.com/en/account-management/accesskey-management\" target=\"_blank\">https://docs.jdcloud.com/en/account-management/accesskey-management</a>",
"access.form.k8s_kubeconfig.label": "KubeConfig",
"access.form.k8s_kubeconfig.placeholder": "Please enter KubeConfig file",
"access.form.k8s_kubeconfig.upload": "Choose File ...",

View File

@@ -42,7 +42,7 @@
"provider.aliyun.cdn": "Alibaba Cloud - CDN (Content Delivery Network)",
"provider.aliyun.clb": "Alibaba Cloud - CLB (Classic Load Balancer)",
"provider.aliyun.dcdn": "Alibaba Cloud - DCDN (Dynamic Route for Content Delivery Network)",
"provider.aliyun.dns": "Alibaba Cloud - DNS (Domain Name Service)",
"provider.aliyun.dns": "Alibaba Cloud - DNS",
"provider.aliyun.esa": "Alibaba Cloud - ESA (Edge Security Acceleration)",
"provider.aliyun.live": "Alibaba Cloud - ApsaraVideo Live",
"provider.aliyun.nlb": "Alibaba Cloud - NLB (Network Load Balancer)",
@@ -69,8 +69,10 @@
"provider.godaddy": "GoDaddy",
"provider.huaweicloud": "Huawei Cloud",
"provider.huaweicloud.cdn": "Huawei Cloud - CDN (Content Delivery Network)",
"provider.huaweicloud.dns": "Huawei Cloud - DNS (Domain Name Service)",
"provider.huaweicloud.dns": "Huawei Cloud - DNS",
"provider.huaweicloud.elb": "Huawei Cloud - ELB (Elastic Load Balance)",
"provider.jdcloud": "JD Cloud",
"provider.jdcloud.dns": "JD Cloud - DNS",
"provider.kubernetes": "Kubernetes",
"provider.kubernetes.secret": "Kubernetes - Secret",
"provider.local": "Local deployment",
@@ -88,7 +90,7 @@
"provider.tencentcloud.clb": "Tencent Cloud - CLB (Cloud Load Balancer)",
"provider.tencentcloud.cos": "Tencent Cloud - COS (Cloud Object Storage)",
"provider.tencentcloud.css": "Tencent Cloud - CSS (Cloud Streaming Service)",
"provider.tencentcloud.dns": "Tencent Cloud - DNS (Domain Name Service)",
"provider.tencentcloud.dns": "Tencent Cloud - DNS",
"provider.tencentcloud.ecdn": "Tencent Cloud - ECDN (Enterprise Content Delivery Network)",
"provider.tencentcloud.eo": "Tencent Cloud - EdgeOne",
"provider.tencentcloud.ssl_deploy": "Tencent Cloud - via SSL Certificate Service Deployment Job",
@@ -99,7 +101,7 @@
"provider.volcengine.cdn": "Volcengine - CDN (Content Delivery Network)",
"provider.volcengine.clb": "Volcengine - CLB (Cloud Load Balancer)",
"provider.volcengine.dcdn": "Volcengine - DCDN (Dynamic Content Delivery Network)",
"provider.volcengine.dns": "Volcengine - DNS (Domain Name Service)",
"provider.volcengine.dns": "Volcengine - DNS",
"provider.volcengine.live": "Volcengine - Live",
"provider.volcengine.tos": "Volcengine - TOS (Tinder Object Storage)",
"provider.webhook": "Webhook",

View File

@@ -46,6 +46,8 @@
"workflow_node.apply.form.huaweicloud_dns_region.label": "Huawei Cloud DNS region",
"workflow_node.apply.form.huaweicloud_dns_region.placeholder": "Please enter Huawei Cloud DNS region (e.g. cn-north-1)",
"workflow_node.apply.form.huaweicloud_dns_region.tooltip": "For more information, see <a href=\"https://console-intl.huaweicloud.com/apiexplorer/#/endpoint?locale=en-us\" target=\"_blank\">https://console-intl.huaweicloud.com/apiexplorer/#/endpoint</a>",
"workflow_node.apply.form.jdcloud_dns_region_id.label": "JD Cloud DNS region ID",
"workflow_node.apply.form.jdcloud_dns_region_id.placeholder": "Please enter JD Cloud DNS region ID (e.g. cn-north-1)",
"workflow_node.apply.form.advanced_config.label": "Advanced settings",
"workflow_node.apply.form.key_algorithm.label": "Certificate key algorithm",
"workflow_node.apply.form.key_algorithm.placeholder": "Please select certificate key algorithm",

View File

@@ -38,8 +38,8 @@
"access.form.aliyun_access_key_id.label": "阿里云 AccessKeyId",
"access.form.aliyun_access_key_id.placeholder": "请输入阿里云 AccessKeyId",
"access.form.aliyun_access_key_id.tooltip": "这是什么?请参阅 <a href=\"https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair\" target=\"_blank\">https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair</a>",
"access.form.aliyun_access_key_secret.label": "阿里云 AccessKey Secret",
"access.form.aliyun_access_key_secret.placeholder": "请输入阿里云 AccessKey Secret",
"access.form.aliyun_access_key_secret.label": "阿里云 AccessKeySecret",
"access.form.aliyun_access_key_secret.placeholder": "请输入阿里云 AccessKeySecret",
"access.form.aliyun_access_key_secret.tooltip": "这是什么?请参阅 <a href=\"https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair\" target=\"_blank\">https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair</a>",
"access.form.aws_access_key_id.label": "AWS AccessKeyId",
"access.form.aws_access_key_id.placeholder": "请输入 AWS AccessKeyId",
@@ -133,6 +133,12 @@
"access.form.huaweicloud_secret_access_key.label": "华为云 SecretAccessKey",
"access.form.huaweicloud_secret_access_key.placeholder": "请输入华为云 SecretAccessKey",
"access.form.huaweicloud_secret_access_key.tooltip": "这是什么?请参阅 <a href=\"https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html\" target=\"_blank\">https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html</a>",
"access.form.jdcloud_access_key_id.label": "京东云 AccessKeyId",
"access.form.jdcloud_access_key_id.placeholder": "请输入京东云 AccessKeyId",
"access.form.jdcloud_access_key_id.tooltip": "这是什么?请参阅 <a href=\"https://docs.jdcloud.com/cn/account-management/accesskey-management\" target=\"_blank\">https://docs.jdcloud.com/cn/account-management/accesskey-management</a>",
"access.form.jdcloud_access_key_secret.label": "京东云 AccessKeySecret",
"access.form.jdcloud_access_key_secret.placeholder": "请输入京东云 AccessKeySecret",
"access.form.jdcloud_access_key_secret.tooltip": "这是什么?请参阅 <a href=\"https://docs.jdcloud.com/cn/account-management/accesskey-management\" target=\"_blank\">https://docs.jdcloud.com/cn/account-management/accesskey-management</a>",
"access.form.k8s_kubeconfig.label": "KubeConfig",
"access.form.k8s_kubeconfig.placeholder": "请选择 KubeConfig 文件",
"access.form.k8s_kubeconfig.upload": "选择文件",

View File

@@ -53,6 +53,8 @@
"provider.huaweicloud.dns": "华为云 - 云解析 DNS",
"provider.huaweicloud.elb": "华为云 - 弹性负载均衡 ELB",
"provider.huaweicloud.waf": "华为云 - Web 应用防火墙 WAF",
"provider.jdcloud": "京东云",
"provider.jdcloud.dns": "京东云 - 云解析 DNS",
"provider.kubernetes": "Kubernetes",
"provider.kubernetes.secret": "Kubernetes - Secret",
"provider.local": "本地部署",

View File

@@ -46,6 +46,8 @@
"workflow_node.apply.form.huaweicloud_dns_region.label": "华为云 DNS 服务区域",
"workflow_node.apply.form.huaweicloud_dns_region.placeholder": "请输入华为云 DNS 服务区域例如cn-north-1",
"workflow_node.apply.form.huaweicloud_dns_region.tooltip": "这是什么?请参阅 <a href=\"https://console.huaweicloud.com/apiexplorer/#/endpoint\" target=\"_blank\">https://console.huaweicloud.com/apiexplorer/#/endpoint</a>",
"workflow_node.apply.form.jdcloud_dns_region_id.label": "京东云 DNS 服务地域 ID",
"workflow_node.apply.form.jdcloud_dns_region_id.placeholder": "请输入京东云 DNS 服务地域 ID例如cn-north-1",
"workflow_node.apply.form.advanced_config.label": "高级设置",
"workflow_node.apply.form.key_algorithm.label": "数字证书算法",
"workflow_node.apply.form.key_algorithm.placeholder": "请选择数字证书算法",