Просмотр исходного кода

Merge remote-tracking branch 'origin/http_mock' into http_mock

洪海涛 4 лет назад
Родитель
Сommit
2788b4312c

+ 1 - 0
src/router/newRouter.js

@@ -255,6 +255,7 @@ const layout = [
         name: '测试计划',
         icon: 'test-plain',
         key: 'testplain',
+        hidden: true,
         component: () => import('@/views/Platform/testPage.vue'),
         meta: { title: '测试计划' }
       },

+ 31 - 0
src/utils/index.js

@@ -8,6 +8,7 @@
  * @param {string} cFormat
  * @returns {string}
  */
+const _ = require('lodash')
 export function parseTime(time, cFormat) {
   if (arguments.length === 0) {
     return null
@@ -179,3 +180,33 @@ export function strToArr(str) {
   // eslint-disable-next-line no-eval
   return window.eval(str)
 }
+export function getUrlSearch(deleteList, addList) {
+  const urlParamsObj = {}
+  const urlSearch = location.href.includes('?') && location.href.split('?')[1] || ''
+  urlSearch && urlSearch.split('&').map(t => {
+    const obj = t.split('=')
+    urlParamsObj[obj[0]] = obj[1]
+  })
+  const newUrl = _.clone(urlParamsObj)
+  deleteList && deleteList.map(t => { delete newUrl[t] })
+  addList && addList.map(t => { newUrl[t.key] = t.value })
+  let urlParams = ''
+  newUrl && Object.keys(newUrl).forEach(g => {
+    urlParams += `${g}=${newUrl[g]}${Object.keys(newUrl).length - 1 === Object.keys(newUrl).indexOf(g) ? '' : '&'}`
+  })
+  return urlParams
+}
+
+export function getUrlParamsObj(keylist) {
+  // url地址中参数?id=91&workId=222 => {id: "91", workId: "222"}
+  const urlParamsObj = {}
+  const obj = {}
+  location.href.includes('?') && location.href.split('?')[1].split('&').map(t => {
+    const obj = t.split('=')
+    urlParamsObj[obj[0]] = obj[1]
+  })
+  keylist.map(t => {
+    obj[t] = urlParamsObj[t]
+  })
+  return obj
+}

+ 46 - 0
src/views/projectManage/components/testPlan.vue

@@ -0,0 +1,46 @@
+<template>
+  <div v-loading="loading">
+    <iframe id="testPlanIfr" :src="src" style="width: calc(100vw - 225px); margin-left: 10px;" :height="iframeHeight" scrolling="auto" frameborder="0" />
+  </div>
+</template>
+
+<script>
+import { host } from '@/apiConfig/requestIP'
+
+export default {
+  props: {
+    bizid: { type: [Number, String], required: true },
+    id: { type: Number, required: true },
+    type: { type: String, required: true }
+  },
+  data() {
+    return {
+      iframeHeight: '750',
+      loading: true
+    }
+  },
+  computed: {
+    src() {
+      const src = `${host}/usecase/#/taskTest?bizId=${this.bizid}&keyType=${this.type}_${this.id}&hiddenNav=true`
+      // const src = `http://localhost:7100/#/taskTest?bizId=${this.bizid}&keyType=${this.type}_${this.id}&hiddenNav=true`
+      return src
+    }
+  },
+  mounted() {
+    this.iframeHeight = (document.body.clientHeight - 80) + 'px'
+    window.addEventListener('message', this.onEventListener, false)
+  },
+  methods: {
+    onEventListener(e) {
+      const { event } = e.data
+      if (event === 'done') {
+        this.loading = false
+      }
+    }
+  }
+}
+</script>
+
+<style>
+
+</style>

+ 11 - 1
src/views/projectManage/requirement/requirementDetail.vue

@@ -39,6 +39,7 @@
           <el-tabs v-model="activeName">
             <el-tab-pane label="概览" name="1" />
             <el-tab-pane label="任务" name="2" />
+            <el-tab-pane label="测试" name="7" />
             <el-tab-pane label="缺陷" name="3" />
             <el-tab-pane label="统计" name="4" />
           </el-tabs>
@@ -245,6 +246,11 @@
         </section>
       </el-container>
       <!-- 任务 -->
+       <!-- 测试 -->
+      <el-container v-if="activeName === '7'">
+        <testPlan :id="form_query.id" :bizid="bizId" type="require" />
+      </el-container>
+      <!-- 测试 -->
       <!-- 缺陷 -->
       <el-container v-if="activeName === '3'" class="is-vertical">
         <section class="main-section contain">
@@ -347,6 +353,7 @@ import timeLine from '@/views/projectManage/components/timeLine.vue'
 import BasicsCode from '@/views/projectManage/requirement/components/BasicsCode.vue'
 import workflowAndStatus from '@/views/projectManage/components/workflowAndStatus.vue'
 import ganntViews from './components/ganntViews'
+import testPlan from '@/views/projectManage/components/testPlan.vue'
 import timeStatist from '@/views/projectManage/requirement/components/timeStatistics.vue'
 export default {
   components: {
@@ -366,7 +373,8 @@ export default {
     ganntViews,
     BasicsCode,
     workflowAndStatus,
-    timeStatist
+    timeStatist,
+    testPlan
   },
   filters: {
     ellipsis(value, num) {
@@ -384,6 +392,7 @@ export default {
       showunlock: true,
       textarea2: '',
       HoldTask: '',
+      bizId: '',
       dialogVisible: false,
       status_dialong: {}, // 切换状态
       toilp: '',
@@ -453,6 +462,7 @@ export default {
     analysisBizId_id() { // 解析路由中的bizId_id
       if (!this.$route.query.bizId_id) return
       const bizId_id = analysisBizId_id(this.$route.query.bizId_id)
+      this.bizId = bizId_id[0]
       this.requirementId = bizId_id[1]
       this.bugListQuery = { requireId: this.requirementId }
       this.getRequirementById()

+ 10 - 0
src/views/projectManage/taskList/taskViewDetail.vue

@@ -65,6 +65,7 @@
           <el-tabs v-model="activeName">
             <el-tab-pane label="概览" name="1" />
             <el-tab-pane label="子任务" name="2" />
+            <el-tab-pane label="测试" name="7" />
             <el-tab-pane label="缺陷" name="3" />
             <el-tab-pane label="报告" name="4" />
             <el-tab-pane label="统计" name="5" />
@@ -329,6 +330,11 @@
         </section>
       </el-container>
       <!-- 子任务 -->
+      <!-- 测试 -->
+      <el-container v-if="activeName === '7'">
+        <testPlan :id="form_query.id" :bizid="bizId" type="task" />
+      </el-container>
+      <!-- 测试 -->
       <!-- 缺陷 -->
       <el-container v-if="activeName === '3'" class="is-vertical">
         <section class="main-section contain">
@@ -475,6 +481,7 @@ import { dailyReportCheckStatus, reportreleaseCheckStatus, reportdelivertestChec
 import synchronizeDialog from './dialog/synchronizeDialog' // 同步弹框
 import workflowAndStatus from '@/views/projectManage/components/workflowAndStatus.vue'
 import { formatHMS } from '@/utils/global'
+import testPlan from '@/views/projectManage/components/testPlan.vue'
 export default {
   components: {
     searchPeople,
@@ -499,6 +506,7 @@ export default {
     workflowAndStatus,
     synchronizeDialog,
     publishTask,
+    testPlan,
     checkListStopConfirm // checklist拦截弹窗
   },
   filters: {
@@ -521,6 +529,7 @@ export default {
       textarea1: '',
       HoldTask: '',
       closeTask: '',
+      bizId: '',
       visible: false, // Hold任务
       taskVisible: false, // 关闭任务
       dialogVisible: false,
@@ -604,6 +613,7 @@ export default {
     analysisBizId_id() { // 解析路由中的bizId_id
       if (!this.$route.query.bizId_id) return
       const bizId_id = analysisBizId_id(this.$route.query.bizId_id)
+      this.bizId = bizId_id[0]
       this.taskId = bizId_id[1]
       this.taskGet()
       this.getTaskStatus()

+ 1 - 1
src/views/quality/components/drawerAll.vue

@@ -349,7 +349,7 @@ export default {
   overflow: hidden;
 }
 .qz-drawer-padding {
-  padding: 20px 0;
+  padding: 0 0 20px;
 }
 .qz-drawer-padding-s {
   padding: 1px 0;

+ 112 - 0
src/views/useCase/components/useCase.vue

@@ -0,0 +1,112 @@
+<template>
+  <section v-if="bizId !== -1" v-loading="loading" class="case-main">
+    <iframe
+      id="useCaseIfr"
+      :class="{ 'full-screen': fullScreen}"
+      frameborder="0"
+      scrolling="no"
+      :src="src"
+    />
+  </section>
+</template>
+<script>
+import { mapGetters } from 'vuex'
+import { host } from '@/apiConfig/requestIP'
+// import addDOMEventListener from 'add-dom-event-listener'
+// import { EncryptId, desDecryptId } from '@/utils/crypto-js.js'
+import { getUrlSearch, getUrlParamsObj } from '@/utils'
+export default {
+  data() {
+    return {
+      ifr: null,
+      srcHost: '/case/caseList/zhihui/',
+      loading: true,
+      path: '/useCase',
+      eventHandlers: '',
+      fullScreen: false // 是否全屏
+    }
+  },
+  computed: {
+    ...mapGetters(['bizId']),
+    src() {
+      const { caseRoute } = getUrlParamsObj(['caseRoute'])
+      // const bizId = EncryptId(`${this.bizId}`)
+//  host =      // const
+      //   getEnv() === 'test'
+      //     ? 'http://10.96.83.94:9000/index.html#'
+      //     : getEnv() === 'pre'
+      //     ? 'http://agiletc-pre.intra.xiaojukeji.com/#'
+      //     : 'http://agiletc.intra.xiaojukeji.com/#'
+      // const src = `${host}${
+      //   this.$route.query.detailCaseUrl
+      //     ? '/case/caseManager/zhihui/'
+      //     : this.srcHost
+      // }${this.$route.query.detailCaseUrl || encodeURIComponent(bizId)}`
+      // const src = `http://localhost:7100/#${this.$route.query.detailCaseUrl || this.path}?bizId=${this.bizId}&hiddenNav=true&caseRoute=${caseRoute}`
+      const src = `${host}/usecase/#${this.$route.query.detailCaseUrl || this.path}?bizId=${this.bizId}&hiddenNav=true&caseRoute=${caseRoute}`
+      return src
+    }
+  },
+  watch: {
+    bizId: {
+      handler(newV) {
+        if (newV === -1) return
+        this.matchObj = { params: { product_id: newV }}
+      },
+      immediate: true
+    }
+  },
+  mounted() {
+    window.addEventListener('message', this.onEventListener, false)
+
+    // window.addEventListener(
+    //   'message',
+    //   e => this.setRouterPath(e),
+    //   false
+    // )
+  },
+  beforeDestroy() {
+
+  },
+  // 销毁监听事件
+  destroyed() {
+    window.removeEventListener(
+      'message',
+      this.onEventListener,
+      false
+    )
+  },
+  methods: {
+    onEventListener(e) {
+      console.log(e.data)
+      const { event, route } = e.data
+      const { href } = window.location
+      if (event === 'usecase-set') {
+        const params = getUrlSearch(['caseRoute'], [{ key: 'caseRoute', value: route }])
+        window.open(`${href.split('?')[0]}?${params}`, '_self')
+      }
+      if (event === 'done') {
+        this.loading = false
+      }
+    }
+  }
+}
+</script>
+<style lang='less' scoped>
+.case-main {
+  margin: 10px 0 0 10px;
+  overflow: none;
+}
+#useCaseIfr {
+  width: 100%;
+  height: calc(100vh - 60px);
+}
+.full-screen {
+  position: fixed;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  z-index: 999;
+}
+</style>

+ 9 - 5
src/views/useCase/index.vue

@@ -2,21 +2,25 @@
   <section class="all-useCase">
     <div class="control-pages">
       <span class="control-item" :class="{'is-active':isActive === 1}" @click="isActive=1">测试用例</span>
-      <span class="control-item" :class="{'is-active':isActive === 2}" @click="isActive=2">老版用例</span>
+      <span class="control-item" :class="{'is-active':isActive === 2}" @click="isActive=2">测试用例(xmind版)</span>
+      <!-- <span class="control-item" :class="{'is-active':isActive === 2}" @click="isActive=2">老版用例</span> -->
     </div>
     <keep-alive>
-      <requirement-case v-if="isActive === 1" />
-      <test-use-case v-if="isActive === 2" />
+      <use-case v-if="isActive === 1" />
+      <requirement-case v-if="isActive === 2" />
+      <!-- <test-use-case v-if="isActive === 2" /> -->
     </keep-alive>
   </section>
 </template>
 <script>
 import requirementCase from '@/views/useCase/components/requirementCase'
-import testUseCase from '@/views/Platform/useCasePage'
+import useCase from '@/views/useCase/components//useCase'
+// import testUseCase from '@/views/Platform/useCasePage'
 export default {
   components: {
     requirementCase,
-    testUseCase
+    // testUseCase,
+    useCase
   },
   data() {
     return {