|
@@ -37,7 +37,8 @@
|
|
<span class="number">文件数量</span>
|
|
<span class="number">文件数量</span>
|
|
</div>
|
|
</div>
|
|
<div :class="knowledgeBase.activeId === item.id ? 'knowledge-base-item active' : 'knowledge-base-item'"
|
|
<div :class="knowledgeBase.activeId === item.id ? 'knowledge-base-item active' : 'knowledge-base-item'"
|
|
- v-for="item in knowledgeBase.data" :key="item.id" @click="handleKnowledgeBaseClick(toRaw(item))">
|
|
|
|
|
|
+ v-for="(item, index) in knowledgeBase.data" :key="item.id"
|
|
|
|
+ @click="handleKnowledgeBaseClick(toRaw(item), index)">
|
|
<span class="name">
|
|
<span class="name">
|
|
<span class="icon">
|
|
<span class="icon">
|
|
<span class="document-icon"></span>
|
|
<span class="document-icon"></span>
|
|
@@ -81,12 +82,20 @@
|
|
<i :class="`${row.file_type}-icon`"></i>
|
|
<i :class="`${row.file_type}-icon`"></i>
|
|
</span>
|
|
</span>
|
|
<span class="text-area">
|
|
<span class="text-area">
|
|
- {{ row.file_name }}
|
|
|
|
|
|
+ <el-text style="vertical-align: bottom;width: 100%;" line-clamp="1">
|
|
|
|
+ {{ row.file_name }}
|
|
|
|
+ </el-text>
|
|
</span>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table-column>
|
|
- <el-table-column prop="knowledge_type" label="知识类型" />
|
|
|
|
|
|
+ <el-table-column prop="knowledge_type" label="知识类型">
|
|
|
|
+ <template #default="{ row }">
|
|
|
|
+ <el-text line-clamp="1" style="vertical-align: bottom;">
|
|
|
|
+ {{ row.knowledge_type }}
|
|
|
|
+ </el-text>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
<el-table-column prop="version" label="版本" />
|
|
<el-table-column prop="version" label="版本" />
|
|
<el-table-column prop="author" label="作者(主编)" />
|
|
<el-table-column prop="author" label="作者(主编)" />
|
|
<el-table-column prop="year" label="年份" />
|
|
<el-table-column prop="year" label="年份" />
|
|
@@ -179,6 +188,7 @@ type kbData = {
|
|
type knowledgeBaseType = {
|
|
type knowledgeBaseType = {
|
|
visible: boolean,
|
|
visible: boolean,
|
|
activeId: number | string,
|
|
activeId: number | string,
|
|
|
|
+ activeIndex: number,
|
|
querySearch: string,
|
|
querySearch: string,
|
|
data: kbData[],
|
|
data: kbData[],
|
|
filesList: any[]
|
|
filesList: any[]
|
|
@@ -187,13 +197,16 @@ type knowledgeBaseType = {
|
|
let knowledgeBase = ref<knowledgeBaseType>({
|
|
let knowledgeBase = ref<knowledgeBaseType>({
|
|
visible: false,
|
|
visible: false,
|
|
activeId: 0,
|
|
activeId: 0,
|
|
|
|
+ activeIndex: -1,
|
|
querySearch: "",
|
|
querySearch: "",
|
|
data: [],
|
|
data: [],
|
|
filesList: [],
|
|
filesList: [],
|
|
selectedNum: 0,
|
|
selectedNum: 0,
|
|
|
|
+
|
|
})
|
|
})
|
|
-function handleKnowledgeBaseClick(data: kbData) {
|
|
|
|
|
|
+function handleKnowledgeBaseClick(data: kbData, index: number) {
|
|
knowledgeBase.value.activeId = data.id
|
|
knowledgeBase.value.activeId = data.id
|
|
|
|
+ knowledgeBase.value.activeIndex = index
|
|
paginationData.value.currentPage = 1
|
|
paginationData.value.currentPage = 1
|
|
}
|
|
}
|
|
function handleGetKBfileList() {
|
|
function handleGetKBfileList() {
|
|
@@ -208,8 +221,8 @@ function handleGetKBfileList() {
|
|
knowledgeBase.value.filesList = data.list
|
|
knowledgeBase.value.filesList = data.list
|
|
for (let i = 0; i < knowledgeBase.value.filesList.length; i++) {
|
|
for (let i = 0; i < knowledgeBase.value.filesList.length; i++) {
|
|
knowledgeBase.value.filesList[i].index = (paginationData.value.currentPage - 1) * paginationData.value.currentPageSize + i + 1
|
|
knowledgeBase.value.filesList[i].index = (paginationData.value.currentPage - 1) * paginationData.value.currentPageSize + i + 1
|
|
- knowledgeBase.value.filesList[i].isValid = true
|
|
|
|
- checkLinkValidity(i, knowledgeBase.value.filesList[i].minio_url)
|
|
|
|
|
|
+ // knowledgeBase.value.filesList[i].isValid = true
|
|
|
|
+ // checkLinkValidity(i, knowledgeBase.value.filesList[i].minio_url)
|
|
}
|
|
}
|
|
paginationData.value.total = data.total
|
|
paginationData.value.total = data.total
|
|
}
|
|
}
|
|
@@ -278,7 +291,22 @@ function handleGetKnowledgeBase() {
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
|
|
-function handleAllImport() {
|
|
|
|
|
|
+async function handleAllImport() {
|
|
|
|
+ try {
|
|
|
|
+ const res = await getKnowledgeBaseFilesList({
|
|
|
|
+ file_name: "",
|
|
|
|
+ pageSize: knowledgeBase.value.data[knowledgeBase.value.activeIndex].file_count,
|
|
|
|
+ pageNo: 1,
|
|
|
|
+ kbId: knowledgeBase.value.activeId
|
|
|
|
+ })
|
|
|
|
+ const { data, code } = res
|
|
|
|
+ if (code === 200) {
|
|
|
|
+ handleImportFiles(data.list)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ } catch (e) {
|
|
|
|
+ console.log(e)
|
|
|
|
+ }
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -347,7 +375,7 @@ async function calculateFileHashForNative(file: File) {
|
|
}
|
|
}
|
|
|
|
|
|
// 使用crypto-js计算文件的hash值 ,该方法易发生卡顿
|
|
// 使用crypto-js计算文件的hash值 ,该方法易发生卡顿
|
|
-async function calculateFileHashForCryptoJS(file: File) {
|
|
|
|
|
|
+async function calculateFileHashForCryptoJS(file: File): Promise<string> {
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
try {
|
|
try {
|
|
const reader = new FileReader();
|
|
const reader = new FileReader();
|
|
@@ -357,13 +385,12 @@ async function calculateFileHashForCryptoJS(file: File) {
|
|
// 将 ArrayBuffer 转换为 CryptoJS 可以处理的 WordArray
|
|
// 将 ArrayBuffer 转换为 CryptoJS 可以处理的 WordArray
|
|
const wordArray = CryptoJS.lib.WordArray.create(arrayBuffer);
|
|
const wordArray = CryptoJS.lib.WordArray.create(arrayBuffer);
|
|
// 计算文件的 SHA-256 哈希值并转为 Base64 编码字符串
|
|
// 计算文件的 SHA-256 哈希值并转为 Base64 编码字符串
|
|
- const hashBase64 = CryptoJS.SHA256(wordArray).toString(CryptoJS.enc.Base64);
|
|
|
|
|
|
+ // const hashBase64 = CryptoJS.SHA256(wordArray).toString(CryptoJS.enc.Base64);
|
|
// 计算文件的 SHA-256 哈希值并转为 16 进制字符串
|
|
// 计算文件的 SHA-256 哈希值并转为 16 进制字符串
|
|
const hashHex = CryptoJS.SHA256(wordArray).toString(CryptoJS.enc.hex);
|
|
const hashHex = CryptoJS.SHA256(wordArray).toString(CryptoJS.enc.hex);
|
|
// console.log('calculateFileHashForCryptoJS:', hashHex);
|
|
// console.log('calculateFileHashForCryptoJS:', hashHex);
|
|
resolve(hashHex)
|
|
resolve(hashHex)
|
|
};
|
|
};
|
|
-
|
|
|
|
reader.onerror = () => {
|
|
reader.onerror = () => {
|
|
reject('')
|
|
reject('')
|
|
}
|
|
}
|
|
@@ -439,8 +466,11 @@ const handleExceed: UploadProps['onExceed'] = (files) => {
|
|
upload.value!.handleStart(file)
|
|
upload.value!.handleStart(file)
|
|
}
|
|
}
|
|
|
|
|
|
-const handleRemove = (file: any, fileList: any) => {
|
|
|
|
- console.log(file, fileList)
|
|
|
|
|
|
+const handleRemove = async (file: any, fileList: any) => {
|
|
|
|
+ const hashHex: string = await calculateFileHashForCryptoJS(file.raw)
|
|
|
|
+ const hashHexIndex = importedFileHashes.value.indexOf(hashHex)
|
|
|
|
+ importedFileHashes.value.splice(hashHexIndex, 1)
|
|
|
|
+ // console.log(file, fileList)
|
|
}
|
|
}
|
|
|
|
|
|
async function calculateFileHash(file: File) {
|
|
async function calculateFileHash(file: File) {
|
|
@@ -802,9 +832,17 @@ footer {
|
|
}
|
|
}
|
|
|
|
|
|
.list-name {
|
|
.list-name {
|
|
- white-space: nowrap;
|
|
|
|
- text-overflow: ellipsis;
|
|
|
|
- display: inline;
|
|
|
|
|
|
+ display: flex;
|
|
|
|
+ flex-wrap: nowrap;
|
|
|
|
+ align-items: center;
|
|
|
|
+
|
|
|
|
+ .icon-area {
|
|
|
|
+ flex: 0 0 auto;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .text-area {
|
|
|
|
+ flex: 1 1 auto;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
.circle {
|
|
.circle {
|