feat: 本次提交更新内容如下

新建内容库构建完成
This commit is contained in:
笔记本里的永平
2025-07-14 15:58:41 +08:00
parent 1d640abc6e
commit 53ae9d18c6
4 changed files with 412 additions and 48 deletions

View File

@@ -2,15 +2,16 @@ import React, { useState, useEffect } from 'react';
import { useNavigate, useParams } from 'react-router-dom';
import Layout from '@/components/Layout';
import UnifiedHeader from '@/components/UnifiedHeader';
import BottomNav from '@/components/BottomNav';
import { Input } from '@/components/ui/input';
import { Textarea } from '@/components/ui/textarea';
import { Switch } from '@/components/ui/switch';
import { Button } from '@/components/ui/button';
import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs';
import { Card } from '@/components/ui/card';
import { Collapse, CollapsePanel } from 'tdesign-mobile-react';
import { Collapse, CollapsePanel ,Button} from 'tdesign-mobile-react';
import { toast } from '@/components/ui/toast';
import FriendSelection from '@/components/FriendSelection';
import GroupSelection from '@/components/GroupSelection';
import { post } from '@/api/request';
// TODO: 引入微信好友/群组选择器、日期选择器等组件
interface WechatFriend { id: string; nickname: string; avatar: string; }
@@ -45,6 +46,8 @@ export default function NewContentLibraryPage() {
aiPrompt: '',
enabled: true,
});
const [selectedFriendObjs, setSelectedFriendObjs] = useState<WechatFriend[]>([]);
const [selectedGroupObjs, setSelectedGroupObjs] = useState<WechatGroup[]>([]);
const [isFriendSelectorOpen, setIsFriendSelectorOpen] = useState(false);
const [isGroupSelectorOpen, setIsGroupSelectorOpen] = useState(false);
const [isSubmitting, setIsSubmitting] = useState(false);
@@ -54,7 +57,22 @@ export default function NewContentLibraryPage() {
const handleSave = async () => {
setIsSubmitting(true);
try {
await new Promise((resolve) => setTimeout(resolve, 500));
// 组装提交参数
const payload = {
name: form.name,
sourceType: form.sourceType === 'friends' ? 1 : 2,
friends: form.selectedFriends.map(f => Number(f.id)),
groups: form.selectedGroups.map(g => Number(g.id)),
groupMembers: {},
keywordInclude: form.keywordsInclude ? form.keywordsInclude.split(',').map(s => s.trim()).filter(Boolean) : [],
keywordExclude: form.keywordsExclude ? form.keywordsExclude.split(',').map(s => s.trim()).filter(Boolean) : [],
aiPrompt: form.aiPrompt,
timeEnabled: form.startDate || form.endDate ? 1 : 0,
startTime: form.startDate || '',
endTime: form.endDate || '',
status: form.enabled ? 1 : 0
};
await post('/v1/content/library/create', payload);
toast({ title: '创建成功', description: '内容库已保存' });
navigate('/content');
} catch (error) {
@@ -67,7 +85,13 @@ export default function NewContentLibraryPage() {
return (
<Layout
header={<UnifiedHeader title="新建内容库" showBack onBack={() => navigate(-1)} />}
footer={<BottomNav />}
footer={
<div className="p-4">
<Button theme="primary" block onClick={handleSave} disabled={isSubmitting || !form.name} >
{isSubmitting ? '创建中...' : '创建内容库'}
</Button>
</div>
}
>
<div className="flex-1 bg-gray-50 min-h-screen pb-16">
<div className="p-4 space-y-4 max-w-lg mx-auto">
@@ -90,28 +114,84 @@ export default function NewContentLibraryPage() {
<TabsTrigger value="groups"></TabsTrigger>
</TabsList>
<TabsContent value="friends">
<Button variant="outline" className="w-full" onClick={() => setIsFriendSelectorOpen(true)}>
</Button>
{form.selectedFriends.length > 0 && (
<FriendSelection
selectedFriends={form.selectedFriends.map(f => f.id)}
onSelect={ids => setForm(f => ({
...f,
selectedFriends: ids.map(id => ({ id, nickname: id, avatar: '' }))
}))}
onSelectDetail={setSelectedFriendObjs}
enableDeviceFilter={false}
placeholder="选择微信好友"
/>
{selectedFriendObjs.length > 0 && (
<div className="mt-2 space-y-2">
{form.selectedFriends.map(friend => (
{selectedFriendObjs.map(friend => (
<div key={friend.id} className="flex items-center justify-between bg-gray-100 p-2 rounded-md">
<span>{friend.nickname}</span>
<div className="flex items-center gap-2">
{friend.avatar ? (
<img src={friend.avatar} alt={friend.nickname} className="w-8 h-8 rounded-full object-cover" />
) : (
<div className="w-8 h-8 rounded-full bg-gray-300 flex items-center justify-center text-white text-sm">{friend.nickname?.charAt(0) || '友'}</div>
)}
<span>{friend.nickname}</span>
</div>
<button
className="text-gray-400 hover:text-red-500 ml-2"
onClick={() => {
setForm(f => ({
...f,
selectedFriends: f.selectedFriends.filter(frd => frd.id !== friend.id)
}));
setSelectedFriendObjs(objs => objs.filter(frd => frd.id !== friend.id));
}}
title="移除"
>
×
</button>
</div>
))}
</div>
)}
</TabsContent>
<TabsContent value="groups">
<Button variant="outline" className="w-full" onClick={() => setIsGroupSelectorOpen(true)}>
</Button>
{form.selectedGroups.length > 0 && (
<GroupSelection
selectedGroups={form.selectedGroups.map(g => g.id)}
onSelect={ids => setForm(f => ({
...f,
selectedGroups: ids.map(id => {
const old = f.selectedGroups.find(g => g.id === id);
return old || { id, name: id, avatar: '' };
})
}))}
onSelectDetail={setSelectedGroupObjs}
placeholder="选择群聊"
/>
{selectedGroupObjs.length > 0 && (
<div className="mt-2 space-y-2">
{form.selectedGroups.map(group => (
{selectedGroupObjs.map(group => (
<div key={group.id} className="flex items-center justify-between bg-gray-100 p-2 rounded-md">
<span>{group.name}</span>
<div className="flex items-center gap-2">
{group.avatar ? (
<img src={group.avatar} alt={group.name} className="w-8 h-8 rounded-full object-cover" />
) : (
<div className="w-8 h-8 rounded-full bg-gray-300 flex items-center justify-center text-white text-sm">{group.name?.charAt(0) || '群'}</div>
)}
<span>{group.name}</span>
</div>
<button
className="text-gray-400 hover:text-red-500 ml-2"
onClick={() => {
setForm(f => ({
...f,
selectedGroups: f.selectedGroups.filter(grp => grp.id !== group.id)
}));
setSelectedGroupObjs(objs => objs.filter(grp => grp.id !== group.id));
}}
title="移除"
>
×
</button>
</div>
))}
</div>
@@ -187,11 +267,7 @@ export default function NewContentLibraryPage() {
<label className="block font-medium mb-1"></label>
<Switch checked={form.enabled} onCheckedChange={checked => setForm(f => ({ ...f, enabled: checked }))} />
</div>
<div className="flex justify-end mt-4">
<Button onClick={handleSave} disabled={isSubmitting || !form.name}>
{isSubmitting ? '创建中...' : '创建内容库'}
</Button>
</div>
</div>
</Card>
</div>