375 lines
12 KiB
Cheetah
375 lines
12 KiB
Cheetah
|
<!doctype html>
|
|||
|
<html lang="zh-CN">
|
|||
|
<head>
|
|||
|
<meta charset="UTF-8">
|
|||
|
<meta name="viewport"
|
|||
|
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
|
|||
|
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
|||
|
<title>Title</title>
|
|||
|
|
|||
|
{{/* <script src="/resource/js/default-passive-events-index.umd.js"></script>*/}}
|
|||
|
|
|||
|
<link rel="stylesheet" href="/resource/css/element-index.css"/>
|
|||
|
|
|||
|
|
|||
|
<!-- Import component library -->
|
|||
|
<script src="/resource/js/vue.global.js"></script>
|
|||
|
|
|||
|
<script src="/resource/js/element-index.full.js"></script>
|
|||
|
<script src="/resource/js/element-zh-cn.js"></script>
|
|||
|
|
|||
|
<link rel="stylesheet" href="/resource/css/vxe-style.css">
|
|||
|
<script src="/resource/js/xe-utils.js"></script>
|
|||
|
<script src="/resource/js/vxe-table.js"></script>
|
|||
|
|
|||
|
|
|||
|
<style>
|
|||
|
#app {
|
|||
|
width: 90%;
|
|||
|
margin: 0 auto;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
</style>
|
|||
|
</head>
|
|||
|
<body>
|
|||
|
|
|||
|
<div id="app">
|
|||
|
<div class="header">
|
|||
|
<el-form :inline="true" :model="form" class="demo-form-inline">
|
|||
|
<el-form-item label="时间范围" style="width: 350px">
|
|||
|
<el-date-picker
|
|||
|
v-model="form.date"
|
|||
|
type="daterange"
|
|||
|
start-placeholder="Start date"
|
|||
|
end-placeholder="End date"
|
|||
|
format="YYYY-MM-DD"
|
|||
|
date-format="YYYY-MM-DD"
|
|||
|
value-format="YYYY-MM-DD"
|
|||
|
:clearable="false"
|
|||
|
/>
|
|||
|
</el-form-item>
|
|||
|
|
|||
|
<el-form-item label="管理员">
|
|||
|
<el-select v-model="form.admin_name" placeholder="选择" clearable>
|
|||
|
<el-option v-for="item in selectInfo.adminNameList" :label="item.AdminName"
|
|||
|
:value="item.AdminName"/>
|
|||
|
</el-select>
|
|||
|
</el-form-item>
|
|||
|
|
|||
|
|
|||
|
<el-form-item label="sql信息" style="width: 500px">
|
|||
|
<el-input v-model="form.query_info" placeholder="sql信息" clearable/>
|
|||
|
</el-form-item>
|
|||
|
|
|||
|
|
|||
|
</el-form>
|
|||
|
|
|||
|
<div>
|
|||
|
<el-button type="primary" @click="listSqlQueryLog">查询</el-button>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
|
|||
|
<div>
|
|||
|
|
|||
|
<div style="margin-top: 15px; height: 750px">
|
|||
|
<vxe-table
|
|||
|
height="100%"
|
|||
|
stripe
|
|||
|
:data="tableData"
|
|||
|
:column-config="{resizable: true}"
|
|||
|
>
|
|||
|
<vxe-column width="80" field="Id" title="ID" show-overflow></vxe-column>
|
|||
|
<vxe-column width="200" field="QueryTime" title="调用时间" show-overflow></vxe-column>
|
|||
|
<vxe-column width="130" field="Ip" title="IP" show-overflow></vxe-column>
|
|||
|
<vxe-column width="100" field="AdminName" title="账号" show-overflow></vxe-column>
|
|||
|
<vxe-column width="100" field="AdminRealName" title="姓名" show-overflow></vxe-column>
|
|||
|
<vxe-column width="100" field="Project" title="项目" show-overflow></vxe-column>
|
|||
|
<vxe-column width="200" field="RequestPath" title="接口地址" show-overflow></vxe-column>
|
|||
|
<vxe-column width="200" field="MenuName" title="接口名称" show-overflow></vxe-column>
|
|||
|
<vxe-column field="CallInfo" title="调用路径" show-overflow></vxe-column>
|
|||
|
|
|||
|
<vxe-column width="200" field="Query" title="SQL" show-overflow>
|
|||
|
<template #default="{ row }">
|
|||
|
<span style="cursor: pointer" @click="copText(row.Query)">${ row.Query }$</span>
|
|||
|
</template>
|
|||
|
</vxe-column>
|
|||
|
|
|||
|
<vxe-column width="100" field="" title="操作">
|
|||
|
<template #default="{ row }">
|
|||
|
<el-button size="small" type="success" @click="showQuerySql(row)">查看</el-button>
|
|||
|
</template>
|
|||
|
</vxe-column>
|
|||
|
|
|||
|
|
|||
|
</vxe-table>
|
|||
|
</div>
|
|||
|
|
|||
|
|
|||
|
<div style="margin-top: 15px; width: 100%; display: flex; justify-content: center">
|
|||
|
<el-pagination
|
|||
|
background
|
|||
|
:total="pageInfo.totalCount"
|
|||
|
v-model:current-page="pageInfo.currentPage"
|
|||
|
v-model:page-size="pageInfo.pageSize"
|
|||
|
layout="prev, slot, next, sizes"
|
|||
|
@size-change="listSqlQueryLog(true)"
|
|||
|
@current-change="listSqlQueryLog(false)"
|
|||
|
:page-sizes="[200, 600, 1000]"
|
|||
|
>
|
|||
|
<template #default>
|
|||
|
<ul class="el-pager">
|
|||
|
<li class="is-active number">${ pageInfo.currentPage }$</li>
|
|||
|
</ul>
|
|||
|
</template>
|
|||
|
|
|||
|
</el-pagination>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
|
|||
|
<el-dialog
|
|||
|
v-model="dialogVisible"
|
|||
|
title="Title"
|
|||
|
width="30%"
|
|||
|
>
|
|||
|
<div>
|
|||
|
<el-input
|
|||
|
v-model="dialogRow.Query"
|
|||
|
rows="20"
|
|||
|
type="textarea"
|
|||
|
placeholder="Please input"
|
|||
|
/>
|
|||
|
</div>
|
|||
|
<template #footer>
|
|||
|
<el-button type="primary" @click="dialogRow = {}; dialogVisible = false">确定</el-button>
|
|||
|
</template>
|
|||
|
|
|||
|
</el-dialog>
|
|||
|
|
|||
|
</div>
|
|||
|
|
|||
|
<script>
|
|||
|
|
|||
|
function getDate(diff) {
|
|||
|
let date = new Date(); // 当前日期和时间
|
|||
|
|
|||
|
date.setDate(date.getDate() + diff)
|
|||
|
|
|||
|
const year = date.getFullYear();
|
|||
|
const month = (date.getMonth() + 1).toString().padStart(2, '0'); // 月份从0开始,需要加1,并确保是两位数
|
|||
|
const day = date.getDate().toString().padStart(2, '0'); // 确保是两位数的日期
|
|||
|
|
|||
|
return `${year}-${month}-${day}`;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
const {createApp, ref, reactive, toRefs, toRef} = Vue
|
|||
|
|
|||
|
|
|||
|
console.log(getDate(5))
|
|||
|
|
|||
|
|
|||
|
const vm = createApp({
|
|||
|
delimiters: ['${', '}$'],
|
|||
|
setup() {
|
|||
|
const data = reactive({
|
|||
|
mailMessage: "",
|
|||
|
form: {
|
|||
|
game_id: "",
|
|||
|
query_info: "",
|
|||
|
date: [getDate(-15), getDate(0)],
|
|||
|
admin_name: "",
|
|||
|
},
|
|||
|
tableData: [],
|
|||
|
pageInfo: {
|
|||
|
currentPage: 1,
|
|||
|
pageSize: 200,
|
|||
|
},
|
|||
|
dialogVisible: false,
|
|||
|
dialogRow: {},
|
|||
|
selectInfo: {
|
|||
|
adminNameList: []
|
|||
|
}
|
|||
|
|
|||
|
})
|
|||
|
|
|||
|
|
|||
|
setTimeout(() => {
|
|||
|
listSqlQueryLog()
|
|||
|
selectInfo()
|
|||
|
})
|
|||
|
|
|||
|
const resetPageInfo = () => {
|
|||
|
data.pageInfo.currentPage = 1
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
const selectInfo = () => {
|
|||
|
let loading = ElementPlus.ElLoading.service({
|
|||
|
fullscreen: true,
|
|||
|
lock: true
|
|||
|
})
|
|||
|
|
|||
|
fetch("/SelectInfo", {
|
|||
|
method: 'POST', // 或 'POST'、'PUT' 等
|
|||
|
})
|
|||
|
.then(response => {
|
|||
|
// 检查请求是否成功(状态码为 200 到 299)
|
|||
|
if (!response.ok) {
|
|||
|
throw new Error(`HTTP error! Status: ${response.status}`);
|
|||
|
}
|
|||
|
// 将响应解析为 JSON
|
|||
|
return response.json();
|
|||
|
})
|
|||
|
.then(res => {
|
|||
|
// 处理返回的 JSON 数据
|
|||
|
if (res.Code != 0) {
|
|||
|
console.log(res);
|
|||
|
ElementPlus.ElMessage.error(res.Message)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
data.selectInfo.adminNameList = res.Data.AdminNameList
|
|||
|
|
|||
|
|
|||
|
})
|
|||
|
.catch(error => {
|
|||
|
// 处理错误
|
|||
|
console.error('Fetch error:', error);
|
|||
|
alert(error)
|
|||
|
}).finally(
|
|||
|
() => {
|
|||
|
loading.close()
|
|||
|
})
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
const copText = (text) => {
|
|||
|
var textToCopy = text;
|
|||
|
var textArea = document.createElement("textarea");
|
|||
|
textArea.value = textToCopy;
|
|||
|
document.body.appendChild(textArea);
|
|||
|
textArea.select();
|
|||
|
|
|||
|
try {
|
|||
|
document.execCommand('copy');
|
|||
|
console.log('Text copied to clipboard');
|
|||
|
ElementPlus.ElMessage.success("复制成功")
|
|||
|
} catch (err) {
|
|||
|
console.error('Unable to copy text', err);
|
|||
|
}
|
|||
|
|
|||
|
document.body.removeChild(textArea);
|
|||
|
|
|||
|
// navigator.clipboard.writeText(text)
|
|||
|
// .then(function () {
|
|||
|
// ElementPlus.ElMessage.success("复制成功")
|
|||
|
// })
|
|||
|
// .catch(function (err) {
|
|||
|
// console.error('复制失败', err);
|
|||
|
// ElementPlus.ElMessage.error("复制失败")
|
|||
|
// });
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
const showQuerySql = (row) => {
|
|||
|
console.log(row)
|
|||
|
data.dialogRow = JSON.parse(JSON.stringify(row))
|
|||
|
data.dialogVisible = true
|
|||
|
}
|
|||
|
|
|||
|
const listSqlQueryLog = (reset) => {
|
|||
|
if (reset === true) {
|
|||
|
resetPageInfo()
|
|||
|
}
|
|||
|
|
|||
|
let loading = ElementPlus.ElLoading.service({
|
|||
|
fullscreen: true,
|
|||
|
lock: true
|
|||
|
})
|
|||
|
|
|||
|
// console.log(data.form)
|
|||
|
// return
|
|||
|
let req = {
|
|||
|
start_date: "",
|
|||
|
end_date: "",
|
|||
|
// game_id: (/^\d+$/).test(data.form.game_id) ? Number(data.form.game_id) : -1,
|
|||
|
query_info: data.form.query_info,
|
|||
|
page: data.pageInfo.currentPage,
|
|||
|
limit: data.pageInfo.pageSize,
|
|||
|
admin_name: data.form.admin_name,
|
|||
|
}
|
|||
|
|
|||
|
if (data.form.date) {
|
|||
|
req.start_date = data.form.date[0]
|
|||
|
req.end_date = data.form.date[1]
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
const requestOptions = {
|
|||
|
method: 'POST', // 或 'POST'、'PUT' 等
|
|||
|
headers: {
|
|||
|
'Content-Type': 'application/json', // 指定请求类型为 JSON
|
|||
|
// 可以添加其他请求头,比如认证信息等
|
|||
|
},
|
|||
|
// 如果是 POST 或 PUT 请求,可以在 body 中添加请求数据
|
|||
|
|
|||
|
|
|||
|
body: JSON.stringify(req)
|
|||
|
};
|
|||
|
|
|||
|
// 使用 fetch 发起请求
|
|||
|
fetch("/ListSqlQueryLog", requestOptions)
|
|||
|
.then(response => {
|
|||
|
// 检查请求是否成功(状态码为 200 到 299)
|
|||
|
if (!response.ok) {
|
|||
|
throw new Error(`HTTP error! Status: ${response.status}`);
|
|||
|
}
|
|||
|
// 将响应解析为 JSON
|
|||
|
return response.json();
|
|||
|
})
|
|||
|
.then(res => {
|
|||
|
// 处理返回的 JSON 数据
|
|||
|
if (res.Code != 0) {
|
|||
|
console.log(res);
|
|||
|
alert(res.Message)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
data.tableData = res.Data.List
|
|||
|
data.pageInfo.totalCount = res.Data.TotalCount
|
|||
|
|
|||
|
|
|||
|
})
|
|||
|
.catch(error => {
|
|||
|
// 处理错误
|
|||
|
console.error('Fetch error:', error);
|
|||
|
alert(error)
|
|||
|
}).finally(
|
|||
|
() => {
|
|||
|
loading.close()
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
return {
|
|||
|
...toRefs(data),
|
|||
|
listSqlQueryLog, showQuerySql, copText
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
})
|
|||
|
|
|||
|
|
|||
|
vm.use(ElementPlus, {locale: ElementPlusLocaleZhCn})
|
|||
|
vm.use(VXETable)
|
|||
|
vm.mount("#app")
|
|||
|
</script>
|
|||
|
|
|||
|
</body>
|
|||
|
</html>
|