<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>