Просмотр исходного кода

修改空白值联动问题,预览空白值不展示及添加知识库检索条件等问题

yangg 10 месяцев назад
Родитель
Сommit
e805c9b8b9
32 измененных файлов с 364 добавлено и 39 удалено
  1. 0 0
      dist/index.html
  2. 0 0
      dist/static/css/app.d60e20ec.css
  3. 1 0
      dist/static/css/chunk-2b49eda5.b34e6023.css
  4. 0 1
      dist/static/css/chunk-458af7b3.930e9e5b.css
  5. 1 1
      dist/static/css/chunk-5de18842.e4ab6163.css
  6. 0 0
      dist/static/css/chunk-6d4c5c86.8d28e945.css
  7. 0 0
      dist/static/css/chunk-795b9239.ce959b8e.css
  8. 0 0
      dist/static/css/chunk-f9aa40ec.a5bdf00d.css
  9. 0 0
      dist/static/js/app.c63e192e.js
  10. 0 0
      dist/static/js/chunk-165ce1a5.c5758128.js
  11. 0 0
      dist/static/js/chunk-173d8910.f2cffa49.js
  12. 0 0
      dist/static/js/chunk-2b49eda5.3d263fce.js
  13. 0 0
      dist/static/js/chunk-2d22d9b8.3f135adb.js
  14. 0 0
      dist/static/js/chunk-458af7b3.1bb339c3.js
  15. 0 0
      dist/static/js/chunk-5de18842.25b67f84.js
  16. 0 0
      dist/static/js/chunk-6d4c5c86.84dfc822.js
  17. 0 0
      dist/static/js/chunk-795b9239.a0f3f90a.js
  18. 0 0
      dist/static/js/chunk-b53a1e22.6fe3240f.js
  19. 0 0
      dist/static/js/chunk-bf1dc724.b68d6fcd.js
  20. 0 0
      dist/static/js/chunk-f9aa40ec.702e8cb7.js
  21. 9 0
      src/api/knowledge.js
  22. 1 1
      src/router/index.js
  23. 6 0
      src/styles/index.scss
  24. 77 0
      src/views/document/com/components/TextArea/index.vue
  25. 50 1
      src/views/document/com/components/TextView/index.vue
  26. 43 14
      src/views/document/com/editor.vue
  27. 2 0
      src/views/document/com/view.vue
  28. 9 5
      src/views/document/create.vue
  29. 2 1
      src/views/knowledgeMenu/category/components/dataList.vue
  30. 36 8
      src/views/knowledgeMenu/category/components/dataSearch.vue
  31. 126 7
      src/views/knowledgeMenu/category/infoList.vue
  32. 1 0
      src/views/knowledgeMenu/index.scss

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/index.html


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/static/css/app.d60e20ec.css


+ 1 - 0
dist/static/css/chunk-2b49eda5.b34e6023.css

@@ -0,0 +1 @@
+.project-search[data-v-659a1004]{display:-webkit-box;display:-ms-flexbox;display:flex;padding:10px;font-size:12px}.listClass[data-v-659a1004]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.excel-table[data-v-659a1004]{width:100%;overflow-y:auto}.excel-table table[data-v-659a1004]{border-collapse:collapse;width:100%;margin-bottom:20px}.excel-table td[data-v-659a1004],.excel-table th[data-v-659a1004]{border:1px solid #ddd;padding:8px;text-align:left;white-space:nowrap}.excel-table th[data-v-659a1004]{background-color:#f2f2f2;font-weight:700;position:sticky;top:0;z-index:1}.excel-table tr[data-v-659a1004]:nth-child(2n){background-color:#f9f9f9}.no-data[data-v-659a1004]{font-size:18px;color:#909399;text-align:center;margin-top:50px}

+ 0 - 1
dist/static/css/chunk-458af7b3.930e9e5b.css

@@ -1 +0,0 @@
-.project-search[data-v-18d44586]{display:-webkit-box;display:-ms-flexbox;display:flex;padding:10px;font-size:12px}.listClass[data-v-18d44586]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}

+ 1 - 1
dist/static/css/chunk-5de18842.a7dce319.css → dist/static/css/chunk-5de18842.e4ab6163.css

@@ -1 +1 @@
-.ledge_box .data-search[data-v-9280b1dc]{padding:20px 10px 0 10px}.ledge_box .data-list[data-v-9280b1dc]{padding:10px;min-height:200px;position:relative}.ledge_box .data-list .time[data-v-9280b1dc]{font-size:13px;color:#999}.ledge_box .data-list .bottom[data-v-9280b1dc]{margin-top:13px;line-height:12px}.ledge_box .data-list .button[data-v-9280b1dc]{padding:0;float:right}.ledge_box .data-list .image[data-v-9280b1dc]{width:100%;display:block}.ledge_box .data-list .clearfix[data-v-9280b1dc]:after,.ledge_box .data-list .clearfix[data-v-9280b1dc]:before{display:table;content:""}.ledge_box .data-list .clearfix[data-v-9280b1dc]:after{clear:both}.ledge_box .data-list .card_box[data-v-9280b1dc]{padding:20px}.ledge_box .data-list .card_box .header[data-v-9280b1dc]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ledge_box .data-list .card-col[data-v-9280b1dc]{margin-bottom:30px}.ledge_box .data-list .card-col .card_box[data-v-9280b1dc]{height:235px}.ledge_box .data-list .card-col .card_box .box_content[data-v-9280b1dc]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;height:100%}.ledge_box .data-list .card-col .card_box .box_content .content[data-v-9280b1dc]{font-size:24px;line-height:32px;font-weight:600;color:rgba(0,0,0,.8784313725490196);word-break:break-all}.ledge_box .data-list .card-col .card_box .box_content .footer[data-v-9280b1dc]{font-size:12px;font-weight:600;color:rgba(0,0,0,.6509803921568628);vertical-align:middle}
+.ledge_box .data-search[data-v-9280b1dc]{padding:20px 10px 0 10px}.ledge_box .data-list[data-v-9280b1dc]{padding:10px;min-height:200px;position:relative}.ledge_box .data-list .time[data-v-9280b1dc]{font-size:13px;color:#999}.ledge_box .data-list .bottom[data-v-9280b1dc]{margin-top:13px;line-height:12px}.ledge_box .data-list .button[data-v-9280b1dc]{padding:0;float:right}.ledge_box .data-list .image[data-v-9280b1dc]{width:100%;display:block}.ledge_box .data-list .clearfix[data-v-9280b1dc]:after,.ledge_box .data-list .clearfix[data-v-9280b1dc]:before{display:table;content:""}.ledge_box .data-list .clearfix[data-v-9280b1dc]:after{clear:both}.ledge_box .data-list .card_box[data-v-9280b1dc]{padding:20px}.ledge_box .data-list .card_box .header[data-v-9280b1dc]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ledge_box .data-list .card-col[data-v-9280b1dc]{margin-bottom:30px}.ledge_box .data-list .card-col .card_box[data-v-9280b1dc]{height:235px}.ledge_box .data-list .card-col .card_box .box_content[data-v-9280b1dc]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;height:100%}.ledge_box .data-list .card-col .card_box .box_content .content[data-v-9280b1dc]{font-size:24px;line-height:32px;font-weight:600;cursor:pointer;color:rgba(0,0,0,.8784313725490196);word-break:break-all}.ledge_box .data-list .card-col .card_box .box_content .footer[data-v-9280b1dc]{font-size:12px;font-weight:600;color:rgba(0,0,0,.6509803921568628);vertical-align:middle}

+ 0 - 0
dist/static/css/chunk-bf1dc724.8d28e945.css → dist/static/css/chunk-6d4c5c86.8d28e945.css


+ 0 - 0
dist/static/css/chunk-b53a1e22.ce959b8e.css → dist/static/css/chunk-795b9239.ce959b8e.css


+ 0 - 0
dist/static/css/chunk-165ce1a5.a5bdf00d.css → dist/static/css/chunk-f9aa40ec.a5bdf00d.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/static/js/app.c63e192e.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/static/js/chunk-165ce1a5.c5758128.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/static/js/chunk-173d8910.f2cffa49.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/static/js/chunk-2b49eda5.3d263fce.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/static/js/chunk-2d22d9b8.3f135adb.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/static/js/chunk-458af7b3.1bb339c3.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/static/js/chunk-5de18842.25b67f84.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/static/js/chunk-6d4c5c86.84dfc822.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/static/js/chunk-795b9239.a0f3f90a.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/static/js/chunk-b53a1e22.6fe3240f.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/static/js/chunk-bf1dc724.b68d6fcd.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/static/js/chunk-f9aa40ec.702e8cb7.js


+ 9 - 0
src/api/knowledge.js

@@ -100,4 +100,13 @@ export function batchAnalysis(data) {
     method: 'post',
     data
   })
+}
+/* 获取类型 */
+
+export function getSuffixName(data) {
+  return request({
+    url: '/kbm/getSuffixName',
+    method: 'post',
+    data
+  })
 }

+ 1 - 1
src/router/index.js

@@ -266,7 +266,7 @@ export const asyncRoutes = [
 
 
 
-      /* {
+       /*{
         path: 'dataCenter/index',
         component: () => import('@/views/dataCenter/search'),
         name: 'dataCenter',

+ 6 - 0
src/styles/index.scss

@@ -214,6 +214,12 @@ aside {
   min-width:50px;
   text-align:center;
 }
+.text-input-boxs{
+  border:none;
+  border-bottom:1px solid #CCC;
+  min-width:50px;
+  text-align:center;
+}
 h1{
   font-size:18px;
   font-weight: bold;

+ 77 - 0
src/views/document/com/components/TextArea/index.vue

@@ -133,6 +133,7 @@ export default {
       progress: 0,
       isEditing: false,
       focusedInputId: null,
+      variableNullInputs: {},
     };
   },
   mounted() {
@@ -143,6 +144,8 @@ export default {
   // 记得在组件销毁时移除事件监听器
   beforeDestroy() {
     this.$el.removeEventListener("input", this.handleInputChange);
+    this.$el.removeEventListener("input", this.handleVariableNullInput);
+    this.$el.removeEventListener("blur", this.handleVariableNullBlur, true);
   },
   methods: {
     async replaceData(data) {
@@ -197,6 +200,33 @@ export default {
                 '">'
             );
           }
+        } else if (_this.com.attrs[i].type == "variableNull") {
+          let item = _this.com.attrs[i];
+          // 使用唯一的标识符来初始化每个输入框的值
+          this.variableNullInputs[attrId] = item.content;
+          data = data.replace(
+            "{{" + attrId + "}}",
+            '<input type="text" ' +
+              'ref="input_' +
+              attrId +
+              '" ' +
+              'name="' +
+              item.name +
+              '" ' +
+              'id="' +
+              attrId +
+              '" ' +
+              'data-index="' +
+              i +
+              '" ' +
+              'data-attr-id="' +
+              attrId +
+              '" ' +
+              'class="text-input-boxs auto-width" ' +
+              'value="' +
+              item.content +
+              '">'
+          );
         } else if (_this.com.attrs[i].type == "ProductAttr") {
           //处理产品属性值
           let item = _this.com.attrs[i];
@@ -325,9 +355,56 @@ export default {
       this.$nextTick(() => {
         this.addInputListeners();
         this.initializeInputWidths();
+        this.addVariableNullListeners();
       });
       return data;
     },
+    // 新增方法:为 variableNull 类型的输入框添加事件监听器
+    addVariableNullListeners() {
+      this.$el.addEventListener("input", this.handleVariableNullInput);
+      this.$el.addEventListener("blur", this.handleVariableNullBlur, true);
+    },
+
+    handleVariableNullInput(event) {
+      if (event.target.classList.contains("text-input-boxs")) {
+        const attrId = event.target.dataset.attrId;
+        const newValue = event.target.value;
+        // 只更新特定输入框的值
+        this.$set(this.variableNullInputs, attrId, newValue);
+      }
+    },
+
+    handleVariableNullBlur(event) {
+      if (event.target.classList.contains("text-input-boxs")) {
+        const index = parseInt(event.target.dataset.index, 10);
+        const attrId = event.target.dataset.attrId;
+        const newValue = this.variableNullInputs[attrId];
+        // 只更新特定属性的内容
+        this.updateVariableNullContent(index, attrId, newValue, true);
+      }
+    },
+
+    updateVariableNullContent(index, attrId, newValue, emitEvent = false) {
+      if (this.com && this.com.attrs && this.com.attrs[index]) {
+        if (this.com.attrs[index].id === attrId) {
+          // 只更新特定属性的内容
+          this.$set(this.com.attrs[index], "content", newValue);
+
+          // 更新输入框的值
+          this.$nextTick(() => {
+            const input = this.$el.querySelector(`#${attrId}`);
+            if (input) {
+              input.value = newValue;
+            }
+          });
+
+          // 触发事件
+          if (emitEvent) {
+            this.$emit("onUpdata", this.currentIndex, index, attrId, newValue);
+          }
+        }
+      }
+    },
     addInputListeners() {
       // 使用事件委托来处理所有的 .text-input-box 元素
       this.$el.addEventListener("blur", this.handleInputChange, true);

+ 50 - 1
src/views/document/com/components/TextView/index.vue

@@ -109,7 +109,24 @@ export default {
                 '">'
             );
           }
-        } else if (_this.com.attrs[i].type == "ProductAttr") {
+        }else if(_this.com.attrs[i].type == "variableNull"){
+          let item = _this.com.attrs[i];
+          data = data.replace(
+              "{{" + attrId + "}}",
+              '<input type="text" ref="input_' +
+                attrId +
+                '" name="' +
+                _this.com.attrs[i].name +
+                '" id="' +
+                attrId +
+                '"  data-index="' +
+                i +
+                '" class="text-input-boxs auto-width" value="' +
+                _this.com.attrs[i].content +
+                '">'
+            );
+
+        }  else if (_this.com.attrs[i].type == "ProductAttr") {
           //处理产品属性值
           let item = _this.com.attrs[i];
           let prodAttrId = item.id + "_" + i;
@@ -200,8 +217,40 @@ export default {
           data = data.replace("{{" + attrId + "}}", _this.com.attrs[i].content);
         }
       }
+      this.$nextTick(() => {
+        this.addInputListeners()
+        this.autoWidths()
+      });
       return data;
     },
+    addInputListeners() {
+      // 使用事件委托来处理所有的 .text-input-box 元素
+      this.$el.addEventListener("input", this.adjustAutoWidth, true);
+    },
+    autoWidths(){
+      const inputs = this.$el.querySelectorAll(".text-input-boxs");
+      inputs.forEach((input) => this.adjustAutoWidth({ target: input }));
+    },
+    adjustAutoWidth(event){
+      if (event.target.classList.contains("text-input-boxs")) {
+        const input = event.target;
+        const sizeCalculator = document.createElement("span");
+        sizeCalculator.className = "size-calculator";
+        sizeCalculator.textContent = input.value || input.placeholder || "0";
+        document.body.appendChild(sizeCalculator);
+
+        const styles = window.getComputedStyle(input);
+        sizeCalculator.style.font = styles.font;
+        sizeCalculator.style.fontSize = styles.fontSize;
+        sizeCalculator.style.fontWeight = styles.fontWeight;
+        sizeCalculator.style.letterSpacing = styles.letterSpacing;
+
+        const width = sizeCalculator.offsetWidth;
+        input.style.width = `${width + 10}px`; // Add some padding
+
+        document.body.removeChild(sizeCalculator);
+      }
+    },
     async analysisFormual(attrs) {
       let _this = this;
       // console.log("开始分析公式:", attrs.formula);

+ 43 - 14
src/views/document/com/editor.vue

@@ -55,26 +55,22 @@
                         />
                       </el-select>  v-else-->
 
-                      <span
-                        @click="enableSelect(it)"
-                        style="cursor: pointer"
-                        >{{ getCategory(it.category_id) }}</span
-                      >
+                      <span @click="enableSelect(it)" style="cursor: pointer">{{
+                        getCategory(it.category_id)
+                      }}</span>
                     </el-form-item>
                   </el-col>
                   <el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
                     <el-form-item label="模块名称:">
-                     <!--  <el-input
+                      <!--  <el-input
                         v-if="showCategoryName(it)"
                         class="input-item"
                         v-model="it.name"
                         placeholder="请填写模块名称"
                       />v-else -->
-                      <span
-                        @click="enableName(it)"
-                        style="cursor: pointer"
-                        >{{ it.name }}</span
-                      >
+                      <span @click="enableName(it)" style="cursor: pointer">{{
+                        it.name
+                      }}</span>
                     </el-form-item>
                   </el-col>
                   <!-- <el-col :span="6">
@@ -92,7 +88,7 @@
                     <el-form-item v-if="$store.state.user.id == 2">
                       <div class="btn-save">
                         <el-tooltip
-                        v-if="type!=='document'"
+                          v-if="type !== 'document'"
                           class="item"
                           effect="dark"
                           content="保存模块"
@@ -138,7 +134,7 @@
                         >
                         </el-button>
                         <el-tooltip
-                        v-if="!templateId&&type!=='document'"
+                          v-if="!templateId && type !== 'document'"
                           class="item"
                           effect="dark"
                           content="删除"
@@ -168,6 +164,7 @@
                 :insertCmd="insertCmd"
                 @onUpdate="onUpdate"
                 @onUpdateAttr="onUpdateAttr"
+                @onUpdata="onUpdata"
                 @onUpdateProdAttr="onUpdateProdAttr"
                 :isEdit="it.isEdit"
               />
@@ -314,7 +311,7 @@ export default {
   mounted() {
     this.initCategoryList();
     this.type = this.$route.query.type;
-    this.templateId=this.$route.query.templateId;
+    this.templateId = this.$route.query.templateId;
   },
   methods: {
     showCategoryName(item) {
@@ -497,6 +494,38 @@ export default {
       }
       this.$emit("onRebuild", this.comList);
     },
+    /* 修改单个值 */
+    onUpdata(comIndex, attrIndex, attrId, data, type) {
+      let _this = this;
+      let com = _this.coms[comIndex];
+
+      if (type === "variableNull") {
+        // 只更新特定的 variableNull 属性
+        if (
+          com &&
+          com.attrs &&
+          com.attrs[attrIndex] &&
+          com.attrs[attrIndex].id === attrId
+        ) {
+          this.$set(com.attrs[attrIndex], "content", data);
+        }
+      } else {
+        // 原有的逻辑,更新所有相同类型的属性
+        let dataType = com.attrs[attrIndex].type;
+        for (var i = 0; i < _this.coms.length; i++) {
+          for (var j = 0; j < _this.coms[i].attrs.length; j++) {
+            if (
+              _this.coms[i].attrs[j].type == dataType &&
+              _this.coms[i].attrs[j].id == attrId
+            ) {
+              _this.coms[i].attrs[j].content = data;
+            }
+          }
+        }
+      }
+
+      _this.$emit("onRebuild", _this.coms);
+    },
     onRemove(index) {
       this.$emit("onDelete", index);
     },

+ 2 - 0
src/views/document/com/view.vue

@@ -86,6 +86,8 @@ export default {
               formual = await this.getRemote(formual);
               el.content = eval(formual);
             } catch (error) {}
+          }else if(el.type == "variableNull"){
+            console.log(el);
           }
         }
       }

+ 9 - 5
src/views/document/create.vue

@@ -47,7 +47,8 @@
           v-if="
             $store.state.user.name == 'admin' &&
             type !== 'module' &&
-            type !== 'document'&&!articleId
+            type !== 'document' &&
+            !articleId
           "
           @click="onSaveUpload"
           >保存</el-button
@@ -56,7 +57,8 @@
           v-if="
             $store.state.user.name == 'admin' &&
             type !== 'module' &&
-            type !== 'document'&&articleId
+            type !== 'document' &&
+            articleId
           "
           @click="onUpload"
           >更新</el-button
@@ -1230,6 +1232,7 @@ export default {
 
     onRebuild(e) {
       let _this = this;
+      console.log(e);
       _this.coms = [...e];
     },
     //初始化当前用户信息
@@ -1549,13 +1552,14 @@ export default {
         return false;
       }
       let com = _this.coms[_this.comIndex];
+      let uniqueId = "val" + Date.now(); // 使用时间戳创建唯一ID
       let data = {
-        type: "variable",
-        id: "val" + (com.attrs.length + 1),
+        type: "variableNull",
+        id: uniqueId,
         dataId: "",
         name: "非变量",
         intro: "",
-        content: "",
+        content: "请输入",
         data: "",
       };
       com.attrs.push(data);

+ 2 - 1
src/views/knowledgeMenu/category/components/dataList.vue

@@ -29,6 +29,7 @@
           <span>{{ scope.row.name }}</span>
         </template>
       </el-table-column>
+      <el-table-column prop="type" label="文件类型" align="center" />
       <el-table-column prop="chunk_num" label="分块数" align="center" />
       <el-table-column
         prop="create_time"
@@ -401,7 +402,7 @@ export default {
     getName(e) {
       this.$router.push({
         path: "/knowledge/category/infoList",
-        query: { id: e.id },
+        query: { id: e.id,type:e.type },
       });
     },
     /* 解析 */

+ 36 - 8
src/views/knowledgeMenu/category/components/dataSearch.vue

@@ -24,16 +24,16 @@
           />
         </el-select>
       </el-form-item>
-      <!--<el-form-item label="文档状态:">
-          <el-select v-model="queryForm.status" class="m-2" placeholder="请选择文档状态" size="large">
+      <el-form-item label="文件类型:">
+          <el-select v-model="queryForm.type" class="m-2" clearable placeholder="请选择文件类型" size="large">
               <el-option
-                v-for="item in statusOptions"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
+                v-for="item in typeList"
+                :key="item"
+                :label="item"
+                :value="item"
               />
             </el-select>
-        </el-form-item> -->
+        </el-form-item>
 
       <el-form-item>
         <el-button type="primary" @click="onSubmit">
@@ -119,7 +119,7 @@
 </template>
 
 <script>
-import { getBucketContents, postUpload } from "@/api/knowledge";
+import { getBucketContents, postUpload,getSuffixName } from "@/api/knowledge";
 export default {
   props: {
     queryForm: {
@@ -201,12 +201,35 @@ export default {
       uploadForm: {},
       fileList: [],
       url: "",
+      typeList:[
+       /*  {
+          label:'xls',
+          value:'xls',
+        },
+        {
+          label:'xlsx',
+          value:'xlsx',
+        },
+        {
+          label:'pdf',
+          value:'pdf',
+        },
+        {
+          label:'jpg',
+          value:'jpg',
+        },
+        {
+          label:'png',
+          value:'png',
+        }, */
+      ]
     };
   },
   mounted() {
     this.url = process.env.VUE_APP_BASE_API;
     this.queryForm.bucket_id = this.$route.query.id;
     this.queryForm.user_id = this.$store.state.user.id;
+    this.getType()
   },
   methods: {
     onCreate(e) {
@@ -277,6 +300,11 @@ export default {
       this.uploadVisible = false;
       this.fileList = [];
     },
+    getType(){
+      getSuffixName().then(res=>{
+       this.typeList=res.data
+      })
+    }
     /* submitUpload() {
       this.fileList.map((el) => {
         postUpload({ bucket_name: this.queryForm.bucket_name, file: el }).then(

+ 126 - 7
src/views/knowledgeMenu/category/infoList.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="project-search">
+  <div class="project-search" v-if="type !== 'xls'">
     <div style="width: 50%" v-if="dataList.length !== 0">
       <div v-for="item in dataList" :key="item.id" class="listClass">
         <img
@@ -23,14 +23,44 @@
       暂无解析数据
     </div>
     <div style="width: 50%">
-      <iframe :src="documentUrl" width="100%" height="100%"></iframe>
+      <iframe :src="documentUrl" width="100%" height="822px"></iframe>
     </div>
   </div>
+  <div v-else>
+    <!-- <div
+      id="luckysheet"
+      ref="luckysheet"
+      style="width: 100%; height: 500px"
+    ></div> -->
+    <div v-if="excelDataList.length > 0" class="excel-table">
+      <div v-for="(sheet, sheetIndex) in excelDataList" :key="sheetIndex">
+        <!-- <h3>{{ sheet.title || `Sheet ${sheetIndex + 1}` }}</h3> -->
+        <table>
+          <thead>
+            <tr>
+              <th v-for="(header, index) in sheet.data[0]" :key="index">
+                {{ header }}
+              </th>
+            </tr>
+          </thead>
+          <tbody>
+            <tr v-for="(row, rowIndex) in sheet.data.slice(1)" :key="rowIndex">
+              <td v-for="(cell, cellIndex) in row" :key="cellIndex">
+                {{ cell }}
+              </td>
+            </tr>
+          </tbody>
+        </table>
+      </div>
+    </div>
+    <div v-else class="no-data">暂无数据</div>
+  </div>
 </template>
     
     <script>
 import { mapGetters } from "vuex";
 import { searchTaskInfo } from "@/api/knowledge";
+import LuckyExcel from "luckyexcel";
 export default {
   components: {},
   computed: {
@@ -45,10 +75,13 @@ export default {
       dataList: [],
       conten: "",
       documentUrl: "",
+      type: "",
+      excelDataList: [],
     };
   },
   mounted() {
     this.queryForm.document_id = this.$route.query.id;
+    this.type = this.$route.query.type;
     this.search();
   },
   methods: {
@@ -63,11 +96,61 @@ export default {
       return true;
     },
     search() {
-      searchTaskInfo(this.queryForm).then((res) => {
-        console.log(res);
-        this.dataList = res.data.tasks;
-        this.documentUrl = res.data.documentUrl;
-      });
+      searchTaskInfo(this.queryForm)
+        .then((res) => {
+          this.dataList = res.data.tasks;
+          this.documentUrl = res.data.documentUrl;
+
+          if (this.type === "xls" || this.type === "xlsx") {
+            this.excelDataList = this.parseExcelData(res.data.tasks);
+          }
+        })
+        .catch((error) => {
+          console.error("Error fetching data:", error);
+          this.excelDataList = [];
+        });
+    },
+
+    parseExcelData(tasks) {
+      return tasks
+        .filter((task) => task.content)
+        .map((task, index) => {
+          let content = task.content;
+          if (typeof content !== "string") return null;
+
+          // Remove the title row if it exists
+          const titleRowMatch = content.match(/^#.*?\n/);
+          if (titleRowMatch) {
+            content = content.slice(titleRowMatch[0].length);
+          }
+
+          // Split the content into rows and remove empty rows
+          const rows = content
+            .split("\n")
+            .map((row) => row.trim())
+            .filter((row) => row !== "")
+            .filter((row) => !row.match(/^\|[-:]+\|[-:]+\|$/)) // Remove separator row
+            .map((row) =>
+              row
+                .split("|")
+                .map((cell) => cell.trim())
+                .filter((cell) => cell !== "")
+            );
+
+          // Remove the header row if it contains "Unnamed" columns
+          if (
+            rows.length > 0 &&
+            rows[0].some((cell) => cell.startsWith("Unnamed:"))
+          ) {
+            rows.shift();
+          }
+
+          return {
+            title: task.title || `Sheet ${index + 1}`,
+            data: rows,
+          };
+        })
+        .filter((sheet) => sheet !== null && sheet.data.length > 0);
     },
   },
 };
@@ -84,5 +167,41 @@ export default {
   align-items: center;
   justify-content: space-between;
 }
+.excel-table {
+  width: 100%;
+  overflow-y: auto;
+  table {
+    border-collapse: collapse;
+    width: 100%;
+    margin-bottom: 20px;
+  }
+
+  th,
+  td {
+    border: 1px solid #ddd;
+    padding: 8px;
+    text-align: left;
+    white-space: nowrap;
+  }
+
+  th {
+    background-color: #f2f2f2;
+    font-weight: bold;
+    position: sticky;
+    top: 0;
+    z-index: 1;
+  }
+
+  tr:nth-child(even) {
+    background-color: #f9f9f9;
+  }
+}
+
+.no-data {
+  font-size: 18px;
+  color: #909399;
+  text-align: center;
+  margin-top: 50px;
+}
 </style>
     

+ 1 - 0
src/views/knowledgeMenu/index.scss

@@ -56,6 +56,7 @@
                         font-size: 24px;
                         line-height: 32px;
                         font-weight: 600;
+                        cursor: pointer;
                         color: #000000e0;
                         word-break: break-all;
                     }

Некоторые файлы не были показаны из-за большого количества измененных файлов