feat: 账号列表增加编辑功能
CI / lint-and-build (push) Has been cancelled

- 支持修改名称、AccessKey ID/Secret、Region、Endpoint

- 编辑时 Secret 留空表示不修改
This commit is contained in:
2026-06-29 18:14:06 +06:00
parent b84bac5828
commit 962cbc8df3
+54 -11
View File
@@ -10,10 +10,11 @@ import {
Tag, Tag,
Popconfirm, Popconfirm,
} from 'antd'; } from 'antd';
import { PlusOutlined } from '@ant-design/icons'; import { PlusOutlined, EditOutlined } from '@ant-design/icons';
import { import {
listAccounts, listAccounts,
createAccount, createAccount,
updateAccount,
deleteAccount, deleteAccount,
switchAccount, switchAccount,
Account, Account,
@@ -24,6 +25,7 @@ export default function AccountsPage() {
const [accounts, setAccounts] = useState<Account[]>([]); const [accounts, setAccounts] = useState<Account[]>([]);
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [modalOpen, setModalOpen] = useState(false); const [modalOpen, setModalOpen] = useState(false);
const [editingAccount, setEditingAccount] = useState<Account | null>(null);
const [form] = Form.useForm(); const [form] = Form.useForm();
const fetchAccounts = async () => { const fetchAccounts = async () => {
@@ -40,15 +42,46 @@ export default function AccountsPage() {
fetchAccounts(); fetchAccounts();
}, []); }, []);
const openCreateModal = () => {
setEditingAccount(null);
form.resetFields();
setModalOpen(true);
};
const openEditModal = (record: Account) => {
setEditingAccount(record);
form.setFieldsValue({
name: record.name,
accessKeyId: record.accessKeyId,
region: record.region,
endpoint: record.endpoint,
});
setModalOpen(true);
};
const closeModal = () => {
setModalOpen(false);
setEditingAccount(null);
form.resetFields();
};
const handleSubmit = async (values: AccountInput) => { const handleSubmit = async (values: AccountInput) => {
try { try {
await createAccount(values); if (editingAccount) {
message.success('账号添加成功'); const payload: Partial<AccountInput> = { ...values };
setModalOpen(false); if (!payload.accessKeySecret) {
form.resetFields(); delete payload.accessKeySecret;
}
await updateAccount(editingAccount.id, payload);
message.success('账号更新成功');
} else {
await createAccount(values);
message.success('账号添加成功');
}
closeModal();
fetchAccounts(); fetchAccounts();
} catch (error) { } catch (error) {
message.error('添加失败'); message.error(editingAccount ? '更新失败' : '添加失败');
} }
}; };
@@ -92,6 +125,9 @@ export default function AccountsPage() {
</Button> </Button>
)} )}
<Button type="link" icon={<EditOutlined />} onClick={() => openEditModal(record)}>
</Button>
<Popconfirm title="确认删除?" onConfirm={() => handleDelete(record.id)}> <Popconfirm title="确认删除?" onConfirm={() => handleDelete(record.id)}>
<Button type="link" danger> <Button type="link" danger>
@@ -102,10 +138,12 @@ export default function AccountsPage() {
}, },
]; ];
const modalTitle = editingAccount ? '编辑阿里云 VOD 账号' : '添加阿里云 VOD 账号';
return ( return (
<div> <div>
<div style={{ marginBottom: 16 }}> <div style={{ marginBottom: 16 }}>
<Button type="primary" icon={<PlusOutlined />} onClick={() => setModalOpen(true)}> <Button type="primary" icon={<PlusOutlined />} onClick={openCreateModal}>
</Button> </Button>
</div> </div>
@@ -113,9 +151,9 @@ export default function AccountsPage() {
<Table rowKey="id" columns={columns} dataSource={accounts} loading={loading} /> <Table rowKey="id" columns={columns} dataSource={accounts} loading={loading} />
<Modal <Modal
title="添加阿里云 VOD 账号" title={modalTitle}
open={modalOpen} open={modalOpen}
onCancel={() => setModalOpen(false)} onCancel={closeModal}
footer={null} footer={null}
> >
<Form form={form} layout="vertical" onFinish={handleSubmit}> <Form form={form} layout="vertical" onFinish={handleSubmit}>
@@ -134,9 +172,14 @@ export default function AccountsPage() {
<Input /> <Input />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
label="AccessKey Secret" label={editingAccount ? 'AccessKey Secret(留空则不修改)' : 'AccessKey Secret'}
name="accessKeySecret" name="accessKeySecret"
rules={[{ required: true, message: '请输入 AccessKey Secret' }]} rules={[
{
required: !editingAccount,
message: '请输入 AccessKey Secret',
},
]}
> >
<Input.Password /> <Input.Password />
</Form.Item> </Form.Item>