diff --git a/internal/domain/access.go b/internal/domain/access.go
index bd4f41c1..9e351e99 100644
--- a/internal/domain/access.go
+++ b/internal/domain/access.go
@@ -11,7 +11,12 @@ type TencentAccess struct {
}
type HuaweiCloudAccess struct {
+ AccessKeyId string `json:"accessKeyId"`
+ SecretAccessKey string `json:"secretAccessKey"`
Region string `json:"region"`
+}
+
+type BaiduCloudAccess struct {
AccessKeyId string `json:"accessKeyId"`
SecretAccessKey string `json:"secretAccessKey"`
}
diff --git a/ui/public/imgs/providers/baiducloud.svg b/ui/public/imgs/providers/baiducloud.svg
new file mode 100644
index 00000000..25ab747a
--- /dev/null
+++ b/ui/public/imgs/providers/baiducloud.svg
@@ -0,0 +1 @@
+
diff --git a/ui/src/components/certimate/AccessBaiduCloudForm.tsx b/ui/src/components/certimate/AccessBaiduCloudForm.tsx
new file mode 100644
index 00000000..2a6e4781
--- /dev/null
+++ b/ui/src/components/certimate/AccessBaiduCloudForm.tsx
@@ -0,0 +1,194 @@
+import { useForm } from "react-hook-form";
+import { useTranslation } from "react-i18next";
+import z from "zod";
+import { zodResolver } from "@hookform/resolvers/zod";
+import { ClientResponseError } from "pocketbase";
+
+import { Input } from "@/components/ui/input";
+import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form";
+import { Button } from "@/components/ui/button";
+import { PbErrorData } from "@/domain/base";
+import { accessProvidersMap, accessTypeFormSchema, type Access, type BaiduCloudConfig } from "@/domain/access";
+import { save } from "@/repository/access";
+import { useConfigContext } from "@/providers/config";
+
+type AccessBaiduCloudFormProps = {
+ op: "add" | "edit" | "copy";
+ data?: Access;
+ onAfterReq: () => void;
+};
+
+const AccessBaiduCloudForm = ({ data, op, onAfterReq }: AccessBaiduCloudFormProps) => {
+ const { addAccess, updateAccess } = useConfigContext();
+ const { t } = useTranslation();
+ const formSchema = z.object({
+ id: z.string().optional(),
+ name: z
+ .string()
+ .min(1, "access.authorization.form.name.placeholder")
+ .max(64, t("common.errmsg.string_max", { max: 64 })),
+ configType: accessTypeFormSchema,
+ accessKeyId: z
+ .string()
+ .min(1, "access.authorization.form.access_key_id.placeholder")
+ .max(64, t("common.errmsg.string_max", { max: 64 })),
+ secretAccessKey: z
+ .string()
+ .min(1, "access.authorization.form.secret_access_key.placeholder")
+ .max(64, t("common.errmsg.string_max", { max: 64 })),
+ });
+
+ let config: BaiduCloudConfig = {
+ accessKeyId: "",
+ secretAccessKey: "",
+ };
+ if (data) config = data.config as BaiduCloudConfig;
+
+ const form = useForm>({
+ resolver: zodResolver(formSchema),
+ defaultValues: {
+ id: data?.id,
+ name: data?.name || "",
+ configType: "baiducloud",
+ accessKeyId: config.accessKeyId,
+ secretAccessKey: config.secretAccessKey,
+ },
+ });
+
+ const onSubmit = async (data: z.infer) => {
+ const req: Access = {
+ id: data.id as string,
+ name: data.name,
+ configType: data.configType,
+ usage: accessProvidersMap.get(data.configType)!.usage,
+ config: {
+ accessKeyId: data.accessKeyId,
+ secretAccessKey: data.secretAccessKey,
+ },
+ };
+
+ try {
+ req.id = op == "copy" ? "" : req.id;
+ const rs = await save(req);
+
+ onAfterReq();
+
+ req.id = rs.id;
+ req.created = rs.created;
+ req.updated = rs.updated;
+ if (data.id && op == "edit") {
+ updateAccess(req);
+ return;
+ }
+ addAccess(req);
+ } catch (e) {
+ const err = e as ClientResponseError;
+
+ Object.entries(err.response.data as PbErrorData).forEach(([key, value]) => {
+ form.setError(key as keyof z.infer, {
+ type: "manual",
+ message: value.message,
+ });
+ });
+
+ return;
+ }
+ };
+
+ return (
+ <>
+
+
+ >
+ );
+};
+
+export default AccessBaiduCloudForm;
diff --git a/ui/src/components/certimate/AccessEditDialog.tsx b/ui/src/components/certimate/AccessEditDialog.tsx
index f5c3c65e..8f226343 100644
--- a/ui/src/components/certimate/AccessEditDialog.tsx
+++ b/ui/src/components/certimate/AccessEditDialog.tsx
@@ -8,6 +8,7 @@ import { ScrollArea } from "@/components/ui/scroll-area";
import AccessAliyunForm from "./AccessAliyunForm";
import AccessTencentForm from "./AccessTencentForm";
import AccessHuaweiCloudForm from "./AccessHuaweicloudForm";
+import AccessBaiduCloudForm from "./AccessBaiduCloudForm";
import AccessQiniuForm from "./AccessQiniuForm";
import AccessDogeCloudForm from "./AccessDogeCloudForm";
import AccessAwsForm from "./AccessAwsForm";
@@ -72,6 +73,17 @@ const AccessEditDialog = ({ trigger, op, data, className }: AccessEditProps) =>
/>
);
break;
+ case "baiducloud":
+ childComponent = (
+ {
+ setOpen(false);
+ }}
+ />
+ );
+ break;
case "qiniu":
childComponent = (
= n
["aliyun", "common.provider.aliyun", "/imgs/providers/aliyun.svg", "all", "阿里云:alibaba cloud"],
["tencent", "common.provider.tencent", "/imgs/providers/tencent.svg", "all", "腾讯云:tencent cloud"],
["huaweicloud", "common.provider.huaweicloud", "/imgs/providers/huaweicloud.svg", "all", "华为云:huawei cloud"],
+ ["baiducloud", "common.provider.baiducloud", "/imgs/providers/baiducloud.svg", "all", "百度智能云:百度云:baidu cloud"],
["qiniu", "common.provider.qiniu", "/imgs/providers/qiniu.svg", "deploy", "七牛云:qiniu"],
- ["dogecloud", "common.provider.dogecloud", "/imgs/providers/dogecloud.svg", "deploy", "多吉云:dogecloud:doge cloud"],
+ ["dogecloud", "common.provider.dogecloud", "/imgs/providers/dogecloud.svg", "deploy", "多吉云:doge cloud"],
["aws", "common.provider.aws", "/imgs/providers/aws.svg", "apply", "亚马逊:amazon:aws"],
["cloudflare", "common.provider.cloudflare", "/imgs/providers/cloudflare.svg", "apply", "cloudflare:cf:cloud flare"],
["namesilo", "common.provider.namesilo", "/imgs/providers/namesilo.svg", "apply", "namesilo"],
@@ -35,6 +36,7 @@ export const accessTypeFormSchema = z.union(
z.literal("aliyun"),
z.literal("tencent"),
z.literal("huaweicloud"),
+ z.literal("baiducloud"),
z.literal("qiniu"),
z.literal("dogecloud"),
z.literal("aws"),
@@ -94,6 +96,11 @@ export type HuaweiCloudConfig = {
secretAccessKey: string;
};
+export type BaiduCloudConfig = {
+ accessKeyId: string;
+ secretAccessKey: string;
+};
+
export type QiniuConfig = {
accessKey: string;
secretKey: string;
diff --git a/ui/src/i18n/locales/en/nls.common.json b/ui/src/i18n/locales/en/nls.common.json
index b872c7f0..54e1fa97 100644
--- a/ui/src/i18n/locales/en/nls.common.json
+++ b/ui/src/i18n/locales/en/nls.common.json
@@ -68,6 +68,7 @@
"common.provider.huaweicloud": "Huawei Cloud",
"common.provider.huaweicloud.cdn": "Huawei Cloud - CDN",
"common.provider.huaweicloud.elb": "Huawei Cloud - ELB",
+ "common.provider.baiducloud": "Baidu Cloud",
"common.provider.qiniu": "Qiniu Cloud",
"common.provider.qiniu.cdn": "Qiniu Cloud - CDN",
"common.provider.dogecloud": "Doge Cloud",
diff --git a/ui/src/i18n/locales/zh/nls.common.json b/ui/src/i18n/locales/zh/nls.common.json
index 462a771e..607da17d 100644
--- a/ui/src/i18n/locales/zh/nls.common.json
+++ b/ui/src/i18n/locales/zh/nls.common.json
@@ -68,6 +68,7 @@
"common.provider.huaweicloud": "华为云",
"common.provider.huaweicloud.cdn": "华为云 - 内容分发网络 CDN",
"common.provider.huaweicloud.elb": "华为云 - 弹性负载均衡 ELB",
+ "common.provider.baiducloud": "百度智能云",
"common.provider.qiniu": "七牛云",
"common.provider.qiniu.cdn": "七牛云 - 内容分发网络 CDN",
"common.provider.dogecloud": "多吉云",