Преглед изворни кода

优化AISearch模块,移除未使用的代码,调整数据获取逻辑

张涛 пре 1 година
родитељ
комит
820c99adbb
4 измењених фајлова са 51 додато и 66 уклоњено
  1. 0 2
      src/apis/AISearch.js
  2. 16 24
      src/modules/AISearch/Sidebar.vue
  3. 8 2
      src/modules/AISearch/hooks.js
  4. 27 38
      src/modules/AISearch/index.vue

+ 0 - 2
src/apis/AISearch.js

@@ -1,7 +1,5 @@
 import request from '../base/ajax';
 
-export const conversationAskPath = '/v1/conversation/ask';
-
 export function retrievalTest(data) {
   return request({
     url: `/rgflow/v1/chunk/retrieval_test`,

+ 16 - 24
src/modules/AISearch/Sidebar.vue

@@ -20,37 +20,29 @@
 </template>
 
 <script setup>
-import { ref, onMounted, defineEmits } from 'vue';
-import { QueryAllKnowledgeList } from '../../apis/permission/common';
+import { ref, defineEmits, defineProps, watch } from 'vue';
 
 const loading = ref(false);
-const modelList = ref([]);
 const checkedList = ref([]);
 const selectedKeys = ref([]);
-const emit = defineEmits(['updateCheckedList', 'initSelectedKeys']);
-
-const fetchModelList = async () => {
-  loading.value = true;
-  try {
-    const {
-      data: { rows }
-    } = await QueryAllKnowledgeList();
-    modelList.value = rows;
-    checkedList.value = rows.map((item) => item.id); // 默认全选
-    // TODO: 选中的树ID
-    // emit('initSelectedKeys', checkedList.value); // 初始化时抛出所有的树ID
-    emit('initSelectedKeys', ['da47dcbaea9711ef94400242ac120006']); // 初始化时抛出所有的树ID
-  } catch (error) {
-    console.error(error);
-  } finally {
-    loading.value = false;
+const emit = defineEmits(['updateCheckedList']);
+const props = defineProps({
+  modelList: {
+    type: Array,
+    default: () => []
   }
-};
-
-onMounted(() => {
-  fetchModelList();
 });
 
+watch(
+  () => props.modelList,
+  (newModelList) => {
+    // HACK
+    checkedList.value = ['da47dcbaea9711ef94400242ac120006'];
+    // checkedList.value = newModelList.map((item) => item.id);
+  },
+  { immediate: true }
+);
+
 const onCheck = (checkedKeys) => {
   checkedList.value = checkedKeys;
   emit('updateCheckedList', checkedKeys);

+ 8 - 2
src/modules/AISearch/hooks.js

@@ -4,6 +4,7 @@ import { kuky_Authorization } from '../../base/storage';
 import { relatedQuestions, retrievalTest, queryMindmap } from '../../apis/AISearch';
 import { Message } from '../../3rd-libs/arco-vue-libs';
 import { useRoute } from 'vue-router';
+import { getConfigField } from '../../config/index';
 
 export function useTestChunkRetrieval() {
   const data = ref({ chunks: [], documents: [], total: 0 });
@@ -66,7 +67,7 @@ export function useFetchRelatedQuestions() {
   };
 }
 
-export function useSendMessageWithSse(url) {
+export function useSendMessageWithSse() {
   const answer = ref({});
   const done = ref(true);
   const timer = ref(null);
@@ -85,7 +86,12 @@ export function useSendMessageWithSse(url) {
     try {
       done.value = false;
       const token = kuky_Authorization.get();
-      const response = await fetch('http://smartai.com:8294/v1/conversation/ask', {
+
+      // 动态获取基础 URL,根据环境变量决定使用哪个 URL
+      const baseUrl = import.meta.env.MODE === 'production' ? getConfigField('RGFLOW_BASE_URL') : '/rgflow';
+      const requestUrl = `${baseUrl}/v1/conversation/ask`;
+
+      const response = await fetch(requestUrl, {
         method: 'POST',
         headers: {
           Authorization: `Bearer ${token}`,

+ 27 - 38
src/modules/AISearch/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="ai-search-container">
-    <Sidebar @updateCheckedList="handleUpdateCheckedList" @initSelectedKeys="initSidebar" />
+    <Sidebar :modelList="modelList" @updateCheckedList="handleUpdateCheckedList" />
     <div class="content-box" :class="{ 'search-active': searchActive }">
       <a-input-search
         class="input-search"
@@ -30,7 +30,6 @@
             @pageChange="handlePageChange"
             @pageSizeChange="handlePageSizeChange"
           />
-
           <a-divider />
           <a-card v-if="relatedQuestionsData?.length > 0" title="相关问题">
             <a-space wrap>
@@ -66,8 +65,7 @@ import MarkdownContent from './MarkdownContent.vue';
 import MindMapping from './MindMapping.vue';
 import ChunkList from './ChunkList.vue';
 import { IconAttachment } from '@arco-design/web-vue/es/icon';
-import { conversationAskPath } from '../../apis/AISearch';
-import { queryKbList } from '../../apis/rgflow-dify';
+import { QueryAllKnowledgeList } from '../../apis/permission/common';
 import { useSendMessageWithSse, useTestChunkRetrieval, useFetchRelatedQuestions, useQueryMindmap } from './hooks';
 import { isEmpty, trim } from 'lodash';
 import { Message } from '../../3rd-libs/arco-vue-libs';
@@ -77,8 +75,6 @@ const searchActive = ref(false);
 const drawerVisible = ref(false);
 const drawerWidth = ref(1000);
 const drawerTitle = ref('思维导图');
-const checkedList = ref([]);
-const checkedWithoutEmbeddingIdList = ref(['da47dcbaea9711ef94400242ac120006']);
 const sendingLoading = ref(false);
 const isFirstRender = ref(true);
 const selectedDocumentIds = ref([]);
@@ -87,21 +83,24 @@ const pagination = reactive({
   pageSize: 10
 });
 const chunkListLoading = ref(false);
-
-const queryKnowledgeList = async () => {
-  const knowledgeList = ref([]);
-  const {
-    data: { kbs }
-  } = await queryKbList();
-  if (kbs) {
-    knowledgeList.value = kbs;
-    // checkedWithoutEmbeddingIdList.value = checkedList.value.filter((x) => knowledgeList.value.some((y) => y.id === x));
+const modelList = ref([]);
+const selectedKnowledgeBaseIds = ref([]);
+
+const fetchInitialData = async () => {
+  try {
+    const {
+      data: { rows }
+    } = await QueryAllKnowledgeList();
+    modelList.value = rows;
+    selectedKnowledgeBaseIds.value = rows.map((row) => row.id);
+  } catch (error) {
+    console.error(error);
   }
 };
 
-onMounted(queryKnowledgeList);
+onMounted(fetchInitialData);
 
-const { send, answer, done } = useSendMessageWithSse(conversationAskPath);
+const { send, answer, done } = useSendMessageWithSse();
 const { chunksData, testChunk } = useTestChunkRetrieval();
 const { fetchRelatedQuestions, data: relatedQuestionsData } = useFetchRelatedQuestions();
 const { data: mindmapData, loading: mindmapLoading, fetchMindmap } = useQueryMindmap();
@@ -110,11 +109,15 @@ const sendQuestion = async (question) => {
   const q = trim(question);
   if (isEmpty(q)) return;
 
+  chunksData.value = { documents: [], chunks: [] };
+  selectedDocumentIds.value = [];
+  relatedQuestionsData.value = [];
+
   isFirstRender.value = false;
   sendingLoading.value = true;
-  send({ kb_ids: checkedWithoutEmbeddingIdList.value, question: q });
+  send({ kb_ids: selectedKnowledgeBaseIds.value, question: q });
   testChunk({
-    kb_id: checkedWithoutEmbeddingIdList.value,
+    kb_id: selectedKnowledgeBaseIds.value,
     highlight: true,
     question: q,
     page: 1,
@@ -136,7 +139,7 @@ const handleTestChunk = async (documentIds, page = 1, size = 10) => {
 
   chunkListLoading.value = true;
   await testChunk({
-    kb_id: checkedWithoutEmbeddingIdList.value,
+    kb_id: selectedKnowledgeBaseIds.value,
     highlight: true,
     question: q,
     doc_ids: documentIds ?? selectedDocumentIds.value,
@@ -159,19 +162,11 @@ const handleDocumentClick = (docId, item) => {
 const handleFloatingBtnClick = () => {
   drawerTitle.value = '思维导图';
   drawerVisible.value = true;
-
-  fetchMindmap({
-    question: searchQuery.value,
-    kb_ids: checkedWithoutEmbeddingIdList.value
-  });
+  fetchMindmap({ question: searchQuery.value, kb_ids: selectedKnowledgeBaseIds.value });
 };
 
 const handleUpdateCheckedList = (newCheckedList) => {
-  checkedList.value = newCheckedList;
-};
-
-const initSidebar = (initCheckedList) => {
-  checkedList.value = initCheckedList;
+  selectedKnowledgeBaseIds.value = newCheckedList;
 };
 
 const onSearch = (value) => {
@@ -180,11 +175,6 @@ const onSearch = (value) => {
     Message.warning('请输入想要搜索的内容');
     return;
   }
-  // 清空子组件数据
-  chunksData.value.documents = [];
-  chunksData.value.chunks = [];
-  selectedDocumentIds.value = [];
-  relatedQuestionsData.value = [];
 
   sendQuestion(trimmedValue);
   searchActive.value = true;
@@ -211,11 +201,10 @@ const handlePageSizeChange = (pageSize) => {
   width: 100%;
   padding: 16px;
   overflow-y: auto;
-  width: 100%;
   padding: 20px 15% 10px;
   transition: padding-top 0.3s ease;
-  line-height: 1.6; /* 调整行间距 */
-  letter-spacing: 0.5px; /* 调整字间距 */
+  line-height: 1.6;
+  letter-spacing: 0.5px;
 }
 
 .content-box.search-active {