Newer
Older
testLinkTool / src / components / testLink / testLink.vue
<template>
  <div class="test-link">
    <div class="title">
      <div class="logo-text">
        <img class="logo" src="../../assets/img/logo.png" />
        <span>全平台链接测试工具</span>
      </div>
      <!-- <div class="subhead">—— 全平台链接测试工具</div> -->
    </div>
    <div class="text">平台链接测试支持:抖音、快手、西瓜、微视等主流短视频平台,微博、 小红书、贴吧、b站、公众号</div>

    <div class="main">
      <div>
        <el-date-picker
          v-model="timeRange"
          type="datetimerange"
          range-separator="到"
          format="yyyy-MM-dd HH:mm:ss"
          value-format="yyyy-MM-dd HH:mm:ss"
          :picker-options="pickerOptions"
          start-placeholder="测试开始时间"
          end-placeholder="测试结束时间"
        />
        <el-button type="primary" style="margin-left: 10px" @click="search" icon="el-icon-search">查询</el-button>
      </div>

      <div class="button-area">
        <el-button type="primary" @click="test">链接测试</el-button>
        <el-button type="primary" @click="downloadTemplate">模板下载</el-button>
        <el-upload
          :limit="1"
          :show-file-list="false"
          :http-request="uploadFile"
          :file-list="fileList"
          class="upload-btn"
          action="string"
          accept=".xls,.xlsx">
          <el-button class="filter-item" style="margin: 0 10px;" type="primary" icon="el-icon-download">导入</el-button>
        </el-upload>
        <el-button type="primary" icon="el-icon-upload2" @click="exportAll">导出</el-button>
        <el-button type="danger" icon="el-icon-delete" @click="batchDelete">删除</el-button>
      </div>
    </div>

    <div class="table-area">
      <el-table
        v-loading="tableLoading"
        :data="tableData"
        border
        stripe
        :show-overflow-tooltip="true"
        style="width: 100%"
        @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column label="序号" width="55" align="center">
          <template slot-scope="scope">
            {{ (listQuery.offset - 1) * listQuery.limit + scope.$index + 1 }}
          </template>
        </el-table-column>
        <el-table-column
          align="center"
          v-for="item in tableHead"
          :key="item.id"
          :prop="item.id"
          :label="item.name"
          :width="item.width"
        >
          <template slot-scope="scope">
            <span v-if="item.id==='testResult'" :class="scope.row.testResult==='通过' ? 'green' : scope.row.testResult==='不通过' ? 'red' : 'normal'">{{ scope.row.testResult }}</span>
            <span v-else>{{ scope.row[item.id] }}</span>
          </template>
        </el-table-column>
      </el-table>
    </div>

    <PageNum
      :pageSize="listQuery.limit"
      :pageNum="listQuery.offset"
      :total="total"
      @changePageSize="changePageSize"
      @changePageNum="changePageNum"
    />
    <AddTestUrlDialog v-show="dialogFormVisible" ref="addTestUrlDialogRef" @watchChild="watchChild"/>
  </div>
</template>
<script>
import PageNum from '../page/pageNum.vue';
import { getListPage, batchImport, listExport, deleteList, downloadTemplate } from '@/api/testLink'
import AddTestUrlDialog from './components/addTestUrlDialog.vue'
export default {
  name: 'TestLink',
  components: { AddTestUrlDialog, PageNum },
  data() {
    return {
      timeRange: '',
      fileList: [], // 批量导入
      tableData: [], //表格数据
      tableHead: [
        {
          id: 'testPlatform',
          name: '测试平台'
        },
        {
          id: 'testUrl',
          name: '链接地址'
        },
        {
          id: 'createTime',
          name: '测试时间',
          width: '140'
        },
        {
          id: 'testTime',
          name: '测试耗时/ms'
        },
        {
          id: 'testResult',
          name: '测试结果',
          width: '80'
        },
      ], //表头
      checkoutList: [],
      total: 50, //总条数
      tableLoading: false, //表格loading
      tableHeight: document.body.clientHeight - 220,   //表格固定高度
      dialogFormVisible: false, // 是否显示编辑框
      // 查询条件
      listQuery: {
        beginTime: '',
        endTime: '',
        offset: 1,
        limit: 10,
      },
      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]);
          }
        }]
      },
    }
  },
  watch: {
    timeRange(val) {
      if (val) {
        this.listQuery.beginTime = val[0]
        this.listQuery.endTime = val[1]
      }
      else {
        this.listQuery.beginTime = ''
        this.listQuery.endTime = ''
      }
    }
  },
  mounted() {
    this.fetchData()
  },
  methods: {
    // 链接测试成功
    watchChild() {
      this.listQuery.offset = 1;
      this.fetchData()
    },
    // 点击查询
    search() {
      this.fetchData()
    },
    //多选
    handleSelectionChange(val) {
      this.checkoutList = val.map(item => item.id)
      console.log(this.checkoutList);
    },
    changePageSize(val) {
      this.listQuery.limit = val;
      this.fetchData()
    },
    changePageNum(val) {
      this.listQuery.offset = val;
      this.fetchData()
    },
    // 获取数据
    fetchData() {
      this.tableLoading = true
      getListPage(this.listQuery).then(res => {
        if(res.code === 200) {
          this.tableData = res.data.rows
          this.total = res.data.total
          this.tableLoading = false
        }
      }).catch(() => {
        this.$message.error('请求失败')
        this.tableLoading = false
      })
    },
    // 批量导入
    uploadFile(param) {
      // 判断文件大小是否符合要求
      const _file = param.file
      const isLt5M = _file.size / 1024 / 1024 < 5
      if (!isLt5M) {
        this.$message.error('请上传5M以下的excel文件')
        return false
      }
      // 全屏加载动画
      const loading = this.$loading({
        lock: true,
        text: '导入中,请稍后...',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      })
      // 批量导入上传请求
      batchImport(_file).then(res => {
        loading.close() // 关闭加载动画
        if (res.code === 200) {
          this.$message.success('导入成功')
          this.fileList = []
          this.listQuery.offset = 1;
          this.fetchData()
        } else {
          this.$message.error(res.message)
        }
      }).catch(err => {
        loading.close()
        this.$message.error('请求失败')
      })
      this.fileList = []
    },
    // 点击链接测试
    test() {
      this.dialogFormVisible = true
      this.$refs.addTestUrlDialogRef.initDialog(this.dialogFormVisible)
    },
    // 导出
    exportAll() {
      // 全屏加载动画
      const loading = this.$loading({
        lock: true,
        text: '下载中,请稍后...',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      })
      listExport(this.listQuery).then(res => {
        loading.close()
        // this.$message.success('导出成功')
        const blob = new Blob([res.data])
        const downloadElement = document.createElement('a')
        const href = window.URL.createObjectURL(blob) // 创建下载的链接
        downloadElement.href = href
        downloadElement.download = `测试列表.xlsx` // 下载后文件名
        document.body.appendChild(downloadElement)
        downloadElement.click() // 点击下载
        document.body.removeChild(downloadElement) // 下载完成移除元素
        window.URL.revokeObjectURL(href) // 释放blob对象
      }).catch((res) => {
        loading.close()
        this.$message.error('请求失败')
      })
    },
    // 批量删除
    batchDelete() {
      const loading = this.$loading({
        lock: true,
        text: '加载中,请稍后...',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      });
      deleteList({ids: this.checkoutList}).then(() => {
        this.$message.success('删除成功')
        this.listQuery.offset = 1;
        this.fetchData()
        loading.close()
      }).catch(() => {
        loading.close()
        this.$message.error('请求失败')
      })
    },
     // 下载模板
     downloadTemplate() {
      if (this.filename !== '') {
        const filename = 'testTemplate.xlsx'
        // 全屏加载动画
        const loading = this.$loading({
          lock: true,
          text: '下载中,请稍后...',
          spinner: 'el-icon-loading',
          background: 'rgba(0, 0, 0, 0.7)'
        })
        downloadTemplate(filename).then(res => {
          loading.close() // 关闭加载动画
          const blob = new Blob([res.data])
          const downloadElement = document.createElement('a')
          const href = window.URL.createObjectURL(blob) // 创建下载的链接
          downloadElement.href = href
          downloadElement.download = filename // 下载后文件名
          document.body.appendChild(downloadElement)
          downloadElement.click() // 点击下载
          document.body.removeChild(downloadElement) // 下载完成移除元素
          window.URL.revokeObjectURL(href) // 释放blob对象
        }).catch((res) => {
          loading.close()
          this.$message.error('请求失败')
        })
      }
    }
  }
}
</script>
<style lang="scss" scoped>
  .test-link {
    width: 100%;
    height: 100%;
    padding-bottom: 20px;
    .title {
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      width: 100%;
      height: 100px;
      background: url('../../assets/img/bg.png') no-repeat center;
      background-size: 100% 100%;
      padding: 0 20px;
      .logo-text {
        display: flex;
        justify-content: center;
        align-items: center;
        font-size: 32px;
        color: #fff;
        letter-spacing: 8px;
        font-weight: 600;
        .logo {
          height: 50px;
          height: 50px;
          margin-right: 20px;
        }
      }
      .subhead {
        width: 100%;
        text-align: right;
        font-size: 22px;
        color: #fff;
        margin-right: 80px;
      }
    }
    .text {
      margin-right: 60px;
      text-align: left;
      font-size: 13px;
      padding: 20px;
      padding-bottom: 0;
    }
    .green {
      color: green;
    }
    .red {
      color: #d6000f;
    }
    .main {
      display: flex;
      justify-content: space-between;
      align-items: center;
      padding: 20px 20px 0 20px;

      .button-area {
        display: flex;
        flex-wrap: nowrap;
      }
    }
    .table-area {
      padding: 10px 20px;
    }
  }
</style>
<style lang="scss">
  .test-link {
    .el-button--primary {
      background-color: #169bd5;
    }
    .el-table th.el-table__cell {
      background-color: rgba(0, 150, 224, .1);
      color: #444c59;
      font-weight: 600;
    }
    .el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell {
      // background-color: rgba(0, 150, 224, .1);
    }
    .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
      background-color: #169bd5;
      border-color: #169bd5;
    }
    .el-table .cell {
      line-height: 16px;
    }
  }
</style>