Browse Source

修改bug及打包

yangg 10 months ago
parent
commit
6326eabc56
38 changed files with 804 additions and 194 deletions
  1. 1 1
      .env.development
  2. 0 0
      dist/index.html
  3. 0 0
      dist/static/css/chunk-08eaa8e2.e30e9787.css
  4. 0 1
      dist/static/css/chunk-0ad8ab66.9e16d9e0.css
  5. 0 0
      dist/static/css/chunk-23f05548.2133235c.css
  6. 0 0
      dist/static/css/chunk-2bb4ff7a.6044f932.css
  7. 0 0
      dist/static/css/chunk-41c59fa7.cf833220.css
  8. 1 0
      dist/static/css/chunk-5de18842.a7dce319.css
  9. 0 0
      dist/static/css/chunk-7fd4e7e4.775a21e3.css
  10. 0 0
      dist/static/css/chunk-886f19ec.c66955a5.css
  11. 0 0
      dist/static/js/app.e2a8c329.js
  12. 0 0
      dist/static/js/chunk-08eaa8e2.925a0455.js
  13. 0 0
      dist/static/js/chunk-0ad8ab66.6a33029a.js
  14. 0 0
      dist/static/js/chunk-14fe8a62.bf8c0a8b.js
  15. 0 0
      dist/static/js/chunk-23f05548.9a76e388.js
  16. 0 0
      dist/static/js/chunk-2bb4ff7a.787d2788.js
  17. 0 0
      dist/static/js/chunk-3d89db3c.41678534.js
  18. 0 0
      dist/static/js/chunk-41c59fa7.eb553f1a.js
  19. 0 0
      dist/static/js/chunk-5de18842.b617e087.js
  20. 0 0
      dist/static/js/chunk-768c2465.ab830635.js
  21. 1 1
      dist/static/js/chunk-7fd4e7e4.2e44b0ed.js
  22. 0 0
      dist/static/js/chunk-886f19ec.6f318cb9.js
  23. 0 0
      dist/static/js/chunk-c1cc09ba.1f0ad88d.js
  24. 0 0
      dist/static/js/chunk-f23301fc.2055040d.js
  25. 18 0
      src/api/template.js
  26. 18 6
      src/views/document/com/components/Attribute/attributeVar/index.vue
  27. 74 77
      src/views/document/com/components/Attribute/docAttr/index.vue
  28. 0 1
      src/views/document/com/components/TextArea/index.vue
  29. 49 13
      src/views/document/com/components/Variable/dataInfo.vue
  30. 0 1
      src/views/document/com/editor.scss
  31. 115 36
      src/views/document/com/editor.vue
  32. 5 0
      src/views/document/com/menus.vue
  33. 4 1
      src/views/document/create.scss
  34. 295 24
      src/views/document/create.vue
  35. 1 1
      src/views/knowledgeMenu/knowledgeList.vue
  36. 3 3
      src/views/template/category/components/dataInfo.vue
  37. 191 22
      src/views/template/category/components/dataList.vue
  38. 28 6
      src/views/template/components/dataSearch.vue

+ 1 - 1
.env.development

@@ -2,5 +2,5 @@
 ENV = 'development'
 port = 8080
 # base api
-VUE_APP_BASE_API = 'http://120.46.190.49:8000'
+VUE_APP_BASE_API = 'http://192.168.1.178:8000'
 #192.168.1.178

File diff suppressed because it is too large
+ 0 - 0
dist/index.html


+ 0 - 0
dist/static/css/chunk-3d89db3c.6044f932.css → dist/static/css/chunk-08eaa8e2.e30e9787.css


+ 0 - 1
dist/static/css/chunk-0ad8ab66.9e16d9e0.css

@@ -1 +0,0 @@
-.ledge_box .data-search[data-v-63fade9e]{padding:20px 10px 0 10px}.ledge_box .data-list[data-v-63fade9e]{padding:10px;min-height:200px;position:relative}.ledge_box .data-list .time[data-v-63fade9e]{font-size:13px;color:#999}.ledge_box .data-list .bottom[data-v-63fade9e]{margin-top:13px;line-height:12px}.ledge_box .data-list .button[data-v-63fade9e]{padding:0;float:right}.ledge_box .data-list .image[data-v-63fade9e]{width:100%;display:block}.ledge_box .data-list .clearfix[data-v-63fade9e]:after,.ledge_box .data-list .clearfix[data-v-63fade9e]:before{display:table;content:""}.ledge_box .data-list .clearfix[data-v-63fade9e]:after{clear:both}.ledge_box .data-list .card_box[data-v-63fade9e]{padding:20px}.ledge_box .data-list .card_box .header[data-v-63fade9e]{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-63fade9e]{margin-bottom:30px}.ledge_box .data-list .card-col .card_box[data-v-63fade9e]{height:235px}.ledge_box .data-list .card-col .card_box .box_content[data-v-63fade9e]{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-63fade9e]{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-63fade9e]{font-size:12px;font-weight:600;color:rgba(0,0,0,.6509803921568628);vertical-align:middle}

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-23f05548.2133235c.css


+ 0 - 0
dist/static/css/chunk-c1cc09ba.e30e9787.css → dist/static/css/chunk-2bb4ff7a.6044f932.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-41c59fa7.cf833220.css


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

@@ -0,0 +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}

+ 0 - 0
dist/static/css/chunk-56e70210.775a21e3.css → dist/static/css/chunk-7fd4e7e4.775a21e3.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-886f19ec.c66955a5.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/app.e2a8c329.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-08eaa8e2.925a0455.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-0ad8ab66.6a33029a.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-14fe8a62.bf8c0a8b.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-23f05548.9a76e388.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-2bb4ff7a.787d2788.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-3d89db3c.41678534.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-41c59fa7.eb553f1a.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-5de18842.b617e087.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-768c2465.ab830635.js


File diff suppressed because it is too large
+ 1 - 1
dist/static/js/chunk-7fd4e7e4.2e44b0ed.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-886f19ec.6f318cb9.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-c1cc09ba.1f0ad88d.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-f23301fc.2055040d.js


+ 18 - 0
src/api/template.js

@@ -8,6 +8,14 @@ export function searchTemplateCategory(data) {
     data
   })
 }
+/* 获取全部分类接口 /template/category/selcetList*/
+export function selcetList(data) {
+  return request({
+    url: '/template/category/selcetList',
+    method: 'post',
+    data
+  })
+}
 
 
 
@@ -129,4 +137,14 @@ export function getAllList(data) {
     method: 'post',
     data
   })
+}
+
+/* 获取树状分类  /template/category/treeCategory */
+
+export function treeCategory(data) {
+  return request({
+    url: '/template/category/treeCategory',
+    method: 'post',
+    data
+  })
 }

+ 18 - 6
src/views/document/com/components/Attribute/attributeVar/index.vue

@@ -4,21 +4,23 @@
       <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-input
+            <el-form-item :label="sub.id+':'"><!--  + ' (引用名:[' + sub.id + '])' -->
+              <!-- <el-input
                 type="textarea"
                 @input="updateAllReferences(sub, $event)"
                 v-model="sub.content"
-              ></el-input>
+              ></el-input> -->
+              <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-input type="textarea" v-model="sub.formula"></el-input>
+            <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>
             </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>
@@ -99,6 +101,16 @@ export default {
     }
   },
   methods: {
+    toggleBackground(id) {
+      const element = document.getElementById(id);
+      if (element) {
+        if (element.style.backgroundColor === 'yellow') {
+          element.style.backgroundColor = '';
+        } else {
+          element.style.backgroundColor = 'yellow';
+        }
+      }
+    },
     updateAllReferences(val, newValue) {
       this.com.attrs.map((el) => {
         if (el.name == val.name) {

+ 74 - 77
src/views/document/com/components/Attribute/docAttr/index.vue

@@ -1,13 +1,16 @@
 <template>
   <div class="doc-attr">
     <el-form>
-
       <el-form-item label="标题:">
-        <el-input  v-model="attrs.title" style="width:100%;" class="input-item" placeholder="请填写模板名称"/>
+        <el-input
+          v-model="attrs.title"
+          style="width: 100%"
+          class="input-item"
+          placeholder="请填写模版名称"
+        />
       </el-form-item>
 
-
-      <el-form-item label="选择分类:">
+      <!--<el-form-item label="选择分类:">
         <el-select v-model="attrs.category_id" style="width:100%;" placeholder="请选择所属分类">
           <el-option
                 v-for="(item,index) in articleCategoryList"
@@ -17,7 +20,7 @@
               />
         </el-select>
       </el-form-item>
-      <!-- <el-form-item label="适用产品:">
+       <el-form-item label="适用产品:">
         <el-select v-model="attrs.linkProduct" :multiple="true" style="width:100%;" @change="onChangeProduct"  placeholder="请选择适用产品">
           <el-option
                 v-for="(item,index) in productList"
@@ -43,85 +46,79 @@
 </template>
 
 <script>
-  import {searchDocumentCategory} from "@/api/document";
-  import {searchProduct} from "@/api/product";
-  import {searchProject} from "@/api/project";
-  export default{
-    name:"docAttr",
-    props:{
-      attrs:{
-        type:Object,
-        default:()=>{
-          return {
-            category_id:'',
-            title:'',
-            linkProduct:[],
-            linkProject:[],
-          }
-        }
+import { searchDocumentCategory } from "@/api/document";
+import { searchProduct } from "@/api/product";
+import { searchProject } from "@/api/project";
+export default {
+  name: "docAttr",
+  props: {
+    attrs: {
+      type: Object,
+      default: () => {
+        return {
+          category_id: "",
+          title: "",
+          linkProduct: [],
+          linkProject: [],
+        };
       },
     },
-    watch:{
-       'attrs':{
-         handler(val){
+  },
+  watch: {
+    attrs: {
+      handler(val) {},
+      immediate: true, //立即执行
+      deep: true,
+    },
+  },
+  data() {
+    return {
+      articleCategoryList: [],
+      productList: [],
+      projectList: [],
+    };
+  },
+  created() {
+    this.initArticleCategoryList();
+    this.initProjectList();
+    this.initGoodsList();
+  },
+  methods: {
+    onChangeProduct(e) {
+      let _this = this;
+    },
 
-         },
-         immediate: true,//立即执行
-         deep: true,
-       }
+    onChangeProject(e) {},
+    //初始化产品列表
+    initProjectList() {
+      let _this = this;
+      searchProject({ page: 1, pageSize: 9999, status: 5 }).then((res) => {
+        if (res.status != 200) return;
+        _this.projectList = res.data.dataList;
+      });
     },
-    data(){
-      return {
-          articleCategoryList:[],
-          productList:[],
-          projectList:[],
-      }
+    //初始化产品列表
+    initGoodsList() {
+      let _this = this;
+      searchProduct({ page: 1, pageSize: 9999, status: 5 }).then((res) => {
+        if (res.status != 200) return;
+        _this.productList = res.data.dataList;
+      });
     },
-    created(){
-        this.initArticleCategoryList();
-        this.initProjectList();
-        this.initGoodsList();
+    //加载文档分类
+    initArticleCategoryList() {
+      let _this = this;
+      searchDocumentCategory({ page: 1, pageSize: 99, status: 5 }).then(
+        (res) => {
+          if (res.status != 200) return;
+          _this.articleCategoryList = res.data.dataList;
+        }
+      );
     },
-    methods:{
-
-      onChangeProduct(e){
-        let _this=this;
-
-      },
-
-      onChangeProject(e){
-
-      },
-      //初始化产品列表
-      initProjectList(){
-        let _this=this;
-        searchProject({page:1,pageSize:9999,status:5}).then(res=>{
-          if(res.status!=200)return;
-          _this.projectList=res.data.dataList;
-        })
-      },
-      //初始化产品列表
-      initGoodsList(){
-        let _this=this;
-        searchProduct({page:1,pageSize:9999,status:5}).then(res=>{
-          if(res.status!=200)return;
-          _this.productList=res.data.dataList;
-        })
-      },
-      //加载文档分类
-      initArticleCategoryList(){
-        let _this=this;
-        searchDocumentCategory({page:1,pageSize:99,status:5}).then(res=>{
-            if(res.status!=200)return;
-            _this.articleCategoryList=res.data.dataList;
-        })
-      },
-
-
-    }
-  }
+  },
+};
 </script>
 
 <style lang="scss">
-@import './index.scss';
+@import "./index.scss";
 </style>

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

@@ -161,7 +161,6 @@ export default {
               i +
               '" class="text-input-box">';
             for (var l = 0; l < dataItem.length; l++) {
-              console.log(dataItem);
               if (item.content == dataItem[l]) {
                 selectHtml +=
                   '<option value="' +

+ 49 - 13
src/views/document/com/components/Variable/dataInfo.vue

@@ -29,16 +29,10 @@
             />
           </el-select>
         </el-form-item>
-        <el-form-item
-          label="取值:"
-          v-if="dataForm.value_type == 1"
-        >
+        <el-form-item label="取值:" v-if="dataForm.value_type == 1">
           <el-input v-model="dataForm.value"></el-input>
         </el-form-item>
-        <el-form-item
-          label="取值:"
-          v-if="dataForm.value_type == 2"
-        >
+        <el-form-item label="取值:" v-if="dataForm.value_type == 2">
           <el-input v-model="dataForm.value"></el-input>
         </el-form-item>
         <el-form-item
@@ -65,7 +59,19 @@
           <el-input v-model="dataForm.value"></el-input>
         </el-form-item>
         <el-form-item label="取值范围:" v-if="dataForm.value_type == 2">
-          <el-input type="textarea" v-model="dataForm.value_item"></el-input>
+          <el-select
+          ref="categorySelect"
+            v-model="dataForm.value_item"
+            multiple
+            filterable
+            allow-create
+            default-first-option
+            placeholder="点击enter创建选择标签"
+            style="width: 100%;"
+           popper-class="custom-select-dropdown"
+          >
+          </el-select>
+          <!-- <el-input type="textarea" v-model="dataForm.value_item"   @keydown.native.enter="createTag"></el-input> -->
         </el-form-item>
         <el-form-item label="介绍:">
           <el-input type="textarea" v-model="dataForm.intro"></el-input>
@@ -128,6 +134,12 @@ export default {
       immediate: true,
       deep: true,
     },
+    hideDropdown(newVal) {
+      const dropdown = document.querySelector('.custom-select-dropdown');
+      if (dropdown) {
+        dropdown.style.display = newVal ? 'none' : '';
+      }
+    }
   },
   data() {
     const validateBucketName = (rule, value, callback) => {
@@ -158,7 +170,7 @@ export default {
       activeName: "base",
       currentCategory: [],
       valueTypeList: [
-      {
+        {
           value: 0,
           name: "请选择取值类型",
         },
@@ -224,6 +236,9 @@ export default {
           { validator: validateBucketName, trigger: "blur" },
         ],
       },
+      tags: [],
+      shouldPreventDropdown: true,
+      hideDropdown: false,
     };
   },
 
@@ -231,6 +246,22 @@ export default {
     let _this = this;
   },
   methods: {
+    handleSelectFocus(event) {
+        this.$refs.categorySelect.blur();
+    },
+    createTag() {
+      // Logic to create a tag
+      console.log(
+        "Enter key pressed, create a tag with:",
+        this.dataForm.value_item
+      );
+      // Example: Add the value to a tags array
+      if (this.dataForm.value_item.trim() !== "") {
+        this.tags.push(this.dataForm.value_item.trim());
+        this.dataForm.value_item = ""; // Clear the input
+      }
+      console.log(this.tags);
+    },
     resetForm() {
       // 重置所有表单字段
       this.dataForm = { type: 1, value_type: 1, status: 5 }; // 或者设置为初始值
@@ -242,6 +273,7 @@ export default {
       let _this = this;
       _this.$refs.dataFormRef.validate((valid) => {
         if (valid) {
+           
           if (_this.dataForm.value_type == 1) {
             _this.dataForm.value_item = _this.dataForm.value;
           } else if (_this.dataForm.value_type == 4) {
@@ -250,9 +282,10 @@ export default {
             // 格式化为百分数,保留两位小数
             const percentage = num.toFixed(2) + "%";
             _this.dataForm.value = percentage;
+          } else if (_this.dataForm.value_type == 2) {
+            _this.dataForm.value_item = _this.dataForm.value_item.join(",");
           }
           _this.dataForm.code = _this.dataForm.name;
-          console.log(_this.dataForm);
           if (_this.dataForm.id > 0) {
             updateParams(_this.dataForm).then((res) => {
               if (res.status != 200) return;
@@ -277,8 +310,8 @@ export default {
             });
           }
           _this.$emit("onClose");
-        }else{
-          console.log('错误');
+        } else {
+          console.log("错误");
         }
       });
     },
@@ -310,4 +343,7 @@ export default {
 
 <style lang="scss">
 @import "./dataInfo.scss";
+.custom-select-dropdown {
+  display: none; /* Initially hide the dropdown */
+}
 </style>

+ 0 - 1
src/views/document/com/editor.scss

@@ -126,5 +126,4 @@
 .btn-save{
   display: flex;
   justify-content: flex-end;
-  margin-right: 15px;
 }

+ 115 - 36
src/views/document/com/editor.vue

@@ -12,7 +12,7 @@
       :scrollSensitivity="100"
       :scrollSpeed="20"
     >
-      <transition-group style="display:block;min-height: 100vh;">
+      <transition-group style="display: block; min-height: 100vh">
         <template v-for="(it, index) in comList">
           <div
             class="layers"
@@ -25,22 +25,23 @@
             <!-- :options="categoryList":props="props" -->
             <div style="padding: 10px 0">
               <el-form label-position="left" class="inline-form">
-                <el-row :gutter="24">
-                  <el-col :span="8">
+                <el-row :gutter="24" style="margin-left: 0; margin-right: 0">
+                  <el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
                     <el-form-item label="模块分类:">
                       <!-- 此处需要处理为只有admin账号可编辑 -->
-                      <!-- <el-cascader
+                      <el-cascader
+                        v-if="showCategorySelect(it)"
                         v-model="it.category_id"
                         clearable
                         :options="categoryList"
                         :props="props"
                         :show-all-levels="false"
-                        @change="onChangeCategory"
+                        @change="onChangeCategory(it)"
                         placeholder="请选择模块分类"
-                      /> -->
+                      />
                       <!-- {{ $store.state.user }} -->
                       <!-- <el-select
-                        v-if="$store.state.user.id == 2"
+                        v-if="showCategorySelect(it)"
                         v-model="it.category_id"
                         placeholder="请选择模块分类"
                         size="large"
@@ -53,18 +54,29 @@
                           :value="item.id"
                         />
                       </el-select> -->
-                      <span>{{ getCategory(it.category_id) }}</span>
+
+                      <span
+                        v-else
+                        @click="enableSelect(it)"
+                        style="cursor: pointer"
+                        >{{ getCategory(it.category_id) }}</span
+                      >
                     </el-form-item>
                   </el-col>
-                  <el-col :span="8">
+                  <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="请填写模块名称"
-                      /> -->
-                      <span >{{ it.name }}</span>
+                      />
+                      <span
+                        v-else
+                        @click="enableName(it)"
+                        style="cursor: pointer"
+                        >{{ it.name }}</span
+                      >
                     </el-form-item>
                   </el-col>
                   <!-- <el-col :span="6">
@@ -78,7 +90,7 @@
                       <span v-else>{{ it.intro }}</span>
                     </el-form-item>
                   </el-col> -->
-                  <el-col :span="3" :offset="5">
+                  <el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
                     <el-form-item v-if="$store.state.user.id == 2">
                       <div class="btn-save">
                         <el-tooltip
@@ -95,7 +107,7 @@
                           >
                           </el-button>
                         </el-tooltip>
-                       <!--  <el-tooltip
+                        <!--  <el-tooltip
                           class="item"
                           effect="dark"
                           content="另存为"
@@ -132,10 +144,14 @@
                           content="删除"
                           placement="top"
                         >
-                        <el-button circle size="mini" @click="onRemove(index)">
-                          <svg-icon icon-class="delete"
-                        /></el-button>
-                      </el-tooltip>
+                          <el-button
+                            circle
+                            size="mini"
+                            @click="onRemove(index)"
+                          >
+                            <svg-icon icon-class="delete"
+                          /></el-button>
+                        </el-tooltip>
                       </div>
                     </el-form-item>
                   </el-col>
@@ -195,7 +211,12 @@ import draggable from "vuedraggable";
 import Table from "./components/Table";
 import TextArea from "./components/TextArea";
 import Empty from "./components/Empty";
-import { getAllList, createTemplate, updateTemplate } from "@/api/template";
+import {
+  getAllList,
+  createTemplate,
+  updateTemplate,
+  treeCategory,
+} from "@/api/template";
 export default {
   name: "editor",
   emits: [
@@ -241,7 +262,6 @@ export default {
       handler(val) {
         if (val == null) return;
         this.comList = JSON.parse(JSON.stringify(val));
-        console.log(this.comList);
       },
       immediate: true, //立即执行
       deep: true,
@@ -251,6 +271,9 @@ export default {
         if (val <= 0) return;
         this.comList = this.comList.map((it) => {
           it.isEdit = 2;
+          it.selDisabled = true;
+          it.valDisabled = true;
+          it.category_id=it.category_id.split(" ")
           return it;
         });
       },
@@ -273,20 +296,62 @@ export default {
       },
       saveAs: false,
       draggableStyle: {
-        width: '100%',
-        
-        overflowY: 'auto'
-      }
+        width: "100%",
+
+        overflowY: "auto",
+      },
+      type: "",
     };
   },
   mounted() {
     this.initCategoryList();
-    console.log(this.$store.state.user);
+    this.type = this.$route.query.type;
   },
   methods: {
+    showCategoryName(item) {
+      return (
+        this.type == "module" &&
+        this.$store.state.user.id == 2 &&
+        !item.valDisabled
+      );
+    },
+    enableName(item) {
+      item.valDisabled = false;
+      this.$forceUpdate();
+    },
+    showCategorySelect(item) {
+      return (
+        this.type === "module" &&
+        this.$store.state.user.id === 2 &&
+        !item.selDisabled
+      );
+    },
+    /* 选择分类 */
+    enableSelect(item) {
+      item.selDisabled = false;
+      this.$forceUpdate();
+    },
     /* 获取分类名称 */
     getCategory(item) {
-      return this.categoryList.find((el) => el.id === item)?.name || "";
+      const findCategory = (list, id) => {
+        for (const el of list) {
+          if (el.id === id) {
+            return el.name;
+          }
+          if (el.children) {
+            const name = findCategory(el.children, id);
+            if (name) {
+              return name;
+            }
+          }
+        }
+        return null;
+      };
+
+      return findCategory(this.categoryList, item) || "请选择分类";
+      /* return (
+        this.categoryList.find((el) => el.id === item)?.name || "请选择分类"
+      ); */
     },
     onSaveAs(e) {
       this.saveAs = true;
@@ -303,21 +368,28 @@ export default {
       data.attrs = JSON.stringify(data.attrs);
       data.code = data.name;
       data.status = 5;
-      data.category_id = e.category_id;
+      data.category_id = e.category_id[e.category_id.length - 1];
       if (data.id == undefined || this.saveAs) {
         createTemplate(data).then((res) => {
           if (res.status != 200) return;
           data.id = res.data;
           e.id = res.data;
+
           _this.$alert("模板信息保存成功");
           _this.$emit("onRefresh");
           this.saveAs = false;
+          data.selDisabled = false;
+          data.valDisabled = false;
+          this.$forceUpdate();
         });
       } else {
         updateTemplate(data).then((res) => {
           if (res.status != 200) return;
           _this.$alert("模板信息更新成功");
           _this.$emit("onRefresh");
+          data.selDisabled = false;
+          data.valDisabled = false;
+          this.$forceUpdate();
         });
       }
     },
@@ -325,8 +397,10 @@ export default {
     //获取模板分类信息
     async initCategoryList() {
       let _this = this;
-      let res = await getAllList();
-      this.categoryList = res.data; //this.processDataForCascader(res.data);
+      let res = await treeCategory(); //await getAllList();
+      console.log(res);
+      this.categoryList =
+        res.data; /* //this.processDataForCascader(res.data); */
     },
     processDataForCascader(data) {
       console.log("Raw data:", data); // 调试原始数据
@@ -360,7 +434,11 @@ export default {
       console.log("Processed data:", rootItems); // 调试处理后的数据
       return rootItems;
     },
-    onChangeCategory() {},
+    onChangeCategory(item, value) {
+      /* const selectedId = value[value.length - 1];
+      item.category_id=selectedId */
+      // You can now use the selected ID as needed
+    },
     //更新产品属性
     onUpdateProdAttr(comIndex, attrIndex, data) {
       this.comList[comIndex].attrs[attrIndex].content = data;
@@ -449,10 +527,10 @@ export default {
     padding: 0 5px;
     display: flex;
     align-items: center;
-   /*  background-color: #f0f0f0; */
+    /*  background-color: #f0f0f0; */
 
     &:hover {
-     /*  background-color: #e0e0e0; */
+      /*  background-color: #e0e0e0; */
     }
   }
 
@@ -467,9 +545,10 @@ export default {
   }
 }
 .inline-form {
-  display: flex;
-  flex-wrap: wrap;
-  gap: 10px;
+  display: block;
+  width: 100%;
+  /* flex-wrap: wrap;
+  gap: 10px; */
 }
 
 .inline-form .el-form-item {

+ 5 - 0
src/views/document/com/menus.vue

@@ -118,6 +118,11 @@
                 name:"目录",
                 icon:"subject",
               },
+              {
+                key:"InsertNull",
+                name:"插入空值",
+                icon:"insertTemplate",
+              },
               /* {
                 key:"pager",
                 name:"分页",

+ 4 - 1
src/views/document/create.scss

@@ -62,7 +62,7 @@
       left:0px;
       width:205px;
       // min-height: 100%;
-      height: 100vh;
+      height: 99vh;
       border:1px solid #ebebeb;
       padding:5px;
       border-radius: 10px;
@@ -74,6 +74,9 @@
          height:80vh;
          overflow:hidden;
          overflow-y:auto;
+        
+          overflow-x: auto; /* Enable horizontal scrolling */
+        
          .new-article{
              background:#FFF;
              margin-top:5px;

+ 295 - 24
src/views/document/create.vue

@@ -6,6 +6,10 @@
           <span>当前打开文档:</span
           >{{ docAttr.title == "" ? "新建文档" : docAttr.title }}
         </div>
+        <div class="doc" v-else-if="type == 'module'">
+          <span>当前打开模块:</span
+          >{{ coms[0].name == "" ? "新建模块" : coms[0].name }}
+        </div>
         <div class="doc" v-else>
           <span>当前打开模版:</span
           >{{ docAttr.title == "" ? "新建模版" : docAttr.title }}
@@ -113,7 +117,7 @@
               </el-collapse>
             </div>
             <div v-if="showView == 1">
-              <el-collapse
+              <!-- <el-collapse
                 v-model="activeModel"
                 :accordion="true"
                 @change="handleItemClick"
@@ -177,6 +181,149 @@
                     </transition-group>
                   </draggable>
                 </el-collapse-item>
+              </el-collapse> -->
+              <el-collapse
+                v-model="activeModel"
+                :accordion="true"
+                @change="handleItemClick"
+                class="borderless-collapse"
+              >
+                <el-collapse-item
+                  v-for="(item, itemIndex) in categoryList"
+                  :key="itemIndex"
+                  :title="item.name"
+                  :name="item.id"
+                  class="min-width-content"
+                >
+                  <el-collapse
+                    v-if="item.children && item.children.length"
+                    v-model="item.activeChildren"
+                    @change="handleItemVal"
+                    v-show="item.children"
+                    class="borderless-collapse"
+                  >
+                    <el-collapse-item
+                      v-for="(child, childIndex) in item.children"
+                      :key="childIndex"
+                      :title="child.name"
+                      :name="child.id"
+                      class="min-width-content"
+                    >
+                      <el-collapse
+                        v-if="child.children && child.children.length"
+                        v-model="child.activeChildren"
+                        @change="handleChildItemVal"
+                        v-show="child.children"
+                        class="borderless-collapse"
+                      >
+                        <el-collapse-item
+                          v-for="(
+                            grandChild, grandChildIndex
+                          ) in child.children"
+                          :key="grandChildIndex"
+                          :title="grandChild.name"
+                          :name="grandChild.id"
+                          class="min-width-content"
+                        >
+                          <el-collapse
+                            v-if="
+                              grandChild.children && grandChild.children.length
+                            "
+                            v-model="grandChild.activeChildren"
+                            @change="handleGrandChildItemVal"
+                            v-show="grandChild.children"
+                            class="borderless-collapse"
+                          >
+                            <el-collapse-item
+                              v-for="(
+                                greatGrandChild, greatGrandChildIndex
+                              ) in grandChild.children"
+                              :key="greatGrandChildIndex"
+                              :title="greatGrandChild.name"
+                              :name="greatGrandChild.id"
+                              class="min-width-content"
+                            >
+                              <draggable
+                                v-model="greatGrandChild.dataList"
+                                :options="{
+                                  group: { name: 'itxst', pull: 'clone' },
+                                  sort: true,
+                                }"
+                                :disabled="type == 'module'"
+                              >
+                                <transition-group>
+                                  <div
+                                    class="sub-menus min-width-content"
+                                    v-for="(
+                                      its, index
+                                    ) in greatGrandChild.dataList"
+                                    :key="index"
+                                  >
+                                    <div>{{ its.name }}</div>
+                                  </div>
+                                </transition-group>
+                              </draggable>
+                            </el-collapse-item>
+                          </el-collapse>
+                          <draggable
+                            v-model="grandChild.dataList"
+                            :options="{
+                              group: { name: 'itxst', pull: 'clone' },
+                              sort: true,
+                            }"
+                            :disabled="type == 'module'"
+                          >
+                            <transition-group>
+                              <div
+                                class="sub-menus min-width-content"
+                                v-for="(it, index) in grandChild.dataList"
+                                :key="index"
+                              >
+                                <div>{{ it.name }}</div>
+                              </div>
+                            </transition-group>
+                          </draggable>
+                        </el-collapse-item>
+                      </el-collapse>
+                      <draggable
+                        v-model="child.dataList"
+                        :options="{
+                          group: { name: 'itxst', pull: 'clone' },
+                          sort: true,
+                        }"
+                        :disabled="type == 'module'"
+                      >
+                        <transition-group>
+                          <div
+                            class="sub-menus min-width-content"
+                            v-for="(it, index) in child.dataList"
+                            :key="index"
+                          >
+                            <div>{{ it.name }}</div>
+                          </div>
+                        </transition-group>
+                      </draggable>
+                    </el-collapse-item>
+                  </el-collapse>
+                  <draggable
+                    v-model="item.dataList"
+                    :options="{
+                      group: { name: 'itxst', pull: 'clone' },
+                      sort: true,
+                    }"
+                    :disabled="type == 'module'"
+                  >
+                    <transition-group>
+                      <div
+                        class="sub-menus min-width-content"
+                        v-for="(it, index) in item.dataList"
+                        :key="index"
+                      >
+                        <div>{{ it.name }}</div>
+                      </div>
+                    </transition-group>
+                  </draggable>
+                </el-collapse-item>
               </el-collapse>
             </div>
           </div>
@@ -481,7 +628,9 @@ export default {
       },
       docRules: {
         title: [{ required: true, message: "请输文档名称", trigger: "blur" }],
-        category_id: [{ required: true, message: "请选择文档分类", trigger: "change" }],
+        category_id: [
+          { required: true, message: "请选择文档分类", trigger: "change" },
+        ],
       },
       articleCategoryList: [],
     };
@@ -510,19 +659,78 @@ export default {
     if (this.type == "module") {
       this.showView = 1;
     }
-    let _this = this;
+
     this.searchArticle();
     await this.initCategoryList();
     await this.initCurrentUser();
     let templateId = this.$route.query.templateId;
     if (templateId > 0) {
-      _this.loadTemplateInfo(templateId);
+      this.loadTemplateInfo(templateId);
     }
-    _this.isAdmin = _this.userInfo.roleInfo.is_admin;
+    this.isAdmin = this.userInfo ? this.userInfo.roleInfo.is_admin : 2;
     this.initArticleCategoryList();
   },
 
   methods: {
+    handleItemVal(value) {
+      this.$forceUpdate();
+      this.loadChildren(value);
+    },
+    handleChildItemClick(child) {
+      if (!child.children) {
+        this.loadChildren(child);
+      }
+    },
+    handleChildItemVal(value) {
+      this.$forceUpdate();
+      this.loadChildren(value);
+    },
+    handleGrandChildItemClick(grandChild) {
+      if (!grandChild.children) {
+        this.loadChildren(grandChild);
+      }
+    },
+    handleGrandChildItemVal(value) {
+      this.$forceUpdate();
+      this.loadChildren(value);
+    },
+    handleGreatGrandChildItemClick(greatGrandChild) {
+      if (!greatGrandChild.children) {
+        this.loadChildren(greatGrandChild);
+      }
+    },
+    async loadChildren(category) {
+      const category_id = category[category.length - 1];
+      console.log(this.categoryList);
+      try {
+        const res = await searchTemplateCategory({ parent_id: category_id });
+        if (res.status != 200 || res.data.length == 0) return;
+        const newChildren = res.data;
+        for (let i = 0; i < newChildren.length; i++) {
+          newChildren[i].dataList = await this.getTemplateList(
+            newChildren[i].id
+          );
+        }
+        this.insertChildrenById(this.categoryList, category_id, newChildren);
+        this.$forceUpdate(); // Force Vue to re-render the component
+      } catch (error) {
+        console.error("Error fetching template categories:", error);
+      }
+    },
+
+    insertChildrenById(list, id, newChildren) {
+      for (let item of list) {
+        if (item.id === id) {
+          this.$set(item, "children", newChildren); // Use Vue.set to ensure reactivity
+          return true; // Stop searching once the item is found
+        }
+        if (item.children && item.children.length > 0) {
+          const found = this.insertChildrenById(item.children, id, newChildren);
+          if (found) return true; // Stop searching if the item is found in deeper levels
+        }
+      }
+      return false; // Continue searching
+    },
     /* 取消新增 */
     closeDoc() {
       this.docVisible = false;
@@ -768,10 +976,11 @@ export default {
 
       return result;
     },
-
+    /* 
     handleItemVal(value) {
+      console.log(value);
       this.$forceUpdate();
-    },
+    }, */
     async handleItemClick(item) {
       const category = this.categoryList.find((cat) => cat.id === item);
       if (!category) return;
@@ -873,18 +1082,23 @@ export default {
       let par = {
         id: e,
       };
-      getTemplateInfo(par).then((res) => {
-        if (res.status != 200) return;
-        if (res.data.attrs == null || res.data.type == "") {
-          res.data.attrs = "[]";
-          res.data.content = "请填写内容";
-          res.data.lay_id = "textArea";
-          res.data.type = "TextArea";
-        }
-        console.log(res.data);
-        res.data.attrs = JSON.parse(res.data.attrs);
-        _this.coms = [res.data];
-      });
+      getTemplateInfo(par)
+        .then((res) => {
+          if (res.status != 200) return;
+          if (res.data.attrs == null || res.data.type == "") {
+            res.data.attrs = "[]";
+            res.data.content = "请填写内容";
+            res.data.lay_id = "textArea";
+            res.data.type = "TextArea";
+          }
+          document.title =
+            res.data.name == ""
+              ? "新建模块-轻良实业"
+              : res.data.name + "-轻良实业";
+          res.data.attrs = JSON.parse(res.data.attrs);
+          _this.coms = [res.data];
+        })
+        .catch(() => {});
     },
     onExport(e) {
       let _this = this;
@@ -1241,11 +1455,44 @@ export default {
         case "addNew": //插入新记录
           _this.insertNew(e);
           break;
+        case "InsertNull":
+          _this.insertVal();
+          break;
         case "ai": //插入ai
           _this.insertAI(e);
           break;
       }
     },
+    /* 插入空值 */
+    insertVal() {
+      let _this = this;
+      if (_this.comIndex < 0) {
+        _this.$alert("请选择插入图层");
+        return false;
+      }
+      let com = _this.coms[_this.comIndex];
+      let data = {
+        type: "variable",
+        id: "val" + (com.attrs.length + 1),
+        dataId: "",
+        name: "非变量",
+        intro: "",
+        content: "",
+        data: "",
+      };
+      com.attrs.push(data);
+      if (com.type == "TextArea") {
+        //如果是图文,更新内容
+        _this.insertCmd = {
+          content: "{{" + data.id + "}}",
+        };
+      } else {
+        //仅对图表中插入有效
+        if (_this.comIndex >= 0) {
+          _this.setTableData(data.id);
+        }
+      }
+    },
     /* 插入ai */
     insertAI(e) {
       let _this = this;
@@ -1265,7 +1512,6 @@ export default {
         search: e.content.searchTerm,
       };
       com.attrs.push(data);
-      console.log(com.attrs);
       if (com.type == "TextArea") {
         //如果是图文,更新内容
         _this.insertCmd = {
@@ -1605,15 +1851,40 @@ export default {
 
 <style lang="scss">
 @import "./create.scss";
-.borderless-collapse {
+/* .borderless-collapse {
   border: none;
-
-  ::v-deep .el-collapse-item__header,
+  ::v-deep.el-collapse-item .el-collapse-item__header{
+    border-bottom: none;
+  }
   ::v-deep .el-collapse-item__wrap {
     border-bottom: none;
   }
-  ::v-deep .el-collapse-item .el-collapse-item__header{
+  ::v-deep .el-collapse-item .el-collapse-item__header {
     border-bottom: none;
   }
+} */
+.min-width-content {
+  min-width: 150px; /* Set your desired minimum width here */
+}
+
+.el-collapse,
+.el-collapse-item__wrap {
+  border: none;
+}
+.el-collapse,
+.el-collapse-item__header {
+  border: none;
+}
+.borderless-collapse {
+  border: none;
+  ::v-deep .el-collapse-item__header,
+  ::v-deep .el-collapse-item__wrap,
+  ::v-deep .el-collapse-item__content,
+  ::v-deep .el-collapse-item {
+    border: none;
+  }
+  ::v-deep .el-collapse-item__wrap {
+    border-bottom: none !important;
+  }
 }
 </style>

+ 1 - 1
src/views/knowledgeMenu/knowledgeList.vue

@@ -143,7 +143,7 @@ export default {
       creatRules: {
         bucket_name: [
           { required: true, message: "请输入知识库名称", trigger: "blur" },
-          { validator: validateBucketName, trigger: "blur" },
+         /*  { validator: validateBucketName, trigger: "blur" }, */
         ],
       },
     };

+ 3 - 3
src/views/template/category/components/dataInfo.vue

@@ -122,12 +122,12 @@ export default {
       }).then((res) => {
         if (res.status != 200) return;
         _this.parentList.push({ id: 0, name: "父级分类" });
-        for (var i = 0; i < res.data.dataList.length; i++) {
+     /*    for (var i = 0; i < res.data.dataList.length; i++) {
           _this.parentList.push({
             id: res.data.dataList[i].id,
             name: res.data.dataList[i].name,
           });
-        }
+        } */
       });
     },
     //保存更新
@@ -159,7 +159,7 @@ export default {
       getTemplateCategoryInfo(par).then((res) => {
         if (!res) return;
         if (res.status != 200) return;
-        res.data.parent_id=Number( res.data.parent_id)
+        res.data.parent_id = Number(res.data.parent_id);
         _this.dataForm = res.data;
       });
     },

+ 191 - 22
src/views/template/category/components/dataList.vue

@@ -6,40 +6,33 @@
       lazy
       :load="loadData"
       row-key="id"
-      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+      :tree-props="{ children: 'child', hasChildren: 'hasChildren' }"
       show-overflow-tooltip
       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="id" label="ID" width="180" />
       <el-table-column
         prop="name"
         label="分类名称"
         align="left"
         min-width="180"
-      />
-      <!--        <el-table-column prop="intro" label="分类介绍" align="left" min-width="180"/> -->
-      <el-table-column
-        prop="createTime"
-        label="创建时间"
-        align="center"
-        width="180"
-      />
-      <el-table-column
-        prop="status"
-        label="分类状态"
-        align="center"
-        width="180"
       >
+      </el-table-column>
+      <el-table-column prop="createTime" label="创建时间" align="center" />
+      <el-table-column prop="status" label="分类状态" align="center">
         <template #default="scope">
           <div v-if="scope.row.status == 5">启用</div>
           <div v-if="scope.row.status == 6">停用</div>
         </template>
       </el-table-column>
-      <el-table-column label="操作" fixed="right" align="center" width="180">
+      <el-table-column label="操作" fixed="right" align="center">
         <template #default="scope">
           <div class="btns">
+            <el-button type="primary" size="small" @click="Subclass(scope.row)"
+              ><svg-icon icon-class="edit" />创建子类</el-button
+            >
             <el-button type="primary" size="small" @click="btnEdit(scope.row)"
               ><svg-icon icon-class="edit" />编辑</el-button
             >
@@ -67,13 +60,73 @@
       </el-pagination>
     </div>
 
+    <el-dialog
+      :visible.sync="SubclassVisible"
+      append-to-body
+      v-el-drag-dialog
+      width="50%"
+      custom-class="prod-verify"
+      title="创建子类"
+      @closed="handleSubClosed"
+    >
+      <!--       <dataInfo
+        :id="currentDataId"
+        @onClose="onClose"
+        ref="currentInfoRef"
+        @onSearch="search"
+      ></dataInfo> -->
+      <el-card>
+        <el-form :model="dataForm" ref="dataFormRef" label-width="120px">
+          <!-- <el-form-item label="父级分类:">
+            <el-select
+              v-model="dataForm.parent_id"
+              placeholder="请选择你级分类"
+              size="large"
+              clearable
+              style="width: 100%"
+            >
+              <el-option
+                v-for="item in parentList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+              />
+            </el-select>
+          </el-form-item> -->
+          <el-form-item label="分类名称:">
+            <el-input v-model="dataForm.name"></el-input>
+          </el-form-item>
+          <!-- <el-form-item label="分类介绍:">
+           <el-input type="textarea" v-model="dataForm.intro"></el-input>
+       </el-form-item> -->
+          <el-form-item label="分类状态:">
+            <el-select
+              v-model="dataForm.status"
+              placeholder="请选择分类状态"
+              size="large"
+              style="width: 100%"
+            >
+              <el-option
+                v-for="item in statusOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-form>
+      </el-card>
+      <div style="text-align: right; margin-top: 20px">
+        <el-button type="warning" @click="btnSave">确认保存</el-button>
+      </div>
+    </el-dialog>
     <el-dialog
       :visible.sync="dialogVisible"
       append-to-body
       v-el-drag-dialog
       width="50%"
       custom-class="prod-verify"
-      title="创建模板分类"
+      title="编辑分类"
       @closed="handleDialogClosed"
     >
       <dataInfo
@@ -87,7 +140,13 @@
 </template>
 
 <script>
-import { searchTemplateCategory, deleteTemplateCategory } from "@/api/template";
+import {
+  searchTemplateCategory,
+  deleteTemplateCategory,
+  createTemplateCategory,
+  updateTemplateCategory,
+  getTemplateCategoryInfo,
+} from "@/api/template";
 import dataInfo from "./dataInfo.vue";
 import elDragDialog from "@/directive/el-drag-dialog";
 export default {
@@ -126,12 +185,116 @@ export default {
       pageTotal: 1,
       dataList: [],
       currentData: {},
+      activeName: "base",
+      currentCategory: [],
+      dataForm: {
+        id: 0,
+        name: "",
+        parent_id: 0,
+        intro: "",
+        status: 5,
+      },
+      parentList: [],
+      statusOptions: [
+        {
+          value: "",
+          label: "请选择状态",
+        },
+        {
+          value: 5,
+          label: "启用",
+        },
+        {
+          value: 6,
+          label: "停用",
+        },
+      ],
+      SubclassVisible: false,
     };
   },
   mounted() {
     this.search();
+    this.initParentCategory();
   },
   methods: {
+    /* 弹窗 */
+    initParentCategory() {
+      let _this = this;
+      searchTemplateCategory({
+        page: 1,
+        pageSize: 999,
+        parent_id: 0,
+        status: 5,
+      }).then((res) => {
+        if (res.status != 200) return;
+        _this.parentList.push({ id: 0, name: "父级分类" });
+        /* for (var i = 0; i < res.data.dataList.length; i++) {
+          _this.parentList.push({
+            id: res.data.dataList[i].id,
+            name: res.data.dataList[i].name,
+          });
+        } */
+      });
+    },
+    //保存更新
+    btnSave(e) {
+      let _this = this;
+      if (_this.dataForm.id > 0) {
+        updateTemplateCategory(_this.dataForm).then((res) => {
+          if (res.status != 200) return;
+          _this.$alert("模板类别信息更新成功");
+          _this.SubclassVisible = false;
+          _this.search();
+        });
+      } else {
+        createTemplateCategory(_this.dataForm).then((res) => {
+          if (res.status != 200) return;
+          _this.$alert("模板类别信息创建成功");
+          _this.SubclassVisible = false;
+         if(_this.dataForm.child_count>0){
+          
+         }
+          _this.search();
+        });
+      }
+    },
+
+    //产品详情
+    getInfo(id) {
+      let _this = this;
+      let par = {
+        id: id,
+      };
+      getTemplateCategoryInfo(par).then((res) => {
+        if (!res) return;
+        if (res.status != 200) return;
+        res.data.parent_id = Number(res.data.parent_id);
+        _this.dataForm = res.data;
+      });
+    },
+
+    onChangeStatus(e) {
+      this.dataForm.status = e;
+    },
+    //修改分类信息
+    onChangeCategory(e) {
+      let _this = this;
+      _this.dataForm.categoryId = e;
+    },
+
+    /* 创建子类 */
+    Subclass(item) {
+      this.dataForm.parent_id = item.id;
+      //this.dataForm.child_count=item.child_count
+      this.SubclassVisible = true;
+    },
+    handleSubClosed() {
+      this.dataForm = {
+        name: "",
+        intro: "",
+        status: 5,
+      };
+    },
     handleDialogClosed() {
       // 清空 dataInfo 组件内的表单
       if (this.$refs.dataInfoRef) {
@@ -146,13 +309,19 @@ export default {
       // _this.$router.push({path:"/template/category/search",params:{parent_id:e}});
       // location.href="?parent_id="+e;
     },
-
     loadData(row, node, resolve) {
       setTimeout(() => {
         searchTemplateCategory({ parent_id: row.id }).then((res) => {
           if (res.data.length == 0) {
             this.$message.warning("暂无数据!");
           }
+          res.data.map((el) => {
+            if (el.child_count > 0) {
+              el.hasChildren = true;
+            } else {
+              el.hasChildren = false;
+            }
+          });
           resolve(res.data);
         });
 
@@ -165,7 +334,7 @@ export default {
       let par = {
         id: e,
       };
-      _this.queryForm.name=''
+      _this.queryForm.name = "";
       _this
         .$confirm("您是否确认删除该记录?", "提示", {
           confirmButtonText: "确认",
@@ -208,8 +377,8 @@ export default {
         res.data.dataList.map((el) => {
           if (el.child_count > 0) {
             el.hasChildren = true;
-          }else{
-            el.hasChildren = false
+          } else {
+            el.hasChildren = false;
           }
         });
         _this.dataList = res.data.dataList;

+ 28 - 6
src/views/template/components/dataSearch.vue

@@ -72,7 +72,16 @@
           ></el-input>
         </el-form-item>
         <el-form-item label="所属分类:" prop="category_id">
-          <el-select
+          <el-cascader
+            v-model="moduleForm.category_id"
+            clearable
+            :options="categoryList"
+            :props="props"
+            :show-all-levels="false"
+            @change="onChangeCategory"
+            placeholder="请选择模块分类"
+          />
+          <!-- <el-select
             v-model="moduleForm.category_id"
             clearable
             class="m-2"
@@ -85,7 +94,7 @@
               :label="item.name"
               :value="item.id"
             />
-          </el-select>
+          </el-select> -->
         </el-form-item>
         <el-form-item label="模块状态:" prop="status">
           <el-select
@@ -114,7 +123,12 @@
 <script>
 import dataInfo from "./dataInfo.vue";
 import elDragDialog from "@/directive/el-drag-dialog";
-import { searchTemplateCategory, createTemplate,getAllList } from "@/api/template";
+import {
+  searchTemplateCategory,
+  createTemplate,
+  getAllList,
+  treeCategory
+} from "@/api/template";
 export default {
   components: {
     dataInfo,
@@ -157,6 +171,12 @@ export default {
         status: 5,
         category_id: "",
       },
+      props: {
+        value: "id",
+        label: "name",
+        children: "children",
+        checkStrictly: true,
+      },
       moduleRules: {
         name: [{ required: true, message: "请输模块名称", trigger: "blur" }],
         status: [{ required: true, message: "请选择状态", trigger: "change" }],
@@ -170,6 +190,7 @@ export default {
     this.initCategoryList();
   },
   methods: {
+    onChangeCategory(){},
     /* 取消新增 */
     closeModule() {
       this.dialogVisible = false;
@@ -183,6 +204,7 @@ export default {
     submitModule() {
       this.$refs.moduleRef.validate((valid) => {
         if (valid) {
+          this.moduleForm.category_id = this.moduleForm.category_id[this.moduleForm.category_id.length - 1];
           createTemplate(this.moduleForm).then((res) => {
             if (res.status !== 200) return;
             this.$message.success("创建成功!");
@@ -192,7 +214,7 @@ export default {
               status: 5,
               category_id: "",
             };
-            this.onSubmit()
+            this.onSubmit();
           });
         }
       });
@@ -200,10 +222,10 @@ export default {
     /* 获取分类 */
     async initCategoryList() {
       let _this = this;
-      let res = await getAllList();
+      let res = await treeCategory();
       this.categoryList = res.data; //this.processDataForCascader(res.data);
     },
- /*    initCategory() {
+    /*    initCategory() {
       let _this = this;
       searchTemplateCategory({ page: 1, pageSize: 999, status: 5 }).then(
         (res) => {

Some files were not shown because too many files changed in this diff