You've already forked DataMate
- 在DatasetApplicationService中实现getSimilarDatasets方法,支持基于标签匹配的相似数据集推荐 - 新增normalizeSimilarLimit、normalizeTagNames、countSharedTags等辅助方法用于相似度计算 - 在DatasetRepository接口及其实现类中添加findSimilarByTags方法,支持数据库层面的标签匹配查询 - 在DatasetController中暴露/similar REST API端点,支持按需获取相似数据集 - 在前端Overview组件中展示相似数据集表格,包含名称、标签、类型、文件数和更新时间等信息 - 在DatasetDetail页面集成相似数据集获取逻辑,限制默认返回数量为4条 - 移除KnowledgeItem中的冗余title字段,统一使用其他标识信息 - 优化知识管理相关组件中的标题显示逻辑,移除硬编码标题值
161 lines
4.4 KiB
TypeScript
161 lines
4.4 KiB
TypeScript
import React from "react";
|
|
import {
|
|
CheckCircleOutlined,
|
|
ClockCircleOutlined,
|
|
CloseCircleOutlined,
|
|
FolderOpenOutlined,
|
|
} from "@ant-design/icons";
|
|
import { BookOpen } from "lucide-react";
|
|
import { formatDateTime } from "@/utils/unit";
|
|
import {
|
|
KnowledgeContentType,
|
|
KnowledgeItem,
|
|
KnowledgeSet,
|
|
KnowledgeSourceType,
|
|
KnowledgeStatusType,
|
|
} from "./knowledge-management.model";
|
|
|
|
export type KnowledgeStatusMeta = {
|
|
label: string;
|
|
value: KnowledgeStatusType;
|
|
color: string;
|
|
icon: React.ReactNode;
|
|
};
|
|
|
|
export const knowledgeStatusMap: Record<KnowledgeStatusType, KnowledgeStatusMeta> = {
|
|
[KnowledgeStatusType.DRAFT]: {
|
|
label: "草稿",
|
|
value: KnowledgeStatusType.DRAFT,
|
|
color: "#a1a1a1",
|
|
icon: <ClockCircleOutlined />,
|
|
},
|
|
[KnowledgeStatusType.PUBLISHED]: {
|
|
label: "已发布",
|
|
value: KnowledgeStatusType.PUBLISHED,
|
|
color: "#409f17",
|
|
icon: <CheckCircleOutlined />,
|
|
},
|
|
[KnowledgeStatusType.ARCHIVED]: {
|
|
label: "已归档",
|
|
value: KnowledgeStatusType.ARCHIVED,
|
|
color: "#6b7280",
|
|
icon: <FolderOpenOutlined />,
|
|
},
|
|
[KnowledgeStatusType.DEPRECATED]: {
|
|
label: "已废弃",
|
|
value: KnowledgeStatusType.DEPRECATED,
|
|
color: "#d97706",
|
|
icon: <CloseCircleOutlined />,
|
|
},
|
|
};
|
|
|
|
export const knowledgeStatusOptions = Object.values(knowledgeStatusMap).map((item) => ({
|
|
label: item.label,
|
|
value: item.value,
|
|
}));
|
|
|
|
export const knowledgeContentTypeOptions = [
|
|
{ label: "文本", value: KnowledgeContentType.TEXT },
|
|
{ label: "Markdown", value: KnowledgeContentType.MARKDOWN },
|
|
{ label: "文件", value: KnowledgeContentType.FILE },
|
|
];
|
|
|
|
export const knowledgeSourceTypeOptions = [
|
|
{ label: "手工录入", value: KnowledgeSourceType.MANUAL },
|
|
{ label: "数据集文件导入", value: KnowledgeSourceType.DATASET_FILE },
|
|
{ label: "文件上传", value: KnowledgeSourceType.FILE_UPLOAD },
|
|
];
|
|
|
|
export type KnowledgeSetView = {
|
|
id: string;
|
|
name: string;
|
|
description?: string;
|
|
status: KnowledgeStatusMeta | null;
|
|
rawStatus: KnowledgeStatusType;
|
|
tags: KnowledgeSet["tags"];
|
|
domain?: string;
|
|
businessLine?: string;
|
|
owner?: string;
|
|
validFrom?: string;
|
|
validTo?: string;
|
|
sourceType?: KnowledgeSet["sourceType"];
|
|
sensitivity?: string;
|
|
metadata?: string;
|
|
createdAt?: string;
|
|
updatedAt?: string;
|
|
type: string;
|
|
icon?: React.ReactNode;
|
|
iconColor?: string;
|
|
statistics?: { label: string; value: string | number }[];
|
|
};
|
|
|
|
export type KnowledgeItemView = {
|
|
id: string;
|
|
setId: string;
|
|
content: string;
|
|
contentType: KnowledgeContentType;
|
|
status: KnowledgeStatusMeta | null;
|
|
rawStatus: KnowledgeStatusType;
|
|
tags: KnowledgeItem["tags"];
|
|
domain?: string;
|
|
businessLine?: string;
|
|
owner?: string;
|
|
validFrom?: string;
|
|
validTo?: string;
|
|
sourceType?: KnowledgeItem["sourceType"];
|
|
sensitivity?: string;
|
|
sourceDatasetId?: string;
|
|
sourceFileId?: string;
|
|
metadata?: string;
|
|
createdAt?: string;
|
|
updatedAt?: string;
|
|
};
|
|
|
|
export function mapKnowledgeSet(data: KnowledgeSet): KnowledgeSetView {
|
|
return {
|
|
id: data.id,
|
|
name: data.name,
|
|
description: data.description,
|
|
status: knowledgeStatusMap[data.status] ?? null,
|
|
rawStatus: data.status,
|
|
tags: data.tags || [],
|
|
domain: data.domain,
|
|
businessLine: data.businessLine,
|
|
owner: data.owner,
|
|
validFrom: data.validFrom,
|
|
validTo: data.validTo,
|
|
sourceType: data.sourceType,
|
|
sensitivity: data.sensitivity,
|
|
metadata: data.metadata,
|
|
createdAt: data.createdAt ? formatDateTime(data.createdAt) : "",
|
|
updatedAt: data.updatedAt ? formatDateTime(data.updatedAt) : "",
|
|
type: "知识集",
|
|
icon: <BookOpen className="w-6 h-6" />,
|
|
iconColor: "#3b82f6",
|
|
};
|
|
}
|
|
|
|
export function mapKnowledgeItem(data: KnowledgeItem): KnowledgeItemView {
|
|
return {
|
|
id: data.id,
|
|
setId: data.setId,
|
|
content: data.content,
|
|
contentType: data.contentType,
|
|
status: knowledgeStatusMap[data.status] ?? null,
|
|
rawStatus: data.status,
|
|
tags: data.tags || [],
|
|
domain: data.domain,
|
|
businessLine: data.businessLine,
|
|
owner: data.owner,
|
|
validFrom: data.validFrom,
|
|
validTo: data.validTo,
|
|
sourceType: data.sourceType,
|
|
sensitivity: data.sensitivity,
|
|
sourceDatasetId: data.sourceDatasetId,
|
|
sourceFileId: data.sourceFileId,
|
|
metadata: data.metadata,
|
|
createdAt: data.createdAt ? formatDateTime(data.createdAt) : "",
|
|
updatedAt: data.updatedAt ? formatDateTime(data.updatedAt) : "",
|
|
};
|
|
}
|