123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- <template>
- <div>
- <div class="content-box chatdoom page">
- <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
- <!-- 日志列表 -->
- <el-tab-pane label="服务日志" name="1">
- <el-card shadow="hover">
- <el-table ref="table" :data="tableData" style="width: 100%" row-key="id" v-loading="loading">
- <el-table-column prop="name" label="文件名" show-overflow-tooltip></el-table-column>
- <el-table-column prop="size" label="大小" show-overflow-tooltip></el-table-column>
- <el-table-column prop="changeAt" label="修改时间" min-width="100" align="center"></el-table-column>
- <el-table-column label="操作" width="200" align="center">
- <template #default="scope">
- <el-button size="small" text type="primary" v-if="!scope.row.folderName"
- @click="view(scope.row)">详情
- </el-button>
- <el-button size="small" text type="warning" v-auth="'download'" @click="down(scope.row)">下载</el-button>
- <el-button size="small" text type="info" v-auth="'del'" @click="onRowDel(scope.row)">删除</el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
- <el-dialog header="123" v-model="dialogVisible" title="查看详情">
- <div v-for="line in topMsg" :key="line" class="error-line">{{ line }}</div>
- <div v-for="line in errorMessage" :key="line" class="error-line">{{ line }}</div>
- </el-dialog>
- </el-tab-pane>
- <!-- 数据库日志 -->
- <el-tab-pane label="数据库日志" name="2">
- <el-card shadow="hover">
- <el-table :data="tableData" style="width: 100%" row-key="id" v-loading="loading">
- <el-table-column prop="name" label="文件名" show-overflow-tooltip></el-table-column>
- <el-table-column prop="size" label="大小" show-overflow-tooltip></el-table-column>
- <el-table-column prop="changeAt" label="修改时间" min-width="100" align="center"></el-table-column>
- <el-table-column label="操作" width="200" align="center">
- <template #default="scope">
- <el-button size="small" text type="primary" v-if="!scope.row.folderName"
- @click="view(scope.row)">详情
- </el-button>
- <el-button size="small" text type="warning" v-auth="'download'" @click="down(scope.row)">下载</el-button>
- <el-button size="small" text type="info" v-auth="'del'" @click="onRowDel(scope.row)">删除</el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
- <el-dialog v-model="dialogVisible" title="查看详情">
- <div v-for="line in topMsg" :key="line" class="error-line">{{ line }}</div>
- <div v-for="line in errorMessage" :key="line" class="error-line">{{ line }}</div>
- </el-dialog>
- </el-tab-pane>
- <!-- 运行日志 -->
- <el-tab-pane label="运行日志" name="3" class="runMessage">
- <!-- 运行日志 -->
- <div v-for="line in topMsg" :key="line" class="error-line">{{ line }}</div>
- <div v-if="runButtonShow" v-loading="runLoading" v-for="line in runMessage" :key="line" class="error-line">{{ line }}</div>
- <div v-else class="error-line">暂无数据</div>
- <div class="run-button" v-if="runButtonShow">
- <el-button size="small" text type="warning" v-auth="'download'" @click="down">下载</el-button>
- <el-button size="small" text type="danger" v-auth="'del'" @click="onRowDel">删除</el-button>
- </div>
- </el-tab-pane>
- </el-tabs>
- </div>
- </div>
- </template>
- <script lang="ts" setup>
- import api from '/@/api/system';
- import {useSearch} from '/@/hooks/useCommon';
- import getOrigin from '/@/utils/origin'
- import downloadFile from '/@/utils/download';
- import {ref, getCurrentInstance, nextTick, onMounted} from 'vue';
- import {ElMessage, ElMessageBox} from "element-plus";
- const dialogVisible = ref(false);
- const errorMessage = ref([]);
- const runMessage = ref([]);
- const topMsg = ref([]);
- const activeName = '1';
- const types = ref('service');
- const runLoading = ref(false);
- const { proxy } = getCurrentInstance() as any;
- const isScrolling = ref(false);
- const chatContent: any = ref(null);
- const runButtonShow = ref(false);
- const runLogName = ref('');
- const {params, tableData, getList, loading} = useSearch<any[]>(api.lastLinesLog.getList, 'list', {types: types.value});
- getList();
- onMounted(() => {
- chatContent.value = document.getElementsByClassName('chatdoom')[0]
- scrollBottom()
- })
- const scrollBottom = () => {
- nextTick(() => {
- //注意要使用nextick以免获取不到dom
- if (!isScrolling.value) {
- // chatContent.value.scrollTop = chatContent.value.scrollHeight - chatContent.value.offsetHeight
- chatContent.value.scrollTop = chatContent.value.offsetHeight
- console.log(chatContent.value.scrollTop);
- }
- })
- }
- const view = (row: any) => {
- if (types.value == 'run') {
- row.name = row.value;
- }
- const es = new EventSource(getOrigin(import.meta.env.VITE_SERVER_URL + "/subscribe/logInfo?name=" + row.name + '&types=' + types.value));
- es.addEventListener('log', ({data}) => {
- topMsg.value.unshift(data);
- });
- api.lastLinesLog.detail({name: row.name, types: types.value}).then((res: any) => {
- if (types.value == 'run') {
- runMessage.value = res.list;
- runLoading.value = false;
- if (res.list.length > 0) {
- runButtonShow.value = true;
- }
- } else {
- errorMessage.value = res.list;
- dialogVisible.value = true;
- }
- });
- };
- const down = (row: any) => {
- if (types.value == 'run') {
- row.name = runLogName.value
- }
- api.lastLinesLog.down({name: row.name, types: types.value}).then((res: any) => downloadFile(res, types.value +"-"+ row.name))
- };
- const onRowDel = (row: any) => {
- if (types.value == 'run') {
- row.name = runLogName.value
- }
- let msg = '你确定要删除所选数据?';
- ElMessageBox.confirm(msg, '提示', {
- confirmButtonText: '确认',
- cancelButtonText: '取消',
- type: 'warning',
- }).then(() => {
- api.lastLinesLog.delete({name: row.name, types: types.value}).then(() => {
- params.types = types.value;
- if (types.value == 'run') {
- runButtonShow.value = false;
- } else {
- getList()
- }
- ElMessage.success('删除成功');
- });
- }).catch(() => { });
- };
- // 切换tab
- const handleClick = (tab: any, event: Event) => {
- if (tab.props.name == 1) {
- types.value = 'service';
- // 获取日志列表
- params.types = types.value;
- getList()
- } else if (tab.props.name == 2) {
- types.value = 'sql'
- params.types = types.value;
- getList();
- } else if (tab.props.name == 3) {
- runLoading.value = true;
- types.value = 'run'
- runLogName.value = 'sagoo-admin.log'
- params.type = types.value
- view(runLogName)
- }
- }
- </script>
- <style scoped>
- .run-button {
- position: fixed;
- bottom: 50px;
- right: 80px;
- }
- .runMessage {
- height: 500px;
- }
- .content-box {
- width: 100%;
- padding: 5px 20px 20px 20px;
- }
- .error-line {
- white-space: pre-line; /* 保留换行符 */
- }
- .el-tabs--card {
- height: calc(100vh - 110px);
- overflow-y: auto;
- }
- .el-tab-pane {
- position: relative;
- height: calc(100vh - 110px);
- overflow-y: auto;
- }
- </style>
|