feat没问题

This commit is contained in:
许永平
2025-07-09 17:44:16 +08:00
parent 4367d5a5f3
commit 37dabcfdf6
3 changed files with 164 additions and 4 deletions

View File

@@ -0,0 +1,135 @@
import React, { useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { useToast } from '@/components/ui/toast';
import { createMomentsSyncTask } from '@/api/momentsSync';
export default function NewMomentsSyncTask() {
const navigate = useNavigate();
const { toast } = useToast();
const [loading, setLoading] = useState(false);
const [form, setForm] = useState({
name: '',
deviceIds: '', // 逗号分隔
contentLib: '',
syncMode: 'auto',
syncInterval: '30',
maxSyncPerDay: '100',
timeStart: '08:00',
timeEnd: '22:00',
targetTags: '', // 逗号分隔
contentTypes: '', // 逗号分隔
filterKeywords: '', // 逗号分隔
});
const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>) => {
const { name, value } = e.target;
setForm(prev => ({
...prev,
[name]: value,
}));
};
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
if (!form.name.trim()) {
toast({ title: '请输入任务名称', variant: 'destructive' });
return;
}
if (!form.deviceIds.trim()) {
toast({ title: '请输入推送设备', variant: 'destructive' });
return;
}
if (!form.contentLib.trim()) {
toast({ title: '请输入内容库', variant: 'destructive' });
return;
}
setLoading(true);
try {
await createMomentsSyncTask({
name: form.name,
devices: form.deviceIds.split(',').map(s => s.trim()).filter(Boolean),
contentLib: form.contentLib,
syncMode: form.syncMode as 'auto' | 'manual',
interval: Number(form.syncInterval),
maxSync: Number(form.maxSyncPerDay),
startTime: form.timeStart,
endTime: form.timeEnd,
targetTags: form.targetTags.split(',').map(s => s.trim()).filter(Boolean),
contentTypes: form.contentTypes.split(',').map(s => s.trim()).filter(Boolean) as ('text' | 'image' | 'video' | 'link')[],
filterKeywords: form.filterKeywords.split(',').map(s => s.trim()).filter(Boolean),
});
toast({ title: '创建成功' });
navigate('/workspace/moments-sync');
} catch (error) {
toast({ title: '创建失败', variant: 'destructive' });
} finally {
setLoading(false);
}
};
return (
<div className="flex-1 bg-gray-50 min-h-screen pb-20">
<div className="max-w-xl mx-auto bg-white rounded shadow p-6 mt-8">
<h2 className="text-lg font-bold mb-6"></h2>
<form onSubmit={handleSubmit} className="space-y-5">
<div>
<label className="block mb-1 font-medium"></label>
<Input value={form.name} onChange={handleChange} placeholder="请输入任务名称" name="name" required />
</div>
<div>
<label className="block mb-1 font-medium">ID</label>
<Input value={form.deviceIds} onChange={handleChange} placeholder="如dev1,dev2" name="deviceIds" required />
</div>
<div>
<label className="block mb-1 font-medium"></label>
<Input value={form.contentLib} onChange={handleChange} placeholder="请输入内容库名称" name="contentLib" required />
</div>
<div>
<label className="block mb-1 font-medium"></label>
<select name="syncMode" value={form.syncMode} onChange={handleChange} className="w-full border rounded px-3 py-2">
<option value="auto"></option>
<option value="manual"></option>
</select>
</div>
<div className="flex space-x-4">
<div className="flex-1">
<label className="block mb-1 font-medium">()</label>
<Input value={form.syncInterval} onChange={handleChange} name="syncInterval" type="number" min={1} required />
</div>
<div className="flex-1">
<label className="block mb-1 font-medium"></label>
<Input value={form.maxSyncPerDay} onChange={handleChange} name="maxSyncPerDay" type="number" min={1} required />
</div>
</div>
<div className="flex space-x-4">
<div className="flex-1">
<label className="block mb-1 font-medium"></label>
<Input value={form.timeStart} onChange={handleChange} name="timeStart" type="time" required />
</div>
<div className="flex-1">
<label className="block mb-1 font-medium"></label>
<Input value={form.timeEnd} onChange={handleChange} name="timeEnd" type="time" required />
</div>
</div>
<div>
<label className="block mb-1 font-medium"></label>
<Input value={form.targetTags} onChange={handleChange} placeholder="如:重要客户,活跃用户" name="targetTags" />
</div>
<div>
<label className="block mb-1 font-medium">text,image,video</label>
<Input value={form.contentTypes} onChange={handleChange} placeholder="如text,image,video" name="contentTypes" />
</div>
<div>
<label className="block mb-1 font-medium"></label>
<Input value={form.filterKeywords} onChange={handleChange} placeholder="如:产品,服务,优惠" name="filterKeywords" />
</div>
<div className="pt-2">
<Button type="submit" loading={loading} className="w-full">{loading ? '提交中...' : '创建任务'}</Button>
</div>
</form>
</div>
</div>
);
}