Files
Message-Push-Nest/web/src/views/tabsTools/sendLogs/sendLogs.vue
T

218 lines
6.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div class="main-center-body">
<div class="container">
<div class="search-input-sendways">
<el-input v-model="search" size="small" placeholder="根据任务名字搜索相应日志" @change="filterFunc()" />
</div>
<div class="search-box">
<el-text class="refresh-time" v-if="refreshText" size="small">{{ refreshText }}</el-text>
<el-input-number class="refresh-box" v-model="refreshSec" size="small" :step="2" :min="5"
controls-position="right" />
<el-switch v-model="refreshSwitch" class="ml-2" width="80" inline-prompt active-text="自动刷新" inactive-text="自动刷新"
@click="clickFreshSwitch" />
</div>
<hr />
<div ref="refContainer">
<el-table :data="tableData" stripe empty-text="发信日志为空" :row-style="rowStyle()">
<el-table-column label="ID" prop="id" width="85px" />
<el-table-column label="任务名" prop="task_name" show-overflow-tooltip width="150px" />
<el-table-column label="发信日志" prop="log">
<template #default="scope">
<el-tooltip enterable placement="top">
<template #content>
<div v-html="formatLogDisplayHtml(scope)"></div>
</template>
<span class="log-overflow">{{ scope.row.log }}</span>
</el-tooltip>
</template>
</el-table-column>
<el-table-column label="发送时间" prop="created_on" width="160px" />
<el-table-column label="详情/状态" prop="status" width="120px" fixed="right">
<template #default="scope">
<el-button link size="small" style="margin-right: 10px;" type="primary"
@click="drawer = true; logText = formatLogDisplayHtml(scope)">日志</el-button>
<el-tag v-if="scope.row.status == 0" type="danger">失败</el-tag>
<el-tag v-if="scope.row.status == 1" type="success">成功</el-tag>
</template>
</el-table-column>
</el-table>
</div>
<el-drawer v-model="drawer" :with-header="false">
<el-text v-html="logText" size="small"></el-text>
</el-drawer>
<div class="pagination-block">
<el-pagination layout="prev, pager, next" :total="total" :page-size="pageSize" @current-change="handPageChange" />
<el-text class="total-tip" size="small">每页{{ pageSize }}{{ total }}</el-text>
</div>
</div>
</div>
</template>
<script >
import { reactive, toRefs, onMounted, watch, ref } from 'vue'
import { request } from '../../../api/api'
import { copyToClipboard } from '../../../util/clipboard.js';
import { useRoute } from 'vue-router';
import { CONSTANT } from '@/constant'
import { usePageState } from '@/store/page_sate.js';
import { CommonUtils } from "@/util/commonUtils.js";
export default {
components: {
},
setup() {
const pageState = usePageState();
const router = useRoute();
const state = reactive({
search: '',
refreshText: '',
refreshSwitch: false,
refreshSec: 20,
refreshIntervalFuncList: [],
optionValue: '',
logText: '',
drawer: false,
tableData: [],
total: CONSTANT.TOTAL,
pageSize: pageState.siteConfigData.pagesize,
currPage: CONSTANT.PAGE,
});
const handleDelete = async (index, row) => {
const rsp = await request.post('/sendways/delete', { id: row.id });
if (rsp.status == 200) {
state.tableData.splice(index, 1);
}
}
const TransHtml = (raw) => {
if (raw) {
return raw.replace(/\n/g, '<br />')
}
return ''
}
const formatLogDisplayHtml = (scope) => {
let log = TransHtml(scope.row.log);
log += '<br />\n';
if (scope.row.caller_ip) {
log += `调用来源IP${scope.row.caller_ip}`;
};
return log;
}
const handPageChange = async (pageNum) => {
state.currPage = pageNum;
await queryListData(pageNum, state.pageSize);
}
const rowStyle = () => {
return {
'font-size': '13px',
}
}
const clickFreshSwitch = () => {
if (state.refreshSwitch) {
let flag = setInterval(async function () {
await filterFunc();
state.refreshText = `自动刷新于:${CommonUtils.getCurrentTimeStr()}`;
}, state.refreshSec * 1000);
state.refreshIntervalFuncList.push(flag);
} else {
state.refreshIntervalFuncList.forEach(intervalId => {
clearInterval(intervalId);
});
state.refreshIntervalFuncList = [];
state.refreshText = '';
}
}
const filterFunc = async () => {
await queryListData(state.currPage, state.pageSize, state.search, state.optionValue);
}
const queryListData = async (page, size, name = '', taskid = '', query = '') => {
let params = { page: page, size: size, name: name, taskid: taskid, query: query };
const rsp = await request.get('/sendlogs/list', { params: params });
state.tableData = await rsp.data.data.lists;
state.total = await rsp.data.data.total;
}
onMounted(async () => {
state.search = router.query.name;
await queryListData(1, state.pageSize, router.query.name, router.query.taskid, router.query.query);
});
return {
...toRefs(state), handleDelete, TransHtml, clickFreshSwitch,
rowStyle, handPageChange, filterFunc, copyToClipboard, formatLogDisplayHtml
};
}
}
</script>
<style scoped>
hr {
color: #FAFCFF;
background-color: #FAFCFF;
border-color: #FAFCFF;
}
.container {
background-color: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);
max-width: 1000px;
width: 100%;
margin-top: -10vh;
}
.search-box {
float: right;
margin-top: -2px;
}
.refresh-box {
width: 80px;
margin-right: 5px;
}
.refresh-time {
margin-right: 10px;
}
.pagination-block {
margin-top: 30px;
display: flex;
justify-content: flex-end;
}
.total-tip {
display: inline-block;
}
.search-input-sendways {
width: 200px;
display: inline-flex;
}
.log-overflow {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
}
</style>