真人素材库V3

This commit is contained in:
2026-07-07 13:20:50 +08:00
parent d80f5c3577
commit 6ae5e0d663
31 changed files with 1421 additions and 606 deletions
+21 -21
View File
@@ -189,7 +189,7 @@ const AdminUsers: React.FC = () => {
credits: values.credits || 0,
user_type: userType,
frontend_user_kind: values.frontend_user_kind || 'external',
private_portrait_image_limit: userType === 'frontend' ? Number(values.private_portrait_image_limit ?? 5) : 0,
private_portrait_asset_limit: userType === 'frontend' ? Number(values.private_portrait_asset_limit ?? 5) : 0,
});
message.success('用户创建成功');
setCreateModal(false);
@@ -276,13 +276,13 @@ const AdminUsers: React.FC = () => {
const openPortraitModal = async (user: AdminUser) => {
setPortraitLoading(true);
setPortraitModal({ open: true, user, config: null });
portraitForm.setFieldsValue({ privatePortraitImageLimit: user.privatePortraitImageLimit ?? 5 });
portraitForm.setFieldsValue({ privatePortraitAssetLimit: user.privatePortraitAssetLimit ?? 5 });
try {
const config = await adminGetPrivatePortraitConfig(user.id);
portraitForm.setFieldsValue({ privatePortraitImageLimit: config.imageLimit });
portraitForm.setFieldsValue({ privatePortraitAssetLimit: config.assetLimit });
setPortraitModal({ open: true, user, config });
} catch (e: any) {
message.error(e?.message || '加载真人素材库配置失败');
message.error(e?.message || '加载私域人像素材库配置失败');
setPortraitModal({ open: false, user: null, config: null });
} finally {
setPortraitLoading(false);
@@ -294,16 +294,16 @@ const AdminUsers: React.FC = () => {
if (!user) return;
try {
const values = await portraitForm.validateFields();
const limit = Number(values.privatePortraitImageLimit ?? 0);
const limit = Number(values.privatePortraitAssetLimit ?? 0);
setPortraitSaving(true);
const config = await adminUpdatePrivatePortraitConfig(user.id, limit);
message.success(limit > 0 ? `真人素材库已开启,限制 ${limit} ` : '真人素材库已关闭');
message.success(limit > 0 ? `私域人像素材库已开启,限制 ${limit} ` : '私域人像素材库已关闭');
setPortraitModal({ open: false, user: null, config });
portraitForm.resetFields();
load();
} catch (e: any) {
if (e?.errorFields) return;
message.error(e?.message || '保存真人素材库配置失败');
message.error(e?.message || '保存私域人像素材库配置失败');
} finally {
setPortraitSaving(false);
}
@@ -424,10 +424,10 @@ const AdminUsers: React.FC = () => {
render: (v: string | null | undefined) => v ? <Tag color="blue">{v}</Tag> : <Typography.Text type="secondary"></Typography.Text>,
}] : []),
...(!isAdminTab ? [{
title: '真人素材库', dataIndex: 'privatePortraitImageLimit', width: 150,
title: '私域人像素材库', dataIndex: 'privatePortraitAssetLimit', width: 150,
render: (v: number) => {
const limit = Number(v || 0);
return limit > 0 ? <Tag color="purple">{limit} </Tag> : <Tag></Tag>;
return limit > 0 ? <Tag color="purple">{limit} </Tag> : <Tag></Tag>;
},
}] : []),
...(!isAdminTab ? [{
@@ -493,7 +493,7 @@ const AdminUsers: React.FC = () => {
{!isAdminTab && (
<Button type="link" size="small" icon={<PictureOutlined />}
onClick={() => openPortraitModal(r)}>
</Button>
)}
{!isAdminTab && (
@@ -784,7 +784,7 @@ const AdminUsers: React.FC = () => {
</Modal>
<Modal
title={<Space><PictureOutlined /> - {portraitModal.user?.username}</Space>}
title={<Space><PictureOutlined /> - {portraitModal.user?.username}</Space>}
open={portraitModal.open}
confirmLoading={portraitSaving}
onOk={handleSavePortraitConfig}
@@ -797,17 +797,17 @@ const AdminUsers: React.FC = () => {
{portraitModal.config?.enabled ? <Tag color="purple"></Tag> : <Tag></Tag>}
</Typography.Text>
<Typography.Text type="secondary">
{portraitModal.config?.usedImageCount ?? '-'}
{portraitModal.config?.enabled ? portraitModal.config.remainingImageCount : 0}
{portraitModal.config?.usedAssetCount ?? '-'}
{portraitModal.config?.enabled ? portraitModal.config.remainingAssetCount : 0}
</Typography.Text>
</Space>
</Card>
<Form form={portraitForm} layout="vertical">
<Form.Item
name="privatePortraitImageLimit"
label="真人素材库图片上限"
extra="0 表示关闭真人素材库;大于 0 表示开启,并限制该用户所有真人素材图片总量。"
rules={[{ required: true, message: '请输入真人素材库图片上限' }]}
name="privatePortraitAssetLimit"
label="私域人像素材总量上限"
extra="0 表示关闭私域人像素材库;大于 0 表示开启,并限制该用户所有私域人像素材总量。"
rules={[{ required: true, message: '请输入私域人像素材总量上限' }]}
>
<InputNumber min={0} max={9999} precision={0} style={{ width: '100%' }} size="large" />
</Form.Item>
@@ -857,11 +857,11 @@ const AdminUsers: React.FC = () => {
)}
{createType === 'frontend' && (
<Form.Item
name="private_portrait_image_limit"
label="真人素材库图片上限"
name="private_portrait_asset_limit"
label="私域人像素材总量上限"
initialValue={5}
extra="0 表示关闭真人素材库;大于 0 表示开启并限制该用户所有真人素材图片总量。"
rules={[{ required: true, message: '请输入真人素材库图片上限' }]}
extra="0 表示关闭私域人像素材库;大于 0 表示开启并限制该用户所有私域人像素材总量。"
rules={[{ required: true, message: '请输入私域人像素材总量上限' }]}
>
<InputNumber min={0} max={9999} precision={0} style={{ width: '100%' }} size="large" />
</Form.Item>