Преглед изворни кода

增加测试环境配置。

zhengqiang пре 4 година
родитељ
комит
5b4caaee80
5 измењених фајлова са 209 додато и 121 уклоњено
  1. 17 0
      .env.test
  2. 1 0
      package.json
  3. 153 106
      src/components/SelectTree/index.vue
  4. 19 9
      src/views/sys/menu-detail.vue
  5. 19 6
      src/views/sys/menu-list.vue

+ 17 - 0
.env.test

@@ -0,0 +1,17 @@
+#VUE_APP_BACKEND_URL=http://wisdomhouse.sudaonline.net
+VUE_APP_BACKEND_URL=http://ykt-test.xiaoxinda.com/jp-housekeeper-server/
+
+#手机企业版
+VUE_APP_COMPANY_HEALTH_WECHAT_QY_URL=http://wisdomhousewechat.sudaonline.net/prevention/motemwall.html 
+
+#手机校园版
+VUE_APP_COMPANY_HEALTH_WECHAT_XY_URL=http://wisdomhousewechat.sudaonline.net/prevention-xxd/motemwall_xxd.html
+
+#大屏企业版
+VUE_APP_COMPANY_HEALTH_QY_URL=http://wisdomhousewechat.sudaonline.net/prevention/motemwall_pc.html
+
+#大屏校园版
+VUE_APP_COMPANY_HEALTH_XY_URL=http://wisdomhousewechat.sudaonline.net/prevention-xxd/motemwall_xxd_pc.html
+
+#打卡点二维码地址
+VUE_APP_PUNCHLOCATION_URL=http://yktwechat.xiaoxinda.com/#/health/codeScene

+ 1 - 0
package.json

@@ -5,6 +5,7 @@
   "scripts": {
   "scripts": {
     "serve": "vue-cli-service serve",
     "serve": "vue-cli-service serve",
     "build": "vue-cli-service build",
     "build": "vue-cli-service build",
+    "test": "vue-cli-service build --mode test",
     "lint": "vue-cli-service lint"
     "lint": "vue-cli-service lint"
   },
   },
   "dependencies": {
   "dependencies": {

+ 153 - 106
src/components/SelectTree/index.vue

@@ -1,142 +1,176 @@
 <template>
 <template>
- <el-select :size="size" :value="valueTitle" :clearable="clearable" @clear="clearHandle">
-    <el-input
-      :size="size"
-      class="selectInput"
-      :placeholder="placeholder"
-      v-model="filterText">
-    </el-input>
+  <el-select ref="treeSelect" :size="size" :value="valueTitle" :clearable="clearable" @clear="clearHandle" :style="{width:width}">
+    <el-input :size="size" class="selectInput" :placeholder="placeholder" v-model="filterText"></el-input>
     <el-option :value="valueTitle" :label="valueTitle" class="options">
     <el-option :value="valueTitle" :label="valueTitle" class="options">
-      <el-tree  id="tree-option"
+      <el-tree
+        id="tree-option"
         ref="selectTree"
         ref="selectTree"
         :accordion="accordion"
         :accordion="accordion"
         :data="optionData"
         :data="optionData"
         :props="props"
         :props="props"
-        :node-key="props.value"    
+        :node-key="props.value"
         :default-expanded-keys="defaultExpandedKey"
         :default-expanded-keys="defaultExpandedKey"
         :filter-node-method="filterNode"
         :filter-node-method="filterNode"
-        @node-click="handleNodeClick">
-      </el-tree>
+        @node-click="handleNodeClick"
+      ></el-tree>
     </el-option>
     </el-option>
   </el-select>
   </el-select>
 </template>
 </template>
 <script>
 <script>
 export default {
 export default {
   name: "el-tree-select",
   name: "el-tree-select",
-  props:{
+  props: {
     /* 配置项 */
     /* 配置项 */
-    props:{
+    props: {
       type: Object,
       type: Object,
-      default:()=>{
+      default: () => {
         return {
         return {
-          value:'id',             // ID字段名
-          label: 'title',         // 显示名称
-          children: 'children'    // 子级字段名
-        }
+          value: "id", // ID字段名
+          label: "name", // 显示名称
+          children: "children" // 子级字段名
+        };
       }
       }
     },
     },
     /* 选项列表数据(树形结构的对象数组) */
     /* 选项列表数据(树形结构的对象数组) */
-    options:{
-      type: Array,       
-      default: ()=>{ return [] }
+    options: {
+      type: Array,
+      default: () => {
+        return [];
+      }
     },
     },
     /* 初始值 */
     /* 初始值 */
-    value:{
+    value: {
       type: String,
       type: String,
-      default: ()=>{ return null }
+      default: () => {
+        return null;
+      }
     },
     },
     /* 初始值 */
     /* 初始值 */
-    size:{
+    size: {
+      type: String,
+      default: () => {
+        return "small";
+      }
+    },    
+    width: {
       type: String,
       type: String,
-      default: ()=>{ return 'small' }
+      default: () => {
+        return "200px";
+      }
     },
     },
     /* 可清空选项 */
     /* 可清空选项 */
-    clearable:{
-      type:Boolean,
-      default:()=>{ return true }
+    clearable: {
+      type: Boolean,
+      default: () => {
+        return true;
+      }
     },
     },
     /* 自动收起 */
     /* 自动收起 */
-    accordion:{
-      type:Boolean,
-      default:()=>{ return true }
+    accordion: {
+      type: Boolean,
+      default: () => {
+        return true;
+      }
     },
     },
-    placeholder:{
-      type:String,
-      default:()=>{return "检索关键字"}
+    placeholder: {
+      type: String,
+      default: () => {
+        return "检索关键字";
+      }
     }
     }
   },
   },
   computed: {
   computed: {
     /* 转树形数据 */
     /* 转树形数据 */
     optionData() {
     optionData() {
       //第一个节点为根节点
       //第一个节点为根节点
-      if(this.options.length>0){
+      if (this.options.length > 0) {
         var rootId = this.options[0].id;
         var rootId = this.options[0].id;
 
 
         let cloneData = JSON.parse(JSON.stringify(this.options)); // 对源数据深度克隆
         let cloneData = JSON.parse(JSON.stringify(this.options)); // 对源数据深度克隆
         return cloneData.filter(father => {
         return cloneData.filter(father => {
           // 循环所有项,并添加children属性
           // 循环所有项,并添加children属性
-          let branchArr = cloneData.filter(child => father.id == child.parentId); // 返回每一项的子级数组
+          let branchArr = cloneData.filter(
+            child => father.id == child.parentId
+          ); // 返回每一项的子级数组
           branchArr.length > 0 ? (father.children = branchArr) : ""; //给父级添加一个children属性,并赋值
           branchArr.length > 0 ? (father.children = branchArr) : ""; //给父级添加一个children属性,并赋值
           return father.id == rootId || father.parentId == null; //返回第一层
           return father.id == rootId || father.parentId == null; //返回第一层
         });
         });
-      }
-      else{
+      } else {
         return [];
         return [];
       }
       }
     }
     }
   },
   },
   data() {
   data() {
     return {
     return {
-      filterText: '',
-      valueId:this.value,    // 初始值
-      valueTitle:'',
-      defaultExpandedKey:[]    
-    }
+      filterText: "",
+      valueId: this.value, // 初始值
+      valueTitle: "",
+      defaultExpandedKey: []
+    };
   },
   },
-  mounted(){
-    this.initHandle()
+  mounted() {
+    this.initHandle();
   },
   },
   methods: {
   methods: {
     // 初始化值
     // 初始化值
-    initHandle(){
+    initHandle() {
+      console.log("options.length=" + this.options.length);
+      console.log(this.value);
+
+      var arr = this.options.filter(item=>item.id == this.value);
+
+      if(arr.length>0){
+        this.valueTitle = arr[0][this.props.label];
+      }
+
       if(this.valueId){
       if(this.valueId){
-        this.valueTitle = this.$refs.selectTree.getNode(this.valueId).data[this.props.label]     // 初始化显示
-        this.$refs.selectTree.setCurrentKey(this.valueId)       // 设置默认选中
-        this.defaultExpandedKey = [this.valueId]      // 设置默认展开
-      } 
-      this.initScroll()
+        this.$refs.selectTree.setCurrentKey(this.valueId); // 设置默认选中
+        this.defaultExpandedKey = [this.valueId]; // 设置默认展开
+      }
+
+      this.initScroll();
     },
     },
     // 初始化滚动条
     // 初始化滚动条
-    initScroll(){
-      this.$nextTick(()=>{
-        let scrollWrap = document.querySelectorAll('.el-scrollbar .el-select-dropdown__wrap')[0]
-        let scrollBar = document.querySelectorAll('.el-scrollbar .el-scrollbar__bar')
-        scrollWrap.style.cssText = 'margin: 0px; max-height: none; overflow: hidden;'
-        scrollBar.forEach(ele => ele.style.width = 0)
-      })
+    initScroll() {
+      this.$nextTick(() => {
+        let scrollWrap = document.querySelectorAll(
+          ".el-scrollbar .el-select-dropdown__wrap"
+        )[0];
+        let scrollBar = document.querySelectorAll(
+          ".el-scrollbar .el-scrollbar__bar"
+        );
+        scrollWrap.style.cssText =
+          "margin: 0px; max-height: none; overflow: hidden;";
+        scrollBar.forEach(ele => (ele.style.width = 0));
+      });
     },
     },
     // 切换选项
     // 切换选项
-    handleNodeClick(node){
-      this.valueTitle = node[this.props.label]
-      this.valueId = node[this.props.value]
+    handleNodeClick(node) {
+      this.valueTitle = node[this.props.label];
+      this.valueId = node[this.props.value];
       //this.node = node;
       //this.node = node;
-      this.$emit('getValue',this.valueId)
+
+      this.$emit("input", this.valueId);
+
+      this.$refs.treeSelect.blur();
+
       //this.$emit('getValue',node)
       //this.$emit('getValue',node)
-      this.defaultExpandedKey = []
+      this.defaultExpandedKey = [];
+
+
     },
     },
     // 清除选中
     // 清除选中
-    clearHandle(){
-      this.valueTitle = ''
-      this.valueId = null
-      this.defaultExpandedKey = []
-      this.clearSelected()
-      this.$emit('getValue',null)
-      
+    clearHandle() {
+      this.valueTitle = "";
+      this.valueId = null;
+      this.defaultExpandedKey = [];
+      this.clearSelected();
+      this.$emit("input", null);
     },
     },
     /* 清空选中样式 */
     /* 清空选中样式 */
-    clearSelected(){
-      let allNode = document.querySelectorAll('#tree-option .el-tree-node')
-      allNode.forEach((element)=>element.classList.remove('is-current'))
+    clearSelected() {
+      let allNode = document.querySelectorAll("#tree-option .el-tree-node");
+      allNode.forEach(element => element.classList.remove("is-current"));
     },
     },
     filterNode(value, data) {
     filterNode(value, data) {
       if (!value) return true;
       if (!value) return true;
@@ -144,44 +178,57 @@ export default {
     }
     }
   },
   },
   watch: {
   watch: {
-    value(){
-      this.valueId = this.value
-      this.initHandle()
+    value(newVal,oldVal) {
+      this.valueId = newVal;
+
+      if(newVal=='') {
+        this.clearHandle();
+      }
+
+      this.initHandle();
+    },
+    options(newVal,oldVal) {
+      //如果options读取慢,则
+      if(oldVal==null || oldVal.length==0){
+        setTimeout(()=>{
+          this.initHandle();
+        },100);
+      }
     },
     },
     filterText(val) {
     filterText(val) {
       this.$refs.selectTree.filter(val);
       this.$refs.selectTree.filter(val);
     }
     }
-  },
+  }
 };
 };
 </script>
 </script>
 <style>
 <style>
- .el-scrollbar .el-scrollbar__view .el-select-dropdown__item{
-    height: auto;
-    max-height: 274px;
-    padding: 0;
-    overflow: hidden;
-    overflow-y: auto;
-  }
-  .el-select-dropdown__item.selected{
-    font-weight: normal;
-  }
-  ul li >>>.el-tree .el-tree-node__content{
-    height:auto;
-    padding: 0 20px;
-  }
-  .el-tree-node__label{
-    font-weight: normal;
-  }
-  .el-tree >>>.is-current .el-tree-node__label{
-    color: #409EFF;
-    font-weight: 700;
-  }
-  .el-tree >>>.is-current .el-tree-node__children .el-tree-node__label{
-    color:#606266;
-    font-weight: normal;
-  }
-  .selectInput{
-    padding: 0 5px;
-    box-sizing: border-box;
-  }
+.el-scrollbar .el-scrollbar__view .el-select-dropdown__item {
+  height: auto;
+  max-height: 274px;
+  padding: 0;
+  overflow: hidden;
+  overflow-y: auto;
+}
+.el-select-dropdown__item.selected {
+  font-weight: normal;
+}
+ul li >>> .el-tree .el-tree-node__content {
+  height: auto;
+  padding: 0 20px;
+}
+.el-tree-node__label {
+  font-weight: normal;
+}
+.el-tree >>> .is-current .el-tree-node__label {
+  color: #409eff;
+  font-weight: 700;
+}
+.el-tree >>> .is-current .el-tree-node__children .el-tree-node__label {
+  color: #606266;
+  font-weight: normal;
+}
+.selectInput {
+  padding: 0 5px;
+  box-sizing: border-box;
+}
 </style>
 </style>

+ 19 - 9
src/views/sys/menu-detail.vue

@@ -18,7 +18,7 @@
           <el-input v-model="formModel.menuName" placeholder="请输入菜单名称" style="width:300px"></el-input>
           <el-input v-model="formModel.menuName" placeholder="请输入菜单名称" style="width:300px"></el-input>
         </el-form-item>
         </el-form-item>
         <el-form-item label="上级菜单" prop="parentId">
         <el-form-item label="上级菜单" prop="parentId">
-          <el-select
+          <!-- <el-select
             v-model="formModel.parentId"
             v-model="formModel.parentId"
             filterable
             filterable
             remote
             remote
@@ -27,20 +27,21 @@
             :remote-method="queryMenu"
             :remote-method="queryMenu"
             style="width:300px"
             style="width:300px"
           >
           >
-            <!-- <template v-if="formModel.parentId!=null">
-              <el-option
-                :key="formModel.parentId"
-                :label="formModel.parentName"
-                :value="formModel.parentId"
-              ></el-option>
-            </template> -->
             <el-option
             <el-option
               v-for="menu in menuList"
               v-for="menu in menuList"
               :key="menu.id"
               :key="menu.id"
               :label="menu.menuName + '(' + menu.sortNo + ')'"
               :label="menu.menuName + '(' + menu.sortNo + ')'"
               :value="menu.id"
               :value="menu.id"
             ></el-option>
             ></el-option>
-          </el-select>
+          </el-select> -->
+          <el-select-tree
+            :props="props"
+            :options="menuList"
+            v-model="formModel.parentId"
+            style="width:300px;"
+            size="mediumn"
+            height="200"
+          ></el-select-tree>
         </el-form-item>
         </el-form-item>
         <el-form-item label="排序号" prop="sortNo">
         <el-form-item label="排序号" prop="sortNo">
           <el-input v-model="formModel.sortNo" placeholder="请输入排序号" style="width:300px"></el-input>
           <el-input v-model="formModel.sortNo" placeholder="请输入排序号" style="width:300px"></el-input>
@@ -74,6 +75,7 @@
 <script>
 <script>
 import Constant from "@/constant";
 import Constant from "@/constant";
 import menuApi from "@/api/sys/menu";
 import menuApi from "@/api/sys/menu";
+import SelectTree from "@/components/SelectTree";
 
 
 export default {
 export default {
   props: ["menuId","modalTitle","parentMenu"],
   props: ["menuId","modalTitle","parentMenu"],
@@ -100,6 +102,11 @@ export default {
         ]
         ]
       },
       },
       menuList:[],
       menuList:[],
+      props: {
+        // 配置项(必选)
+        value: "id",
+        label: "menuName"
+      },
       loading: false,
       loading: false,
       submitting: false,
       submitting: false,
       showDialog: true
       showDialog: true
@@ -232,6 +239,9 @@ export default {
     }).catch(error => {
     }).catch(error => {
       self.$message.error(error + "");
       self.$message.error(error + "");
     });
     });
+  },
+  components: {
+    "el-select-tree": SelectTree
   }
   }
 };
 };
 </script>
 </script>

+ 19 - 6
src/views/sys/menu-list.vue

@@ -24,7 +24,7 @@
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
       <el-form-item label="上级菜单" prop="parentId">
       <el-form-item label="上级菜单" prop="parentId">
-        <el-select
+        <!-- <el-select
             size="mini"
             size="mini"
             v-model="queryModel.parentId"
             v-model="queryModel.parentId"
             filterable
             filterable
@@ -38,7 +38,14 @@
               :label="menu.menuName"
               :label="menu.menuName"
               :value="menu.id"
               :value="menu.id"
             ></el-option>
             ></el-option>
-        </el-select>
+        </el-select> -->
+        <el-select-tree
+            size="mini"
+            :props="props"
+            :options="queryMenuResult"
+            v-model="queryModel.parentId"
+            height="200"
+          ></el-select-tree>
       </el-form-item>
       </el-form-item>
       <el-form-item>
       <el-form-item>
         <el-button
         <el-button
@@ -130,7 +137,6 @@
       @size-change="pageSizeChange"
       @size-change="pageSizeChange"
       layout="total, sizes, prev, pager, next, jumper"
       layout="total, sizes, prev, pager, next, jumper"
     ></el-pagination>
     ></el-pagination>
-
       <menu-detail
       <menu-detail
         v-if="showDetailModal"
         v-if="showDetailModal"
         @close="onDetailModalClose"
         @close="onDetailModalClose"
@@ -147,6 +153,7 @@ import MenuDetail from "./menu-detail";
 import menuApi from "@/api/sys/menu";
 import menuApi from "@/api/sys/menu";
 import NProgress from "nprogress"; // progress bar
 import NProgress from "nprogress"; // progress bar
 import "nprogress/nprogress.css"; // progress bar style
 import "nprogress/nprogress.css"; // progress bar style
+import SelectTree from "@/components/SelectTree";
 
 
 export default {
 export default {
   name: 'SysMenuList',
   name: 'SysMenuList',
@@ -174,7 +181,12 @@ export default {
       showDetailModal: false,
       showDetailModal: false,
       menuId: "",
       menuId: "",
       queryMenuResult: [],
       queryMenuResult: [],
-      parentMenu: {}
+      parentMenu: {},
+      props: {
+        // 配置项(必选)
+        value: "id",
+        label: "menuName"
+      }
     };
     };
   },
   },
   methods: {
   methods: {
@@ -326,7 +338,7 @@ export default {
     queryMenu(keywords) {
     queryMenu(keywords) {
       var formData = new FormData();
       var formData = new FormData();
       formData.append("keywords",keywords);
       formData.append("keywords",keywords);
-      formData.append("limit",10);
+      formData.append("limit",1000);
 
 
       return menuApi.query(formData).then(response=>{
       return menuApi.query(formData).then(response=>{
         var jsonData = response.data;
         var jsonData = response.data;
@@ -361,7 +373,8 @@ export default {
     this.queryMenu("");
     this.queryMenu("");
   },
   },
   components: {
   components: {
-    "menu-detail": MenuDetail
+    "menu-detail": MenuDetail,
+    "el-select-tree": SelectTree
   }
   }
 };
 };
 </script>
 </script>