import React, { useEffect, useState } from 'react'; import { Button, Form, Header, Icon, Segment, Table, TextArea, } from 'semantic-ui-react'; import { API, formatDateTime, showError, showSuccess } from '../../helpers'; const initialManualForm = { name: '', cert_pem: '', key_pem: '', remark: '', }; const initialFileForm = { name: '', remark: '', }; const TLSCertificate = () => { const [certificates, setCertificates] = useState([]); const [loading, setLoading] = useState(false); const [manualForm, setManualForm] = useState(initialManualForm); const [fileForm, setFileForm] = useState(initialFileForm); const [certFile, setCertFile] = useState(null); const [keyFile, setKeyFile] = useState(null); const [submittingManual, setSubmittingManual] = useState(false); const [submittingFiles, setSubmittingFiles] = useState(false); const loadCertificates = async () => { setLoading(true); const res = await API.get('/api/tls-certificates/'); const { success, message, data } = res.data; if (success) { setCertificates(data || []); } else { showError(message); } setLoading(false); }; useEffect(() => { loadCertificates().then(); }, []); const submitManual = async () => { setSubmittingManual(true); const payload = { name: manualForm.name.trim(), cert_pem: manualForm.cert_pem.trim(), key_pem: manualForm.key_pem.trim(), remark: manualForm.remark.trim(), }; const res = await API.post('/api/tls-certificates/', payload); const { success, message } = res.data; if (success) { showSuccess('证书已导入'); setManualForm(initialManualForm); await loadCertificates(); } else { showError(message); } setSubmittingManual(false); }; const submitFiles = async () => { if (!certFile || !keyFile) { showError('请选择证书文件和私钥文件'); return; } setSubmittingFiles(true); const formData = new FormData(); formData.append('name', fileForm.name.trim()); formData.append('remark', fileForm.remark.trim()); formData.append('cert_file', certFile); formData.append('key_file', keyFile); const res = await API.post('/api/tls-certificates/import-file', formData, { headers: { 'Content-Type': 'multipart/form-data' }, }); const { success, message } = res.data; if (success) { showSuccess('证书文件已导入'); setFileForm(initialFileForm); setCertFile(null); setKeyFile(null); await loadCertificates(); } else { showError(message); } setSubmittingFiles(false); }; const deleteCertificate = async (id) => { const res = await API.delete(`/api/tls-certificates/${id}`); const { success, message } = res.data; if (success) { showSuccess('证书已删除'); await loadCertificates(); } else { showError(message); } }; return (
证书管理

支持手动粘贴 PEM 导入或直接上传证书文件。

手动导入
setManualForm({ ...manualForm, name: value })} /> setManualForm({ ...manualForm, remark: value })} /> setManualForm({ ...manualForm, cert_pem: value })} style={{ minHeight: 140 }} /> setManualForm({ ...manualForm, key_pem: value })} style={{ minHeight: 140 }} />
文件导入
setFileForm({ ...fileForm, name: value })} /> setFileForm({ ...fileForm, remark: value })} /> setCertFile(e.target.files?.[0] || null)} /> setKeyFile(e.target.files?.[0] || null)} />
名称 有效期 备注 更新时间 操作 {certificates.map((certificate) => ( {certificate.name} {formatDateTime(certificate.not_before)} ~ {formatDateTime(certificate.not_after)} {certificate.remark || '无'} {formatDateTime(certificate.updated_at)} ))}
); }; export default TLSCertificate;