import { App, Button, Form, Input, Select, Switch, Tag } from "antd"; import { Cloud, ShieldCheck } from "lucide-react"; import { useEffect, useState } from "react"; import { getUserOSSSetting, updateUserOSSSetting, type UserOSSSetting } from "@/services/api/resources"; import { useUserStore } from "@/stores/use-user-store"; type OSSFormValues = { enabled?: boolean; provider: "aliyun"; region?: string; endpoint?: string; bucket?: string; accessKeyId?: string; accessKeySecret?: string; pathPrefix?: string; }; export function UserOSSSettingsForm() { const actor = useUserStore((state) => state.user); const { message } = App.useApp(); const [form] = Form.useForm(); const [setting, setSetting] = useState(null); const [loading, setLoading] = useState(false); const [saving, setSaving] = useState(false); const savedAt = formatSavedAt(setting?.updatedAt); useEffect(() => { if (!actor?.id) return; let active = true; setLoading(true); void getUserOSSSetting() .then((data) => { if (!active) return; setSetting(data.setting); form.setFieldsValue(toFormValues(data.setting)); }) .catch((error) => active && message.error(error instanceof Error ? error.message : "读取个人 OSS 配置失败")) .finally(() => active && setLoading(false)); return () => { active = false; }; }, [actor?.id, form, message]); if (!actor) { return
登录后可配置个人 OSS。
; } const save = async () => { const values = await form.validateFields(); setSaving(true); try { const data = await updateUserOSSSetting({ enabled: values.enabled === true, provider: values.provider || "aliyun", region: values.region?.trim() || "", endpoint: values.endpoint?.trim() || "", bucket: values.bucket?.trim() || "", accessKeyId: values.accessKeyId?.trim() || "", accessKeySecret: values.accessKeySecret?.trim() || "", pathPrefix: values.pathPrefix?.trim() || "", }); setSetting(data.setting); form.setFieldsValue(toFormValues(data.setting)); message.success(data.setting.enabled ? "个人 OSS 已启用,后续上传将优先使用该存储" : "个人 OSS 已停用,后续上传将使用平台存储"); } catch (error) { message.error(error instanceof Error ? error.message : "保存个人 OSS 配置失败"); } finally { setSaving(false); } }; return (
我的 OSS

启用后,新上传和新生成的媒体优先写入你的 OSS;停用时回退到平台存储。历史资源固定使用创建时的配置版本。

{setting?.enabled ? "已启用" : "未启用"} }> {setting?.hasAccessKeySecret ? "密钥已加密" : "未保存密钥"}
{savedAt ? `上次保存:${savedAt}` : "尚未保存个人 OSS 配置"}
); } function formatSavedAt(value?: string) { if (!value) return ""; const date = new Date(value); if (Number.isNaN(date.getTime()) || date.getFullYear() < 2000) return ""; return date.toLocaleString("zh-CN"); } function toFormValues(setting: UserOSSSetting): OSSFormValues { return { enabled: setting.enabled, provider: setting.provider || "aliyun", region: setting.region, endpoint: setting.endpoint, bucket: setting.bucket, accessKeyId: setting.accessKeyId, accessKeySecret: "", pathPrefix: setting.pathPrefix, }; }