fix:前端修改洋洋在信我最后一次

This commit is contained in:
2026-09-15 16:08:44 +08:00
parent 433cc22667
commit f542a51776
5 changed files with 948 additions and 187 deletions
+47 -6
View File
@@ -22,7 +22,16 @@ import {
Select,
} from "@/components/admin/ui";
import { adminApi, errMessage } from "@/lib/admin-api";
import { buildKnowledgeForm, knowledgeApi, type KnowledgeDocument, type UploadPreview } from "@/lib/knowledge-api";
import {
buildKnowledgeForm,
collectionLabel,
DEFAULT_KNOWLEDGE_COLLECTION,
KNOWLEDGE_COLLECTIONS,
knowledgeApi,
knowledgeErrorHint,
type KnowledgeDocument,
type UploadPreview,
} from "@/lib/knowledge-api";
import { isAdmin } from "@/lib/roles";
/** 切分策略,与后端 KnowledgeUploadService 支持的策略保持一致。 */
@@ -38,6 +47,7 @@ export default function KnowledgePage() {
const [file, setFile] = useState<File | null>(null);
const [title, setTitle] = useState("");
const [collection, setCollection] = useState<string>(DEFAULT_KNOWLEDGE_COLLECTION);
const [strategy, setStrategy] = useState("default");
const [chunkSize, setChunkSize] = useState("");
const [chunkOverlap, setChunkOverlap] = useState("");
@@ -96,6 +106,7 @@ export default function KnowledgePage() {
try {
const result = await knowledgeApi.preview(
buildKnowledgeForm(file, {
collection_name: collection,
strategy,
chunk_size: chunkSize ? Number(chunkSize) : null,
chunk_overlap: chunkOverlap ? Number(chunkOverlap) : null,
@@ -104,7 +115,7 @@ export default function KnowledgePage() {
setPreview(result);
if (!title) setTitle(file.name);
} catch (err) {
setError(errMessage(err, "预览失败,请检查文件格式"));
setError(knowledgeErrorHint(errMessage(err, "预览失败,请检查文件格式")));
} finally {
setUploading(false);
}
@@ -112,6 +123,11 @@ export default function KnowledgePage() {
const runConfirm = async () => {
if (!file || uploading) return;
// 集合是后端白名单校验的必填项,缺了会直接 400「知识库集合不在允许范围内」
if (!collection) {
setError("请先选择知识库集合");
return;
}
setUploading(true);
setError(null);
setNotice(null);
@@ -120,16 +136,17 @@ export default function KnowledgePage() {
buildKnowledgeForm(file, {
title: title || file.name,
doc_id: preview?.doc_id ? String(preview.doc_id) : undefined,
collection_name: collection,
strategy,
chunk_size: chunkSize ? Number(chunkSize) : null,
chunk_overlap: chunkOverlap ? Number(chunkOverlap) : null,
})
);
setNotice(`《${title || file.name}》已入库`);
setNotice(`《${title || file.name}》已入库到「${collectionLabel(collection)}」`);
resetUpload();
await load();
} catch (err) {
setError(errMessage(err, "入库失败,请稍后重试"));
setError(knowledgeErrorHint(errMessage(err, "入库失败,请稍后重试")));
} finally {
setUploading(false);
}
@@ -211,7 +228,7 @@ export default function KnowledgePage() {
</span>
</div>
<div className="grid gap-3 sm:grid-cols-3">
<div className="grid gap-3 sm:grid-cols-2 xl:grid-cols-4">
<label className="space-y-1.5">
<span className="text-xs text-slate-500">标题</span>
<TextInput
@@ -220,6 +237,25 @@ export default function KnowledgePage() {
placeholder="用于检索展示的标题"
/>
</label>
<label className="space-y-1.5">
<span className="text-xs text-slate-500">
知识库集合 <span className="text-rose-500">*</span>
</span>
<Select
value={collection}
onChange={(event) => setCollection(event.target.value)}
>
{KNOWLEDGE_COLLECTIONS.map((item) => (
<option key={item.value} value={item.value}>
{item.label}({item.value})
</option>
))}
</Select>
<span className="block text-[11px] leading-4 text-slate-400">
{KNOWLEDGE_COLLECTIONS.find((item) => item.value === collection)
?.description ?? "决定文档写入哪个向量集合,入库后不可修改"}
</span>
</label>
<label className="space-y-1.5">
<span className="text-xs text-slate-500">切分策略</span>
<Select
@@ -284,6 +320,7 @@ export default function KnowledgePage() {
{preview && (
<div className="rounded-lg border border-slate-200 bg-slate-50 p-4">
<div className="mb-2 flex flex-wrap items-center gap-2 text-xs text-slate-500">
<Badge tone="info">{collectionLabel(collection)}</Badge>
<Badge tone="info">{preview.strategy || strategy}</Badge>
{preview.chunk_size != null && <span>分片 {preview.chunk_size}</span>}
{preview.chunk_overlap != null && <span>重叠 {preview.chunk_overlap}</span>}
@@ -338,7 +375,11 @@ export default function KnowledgePage() {
{item.title ?? item.filename ?? docId}
</p>
<p className="mt-0.5 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-slate-400">
{item.collection_name && <span>{item.collection_name}</span>}
{item.collection_name && (
<span className="rounded bg-slate-100 px-1.5 py-0.5 text-slate-500">
{collectionLabel(item.collection_name)}
</span>
)}
{item.chunk_count != null && <span>{item.chunk_count} 段</span>}
{item.create_time && <span>{item.create_time}</span>}
<span className="font-mono">{docId}</span>