【Flask】测试平台开发,重构提测管理页面-第二十篇

发布于:2025-09-07 ⋅ 阅读:(24) ⋅ 点赞:(0)

概述:

我们在前面已经将提测功能界面的功能都已经开发完成了,但是你有没有发现,此时的UI界面看起来很low,不是很高级,提测后的扭转状态也没有颜色区分,不直观

UI看着是不是很low,测试类型和测试的状态没有颜色,看着不是很直观

重构后的完整前端代码如下

<template>
  <div class="app-container">
    <div class="filter-container">
      <el-form :inline="true" :model="search">
        <el-form-item label="归属分类">
          <el-select v-model="search.productId">
            <el-option value="" label="所有" />
            <el-option
              v-for="item in optsProduct"
              :key="item.id"
              :label="item.title"
              :value="item.id"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="服务应用ID">
          <el-input v-model="search.appId" placeholder="服务ID关键词" style="width: 200px;" clearable />
        </el-form-item>
        <el-form-item label="测试人">
          <el-input v-model="search.tester" placeholder="默认测试" style="width: 210px;" clearable />
        </el-form-item>
        <el-form-item label="提测人">
          <el-input v-model="search.developer" placeholder="默认测试" style="width: 210px;" clearable />
        </el-form-item>
        <el-form-item label="测试时间范围">
          <el-date-picker
            v-model="search.timeRange"
            type="datetimerange"
            :picker-options="pickerOptions"
            range-separator="至"
            start-placeholder="开始日期"
            end-placeholder="结束日期"
            align="right"
            value-format="yyyy-MM-dd HH:mm:ss"
            format="yyyy-MM-dd HH:mm:ss"
          />
        </el-form-item>
        <el-form-item label="测试状态">
          <el-select v-model="search.status" placeholder="请选择">
            <el-option value="" label="所有" />
            <el-option key="1" label="已提测" value="1" />
            <el-option key="2" label="测试中" value="2" />
            <el-option key="3" label="通过" value="3" />
            <el-option key="4" label="失败" value="4" />
            <el-option key="9" label="废弃" value="9" />
          </el-select>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" plain @click="searchClick()">查询</el-button>
          <el-button @click="resetSearch">重置</el-button>
        </el-form-item>
      </el-form>
      <el-button type="primary" icon="el-icon-plus" style="float:right" @click="doCommit()">新建提测</el-button>
    </div>
    <div>
      <el-table :data="testData" v-loading="loading">
        <el-table-column prop="appId" label="服务应用ID" />
        <el-table-column prop="title" label="提测标题" show-overflow-tooltip />
        <el-table-column prop="status" label="测试状态">
          <template slot-scope="scope">
            <el-tag :type="getStatusType(scope.row.status)" effect="dark">
              {{ formatStatus(scope.row) }}
            </el-tag>
          </template>
        </el-table-column>
        <el-table-column prop="type" label="类型" align="center">
          <template slot-scope="scope">
            <el-tag :type="getTypeType(scope.row.type)" effect="light">
              {{ formatType(scope.row) }}
            </el-tag>
          </template>
        </el-table-column>
        <el-table-column prop="developer" label="提测人" align="center" />
        <el-table-column prop="tester" label="测试人" align="center" />
        <el-table-column prop="updateUser" label="更新人" align="center"/>
        <el-table-column :formatter="formatDate" prop="updateDate" label="更新时间" align="center" />
        <el-table-column :formatter="formatDate" prop="start_time" label="测试开始时间" align="center" />
        <el-table-column :formatter="formatDate" prop="end_time" label="测试结束时间" align="center" />
        <el-table-column label="操作" align="center" width="270">
          <template slot-scope="scope">
            <el-link v-if="scope.row.status===1" type="primary" @click="startTest(scope.row)">开始测试</el-link>
            <el-link v-if="scope.row.status===2" type="primary" @click="doReport(scope.row)">添加结果</el-link>
            <el-link v-if="scope.row.status===3 || scope.row.status == 4" type="primary" @click="showReportInfo(scope.row)">查看报告</el-link>
            <el-link v-if="scope.row.status===9" type="primary" @click="deleteTest(scope.row)">删除结果</el-link>
            <el-divider direction="vertical" />
            <el-link v-if="[1,2].includes(scope.row.status)" type="primary" @click="doUpdate(scope.row)">编辑提测</el-link>
            <el-link v-if="[3,4,9].includes(scope.row.status)" type="primary" @click="updateReport(scope.row)">编辑结果</el-link>
            <el-divider direction="vertical" />
            <el-link type="primary" @click="showRequestInfo(scope.row)">提测详情</el-link>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <div>
      <br>
      <el-pagination
        background
        :current-page.sync="pageValues.currentPage"
        :page-size="pageValues.pageSize"
        layout="total, sizes, prev, pager, next"
        :page-sizes="[5, 10, 20, 30, 50]"
        :total="pageValues.total"
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
      />
    </div>
    <div>
      <el-dialog :title="requestInfo.title" :visible.sync="requestInfoVisible">
        <el-descriptions :column="2" border>
          <el-descriptions-item label="提测人">{{requestInfo.developer}}</el-descriptions-item>
          <el-descriptions-item label="测试人">{{requestInfo.tester}}</el-descriptions-item>
          <el-descriptions-item label="提测版本">{{requestInfo.version}}</el-descriptions-item>
          <el-descriptions-item label="提测类型">{{formatInfoType(requestInfo.type)}}</el-descriptions-item>
          <el-descriptions-item label="服务应用ID" :span="2">{{requestInfo.appId}}</el-descriptions-item>
          <el-descriptions-item label="提测说明" :span="2">{{requestInfo.scope}}</el-descriptions-item>
          <el-descriptions-item label="代码地址" :span="2">{{requestInfo.gitCode}}</el-descriptions-item>
          <el-descriptions-item label="测试文档" :span="2">{{requestInfo.wiki}}</el-descriptions-item>
          <el-descriptions-item label="更多信息" :span="2">{{requestInfo.more}}</el-descriptions-item>
          <el-descriptions-item label="测试开始时间" :formatter="formatDate">{{requestInfo.start_time}}</el-descriptions-item>
          <el-descriptions-item label="测试结束时间" :formatter="formatDate">{{requestInfo.end_time}}</el-descriptions-item>
        </el-descriptions>
      </el-dialog>
    </div>
    <div>
      <el-dialog :title="'[测试报告]' + reportInfo.title" :visible.sync="reportInfoVisible">
        <el-descriptions :column="1" border>
          <el-descriptions-item label="测试结果">{{formatReportInfoStatus(reportInfo.status)}}</el-descriptions-item>
          <el-descriptions-item label="测试结论">{{reportInfo.test_desc}}</el-descriptions-item>
          <el-descriptions-item label="风险提示">{{reportInfo.test_risks}}</el-descriptions-item>
          <el-descriptions-item label="测试内容">{{reportInfo.test_cases}}</el-descriptions-item>
          <el-descriptions-item label="发现缺陷">{{reportInfo.test_bugs}}</el-descriptions-item>
          <el-descriptions-item v-if="reportInfo.test_file !==''" label="附件">
            <a :href="'http://172.16.60.60:5000/api/file/download?name='+reportInfo.test_file">{{reportInfo.test_file}}</a>
          </el-descriptions-item>
          <el-descriptions-item label="备注">{{reportInfo.test_note}}</el-descriptions-item>
          <el-descriptions-item label="已发邮件">{{reportInfo.test_email===1?'已发送':'未发送或失败'}}</el-descriptions-item>
        </el-descriptions>
      </el-dialog>
    </div>
  </div>
</template>
<script>
import { apiAppsProduct } from '@/api/apps'
import { apiTestSearch, changeStatus } from '@/api/test.js'

export default {
  name: 'Test',
  data() {
    return {
      // 条件查询变量定义
      search: {
        productId: '',
        appId: '',
        developer: '',
        tester: '',
        status: '',
        timeRange: [] // 统一的时间范围搜索
      },
      // 范围日期组件的快捷选项配置
      pickerOptions: {
        shortcuts: [{
          text: '最近一周',
          onClick(picker) {
            const end = new Date()
            const start = new Date()
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
            picker.$emit('pick', [start, end])
          }
        }, {
          text: '最近一个月',
          onClick(picker) {
            const end = new Date()
            const start = new Date()
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
            picker.$emit('pick', [start, end])
          }
        }, {
          text: '最近三个月',
          onClick(picker) {
            const end = new Date()
            const start = new Date()
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
            picker.$emit('pick', [start, end])
          }
        }]
      },
      optsProduct: [],
      testData: [],
      pageValues: {
        pageSize: 10,
        currentPage: 1,
        total: 0
      },
      loading: false,
      requestInfoVisible: false,
      requestInfo: {},
      reportInfoVisible: false,
      reportInfo: {},
      currentSearchParams: {}, // 当前搜索参数
      showDebug: true // 是否显示调试信息
    }
  },
  mounted() {
    if (this.$route.params.needUp && this.$route.params.needUp.needUp === 'true') {
      this.searchClick()
    }
  },
  created() {
    this.productList()
    this.searchClick()
  },
  methods: {
    formatDate(row, column) {
      const date = row[column.property]
      if (date === undefined) {
        return ''
      }
      return date
    },
    getStatusType(status) {
      const statusMap = {
        1: 'primary',
        2: 'warning',
        3: 'success',
        4: 'danger',
        9: 'info'
      }
      return statusMap[status] || 'info'
    },
    getTypeType(type) {
      const typeMap = {
        1: '',
        2: 'warning',
        3: 'danger',
        4: 'warning',
        5: 'warning',
        6: 'warning'
      }
      return typeMap[type] || ''
    },
    formatStatus(row) {
      const status = row.status
      switch (status) {
        case 1:
          return '已提测'
        case 2:
          return '测试中'
        case 3:
          return '测试通过'
        case 4:
          return '测试不通过'
        case 9:
          return '已废弃'
        default:
          return '未知状态'
      }
    },
    formatType(row) {
      const type = row.type
      switch (type) {
        case 1:
          return '功能测试'
        case 2:
          return '性能测试'
        case 3:
          return '安全测试'
        case 4:
          return '固件测试'
        case 5:
          return '外采类测试'
        case 6:
          return '整机测试'
        default:
          return '未知类型'
      }
    },
    productList() {
      apiAppsProduct().then(resp => {
        this.optsProduct = resp.data
      })
    },
    searchClick() {
      this.loading = true
      // 构建请求体
      const body = {
        pageSize: this.pageValues.pageSize,
        currentPage: this.pageValues.currentPage,
        productId: this.search.productId || '',
        appId: this.search.appId || '',
        tester: this.search.tester || '',
        developer: this.search.developer || '',
        status: this.search.status || '',
        // 使用 pickTime 参数名
        pickTime: this.search.timeRange || []
      }
      // 移除空字符串参数
      Object.keys(body).forEach(key => {
        if (body[key] === '') {
          delete body[key]
        }
      })
      console.log('发送到API的参数:', body)
      // 检查是否有搜索条件(除了分页参数)
      const hasSearchConditions = Object.keys(body).some(key =>
        key !== 'pageSize' &&
        key !== 'currentPage' &&
        body[key] !== undefined &&
        body[key] !== '' &&
        !(Array.isArray(body[key]) && body[key].length === 0)
      )
      apiTestSearch(body).then(response => {
        this.testData = response.data
        this.pageValues.total = response.total
        this.loading = false
        // 只在有搜索条件时才显示提示
        if (hasSearchConditions) {
          if (response.data && response.data.length === 0) {
            this.$message.warning('未找到符合条件的记录')
          } else {
            this.$message.success(`找到 ${response.data.length} 条记录`)
          }
        }
      }).catch(error => {
        console.error('查询失败:', error)
        this.loading = false
        // 错误提示仍然显示
        this.$message.error('查询失败: ' + (error.message || '请检查网络或参数'))
      })
    },
    resetSearch() {
      this.search = {
        productId: '',
        appId: '',
        developer: '',
        tester: '',
        status: '',
        timeRange: []
      }
      this.$message({
        message: '已重置搜索条件',
        type: 'success'
      })
      this.searchClick()
    },
    handleSizeChange(val) {
      this.pageValues.pageSize = val
      this.searchClick()
    },
    handleCurrentChange(val) {
      this.pageValues.currentPage = val
      this.searchClick()
    },
    doCommit(row) {
      this.$router.push({ path: '/commit?action=ADD' })
    },
    doUpdate(row) {
      this.$router.push({ path: '/commit?action=UPDATE&id=' + row.id })
    },
    startTest(row) {
      const reqBody = {
        id: row.id,
        status: 'start'
      }
      changeStatus(reqBody).then(resp => {
        this.$message({
          message: resp.message,
          type: 'success'
        })
        this.searchClick()
      })
    },
    deleteTest(row) {
      const reqBody = {
        id: row.id,
        status: 'delete'
      }
      changeStatus(reqBody).then(resp => {
        this.$message({
          message: resp.message,
          type: 'success'
        })
        this.searchClick()
      })
    },
    showRequestInfo(row) {
      this.requestInfo = row
      this.requestInfoVisible = true
    },
    formatInfoType(type) {
      switch (type) {
        case 1:
          return '功能测试'
        case 2:
          return '性能测试'
        case 3:
          return '安全测试'
        default:
          return '未知状态'
      }
    },
    doReport(row) {
      this.$router.push({ name: 'report', params: { action: 'ADD', id: row.id }})
    },
    updateReport(row) {
      this.$router.push({ name: 'report', params: { action: 'UPDATE', id: row.id }})
    },
    showReportInfo(row) {
      this.reportInfo = row
      this.reportInfoVisible = true
    },
    formatReportInfoStatus(status) {
      if (status === 3) {
        return '测试通过'
      } else if (status === 4) {
        return '测试失败'
      } else if (status === 9) {
        return '测试废弃'
      }
    }
  }
}
</script>

<style scoped>
  .el-pagination {
    text-align: right;
  }
  .el-tag {
    font-weight: bold;
  }
  .time-tips {
    font-size: 12px;
    color: #909399;
    margin-top: 5px;
  }
  .debug-panel {
    background: #f9f9f9;
    border-left: 4px solid #409EFF;
    padding: 10px 15px;
    margin: 15px 0;
    border-radius: 4px;
    font-size: 13px;
  }
  .debug-title {
    font-weight: bold;
    color: #409EFF;
    margin-bottom: 5px;
  }
</style>

重新启动前端服务,此时查看页面上的状态展示

每个状态我们都添加了颜色区分,这样使用上更加的直观

接着我们在原有提测管理的基础上,分别拓展几个功能菜单页面,分别为我的提测,我的测试,测试通过,测试失败的菜单,这样每个状态在对应的菜单栏里面只能看对应的状态,提测管理这个页面默认存储所有状态的数据

我们已经实现总的页面,要拓展这几个菜单出来,就很简单了,例如我的测试页面代码如下

<template>
  <div class="app-container">
    <div class="filter-container">
      <el-form :inline="true" :model="search">
        <el-form-item label="归属分类">
          <el-select v-model="search.productId">
            <el-option value="" label="所有" />
            <el-option
              v-for="item in optsProduct"
              :key="item.id"
              :label="item.title"
              :value="item.id"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="服务应用ID">
          <el-input v-model="search.appId" placeholder="服务ID关键词" style="width: 200px;" clearable />
        </el-form-item>
        <el-form-item label="测试人">
          <el-input v-model="search.tester" placeholder="默认测试" style="width: 210px;" clearable />
        </el-form-item>
        <el-form-item label="提测人">
          <el-input v-model="search.developer" placeholder="当前用户" style="width: 210px;" clearable />
        </el-form-item>
        <el-form-item label="测试时间范围">
          <el-date-picker
            v-model="search.timeRange"
            type="datetimerange"
            :picker-options="pickerOptions"
            range-separator="至"
            start-placeholder="开始日期"
            end-placeholder="结束日期"
            align="right"
            value-format="yyyy-MM-dd HH:mm:ss"
            format="yyyy-MM-dd HH:mm:ss"
          />
        </el-form-item>
        <el-form-item label="测试状态">
          <el-select v-model="search.status" placeholder="请选择">
            <el-option value="1" label="已提测" />
            <el-option value="" label="所有" />
          </el-select>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" plain @click="searchClick()">查询</el-button>
          <el-button @click="resetSearch">重置</el-button>
        </el-form-item>
      </el-form>
      <el-button type="primary" icon="el-icon-plus" style="float:right" @click="doCommit()">新建提测</el-button>
    </div>
    <div>
      <el-table :data="testData" v-loading="loading">
        <el-table-column prop="appId" label="服务应用ID" />
        <el-table-column prop="title" label="提测标题" show-overflow-tooltip />
        <el-table-column prop="status" label="测试状态">
          <template slot-scope="scope">
            <el-tag :type="getStatusType(scope.row.status)" effect="dark">
              {{ formatStatus(scope.row) }}
            </el-tag>
          </template>
        </el-table-column>
        <el-table-column prop="type" label="类型" align="center">
          <template slot-scope="scope">
            <el-tag :type="getTypeType(scope.row.type)" effect="light">
              {{ formatType(scope.row) }}
            </el-tag>
          </template>
        </el-table-column>
        <el-table-column prop="developer" label="提测人" align="center" />
        <el-table-column prop="tester" label="测试人" align="center" />
        <el-table-column prop="updateUser" label="更新人" align="center"/>
        <el-table-column :formatter="formatDate" prop="updateDate" label="更新时间" align="center" />
        <el-table-column :formatter="formatDate" prop="start_time" label="测试开始时间" align="center" />
        <el-table-column :formatter="formatDate" prop="end_time" label="测试结束时间" align="center" />
        <el-table-column label="操作" align="center" width="270">
          <template slot-scope="scope">
            <el-link v-if="scope.row.status===1" type="primary" @click="startTest(scope.row)">开始测试</el-link>
            <el-link v-if="scope.row.status===2" type="primary" @click="doReport(scope.row)">添加结果</el-link>
            <el-link v-if="scope.row.status===3 || scope.row.status == 4" type="primary" @click="showReportInfo(scope.row)">查看报告</el-link>
            <el-link v-if="scope.row.status===9" type="primary" @click="deleteTest(scope.row)">删除结果</el-link>
            <el-divider direction="vertical" />
            <el-link v-if="[1,2].includes(scope.row.status)" type="primary" @click="doUpdate(scope.row)">编辑提测</el-link>
            <el-link v-if="[3,4,9].includes(scope.row.status)" type="primary" @click="updateReport(scope.row)">编辑结果</el-link>
            <el-divider direction="vertical" />
            <el-link type="primary" @click="showRequestInfo(scope.row)">提测详情</el-link>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <div>
      <br>
      <el-pagination
        background
        :current-page.sync="pageValues.currentPage"
        :page-size="pageValues.pageSize"
        layout="total, sizes, prev, pager, next"
        :page-sizes="[5, 10, 20, 30, 50]"
        :total="pageValues.total"
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
      />
    </div>
    <div>
      <el-dialog :title="requestInfo.title" :visible.sync="requestInfoVisible">
        <el-descriptions :column="2" border>
          <el-descriptions-item label="提测人">{{requestInfo.developer}}</el-descriptions-item>
          <el-descriptions-item label="测试人">{{requestInfo.tester}}</el-descriptions-item>
          <el-descriptions-item label="提测版本">{{requestInfo.version}}</el-descriptions-item>
          <el-descriptions-item label="提测类型">{{formatInfoType(requestInfo.type)}}</el-descriptions-item>
          <el-descriptions-item label="服务应用ID" :span="2">{{requestInfo.appId}}</el-descriptions-item>
          <el-descriptions-item label="提测说明" :span="2">{{requestInfo.scope}}</el-descriptions-item>
          <el-descriptions-item label="代码地址" :span="2">{{requestInfo.gitCode}}</el-descriptions-item>
          <el-descriptions-item label="测试文档" :span="2">{{requestInfo.wiki}}</el-descriptions-item>
          <el-descriptions-item label="更多信息" :span="2">{{requestInfo.more}}</el-descriptions-item>
          <el-descriptions-item label="测试开始时间" :formatter="formatDate">{{requestInfo.start_time}}</el-descriptions-item>
          <el-descriptions-item label="测试结束时间" :formatter="formatDate">{{requestInfo.end_time}}</el-descriptions-item>
        </el-descriptions>
      </el-dialog>
    </div>
    <div>
      <el-dialog :title="'[测试报告]' + reportInfo.title" :visible.sync="reportInfoVisible">
        <el-descriptions :column="1" border>
          <el-descriptions-item label="测试结果">{{formatReportInfoStatus(reportInfo.status)}}</el-descriptions-item>
          <el-descriptions-item label="测试结论">{{reportInfo.test_desc}}</el-descriptions-item>
          <el-descriptions-item label="风险提示">{{reportInfo.test_risks}}</el-descriptions-item>
          <el-descriptions-item label="测试内容">{{reportInfo.test_cases}}</el-descriptions-item>
          <el-descriptions-item label="发现缺陷">{{reportInfo.test_bugs}}</el-descriptions-item>
          <el-descriptions-item v-if="reportInfo.test_file !==''" label="附件">
            <a :href="'http://172.16.60.60:5000/api/file/download?name='+reportInfo.test_file">{{reportInfo.test_file}}</a>
          </el-descriptions-item>
          <el-descriptions-item label="备注">{{reportInfo.test_note}}</el-descriptions-item>
          <el-descriptions-item label="已发邮件">{{reportInfo.test_email===1?'已发送':'未发送或失败'}}</el-descriptions-item>
        </el-descriptions>
      </el-dialog>
    </div>
  </div>
</template>

<script>
import { apiAppsProduct } from '@/api/apps'
import { apiTestSearch, changeStatus } from '@/api/test.js'
import { getToken } from '@/utils/auth'

export default {
  name: 'MyCommit',
  data() {
    return {
      search: {
        productId: '',
        appId: '',
        developer: getToken('username') || '', // 默认当前用户
        tester: '',
        status: '1', // 默认只显示已提测状态
        timeRange: []
      },
      pickerOptions: {
        shortcuts: [{
          text: '最近一周',
          onClick(picker) {
            const end = new Date()
            const start = new Date()
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
            picker.$emit('pick', [start, end])
          }
        }, {
          text: '最近一个月',
          onClick(picker) {
            const end = new Date()
            const start = new Date()
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
            picker.$emit('pick', [start, end])
          }
        }, {
          text: '最近三个月',
          onClick(picker) {
            const end = new Date()
            const start = new Date()
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
            picker.$emit('pick', [start, end])
          }
        }]
      },
      optsProduct: [],
      testData: [],
      pageValues: {
        pageSize: 10,
        currentPage: 1,
        total: 0
      },
      loading: false,
      requestInfoVisible: false,
      requestInfo: {},
      reportInfoVisible: false,
      reportInfo: {}
    }
  },
  mounted() {
    if (this.$route.params.needUp && this.$route.params.needUp.needUp === 'true') {
      this.searchClick()
    }
  },
  created() {
    this.productList()
    this.searchClick()
  },
  methods: {
    formatDate(row, column) {
      const date = row[column.property]
      if (date === undefined) {
        return ''
      }
      return date
    },
    getStatusType(status) {
      const statusMap = {
        1: 'primary',
        2: 'warning',
        3: 'success',
        4: 'danger',
        9: 'info'
      }
      return statusMap[status] || 'info'
    },
    getTypeType(type) {
      const typeMap = {
        1: '',
        2: 'warning',
        3: 'danger',
        4: 'warning',
        5: 'warning',
        6: 'warning'
      }
      return typeMap[type] || ''
    },
    formatStatus(row) {
      const status = row.status
      switch (status) {
        case 1:
          return '已提测'
        case 2:
          return '测试中'
        case 3:
          return '测试通过'
        case 4:
          return '测试不通过'
        case 9:
          return '已废弃'
        default:
          return '未知状态'
      }
    },
    formatType(row) {
      const type = row.type
      switch (type) {
        case 1:
          return '功能测试'
        case 2:
          return '性能测试'
        case 3:
          return '安全测试'
        case 4:
          return '固件测试'
        case 5:
          return '外采类测试'
        case 6:
          return '整机测试'
        default:
          return '未知类型'
      }
    },
    productList() {
      apiAppsProduct().then(resp => {
        this.optsProduct = resp.data
      })
    },
    searchClick() {
      this.loading = true
      const body = {
        pageSize: this.pageValues.pageSize,
        currentPage: this.pageValues.currentPage,
        productId: this.search.productId || '',
        appId: this.search.appId || '',
        tester: this.search.tester || '',
        developer: this.search.developer || '',
        status: this.search.status || '',
        pickTime: this.search.timeRange || []
      }
      // 强制过滤状态为已提测(1),即使选择了"所有"
      if (this.search.status === '') {
        body.status = '1'
      }
      apiTestSearch(body).then(response => {
        this.testData = response.data
        this.pageValues.total = response.total
        this.loading = false
        if (response.data && response.data.length === 0) {
          this.$message.warning('未找到符合条件的记录')
        }
      }).catch(error => {
        console.error('查询失败:', error)
        this.loading = false
        this.$message.error('查询失败: ' + (error.message || '请检查网络或参数'))
      })
    },
    resetSearch() {
      this.search = {
        productId: '',
        appId: '',
        developer: getToken('username') || '', // 重置后仍保持当前用户
        tester: '',
        status: '1', // 重置后仍保持已提测状态
        timeRange: []
      }
      this.$message({
        message: '已重置搜索条件',
        type: 'success'
      })
      this.searchClick()
    },
    handleSizeChange(val) {
      this.pageValues.pageSize = val
      this.searchClick()
    },
    handleCurrentChange(val) {
      this.pageValues.currentPage = val
      this.searchClick()
    },
    doCommit(row) {
      this.$router.push({ path: '/commit?action=ADD' })
    },
    doUpdate(row) {
      this.$router.push({ path: '/commit?action=UPDATE&id=' + row.id })
    },
    startTest(row) {
      const reqBody = {
        id: row.id,
        status: 'start'
      }
      changeStatus(reqBody).then(resp => {
        this.$message({
          message: resp.message,
          type: 'success'
        })
        this.searchClick()
      })
    },
    deleteTest(row) {
      const reqBody = {
        id: row.id,
        status: 'delete'
      }
      changeStatus(reqBody).then(resp => {
        this.$message({
          message: resp.message,
          type: 'success'
        })
        this.searchClick()
      })
    },
    showRequestInfo(row) {
      this.requestInfo = row
      this.requestInfoVisible = true
    },
    formatInfoType(type) {
      switch (type) {
        case 1:
          return '功能测试'
        case 2:
          return '性能测试'
        case 3:
          return '安全测试'
        default:
          return '未知状态'
      }
    },
    doReport(row) {
      this.$router.push({ name: 'report', params: { action: 'ADD', id: row.id }})
    },
    updateReport(row) {
      this.$router.push({ name: 'report', params: { action: 'UPDATE', id: row.id }})
    },
    showReportInfo(row) {
      this.reportInfo = row
      this.reportInfoVisible = true
    },
    formatReportInfoStatus(status) {
      if (status === 3) {
        return '测试通过'
      } else if (status === 4) {
        return '测试失败'
      } else if (status === 9) {
        return '测试废弃'
      }
    }
  }
}
</script>

<style scoped>
  .el-pagination {
    text-align: right;
  }
  .el-tag {
    font-weight: bold;
  }
  .time-tips {
    font-size: 12px;
    color: #909399;
    margin-top: 5px;
  }
</style>

其他页面也是相同的操作,只是对于过滤条件进行了筛选过滤,可以动手自己试试

 


网站公告

今日签到

点亮在社区的每一天
去签到