Procházet zdrojové kódy

业务类型管理

zhangkunling před 2 roky
rodič
revize
8b73388649
29 změnil soubory, kde provedl 1808 přidání a 178 odebrání
  1. 45 4
      src/assets/iconfont/iconfont.css
  2. 0 0
      src/assets/iconfont/iconfont.js
  3. 70 0
      src/assets/iconfont/iconfont.json
  4. binární
      src/assets/iconfont/iconfont.ttf
  5. binární
      src/assets/iconfont/iconfont.woff
  6. binární
      src/assets/iconfont/iconfont.woff2
  7. binární
      src/assets/images/dataQuality1.png
  8. binární
      src/assets/images/dataQuality2.png
  9. binární
      src/assets/images/dataQuality3.png
  10. binární
      src/assets/images/dataQuality4.png
  11. 5 0
      src/assets/styles/common.css
  12. 99 0
      src/components/StatisticsList.vue
  13. 99 0
      src/components/TabsList.vue
  14. 12 3
      src/libs/utils.js
  15. 13 0
      src/router/index.js
  16. 1 5
      src/views/MainPage.vue
  17. 324 0
      src/views/homecomponents/BasicInfomation/ApplicationBusiness.vue
  18. 16 25
      src/views/homecomponents/BasicInfomation/ApplicationManage.vue
  19. 42 108
      src/views/homecomponents/BasicInfomation/ApplicationStation.vue
  20. 31 2
      src/views/homecomponents/BasicInfomation/InstruManage.vue
  21. 0 1
      src/views/homecomponents/Content.vue
  22. 24 0
      src/views/homecomponents/DataManagement/DataMonitor.vue
  23. 582 0
      src/views/homecomponents/DataManagement/DataRules.vue
  24. 173 0
      src/views/homecomponents/DataManagement/QualityRules/RuleStepThree.vue
  25. 230 0
      src/views/homecomponents/DataManagement/QualityRules/RuleStepTwo.vue
  26. 26 8
      src/views/homecomponents/Head.vue
  27. 12 18
      src/views/homecomponents/Nav.vue
  28. 3 3
      src/views/homecomponents/SystemSettings/OperationLog.vue
  29. 1 1
      src/views/homecomponents/SystemSettings/ResourceManagementIndex.vue

+ 45 - 4
src/assets/iconfont/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 2962009 */
-  src: url('iconfont.woff2?t=1644799418308') format('woff2'),
-       url('iconfont.woff?t=1644799418308') format('woff'),
-       url('iconfont.ttf?t=1644799418308') format('truetype');
+  src: url('iconfont.woff2?t=1647486573632') format('woff2'),
+       url('iconfont.woff?t=1647486573632') format('woff'),
+       url('iconfont.ttf?t=1647486573632') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,46 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-wancheng:before {
+  content: "\e844";
+}
+
+.icon-jurassic_report:before {
+  content: "\e6b3";
+}
+
+.icon-shujuku:before {
+  content: "\e607";
+}
+
+.icon-shujuzhiliang:before {
+  content: "\e67f";
+}
+
+.icon-jiance:before {
+  content: "\e709";
+}
+
+.icon-a-zhijianguizeguizeguanli:before {
+  content: "\e87b";
+}
+
+.icon-leixing:before {
+  content: "\e7e3";
+}
+
+.icon-kaoheweidufenxi:before {
+  content: "\e601";
+}
+
+.icon-guanli:before {
+  content: "\e617";
+}
+
+.icon-guize:before {
+  content: "\e743";
+}
+
 .icon-caidan:before {
   content: "\e616";
 }
@@ -215,4 +255,5 @@
 
 .icon-nenghao:before {
   content: "\e609";
-}
+}
+

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
src/assets/iconfont/iconfont.js


+ 70 - 0
src/assets/iconfont/iconfont.json

@@ -6,6 +6,76 @@
   "description": "",
   "glyphs": [
     {
+      "icon_id": "1474234",
+      "name": "完成",
+      "font_class": "wancheng",
+      "unicode": "e844",
+      "unicode_decimal": 59460
+    },
+    {
+      "icon_id": "10594766",
+      "name": "表-报告_jurassic",
+      "font_class": "jurassic_report",
+      "unicode": "e6b3",
+      "unicode_decimal": 59059
+    },
+    {
+      "icon_id": "13173816",
+      "name": "数据库",
+      "font_class": "shujuku",
+      "unicode": "e607",
+      "unicode_decimal": 58887
+    },
+    {
+      "icon_id": "15217676",
+      "name": "数据质量",
+      "font_class": "shujuzhiliang",
+      "unicode": "e67f",
+      "unicode_decimal": 59007
+    },
+    {
+      "icon_id": "19100166",
+      "name": "监测",
+      "font_class": "jiance",
+      "unicode": "e709",
+      "unicode_decimal": 59145
+    },
+    {
+      "icon_id": "25568392",
+      "name": "质检规则&规则管理",
+      "font_class": "a-zhijianguizeguizeguanli",
+      "unicode": "e87b",
+      "unicode_decimal": 59515
+    },
+    {
+      "icon_id": "6665275",
+      "name": "类型",
+      "font_class": "leixing",
+      "unicode": "e7e3",
+      "unicode_decimal": 59363
+    },
+    {
+      "icon_id": "6980480",
+      "name": "考核维度分析",
+      "font_class": "kaoheweidufenxi",
+      "unicode": "e601",
+      "unicode_decimal": 58881
+    },
+    {
+      "icon_id": "7851871",
+      "name": "manage01",
+      "font_class": "guanli",
+      "unicode": "e617",
+      "unicode_decimal": 58903
+    },
+    {
+      "icon_id": "15365726",
+      "name": "规则",
+      "font_class": "guize",
+      "unicode": "e743",
+      "unicode_decimal": 59203
+    },
+    {
       "icon_id": "5458039",
       "name": "菜单3",
       "font_class": "caidan",

binární
src/assets/iconfont/iconfont.ttf


binární
src/assets/iconfont/iconfont.woff


binární
src/assets/iconfont/iconfont.woff2


binární
src/assets/images/dataQuality1.png


binární
src/assets/images/dataQuality2.png


binární
src/assets/images/dataQuality3.png


binární
src/assets/images/dataQuality4.png


+ 5 - 0
src/assets/styles/common.css

@@ -61,6 +61,11 @@ html,body{
   margin-left: 10px;
   color: #fff;
 }
+/* 自定义Modal样式 */
+.custom-footer {
+  display: flex;
+  justify-content: space-between;
+}
 /* form表单样式 */
 .common-form .ivu-form-item-label {
   color: #F5F5F5;

+ 99 - 0
src/components/StatisticsList.vue

@@ -0,0 +1,99 @@
+<template>
+  <div class="tabs-list-wrap">
+    <Row :gutter="16">
+      <Col :span="spanNum" v-for="(item, index) in tabsData" :key="index">
+        <div class="tabs-list">
+          <img :src="tabsIcon[index].imgSrc" >
+          <div>
+            <p class="">{{ item.text }}</p>
+            <p :style="'color:'+tabsTitleColor[index]" class="tabs-list-value">{{ item.value }}<span class="tabs-list-company">{{ item.company }}</span></p>
+          </div>
+        </div>
+      </Col>
+    </Row>
+  </div>
+</template>
+<script>
+export default {
+  name: "StatisticsList",
+  props: {
+    tabsInitData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    tabsIcon: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    tabsTitleColor: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    spanNum: {
+      type: Number,
+      default: 6
+    }
+  },
+  components:{
+  },
+  data() {
+    return {
+      tabsData: []
+    };
+  },
+  mounted() {
+    // this.$nextTick(()=> {
+    //   this.tabsData = this.tabsInitData
+    // })
+    this.tabsData = this.tabsInitData
+    console.log(this.tabsData)
+  },
+  methods: {
+   
+  }
+};
+</script>
+<style scoped lang="stylus">
+.tabs-list-wrap {
+  display: flex;
+  justify-content: space-between;
+}
+.tabs-list {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex: 1;
+  background: #0B2856;
+  border: 1px solid #204384;
+  height: 120px;
+  font-size: 14px;
+  color: #0185EA;
+  img {
+    margin-right: 30px;
+  }
+  .tabs-list-value {
+
+    font-size: 30px;
+  }
+  .tabs-list-company {
+    font-size: 14px;
+    margin-left: 6px;
+  }
+}
+>>> .ivu-row {
+  width: 100%;
+  margin: 0 !important;
+}
+>>> .ivu-row .ivu-col:first-child {
+  padding-left: 0px !important;
+}
+>>> .ivu-row .ivu-col:last-child {
+  padding-right: 0px !important;
+}
+</style>

+ 99 - 0
src/components/TabsList.vue

@@ -0,0 +1,99 @@
+<template>
+  <div class="tabs-list-wrap">
+    <div class="tabs-list-bar">
+      <div class="tabs-list-bar-item" style="" v-for="(item,index) in arr" :key="index">
+            <div :style="{flex:(index==0 ? 1:'1 1 0%')}" :class="{'item': index>0}">
+              <Icon type="ios-arrow-forward" style="color:#5F83BE;fontSize:22px;" v-show="index>0"/>
+            </div>
+            <div class="dot" :class="currentStep==index+1? 'active' : ''">
+               <i class="iconfont icon-wancheng" style="cursor:pointer;color:#67C272;fontSize:26px;marginRight:6px" v-if="currentStep==index+1"></i>
+               <div class="default-dot" v-else></div>
+              {{item}}
+            </div>
+            <div :style="{flex:(index==arr.length-1 ? 1:'1 1 0%')}" :class="{'item': index<arr.length-1}"></div>
+        </div>
+    </div>
+    <!-- <div class="tabs-content">
+      <slot name="content"></slot> 
+    </div> -->
+  </div>
+</template>
+<script>
+export default {
+  name: "TabsList",
+  props: {
+    currentStep: {
+      type: Number,
+      default: 1
+    },
+  },
+  components:{
+  },
+  data() {
+    return {
+      arr:['基础信息','选择数据源','配置规则','完成'],
+      // currentStep:1,
+    };
+  },
+  watch: {
+    currentStep: {
+     handler(newValue) {
+        // this.disabledLevel = newValue
+        // if (this.disabledLevel>=5) {
+        // this.childDisabled = true
+        // } else {
+        //   this.childDisabled = false
+        // }
+      }
+   },
+  },
+  mounted() {
+  },
+  methods: {
+   
+  }
+};
+</script>
+<style scoped lang="stylus">
+.tabs-list-wrap {
+  width: 100%;
+  height: 64px;
+  background: #113A7B;
+}
+.tabs-list-bar {
+  display:flex;
+  align-items: center;
+  height:100%;
+}
+.tabs-list-bar-item {
+  flex:1;
+  display:flex;
+  align-items: center;
+}
+.dot{
+    text-align: center;
+    color: #FFFFFF;
+    font-size: 18px;
+    display: flex;
+    align-items: center;
+}
+.item{
+    flex:1;
+    // background: yellow;
+    // height: 1px;
+}
+.active {
+ color: #67C272;
+}
+.default-dot {
+  width: 22PX;
+  height: 22PX;
+  background: #113A7B;
+  border: 2PX solid #739EE6;
+  border-radius: 50%;
+  margin-right: 6PX;
+}
+// .tabs-content {
+//   margin-top: 20px;
+// }
+</style>

+ 12 - 3
src/libs/utils.js

@@ -22,14 +22,23 @@ const utils = {
     let leftMenus = menus[0].childMenus;
     if(id) {
       const menu = menus.find(item => item.menuId === id);
-      leftMenus = menu.childMenus;
+      if (menu && menu.childMenus) {
+        leftMenus = menu.childMenus;
+      } else {
+        leftMenus = []
+      }
     }
     // TODO , Will handle the more sub menu
     const noSubMenu = leftMenus.filter(item => {
-      return !item.childMenus
+      if (item.childMenus) {
+        return item.childMenus
+      } else {
+        return !item.childMenus
+      }
     })
     let currRouterName = noSubMenu[0].linkUrl;
-    return { currRouterName, leftMenus};
+    let currMenuId = noSubMenu[0].menuId;
+    return { currRouterName, leftMenus,currMenuId};
   },
   removeSpace (str) { // 去掉字符串中間多余空白(保留一個空白)
     let repStr = ''

+ 13 - 0
src/router/index.js

@@ -20,6 +20,8 @@ const UserManagement = ()=>import('@/views/homecomponents/SystemSettings/UserMan
 const RolePermissions = ()=>import('@/views/homecomponents/SystemSettings/RolePermissions.vue')
 const ResourceManagement = ()=>import('@/views/homecomponents/SystemSettings/ResourceManagement.vue')
 const OperationLog = ()=>import('@/views/homecomponents/SystemSettings/OperationLog.vue')
+const DataMonitor = ()=>import('@/views/homecomponents/DataManagement/DataMonitor.vue')
+const DataRules = ()=>import('@/views/homecomponents/DataManagement/DataRules.vue')
 Vue.use(VueRouter)
 
 const routes = [
@@ -125,6 +127,17 @@ const routes = [
         name: 'OperationLog', 
         component: OperationLog
       },
+      // 数据管理
+      {
+        path: 'DataMonitor', 
+        name: 'DataMonitor', 
+        component: DataMonitor
+      },
+      {
+        path: 'DataRules', 
+        name: 'DataRules', 
+        component: DataRules
+      },
       // {
       //   path: 'BasicInfomation',
       //   component: BasicInfomation,

+ 1 - 5
src/views/MainPage.vue

@@ -29,7 +29,7 @@ export default {
     '$route' (to, from) {
       if (to.path == '/mainPage') {
         this.menuId = 0
-      }
+      } 
     }
   },
   mounted() {
@@ -37,10 +37,6 @@ export default {
   methods: {
    getMenuId: function(id,arr) {
       this.menuId = id;
-      // if (menuName) {
-      //   this.menuName.push(menuName)
-      //   console.log('数组',this.menuName)
-      // }
       sessionStorage.setItem('id', id);
     },
     // getMenuName (arr) {

+ 324 - 0
src/views/homecomponents/BasicInfomation/ApplicationBusiness.vue

@@ -0,0 +1,324 @@
+<template>
+  <div class="content-main-manage">
+    <div class="search-list">
+      <div class="btn-container">
+        <Button icon="ios-add" class="common-add-btn" @click="addClick">新增业务类型</Button>
+      </div>
+    </div>
+    <div class="manage-main-center">
+      <Table :columns="columns" :data="tableData" class="common-table app-table" no-data-text="" :row-class-name="rowClassName" :loading="loading">
+        <template slot="loading">
+            <Loading-animation></Loading-animation>
+        </template>
+         <template slot-scope="{ row }" slot="action">
+           <Tooltip content="编辑" placement="top">
+              <i class="iconfont icon-bianji" style="cursor:pointer;color:#64ACFE;fontSize:20px;marginRight:6px" @click="editClick(row)"></i>
+           </Tooltip>
+           <Tooltip content="删除" placement="top">
+              <i class="iconfont icon-shanchu" style="cursor:pointer;color:#E92E2E;fontSize:20px;marginRight:6px" @click="delClick(row)"></i>
+           </Tooltip>
+        </template>
+      </Table>
+    </div>
+      <div class="common-page">
+      <div class="common-page-total">
+        共<span>{{tablePage}}</span>页 / <span>{{tableTotal}}</span>条数据
+      </div>
+      <Page :total="tableTotal" :current="tableParams.pageNum" :page-size="tableParams.pageSize" @on-change="changePage" @on-page-size-change="sizeChange" show-elevator />
+    </div>
+    <Modal
+      v-model="showModal"
+      :title="title"
+      width="36"
+      ref="modalGrag"
+      draggable
+      reset-drag-position
+      @on-visible-change="modalChange"
+      :mask-closable="false"
+      class-name="common-modal">
+      <Form class="common-form" ref="formOption" :model="formOption" :rules="ruleValidate" :label-width="140">
+        <FormItem label="业务类型:" prop="businessTypeName">
+          <Input v-model.trim="formOption.businessTypeName" maxlength="20" show-word-limit />
+        </FormItem>
+        <FormItem label="说明:" prop="remark">
+          <Input v-model="formOption.remark" type="textarea" :rows="6" maxlength="200" show-word-limit />
+        </FormItem>
+			</Form>
+      <div slot="footer">
+          <Button @click="modalCancel">取消</Button>
+          <Button type="primary" @click="modalOk('formOption')">确定</Button>
+        </div>
+    </Modal>
+    <Modal
+      v-model="modalStatus"
+      :title="commonTitle"
+      width="30" 
+      draggable
+      reset-drag-position
+      :mask-closable="false"
+      class-name="common-modal">
+      <Icon type="ios-information-circle" :style="{ color: activeColor}" class="modal-icon"></Icon>
+      <span class="modal-text">{{modalTitle}}</span>
+      <div slot="footer">
+          <Button @click="commonCancel">取消</Button>
+          <Button type="primary" @click="commonOk">确定</Button>
+        </div>
+    </Modal>
+  </div>
+</template>
+<script>
+const defaultFrom = {businessTypeName: ''}
+export default {
+  name: "ApplicationBusiness",
+  components:{
+  },
+  data() {
+    return {
+      loading: true,
+      tableParams: {
+        pageNum: 1,
+        pageSize: 10
+      },
+      tableData: [],
+      tableTotal: 0,
+      tablePage: 0,
+      rowObj: {},
+      columns: [
+          {
+            title: '应用业务类型',
+            key: 'businessTypeName',
+            align: 'center'
+          },
+          {
+            title: '对应应用数量',
+            key: 'applicationNum',
+            align: 'center',
+          },
+          {
+          title: '操作',
+          align: 'center',
+          slot: 'action',
+        }
+      ],
+      tableTotal: 0,
+      showModal: false,
+      modalStatus: false,
+      title: '新增业务类型',
+      commonTitle: "确认删除",
+      activeColor: '#E92E2E',
+      activeClass: '',
+      modalTitle: '',
+      formOption: {businessTypeName: ''},
+      ruleValidate: {
+        businessTypeName: [{
+          required: true,
+          message: '请输入业务类型',
+          trigger: 'blur'
+        }],
+      },
+    };
+  },
+  mounted() {
+  },
+  methods: {
+    rowClassName(row, index) {
+      if (index % 2 == 0) {
+        return "ivu-table-stripe-even";
+      } else {
+        return "ivu-table-stripe-odd";
+      }
+    },
+    // 分页
+    changePage (val) {
+      this.tableParams.pageNum = val
+      this.getTableData()
+    },
+    //跳转
+    sizeChange (val) {
+      this.tableParams.pageSize = val
+      this.getTableData()
+    },
+    // 获取表格数据
+    getTableData () {
+      let params = JSON.parse(JSON.stringify(this.tableParams))
+      this.loading = true
+      this.$get('metroapi/businessType/list', params).then(res=>{
+        this.loading = false
+          if (res.httpCode == 1 ){
+            this.tableData = res.data.data
+            this.tableTotal = res.data.count
+            if (res.data.data.length==0) {
+              this.tablePage = 0
+            } else {
+              this.tablePage = res.data.count<= 10 ? 1: Math.ceil(res.data.count/this.tableParams.pageSize)
+            }
+            if (res.data.data.length==0 && this.tableParams.pageNum>1) {
+              this.tableParams.pageNum--
+              return this.getTableData()
+            }
+          } else {
+            this.tableData = []
+            this.tableTotal = 0
+          }
+        })
+    },
+    searchClick () {
+      this.getTableData()
+    },
+    resetClick (name) {
+     this.$refs[name].resetFields()
+     this.tableParams.pageNum = 1
+     this.getTableData()
+    },   
+    addClick () {
+      this.formOption = JSON.parse(JSON.stringify(defaultFrom))
+      this.title = '新增业务类型'
+      this.showModal = true
+    },
+    editClick (row) {
+      this.rowObj = row
+      this.formOption = JSON.parse(JSON.stringify(row));
+      this.title = '编辑业务类型'
+      this.showModal = true
+    },
+    delClick (row) {
+      this.rowObj = row
+      this.commonTitle = '确认删除'
+      this.activeColor = '#E92E2E'
+      this.activeClass = ''
+      this.modalTitle = '删除的同时将解绑所有运营数据,且数据不可恢复。请慎重操作。'
+      this.modalStatus = true
+    },
+    modalChange (modalStatus) {
+     if (!modalStatus) {
+      this.$refs.formOption.resetFields();
+     }
+    },
+    modalOk (formName) {
+      let params = JSON.parse(JSON.stringify(this.formOption)) //把对象中的数据给了某个变量,改变一个对象的值,另一个对象也变化的解决方法
+      this.$refs[formName].validate((valid) => {
+          if (valid) {
+            this.changeTableStatus(params)
+          } else {
+            this.showModal = true
+          }
+       })
+    },
+    changeTableStatus (params) {
+      this.$post('metroapi/businessType/save', params).then(res=>{
+        if (res.httpCode == 1 ){
+          this.showModal = false
+          this.$Message.info(res.msg)
+          this.getTableData()
+        } else {
+          this.$Message.info(res.msg)
+        }
+      })
+    },
+    modalCancel () {
+      this.showModal = false
+    },
+    commonOk () {
+      let params = {
+        id: this.rowObj.id
+      }
+      this.delData(params)
+    },
+    commonCancel () {
+      this.modalStatus = false
+    },
+    // 删除
+    delData (params) {
+      this.$post('metroapi/businessType/delete',params).then(res=>{
+        if (res.httpCode == 1 ){
+          this.modalStatus = false
+          this.$Message.info(res.msg)
+          this.getTableData()
+        } else {
+          this.$Message.info(res.msg)
+        }
+      })
+    },
+  }
+};
+</script>
+<style scoped lang="stylus">
+.content-main-manage {
+  position: relative;
+  overflow: hidden;
+}
+.search-list {
+  display: flex;
+  justify-content: end;
+  padding: 10px 0;
+}
+.search-left {
+  display: flex;
+  align-items: center;
+   .ivu-select {
+     width: 150px;
+     height: 32px;
+   }
+   .ivu-select-single .ivu-select-selection {
+     height: 100%;
+   }
+    >>> .ivu-input {
+     width: 155px;
+     height: 32px;
+   }
+}
+.manage-main-center {
+  width: 100%;
+  height: calc(100% - 150px);
+}
+.common-table {
+  max-height: 100%;
+}
+>>> .common-table .ivu-table th {
+  height: 53px;
+ }
+ >>> .common-table .ivu-table td {
+  height: 53px;
+ }
+  >>> .common-table .ivu-spin-fix {
+   top: 53px;
+ }
+  >>> .app-table .ivu-spin-fix {
+   height: calc(100vh - 355px);
+ }
+ >>> .common-table .ivu-table-tip {
+  background: url('../../../assets/images/noData.png') no-repeat center;
+}
+>>> .common-table .ivu-table-tip table {
+ display: none;
+}
+>>> .app-table .ivu-table-tip {
+   height: calc(100vh - 355px);
+ }
+ >>> .modal-table {
+   overflow: auto !important;
+ }
+ >>> .modal-table .ivu-spin-fix {
+   height: 200px;
+ }
+  >>> .modal-table .ivu-table-tip {
+   height: 200px;
+ }
+.common-page {
+  margin-top: 15px;
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+  position: absolute;
+  bottom: 0;
+  right: 0;
+}
+.common-page-total {
+  color: #fff;
+  padding-right: 10px;
+  font-size: 14px;
+  span {
+    color #409EFF;
+  }
+}
+</style>

+ 16 - 25
src/views/homecomponents/BasicInfomation/ApplicationManage.vue

@@ -7,6 +7,7 @@
         </Tabs>
         <application-station v-if="currentTabs == '应用管理'" ref="station" class="content-body-manage"></application-station>
         <application-equip v-if="currentTabs == '应用-设备类型关联'" ref="equip" class="content-body-manage"></application-equip>
+        <application-business v-if="currentTabs == '应用-业务类型管理'" ref="business" class="content-body-manage"></application-business>
      </div>
     </div>
   </div>
@@ -14,14 +15,15 @@
 <script>
 import ApplicationStation from './ApplicationStation.vue'
 import ApplicationEquip from './ApplicationEquip.vue'
+import ApplicationBusiness from './ApplicationBusiness.vue'
 export default {
   name: "ApplicationManage",
    components:{
-    ApplicationStation,ApplicationEquip
+    ApplicationStation,ApplicationEquip,ApplicationBusiness
   },
   data() {
     return {
-      tabsData: [{label:'应用管理'},{label:'应用-设备类型关联'}],
+      tabsData: [{label:'应用管理'},{label:'应用-设备类型关联'},{label:'应用-业务类型管理'}],
       currentTabs: '应用管理',
     };
   },
@@ -36,27 +38,9 @@ export default {
     //       this.$refs.equip.getType()
     //     })
     // } else {
-    //   if (sessionStorage.getItem('currentTabs') == '应用-设备类型关联') {
-    //     this.$nextTick(()=> {
-    //       this.currentTabs = sessionStorage.getItem('currentTabs')
-    //       this.$refs.equip.getTableData()
-    //       this.$refs.equip.getType()
-    //     })
-    //     } else {
-    //       this.$refs.station.getTableData()
-    //       this.$refs.station.getType()
-    //     }
     // }
     this.currentTabs = sessionStorage.getItem('currentTabs') || '应用管理'
-    if (sessionStorage.getItem('currentTabs') == '应用-设备类型关联') {
-      this.$nextTick(()=> {
-        this.$refs.equip.getTableData()
-        this.$refs.equip.getType()
-      })
-    } else {
-      this.$refs.station.getTableData()
-      this.$refs.station.getType()
-    }
+    this.getCurrentTab()
   },
   // 离开当前路由之前的钩子函数 
   beforeRouteLeave(to, form, next) {
@@ -67,18 +51,25 @@ export default {
     tabsClick (name) {
       sessionStorage.setItem("currentTabs",name)
       this.currentTabs = name
+      this.getCurrentTab()
+    },
+    getCurrentTab () {   
       if (this.currentTabs == '应用管理') {
          this.$nextTick(()=> {
-           this.$refs.station.getTableData()
-           this.$refs.station.getType()
+          this.$refs.station.getTableData()
+          this.$refs.station.getType()
         })
-      } else {
+      } else if(this.currentTabs == '应用-设备类型关联'){
         this.$nextTick(()=> {
           this.$refs.equip.getTableData()
           this.$refs.equip.getType()
         })
+      } else {
+         this.$nextTick(()=> {
+           this.$refs.business.getTableData()
+        })
       }
-    },
+    }
   }
 };
 </script>

+ 42 - 108
src/views/homecomponents/BasicInfomation/ApplicationStation.vue

@@ -3,21 +3,11 @@
     <div class="search-list">
       <div class="search-left">
         <Form class="common-form common-form-list" ref="tableParams" :model="tableParams" inline>
-          <!-- <FormItem label="" prop="level">
-            <Select v-model="tableParams.level" placeholder="层级">
-                <Option v-for="item in levelData" :value="item.id" :key="item.id">{{ item.value }}</Option>
-            </Select>
-          </FormItem>
-          <FormItem label="" prop="lineId">
-            <Select v-model="tableParams.lineId" placeholder="线路" @on-select="selectLine">
-              <Option v-for="item in lineTypeData" :value="String(item.id)" :key="item.id">{{ item.lineName }}</Option>
-            </Select>
+           <FormItem label="" prop="businessTypeId">
+             <Select v-model="tableParams.businessTypeId" placeholder="业务类型">
+                <Option v-for="item in businessData" :value="item.id" :key="item.id">{{ item.businessTypeName }}</Option>
+              </Select>
           </FormItem>
-          <FormItem label="" prop="stationId">
-            <Select v-model="tableParams.stationId" placeholder="站点">
-              <Option v-for="item in stationTypeData" :value="String(item.id)" :key="item.id">{{ item.stationName }}</Option>
-            </Select>
-          </FormItem> -->
           <FormItem label="" prop="equipmentCheck">
              <Select v-model="tableParams.equipmentCheck" placeholder="接入设备">
                 <Option v-for="item in equipmentCheckData" :value="item.value" :key="item.value">{{ item.label }}</Option>
@@ -80,29 +70,18 @@
       :mask-closable="false"
       class-name="common-modal">
       <Form class="common-form" ref="formOption" :model="formOption" :rules="ruleValidate" :label-width="120">
-				<!-- <FormItem label="归属线路:" prop="lineId">
-          <Select v-model="formOption.lineId" placeholder="线路" @on-change="selectModalLine" label-in-value>
-              <Option v-for="item in lineTypeData" :value="String(item.id)" :key="item.id">{{ item.lineName }}</Option>
-          </Select>
-				</FormItem>
-				<FormItem label="归属站点:" prop="stationId">
-           <Select v-model="formOption.stationId" placeholder="站点" @on-change="selectModalStation" label-in-value>
-            <Option v-for="item in stationTypeData" :value="String(item.id)" :key="item.id">{{ item.stationName }}</Option>
-          </Select>
-        </FormItem> -->
         <FormItem label="应用ID:">
           <span v-show="title=='新增应用'">系统自动生成,唯一不重复</span>
           <span v-show="title=='编辑应用'">{{formOption.appCode}}</span>
         </FormItem>
         <FormItem label="应用名称:" prop="appName">
-          <Input v-model="formOption.appName" type="textarea" :rows="3" maxlength="100" show-word-limit />
-          <!-- <Input v-model.trim="formOption.appName" maxlength="100" show-word-limit />   -->
+          <Input v-model.trim="formOption.appName" type="textarea" :rows="3" maxlength="100" show-word-limit />
         </FormItem>
-        <!-- <FormItem label="层级:" prop="level">
-          <Select v-model="formOption.level" placeholder="层级" @on-change="selectModalLevel" label-in-value>
-             <Option v-for="item in levelModalData" :value="String(item.id)" :key="item.id">{{ item.value }}</Option>
+        <FormItem label="业务类型:" prop="businessTypeId">
+          <Select v-model="formOption.businessTypeId" placeholder="业务类型" >
+             <Option v-for="item in businessModalData" :value="item.id" :key="item.id">{{ item.businessTypeName }}</Option>
           </Select>
-        </FormItem> -->
+        </FormItem>
 			</Form>
       <div slot="footer">
           <Button @click="modalCancel">取消</Button>
@@ -168,7 +147,7 @@
   </div>
 </template>
 <script>
-const defaultFrom = {appName: ''}
+const defaultFrom = {appName: '',businessTypeId: ''}
 export default {
   name: "ApplicationStation",
   components:{
@@ -177,19 +156,8 @@ export default {
     return {
       loading: true,
       modalLoading: true,
-      // tableParams: {
-      //   level: '',
-      //   lineId: '-1',
-      //   stationId: '-1',
-      //   equipmentCheck: '-1',
-      //   instrumentCheck: '-1',
-      //   pageNum: 1,
-      //   pageSize: 10
-      // },
       tableParams: {
-        // level: '',
-        // lineId: '',
-        // stationId: '',
+        businessTypeId: '',
         equipmentCheck: '',
         instrumentCheck: '',
         keywords: '',
@@ -200,9 +168,8 @@ export default {
       tableTotal: 0,
       tablePage: 0,
       rowObj: {},
-      // levelData: [],
-      // lineTypeData: [],
-      // stationTypeData: [],
+      businessData: [],
+      businessModalData: [],
       equipmentCheckData: [
         {
           value: '-1',
@@ -240,27 +207,17 @@ export default {
           {
             title: '应用名称',
             key: 'appName',
+            align: 'center', 
+            ellipsis: true,
+            tooltip: true  
+          },
+          {
+            title: '业务类型',
+            key: 'businessTypeName',
             align: 'center',
-           
+            ellipsis: true,
+            tooltip: true
           },
-          // {
-          //   title: '层级',
-          //   key: 'levelDesc',
-          //   align: 'center',
-          //   width: 100,
-          // },
-          // {
-          //   title: '归属线路',
-          //   key: 'lineName',
-          //  align: 'center'
-          // },
-          // {
-          //   title: '归属站点',
-          //   key: 'stationName',
-          //   align: 'center',
-          //   ellipsis: true,
-          //   tooltip: true
-          // },
           {
             title: '接入设备数量',
             key: 'equipmentNum',
@@ -287,13 +244,19 @@ export default {
       activeColor: '#E92E2E',
       activeClass: '',
       modalTitle: '',
-      formOption: {appName: ''},
+      formOption: {appName: '',businessTypeId:''},
       ruleValidate: {
         appName: [{
           required: true,
           message: '请输入应用名称',
           trigger: 'blur'
         }],
+        businessTypeId: [{
+          required: true,
+          type: 'number',
+          message: '请选择业务类型',
+          trigger: 'change'
+        }]
       }, 
       currentModalTabs:'基础信息',
       tabsModalData: [{label:'基础信息'},{label:'关联设备类型'}],
@@ -345,51 +308,22 @@ export default {
       this.getTableData()
     },
     getType  () {
-      //获取所属线路
-      // this.$get('metroapi/lineStation/queryLine', {lineName:''}).then(res=>{
-      //   if (res.httpCode == 1 ){
-      //     this.lineTypeData = res.data
-      //     this.lineTypeData.unshift({ id: '-1', lineName: '线路' })
-      //     this.getStationData ('-1')
-      //   } else {
-      //     this.lineTypeData = []
-      //   }
-      // })
-      // 获取层级
-      // this.$get('metroapi/dic/queryDictionary', {name:'层级类型'}).then(res=>{
-      //   if (res.httpCode == 1 ){
-      //     this.levelData = res.data
-      //   } else {
-      //     this.levelData = []
-      //   }
-      // })
-    },
-    selectLine (val) {
-       // 获取站点类型
-      this.tableParams.stationId = ''
-      this.tableParams.lineId = val.value
-      if (this.tableParams.lineId) {
-        this.getStationData(val.value)
-      }
+      // 业务类型数据
+      this.$get('metroapi/businessType/box').then(res=>{
+        if (res.httpCode == 1 ){
+          this.businessModalData = JSON.parse(JSON.stringify(res.data))
+          this.businessData = res.data
+          this.businessData.unshift({ id: '-1', businessTypeName: '业务类型' })
+        } else {
+          this.businessData = []
+          this.businessModalData = []
+        }
+      })
     },
-    // 获取所属站点
-    // getStationData (lineId) { 
-    //   if(lineId == '-1') {
-    //     this.stationTypeData = [{ id: '-1', stationName: '站点' }]
-    //   } else {
-    //     this.$get('metroapi/lineStation/queryStationByLineId', {lineId:lineId}).then(res=>{
-    //       if (res.httpCode == 1 ){
-    //         this.stationTypeData = res.data
-    //         this.stationTypeData.unshift({ id: '-1', stationName: '站点' })
-    //       }
-    //     })
-    //   }
-    // },
     // 获取表格数据
     getTableData () {
       let params = JSON.parse(JSON.stringify(this.tableParams))
-      // params.lineId = params.lineId == '-1' ? '':params.lineId
-      // params.stationId = params.stationId == '-1' ?'':params.stationId
+      params.businessTypeId = params.businessTypeId == '-1' ?'':params.businessTypeId
       params.equipmentCheck = params.equipmentCheck == '-1' ?'':params.equipmentCheck
       params.instrumentCheck = params.instrumentCheck == '-1' ?'':params.instrumentCheck
       this.loading = true
@@ -523,7 +457,7 @@ export default {
     commonCancel () {
       this.modalStatus = false
     },
-    // 删除 关闭/接口
+    // 删除
     delData (params) {
       this.$post('metroapi/application/deleteApp',params).then(res=>{
         if (res.httpCode == 1 ){

+ 31 - 2
src/views/homecomponents/BasicInfomation/InstruManage.vue

@@ -1,7 +1,13 @@
 <template>
   <div class="container">
-    仪表管理
-  </div>
+    <!-- <div style="display:flex;align-items: center;height:100%">
+      <div style="flex:1;display:flex;align-items: center;" v-for="(item,index) in arr" :key="index">
+            <div :style="{flex:(index==0 ? 1:'1 1 0%')}" :class="{'item': index>0}"></div>
+            <div class="dot">{{item}}</div>
+            <div :style="{flex:(index==arr.length-1 ? 1:'1 1 0%')}" :class="{'item': index<arr.length-1}"></div>
+        </div>
+    </div> -->
+    </div>
 </template>
 <script>
 export default {
@@ -10,6 +16,7 @@ export default {
   },
   data() {
     return {
+      arr:[1,2,3,4]
     };
   },
   mounted() {
@@ -20,5 +27,27 @@ export default {
 };
 </script>
 <style scoped lang="stylus">
+.container{
+    width: 100%;
+    height: 200px;
+    // border:1px solid red;
+}
+.dot{
+    border:2px solid #007Aff;
+    width: 50px;
+    height: 50px;
+    border-radius: 50%;
+    line-height: 50px;
+    text-align: center;
+    background: white;
+    margin: auto;
+    margin-bottom: -4px;
+}
+.item{
+    flex:1;
+    background: yellow;
+    height: 1px;
+    // border-bottom:1px solid #D84C29;
+}
 
 </style>

+ 0 - 1
src/views/homecomponents/Content.vue

@@ -11,7 +11,6 @@
   </div>
 </template>
 <script>
-import utils from '../../libs/utils'
 export default {
   name: "Content",
   components:{

+ 24 - 0
src/views/homecomponents/DataManagement/DataMonitor.vue

@@ -0,0 +1,24 @@
+<template>
+  <div class="container">
+    数据质量监测
+  </div>
+</template>
+<script>
+export default {
+  name: "DataMonitor",
+  components:{
+  },
+  data() {
+    return {
+    };
+  },
+  mounted() {
+  },
+  methods: {
+   
+  }
+};
+</script>
+<style scoped lang="stylus">
+
+</style>

+ 582 - 0
src/views/homecomponents/DataManagement/DataRules.vue

@@ -0,0 +1,582 @@
+<template>
+  <div class="content-main-manage">
+    <div class="content-main">
+     <div class="content-body-wrap">
+       <div class="content-body">
+         <statistics-list :tabsInitData="tabsInitData" :tabsTitleColor="tabsTitleColor" :tabsIcon="tabsIcon"></statistics-list>
+          <div class="search-list">
+            <div class="search-left">
+              <Form class="common-form common-form-list" ref="tableParams" :model="tableParams" inline>
+                 <FormItem label="" prop="roleId">
+                  <Select v-model="tableParams.roleId" placeholder="指标类型">
+                    <Option v-for="item in indexTypeList" :value="item.value" :key="item.value">{{ item.label }}</Option>
+                  </Select>
+                </FormItem>
+                <FormItem label="" prop="businessTypeId">
+                  <Select v-model="tableParams.businessTypeId" placeholder="业务类型">
+                      <Option v-for="item in businessData" :value="item.id" :key="item.id">{{ item.businessTypeName }}</Option>
+                    </Select>
+                </FormItem>
+                 <FormItem label="">
+                  <DatePicker type="datetimerange" :value="dateRange" format="yyyy-MM-dd HH:mm:ss" placeholder="更新时间范围" class="common-date-picker date-picker-main" :clearable="false" :editable="false" @on-change="changePicker"></DatePicker>
+                </FormItem>
+                <FormItem label="" prop="moduleName">
+                  <Input placeholder="输入规则名称关键词查询" clearable search v-model="tableParams.moduleName" />
+                </FormItem>
+                <FormItem label="" prop="operationName">
+                  <Input placeholder="输入字段关键词查询" clearable search v-model="tableParams.operationName" />
+                </FormItem> 
+                <FormItem label="" >
+                  <Button type="primary" class="common-btn-search" @click="searchClick">
+                    <Icon type="ios-search" style="margin-right:4px;font-size: 16px"/> 筛选
+                  </Button> 
+                  <Button type="primary" class="common-btn-search" style="margin-left:10px" @click="resetClick('tableParams')">
+                    <Icon type="ios-search" style="margin-right:4px;font-size: 16px"/> 重置
+                  </Button>
+                </FormItem>
+              </Form>
+            </div>
+            <div class="btn-container">
+              <Button icon="ios-add" class="common-add-btn" @click="addClick">新增规则</Button>
+            </div>
+            </div>
+            <div class="manage-main-center">
+              <Table :columns="columns" :data="tableData" class="common-table app-table" no-data-text="" :row-class-name="rowClassName" :loading="loading">
+                <template slot="loading">
+                    <Loading-animation></Loading-animation>
+                </template>
+                <template slot-scope="{ row }" slot="operationUser">
+                  {{row.operationUser}}
+                </template>
+                 <template slot-scope="{ row }" slot="action">
+                  <Tooltip content="编辑" placement="top">
+                      <i class="iconfont icon-bianji" style="cursor:pointer;color:#64ACFE;fontSize:20px;marginRight:6px" @click="editClick(row)"></i>
+                  </Tooltip>
+                  <Tooltip content="删除" placement="top">
+                      <i class="iconfont icon-shanchu" style="cursor:pointer;color:#E92E2E;fontSize:20px;marginRight:6px" @click="delClick(row)"></i>
+                  </Tooltip>
+                </template>
+              </Table>
+            </div>
+            <div class="common-page">
+              <div class="common-page-total">
+                共<span>{{tablePage}}</span>页 / <span>{{tableTotal}}</span>条数据
+              </div>
+              <Page :total="tableTotal" :current="tableParams.pageNum" :page-size="tableParams.pageSize" @on-change="changePage" @on-page-size-change="sizeChange" show-elevator />
+            </div>
+       </div>
+     </div>
+    </div>
+    <Modal
+      v-model="showModal"
+      :title="title"
+      width="60"
+      ref="modalGrag"
+      draggable
+      reset-drag-position
+      @on-visible-change="modalChange"
+      :mask-closable="false"
+      class-name="common-modal">
+      <div>
+        <tabs-list :currentStep="currentStep"></tabs-list>
+        <div class="modal-content" v-show="currentStep==1">
+          <div class="modal-content-top-title">基础信息</div>
+          <Form class="common-form" ref="formOption" :model="formOption" :rules="ruleValidate" :label-width="120">
+            <FormItem label="规则名称:" prop="appName">
+              <Input v-model.trim="formOption.appName" maxlength="20" show-word-limit />
+            </FormItem>
+            <FormItem label="指标类型:" prop="businessTypeId">
+              <Select v-model="formOption.businessTypeId" placeholder="指标类型" label-in-value @on-change="selectModalBusiness">
+                <Option v-for="item in indexTypeList" :value="item.value" :key="item.value">{{ item.label }}</Option>
+              </Select>
+              <!-- <Select v-model="formOption.businessTypeId" placeholder="指标类型" label-in-value @on-change="selectModalBusiness">
+                <Option v-for="item in indexTypeList" :value="item.id" :key="item.id">{{ item.businessTypeName }}</Option>
+              </Select> -->
+            </FormItem>
+            <FormItem label="规则描述:" prop="appName">
+              <Input v-model.trim="formOption.appName" type="textarea" :rows="6" maxlength="100" show-word-limit />
+            </FormItem>
+          </Form>
+        </div>
+        <div class="modal-content" v-show="currentStep==2">
+          <rule-step-two :businessData="businessData" v-if="showModal" ref="ruleStep2" @selectTableChange="selectTableChange"></rule-step-two>
+        </div>
+        <div class="modal-content" v-show="currentStep==3">
+          <rule-step-three :currentObj="formOption" v-if="showModal"></rule-step-three>
+        </div>
+        <div class="modal-content" v-show="currentStep==4"></div>
+      </div>
+      <div slot="footer" class="custom-footer">
+          <Button type="primary" @click="previousStep" :style="{visibility:currentStep>1 ? 'visible': 'hidden'}">上一步</Button>
+          <Button type="primary" @click="nextStep('formOption',1)" v-show="currentStep<4">下一步</Button>
+          <Button type="primary" v-show="currentStep==4">保存</Button>
+        </div>
+    </Modal>
+    <Modal
+      v-model="modalStatus"
+      :title="commonTitle"
+      width="30"
+      ref="modalGrag"
+      draggable
+      reset-drag-position
+      :mask-closable="false"
+      class-name="common-modal">
+      <Icon type="ios-information-circle" :style="{ color: activeColor}" class="modal-icon"></Icon>
+      <span class="modal-text">{{modalTitle}}</span>
+      <div slot="footer">
+          <Button @click="commonCancel">取消</Button>
+          <Button type="primary" @click="commonOk">确定</Button>
+        </div>
+    </Modal>
+  </div>
+</template>
+<script>
+import StatisticsList from '../../../components/StatisticsList.vue'
+import TabsList from '../../../components/TabsList.vue'
+import RuleStepTwo from './QualityRules/RuleStepTwo.vue'
+import RuleStepThree from './QualityRules/RuleStepThree.vue'
+export default {
+  name: "DataRules",
+  components: {
+      StatisticsList,TabsList,RuleStepTwo,RuleStepThree
+    },
+  data() {
+    return {
+      tabsIcon: [
+        { imgSrc: require('@/assets/images/dataQuality1.png') },
+        { imgSrc: require('@/assets/images/dataQuality2.png') },
+        { imgSrc: require('@/assets/images/dataQuality3.png') },
+        { imgSrc: require('@/assets/images/dataQuality4.png') },
+      ],
+      tabsTitleColor:['#45F2FD', '#EBF310', '#54D593', '#FD7545'],
+      tabsInitData: [
+        { text: '准确性规则', value: 0, company: '条' },
+        { text: '及时性规则', value: 0, company: '条' },
+        { text: '一致性规则', value: 0, company: '条' },
+        { text: '完整性规则', value: 0, company: '条' }
+      ],
+      loading: true,
+      businessData: [],
+      businessModalData: [],
+      indexTypeList: [{label:"及时性",value:'及时性'}, {label:"一致性",value:'一致性'}, {label:"准确性",value:'准确性'}, {label:"完整性",value:'完整性'}],
+      dateRange: [],
+      tableParams: {
+        roleId: '',
+        beginOperateTime: '',
+        endOperateTime: '',
+        moduleName: '',
+        operationName: '',
+        pageNum: 1,
+        pageSize: 50
+      },
+      tableData: [],
+      tableTotal: 0,
+      tablePage: 0,
+      columns: [
+           {
+            title: '序号',
+            type: 'index',
+            align: 'center',
+            ellipsis: true,
+            tooltip: true
+          },
+          {
+            title: '规则名称',
+            // key: 'operationUser',
+            slot: 'operationUser',
+            align: 'center',
+            // ellipsis: true,
+            // tooltip: true
+          },
+          {
+            title: '规则描述',
+            key: 'roleName',
+            align: 'center',
+            ellipsis: true,
+            tooltip: true
+          },
+          {
+            title: '规则类型',
+            key: 'operator',
+            align: 'center',
+            ellipsis: true,
+            tooltip: true
+          },
+          {
+            title: '应用',
+            key: 'moduleName',
+            align: 'center',
+            ellipsis: true,
+            tooltip: true
+          },
+          // {
+          //   title: '应用业务类型',
+          //   key: 'moduleName',
+          //   align: 'center',
+          //   ellipsis: true,
+          //   tooltip: true
+          // },
+          // {
+          //   title: '字段',
+          //   key: 'moduleName',
+          //   align: 'center',
+          //   ellipsis: true,
+          //   tooltip: true
+          // },
+          // {
+          //   title: '计算方法',
+          //   key: 'moduleName',
+          //   align: 'center',
+          //   ellipsis: true,
+          //   tooltip: true
+          // },
+          // {
+          //   title: '更新时间',
+          //   key: 'operationName',
+          //   align: 'center',
+          //   ellipsis: true,
+          //   tooltip: true
+          // },
+          {
+            title: '操作',
+            align: 'center',
+            slot: 'action',
+            width: 120,
+          }
+      ],   
+      roleData: [], 
+      showModal: false,
+      modalStatus: false,
+      title: '新增规则',
+      commonTitle: "确认删除",
+      activeColor: '#E92E2E',
+      activeClass: '',
+      modalTitle: '',
+      currentStep: 1,
+      formOption: {appName:'',businessTypeId: '',remark: '',businessTypeName:'',fieldName:''},
+      ruleValidate: {
+        // appName: [{
+        //   required: true,
+        //   message: '请输入应用名称',
+        //   trigger: 'blur'
+        // }],
+        businessTypeId: [{
+          required: true,
+          // type: 'number',
+          message: '请选择业务类型',
+          trigger: 'change'
+        }]
+      }, 
+      // columnsModal: [
+      //   {
+      //       title: '业务类型',
+      //       key: 'businessTypeName',
+      //       align: 'center',
+      //       ellipsis: true,
+      //       tooltip: true
+      //     },
+      //     {
+      //       title: '应用ID',
+      //       key: 'appCode',
+      //       align: 'center',
+      //       ellipsis: true,
+      //       tooltip: true
+      //     },
+      //     {
+      //       title: '应用名称',
+      //       key: 'appName',
+      //       align: 'center',
+      //       ellipsis: true,
+      //       tooltip: true
+      //     },
+      // ],
+      // modalAppData: [],
+      index: 0,
+    };
+  },
+  mounted() {
+    this.getType()
+    this.getRoleList()
+    this.getTableData()
+  },
+  methods: {
+    changePicker (date) {
+      this.tableParams.beginOperateTime = date[0]
+      this.tableParams.endOperateTime = date[1]
+    },
+    rowClassName(row, index) {
+      if (index % 2 == 0) {
+        return "ivu-table-stripe-even";
+      } else {
+        return "ivu-table-stripe-odd";
+      }
+    },
+    // 分页
+    changePage (val) {
+      this.tableParams.pageNum = val
+      this.getTableData()
+    },
+    //跳转
+    sizeChange (val) {
+      this.tableParams.pageSize = val
+      this.getTableData()
+    },
+    getType  () {
+      // 业务类型数据
+      this.$get('metroapi/businessType/box').then(res=>{
+        if (res.httpCode == 1 ){
+          this.businessModalData = JSON.parse(JSON.stringify(res.data))
+          this.businessData = res.data
+          this.businessData.unshift({ id: '-1', businessTypeName: '业务类型' })
+        } else {
+          this.businessData = []
+          this.businessModalData = []
+        }
+      })
+    },
+    // 获取表格数据
+    getTableData () {
+      let params = JSON.parse(JSON.stringify(this.tableParams))
+      params.roleId= params.roleId == '-1'?'':params.roleId
+      this.loading = true
+      this.$get('metroapi/log/querySysLogPage', params).then(res=>{
+        this.loading = false
+          if (res.httpCode == 1 ){
+            this.tableData = res.data.data
+            this.modalAppData = res.data.data
+            this.tableTotal = res.data.count
+            if (res.data.data.length==0) {
+              this.tablePage = 0
+            } else {
+              this.tablePage = res.data.count<= 10 ? 1: Math.ceil(res.data.count/this.tableParams.pageSize)
+            }
+            if (res.data.data.length==0 && this.tableParams.pageNum>1) {
+              this.tableParams.pageNum--
+              return this.getTableData()
+            }
+          } else {
+            this.tableData = []
+            this.tableTotal = 0
+          }
+        })
+    },
+    searchClick () {
+      this.tableParams.pageNum = 1
+      this.getTableData()
+    },
+    resetClick (name) {
+     this.dateRange = []
+     this.tableParams.beginOperateTime = ''
+     this.tableParams.endOperateTime = ''
+     this.$refs[name].resetFields()
+     this.tableParams.pageNum = 1
+     this.getTableData()
+    },   
+    getRoleList () {
+      //获取角色名称
+      // this.$get('metroapi/role/box').then(res=>{
+      //   if (res.httpCode == 1 ){
+      //     this.roleModalData = JSON.parse(JSON.stringify(res.data))
+      //     this.indexTypeList = res.data
+      //     this.indexTypeList.unshift({ value: '-1', label: '指标类型' })
+      //   } else {
+      //     this.indexTypeList = []
+      //   }
+      // })
+    }, 
+    addClick () {
+      this.currentStep = 1
+      this.title = '新增规则'
+      this.showModal = true
+    },
+     editClick (row) {
+      console.log(this.modalAppData)
+      this.currentStep = 1
+      this.rowObj = row
+      this.formOption = JSON.parse(JSON.stringify(row));
+      // this.modalAppData[this.index]._highlight = true
+      // this.formOption.lineId = this.formOption.lineId ? String(this.formOption.lineId) : '-1'
+      // this.formOption.stationId = this.formOption.stationId ? String(this.formOption.stationId) : '-1'
+      // this.formOption.level = String(this.formOption.level)
+      // this.getStationData(this.formOption.lineId)
+      // this.levelModalData = this.getCurrentLevel()
+      this.title = '编辑规则'
+      this.showModal = true
+    },
+    delClick (row) {
+      this.rowObj = row
+      this.commonTitle = '确认删除'
+      this.activeColor = '#E92E2E'
+      this.activeClass = ''
+      this.modalTitle = '删除的同时将解绑所有运营数据,且数据不可恢复。请慎重操作。'
+      this.modalStatus = true
+    },
+    modalChange (modalStatus) {
+     if (!modalStatus) {
+      this.$refs.formOption.resetFields();
+     }
+    },
+    nextStep (formName,num) {
+    if (this.currentStep ==1) {
+       this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.currentStep = this.currentStep + num
+        } else {
+          this.showModal = true
+        }
+      })
+    } else if (this.currentStep ==2) {
+      if (this.$refs.ruleStep2.saveValid()) {
+        this.currentStep = this.currentStep + num
+      }
+    } else if (this.currentStep == 3) {
+
+    }
+     console.log(this.currentStep)
+    },
+    previousStep () {
+      this.currentStep--
+    },
+    commonOk () {
+      let params = {
+        id: this.rowObj.id
+      }
+      this.delData(params)
+    },
+    commonCancel () {
+      this.modalStatus = false
+    },
+    // 删除接口
+    delData (params) {
+      this.$get('metroapi/equipment/delEquipmentType',params).then(res=>{
+        if (res.httpCode == 1 ){
+          this.modalStatus = false
+          this.$Message.info(res.msg)
+          this.getTableData()
+        } else {
+          this.$Message.info(res.msg)
+        }
+      })
+    },
+    selectTableChange (id) {
+     this.formOption.fieldName = id
+     console.log('selectTableChange',this.formOption)
+    },
+    selectModalBusiness (option) {
+      if (option) {
+       this.formOption.businessTypeName = option.label
+       console.log('selectModalBusiness',this.formOption)
+      }
+      console.log(option)
+    }
+  }
+};
+</script>
+<style scoped lang="stylus">
+.content-main-manage {
+  overflow: hidden;
+  height: calc(100% - 50px);
+  width: 100%;
+}
+.content-main {
+  width: 100%;
+  height: 100%;
+}
+.content-body-wrap {
+  width: 100%;
+  height: 100%;
+  background: #06214d;
+  padding: 10px;
+}
+.content-body {
+  height: 100%;
+  position: relative;
+}
+.search-list {
+  display: flex;
+  justify-content: space-between;
+  padding: 15px 0;
+}
+.search-left {
+  display: flex;
+  align-items: center;
+   .ivu-select {
+     width: 150px;
+     height: 32px;
+   }
+   .ivu-select-single .ivu-select-selection {
+     height: 100%;
+   }
+    >>> .ivu-input {
+     width: 225px;
+     height: 32px;
+   }
+    >>> .ivu-date-picker-editor .ivu-input {
+     width: 315px;
+   }
+    >>> .ivu-input-prefix, >>> .ivu-input-suffix {
+     height: 32px;
+     line-height: 32px;
+   }
+}
+>>> .common-form-list .ivu-form-item {
+ margin-bottom: 0px;
+}
+.manage-main-center {
+  width: 100%;
+  height: calc(100% - 150px);
+}
+.common-table {
+  max-height: 100%;
+}
+>>> .common-table .ivu-table th {
+  height: 48px;
+ }
+ >>> .common-table .ivu-table td {
+  height: 47px;
+ }
+  >>> .common-table .ivu-spin-fix {
+   top: 48px;
+ }
+  >>> .app-table .ivu-spin-fix {
+   height: calc(100vh - 355px);
+ }
+ >>> .common-table .ivu-table-tip {
+  background: url('../../../assets/images/noData.png') no-repeat center;
+}
+>>> .common-table .ivu-table-tip table {
+ display: none;
+}
+>>> .app-table .ivu-table-tip {
+   height: calc(100vh - 355px);
+ }
+.common-page {
+  margin-top: 15px;
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+  position: absolute;
+  bottom: 0;
+  right: 0;
+}
+.common-page-total {
+  color: #fff;
+  padding-right: 10px;
+  font-size: 14px;
+  span {
+    color #409EFF;
+  }
+}
+.modal-content-top-title {
+  font-size: 12px;
+  color: #fff;
+  padding-left: 8px;
+  border-left: 2px solid #0185EA;
+  height: 18px;
+  line-height: 18px;
+  margin-bottom: 20px;
+}
+.modal-content {
+  margin-top: 20px;
+}
+</style>

+ 173 - 0
src/views/homecomponents/DataManagement/QualityRules/RuleStepThree.vue

@@ -0,0 +1,173 @@
+<template>
+  <div class="modal-rule-three">
+    <div class="modal-step3-title">
+      <div>计算方式通过多个条件(运算符)和逻辑符组合表达,符号代表含义如下所示:</div>
+      <div> 
+        <p>1.运算符:等于“=”、不等于“!=”、大于“>”、大于等于“>=”、小于“<”、小于等于“<=”、大于等于且小于等于“[ ]”、大于等于且小于“[ )”、大于且小于等于“( ]”、大于且小于“( )”;</p>
+        <p>2.逻辑符:且“&”、或“|”,例:&{条件1;条件2} 表示满足条件1且满足条件2;| {条件1;条件2}表示满足条件1或条件2;</p>
+        <p>3.所有的符号必须是英文符号。</p>
+    </div>
+    </div>
+    <div class="modal-step3-body">
+      <div class="modal-step3-body-title">配置规则</div>
+      <div class="modal-step3-body-rule">
+        <div class="modal-rule-top">
+          <div>已选择:</div>
+          <div class="modal-rule-top-item">
+            字段:{{ruleObj.fieldName}}
+          </div>
+          <div class="modal-rule-top-item">
+            指标类型:{{ruleObj.businessTypeName}}
+          </div>
+        </div>
+        <div class="add-rule">
+          <i class="iconfont icon-tianjia" style="cursor:pointer;color:#2DA0F8;padding-right: 10px" @click="handleAdd(ruleObj.businessTypeName)"></i>点击"+"以添加运算条件
+        </div>
+        <div class="rule integrity-rule" v-show="ruleObj.businessTypeName=='完整性'">
+          {{inText}} <i v-show="inText" class="iconfont icon-shanchu ivu-col-del" style="cursor:pointer; color:#BC2020;padding-left:6px" @click="removeIntegrity"></i>
+        </div>      
+        <div class="rule uniformity-rule" v-show="ruleObj.businessTypeName=='一致性'">
+          <div v-show="showUniformity1">数据处理前字段值 = 数据处理后字段值<i class="iconfont icon-shanchu ivu-col-del" style="cursor:pointer; color:#BC2020;padding-left:6px" @click="removeUniformity(1)"></i></div>
+          <div class="uniformity-rule-mode" v-show="showUniformity2">数据类型为
+            <Select v-model="dataType" placeholder="指标类型" style="width: 166px">
+              <Option v-for="item in dataTypeList" :value="item.value" :key="item.value">{{ item.label }}</Option>
+            </Select>
+            <i class="iconfont icon-shanchu ivu-col-del" style="cursor:pointer; color:#BC2020;padding-left:6px" @click="removeUniformity(2)"></i>
+          </div>
+        </div>
+        <div class="rule integrity-rule" v-show="ruleObj.businessTypeName=='及时性'">
+          <p class="operating" >输入字段对应条件值</p >
+          <div v-for="(item,index) in timelinArry" :key="index">
+            <span class="fieldshow" >
+              <span >{{ item.indexMode + item.name + ':' + item.pretfield }} 
+                <span class="fuhao" v-text="fuhao"></span> 
+                <span>
+                  <span v-if="item.numShow" class="tebie" >{{item.value}}</span>
+                  <span class="tebie" v-else v-text="tebie"></span>
+                </span>
+              </span>
+            </span>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+export default {
+  name: "RuleStepThree",
+  components:{
+  },
+  props: {
+    currentObj: {
+      type: Object,
+      default: () => {
+        return {};
+      },
+    }
+  },
+  data() {
+    return {
+      ruleObj: {},
+      inText: '',
+      dataTypeList: [{label:"任意",value:'任意'}, {label:"byte",value:'byte'}],
+      dataType: '',
+      UniformityData: [0,1],
+      // UniformityIndex: 0,
+      showUniformity1: false,
+      showUniformity2: false,
+      timelinArry: [
+        { indexMode: '条件1',name: '数据采集', pretfield: 111, value: '', numShow: false, },
+        { indexMode: '条件2',name: '数据入库', pretfield: 222, value: '', numShow: false, },
+      ],
+    };
+  },
+  watch: {
+    currentObj: {
+     handler(newValue) {
+       console.log(newValue)
+       this.ruleObj = newValue
+      },
+      // deep: true
+    }
+   },
+  mounted() {
+    this.ruleObj = this.currentObj
+    console.log(this.ruleObj)
+  },
+  methods: {
+    handleAdd (indexTypeName) {
+      if (indexTypeName == '完整性') {
+       this.inText = '不能是字符串null、NULL、无、空格,不能是空'
+      } else if (indexTypeName == '一致性') {
+       this.showUniformity1 = true
+       this.showUniformity2 = true
+      }
+    },
+    removeIntegrity () { 
+    },
+   removeUniformity (i) {
+     if (i == 1) {
+       this.showUniformity1 = false
+     } else {
+       this.showUniformity2 = false
+     }
+   }
+  }
+};
+</script>
+<style scoped lang="stylus">
+.modal-step3-title {
+  height: 120px;
+  background: #112950;
+  border: 1px solid #204A8F;
+  border-radius: 6px;
+  font-size: 12px;
+  color: #FFFFFF;
+  padding: 20px;
+  line-height: 20px;
+}
+.modal-step3-body {
+  margin-top: 20px;
+}
+.modal-step3-body-title {
+  height: 42px;
+  background: #0B2959;
+  border: 1px solid #0D2853;
+  line-height: 42px;  
+  color: #fff; 
+  font-size: 16px;
+  padding-left: 10px;
+}
+.modal-step3-body-rule {
+  padding: 20px;
+  border: 1px solid #204A8F;
+  border-top: none;
+}
+.modal-rule-top {
+  display: flex;
+  align-items: center;
+  font-size: 14PX;
+  color: #fff;
+}
+.modal-rule-top-item {
+  border: 1px solid #204A8F;
+  padding: 4px;
+  border-radius: 4px;
+  color: #2b8ee2;
+  margin-left: 10px;
+}
+.add-rule {
+  font-size: 14PX;
+  color: #fff;
+  margin-top: 10px;
+}
+.rule {
+  font-size: 14PX;
+  color: #fff;
+  margin-top: 10px;
+}
+.uniformity-rule-mode {
+ margin-top: 10px;
+}
+</style>

+ 230 - 0
src/views/homecomponents/DataManagement/QualityRules/RuleStepTwo.vue

@@ -0,0 +1,230 @@
+<template>
+  <Row :gutter="16">
+    <Col :span="8">
+      <div class="modal-step2-title"><span class="modal-step2-star">* </span>选择来源应用</div>
+      <div class="modal-step2-body">
+          <Select v-model="businessParams.businessTypeId" placeholder="业务类型" @on-change="selectBusinessType">
+            <Option v-for="item in businessData" :value="item.id" :key="item.id">{{ item.businessTypeName }}</Option>
+          </Select>
+        <Table ref="tableSource1" :columns="columnsAppModal" :data="appModalData" class="common-table modal-table modal-table1 modal-table-first" no-data-text="" :row-class-name="rowClassName" :show-header="false" highlight-row @on-row-click="rowClick1">
+        </Table>
+      </div>
+    </Col>
+    <Col :span="1" class-name="triangle-right-wrap">
+    <div class="triangle-right"></div>
+    </Col>
+    <Col :span="7">
+    <div class="modal-step2-title"><span class="modal-step2-star">* </span>字段类型</div>
+      <div class="modal-step2-body" :class="{'modal-step2-body-else': equipModalData.length<=0}">
+        <div v-if="equipModalData.length<=0" class="modal-step2-body-nodata" @click="selectEquip" :class="{'modal-no-data-status': showClickTable2}">展示全部字段</div>
+        <Table ref="tableSource2" v-else :columns="columnsEquipModal" :data="equipModalData" class="common-table modal-table modal-table2" no-data-text="" :row-class-name="rowClassName" :show-header="false" highlight-row @on-row-click="rowClick2"></Table>
+      </div>
+    </Col>
+    <Col :span="1" class-name="triangle-right-wrap">
+    <div class="triangle-right"></div>
+    </Col>
+    <Col :span="7">
+    <div class="modal-step2-title"><span class="modal-step2-star">* </span>选择字段</div>
+      <div class="modal-step2-body" :class="{'modal-step2-body-else': fieldModalData.length<=0}">
+         <!-- <Radio v-model="row.operationId"></Radio>{{row.operationUser}} -->
+        <Table ref="tableSource3" :columns="columnsAppModal" :data="fieldModalData" class="common-table modal-table modal-table3" no-data-text="" :row-class-name="rowClassName" :show-header="false" highlight-row @on-row-click="rowClick3"></Table>
+      </div>
+    </Col>
+  </Row>
+</template>
+<script>
+export default {
+  name: "RuleStepTwo",
+  components:{
+  },
+  props: {
+    businessData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    }
+  },
+  data() {
+    return {
+      businessParams: {
+        businessTypeId: '',
+        equipmentCheck: '',
+        instrumentCheck: '',
+        keywords: '',
+        pageNum: 1,
+        pageSize: 9999
+      },
+      appParams: {
+        applicationId: '',
+        equipmentTypeId: '',
+        keywords: '',
+        pageNum: 1,
+        pageSize: 9999
+      },
+      appModalData: [],
+      columnsAppModal: [
+        {
+            title: '业务类型',
+            key: 'businessTypeName',
+            align: 'center',
+            ellipsis: true,
+            tooltip: true
+          },
+          {
+            title: '应用ID',
+            key: 'appCode',
+            align: 'center',
+            ellipsis: true,
+            tooltip: true
+          },
+          {
+            title: '应用名称',
+            key: 'appName',
+            align: 'center',
+            ellipsis: true,
+            tooltip: true
+          },
+      ],
+      equipModalData: [],
+      columnsEquipModal:[
+        {
+          title: '设备类型',
+          key: 'equipmentName',
+          align: 'left',
+          ellipsis: true,
+          tooltip: true
+        },
+      ],
+      fieldModalData: [],
+      showClickTable2: false
+    };
+  },
+  mounted() {
+    this.getAppList()
+  },
+  methods: {
+    rowClassName(row, index) {
+      if (index % 2 == 0) {
+        return "ivu-table-stripe-even";
+      } else {
+        return "ivu-table-stripe-odd";
+      }
+    },
+    // 根据业务类型获取应用
+   getAppList () {
+     this.$get('metroapi/application/info/list', this.businessParams).then(res=>{
+        if (res.httpCode == 1 ){
+          this.appModalData = res.data.data   
+        } else {
+          this.appModalData = []
+        }
+      })
+   },
+   // 根据应用获取新增设备类型 
+    getAddEquipType (params) {
+      this.$get('metroapi/application/equipmentTypeInfo', params).then(res=>{
+        if (res.httpCode == 1 ){
+          this.equipModalData = res.data.data
+        } else {
+          this.equipModalData = []
+        }
+      })
+    },
+   selectBusinessType (value) {
+     this.businessParams.businessTypeId = value == '-1' ? '' : value
+     this.getAppList()
+     console.log(option)
+    },
+    rowClick1 (currentRow,index) {
+      this.appParams.applicationId = currentRow.id
+    //   this.index = index
+      this.getAddEquipType(this.appParams)
+      this.$emit('selectTableChange',this.appParams.applicationId)
+    },
+    rowClick2 (currentRow,index) {
+    },
+    rowClick3 (currentRow,index) {
+    },
+    selectEquip () {
+     this.showClickTable2 = true
+    },
+    // 当前步骤校验方法
+    saveValid () {
+      if (!this.appParams.applicationId) {
+        this.$Message.info('请选择来源应用')
+        return false
+      } else {
+        return true
+      }
+    }
+  }
+};
+</script>
+<style scoped lang="stylus">
+.modal-step2-title {
+  height: 42px;
+  background: #0B2959;
+  border: 1px solid #0D2853;
+  line-height: 42px;  
+  color: #fff; 
+  font-size: 16px;
+}
+.modal-step2-star {
+  color: #ed4014;
+  padding-left: 6px;
+}
+.modal-step2-body {
+ padding: 15px;
+ border: 1px solid #204A8F;
+ border-top: none;
+}
+.modal-step2-body-else {
+  height: 432PX;
+}
+.modal-table-first {
+  margin-top: 10px;
+}
+>>> .modal-table .ivu-table-body {
+    height: 360PX;
+    overflow: hidden;
+    overflow-y: auto;
+    table {
+      width: 100% !important;
+    }
+}
+>>> .modal-table2 .ivu-table-body, >>> .modal-table3 .ivu-table-body {
+    height: 402PX;
+    overflow: hidden;
+    overflow-y: auto;
+    table {
+      width: 100% !important;
+    }
+}
+>>> .ivu-table-row-highlight td, >>> .ivu-table-stripe .ivu-table-body tr.ivu-table-row-highlight:nth-child(2n) td, >>> .ivu-table-stripe .ivu-table-fixed-body tr.ivu-table-row-highlight:nth-child(2n) td, >>> tr.ivu-table-row-highlight.ivu-table-row-hover td {
+ background-color:#0185EA;
+}
+.modal-step2-body-nodata {
+  background-color: #081C43;
+  height: 36px;
+  line-height: 36px;
+  padding-left: 10px;
+  color: #FFFFFF;
+  font-size: 14PX;
+}
+.modal-no-data-status {
+  background-color: #0185EA;
+}
+.triangle-right-wrap {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+.triangle-right {
+  width: 0;
+  height: 0;
+  border-top: 15px solid transparent;
+  border-left: 20px solid #0185EA;
+  border-bottom: 15px solid transparent;
+}
+</style>

+ 26 - 8
src/views/homecomponents/Head.vue

@@ -8,7 +8,7 @@
       <li class="nav-item header-item" :class="!activeId ? 'active' : ''" @click="onMenu(0)">
         <i class="iconfont icon-shouye"></i>首页
       </li>
-      <li class="nav-item header-item" v-for="item of menus" :key="item.menuId" :class="activeId === item.menuId ? 'active' : ''" @click="onMenu(item.menuId , item.menuName)">
+      <li class="nav-item header-item" v-for="item of menus" :key="item.menuId" :class="activeId === item.menuId ? 'active' : ''" @click="onMenu(item.menuId , item.menuName,item)">
         <i :class="'iconfont '+ item.imageUrl" style="vertical-align: middle;"></i>{{item.menuName}}
       </li>
     </ul>
@@ -81,7 +81,7 @@ export default {
         arr.forEach((item,i) => {
           if (item.childMenus) {
             item.childMenus.forEach((val,index)=> {
-              if (val.linkUrl == to.path) {
+              if (val.linkUrl == to.path) { //浏览器后退选中上一级菜单(第二级菜单后退)
               this.activeId = val.parentMenuId
               this.$emit('listenMenuId', this.activeId);
               menuNameArr[0] = item.menuName;
@@ -90,6 +90,20 @@ export default {
               sessionStorage.setItem('menuNameArr',JSON.stringify(menuNameArr));
               this.$router.push( to.path );
               }
+              if (val.childMenus) {
+                 val.childMenus.forEach((last,lastIndex)=> { //浏览器后退选中上一级菜单(第三级菜单后退)
+                    if (last.linkUrl == to.path) {
+                      this.activeId = val.parentMenuId
+                      this.$emit('listenMenuId', this.activeId);
+                      menuNameArr[0] = item.menuName;
+                      menuNameArr[1] = val.menuName;
+                      menuNameArr[2] = last.menuName;
+                      sessionStorage.setItem('routname', to.path);
+                      sessionStorage.setItem('menuNameArr',JSON.stringify(menuNameArr));
+                      this.$router.push( to.path );
+                    }
+                 })
+              }
             })
           }
         })
@@ -146,23 +160,27 @@ export default {
       }
       return cookieValue;
     },
-    onMenu: function(id,menuName) {
+    onMenu: function(id,menuName,menuList) {
       let menuNameArr = []
       menuNameArr[0] = menuName
       if(this.activeId === id) {
           return ;
         }
         this.activeId = id;
-        const { currRouterName } = utils.toRouter(id);
+        let { currRouterName, leftMenus } = utils.toRouter(id);
+        let routeLinkUrl = currRouterName ? currRouterName : leftMenus[0].childMenus[0].linkUrl
         this.$emit('listenMenuId', id);
         this.menus.forEach((item)=> {
-          if (item.menuId == id) {
-           menuNameArr[1] = item.childMenus[0].menuName
+          if (item.menuId == id && item.childMenus) {
+           menuNameArr[1] = item.childMenus[0].menuName //菜单第二层
+           if (item.childMenus && item.childMenus[0] && item.childMenus[0].childMenus) { 
+             menuNameArr[2] = item.childMenus[0].childMenus[0].menuName // 菜单第三层
+           }
           }
         })
-        sessionStorage.setItem('routname', currRouterName);
+        sessionStorage.setItem('routname', routeLinkUrl);
         sessionStorage.setItem('menuNameArr',JSON.stringify(menuNameArr));
-        this.$router.push( currRouterName );
+        this.$router.push( routeLinkUrl );
     },
     signOut () {
       this.signOutModal = true

+ 12 - 18
src/views/homecomponents/Nav.vue

@@ -37,28 +37,23 @@ export default {
   },
   watch: {
       menuId: function (id, oldId) {
-       const {currRouterName, leftMenus} = utils.toRouter(id);
+        const {currRouterName, leftMenus,currMenuId} = utils.toRouter(id);
         if(sessionStorage.getItem('routname')){
           this.activeName = sessionStorage.getItem('routname')
         } else {
-          this.activeName = currRouterName;
+          this.activeName = currRouterName ? currRouterName : leftMenus[0].childMenus[0].linkUrl
         }
         this.data = leftMenus;
-        // 设置子级菜单关闭
-        // this.openname = []
-        if (oldId == 0) {
-          this.data.forEach((val,inx)=> {
-            if (val.childMenus) {
-               val.childMenus.forEach((v,i) => {
-                if (v.linkUrl == this.activeName) {
-                  this.openname = [val.menuName]  // 页面刷新记住子集菜单展开或关闭
-                }
-               })
-            }
-          })
-        } else {
-          this.openname = [] // 默认关闭子级菜单
-        }
+        this.openname = [] //// 点击一级菜单设置子级菜单初始化关闭
+        this.data.forEach((val,inx)=> {
+          if (val.childMenus) {
+              val.childMenus.forEach((v,i) => {
+              if (v.linkUrl == this.activeName) {
+                this.openname = [val.menuName]  // 页面刷新记住子集菜单展开或关闭
+              }
+              })
+          }
+        })
         // Update the DOM by 
         // if (this.$store.state.app.siderbar.opened) {
           this.$nextTick(() => {
@@ -109,7 +104,6 @@ export default {
         // 设置子级菜单展开
       this.openname = name
     },
-   
   }
 };
 </script>

+ 3 - 3
src/views/homecomponents/SystemSettings/OperationLog.vue

@@ -26,7 +26,7 @@
                   </Button> 
                   <Button type="primary" class="common-btn-search" style="margin-left:10px" @click="resetClick('tableParams')">
                     <Icon type="ios-search" style="margin-right:4px;font-size: 16px"/> 重置
-                  </Button>   
+                  </Button>
                 </FormItem>
               </Form>
             </div>
@@ -44,7 +44,7 @@
               </div>
               <Page :total="tableTotal" :current="tableParams.pageNum" :page-size="tableParams.pageSize" @on-change="changePage" @on-page-size-change="sizeChange" show-elevator />
             </div>
-       </div>      
+       </div>
      </div>
     </div>
   </div>
@@ -97,7 +97,7 @@ export default {
           },
           {
             title: '模块页面',
-            key: 'moduleName',
+            key: 'operationModule',
             align: 'center',
             ellipsis: true,
             tooltip: true

+ 1 - 1
src/views/homecomponents/SystemSettings/ResourceManagementIndex.vue

@@ -138,7 +138,7 @@
         </FormItem>
          <FormItem label="图标:" prop="imageUrl">
           <Input v-model="formOption.imageUrl" maxlength="25" show-word-limit placeholder="请输入图标class名称"/>
-          <div class="common-form-item-text">新增系统中不存在的资源,图标默认名称为icon-caidan</div> 
+          <!-- <div class="common-form-item-text">新增系统中不存在的资源,图标默认名称为icon-caidan</div>  -->
         </FormItem>
         <FormItem label="URL:" prop="linkUrl">
           <Input v-model="formOption.linkUrl" maxlength="25" show-word-limit placeholder="输入资源地址"/>

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů