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

增加环境变量test的相关调整

lingmin_package@163.com пре 1 месец
родитељ
комит
52c77ee049

+ 7 - 0
.claude/settings.local.json

@@ -0,0 +1,7 @@
+{
+  "permissions": {
+    "allow": [
+      "Bash(npm run:*)"
+    ]
+  }
+}

+ 2 - 6
.env.test

@@ -2,15 +2,11 @@
 NODE_ENV=test
 
 # 应用配置
-VITE_APP_TITLE=管理平台 - 测试环境
+VITE_APP_TITLE=管理平台 - 开发环境
+VITE_API_BASE_URL=http://192.168.92.62
 VITE_APP_ENV=test
 VITE_APP_DEBUG=true
 
-# API 配置
-VITE_API_BASE_URL=http://test-api.example.com
-VITE_BACKEND_HOST=test-api.example.com
-VITE_BACKEND_PORT=80
-VITE_BACKEND_PROTOCOL=http
 
 # OAuth 配置
 VITE_OAUTH_CLIENT_ID=test_client_id_12345

+ 1 - 1
package.json

@@ -10,7 +10,7 @@
     "dev:prod": "vite --mode prod",
     "build": "vue-tsc && vite build",
     "build:dev-local": "vite build --mode dev-local",
-    "build:dev": "vite build --mode dev",
+    "build:dev": "vue-tsc && vite build --mode dev",
     "build:test": "vue-tsc && vite build --mode test",
     "build:prod": "vue-tsc && vite build --mode prod",
     "preview": "vite preview",

+ 1 - 1
src/api/document.ts

@@ -72,7 +72,7 @@ export interface DocumentQueryParams {
 }
 
 export interface ApiResponse<T = any> {
-  code: number
+  code: string | number
   message: string
   data: T
   timestamp: string

+ 1 - 1
src/api/image.ts

@@ -33,7 +33,7 @@ export interface ImageQueryParams {
 }
 
 export interface ApiResponse<T = any> {
-  code: number
+  code: string | number
   message: string
   data: T
   timestamp: string

+ 1 - 0
src/api/knowledge-base.ts

@@ -6,6 +6,7 @@ export interface KnowledgeBase {
   name: string
   collection_name_parent: string
   collection_name_children?: string
+  collection_name?: string
   description?: string
   status: string
   document_count: number

+ 1 - 0
src/api/snippet.ts

@@ -14,6 +14,7 @@ export interface Snippet {
   status: string
   created_at: string
   updated_at: string
+  tag_list?: string[] // 标签列表
 }
 
 export interface SnippetParams {

+ 2 - 2
src/api/tag.ts

@@ -57,14 +57,14 @@ export interface TagCategoryMoveRequest {
 
 // API响应类型
 export interface ApiResponse<T = any> {
-  code: number
+  code: string | number
   message: string
   data: T
   timestamp?: string
 }
 
 export interface PaginatedResponse<T = any> {
-  code: number
+  code: string | number
   message: string
   data: T[]
   meta: {

+ 1 - 1
src/components/MenuPermissionTree.vue

@@ -219,7 +219,7 @@ const buildMenuTree = (menuList: any[]) => {
       })
       
       // 递归排序子节点
-      node.children.forEach(child => sortChildren(child))
+      node.children.forEach((child: any) => sortChildren(child))
     }
   }
   

+ 1 - 1
src/layouts/MainLayout.vue

@@ -146,7 +146,7 @@ export interface MenuItem {
 }
 
 interface ApiResponse<T = any> {
-  code: number
+  code: string | number
   message: string
   data: T
   timestamp: string

+ 1 - 1
src/types/auth.ts

@@ -34,7 +34,7 @@ export interface TokenResponse {
 }
 
 export interface ApiResponse<T = any> {
-  code: number
+  code: string | number
   message: string
   data: T
   timestamp: string

+ 11 - 11
src/views/admin/Apps.vue

@@ -127,7 +127,7 @@
             <el-icon><Key /></el-icon>
             密钥
           </el-button>
-          <el-dropdown @command="(command) => handleAppAction(command, app)">
+          <el-dropdown @command="(command: string) => handleAppAction(command, app)">
             <el-button size="small">
               更多<el-icon><ArrowDown /></el-icon>
             </el-button>
@@ -634,14 +634,14 @@ onMounted(() => {
 const loadApps = async () => {
   loading.value = true
   try {
-    const params = {
+    const params: Record<string, any> = {
       page: currentPage.value,
       page_size: pageSize.value,
       keyword: searchForm.keyword || undefined,
       status: searchForm.status || undefined,
       trusted: searchForm.trusted || undefined
     }
-    
+
     // 移除空值参数
     Object.keys(params).forEach(key => {
       if (params[key] === undefined || params[key] === '') {
@@ -658,7 +658,7 @@ const loadApps = async () => {
       throw new Error(result.message || '获取应用列表失败')
     }
     
-  } catch (error) {
+  } catch (error: any) {
     console.error('加载应用列表失败:', error)
     ElMessage.error(`加载应用列表失败: ${error.message}`)
   } finally {
@@ -724,7 +724,7 @@ const showSecret = async (app: any) => {
     } else {
       throw new Error(result.message || '获取应用详情失败')
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('获取应用详情失败:', error)
     ElMessage.error(`获取应用详情失败: ${error.message}`)
   }
@@ -770,7 +770,7 @@ const toggleAppStatus = async (app: any) => {
       throw new Error(result.message || `${action}应用失败`)
     }
     
-  } catch (error) {
+  } catch (error: any) {
     if (error.name !== 'cancel') {
       console.error('切换应用状态失败:', error)
       ElMessage.error(`操作失败: ${error.message}`)
@@ -802,7 +802,7 @@ const resetAppSecret = async (app: any) => {
       throw new Error(result.message || '重置密钥失败')
     }
     
-  } catch (error) {
+  } catch (error: any) {
     if (error.name !== 'cancel') {
       console.error('重置密钥失败:', error)
       ElMessage.error(`重置失败: ${error.message}`)
@@ -839,7 +839,7 @@ const deleteApp = async (app: any) => {
       throw new Error(result.message || '删除应用失败')
     }
     
-  } catch (error) {
+  } catch (error: any) {
     if (error.name !== 'cancel') {
       console.error('删除应用失败:', error)
       ElMessage.error(`删除失败: ${error.message}`)
@@ -852,7 +852,7 @@ const copyToClipboard = async (text: string) => {
   try {
     await navigator.clipboard.writeText(text)
     ElMessage.success('已复制到剪贴板')
-  } catch (error) {
+  } catch (error: any) {
     ElMessage.error('复制失败')
   }
 }
@@ -953,7 +953,7 @@ const submitCreateForm = async () => {
       throw new Error(result.message || '创建应用失败')
     }
     
-  } catch (error) {
+  } catch (error: any) {
     console.error('创建应用失败:', error)
     ElMessage.error(`创建失败: ${error.message}`)
   } finally {
@@ -1004,7 +1004,7 @@ const submitEditForm = async () => {
       throw new Error(result.message || '更新应用失败')
     }
     
-  } catch (error) {
+  } catch (error: any) {
     console.error('更新应用失败:', error)
     ElMessage.error(`更新失败: ${error.message}`)
   } finally {

+ 8 - 8
src/views/admin/Dictionary.vue

@@ -398,7 +398,7 @@ const loadCategoryTree = async () => {
     } else {
       ElMessage.error(res.message || '加载字典类型树失败')
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('加载字典类型树失败:', error)
     ElMessage.error('加载字典类型树失败')
   } finally {
@@ -434,7 +434,7 @@ const loadItems = async () => {
     } else {
       ElMessage.error(res.message || '加载字典项列表失败')
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('加载字典项列表失败:', error)
     ElMessage.error('加载字典项列表失败')
   } finally {
@@ -535,7 +535,7 @@ const submitCategoryForm = async () => {
           ElMessage.error(res.message || '字典类型创建失败')
         }
       }
-    } catch (error) {
+    } catch (error: any) {
       console.error('提交字典类型失败:', error)
       ElMessage.error('操作失败')
     } finally {
@@ -577,7 +577,7 @@ const deleteCategory = async () => {
     } else {
       ElMessage.error(res.message || '字典类型删除失败')
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('删除字典类型失败:', error)
     ElMessage.error('删除失败')
   }
@@ -666,7 +666,7 @@ const submitItemForm = async () => {
           ElMessage.error(res.message || '字典项创建失败')
         }
       }
-    } catch (error) {
+    } catch (error: any) {
       console.error('提交字典项失败:', error)
       ElMessage.error('操作失败')
     } finally {
@@ -694,7 +694,7 @@ const deleteItem = (row: DictItem) => {
       } else {
         ElMessage.error(res.message || '字典项删除失败')
       }
-    } catch (error) {
+    } catch (error: any) {
       console.error('删除字典项失败:', error)
       ElMessage.error('删除失败')
     }
@@ -729,7 +729,7 @@ const batchDeleteItems = () => {
       } else {
         ElMessage.error(res.message || '批量删除失败')
       }
-    } catch (error) {
+    } catch (error: any) {
       console.error('批量删除字典项失败:', error)
       ElMessage.error('批量删除失败')
     }
@@ -749,7 +749,7 @@ const handleStatusChange = async (row: DictItem) => {
       // 恢复原状态
       row.enable_flag = row.enable_flag === '1' ? '0' : '1'
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('切换字典项状态失败:', error)
     ElMessage.error('状态更新失败')
     // 恢复原状态

+ 4 - 4
src/views/admin/Menus.vue

@@ -598,7 +598,7 @@ const loadMenus = async () => {
     } else {
       throw new Error(result.message)
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('加载菜单列表失败:', error)
     ElMessage.error('加载菜单列表失败')
   } finally {
@@ -677,7 +677,7 @@ const handleStatusChange = async (menu: any) => {
       is_active: menu.is_active
     })
     ElMessage.success('菜单状态更新成功')
-  } catch (error) {
+  } catch (error: any) {
     console.error('更新菜单状态失败:', error)
     ElMessage.error('更新菜单状态失败')
     // 恢复原状态
@@ -727,7 +727,7 @@ const deleteMenu = async (menu: any) => {
     await request.delete(`/api/v1/system/admin/menus/${menu.id}`)
     ElMessage.success('菜单删除成功')
     loadMenus()
-  } catch (error) {
+  } catch (error: any) {
     // 用户取消删除
   }
 }
@@ -771,7 +771,7 @@ const saveMenu = async () => {
     
     showCreateDialog.value = false
     loadMenus()
-  } catch (error) {
+  } catch (error: any) {
     console.error('保存菜单失败:', error)
     ElMessage.error('保存菜单失败')
   } finally {

+ 6 - 6
src/views/admin/Roles.vue

@@ -350,7 +350,7 @@ const loadRoles = async () => {
     } else {
       throw new Error(result.message)
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('加载角色列表失败:', error)
     ElMessage.error('加载角色列表失败')
   } finally {
@@ -388,7 +388,7 @@ const handleStatusChange = async (role: any) => {
       is_active: role.is_active
     })
     ElMessage.success('角色状态更新成功')
-  } catch (error) {
+  } catch (error: any) {
     console.error('更新角色状态失败:', error)
     ElMessage.error('更新角色状态失败')
     // 恢复原状态
@@ -442,7 +442,7 @@ const managePermissions = async (role: any) => {
     await loadRolePermissions(role.id)
     
     showPermissionDialog.value = true
-  } catch (error) {
+  } catch (error: any) {
     console.error('加载权限数据失败:', error)
     ElMessage.error('加载权限数据失败')
   }
@@ -462,7 +462,7 @@ const loadAllMenus = async () => {
     } else {
       throw new Error(result.message)
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('加载菜单列表失败:', error)
     throw error
   }
@@ -492,7 +492,7 @@ const loadRolePermissions = async (roleId: string) => {
       rolePermissions.value = []
       selectedPermissions.value = []
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('❌ 加载角色权限失败:', error)
     // 如果API不存在,使用空数组
     rolePermissions.value = []
@@ -574,7 +574,7 @@ const savePermissions = async () => {
     
     // 刷新角色列表
     loadRoles()
-  } catch (error) {
+  } catch (error: any) {
     console.error('保存权限失败:', error)
     ElMessage.error('保存权限失败')
   } finally {

+ 7 - 7
src/views/admin/Tag.vue

@@ -253,7 +253,7 @@ const loadCategoryTree = async (silent = false) => {
     const filtered = filterTreeByType(treeData, 'category')
     console.log('过滤后的分类树:', filtered)
     categoryTree.value = filtered
-  } catch (error) {
+  } catch (error: any) {
     console.error('加载分类树失败:', error)
     if (!silent) {
       ElMessage.error('加载分类树失败')
@@ -290,7 +290,7 @@ const loadTags = async (silent = false) => {
     console.log('过滤后的标签列表:', labelList)
     tags.value = labelList
     total.value = response.meta?.total || labelList.length
-  } catch (error) {
+  } catch (error: any) {
     console.error('加载标签列表失败:', error)
     if (!silent) {
       ElMessage.error('加载标签列表失败')
@@ -347,7 +347,7 @@ const handleStatusChange = async (tag: any) => {
 
     // 刷新列表以确保数据同步
     await loadTags(true)
-  } catch (error) {
+  } catch (error: any) {
     console.error('更新标签状态失败:', error)
     ElMessage.error('更新标签状态失败')
     // 恢复原状态
@@ -393,7 +393,7 @@ const deleteTag = async (tag: any) => {
     // 刷新分类树和标签列表
     await loadCategoryTree(true)
     await loadTags(true)
-  } catch (error) {
+  } catch (error: any) {
     if (error !== 'cancel') {
       console.error('删除标签失败:', error)
       ElMessage.error('删除标签失败')
@@ -434,7 +434,7 @@ const saveTag = async () => {
     // 刷新分类树和标签列表
     await loadCategoryTree(true)
     await loadTags(true)
-  } catch (error) {
+  } catch (error: any) {
     console.error('保存标签失败:', error)
     ElMessage.error('保存标签失败')
   } finally {
@@ -513,7 +513,7 @@ const openEditCategoryDialog = async () => {
     } else {
       ElMessage.error(response.message || '获取分类详情失败')
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('获取分类详情失败:', error)
     ElMessage.error('获取分类详情失败')
   }
@@ -549,7 +549,7 @@ const deleteCategoryConfirm = async () => {
 
     // 刷新分类树
     await loadCategoryTree(true)
-  } catch (error) {
+  } catch (error: any) {
     if (error !== 'cancel') {
       console.error('删除分类失败:', error)
       ElMessage.error('删除分类失败')

+ 1 - 1
src/views/admin/TaskManagement.vue

@@ -211,7 +211,7 @@ interface TaskItem {
 }
 
 interface ApiResponse<T = any> {
-  code: number
+  code: string | number
   message: string
   data: T
   timestamp: string

+ 7 - 7
src/views/admin/Users.vue

@@ -416,7 +416,7 @@ const loadUsers = async () => {
     } else {
       throw new Error(result.message)
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('加载用户列表失败:', error)
     ElMessage.error('加载用户列表失败')
   } finally {
@@ -432,7 +432,7 @@ const loadRoles = async () => {
     if (result.code === '000000' || result.code === 0) {
       allRoles.value = result.data
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('加载角色列表失败:', error)
   }
 }
@@ -467,7 +467,7 @@ const handleStatusChange = async (user: any) => {
       is_active: user.is_active
     })
     ElMessage.success('用户状态更新成功')
-  } catch (error) {
+  } catch (error: any) {
     console.error('更新用户状态失败:', error)
     ElMessage.error('更新用户状态失败')
     // 恢复原状态
@@ -500,7 +500,7 @@ const editUser = async (user: any) => {
     } else {
       throw new Error(result.message)
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('获取用户详情失败:', error)
     ElMessage.error('获取用户详情失败')
     // 如果获取详情失败,使用列表中的基本信息
@@ -566,7 +566,7 @@ const batchDelete = async () => {
     
     ElMessage.success('批量删除成功')
     loadUsers()
-  } catch (error) {
+  } catch (error: any) {
     if (error !== 'cancel') {
       ElMessage.error('批量删除失败')
     }
@@ -587,7 +587,7 @@ const assignRoles = async (user: any) => {
     } else {
       throw new Error(result.message)
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('获取用户角色失败:', error)
     ElMessage.error('获取用户角色失败')
     selectedRoleIds.value = []
@@ -662,7 +662,7 @@ const saveUserRoles = async () => {
     ElMessage.success('角色分配成功')
     showRoleDialog.value = false
     loadUsers()
-  } catch (error) {
+  } catch (error: any) {
     console.error('保存用户角色失败:', error)
     ElMessage.error('保存用户角色失败')
   } finally {

+ 9 - 9
src/views/apps/Index.vue

@@ -127,7 +127,7 @@
                 <el-icon><Key /></el-icon>
                 密钥
               </el-button>
-              <el-dropdown @command="(command) => handleAppAction(command, app)">
+              <el-dropdown @command="(command: string) => handleAppAction(command, app)">
                 <el-button size="small">
                   更多<el-icon><ArrowDown /></el-icon>
                 </el-button>
@@ -488,7 +488,7 @@ const loadApps = async () => {
   loading.value = true
   try {
     // 调用真实API
-    const params = {
+    const params: Record<string, any> = {
       page: currentPage.value,
       page_size: pageSize.value,
       keyword: searchForm.keyword || undefined,
@@ -516,7 +516,7 @@ const loadApps = async () => {
       throw new Error(result.message || '获取应用列表失败')
     }
     
-  } catch (error) {
+  } catch (error: any) {
     console.error('加载应用列表失败:', error)
     ElMessage.error(`加载应用列表失败: ${error.message}`)
   } finally {
@@ -582,7 +582,7 @@ const showSecret = async (app: any) => {
     } else {
       throw new Error(result.message || '获取应用详情失败')
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('获取应用详情失败:', error)
     ElMessage.error(`获取应用详情失败: ${error.message}`)
   }
@@ -628,7 +628,7 @@ const toggleAppStatus = async (app: any) => {
       throw new Error(result.message || `${action}应用失败`)
     }
     
-  } catch (error) {
+  } catch (error: any) {
     if (error.name !== 'cancel') {
       console.error('切换应用状态失败:', error)
       ElMessage.error(`操作失败: ${error.message}`)
@@ -660,7 +660,7 @@ const resetAppSecret = async (app: any) => {
       throw new Error(result.message || '重置密钥失败')
     }
     
-  } catch (error) {
+  } catch (error: any) {
     if (error.name !== 'cancel') {
       console.error('重置密钥失败:', error)
       ElMessage.error(`重置失败: ${error.message}`)
@@ -697,7 +697,7 @@ const deleteApp = async (app: any) => {
       throw new Error(result.message || '删除应用失败')
     }
     
-  } catch (error) {
+  } catch (error: any) {
     if (error.name !== 'cancel') {
       console.error('删除应用失败:', error)
       ElMessage.error(`删除失败: ${error.message}`)
@@ -710,7 +710,7 @@ const copyToClipboard = async (text: string) => {
   try {
     await navigator.clipboard.writeText(text)
     ElMessage.success('已复制到剪贴板')
-  } catch (error) {
+  } catch (error: any) {
     ElMessage.error('复制失败')
   }
 }
@@ -792,7 +792,7 @@ const submitEditForm = async () => {
       throw new Error(result.message || '更新应用失败')
     }
     
-  } catch (error) {
+  } catch (error: any) {
     console.error('更新应用失败:', error)
     ElMessage.error(`更新失败: ${error.message}`)
   } finally {

+ 20 - 20
src/views/documents/Index.vue

@@ -324,7 +324,7 @@
     
     <!-- 入库设置弹窗 -->
     <el-dialog v-model="ingestDialogVisible" title="入库设置" width="400px">
-      <el-form :model="ingestForm" :rules="ingestRules" ref="ingestFormRef" label-width="100px">
+      <el-form :model="ingestForm" ref="ingestFormRef" label-width="100px">
         <el-form-item label="切分方式" prop="kb_method">
           <el-select v-model="ingestForm.kb_method" placeholder="请选择切分方式" style="width: 100%">
             <el-option label="按长度切分" value="length" />
@@ -868,7 +868,7 @@ const tempTagValue = ref<number | null>(null)
 const cascaderKey = ref(0)
 const taskForm = reactive({
   project_name: '',
-  selectedTags: [] as { id: number, name: string }[]
+  selectedTags: [] as { id: number, name: string, type?: string }[]
 })
 
 // 标签相关
@@ -883,7 +883,7 @@ const handleAddTag = (val: any) => {
   // 检查是否是标签分类(type='category')
   if (node.type === 'category' && node.children && node.children.length > 0) {
     // 如果是标签分类,添加该分类下的所有标签项
-    node.children.forEach(child => {
+    node.children.forEach((child: any) => {
       if (!taskForm.selectedTags.find(t => t.id === child.value)) {
         taskForm.selectedTags.push({ id: child.value, name: child.label, type: child.type })
       }
@@ -931,13 +931,13 @@ const fetchTagTree = async () => {
     if (res.code === '000000' || res.code === 200 || res.code === 0) {
       tagTree.value = formatTagTree(res.data)
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('获取标签树失败:', error)
   }
 }
 
 // 格式化标签树以适应 Cascader
-const formatTagTree = (data: any[]) => {
+const formatTagTree = (data: any[]): any[] => {
   return data.map(node => ({
     value: node.id,
     label: node.name,
@@ -1146,7 +1146,7 @@ const loadDictOptions = async () => {
         value: item.dict_value
       }))
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('加载字典选项失败:', error)
   }
 }
@@ -1230,7 +1230,7 @@ const loadKbOptions = async () => {
         value: item.id
       }))
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('加载知识库选项失败', error)
   }
 }
@@ -1341,7 +1341,7 @@ const confirmIngest = async () => {
   
   try {
     await ingestFormRef.value.validate()
-  } catch (error) {
+  } catch (error: any) {
     return
   }
   
@@ -1440,13 +1440,13 @@ const checkDocumentsCompleteness = async (ids: string[]) => {
           }
         )
         return true
-      } catch (error) {
+      } catch (error: any) {
         return false
       }
     }
     loading.value = false // 检查完成,关闭 loading
     return true
-  } catch (error) {
+  } catch (error: any) {
     loading.value = false // 出错时也关闭 loading
     console.error('检查文档完善度失败:', error)
     ElMessage.error('检查文档完善度失败,请重试')
@@ -1512,7 +1512,7 @@ const confirmAddTask = async () => {
   
   try {
     await taskFormRef.value.validate()
-  } catch (error) {
+  } catch (error: any) {
     return
   }
 
@@ -1716,7 +1716,7 @@ const fetchDocuments = async () => {
         stopPolling()
       }
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('获取文档列表失败:', error)
   } finally {
     loading.value = false
@@ -1763,7 +1763,7 @@ const refreshDocumentsSilently = async () => {
         }, 5000)
       }
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('静默刷新失败:', error)
   } finally {
     isRefreshing.value = false
@@ -1859,7 +1859,7 @@ const submitUpload = async () => {
   if (!uploadFormRef.value) return
   try {
     await uploadFormRef.value.validate()
-  } catch (error) {
+  } catch (error: any) {
     return
   }
   submitting.value = true
@@ -1872,7 +1872,7 @@ const submitUpload = async () => {
       // 上传后可能立即开始转换,启动轮询监控状态
       startPolling()
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('上传失败:', error)
   } finally {
     submitting.value = false
@@ -1949,7 +1949,7 @@ const handleEdit = async (row: DocumentItem) => {
     } else {
       ElMessage.error(res.message || '获取文档详情失败')
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('获取文档详情失败:', error)
     ElMessage.error('获取文档详情失败')
   }
@@ -1959,7 +1959,7 @@ const submitEdit = async () => {
   if (!editFormRef.value) return
   try {
     await editFormRef.value.validate()
-  } catch (error) {
+  } catch (error: any) {
     return
   }
   submitting.value = true
@@ -1983,7 +1983,7 @@ const submitEdit = async () => {
       editDialogVisible.value = false
       fetchDocuments()
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('编辑失败:', error)
   } finally {
     submitting.value = false
@@ -2076,7 +2076,7 @@ const handleConvert = async (row: DocumentItem) => {
           type: 'warning',
         }
       )
-    } catch (error) {
+    } catch (error: any) {
       // 用户取消
       return
     }
@@ -2099,7 +2099,7 @@ const handleConvert = async (row: DocumentItem) => {
       // 失败了恢复状态并刷新
       refreshDocumentsSilently()
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('启动转换失败:', error)
     // 失败了恢复状态并刷新
     refreshDocumentsSilently()

+ 15 - 15
src/views/documents/KnowledgeBase.vue

@@ -103,7 +103,7 @@
                     <el-icon><Delete /></el-icon>
                 </el-button>
             </el-tooltip>
-            <el-dropdown @command="(cmd) => handleCommand(cmd, row)" trigger="click">
+            <el-dropdown @command="(cmd: string) => handleCommand(cmd, row)" trigger="click">
                 <el-button link type="info">
                     <el-icon><MoreFilled /></el-icon>
                 </el-button>
@@ -241,7 +241,7 @@
                                     filterable
                                     allow-create
                                     default-first-option
-                                    @change="(val) => handleFieldChange(val, index)"
+                                    @change="(val: string) => handleFieldChange(val, index)"
                                 >
                                     <el-option 
                                         v-for="opt in availableFields"
@@ -410,7 +410,7 @@ const formData = reactive({
   dimension: 4096,
   status: 'disabled',
   enable_parent_collection: true,
-  metadata_fields: [{ field_zh_name: '', field_en_name: '', field_type: 'text', remark: '' }]
+  metadata_fields: [{ field_zh_name: '', field_en_name: '', field_type: 'text', remark: '', category_id: undefined as string | undefined }]
 })
 
 // View Dialog
@@ -429,7 +429,7 @@ const loadDictCategoryTree = async () => {
         if (res.code === '000000' || res.code === 0) {
             dictCategoryTree.value = res.data || []
         }
-    } catch (error) {
+    } catch (error: any) {
         console.error('加载字典类别树失败', error)
     }
 }
@@ -523,7 +523,7 @@ const loadData = async () => {
     })
     tableData.value = res.data
     pagination.total = res.meta?.total || 0
-  } catch (error) {
+  } catch (error: any) {
     console.error(error)
   } finally {
     loading.value = false
@@ -579,7 +579,7 @@ const handleAdd = () => {
   formData.dimension = 4096
   formData.status = 'disabled'
   formData.enable_parent_collection = true
-  formData.metadata_fields = [{ field_zh_name: '', field_en_name: '', field_type: 'text', remark: '' }]
+  formData.metadata_fields = [{ field_zh_name: '', field_en_name: '', field_type: 'text', remark: '', category_id: undefined as string | undefined }]
   dialogVisible.value = true
 }
 const handleEdit = async (row: KnowledgeBase) => {
@@ -599,12 +599,12 @@ const handleEdit = async (row: KnowledgeBase) => {
           if (res.data.metadata_fields && res.data.metadata_fields.length > 0) {
               formData.metadata_fields = res.data.metadata_fields
           } else {
-              formData.metadata_fields = [{ field_zh_name: '', field_en_name: '', field_type: 'text', remark: '' }]
+              formData.metadata_fields = [{ field_zh_name: '', field_en_name: '', field_type: 'text', remark: '', category_id: undefined as string | undefined }]
           }
       }
-  } catch (error) {
+  } catch (error: any) {
       console.error("加载元数据失败", error)
-      formData.metadata_fields = [{ field_zh_name: '', field_en_name: '', field_type: 'text', remark: '' }]
+      formData.metadata_fields = [{ field_zh_name: '', field_en_name: '', field_type: 'text', remark: '', category_id: undefined as string | undefined }]
   }
   
   dialogVisible.value = true
@@ -618,7 +618,7 @@ const handleSync = async (row: KnowledgeBase) => {
         await syncKnowledgeBase(row.id)
         ElMessage.success('同步成功,Milvus集合已创建')
         loadData()
-    } catch (error) {
+    } catch (error: any) {
         // error handled by request interceptor
     } finally {
         syncingStates.value[row.id] = false
@@ -654,7 +654,7 @@ const handleView = async (row: KnowledgeBase) => {
             }
             // 如果有动态 Schema 也可以合并到 viewSchema 中,但目前是固定的
         }
-    } catch (error) {
+    } catch (error: any) {
         console.error("加载详情失败", error)
     }
     
@@ -682,7 +682,7 @@ const handleDelete = (row: KnowledgeBase) => {
         await deleteKnowledgeBase(row.id)
         ElMessage.success('删除成功')
         loadData()
-      } catch (error) {
+      } catch (error: any) {
         // error handled by request interceptor
       }
     })
@@ -696,14 +696,14 @@ const handleCommand = async (command: string, row: KnowledgeBase) => {
             await updateKnowledgeBaseStatus(row.id, newStatus)
             ElMessage.success('状态更新成功')
             loadData()
-        } catch (error) {
+        } catch (error: any) {
             console.error(error)
         }
     }
 }
 
 const addMetadataField = () => {
-    formData.metadata_fields.push({ field_zh_name: '', field_en_name: '', field_type: 'text', remark: '' })
+    formData.metadata_fields.push({ field_zh_name: '', field_en_name: '', field_type: 'text', remark: '', category_id: undefined as string | undefined })
 }
 
 const removeMetadataField = (index: number) => {
@@ -737,7 +737,7 @@ const handleSubmit = async () => {
         }
         dialogVisible.value = false
         loadData()
-      } catch (error) {
+      } catch (error: any) {
         console.error(error)
       } finally {
         submitLoading.value = false

+ 12 - 11
src/views/documents/KnowledgeSnippet.vue

@@ -422,8 +422,9 @@ const formData = reactive({
 })
 
 // 解析标签字符串
-const parseTags = (tagListStr: string | undefined) => {
+const parseTags = (tagListStr: string | string[] | undefined) => {
     if (!tagListStr) return []
+    if (Array.isArray(tagListStr)) return tagListStr
     if (tagListStr.includes(',')) {
         return tagListStr.split(',').filter(t => t)
     }
@@ -491,7 +492,7 @@ const loadDocOptions = async (query: string) => {
                 value: item.id
             }))
         }
-    } catch (error) {
+    } catch (error: any) {
         console.error("加载文档列表失败", error)
     } finally {
         docLoading.value = false
@@ -527,7 +528,7 @@ const loadDictItems = async (categoryId: string) => {
         if (res.code === '000000' || res.code === 0) {
             dictItemsCache.value[categoryId] = res.data.list || []
         }
-    } catch (error) {
+    } catch (error: any) {
         console.error(`加载字典项失败: ${categoryId}`, error)
     }
 }
@@ -568,7 +569,7 @@ const handleKbChange = async (collection_name: string) => {
                  await loadDictItems(field.category_id)
              }
         }
-    } catch (error) {
+    } catch (error: any) {
         console.error("加载元数据定义失败", error)
         currentKbSchema.value = []
     }
@@ -606,7 +607,7 @@ const loadData = async () => {
                 ElMessage.warning(res.message)
             }
         }
-    } catch (error) {
+    } catch (error: any) {
         console.error(error)
         // error handled by interceptor
     } finally {
@@ -657,7 +658,7 @@ const loadKbOptions = async () => {
             //     loadData()
             // }
         }
-    } catch (error) {
+    } catch (error: any) {
         console.error("加载知识库选项失败", error)
     }
 }
@@ -687,7 +688,7 @@ const loadTagTree = async () => {
         if (res.code === 200) {
             tagTreeData.value = processTagTree(res.data)
         }
-    } catch (error) {
+    } catch (error: any) {
         console.error("加载标签树失败", error)
     }
 }
@@ -740,7 +741,7 @@ const loadCurrentKbMetadata = async () => {
                 await loadDictItems(field.category_id)
             }
         }
-    } catch (error) {
+    } catch (error: any) {
         console.error("加载元数据定义失败", error)
         currentKbSchema.value = []
     }
@@ -863,7 +864,7 @@ const handleDocChange = async (val: string) => {
                     })
                     ElMessage.success('已自动填充文档元数据')
                 }
-            } catch (error) {
+            } catch (error: any) {
                 console.error("自动填充元数据失败", error)
             }
         }
@@ -911,7 +912,7 @@ const handleSubmit = async () => {
         }
         dialogVisible.value = false
         loadData()
-    } catch (error) {
+    } catch (error: any) {
         console.error(error)
     } finally {
         submitLoading.value = false
@@ -946,7 +947,7 @@ const handleDelete = (row: Snippet) => {
             await deleteSnippet(row.id, row.collection_name)
             ElMessage.success('删除成功')
             loadData()
-        } catch (error) {
+        } catch (error: any) {
             // handled
         }
     })

+ 4 - 4
src/views/documents/SearchEngine.vue

@@ -330,7 +330,7 @@ const loadDocOptions = async (query: string) => {
                 value: item.title 
             }))
         }
-    } catch (error) {
+    } catch (error: any) {
         console.error("加载文档列表失败", error)
     } finally {
         docLoading.value = false
@@ -363,7 +363,7 @@ const loadKBs = async () => {
   try {
     const res = await getKnowledgeBases({ page: 1, page_size: 100 }) // Load all KBs (simplified)
     kbList.value = res.data
-  } catch (error) {
+  } catch (error: any) {
     console.error(error)
   }
 }
@@ -405,7 +405,7 @@ const handleKbChange = async () => {
                     console.warn("Invalid metadata response:", res)
                     metadataFields.value = []
                 }
-            } catch (error) {
+            } catch (error: any) {
                 console.error("Failed to load metadata fields", error)
                 metadataFields.value = []
             }
@@ -443,7 +443,7 @@ const loadDictItemsForFields = async () => {
                 if (res.code === '000000' || res.code === 0) {
                     dictItemsCache.value[categoryId] = res.data.list || []
                 }
-            } catch (error) {
+            } catch (error: any) {
                 console.error(`加载字典项失败: ${categoryId}`, error)
             }
         }

+ 10 - 10
src/views/images/Index.vue

@@ -271,7 +271,7 @@ const tempTagValue = ref<number | null>(null)
 const cascaderKey = ref(0)
 const taskForm = reactive({
   project_name: '',
-  selectedTags: [] as { id: number, name: string }[]
+  selectedTags: [] as { id: number, name: string, type?: string }[]
 })
 
 // 标签相关
@@ -286,7 +286,7 @@ const handleAddTag = (val: any) => {
   // 检查是否是标签分类(type='category')
   if (node.type === 'category' && node.children && node.children.length > 0) {
     // 如果是标签分类,添加该分类下的所有标签项
-    node.children.forEach(child => {
+    node.children.forEach((child: any) => {
       if (!taskForm.selectedTags.find(t => t.id === child.value)) {
         taskForm.selectedTags.push({ id: child.value, name: child.label, type: child.type })
       }
@@ -334,12 +334,12 @@ const fetchTagTree = async () => {
     if (res.code === '000000' || res.code === 200 || res.code === 0) {
       tagTree.value = formatTagTree(res.data)
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('获取标签树失败:', error)
   }
 }
 
-const formatTagTree = (data: any[]) => {
+const formatTagTree = (data: any[]): any[] => {
   return data.map(node => ({
     value: node.id,
     label: node.name,
@@ -383,7 +383,7 @@ const fetchCategories = async () => {
         { id: '0', type_name: '全部分类', parent_id: '-1', children: res.data, created_time: '', updated_time: '' }
       ]
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('获取分类失败:', error)
   }
 }
@@ -400,7 +400,7 @@ const fetchImages = async () => {
       images.value = res.data.list
       total.value = res.data.total
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('获取图片失败:', error)
   } finally {
     loading.value = false
@@ -483,7 +483,7 @@ const handleCategoryBatchAddToTask = async () => {
     }
     
     taskDialogVisible.value = true
-  } catch (error) {
+  } catch (error: any) {
     loading.value = false
     if (error !== 'cancel') {
       console.error('分类检查异常:', error)
@@ -496,7 +496,7 @@ const confirmAddTask = async () => {
   
   try {
     await taskFormRef.value.validate()
-  } catch (error) {
+  } catch (error: any) {
     return
   }
 
@@ -533,7 +533,7 @@ const confirmAddTask = async () => {
     } else {
       ElMessage.error(message || '操作失败')
     }
-  } catch (error) {
+  } catch (error: any) {
     console.error('批量加入任务失败:', error)
     ElMessage.error('操作异常')
   } finally {
@@ -678,7 +678,7 @@ const startBatchUpload = async () => {
       })
       
       successCount++
-    } catch (error) {
+    } catch (error: any) {
       console.error(`图片 ${item.name} 上传失败:`, error)
       failCount++
     }

+ 4 - 1
tsconfig.json

@@ -13,6 +13,9 @@
     "paths": {
       "@/*": ["./src/*"]
     },
-    "types": ["node"]
+    "types": ["node"],
+    "noEmit": true,
+    "skipLibCheck": true,
+    "isolatedModules": true
   }
 }

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
tsconfig.tsbuildinfo


Неке датотеке нису приказане због велике количине промена