yangg 9 hónapja
szülő
commit
046cc95625

+ 25 - 21
src/views/document/com/components/Attribute/attributeVar/index.vue

@@ -4,23 +4,30 @@
       <template v-for="(sub, subIndex) in filteredAttrs">
         <template v-if="com.type == 'TextArea'">
           <template v-if="isTextAreaType(sub.type)">
-            <el-form-item :label="sub.id+':'"><!--  + ' (引用名:[' + sub.id + '])' -->
+            <el-form-item :label="sub.id + ':'"
+              ><!--  + ' (引用名:[' + sub.id + '])' -->
               <!-- <el-input
                 type="textarea"
                 @input="updateAllReferences(sub, $event)"
                 v-model="sub.content"
               ></el-input> -->
-              <span @click="toggleBackground(sub.id)" style="cursor: pointer;">{{ sub.content }}</span>
+              <span @click="toggleBackground(sub.id)" style="cursor: pointer">{{
+                sub.content
+              }}</span>
             </el-form-item>
           </template>
           <template v-if="sub.type == 'formual'">
-            <el-form-item :label="sub.id +':'"><!-- + ' (引用名:[' + sub.id + '])' -->
+            <el-form-item :label="sub.id + ':'"
+              ><!-- + ' (引用名:[' + sub.id + '])' -->
               <!-- <el-input type="textarea" v-model="sub.formula"></el-input> -->
-              <span @click="toggleBackground(sub.id)" style="cursor: pointer;">{{ sub.formula }}</span>
+              <span @click="toggleBackground(sub.id)" style="cursor: pointer">{{
+                sub.formula
+              }}</span>
             </el-form-item>
           </template>
           <template v-if="sub.type == 'sourceData'">
-            <el-form-item :label="sub.id+':'" ><!-- + ' (引用名:[' + sub.id + '])' -->
+            <el-form-item :label="sub.id + ':'"
+              ><!-- + ' (引用名:[' + sub.id + '])' -->
               {{ formatSourceData(sub.id, sub.formula) }}
             </el-form-item>
           </template>
@@ -91,7 +98,7 @@ export default {
   },
   computed: {
     filteredAttrs() {
-      console.log("processedAttrs",this.processedAttrs);
+      console.log("processedAttrs", this.processedAttrs);
       return this.processedAttrs;
     },
   },
@@ -105,10 +112,10 @@ export default {
     toggleBackground(id) {
       const element = document.getElementById(id);
       if (element) {
-        if (element.style.backgroundColor === 'yellow') {
-          element.style.backgroundColor = '';
+        if (element.style.backgroundColor === "yellow") {
+          element.style.backgroundColor = "";
         } else {
-          element.style.backgroundColor = 'yellow';
+          element.style.backgroundColor = "yellow";
         }
       }
     },
@@ -150,29 +157,26 @@ export default {
         "Directory",
       ].includes(type);
     },
-    extractChineseTemplates(content) {
+
+    extractTemplates(content) {
       const templateRegex = /\{\{(.*?)\}\}/g;
-      const chineseRegex = /[\u4e00-\u9fa5]/;
       let match;
-      const chineseTemplates = [];
+      const templates = [];
 
       while ((match = templateRegex.exec(content)) !== null) {
-        if (chineseRegex.test(match[1])) {
-          chineseTemplates.push(match[1].trim());
-        }
+        templates.push(match[1].trim());
       }
 
-      return chineseTemplates;
+      return templates;
     },
+
     processContent() {
       if (this.com && this.com.content) {
-        const chineseTemplates = this.extractChineseTemplates(this.com.content);
-        //console.log("Chinese templates:", chineseTemplates);
+        const templates = this.extractTemplates(this.com.content);
 
         if (this.com.attrs && Array.isArray(this.com.attrs)) {
-          this.processedAttrs = this.com.attrs.filter((el) =>
-            //chineseTemplates.includes(el.id)
-             chineseTemplates.includes(el.id) || el.type === "formual"
+          this.processedAttrs = this.com.attrs.filter(
+            (el) => templates.includes(el.id) || el.type === "formual"
           );
         }
       } else {

+ 62 - 58
src/views/document/com/components/Formula/dataInfo.vue

@@ -115,7 +115,7 @@
             style="width: 100%"
           >
             <el-option
-              v-for="(item, index) in attrList"
+              v-for="(item, index) in filteredAttrList"
               :key="`${item.id}-${index}`"
               :label="item.name"
               :value="item.id"
@@ -202,26 +202,18 @@ export default {
   },
   watch: {
     id: {
-      handler(v) {
-        let _this = this;
-        if (v == null) return;
-        if (v == 0) {
-          this.dataForm = {
-            id: 0,
-            name: "",
-            formula: "",
-            intro: "",
-            status: "",
-            use_status: 5,
-            params: "[]",
-            point: 0,
-          };
-          return;
+      handler(newVal, oldVal) {
+        if (newVal == null) return;
+        if (newVal == 0) {
+          this.resetForm();
+        } else {
+          // 添加条件以确保在id相同但需要重新获取数据时也能触发
+          if (newVal !== oldVal || this.dataForm.id !== newVal) {
+            this.getInfo(newVal);
+          }
         }
-        _this.getInfo(v);
       },
       immediate: true,
-      deep: true,
     },
     list: {
       handler(newValue, oldValue) {
@@ -292,6 +284,23 @@ export default {
     let _this = this;
     this.initTableList();
   },
+  computed: {
+    uniqueAttrList() {
+      const uniqueNames = new Set();
+      return this.attrList.filter(attr => {
+        if (!uniqueNames.has(attr.name)) {
+          uniqueNames.add(attr.name);
+          return true;
+        }
+        return false;
+      });
+    },
+    filteredAttrList() {
+      return this.uniqueAttrList.filter(attr => 
+        attr.type !== 'formual' && attr.type !== 'Directory'
+      );
+    }
+  },
   methods: {
     validatePoint(value) {
       const intValue = parseInt(value);
@@ -310,40 +319,38 @@ export default {
       // 更新 dataForm.formula 的值
       this.dataForm.formula = value;
     },
-    //保存更新
+    resetForm() {
+      this.dataForm = {
+        id: 0,
+        name: "",
+        formula: "",
+        intro: "",
+        status: 5,
+        use_status: 5,
+        params: "[]",
+        point: 0,
+      };
+    },
+
     btnSave(e) {
       let _this = this;
 
-      if (_this.dataForm.id > 0) {
-        updateFormula(_this.dataForm).then((res) => {
-          _this.dataForm = {
-            status: 5,
-            use_status: 5,
-            params: "[]",
-            id: 0,
-            name: "",
-            formula: "",
-            intro: "",
-            point: 0,
-          };
-          _this.$message.success("公式更新成功");
-        });
-      } else {
-        createFormula(_this.dataForm).then((res) => {
-          _this.dataForm = {
-            status: 5,
-            use_status: 5,
-            params: "[]",
-            id: 0,
-            name: "",
-            formula: "",
-            intro: "",
-            point: 0,
-          };
-          _this.$message.success("公式创建的成功");
+      const saveAction = _this.dataForm.id > 0 ? updateFormula : createFormula;
+
+      saveAction(_this.dataForm)
+        .then((res) => {
+          _this.$message.success(
+            _this.dataForm.id > 0 ? "公式更新成功" : "公式创建成功"
+          );
+          _this.$emit("onClose", true); // Pass a boolean to indicate successful save
+
+          // 添加这行来强制重新获取数据
+          _this.getInfo(_this.dataForm.id);
+        })
+        .catch((error) => {
+          console.error("保存失败:", error);
+          _this.$message.error("保存失败,请重试");
         });
-      }
-      _this.$emit("onClose");
     },
 
     //产品详情
@@ -373,28 +380,25 @@ export default {
       this.title = "插入模块变量";
     },
     extractChineseTemplates(content) {
-      const templateRegex = /\{\{(.*?)\}\}/g;
+      const templateRegex = /\{\{([\s\S]*?)\}\}/g; // 修改正则表达式以匹配多行内容
       const chineseRegex = /[\u4e00-\u9fa5]/;
       let match;
       const chineseTemplates = [];
-
       while ((match = templateRegex.exec(content)) !== null) {
-        if (chineseRegex.test(match[1])) {
-          chineseTemplates.push(match[1].trim());
-        }
+        const trimmedMatch = match[1].trim();
+        chineseTemplates.push(trimmedMatch);
       }
-
       return chineseTemplates;
     },
+
     processContent(val) {
-      console.log(val);
-      if (val && val.content) {
+      if (val && typeof val.content === "string") {
         const chineseTemplates = this.extractChineseTemplates(val.content);
-        console.log("Chinese templates:", chineseTemplates);
+        console.log("Extracted Chinese templates:", chineseTemplates);
 
         if (val.attrs && Array.isArray(val.attrs)) {
           this.attrList = val.attrs.filter((el) =>
-            chineseTemplates.includes(el.id)
+            chineseTemplates.some((template) => template.includes(el.id))
           );
         }
       } else {

+ 1 - 1
src/views/document/com/editor.vue

@@ -120,7 +120,7 @@
                         <el-button
                           circle
                           size="mini"
-                          v-if="it.isEdit !== 1"
+                          v-if="it.isEdit !== 1&&type !== 'document'"
                           @click="onEdit(index, 1)"
                         >
                           <svg-icon icon-class="edit" />

+ 110 - 84
src/views/document/components/dataSearch.vue

@@ -1,115 +1,141 @@
 <template>
   <div class="data-search">
     <el-form :inline="true" :model="queryForm" class="demo-form-inline">
+      <el-form-item label="文档标题:">
+        <el-input
+          v-model="queryForm.title"
+          placeholder="请填写文档标题"
+        ></el-input>
+      </el-form-item>
 
+      <el-form-item label="所属分类:">
+        <el-select
+          v-model="queryForm.category_id"
+          clearable
+          class="m-2"
+          placeholder="请选择分类"
+          size="large"
+        >
+          <el-option
+            v-for="item in categoryList"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="文档状态:">
+        <el-select
+          v-model="queryForm.status"
+          class="m-2"
+          placeholder="请选择文档状态"
+          size="large"
+        >
+          <el-option
+            v-for="item in statusOptions"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
+        </el-select>
+      </el-form-item>
 
-        <el-form-item label="文档标题:">
-          <el-input v-model="queryForm.title" placeholder="请填写文档标题"></el-input>
-        </el-form-item>
-
-        <el-form-item label="所属分类:">
-          <el-select v-model="queryForm.category_id" clearable class="m-2" placeholder="请选择分类" size="large">
-              <el-option
-                v-for="item in categoryList"
-                :key="item.id"
-                :label="item.name"
-                :value="item.id"
-              />
-            </el-select>
-        </el-form-item>
-        <el-form-item label="文档状态:">
-          <el-select v-model="queryForm.status" class="m-2" placeholder="请选择文档状态" size="large">
-              <el-option
-                v-for="item in statusOptions"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-              />
-            </el-select>
-        </el-form-item>
-
-        <el-form-item>
-          <el-button type="primary" @click="onSubmit">  <svg-icon icon-class="search"/> 搜索</el-button>
-        </el-form-item>
-        <el-form-item>
-          <el-button type="primary" @click="addDocument"  class="el-icon-circle-plus-outline">创建文档</el-button>
-        </el-form-item>
-      </el-form>
-
-
+      <el-form-item>
+        <el-button type="primary" @click="onSubmit">
+          <svg-icon icon-class="search" /> 搜索</el-button
+        >
+      </el-form-item>
+      <el-form-item v-if="createNewDocument">
+        <el-button
+          type="primary"
+          @click="addDocument"
+          class="el-icon-circle-plus-outline"
+          >创建文档</el-button
+        >
+      </el-form-item>
+    </el-form>
   </div>
 </template>
 
 <script>
-import {searchDocumentCategory} from "@/api/document";
-export default{
-  props:{
-    queryForm:{
-        type:Object,
-        default:()=>{
-          return {
-             page:1,
-             pageSize:10,
-             title:'',
-             category_id:'',
-             status:'',
-          }
-        }
+import { searchDocumentCategory } from "@/api/document";
+export default {
+  props: {
+    queryForm: {
+      type: Object,
+      default: () => {
+        return {
+          page: 1,
+          pageSize: 10,
+          title: "",
+          category_id: "",
+          status: "",
+        };
+      },
     },
   },
-  data(){
-    return{
-        statusOptions:[
-          {
-            value:'',
-            label:"请选择状态"
-          },
-          {
-            value:5,
-            label:'启用'
-          },
-          {
-            value:6,
-            label:"停用"
-          },
-        ],
-        dialogVisible:false,
-        categoryList:[],
-    }
+  data() {
+    return {
+      statusOptions: [
+        {
+          value: "",
+          label: "请选择状态",
+        },
+        {
+          value: 5,
+          label: "启用",
+        },
+        {
+          value: 6,
+          label: "停用",
+        },
+      ],
+      dialogVisible: false,
+      categoryList: [],
+      createNewDocument: false,
+    };
   },
   created() {
     this.initCategoryList();
+    this.checkCreatePermission();
   },
-  methods:{
-
+  methods: {
+    checkCreatePermission() {
+      const createPermission = this.$store.state.user.authList.find(
+        (e) => e.code === "createNewDocument"
+      );
+      this.createNewDocument = !!createPermission;
+    },
 
-    initCategoryList(){
-      let _this=this;
-      searchDocumentCategory({page:1,pageSize:999,status:5}).then(res=>{
-        if(res.status!=200)return;
-        _this.categoryList=res.data.dataList;
-      })
+    initCategoryList() {
+      let _this = this;
+      searchDocumentCategory({ page: 1, pageSize: 999, status: 5 }).then(
+        (res) => {
+          if (res.status != 200) return;
+          _this.categoryList = res.data.dataList;
+        }
+      );
     },
-    onCreate(e){
-      this.dialogVisible=true;
+    onCreate(e) {
+      this.dialogVisible = true;
     },
     //搜索
-    onSubmit(){
-      this.$emit("bindSetQuery",this.$props.queryForm);
+    onSubmit() {
+      this.$emit("bindSetQuery", this.$props.queryForm);
     },
     /* 创建文档 */
-    addDocument(){
+    addDocument() {
       //this.$router.push('/document/create');
       let _this = this;
       let a = document.createElement("a");
       a.href = "#/document/create?type=document"; // 使用 hash
       a.target = "_blank";
       a.click();
-    }
-  }
-}
+    },
+  },
+};
 </script>
 
 <style lang="scss">
-@import "./dataSearch.scss"
+@import "./dataSearch.scss";
 </style>

+ 1 - 0
src/views/document/create.vue

@@ -402,6 +402,7 @@
             <span v-else>查看模版</span>
           </div>
           <div
+          v-if="type !== 'document'"
             class="sidebar-item"
             :class="showView == 1 ? 'active-item' : ''"
             @click="viewModule"

+ 21 - 14
src/views/knowledgeMenu/category/knowledgeSet.vue

@@ -112,7 +112,7 @@
           </el-table-column>
           <el-table-column label="操作" align="center" width="330">
             <template #default="scope">
-              <div >
+              <div>
                 <el-tooltip
                   class="item"
                   effect="dark"
@@ -133,14 +133,14 @@
                   class="item"
                   effect="dark"
                   :content="
-                    scope.row.run === 1 || scope.row.run === 5
+                    scope.row.run ==1 || scope.row.run ==5
                       ? '解析中'
                       : '解析'
                   "
                   placement="top"
                 >
                   <el-button
-                    v-if="scope.row.run !== 1 && scope.row.run !== 5"
+                    v-if="scope.row.run !=1 && scope.row.run !=5"
                     type="text"
                     icon="el-icon-caret-right"
                     circle
@@ -295,7 +295,7 @@
             </el-form-item>
           </el-form>
           <span slot="footer" class="dialog-footer">
-            <el-button @click="handleAnalClose">取 消</el-button>
+            <el-button type="primary" @click="handleAnalClose">取 消</el-button>
             <el-button type="primary" @click="submitAnal">确 定</el-button>
           </span>
         </el-dialog>
@@ -314,7 +314,9 @@
             </el-form-item>
           </el-form>
           <span slot="footer" class="dialog-footer">
-            <el-button @click="newFolderDialogVisible = false">取 消</el-button>
+            <el-button type="primary" @click="newFolderDialogVisible = false"
+              >取 消</el-button
+            >
             <el-button type="primary" @click="submitNewFolder">确 定</el-button>
           </span>
         </el-dialog>
@@ -345,7 +347,9 @@
             </el-form-item>
           </el-form>
           <span slot="footer" class="dialog-footer">
-            <el-button @click="batchModifyFolderDialogVisible = false"
+            <el-button
+              type="primary"
+              @click="batchModifyFolderDialogVisible = false"
               >取 消</el-button
             >
             <el-button type="primary" @click="submitBatchModifyFolder"
@@ -577,7 +581,10 @@ export default {
 
     typeList() {
       this.loading = true;
-      Promise.all([selectTypeList(this.typeForm), selectType0({ kb_id:this.typeForm.kb_id,type_id: 0 })])
+      Promise.all([
+        selectTypeList(this.typeForm),
+        selectType0({ kb_id: this.typeForm.kb_id, type_id: 0 }),
+      ])
         .then(([typeListRes, type0Res]) => {
           if (typeListRes.status === 200 && type0Res.status === 200) {
             const folderList = typeListRes.data.dataList.map((folder) => ({
@@ -780,8 +787,9 @@ export default {
     },
     /* 解析 */
     analysis(row) {
-      if (row.run === 1 || row.run === 5) return;
+      if (row.run ==1 || row.run ==5) return;
 
+      // Set the status to "解析中" (1) immediately
       this.$set(row, "run", 1);
 
       analysis({
@@ -792,6 +800,7 @@ export default {
       })
         .then((res) => {
           if (res.status === 200) {
+            // Start checking the status immediately after successful API call
             this.startAnalysisStatusChecker(row);
           } else {
             this.$message.error("解析请求失败");
@@ -806,7 +815,7 @@ export default {
     },
 
     startAnalysisStatusChecker(row) {
-      // 如果已经有一个检查器在运行,先停止它
+      // Clear any existing checker for this row
       if (this.analysisStatusCheckers[row.id]) {
         clearTimeout(this.analysisStatusCheckers[row.id]);
       }
@@ -825,7 +834,7 @@ export default {
                 this.$message.error("解析失败");
                 delete this.analysisStatusCheckers[row.id];
               } else if (newStatus === 1 || newStatus === 5) {
-                // 继续检查
+                // Continue checking
                 this.analysisStatusCheckers[row.id] = setTimeout(
                   checkStatus,
                   5000 + Math.random() * 5000
@@ -833,19 +842,17 @@ export default {
               }
             } else {
               this.$message.error("获取解析状态失败");
-              this.$set(row, "run", 0);
               delete this.analysisStatusCheckers[row.id];
             }
           })
           .catch((error) => {
             console.error("获取解析状态错误:", error);
             this.$message.error("获取解析状态时出现错误");
-            this.$set(row, "run", 0);
             delete this.analysisStatusCheckers[row.id];
           });
       };
 
-      // 立即开始第一次检查
+      // Start checking immediately
       checkStatus();
     },
 
@@ -1039,7 +1046,7 @@ export default {
 
           // Initialize the analysis status for each row
           _this.dataList.forEach((row) => {
-            if (row.run === 1) {
+            if (row.run == 1 || row.run ==5) {
               _this.startAnalysisStatusChecker(row);
             }
           });

+ 13 - 1
src/views/role/components/dataList.vue

@@ -35,6 +35,7 @@
         <template #default="scope">
           <div class="btns">
             <el-button
+              v-if="editRole"
               type="primary"
               size="small"
               @click="btnEdit(scope.row.id)"
@@ -53,7 +54,7 @@
 
     <div class="page-info">
       <el-pagination
-        v-model:currentPage="queryForm.page"
+        :currentPage="queryForm.page"
         :page-size="queryForm.pageSize"
         :total="recordCount"
         :page-count="pageTotal"
@@ -116,12 +117,23 @@ export default {
       pageTotal: 1,
       dataList: [],
       currentData: {},
+      editRole: false,
     };
   },
+  created() {
+    this.checkCreatePermission();
+  },
   mounted() {
     this.search();
   },
   methods: {
+    /* 权限判断 */
+    checkCreatePermission() {
+      const createPermission = this.$store.state.user.authList.find(
+        (e) => e.code === "editRole"
+      );
+      this.editRole = !!createPermission;
+    },
     btnDelete(e) {
       let _this = this;
       let par = {

+ 9 - 3
src/views/role/components/dataSearch.vue

@@ -21,7 +21,7 @@
 
         <el-form-item>
           <el-button type="primary" @click="onSubmit">  <svg-icon icon-class="search"/> 搜索</el-button>
-          <el-button type="success" @click="onCreate" >  <svg-icon icon-class="edit"/> 创建角色</el-button>
+          <el-button v-if="createRole" type="success" @click="onCreate" >  <svg-icon icon-class="edit"/> 创建角色</el-button>
         </el-form-item>
       </el-form>
 
@@ -68,13 +68,19 @@ export default{
           }
         ],
         dialogVisible:false,
+        createRole:false
     }
   },
   created() {
-
+    this.checkCreatePermission()
   },
   methods:{
-
+    checkCreatePermission() {
+      const createPermission = this.$store.state.user.authList.find(
+        (e) => e.code === "createRole"
+      );
+      this.createRole = !!createPermission;
+    },
     onCreate(e){
      this.$router.push({path:'/system/role/create'});
     },

+ 3 - 1
src/views/user/components/dataInfo.vue

@@ -3,7 +3,7 @@
     <el-card>
       <el-form :model="dataForm" label-width="120px">
         <el-form-item label="用户名:">
-          <el-input v-model="dataForm.username"></el-input>
+          <el-input v-model="dataForm.username" :disabled="disable"></el-input>
         </el-form-item>
         <el-form-item label="密码:">
           <el-input type="password" v-model="dataForm.password"></el-input>
@@ -94,6 +94,7 @@ export default {
       handler(v) {
         let _this = this;
         if (v == null || v <= 0) return;
+        _this.disable=true
         _this.getInfo(v);
       },
       immediate: true,
@@ -133,6 +134,7 @@ export default {
           label: "停用",
         },
       ],
+      disable:false
     };
   },
 

+ 2 - 2
src/views/user/components/dataList.vue

@@ -2,7 +2,7 @@
   <div class="data-list">
 
 
-      <el-table :data="dataList" style="width: 100%" header-row-class-name="headerBg" empty-text="没有项目信息">
+      <el-table :data="dataList" style="width: 100%" header-row-class-name="headerBg" empty-text="没有用户信息">
         <el-table-column prop="id" label="ID" align="center" width="80"/>
         <el-table-column prop="username" label="用户名" align="left" min-width="180"/>
         <el-table-column prop="mobile" label="手机号码" align="left" width="150"/>
@@ -29,7 +29,7 @@
 
       <div class="page-info">
       	<el-pagination
-      	v-model:currentPage="queryForm.page"
+      	:currentPage="queryForm.page"
       	:page-size="queryForm.pageSize"
       	:total="recordCount"
       	:page-count="pageTotal"