Переглянути джерело

Merge branch 'http_test' into insist

qinzhipeng_v@didiglobal.com 4 роки тому
батько
коміт
1c8cbff0b9

+ 12 - 9
src/App.vue

@@ -5,6 +5,7 @@
 </template>
 
 <script>
+import { mapGetters } from 'vuex'
 import { getGlobalInterface } from '@/api/data.js'
 import { getUserInfo } from '@/api/user.js'
 // omega埋点工具包
@@ -13,13 +14,15 @@ const config = { appKey: 'omega6b172861f4' }
 
 export default {
   name: 'App',
+  computed: {
+    ...mapGetters(['noNetwork'])
+  },
   mounted() {
     window.addEventListener('offline', () => {
-      // 网络由正常常到异常时触发
-      this.$message({ message: '网络异常,请检查网络!', type: 'error', duration: 2000, offset: 150 })
+      this.$store.dispatch('global/setNoNetwork', true)// 处于断网状态
     })
     window.addEventListener('online', () => {
-      location.reload()
+      this.$store.dispatch('global/setNoNetwork', false)// 网络恢复
     })
     getUserInfo()
       .then(res => {
@@ -46,9 +49,9 @@ export default {
         this.$store.dispatch('data/setMenu', res.data)
         const dataCenterRoutes = []
         const route = {
-          path: '/data',
+          path: '/views/data',
           component: () => import('@/layout'),
-          redirect: '/data/upload-file',
+          redirect: '/views/data/upload-file',
           name: '数据中心',
           meta: { title: '数据中心' },
           children: [
@@ -62,8 +65,8 @@ export default {
         }
         for (const i in res.data) {
           const routeItem = {
-            path: res.data[i].subMenus[0].path + '/' + i,
-            redirect: res.data[i].subMenus[0].path,
+            path: res.data[i].subMenus[0].path.replace('/', '') + '/' + i,
+            redirect: res.data[i].subMenus[0].path.replace('/', ''),
             name: res.data[i].menuName + '/' + i,
             component: () => import('@/views/data/index.vue'),
             meta: { title: res.data[i].menuName },
@@ -71,8 +74,8 @@ export default {
           }
           for (const j in res.data[i].subMenus) {
             const routeChildrenItem = {
-              path: res.data[i].subMenus[j].path + '/' + i + '/' + j,
-              name: res.data[i].subMenus[j].subMenuName + '/' + i + '/' + j,
+              path: res.data[i].subMenus[j].path.replace('/', '') + '/' + i + '/' + j,
+              name: res.data[i].subMenus[j].subMenuName.replace('/', '') + '/' + i + '/' + j,
               component: () => import('@/views/data/index.vue'),
               meta: { title: res.data[i].subMenus[j].subMenuName }
             }

Різницю між файлами не показано, бо вона завелика
+ 8 - 0
src/icons/svg/env-enter.svg


Різницю між файлами не показано, бо вона завелика
+ 0 - 7
src/icons/svg/member.svg


Різницю між файлами не показано, бо вона завелика
+ 8 - 0
src/icons/svg/project-enter.svg


+ 1 - 8
src/icons/svg/team.svg

@@ -1,8 +1 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" width="11.879" height="12.695" viewBox="0 0 11.879 12.695">
-  <g id="组_2647" data-name="组 2647" transform="translate(5310.744 -5223.186)">
-    <g id="成员" transform="translate(-5310.744 5223.186)">
-      <path id="路径_13035" data-name="路径 13035" d="M450.669,295.783a3.243,3.243,0,1,1,3.239-3.243A3.243,3.243,0,0,1,450.669,295.783Zm0-5.754a2.5,2.5,0,1,1,0,.018Z" transform="translate(-444.728 -289.297)" fill="#444"/>
-      <path id="路径_13036" data-name="路径 13036" d="M373.582,493.535a.364.364,0,0,1-.364-.364,5.211,5.211,0,1,0-10.418,0,.364.364,0,0,1-.729,0,5.939,5.939,0,1,1,11.875,0A.364.364,0,0,1,373.582,493.535Z" transform="translate(-362.069 -480.84)" fill="#444"/>
-    </g>
-  </g>
-</svg>
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="48px" height="48.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#333333" d="M 634.061 483.328 c 58.1632 -37.0688 97.0752 -102.195 97.0752 -176.128 c 0 -115.098 -93.7984 -208.896 -208.896 -208.896 S 313.344 192.102 313.344 307.2 c 0 74.1376 38.912 139.059 97.0752 176.128 C 248.013 531.661 129.024 682.189 129.024 860.16 c 0 13.5168 11.0592 24.576 24.576 24.576 s 24.576 -11.0592 24.576 -24.576 c 0 -189.645 154.419 -344.064 344.064 -344.064 S 866.304 670.515 866.304 860.16 c 0 13.5168 11.0592 24.576 24.576 24.576 s 24.576 -11.0592 24.576 -24.576 c 0 -177.971 -118.989 -328.499 -281.395 -376.832 Z M 362.496 307.2 c 0 -88.064 71.68 -159.744 159.744 -159.744 s 159.744 71.68 159.744 159.744 s -71.68 159.744 -159.744 159.744 s -159.744 -71.68 -159.744 -159.744 Z" /></svg>

Різницю між файлами не показано, бо вона завелика
+ 1 - 0
src/icons/svg/tool-enter.svg


+ 30 - 30
src/router/index.js

@@ -259,19 +259,19 @@ export const constantRoutes = [{
     ]
   },
   {
-    path: '/mqTest',
+    path: '/views/mqTest',
     component: (resolve) => require(['@/views/mqTest/index'], resolve),
     name: 'MQ测试工具',
     meta: { title: 'MQ测试工具' }
   },
   {
-    path: '/apiManagement',
+    path: '/views/apiManagement',
     component: (resolve) => require(['@/views/apiManagement/automatic'], resolve),
     name: '接口管理',
     meta: { title: '接口管理' }
   },
   {
-    path: '/online-quality',
+    path: '/views/online-quality',
     component: (resolve) => require(['@/views/Platform/presentation/testa'], resolve),
     redirect: '/online-quality/check-list',
     name: '上线质检',
@@ -305,7 +305,7 @@ export const constantRoutes = [{
     ]
   },
   {
-    path: '/virtualDevices',
+    path: '/views/virtualDevices',
     component: (resolve) => require(['@/views/Platform/presentation/testa'], resolve),
     redirect: '/virtualDevices/HTvehicle',
     name: '虚拟硬件',
@@ -332,7 +332,7 @@ export const constantRoutes = [{
     ]
   },
   {
-    path: '/newWeb',
+    path: '/views/newWeb',
     component: (resolve) => require(['@/views/newWeb/index'], resolve),
     // redirect: '/newWeb/index',
     name: '发布管理',
@@ -340,87 +340,87 @@ export const constantRoutes = [{
   },
 
   {
-    path: '/',
+    path: '/views',
     component: (resolve) => require(['@/views/automation/index'], resolve),
     name: '自动化',
     meta: { title: '自动化' },
     children: [{
-      path: '/tech_esfe_tr_h5_platform_dev_multi_service_support_test#',
+      path: 'tech_esfe_tr_h5_platform_dev_multi_service_support_test',
       component: (resolve) => require(['@/views/automation/index'], resolve),
       name: '用例管理',
       meta: { title: '用例管理' },
       children: [{
-        path: '/useCase/list',
-        name: '/useCase/list',
+        path: 'useCase/list',
+        name: 'useCase/list',
         component: (resolve) => require(['@/views/automation/index'], resolve),
         meta: { title: '用例列表' }
       },
       {
-        path: '/useRecord/batch',
-        name: '/useRecord/batch',
+        path: 'useRecord/batch',
+        name: 'useRecord/batch',
         component: (resolve) => require(['@/views/automation/index'], resolve),
         meta: { title: '批次记录' }
       },
       {
-        path: '/useRecord/list',
-        name: '/useRecord/list',
+        path: 'useRecord/list',
+        name: 'useRecord/list',
         component: (resolve) => require(['@/views/automation/index'], resolve),
         meta: { title: '执行记录' }
       },
       {
-        path: '/useCase/globalConf',
-        name: '/useCase/globalConf',
+        path: 'useCase/globalConf',
+        name: 'useCase/globalConf',
         component: (resolve) => require(['@/views/automation/index'], resolve),
         meta: { title: '用例配置' }
       }
       ]
     },
     {
-      path: '/tech_esfe_tr_h5_platform_dev',
+      path: '/views/tech_esfe_tr_h5_platform_dev',
       component: (resolve) => require(['@/views/automation/index'], resolve),
       name: '校验模块',
       meta: { title: '校验模块' },
       children: [{
-        path: '/apiRule/list',
-        name: '/apiRule/list',
+        path: 'apiRule/list',
+        name: 'apiRule/list',
         component: (resolve) => require(['@/views/automation/index'], resolve),
         meta: { title: '校验列表' }
       },
       {
-        path: '/apiRule/lisst',
-        name: '/apiRule/lisst'
+        path: 'apiRule/lisst',
+        name: 'apiRule/lisst'
       }]
     },
     {
-      path: '/tech_esfe_tr_h5_platform',
+      path: '/views/tech_esfe_tr_h5_platform',
       component: (resolve) => require(['@/views/automation/index'], resolve),
       name: 'APP管理',
       meta: { title: 'APP管理' },
       children: [{
-        path: '/appManage/add',
-        name: '/appManage/add',
+        path: 'appManage/add',
+        name: 'appManage/add',
         component: (resolve) => require(['@/views/automation/index'], resolve),
         meta: { title: '上传app' }
       },
       {
-        path: '/useCase/globalConnf',
-        name: '/useCase/globalConnf'
+        path: 'useCase/globalConnf',
+        name: 'useCase/globalConnf'
       }]
     },
     {
-      path: '/tech_esfe_tr_h5',
+      path: '/views/tech_esfe_tr_h5',
       component: (resolve) => require(['@/views/automation/index'], resolve),
       name: '截图管理',
       meta: { title: '截图管理' },
       children: [{
-        path: '/appCapture/list',
-        name: '/appCapture/list',
+        path: 'appCapture/list',
+        name: 'appCapture/list',
         component: (resolve) => require(['@/views/automation/index'], resolve),
         meta: { title: '截图查询' }
       },
       {
-        path: '/useCase/globalConnf',
-        name: '/useCase/globalConnf'
+        path: 'useCase/globalConnf',
+        name: 'useCase/globalConnf'
       }]
     }
     ]

+ 1 - 0
src/store/getters.js

@@ -12,6 +12,7 @@ const getters = {
   RichText: state => state.data.RichText,
   routes: state => state.data.routes,
   notice: state => state.data.notice,
+  noNetwork: state => state.global.noNetwork,
   activeNavTag: state => state.global.activeNavTag,
   showNavTag: state => state.global.showNavTag,
   navTagType: state => state.global.navTagType,

+ 7 - 0
src/store/modules/global.js

@@ -1,5 +1,6 @@
 // 通用
 const state = {
+  noNetwork: false, // 无网络状态
   activeNavTag: '个人工作台', // 当前导航对象
   showNavTag: true, // 是否显示2级导航栏
   navTagType: Number(localStorage.getItem('navTagType')) || 1, // 2级导航类型
@@ -8,6 +9,9 @@ const state = {
   bizName: '业务线' // 业务线名称
 }
 const mutations = {
+  setNoNetwork(state, payload) {
+    state.noNetwork = payload
+  },
   setActiveNavTag(state, payload) {
     state.activeNavTag = payload
   },
@@ -28,6 +32,9 @@ const mutations = {
   }
 }
 const actions = {
+  setNoNetwork(context, payload) {
+    context.commit('setNoNetwork', payload)
+  },
   setActiveNavTag(context, payload) {
     context.commit('setActiveNavTag', payload)
   },

+ 27 - 59
src/utils/request.js

@@ -10,46 +10,22 @@ import store from '@/store/index.js'
 // create an axios instance
 const service = axios.create({
   baseURL: '/apis', // url = base url + request url
-  // withCredentials: true, // send cookies when cross-domain requests
   timeout: 5000, // request timeout
   withCredentials: true
 })
 
-axios.defaults.withCredentials = true
-
-// request interceptor
 service.interceptors.request.use(
   config => {
-    // do something before request is sent
-
-    // if (store.getters.token) {
-    //   // let each request carry token
-    //   // ['X-Token'] is a custom headers key
-    //   // please modify it according to the actual situation
-    //   config.headers['X-Token'] = getToken()
-    // }
     config.headers['secret'] = Encrypt()
+    // config.retry = 2// 如果请求超时,重试次数
+    // config.retryInterval = 1000 // 重试间隔
     return config
   },
   error => {
-    // do something with request error
-    console.log(error) // for debug
     return Promise.reject(error)
   }
 )
-
-// response interceptor
 service.interceptors.response.use(
-  /**
-   * If you want to get http information such as headers or status
-   * Please return  response => response
-  */
-
-  /**
-   * Determine the request status by custom code
-   * Here is just an example
-   * You can also judge the status by HTTP Status Code
-   */
   response => {
     const res = response.data
     if (typeof res.code !== 'undefined' && res.code !== 200 && res.code !== 0) {
@@ -68,7 +44,6 @@ service.interceptors.response.use(
     return res
   },
   error => {
-    console.log('err' + error) // for debug
     if (error && error.response) {
       switch (error.response.status) {
         case 400:
@@ -77,38 +52,14 @@ service.interceptors.response.use(
         case 401:
           error.message = '未授权,请重新登录'
           break
-        case 403:
-          error.message = '拒绝访问'
-          break
         case 404:
           error.message = '请求错误,未找到该资源'
           break
         case 405:
           error.message = '请求方法未允许'
           break
-        case 408:
-          error.message = '请求超时'
-          break
-        case 500:
-          error.message = '服务器端出错'
-          break
-        case 501:
-          error.message = '网络未实现'
-          break
-        case 502:
-          error.message = '网络错误'
-          break
-        case 503:
-          error.message = '服务不可用'
-          break
-        case 504:
-          error.message = '网络超时'
-          break
-        case 505:
-          error.message = 'http版本不支持该请求'
-          break
         default:
-          error.message = `未知错误${error.response.status}`
+          error.message = '服务出现异常,请稍后再试或联系管理员'
       }
       if (error.response.status !== 403) {
         message({
@@ -124,16 +75,33 @@ service.interceptors.response.use(
         store.dispatch('global/setBizName', '')
         router.push({ name: 'notAccess' })
       }
-    } else {
-      error.message = '网络请求超时,请检查网络信息!'
-      message({
-        message: error.message,
-        type: 'warning',
-        duration: 5 * 1000
-      })
     }
     return Promise.reject(error)
   }
 )
+// function axiosRetryInterceptor(res) {
+//   const config = res.config
+//   // 无网络状态或者请求超时
+//   if (!config || !config.retry) return Promise.reject(res)
+//   // 记录重新请求的次数
+//   config.retryCount = config.retryCount || 0
+//   // 检查重新请求的次数是否超过我们设定的请求次数
+//   if (config.retryCount >= config.retry) {
+//     return Promise.reject(res)
+//   }
+//   // 重新请求的次数自增
+//   config.retryCount += 1
+//   // 创建新的Promise来处理重新请求的间隙
+//   const back = new Promise(function(resolve) {
+//     console.log('接口' + config.url + '请求超时,重新请求')
+//     setTimeout(function() {
+//       resolve()
+//     }, config.retryInterval || 500)
+//   })
+//   // 返回axios的实体,重试请求
+//   return back.then(function() {
+//     return service(config)
+//   })
+// }
 
 export default service

+ 11 - 5
src/views/home/index.vue

@@ -41,9 +41,9 @@
         >
         <br>
         <span style="font-size: 17pt;">一站式质量效率平台,普惠你的工作</span><br>
-        <el-button plain class="enter-button" @click.native="handleSelect('4')">项目管理 <i style="font-size: 14px;" class="el-icon-right" /></el-button>
-        <el-button plain class="enter-button" @click.native="handleSelect('1')">环境管理 <i style="font-size: 14px;" class="el-icon-right" /></el-button>
-        <el-button plain class="enter-button" @click.native="handleSelect('9')">工具集合 <i style="font-size: 14px;" class="el-icon-right" /></el-button>
+        <el-button plain class="enter-button" @click.native="handleSelect('4')"><svg-icon icon-class="project-enter" />项目管理</el-button>
+        <el-button plain class="enter-button" @click.native="handleSelect('1')"><svg-icon icon-class="env-enter" />环境管理</el-button>
+        <el-button plain class="enter-button" @click.native="handleSelect('9')"><svg-icon icon-class="tool-enter" />工具集合</el-button>
       </div>
       <a href="#content1">
         <img
@@ -148,8 +148,9 @@ div.div-login {
 div.div-introduction {
   position: absolute;
   font-size: 37pt;
-  top: 30%;
+  top: 28.5%;
   left: 8.3%;
+  line-height: 50px;
 }
 img.img-arrow {
   position: absolute;
@@ -159,10 +160,15 @@ img.img-arrow {
   left: 48.95%;
 }
 .enter-button {
-  margin-top: 16vh;
+  margin-top: 6vh;
   margin-right: 20px;
+  padding: 14px 10px;
   color: rgb(64,158,255);
 }
+.enter-button svg {
+  margin-right: 10px;
+  font-size: 18px;
+}
 .el-menu {
   border: none;
   height: 68px;

+ 23 - 0
src/views/newLayout/layout.vue

@@ -1,11 +1,13 @@
 <template>
   <div class="zhihui-contain">
+    <div v-show="noNetwork" class="no-network" />
     <Head />
     <Aside />
     <Main />
   </div>
 </template>
 <script>
+import { mapGetters } from 'vuex'
 import Head from '@/components/newLayout/Head'
 import Aside from '@/components/newLayout/Aside'
 import Main from '@/components/newLayout/Main'
@@ -15,6 +17,9 @@ export default {
     Aside,
     Main,
     Head
+  },
+  computed: {
+    ...mapGetters(['noNetwork'])
   }
 }
 </script>
@@ -24,4 +29,22 @@ export default {
   overflow: hidden;
   height: 100%;
 }
+.no-network {
+  position: fixed;
+  z-index: 999;
+  top:0;
+  left: 0;
+  height: 3px;
+  width: 100vw;
+  animation: loading linear 5s infinite;
+  background: linear-gradient(0.25turn, #3f87a6, #ebf8e1, #f69d3c);
+}
+@keyframes loading{
+  from{
+    width: 0
+  }
+  to{
+    width: 100%
+  }
+}
 </style>

+ 1 - 1
src/views/projectManage/bugList/details/index.vue

@@ -38,7 +38,7 @@
                   <el-input
                     v-model="bugNameForm.bugName"
                     type="textarea"
-                    autosize
+                    :autosize="{ minRows: 1, maxRows: 3}"
                     maxlength="150"
                     :show-word-limit="showWordLimit"
                     :style="bugNameTextareaStyle"

+ 4 - 1
src/views/workbench/components/createDialog.vue

@@ -106,7 +106,10 @@ export default {
         this.$message({ type: 'warning', message: '请选择业务线!' })
         return false
       }
-      this.$emit('change', this.bizList.find(item => item.code === this.bizId))
+      const list = this.bizList.reduce((pre, cur) => {
+        return [...pre.options, ...cur.options]
+      })
+      this.$emit('change', list.find(item => item.code === this.bizId))
     },
     cancel() { // 关闭弹框
       this.show = false

Деякі файли не було показано, через те що забагато файлів було змінено