feat(history): establish Telegram SaaS platform foundation

This commit is contained in:
wmq
2026-07-27 23:03:00 +08:00
parent cf0eed46c3
commit cd06d049fe
92 changed files with 5608 additions and 3749 deletions
+26 -7
View File
@@ -12,7 +12,6 @@ import { Switch } from '@/components/ui/switch'
import { Input, Textarea, Field } from '@/components/ui/input'
import { Tabs } from '@/components/ui/tabs'
import { Dialog } from '@/components/ui/dialog'
import { DemoNote } from '@/components/common/DemoNote'
import {
getKnowledge, createKnowledge, updateKnowledge, deleteKnowledge,
uploadKnowledgeFiles, knowledgeSearchTest, getKnowledgeStats,
@@ -38,7 +37,7 @@ export function KnowledgePage() {
const { data: stats } = useQuery({ queryKey: ['knowledge-stats'], queryFn: getKnowledgeStats, enabled: tab === 'stats' })
const [searchResult, setSearchResult] = useState<any>(null)
const [searchLoading, setSearchLoading] = useState(false)
const [uploadFiles, setUploadFiles] = useState<{ name: string; type: string }[]>([])
const [uploadFiles, setUploadFiles] = useState<File[]>([])
const [uploadDialog, setUploadDialog] = useState(false)
const createMut = useMutation({
@@ -187,12 +186,32 @@ export function KnowledgePage() {
</Dialog>
<Dialog open={uploadDialog} onOpenChange={setUploadDialog} title="上传文件" footer={
<Button onClick={() => {
uploadKnowledgeFiles([{ name: '产品手册-2026Q3.pdf', type: 'pdf' }, { name: '报价政策.docx', type: 'docx' }])
.then(() => { toast.success('文件已开始解析,约3—5秒完成'); queryClient.invalidateQueries({ queryKey: ['knowledge'] }); setUploadDialog(false) })
}}>上传</Button>
<Button disabled={!uploadFiles.length} onClick={async () => {
const payload = await Promise.all(uploadFiles.map(async (file) => ({
name: file.name,
type: file.type,
base64: await new Promise<string>((resolve, reject) => {
const reader = new FileReader()
reader.onerror = () => reject(reader.error)
reader.onload = () => resolve(String(reader.result).split(',')[1] || '')
reader.readAsDataURL(file)
}),
})))
await uploadKnowledgeFiles(payload)
toast.success(`${payload.length} 个知识文件解析完成`)
queryClient.invalidateQueries({ queryKey: ['knowledge'] })
setUploadFiles([])
setUploadDialog(false)
}}>上传并解析</Button>
}>
<p className="text-sm text-muted-foreground">支持 Word/PDF/TXT/Excel/图片,AI 将自动解析为可引用的知识条目。</p>
<input
type="file"
multiple
accept=".pdf,.docx,.txt,.md,.csv,.json,.html"
onChange={(e) => setUploadFiles(Array.from(e.target.files || []))}
className="block w-full rounded-md border border-input p-2 text-sm"
/>
<p className="mt-2 text-sm text-muted-foreground">支持 PDF、DOCX、TXT、Markdown、CSV、JSON 和 HTML,文件内容由服务端真实解析并写入知识库。</p>
</Dialog>
</div>
)