From cd3c875106eb3db0deeaaf68adaf5f7577f74a5b Mon Sep 17 00:00:00 2001 From: Nelson <1475262689@qq.com> Date: Mon, 3 Aug 2026 18:57:19 +0800 Subject: [PATCH] feat: isolate external application conversations --- .../src/components/RecordAuditView.vue | 31 ++++- .../src/components/SsoIntegrationView.vue | 66 ++++++++++- .../src/components/UserManagementView.vue | 6 + .../apps/admin-web/src/services/api.ts | 4 +- .../apps/admin-web/src/types/api.ts | 10 ++ .../0030_sso_auto_register_chat_source.py | 56 +++++++++ .../apps/backend/app/api/admin_records.py | 54 +++++++-- .../apps/backend/app/api/admin_sso.py | 28 ++++- .../apps/backend/app/api/admin_users.py | 2 + .../apps/backend/app/api/chat.py | 108 +++++++++++------- .../apps/backend/app/core/auth_context.py | 21 ++++ .../apps/backend/app/core/dependencies.py | 26 ++++- .../apps/backend/app/core/security.py | 12 +- .../apps/backend/app/models/chat.py | 19 ++- .../apps/backend/app/models/sso.py | 2 + .../apps/backend/app/models/user.py | 7 +- .../apps/backend/app/schemas/sso.py | 19 ++- .../apps/backend/app/services/auth_service.py | 6 +- .../apps/backend/app/services/chat_service.py | 101 +++++++++++++--- .../app/services/chat_stream_service.py | 14 ++- .../backend/app/services/help_card_service.py | 55 ++++++++- .../app/services/share_draft_service.py | 55 ++++++++- .../apps/backend/app/services/sso_service.py | 68 ++++++++++- .../tests/test_chat_source_isolation.py | 106 +++++++++++++++++ .../apps/backend/tests/test_sso_service.py | 58 ++++++++++ .../docs/应用免登录接入说明.md | 19 ++- 26 files changed, 843 insertions(+), 110 deletions(-) create mode 100644 ai_knowledge_base_v2/apps/backend/alembic/versions/0030_sso_auto_register_chat_source.py create mode 100644 ai_knowledge_base_v2/apps/backend/app/core/auth_context.py create mode 100644 ai_knowledge_base_v2/apps/backend/tests/test_chat_source_isolation.py diff --git a/ai_knowledge_base_v2/apps/admin-web/src/components/RecordAuditView.vue b/ai_knowledge_base_v2/apps/admin-web/src/components/RecordAuditView.vue index 693ad63..97fb0c5 100644 --- a/ai_knowledge_base_v2/apps/admin-web/src/components/RecordAuditView.vue +++ b/ai_knowledge_base_v2/apps/admin-web/src/components/RecordAuditView.vue @@ -6,6 +6,7 @@ import type { AiLogRecord, ChatRecord, QuestionInsightSummary, + SsoClientItem, } from "../types/api"; import AdminPagination from "./AdminPagination.vue"; import AiLogDetailDrawer from "./AiLogDetailDrawer.vue"; @@ -15,6 +16,7 @@ type RecordTab = "chats" | "questionInsights" | "aiLogs" | "operationLogs"; const loading = ref(false); const activeTab = ref("chats"); const chats = ref([]); +const ssoClients = ref([]); const aiLogs = ref([]); const operationLogs = ref[]>([]); const insights = ref(null); @@ -32,6 +34,8 @@ const chatFilters = reactive({ keyword: "", userId: undefined as number | undefined, status: "", + sourceType: "", + sourceClientId: undefined as number | undefined, dateFrom: "", dateTo: "", }); @@ -42,7 +46,9 @@ const insightFilters = reactive({ maxMessages: 5000, }); -onMounted(() => loadTab("chats")); +onMounted(async () => { + await Promise.all([loadTab("chats"), loadSsoClients()]); +}); watch(activeTab, (tab) => loadTab(tab)); async function loadTab(tab: RecordTab = activeTab.value) { @@ -91,6 +97,13 @@ async function loadTab(tab: RecordTab = activeTab.value) { loading.value = false; } } +async function loadSsoClients() { + try { + ssoClients.value = await api.ssoClients(); + } catch { + ssoClients.value = []; + } +} async function changePage(tab: RecordTab, page: number, pageSize: number) { Object.assign(pagers[tab], { page, pageSize }); @@ -123,6 +136,8 @@ async function resetChatFilters() { keyword: "", userId: undefined, status: "", + sourceType: "", + sourceClientId: undefined, dateFrom: "", dateTo: "", }); @@ -173,6 +188,8 @@ function buildChatQuery() { keyword: chatFilters.keyword, userId: chatFilters.userId, status: chatFilters.status, + sourceType: chatFilters.sourceType, + sourceClientId: chatFilters.sourceClientId, dateFrom: formatDateTime(chatFilters.dateFrom, "start"), dateTo: formatDateTime(chatFilters.dateTo, "end"), }; @@ -220,6 +237,13 @@ function formatMoney(value?: number | null, currency = "CNY") { label="已停止" value="STOPPED" /> + + + + + + +