更新开发环境API服务地址至192.168.3.30,调整ESLint配置以忽略特定变量,添加数据集和文档相关的创建与更新接口,优化错误处理和用户反馈,移除模拟数据,增强代码可读性。
This commit is contained in:
@@ -12,7 +12,7 @@ ENV = 'development'
|
|||||||
|
|
||||||
# 主服务地址(端口8808)
|
# 主服务地址(端口8808)
|
||||||
# 用途: 系统管理、用户认证、权限控制、模块开通等原有功能
|
# 用途: 系统管理、用户认证、权限控制、模块开通等原有功能
|
||||||
VITE_API_URL = 'http://192.168.3.11:8808/'
|
VITE_API_URL = 'http://192.168.3.30:8808/'
|
||||||
# 新功能服务地址(端口8000)
|
# 新功能服务地址(端口8000)
|
||||||
# 用途: 资产管理、分类、SKU、订单等新业务模块
|
# 用途: 资产管理、分类、SKU、订单等新业务模块
|
||||||
VITE_NEW_API_URL = 'http://192.168.3.11:8000/'
|
VITE_NEW_API_URL = 'http://192.168.3.30:8000/'
|
||||||
|
|||||||
@@ -15,4 +15,5 @@ bin
|
|||||||
build
|
build
|
||||||
config
|
config
|
||||||
index.html
|
index.html
|
||||||
src/assets
|
src/assets
|
||||||
|
src/api/**/example.ts
|
||||||
@@ -37,7 +37,14 @@ module.exports = {
|
|||||||
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
||||||
'@typescript-eslint/no-redeclare': 'error',
|
'@typescript-eslint/no-redeclare': 'error',
|
||||||
'@typescript-eslint/no-non-null-asserted-optional-chain': 'off',
|
'@typescript-eslint/no-non-null-asserted-optional-chain': 'off',
|
||||||
'@typescript-eslint/no-unused-vars': [2],
|
'@typescript-eslint/no-unused-vars': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
argsIgnorePattern: '^_',
|
||||||
|
varsIgnorePattern: '^_',
|
||||||
|
caughtErrorsIgnorePattern: '^_',
|
||||||
|
},
|
||||||
|
],
|
||||||
'vue/custom-event-name-casing': 'off',
|
'vue/custom-event-name-casing': 'off',
|
||||||
'vue/attributes-order': 'off',
|
'vue/attributes-order': 'off',
|
||||||
'vue/one-component-per-file': 'off',
|
'vue/one-component-per-file': 'off',
|
||||||
@@ -67,10 +74,11 @@ module.exports = {
|
|||||||
'generator-star-spacing': 'off',
|
'generator-star-spacing': 'off',
|
||||||
'no-unreachable': 'off',
|
'no-unreachable': 'off',
|
||||||
'no-multiple-template-root': 'off',
|
'no-multiple-template-root': 'off',
|
||||||
'no-unused-vars': 'error',
|
'no-unused-vars': 'off',
|
||||||
'no-v-model-argument': 'off',
|
'no-v-model-argument': 'off',
|
||||||
'no-case-declarations': 'off',
|
'no-case-declarations': 'off',
|
||||||
'no-console': 'error',
|
'no-console': 'error',
|
||||||
|
'no-debugger': 'error',
|
||||||
'no-redeclare': 'off',
|
'no-redeclare': 'off',
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
106
package-lock.json
generated
106
package-lock.json
generated
@@ -67,7 +67,8 @@
|
|||||||
"vite-plugin-cdn-import": "^0.3.5",
|
"vite-plugin-cdn-import": "^0.3.5",
|
||||||
"vite-plugin-compression": "^0.5.1",
|
"vite-plugin-compression": "^0.5.1",
|
||||||
"vite-plugin-vue-setup-extend-plus": "^0.1.0",
|
"vite-plugin-vue-setup-extend-plus": "^0.1.0",
|
||||||
"vue-eslint-parser": "^9.4.1"
|
"vue-eslint-parser": "^9.4.1",
|
||||||
|
"vue-tsc": "^3.2.6"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=16.0.0",
|
"node": ">=16.0.0",
|
||||||
@@ -2172,6 +2173,35 @@
|
|||||||
"vue": "^3.2.25"
|
"vue": "^3.2.25"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@volar/language-core": {
|
||||||
|
"version": "2.4.28",
|
||||||
|
"resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz",
|
||||||
|
"integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@volar/source-map": "2.4.28"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@volar/source-map": {
|
||||||
|
"version": "2.4.28",
|
||||||
|
"resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz",
|
||||||
|
"integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/@volar/typescript": {
|
||||||
|
"version": "2.4.28",
|
||||||
|
"resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz",
|
||||||
|
"integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@volar/language-core": "2.4.28",
|
||||||
|
"path-browserify": "^1.0.1",
|
||||||
|
"vscode-uri": "^3.0.8"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@vue/compiler-core": {
|
"node_modules/@vue/compiler-core": {
|
||||||
"version": "3.5.25",
|
"version": "3.5.25",
|
||||||
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.25.tgz",
|
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.25.tgz",
|
||||||
@@ -2228,6 +2258,35 @@
|
|||||||
"integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
|
"integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/@vue/language-core": {
|
||||||
|
"version": "3.2.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.2.6.tgz",
|
||||||
|
"integrity": "sha512-xYYYX3/aVup576tP/23sEUpgiEnujrENaoNRbaozC1/MA9I6EGFQRJb4xrt/MmUCAGlxTKL2RmT8JLTPqagCkg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@volar/language-core": "2.4.28",
|
||||||
|
"@vue/compiler-dom": "^3.5.0",
|
||||||
|
"@vue/shared": "^3.5.0",
|
||||||
|
"alien-signals": "^3.0.0",
|
||||||
|
"muggle-string": "^0.4.1",
|
||||||
|
"path-browserify": "^1.0.1",
|
||||||
|
"picomatch": "^4.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@vue/language-core/node_modules/picomatch": {
|
||||||
|
"version": "4.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
|
||||||
|
"integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/jonschlinkert"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@vue/reactivity": {
|
"node_modules/@vue/reactivity": {
|
||||||
"version": "3.5.25",
|
"version": "3.5.25",
|
||||||
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.25.tgz",
|
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.25.tgz",
|
||||||
@@ -2506,6 +2565,13 @@
|
|||||||
"url": "https://github.com/sponsors/epoberezkin"
|
"url": "https://github.com/sponsors/epoberezkin"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/alien-signals": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/ansi-regex": {
|
"node_modules/ansi-regex": {
|
||||||
"version": "5.0.1",
|
"version": "5.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
|
||||||
@@ -4358,6 +4424,13 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/muggle-string": {
|
||||||
|
"version": "0.4.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz",
|
||||||
|
"integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/namespace-emitter": {
|
"node_modules/namespace-emitter": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
|
||||||
@@ -4527,6 +4600,13 @@
|
|||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/path-browserify": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/path-exists": {
|
"node_modules/path-exists": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
|
||||||
@@ -5622,6 +5702,13 @@
|
|||||||
"url": "https://github.com/sponsors/jonschlinkert"
|
"url": "https://github.com/sponsors/jonschlinkert"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/vscode-uri": {
|
||||||
|
"version": "3.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz",
|
||||||
|
"integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/vue": {
|
"node_modules/vue": {
|
||||||
"version": "3.5.25",
|
"version": "3.5.25",
|
||||||
"resolved": "https://registry.npmjs.org/vue/-/vue-3.5.25.tgz",
|
"resolved": "https://registry.npmjs.org/vue/-/vue-3.5.25.tgz",
|
||||||
@@ -5792,6 +5879,23 @@
|
|||||||
"vue": ">=3.1"
|
"vue": ">=3.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/vue-tsc": {
|
||||||
|
"version": "3.2.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.2.6.tgz",
|
||||||
|
"integrity": "sha512-gYW/kWI0XrwGzd0PKc7tVB/qpdeAkIZLNZb10/InizkQjHjnT8weZ/vBarZoj4kHKbUTZT/bAVgoOr8x4NsQ/Q==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@volar/typescript": "2.4.28",
|
||||||
|
"@vue/language-core": "3.2.6"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"vue-tsc": "bin/vue-tsc.js"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"typescript": ">=5.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/vue-ueditor-wrap": {
|
"node_modules/vue-ueditor-wrap": {
|
||||||
"version": "3.0.8",
|
"version": "3.0.8",
|
||||||
"resolved": "https://registry.npmjs.org/vue-ueditor-wrap/-/vue-ueditor-wrap-3.0.8.tgz",
|
"resolved": "https://registry.npmjs.org/vue-ueditor-wrap/-/vue-ueditor-wrap-3.0.8.tgz",
|
||||||
|
|||||||
@@ -8,7 +8,10 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
"build": "vite build",
|
"build": "vite build",
|
||||||
"lint-fix": "eslint --fix --ext .js --ext .jsx --ext .vue src/"
|
"lint": "eslint --ext .js,.jsx,.ts,.tsx,.vue src/",
|
||||||
|
"lint-fix": "eslint --fix --ext .js,.jsx,.ts,.tsx,.vue src/",
|
||||||
|
"type-check": "vue-tsc --noEmit -p tsconfig.json",
|
||||||
|
"quality": "npm run lint && npm run type-check"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codemirror/lang-javascript": "^6.1.1",
|
"@codemirror/lang-javascript": "^6.1.1",
|
||||||
@@ -69,7 +72,8 @@
|
|||||||
"vite-plugin-cdn-import": "^0.3.5",
|
"vite-plugin-cdn-import": "^0.3.5",
|
||||||
"vite-plugin-compression": "^0.5.1",
|
"vite-plugin-compression": "^0.5.1",
|
||||||
"vite-plugin-vue-setup-extend-plus": "^0.1.0",
|
"vite-plugin-vue-setup-extend-plus": "^0.1.0",
|
||||||
"vue-eslint-parser": "^9.4.1"
|
"vue-eslint-parser": "^9.4.1",
|
||||||
|
"vue-tsc": "^3.2.6"
|
||||||
},
|
},
|
||||||
"browserslist": [
|
"browserslist": [
|
||||||
"> 1%",
|
"> 1%",
|
||||||
|
|||||||
113
src/api/knowledge/dataset/example.ts
Normal file
113
src/api/knowledge/dataset/example.ts
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
// ⚠️ 示例文件:仅用于接口调用演示,不参与生产运行。
|
||||||
|
// 知识库接口使用示例
|
||||||
|
import {
|
||||||
|
createKnowledgeBase,
|
||||||
|
CreateDatasetParams,
|
||||||
|
updateKnowledgeBase,
|
||||||
|
UpdateDatasetParams
|
||||||
|
} from '/@/api/knowledge/dataset';
|
||||||
|
|
||||||
|
// 示例1:创建带描述的知识库
|
||||||
|
const createKnowledgeBaseWithDescription = async () => {
|
||||||
|
const params: CreateDatasetParams = {
|
||||||
|
name: '客服知识库',
|
||||||
|
description: '包含常见问题和答案的知识库'
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await createKnowledgeBase(params);
|
||||||
|
console.log('知识库创建成功:', response.data);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('创建失败:', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 示例2:创建仅包含名称的知识库
|
||||||
|
const createKnowledgeBaseOnly = async () => {
|
||||||
|
const params: CreateDatasetParams = {
|
||||||
|
name: '产品知识库'
|
||||||
|
// description 是可选的,可以不传
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await createKnowledgeBase(params);
|
||||||
|
console.log('知识库创建成功:', response.data);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('创建失败:', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 示例3:更新知识库名称和描述
|
||||||
|
const updateKnowledgeBaseInfo = async () => {
|
||||||
|
const params: UpdateDatasetParams = {
|
||||||
|
id: '1234567890', // 必传
|
||||||
|
name: '更新后的知识库名称',
|
||||||
|
description: '更新后的描述信息'
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await updateKnowledgeBase(params);
|
||||||
|
console.log('知识库更新成功:', response.data);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('更新失败:', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 示例4:仅更新知识库名称
|
||||||
|
const updateKnowledgeBaseName = async () => {
|
||||||
|
const params: UpdateDatasetParams = {
|
||||||
|
id: '1234567890', // 必传
|
||||||
|
name: '仅更新名称'
|
||||||
|
// description 是可选的,可以不传
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await updateKnowledgeBase(params);
|
||||||
|
console.log('知识库名称更新成功:', response.data);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('更新失败:', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 在Vue组件中使用
|
||||||
|
/*
|
||||||
|
import { ref } from 'vue';
|
||||||
|
import { ElMessage } from 'element-plus';
|
||||||
|
import { createKnowledgeBase, CreateDatasetParams } from '/@/api/knowledge/dataset';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
setup() {
|
||||||
|
const formData = ref<CreateDatasetParams>({
|
||||||
|
name: '',
|
||||||
|
description: ''
|
||||||
|
});
|
||||||
|
|
||||||
|
const loading = ref(false);
|
||||||
|
|
||||||
|
const handleSubmit = async () => {
|
||||||
|
if (!formData.value.name.trim()) {
|
||||||
|
ElMessage.error('知识库名称不能为空');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
loading.value = true;
|
||||||
|
try {
|
||||||
|
await createKnowledgeBase(formData.value);
|
||||||
|
ElMessage.success('知识库创建成功');
|
||||||
|
// 重置表单或跳转到列表页
|
||||||
|
formData.value = { name: '', description: '' };
|
||||||
|
} catch (error) {
|
||||||
|
ElMessage.error('创建失败,请重试');
|
||||||
|
} finally {
|
||||||
|
loading.value = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
formData,
|
||||||
|
loading,
|
||||||
|
handleSubmit
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
*/
|
||||||
@@ -8,6 +8,19 @@ export interface DatasetQueryParams {
|
|||||||
pageSize: number;
|
pageSize: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 创建知识库参数
|
||||||
|
export interface CreateDatasetParams {
|
||||||
|
name: string; // 必传
|
||||||
|
description?: string; // 可选
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新知识库参数
|
||||||
|
export interface UpdateDatasetParams {
|
||||||
|
id: string; // 必传
|
||||||
|
name?: string; // 可选
|
||||||
|
description?: string; // 可选
|
||||||
|
}
|
||||||
|
|
||||||
// 数据集信息
|
// 数据集信息
|
||||||
export interface DatasetInfo {
|
export interface DatasetInfo {
|
||||||
id?: string;
|
id?: string;
|
||||||
@@ -25,7 +38,7 @@ export interface DatasetInfo {
|
|||||||
// 获取数据集列表
|
// 获取数据集列表
|
||||||
export function listDatasets(params: DatasetQueryParams) {
|
export function listDatasets(params: DatasetQueryParams) {
|
||||||
return newService({
|
return newService({
|
||||||
url: '/knowledge/dataset/list',
|
url: '/rag-knowledge/knowledge/listKnowledge',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
@@ -40,7 +53,16 @@ export function getDataset(id: string) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建数据集
|
// 创建数据集(简化版)
|
||||||
|
export function createKnowledgeBase(data: CreateDatasetParams) {
|
||||||
|
return newService({
|
||||||
|
url: '/rag-knowledge/knowledge/createKnowledge',
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建数据集(完整版)
|
||||||
export function createDataset(data: DatasetInfo) {
|
export function createDataset(data: DatasetInfo) {
|
||||||
return newService({
|
return newService({
|
||||||
url: '/knowledge/dataset/create',
|
url: '/knowledge/dataset/create',
|
||||||
@@ -49,7 +71,16 @@ export function createDataset(data: DatasetInfo) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新数据集
|
// 更新知识库(简化版)
|
||||||
|
export function updateKnowledgeBase(data: UpdateDatasetParams) {
|
||||||
|
return newService({
|
||||||
|
url: '/rag-knowledge/knowledge/updateKnowledge',
|
||||||
|
method: 'put',
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新数据集(完整版)
|
||||||
export function updateDataset(data: DatasetInfo) {
|
export function updateDataset(data: DatasetInfo) {
|
||||||
return newService({
|
return newService({
|
||||||
url: '/knowledge/dataset/update',
|
url: '/knowledge/dataset/update',
|
||||||
@@ -61,7 +92,7 @@ export function updateDataset(data: DatasetInfo) {
|
|||||||
// 删除数据集
|
// 删除数据集
|
||||||
export function deleteDataset(id: string) {
|
export function deleteDataset(id: string) {
|
||||||
return newService({
|
return newService({
|
||||||
url: '/knowledge/dataset/delete',
|
url: '/rag-knowledge/knowledge/deleteKnowledge',
|
||||||
method: 'delete',
|
method: 'delete',
|
||||||
params: { id },
|
params: { id },
|
||||||
});
|
});
|
||||||
|
|||||||
238
src/api/knowledge/document/example.ts
Normal file
238
src/api/knowledge/document/example.ts
Normal file
@@ -0,0 +1,238 @@
|
|||||||
|
// ⚠️ 示例文件:仅用于接口调用演示,不参与生产运行。
|
||||||
|
// 文档接口使用示例
|
||||||
|
import {
|
||||||
|
createDocument,
|
||||||
|
CreateDocumentParams,
|
||||||
|
updateDocument,
|
||||||
|
UpdateDocumentParams,
|
||||||
|
uploadDocument,
|
||||||
|
deleteDocument,
|
||||||
|
listDocuments,
|
||||||
|
DocumentQueryParams
|
||||||
|
} from '/@/api/knowledge/document';
|
||||||
|
|
||||||
|
// 示例1:创建文档(JSON格式)
|
||||||
|
const createDocumentExample = async () => {
|
||||||
|
const params: CreateDocumentParams = {
|
||||||
|
KnowledgeId: 12345, // 知识库ID,必传
|
||||||
|
filePath: '/path/to/document.pdf', // 文件路径,必传
|
||||||
|
fileSize: 1024000, // 文件大小(字节),必传
|
||||||
|
format: 'pdf', // 文件格式,必传
|
||||||
|
title: '产品使用手册' // 文档标题,必传
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await createDocument(params);
|
||||||
|
console.log('文档创建成功:', response.data);
|
||||||
|
return response.data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('创建失败:', error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 示例2:上传文档(FormData格式)
|
||||||
|
const uploadDocumentExample = async (file: File, knowledgeId: string) => {
|
||||||
|
const formData = new FormData();
|
||||||
|
formData.append('file', file);
|
||||||
|
formData.append('datasetId', knowledgeId);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await uploadDocument(formData);
|
||||||
|
console.log('文档上传成功:', response.data);
|
||||||
|
return response.data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('上传失败:', error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 示例3:获取文档列表
|
||||||
|
const getDocumentList = async (knowledgeId: string) => {
|
||||||
|
const params: DocumentQueryParams = {
|
||||||
|
datasetId: knowledgeId,
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
keyword: '', // 可选搜索关键字
|
||||||
|
status: '', // 可选状态筛选
|
||||||
|
fileType: '' // 可选文件类型筛选
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await listDocuments(params);
|
||||||
|
console.log('文档列表:', response.data);
|
||||||
|
return response.data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('获取列表失败:', error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 示例4:更新文档
|
||||||
|
const updateDocumentExample = async () => {
|
||||||
|
const params: UpdateDocumentParams = {
|
||||||
|
id: '1234567890', // 必传
|
||||||
|
title: '更新后的文档标题' // 可选,只更新标题
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await updateDocument(params);
|
||||||
|
console.log('文档更新成功:', response.data);
|
||||||
|
return response.data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('更新失败:', error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 示例5:完整更新文档
|
||||||
|
const updateDocumentFull = async () => {
|
||||||
|
const params: UpdateDocumentParams = {
|
||||||
|
id: '1234567890', // 必传
|
||||||
|
KnowledgeId: 67890, // 可选
|
||||||
|
filePath: '/new/path/document.pdf', // 可选
|
||||||
|
fileSize: 2048000, // 可选
|
||||||
|
format: 'pdf', // 可选
|
||||||
|
title: '完全更新的文档' // 可选
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await updateDocument(params);
|
||||||
|
console.log('文档完整更新成功:', response.data);
|
||||||
|
return response.data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('更新失败:', error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 示例6:删除文档
|
||||||
|
const deleteDocumentExample = async (documentId: string) => {
|
||||||
|
try {
|
||||||
|
await deleteDocument(documentId);
|
||||||
|
console.log('文档删除成功');
|
||||||
|
} catch (error) {
|
||||||
|
console.error('删除失败:', error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 在Vue组件中使用
|
||||||
|
/*
|
||||||
|
import { ref } from 'vue';
|
||||||
|
import { ElMessage, ElMessageBox } from 'element-plus';
|
||||||
|
import {
|
||||||
|
createDocument,
|
||||||
|
CreateDocumentParams,
|
||||||
|
uploadDocument,
|
||||||
|
deleteDocument,
|
||||||
|
listDocuments,
|
||||||
|
DocumentQueryParams
|
||||||
|
} from '/@/api/knowledge/document';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
setup() {
|
||||||
|
const formData = ref<CreateDocumentParams>({
|
||||||
|
KnowledgeId: 0,
|
||||||
|
filePath: '',
|
||||||
|
fileSize: 0,
|
||||||
|
format: '',
|
||||||
|
title: ''
|
||||||
|
});
|
||||||
|
|
||||||
|
const loading = ref(false);
|
||||||
|
const documentList = ref([]);
|
||||||
|
|
||||||
|
// 创建文档
|
||||||
|
const handleCreate = async () => {
|
||||||
|
// 验证必填字段
|
||||||
|
if (!formData.value.KnowledgeId || !formData.value.filePath ||
|
||||||
|
!formData.value.fileSize || !formData.value.format || !formData.value.title) {
|
||||||
|
ElMessage.error('请填写所有必填字段');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
loading.value = true;
|
||||||
|
try {
|
||||||
|
await createDocument(formData.value);
|
||||||
|
ElMessage.success('文档创建成功');
|
||||||
|
// 重置表单
|
||||||
|
formData.value = {
|
||||||
|
KnowledgeId: 0,
|
||||||
|
filePath: '',
|
||||||
|
fileSize: 0,
|
||||||
|
format: '',
|
||||||
|
title: ''
|
||||||
|
};
|
||||||
|
// 刷新列表
|
||||||
|
await getDocuments();
|
||||||
|
} catch (error) {
|
||||||
|
ElMessage.error('创建失败,请重试');
|
||||||
|
} finally {
|
||||||
|
loading.value = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 文件上传
|
||||||
|
const handleFileUpload = async (event: Event, knowledgeId: string) => {
|
||||||
|
const file = (event.target as HTMLInputElement).files?.[0];
|
||||||
|
if (!file) return;
|
||||||
|
|
||||||
|
const formData = new FormData();
|
||||||
|
formData.append('file', file);
|
||||||
|
formData.append('datasetId', knowledgeId);
|
||||||
|
|
||||||
|
loading.value = true;
|
||||||
|
try {
|
||||||
|
await uploadDocument(formData);
|
||||||
|
ElMessage.success('文档上传成功');
|
||||||
|
await getDocuments();
|
||||||
|
} catch (error) {
|
||||||
|
ElMessage.error('上传失败,请重试');
|
||||||
|
} finally {
|
||||||
|
loading.value = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 删除文档
|
||||||
|
const handleDelete = async (id: string) => {
|
||||||
|
try {
|
||||||
|
await ElMessageBox.confirm('确定要删除这个文档吗?', '提示', {
|
||||||
|
type: 'warning',
|
||||||
|
});
|
||||||
|
|
||||||
|
await deleteDocument(id);
|
||||||
|
ElMessage.success('删除成功');
|
||||||
|
await getDocuments();
|
||||||
|
} catch (error) {
|
||||||
|
if (error !== 'cancel') {
|
||||||
|
ElMessage.error('删除失败');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 获取文档列表
|
||||||
|
const getDocuments = async () => {
|
||||||
|
try {
|
||||||
|
const response = await listDocuments({
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 10
|
||||||
|
});
|
||||||
|
documentList.value = response.data.list;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('获取列表失败:', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
formData,
|
||||||
|
loading,
|
||||||
|
documentList,
|
||||||
|
handleCreate,
|
||||||
|
handleFileUpload,
|
||||||
|
handleDelete,
|
||||||
|
getDocuments
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
*/
|
||||||
@@ -10,6 +10,25 @@ export interface DocumentQueryParams {
|
|||||||
pageSize: number;
|
pageSize: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 创建文档参数
|
||||||
|
export interface CreateDocumentParams {
|
||||||
|
KnowledgeId: number; // 必传
|
||||||
|
filePath: string; // 必传
|
||||||
|
fileSize: number; // 必传
|
||||||
|
format: string; // 必传
|
||||||
|
title: string; // 必传
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新文档参数
|
||||||
|
export interface UpdateDocumentParams {
|
||||||
|
id: string; // 必传
|
||||||
|
KnowledgeId?: number; // 可选
|
||||||
|
filePath?: string; // 可选
|
||||||
|
fileSize?: number; // 可选
|
||||||
|
format?: string; // 可选
|
||||||
|
title?: string; // 可选
|
||||||
|
}
|
||||||
|
|
||||||
// 文档信息
|
// 文档信息
|
||||||
export interface DocumentInfo {
|
export interface DocumentInfo {
|
||||||
id?: string;
|
id?: string;
|
||||||
@@ -58,6 +77,24 @@ export function getDocument(id: string) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 创建文档(JSON格式)
|
||||||
|
export function createDocument(data: CreateDocumentParams) {
|
||||||
|
return newService({
|
||||||
|
url: '/knowledge/document/create',
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新文档
|
||||||
|
export function updateDocument(data: UpdateDocumentParams) {
|
||||||
|
return newService({
|
||||||
|
url: '/knowledge/document/update',
|
||||||
|
method: 'put',
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// 上传文档
|
// 上传文档
|
||||||
export function uploadDocument(data: FormData) {
|
export function uploadDocument(data: FormData) {
|
||||||
return newService({
|
return newService({
|
||||||
|
|||||||
@@ -61,7 +61,7 @@
|
|||||||
|
|
||||||
<div
|
<div
|
||||||
class="chunk-item"
|
class="chunk-item"
|
||||||
v-for="(chunk, index) in filteredChunks"
|
v-for="chunk in filteredChunks"
|
||||||
:key="chunk.id"
|
:key="chunk.id"
|
||||||
>
|
>
|
||||||
<div class="chunk-checkbox">
|
<div class="chunk-checkbox">
|
||||||
@@ -150,8 +150,8 @@ const selectAll = ref(false);
|
|||||||
// 过滤后的切片列表
|
// 过滤后的切片列表
|
||||||
const filteredChunks = computed(() => {
|
const filteredChunks = computed(() => {
|
||||||
if (!chunkSearch.value) return chunkList.value;
|
if (!chunkSearch.value) return chunkList.value;
|
||||||
return chunkList.value.filter(chunk =>
|
return chunkList.value.filter((chunk) =>
|
||||||
chunk.content.toLowerCase().includes(chunkSearch.value.toLowerCase())
|
(chunk.content || '').toLowerCase().includes(chunkSearch.value.toLowerCase())
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -182,8 +182,9 @@ const getDocumentDetail = async () => {
|
|||||||
|
|
||||||
// 模拟文档内容
|
// 模拟文档内容
|
||||||
documentContent.value = '<p>123</p>';
|
documentContent.value = '<p>123</p>';
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('获取文档详情失败:', error);
|
ElMessage.error('获取文档详情失败');
|
||||||
|
documentContent.value = '';
|
||||||
} finally {
|
} finally {
|
||||||
contentLoading.value = false;
|
contentLoading.value = false;
|
||||||
}
|
}
|
||||||
@@ -203,8 +204,10 @@ const getChunkList = async () => {
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
chunkTotal.value = 1;
|
chunkTotal.value = 1;
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('获取切片列表失败:', error);
|
ElMessage.error('获取切片列表失败');
|
||||||
|
chunkList.value = [];
|
||||||
|
chunkTotal.value = 0;
|
||||||
} finally {
|
} finally {
|
||||||
chunkLoading.value = false;
|
chunkLoading.value = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -133,8 +133,8 @@ const openDialog = async (row?: any) => {
|
|||||||
ruleForm.embeddingModel = data.embeddingModel || 'text-embedding-ada-002';
|
ruleForm.embeddingModel = data.embeddingModel || 'text-embedding-ada-002';
|
||||||
ruleForm.documentCount = data.documentCount || 0;
|
ruleForm.documentCount = data.documentCount || 0;
|
||||||
ruleForm.charCount = data.charCount || 0;
|
ruleForm.charCount = data.charCount || 0;
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('获取数据集详情失败:', error);
|
ElMessage.error('获取数据集详情失败');
|
||||||
// 使用传入的row数据
|
// 使用传入的row数据
|
||||||
ruleForm.id = row.id || '';
|
ruleForm.id = row.id || '';
|
||||||
ruleForm.name = row.name || '';
|
ruleForm.name = row.name || '';
|
||||||
@@ -183,12 +183,8 @@ const onSubmit = async () => {
|
|||||||
|
|
||||||
isShowDialog.value = false;
|
isShowDialog.value = false;
|
||||||
emit('getDatasetList');
|
emit('getDatasetList');
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('提交失败:', error);
|
ElMessage.error(isEdit.value ? '保存失败,请重试' : '创建失败,请重试');
|
||||||
// 模拟成功
|
|
||||||
ElMessage.success(isEdit.value ? '保存成功' : '创建成功');
|
|
||||||
isShowDialog.value = false;
|
|
||||||
emit('getDatasetList');
|
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false;
|
submitLoading.value = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
<el-icon><ele-Refresh /></el-icon>
|
<el-icon><ele-Refresh /></el-icon>
|
||||||
重置
|
重置
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button size="default" type="success" @click="onOpenAdd">
|
<el-button size="default" type="success" @click="onOpenAdd" v-auth="'api/v1/knowledge/dataset/create'">
|
||||||
<el-icon><ele-Plus /></el-icon>
|
<el-icon><ele-Plus /></el-icon>
|
||||||
新增
|
新增
|
||||||
</el-button>
|
</el-button>
|
||||||
@@ -63,6 +63,7 @@
|
|||||||
active-text="启"
|
active-text="启"
|
||||||
inactive-text="停"
|
inactive-text="停"
|
||||||
@change="onStatusChange(scope.row)"
|
@change="onStatusChange(scope.row)"
|
||||||
|
v-auth="'api/v1/knowledge/dataset/updateStatus'"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@@ -70,9 +71,9 @@
|
|||||||
<el-table-column prop="updatedAt" label="更新时间" width="170" show-overflow-tooltip />
|
<el-table-column prop="updatedAt" label="更新时间" width="170" show-overflow-tooltip />
|
||||||
<el-table-column label="操作" width="200" fixed="right" align="center">
|
<el-table-column label="操作" width="200" fixed="right" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button size="small" text type="primary" @click="onEdit(scope.row)">编辑</el-button>
|
<el-button size="small" text type="primary" @click="onEdit(scope.row)" v-auth="'api/v1/knowledge/dataset/update'">编辑</el-button>
|
||||||
<el-button size="small" text type="success" @click="onManageDocuments(scope.row)">文档</el-button>
|
<el-button size="small" text type="success" @click="onManageDocuments(scope.row)">文档</el-button>
|
||||||
<el-button size="small" text type="danger" @click="onRowDel(scope.row)">删除</el-button>
|
<el-button size="small" text type="danger" @click="onRowDel(scope.row)" v-auth="'api/v1/knowledge/dataset/delete'">删除</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@@ -137,48 +138,10 @@ const getDatasetList = async () => {
|
|||||||
statusEnabled: item.status === 'enable',
|
statusEnabled: item.status === 'enable',
|
||||||
}));
|
}));
|
||||||
tableData.total = res.data?.total || 0;
|
tableData.total = res.data?.total || 0;
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('获取数据集列表失败:', error);
|
tableData.data = [];
|
||||||
// 模拟数据
|
tableData.total = 0;
|
||||||
tableData.data = [
|
ElMessage.error('获取数据集列表失败');
|
||||||
{
|
|
||||||
id: '1',
|
|
||||||
name: '产品知识库',
|
|
||||||
type: 'text',
|
|
||||||
documentCount: 15,
|
|
||||||
charCount: 125000,
|
|
||||||
embeddingModel: 'text-embedding-ada-002',
|
|
||||||
status: 'enable',
|
|
||||||
statusEnabled: true,
|
|
||||||
createdAt: '2024-01-15 10:30:00',
|
|
||||||
updatedAt: '2024-01-20 14:20:00',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: '2',
|
|
||||||
name: '常见问题FAQ',
|
|
||||||
type: 'qa',
|
|
||||||
documentCount: 50,
|
|
||||||
charCount: 85000,
|
|
||||||
embeddingModel: 'text-embedding-ada-002',
|
|
||||||
status: 'enable',
|
|
||||||
statusEnabled: true,
|
|
||||||
createdAt: '2024-01-10 09:00:00',
|
|
||||||
updatedAt: '2024-01-18 16:45:00',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: '3',
|
|
||||||
name: '数据报表',
|
|
||||||
type: 'table',
|
|
||||||
documentCount: 8,
|
|
||||||
charCount: 45000,
|
|
||||||
embeddingModel: 'text-embedding-ada-002',
|
|
||||||
status: 'disable',
|
|
||||||
statusEnabled: false,
|
|
||||||
createdAt: '2024-01-05 11:20:00',
|
|
||||||
updatedAt: '2024-01-12 10:30:00',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
tableData.total = 3;
|
|
||||||
} finally {
|
} finally {
|
||||||
tableData.loading = false;
|
tableData.loading = false;
|
||||||
}
|
}
|
||||||
@@ -257,9 +220,9 @@ const onStatusChange = async (row: any) => {
|
|||||||
try {
|
try {
|
||||||
await updateDatasetStatus({ id: row.id, status: newStatus });
|
await updateDatasetStatus({ id: row.id, status: newStatus });
|
||||||
ElMessage.success(`${statusText}成功`);
|
ElMessage.success(`${statusText}成功`);
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('状态更新失败:', error);
|
row.statusEnabled = !row.statusEnabled;
|
||||||
ElMessage.success(`${statusText}成功`);
|
ElMessage.error(`${statusText}失败`);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -274,10 +237,8 @@ const onRowDel = (row: any) => {
|
|||||||
await deleteDataset(row.id);
|
await deleteDataset(row.id);
|
||||||
ElMessage.success('删除成功');
|
ElMessage.success('删除成功');
|
||||||
getDatasetList();
|
getDatasetList();
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('删除失败:', error);
|
ElMessage.error('删除失败');
|
||||||
ElMessage.success('删除成功');
|
|
||||||
getDatasetList();
|
|
||||||
}
|
}
|
||||||
}).catch(() => {});
|
}).catch(() => {});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
<div class="chunks-list">
|
<div class="chunks-list">
|
||||||
<div
|
<div
|
||||||
class="chunk-item"
|
class="chunk-item"
|
||||||
v-for="(chunk, index) in tableData.data"
|
v-for="chunk in tableData.data"
|
||||||
:key="chunk.id"
|
:key="chunk.id"
|
||||||
>
|
>
|
||||||
<div class="chunk-header">
|
<div class="chunk-header">
|
||||||
@@ -41,11 +41,11 @@
|
|||||||
<span class="token-count" v-if="chunk.tokenCount">{{ chunk.tokenCount }} tokens</span>
|
<span class="token-count" v-if="chunk.tokenCount">{{ chunk.tokenCount }} tokens</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="chunk-actions">
|
<div class="chunk-actions">
|
||||||
<el-button size="small" text type="primary" @click="onEditChunk(chunk)">
|
<el-button size="small" text type="primary" @click="onEditChunk(chunk)" v-auth="'api/v1/knowledge/document/chunk/update'">
|
||||||
<el-icon><ele-Edit /></el-icon>
|
<el-icon><ele-Edit /></el-icon>
|
||||||
编辑
|
编辑
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button size="small" text type="danger" @click="onDeleteChunk(chunk)">
|
<el-button size="small" text type="danger" @click="onDeleteChunk(chunk)" v-auth="'api/v1/knowledge/document/chunk/delete'">
|
||||||
<el-icon><ele-Delete /></el-icon>
|
<el-icon><ele-Delete /></el-icon>
|
||||||
删除
|
删除
|
||||||
</el-button>
|
</el-button>
|
||||||
@@ -132,25 +132,10 @@ const getChunkList = async () => {
|
|||||||
saving: false,
|
saving: false,
|
||||||
}));
|
}));
|
||||||
tableData.total = res.data?.total || 0;
|
tableData.total = res.data?.total || 0;
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('获取分段列表失败:', error);
|
tableData.data = [];
|
||||||
// 模拟数据
|
tableData.total = 0;
|
||||||
const mockChunks = [];
|
ElMessage.error('获取分段列表失败');
|
||||||
for (let i = 0; i < 10; i++) {
|
|
||||||
mockChunks.push({
|
|
||||||
id: `chunk_${i + 1}`,
|
|
||||||
documentId: documentInfo.id,
|
|
||||||
content: `这是第 ${i + 1} 个分段的内容。在知识库系统中,文档会被自动分割成多个小段落,每个段落会生成对应的向量表示,用于后续的语义检索。分段的大小和重叠长度可以在上传时进行配置,以获得最佳的检索效果。`,
|
|
||||||
chunkIndex: i,
|
|
||||||
charCount: 120 + Math.floor(Math.random() * 50),
|
|
||||||
tokenCount: 80 + Math.floor(Math.random() * 30),
|
|
||||||
isEditing: false,
|
|
||||||
editContent: '',
|
|
||||||
saving: false,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
tableData.data = mockChunks;
|
|
||||||
tableData.total = 25;
|
|
||||||
} finally {
|
} finally {
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
}
|
}
|
||||||
@@ -188,13 +173,8 @@ const onSaveChunk = async (chunk: any) => {
|
|||||||
chunk.charCount = chunk.editContent.length;
|
chunk.charCount = chunk.editContent.length;
|
||||||
chunk.isEditing = false;
|
chunk.isEditing = false;
|
||||||
ElMessage.success('保存成功');
|
ElMessage.success('保存成功');
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('保存失败:', error);
|
ElMessage.error('保存失败');
|
||||||
// 模拟成功
|
|
||||||
chunk.content = chunk.editContent;
|
|
||||||
chunk.charCount = chunk.editContent.length;
|
|
||||||
chunk.isEditing = false;
|
|
||||||
ElMessage.success('保存成功');
|
|
||||||
} finally {
|
} finally {
|
||||||
chunk.saving = false;
|
chunk.saving = false;
|
||||||
}
|
}
|
||||||
@@ -211,12 +191,8 @@ const onDeleteChunk = (chunk: any) => {
|
|||||||
await deleteDocumentChunk(chunk.id);
|
await deleteDocumentChunk(chunk.id);
|
||||||
ElMessage.success('删除成功');
|
ElMessage.success('删除成功');
|
||||||
getChunkList();
|
getChunkList();
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('删除失败:', error);
|
ElMessage.error('删除失败');
|
||||||
// 模拟成功
|
|
||||||
ElMessage.success('删除成功');
|
|
||||||
tableData.data = tableData.data.filter(item => item.id !== chunk.id);
|
|
||||||
tableData.total--;
|
|
||||||
}
|
}
|
||||||
}).catch(() => {});
|
}).catch(() => {});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ const formattedContent = computed(() => {
|
|||||||
.replace(/</g, '<')
|
.replace(/</g, '<')
|
||||||
.replace(/>/g, '>')
|
.replace(/>/g, '>')
|
||||||
.replace(/\n/g, '<br>')
|
.replace(/\n/g, '<br>')
|
||||||
.replace(/ /g, ' ');
|
.replace(/ {2}/g, ' ');
|
||||||
});
|
});
|
||||||
|
|
||||||
// 获取文件图标颜色
|
// 获取文件图标颜色
|
||||||
@@ -222,31 +222,9 @@ const openDialog = async (row: any) => {
|
|||||||
if (contentRes.data) {
|
if (contentRes.data) {
|
||||||
documentContent.value = contentRes.data.content || '';
|
documentContent.value = contentRes.data.content || '';
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('获取文档详情失败:', error);
|
documentContent.value = '';
|
||||||
// 模拟内容
|
ElMessage.error('获取文档详情失败');
|
||||||
documentContent.value = `这是文档【${row.name}】的示例内容。
|
|
||||||
|
|
||||||
在实际应用中,这里会显示文档的原始文本内容。
|
|
||||||
|
|
||||||
文档处理流程:
|
|
||||||
1. 上传文档到系统
|
|
||||||
2. 系统自动解析文档内容
|
|
||||||
3. 对内容进行分段处理
|
|
||||||
4. 生成向量索引
|
|
||||||
5. 完成知识库构建
|
|
||||||
|
|
||||||
支持的文档格式:
|
|
||||||
- PDF 文档
|
|
||||||
- Word 文档 (.docx)
|
|
||||||
- 纯文本文件 (.txt)
|
|
||||||
- Markdown 文件 (.md)
|
|
||||||
- HTML 文件
|
|
||||||
|
|
||||||
注意事项:
|
|
||||||
- 单个文件大小不超过 20MB
|
|
||||||
- 建议使用标准格式的文档
|
|
||||||
- 复杂表格可能需要特殊处理`;
|
|
||||||
} finally {
|
} finally {
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -195,12 +195,8 @@ const onSubmit = async () => {
|
|||||||
ElMessage.success(`成功上传 ${fileList.value.length} 个文件`);
|
ElMessage.success(`成功上传 ${fileList.value.length} 个文件`);
|
||||||
isShowDialog.value = false;
|
isShowDialog.value = false;
|
||||||
emit('getDocumentList');
|
emit('getDocumentList');
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('上传失败:', error);
|
ElMessage.error('上传失败,请重试');
|
||||||
// 模拟成功
|
|
||||||
ElMessage.success(`成功上传 ${fileList.value.length} 个文件`);
|
|
||||||
isShowDialog.value = false;
|
|
||||||
emit('getDocumentList');
|
|
||||||
} finally {
|
} finally {
|
||||||
submitLoading.value = false;
|
submitLoading.value = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,7 +66,7 @@
|
|||||||
|
|
||||||
<div
|
<div
|
||||||
class="chunk-item"
|
class="chunk-item"
|
||||||
v-for="(chunk, index) in filteredChunks"
|
v-for="chunk in filteredChunks"
|
||||||
:key="chunk.id"
|
:key="chunk.id"
|
||||||
>
|
>
|
||||||
<div class="chunk-checkbox">
|
<div class="chunk-checkbox">
|
||||||
@@ -115,6 +115,7 @@ export default {
|
|||||||
import { ref, reactive, computed, onMounted } from 'vue';
|
import { ref, reactive, computed, onMounted } from 'vue';
|
||||||
import { useRoute, useRouter } from 'vue-router';
|
import { useRoute, useRouter } from 'vue-router';
|
||||||
import { ElMessage } from 'element-plus';
|
import { ElMessage } from 'element-plus';
|
||||||
|
import { getDocument, listDocumentChunks, previewDocument } from '/@/api/knowledge/document';
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
@@ -150,8 +151,8 @@ const selectAll = ref(false);
|
|||||||
// 过滤后的切片列表
|
// 过滤后的切片列表
|
||||||
const filteredChunks = computed(() => {
|
const filteredChunks = computed(() => {
|
||||||
if (!chunkSearch.value) return chunkList.value;
|
if (!chunkSearch.value) return chunkList.value;
|
||||||
return chunkList.value.filter(chunk =>
|
return chunkList.value.filter((chunk) =>
|
||||||
chunk.content.toLowerCase().includes(chunkSearch.value.toLowerCase())
|
(chunk.content || '').toLowerCase().includes(chunkSearch.value.toLowerCase())
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -171,14 +172,14 @@ const truncateText = (text: string, maxLength: number) => {
|
|||||||
|
|
||||||
// 返回知识库列表
|
// 返回知识库列表
|
||||||
const onBackToKnowledge = () => {
|
const onBackToKnowledge = () => {
|
||||||
router.push('/knowledge');
|
router.push('/knowledge/dataset');
|
||||||
};
|
};
|
||||||
|
|
||||||
// 返回数据集详情
|
// 返回数据集详情
|
||||||
const onBackToDataset = () => {
|
const onBackToDataset = () => {
|
||||||
router.push({
|
router.push({
|
||||||
path: '/knowledge',
|
path: '/knowledge/document',
|
||||||
query: { datasetId: datasetId.value, datasetName: datasetName.value }
|
query: { datasetId: datasetId.value, datasetName: datasetName.value },
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -186,17 +187,19 @@ const onBackToDataset = () => {
|
|||||||
const getDocumentDetail = async () => {
|
const getDocumentDetail = async () => {
|
||||||
contentLoading.value = true;
|
contentLoading.value = true;
|
||||||
try {
|
try {
|
||||||
// 模拟数据
|
const [detailRes, contentRes] = await Promise.all([getDocument(documentId.value), previewDocument(documentId.value)]);
|
||||||
documentInfo.id = documentId.value;
|
const detail = detailRes.data || {};
|
||||||
documentInfo.name = route.query.docName as string || '456_product(1).txt';
|
documentInfo.id = detail.id || documentId.value;
|
||||||
documentInfo.fileType = 'txt';
|
documentInfo.name = detail.name || (route.query.docName as string) || '';
|
||||||
documentInfo.fileSize = 10;
|
documentInfo.fileType = detail.fileType || '';
|
||||||
documentInfo.createdAt = '22/01/2026 00:53:32';
|
documentInfo.fileSize = detail.fileSize || 0;
|
||||||
|
documentInfo.createdAt = detail.createdAt || '';
|
||||||
// 模拟文档内容
|
const contentData = contentRes.data;
|
||||||
documentContent.value = '<p>123</p>';
|
documentContent.value =
|
||||||
} catch (error) {
|
typeof contentData === 'string' ? contentData : contentData?.content || contentData?.text || '';
|
||||||
console.error('获取文档详情失败:', error);
|
} catch (_error) {
|
||||||
|
ElMessage.error('获取文档详情失败');
|
||||||
|
documentContent.value = '';
|
||||||
} finally {
|
} finally {
|
||||||
contentLoading.value = false;
|
contentLoading.value = false;
|
||||||
}
|
}
|
||||||
@@ -206,18 +209,21 @@ const getDocumentDetail = async () => {
|
|||||||
const getChunkList = async () => {
|
const getChunkList = async () => {
|
||||||
chunkLoading.value = true;
|
chunkLoading.value = true;
|
||||||
try {
|
try {
|
||||||
// 模拟数据
|
const res: any = await listDocumentChunks({
|
||||||
chunkList.value = [
|
documentId: documentId.value,
|
||||||
{
|
pageNum: chunkPage.value,
|
||||||
id: '1',
|
pageSize: chunkPageSize.value,
|
||||||
content: '123',
|
});
|
||||||
enabled: true,
|
chunkList.value = (res.data?.list || []).map((item: any) => ({
|
||||||
selected: false,
|
...item,
|
||||||
},
|
enabled: true,
|
||||||
];
|
selected: false,
|
||||||
chunkTotal.value = 1;
|
}));
|
||||||
} catch (error) {
|
chunkTotal.value = res.data?.total || 0;
|
||||||
console.error('获取切片列表失败:', error);
|
} catch (_error) {
|
||||||
|
chunkList.value = [];
|
||||||
|
chunkTotal.value = 0;
|
||||||
|
ElMessage.error('获取切片列表失败');
|
||||||
} finally {
|
} finally {
|
||||||
chunkLoading.value = false;
|
chunkLoading.value = false;
|
||||||
}
|
}
|
||||||
@@ -225,14 +231,14 @@ const getChunkList = async () => {
|
|||||||
|
|
||||||
// 全选变化
|
// 全选变化
|
||||||
const onSelectAllChange = (val: boolean) => {
|
const onSelectAllChange = (val: boolean) => {
|
||||||
chunkList.value.forEach(chunk => {
|
chunkList.value.forEach((chunk) => {
|
||||||
chunk.selected = val;
|
chunk.selected = val;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// 切片状态变化
|
// 切片状态变化
|
||||||
const onChunkStatusChange = (chunk: any) => {
|
const onChunkStatusChange = (_chunk: any) => {
|
||||||
ElMessage.success(chunk.enabled ? '已启用' : '已禁用');
|
ElMessage.info('切片启停功能暂未开放');
|
||||||
};
|
};
|
||||||
|
|
||||||
// 添加切片
|
// 添加切片
|
||||||
@@ -242,10 +248,14 @@ const onAddChunk = () => {
|
|||||||
|
|
||||||
// 初始化
|
// 初始化
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
datasetId.value = route.query.datasetId as string || '';
|
datasetId.value = (route.query.datasetId as string) || '';
|
||||||
datasetName.value = route.query.datasetName as string || 'dataset_tenant_1';
|
datasetName.value = (route.query.datasetName as string) || '';
|
||||||
documentId.value = route.query.docId as string || '';
|
documentId.value = (route.query.docId as string) || '';
|
||||||
|
if (!documentId.value) {
|
||||||
|
ElMessage.warning('缺少文档ID,无法查看详情');
|
||||||
|
onBackToDataset();
|
||||||
|
return;
|
||||||
|
}
|
||||||
getDocumentDetail();
|
getDocumentDetail();
|
||||||
getChunkList();
|
getChunkList();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -46,11 +46,11 @@
|
|||||||
<el-icon><ele-Refresh /></el-icon>
|
<el-icon><ele-Refresh /></el-icon>
|
||||||
重置
|
重置
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button size="default" type="success" @click="onOpenUpload">
|
<el-button size="default" type="success" @click="onOpenUpload" v-auth="'api/v1/knowledge/document/upload'">
|
||||||
<el-icon><ele-Upload /></el-icon>
|
<el-icon><ele-Upload /></el-icon>
|
||||||
上传文档
|
上传文档
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button size="default" type="danger" @click="onBatchDelete" :disabled="selectedIds.length === 0">
|
<el-button size="default" type="danger" @click="onBatchDelete" :disabled="selectedIds.length === 0" v-auth="'api/v1/knowledge/document/batchDelete'">
|
||||||
<el-icon><ele-Delete /></el-icon>
|
<el-icon><ele-Delete /></el-icon>
|
||||||
批量删除
|
批量删除
|
||||||
</el-button>
|
</el-button>
|
||||||
@@ -103,9 +103,9 @@
|
|||||||
<el-table-column label="操作" width="200" fixed="right" align="center">
|
<el-table-column label="操作" width="200" fixed="right" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button size="small" text type="primary" @click="onPreview(scope.row)">预览</el-button>
|
<el-button size="small" text type="primary" @click="onPreview(scope.row)">预览</el-button>
|
||||||
<el-button size="small" text type="success" @click="onViewChunks(scope.row)">分段</el-button>
|
<el-button size="small" text type="success" @click="onViewChunks(scope.row)" v-auth="'api/v1/knowledge/document/chunks'">分段</el-button>
|
||||||
<el-button size="small" text type="warning" @click="onReprocess(scope.row)" v-if="scope.row.status === 'failed'">重试</el-button>
|
<el-button size="small" text type="warning" @click="onReprocess(scope.row)" v-if="scope.row.status === 'failed'" v-auth="'api/v1/knowledge/document/reprocess'">重试</el-button>
|
||||||
<el-button size="small" text type="danger" @click="onRowDel(scope.row)">删除</el-button>
|
<el-button size="small" text type="danger" @click="onRowDel(scope.row)" v-auth="'api/v1/knowledge/document/delete'">删除</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@@ -190,14 +190,9 @@ const getDatasetOptions = async () => {
|
|||||||
try {
|
try {
|
||||||
const res: any = await listDatasets({ pageNum: 1, pageSize: 1000 });
|
const res: any = await listDatasets({ pageNum: 1, pageSize: 1000 });
|
||||||
datasetOptions.value = res.data?.list || [];
|
datasetOptions.value = res.data?.list || [];
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('获取数据集列表失败:', error);
|
datasetOptions.value = [];
|
||||||
// 模拟数据
|
ElMessage.error('获取数据集列表失败');
|
||||||
datasetOptions.value = [
|
|
||||||
{ id: '1', name: '产品知识库' },
|
|
||||||
{ id: '2', name: '常见问题FAQ' },
|
|
||||||
{ id: '3', name: '数据报表' },
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -212,65 +207,10 @@ const getDocumentList = async () => {
|
|||||||
const res: any = await listDocuments(params);
|
const res: any = await listDocuments(params);
|
||||||
tableData.data = res.data?.list || [];
|
tableData.data = res.data?.list || [];
|
||||||
tableData.total = res.data?.total || 0;
|
tableData.total = res.data?.total || 0;
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('获取文档列表失败:', error);
|
tableData.data = [];
|
||||||
// 模拟数据
|
tableData.total = 0;
|
||||||
tableData.data = [
|
ElMessage.error('获取文档列表失败');
|
||||||
{
|
|
||||||
id: '1',
|
|
||||||
name: '产品使用手册.pdf',
|
|
||||||
datasetId: '1',
|
|
||||||
datasetName: '产品知识库',
|
|
||||||
fileType: 'pdf',
|
|
||||||
fileSize: 2048000,
|
|
||||||
charCount: 15000,
|
|
||||||
chunkCount: 25,
|
|
||||||
status: 'completed',
|
|
||||||
indexStatus: 'indexed',
|
|
||||||
createdAt: '2024-01-15 10:30:00',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: '2',
|
|
||||||
name: '常见问题解答.docx',
|
|
||||||
datasetId: '2',
|
|
||||||
datasetName: '常见问题FAQ',
|
|
||||||
fileType: 'docx',
|
|
||||||
fileSize: 512000,
|
|
||||||
charCount: 8000,
|
|
||||||
chunkCount: 12,
|
|
||||||
status: 'completed',
|
|
||||||
indexStatus: 'indexed',
|
|
||||||
createdAt: '2024-01-14 14:20:00',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: '3',
|
|
||||||
name: '技术文档.md',
|
|
||||||
datasetId: '1',
|
|
||||||
datasetName: '产品知识库',
|
|
||||||
fileType: 'md',
|
|
||||||
fileSize: 128000,
|
|
||||||
charCount: 5000,
|
|
||||||
chunkCount: 8,
|
|
||||||
status: 'processing',
|
|
||||||
indexStatus: 'indexing',
|
|
||||||
createdAt: '2024-01-13 09:15:00',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: '4',
|
|
||||||
name: '错误日志.txt',
|
|
||||||
datasetId: '1',
|
|
||||||
datasetName: '产品知识库',
|
|
||||||
fileType: 'txt',
|
|
||||||
fileSize: 64000,
|
|
||||||
charCount: 3000,
|
|
||||||
chunkCount: 0,
|
|
||||||
status: 'failed',
|
|
||||||
indexStatus: 'not_indexed',
|
|
||||||
errorMessage: '文件编码不支持',
|
|
||||||
createdAt: '2024-01-12 16:45:00',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
tableData.total = 4;
|
|
||||||
} finally {
|
} finally {
|
||||||
tableData.loading = false;
|
tableData.loading = false;
|
||||||
}
|
}
|
||||||
@@ -399,10 +339,8 @@ const onReprocess = async (row: any) => {
|
|||||||
await reprocessDocument(row.id);
|
await reprocessDocument(row.id);
|
||||||
ElMessage.success('已重新提交处理');
|
ElMessage.success('已重新提交处理');
|
||||||
getDocumentList();
|
getDocumentList();
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('重新处理失败:', error);
|
ElMessage.error('重新处理失败');
|
||||||
ElMessage.success('已重新提交处理');
|
|
||||||
getDocumentList();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -422,10 +360,8 @@ const onBatchDelete = () => {
|
|||||||
await batchDeleteDocuments(selectedIds.value);
|
await batchDeleteDocuments(selectedIds.value);
|
||||||
ElMessage.success('删除成功');
|
ElMessage.success('删除成功');
|
||||||
getDocumentList();
|
getDocumentList();
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('批量删除失败:', error);
|
ElMessage.error('批量删除失败');
|
||||||
ElMessage.success('删除成功');
|
|
||||||
getDocumentList();
|
|
||||||
}
|
}
|
||||||
}).catch(() => {});
|
}).catch(() => {});
|
||||||
};
|
};
|
||||||
@@ -441,10 +377,8 @@ const onRowDel = (row: any) => {
|
|||||||
await deleteDocument(row.id);
|
await deleteDocument(row.id);
|
||||||
ElMessage.success('删除成功');
|
ElMessage.success('删除成功');
|
||||||
getDocumentList();
|
getDocumentList();
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('删除失败:', error);
|
ElMessage.error('删除失败');
|
||||||
ElMessage.success('删除成功');
|
|
||||||
getDocumentList();
|
|
||||||
}
|
}
|
||||||
}).catch(() => {});
|
}).catch(() => {});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -342,12 +342,10 @@ export default {
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, reactive, onMounted } from 'vue';
|
import { ref, reactive, onMounted } from 'vue';
|
||||||
import { useRouter } from 'vue-router';
|
|
||||||
import { ElMessage, ElMessageBox } from 'element-plus';
|
import { ElMessage, ElMessageBox } from 'element-plus';
|
||||||
import type { FormInstance, FormRules, UploadFile } from 'element-plus';
|
import type { FormInstance, FormRules, UploadFile } from 'element-plus';
|
||||||
import DocumentDetailDialog from './component/documentDetailDialog.vue';
|
import DocumentDetailDialog from './component/documentDetailDialog.vue';
|
||||||
|
import { listDatasets, createKnowledgeBase, updateKnowledgeBase, deleteDataset } from '/@/api/knowledge/dataset';
|
||||||
const router = useRouter();
|
|
||||||
|
|
||||||
// 数据集相关
|
// 数据集相关
|
||||||
const datasetLoading = ref(false);
|
const datasetLoading = ref(false);
|
||||||
@@ -402,12 +400,6 @@ const formatFileSize = (size: number) => {
|
|||||||
return (size / 1024 / 1024).toFixed(1) + ' MB';
|
return (size / 1024 / 1024).toFixed(1) + ' MB';
|
||||||
};
|
};
|
||||||
|
|
||||||
// 格式化日期
|
|
||||||
const formatDate = (date: string) => {
|
|
||||||
if (!date) return '';
|
|
||||||
return date.split(' ')[0];
|
|
||||||
};
|
|
||||||
|
|
||||||
// 获取文件图标颜色
|
// 获取文件图标颜色
|
||||||
const getFileIconColor = (fileType: string) => {
|
const getFileIconColor = (fileType: string) => {
|
||||||
const colors: Record<string, string> = {
|
const colors: Record<string, string> = {
|
||||||
@@ -436,18 +428,13 @@ const getParseStatusType = (status: string) => {
|
|||||||
const getDatasetList = async () => {
|
const getDatasetList = async () => {
|
||||||
datasetLoading.value = true;
|
datasetLoading.value = true;
|
||||||
try {
|
try {
|
||||||
// 模拟数据
|
const response = await listDatasets({
|
||||||
datasetList.value = [
|
pageNum: 1,
|
||||||
{
|
pageSize: 100
|
||||||
id: '1',
|
});
|
||||||
name: 'dataset_tenant_1',
|
datasetList.value = response.data.list || [];
|
||||||
fileCount: 3,
|
} catch (_error) {
|
||||||
totalSize: 30,
|
ElMessage.error('获取知识库列表失败');
|
||||||
createdAt: '28/01/2026 14:09:45',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
} catch (error) {
|
|
||||||
console.error('获取数据集列表失败:', error);
|
|
||||||
} finally {
|
} finally {
|
||||||
datasetLoading.value = false;
|
datasetLoading.value = false;
|
||||||
}
|
}
|
||||||
@@ -493,12 +480,17 @@ const onDeleteDataset = (item: any) => {
|
|||||||
confirmButtonText: '确定',
|
confirmButtonText: '确定',
|
||||||
cancelButtonText: '取消',
|
cancelButtonText: '取消',
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
}).then(() => {
|
}).then(async () => {
|
||||||
ElMessage.success('删除成功');
|
try {
|
||||||
if (currentDataset.value?.id === item.id) {
|
await deleteDataset(item.id);
|
||||||
currentDataset.value = null;
|
ElMessage.success('删除成功');
|
||||||
|
if (currentDataset.value?.id === item.id) {
|
||||||
|
currentDataset.value = null;
|
||||||
|
}
|
||||||
|
getDatasetList();
|
||||||
|
} catch (_error) {
|
||||||
|
ElMessage.error('删除失败,请重试');
|
||||||
}
|
}
|
||||||
getDatasetList();
|
|
||||||
}).catch(() => {});
|
}).catch(() => {});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -511,11 +503,26 @@ const onSaveDataset = async () => {
|
|||||||
if (valid) {
|
if (valid) {
|
||||||
datasetSaving.value = true;
|
datasetSaving.value = true;
|
||||||
try {
|
try {
|
||||||
|
if (datasetForm.id) {
|
||||||
|
// 更新知识库
|
||||||
|
await updateKnowledgeBase({
|
||||||
|
id: datasetForm.id,
|
||||||
|
name: datasetForm.name,
|
||||||
|
description: datasetForm.description
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// 创建知识库
|
||||||
|
await createKnowledgeBase({
|
||||||
|
name: datasetForm.name,
|
||||||
|
description: datasetForm.description
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
ElMessage.success(datasetForm.id ? '保存成功' : '创建成功');
|
ElMessage.success(datasetForm.id ? '保存成功' : '创建成功');
|
||||||
showDatasetDialog.value = false;
|
showDatasetDialog.value = false;
|
||||||
getDatasetList();
|
getDatasetList();
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('保存失败:', error);
|
ElMessage.error('保存失败,请重试');
|
||||||
} finally {
|
} finally {
|
||||||
datasetSaving.value = false;
|
datasetSaving.value = false;
|
||||||
}
|
}
|
||||||
@@ -559,8 +566,8 @@ const getFileList = async () => {
|
|||||||
parseStatus: 'general',
|
parseStatus: 'general',
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('获取文件列表失败:', error);
|
ElMessage.error('获取文件列表失败');
|
||||||
} finally {
|
} finally {
|
||||||
fileLoading.value = false;
|
fileLoading.value = false;
|
||||||
}
|
}
|
||||||
@@ -589,8 +596,8 @@ const onConfirmUpload = async () => {
|
|||||||
ElMessage.success(`成功上传 ${uploadFileList.value.length} 个文件`);
|
ElMessage.success(`成功上传 ${uploadFileList.value.length} 个文件`);
|
||||||
showUploadDialog.value = false;
|
showUploadDialog.value = false;
|
||||||
getFileList();
|
getFileList();
|
||||||
} catch (error) {
|
} catch (_error) {
|
||||||
console.error('上传失败:', error);
|
ElMessage.error('上传失败,请重试');
|
||||||
} finally {
|
} finally {
|
||||||
uploading.value = false;
|
uploading.value = false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user