From 1c469f36b0fc59e8e56ca36933718f326a1898c5 Mon Sep 17 00:00:00 2001 From: tanlianwang Date: Mon, 30 Mar 2026 10:48:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(knowledge):=20=E6=B7=BB=E5=8A=A0=E7=9F=A5?= =?UTF-8?q?=E8=AF=86=E5=BA=93=E5=88=9B=E5=BB=BA=E8=80=85=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=92=8C=E6=97=B6=E9=97=B4=E4=BF=A1=E6=81=AF=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在多语言文件中添加更新时间、基本信息和未知状态的翻译 - 在知识库序列化器中添加用户ID和创建用户字段支持 - 在知识库设置页面添加创建者选择器和时间信息展示卡片 - 实现创建者信息的前后端数据同步和页面更新逻辑 - 添加用户列表获取功能以支持创建者选择 - 优化样式以适配新的创建者信息展示布局 --- apps/knowledge/serializers/knowledge.py | 6 + ui/src/locales/lang/en-US/common.ts | 3 + ui/src/locales/lang/zh-CN/common.ts | 3 + ui/src/locales/lang/zh-Hant/common.ts | 3 + ui/src/views/knowledge/KnowledgeSetting.vue | 115 +++++++++++++++++++- 5 files changed, 126 insertions(+), 4 deletions(-) diff --git a/apps/knowledge/serializers/knowledge.py b/apps/knowledge/serializers/knowledge.py index 9daeb7dad..8a80cfa25 100644 --- a/apps/knowledge/serializers/knowledge.py +++ b/apps/knowledge/serializers/knowledge.py @@ -80,6 +80,8 @@ class KnowledgeEditRequest(serializers.Serializer): ) file_size_limit = serializers.IntegerField(required=False, label=_('file size limit')) file_count_limit = serializers.IntegerField(required=False, label=_('file count limit')) + user_id = serializers.UUIDField(required=False, label=_('user id')) + create_user = serializers.UUIDField(required=False, label=_('create user')) @staticmethod def get_knowledge_meta_valid_map(): @@ -381,6 +383,10 @@ class KnowledgeSerializer(serializers.Serializer): knowledge.file_size_limit = instance.get('file_size_limit') if 'file_count_limit' in instance: knowledge.file_count_limit = instance.get('file_count_limit') + if 'user_id' in instance: + knowledge.user_id = instance.get('user_id') + if 'create_user' in instance: + knowledge.create_user = instance.get('create_user') if 'application_id_list' in instance and instance.get('application_id_list') is not None: application_id_list = instance.get('application_id_list') # 当前用户可修改关联的知识库列表 diff --git a/ui/src/locales/lang/en-US/common.ts b/ui/src/locales/lang/en-US/common.ts index c58e5ddc9..f19983118 100644 --- a/ui/src/locales/lang/en-US/common.ts +++ b/ui/src/locales/lang/en-US/common.ts @@ -31,6 +31,7 @@ export default { upgrade: 'Upgrade', createDate: 'Create Date', createTime: 'Create Time', + updateTime: 'Update Time', operation: 'Action', character: 'characters', export: 'Export', @@ -96,6 +97,8 @@ export default { uploadImagePrompt: 'Please upload an image', }, info: 'Base Information', + basicInfo: 'Basic Information', + unknown: 'Unknown', otherSetting: 'Other Settings', username: 'username', importCreate: 'Import Create', diff --git a/ui/src/locales/lang/zh-CN/common.ts b/ui/src/locales/lang/zh-CN/common.ts index f0dc6a198..5810f36e0 100644 --- a/ui/src/locales/lang/zh-CN/common.ts +++ b/ui/src/locales/lang/zh-CN/common.ts @@ -32,6 +32,7 @@ export default { upgrade: '升级', createDate: '创建日期', createTime: '创建时间', + updateTime: '更新时间', operation: '操作', character: '字符', export: '导出', @@ -97,6 +98,8 @@ export default { uploadImagePrompt: '请上传一张图片', }, info: '基本信息', + basicInfo: '基本信息', + unknown: '未知', otherSetting: '其他设置', username: '用户名', importCreate: '导入创建', diff --git a/ui/src/locales/lang/zh-Hant/common.ts b/ui/src/locales/lang/zh-Hant/common.ts index 367cac9d9..9493a0891 100644 --- a/ui/src/locales/lang/zh-Hant/common.ts +++ b/ui/src/locales/lang/zh-Hant/common.ts @@ -31,6 +31,7 @@ export default { upgrade: '升級', createDate: '創建日期', createTime: '創建時間', + updateTime: '更新時間', operation: '操作', character: '字符', export: '匯出', @@ -96,6 +97,8 @@ export default { uploadImagePrompt: '請上傳一張圖片', }, info: '使用者資訊', + basicInfo: '基本資訊', + unknown: '未知', otherSetting: '其他設定', username: '用戶名', importCreate: '導入創建', diff --git a/ui/src/views/knowledge/KnowledgeSetting.vue b/ui/src/views/knowledge/KnowledgeSetting.vue index 6912d4498..a1804e96c 100644 --- a/ui/src/views/knowledge/KnowledgeSetting.vue +++ b/ui/src/views/knowledge/KnowledgeSetting.vue @@ -9,6 +9,22 @@ {{ $t('common.info') }} + + + + + + + {{ detail?.nick_name ? i18n_name(detail.nick_name) : detail?.create_user || $t('common.unknown') }} + + + {{ detail?.create_time ? new Date(detail.create_time).toLocaleString() : $t('common.unknown') }} + + + {{ detail?.update_time ? new Date(detail.update_time).toLocaleString() : $t('common.unknown') }} + + + { const webFormRef = ref() const BaseFormRef = ref() const loading = ref(false) -const detail = ref({}) +const detail = ref({ }) const cloneModelId = ref('') +const user_options = ref([]) +const selectedCreator = ref('') const form = ref({ source_url: '', @@ -269,11 +290,15 @@ async function submit() { meta: form.value, file_count_limit: form.value.file_count_limit, file_size_limit: form.value.file_size_limit, + create_user: selectedCreator.value, + user_id: selectedCreator.value, ...BaseFormRef.value.form, } : { file_count_limit: form.value.file_count_limit, file_size_limit: form.value.file_size_limit, + create_user: selectedCreator.value, + user_id: selectedCreator.value, ...BaseFormRef.value.form, } @@ -290,6 +315,13 @@ async function submit() { .putReEmbeddingKnowledge(id) .then(() => { MsgSuccess(t('common.saveSuccess')) + // 更新页面上显示的创建者信息 + const selectedUser = user_options.value.find(user => user.id === selectedCreator.value) + if (selectedUser) { + detail.value.create_user = selectedUser.id + detail.value.user_id = selectedUser.id + detail.value.nick_name = selectedUser.nick_name + } }) }) } else { @@ -300,6 +332,13 @@ async function submit() { .putReEmbeddingKnowledge(id) .then(() => { MsgSuccess(t('common.saveSuccess')) + // 更新页面上显示的创建者信息 + const selectedUser = user_options.value.find(user => user.id === selectedCreator.value) + if (selectedUser) { + detail.value.create_user = selectedUser.id + detail.value.user_id = selectedUser.id + detail.value.nick_name = selectedUser.nick_name + } }) }) } @@ -312,13 +351,25 @@ async function submit() { .putLarkKnowledge(id, obj, loading) .then(() => { MsgSuccess(t('common.saveSuccess')) + // 更新页面上显示的创建者信息 + const selectedUser = user_options.value.find(user => user.id === selectedCreator.value) + if (selectedUser) { + detail.value.create_user = selectedUser.id + detail.value.nick_name = selectedUser.nick_name + } }) } else { loadSharedApi({type: 'knowledge', systemType: apiType.value}) .putKnowledge(id, obj, loading) - .then(() => { - MsgSuccess(t('common.saveSuccess')) - }) + .then(() => { + MsgSuccess(t('common.saveSuccess')) + // 更新页面上显示的创建者信息 + const selectedUser = user_options.value.find(user => user.id === selectedCreator.value) + if (selectedUser) { + detail.value.create_user = selectedUser.id + detail.value.nick_name = selectedUser.nick_name + } + }) } } } @@ -332,6 +383,8 @@ function getDetail() { .then((res: any) => { detail.value = res.data cloneModelId.value = res.data?.embedding_model_id + // 优先使用user_id,如果不存在则使用create_user + selectedCreator.value = res.data?.user_id || res.data?.create_user || '' if (detail.value?.type === 0) { form.value.file_count_limit = res.data.file_count_limit form.value.file_size_limit = res.data.file_size_limit @@ -339,11 +392,34 @@ function getDetail() { if (detail.value?.type === 1 || detail.value?.type === 2) { form.value = res.data.meta } + // 如果有用户列表,尝试找到对应的用户信息来更新nick_name + if (user_options.value.length > 0 && selectedCreator.value) { + const selectedUser = user_options.value.find(user => user.id === selectedCreator.value) + if (selectedUser) { + detail.value.nick_name = selectedUser.nick_name + } + } + }) +} + +function getUserList() { + loadSharedApi({ type: 'workspace', isShared: isShared.value, systemType: apiType.value }) + .getAllMemberList(user.getWorkspaceId(), loading) + .then((res: any) => { + user_options.value = res.data + // 如果已经有selectedCreator的值,尝试找到对应的用户信息来更新nick_name + if (selectedCreator.value) { + const selectedUser = user_options.value.find(user => user.id === selectedCreator.value) + if (selectedUser) { + detail.value.nick_name = selectedUser.nick_name + } + } }) } onMounted(() => { getDetail() + getUserList() })