Files
as-partner-frontend/src/views/modules/sys/audit-log.vue
2026-07-26 12:54:46 +08:00

212 lines
5.9 KiB
Vue
Executable File
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="mod-audit-log">
<el-form :inline="true" :model="dataForm" @keyup.enter="getDataList()">
<el-form-item label="操作者">
<el-input v-model="dataForm.actorName" placeholder="按用户名模糊" clearable style="width: 180px"></el-input>
</el-form-item>
<el-form-item label="操作行为">
<el-input v-model="dataForm.head" placeholder="按操作行为模糊" clearable style="width: 200px"></el-input>
</el-form-item>
<el-form-item label="接口">
<el-input v-model="dataForm.api" placeholder="类#方法 等" clearable style="width: 220px"></el-input>
</el-form-item>
<el-form-item label="创建时间">
<el-date-picker
v-model="createdAtRange"
type="datetimerange"
range-separator="至"
start-placeholder="开始时间"
end-placeholder="结束时间"
value-format="YYYY-MM-DD HH:mm:ss"
clearable
style="width: 360px"
/>
</el-form-item>
<el-form-item>
<el-button @click="getDataList()">查询</el-button>
</el-form-item>
</el-form>
<div class="table-page-wrap">
<el-table
:data="dataList"
border
v-loading="dataListLoading"
style="width: 100%">
<el-table-column
prop="id"
header-align="center"
align="center"
width="80"
label="ID">
</el-table-column>
<el-table-column
prop="name"
header-align="center"
align="center"
width="100"
label="操作者">
</el-table-column>
<el-table-column
prop="head"
header-align="center"
align="center"
min-width="160"
:show-overflow-tooltip="true"
label="操作行为">
</el-table-column>
<el-table-column
prop="createdAt"
header-align="center"
align="center"
width="170"
label="创建时间">
</el-table-column>
<el-table-column
prop="api"
header-align="center"
align="center"
min-width="200"
:show-overflow-tooltip="true"
label="接口">
</el-table-column>
<el-table-column
prop="param"
header-align="center"
align="left"
min-width="200"
:show-overflow-tooltip="true"
label="参数">
</el-table-column>
<el-table-column
prop="paramDesc"
header-align="center"
align="left"
min-width="200"
:show-overflow-tooltip="true"
label="参数描述">
</el-table-column>
<el-table-column
prop="result"
header-align="center"
align="center"
width="100"
:show-overflow-tooltip="true"
label="结果">
</el-table-column>
<el-table-column
prop="ip"
header-align="center"
align="center"
width="150"
:show-overflow-tooltip="true"
label="IP">
</el-table-column>
<el-table-column
prop="deviceInfo"
header-align="center"
align="left"
min-width="180"
:show-overflow-tooltip="true"
label="客户端">
</el-table-column>
</el-table>
<el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
:total="totalPage"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
</div>
</div>
</template>
<script setup lang="ts">
import { reactive, ref, onMounted } from 'vue'
import { getAuditLogList } from '@/api/sys'
import type { AuditLogInfo } from '@/api/sys'
import type { PageParams, PageResult } from '@/types/api'
interface DataForm {
actorName: string
head: string
api: string
}
/** 列表接口可能返回根级 page,或包在 data / data.page 下 */
type AuditListResponsePayload = {
data?: { page?: PageResult<AuditLogInfo> } & Partial<PageResult<AuditLogInfo>>
page?: PageResult<AuditLogInfo>
}
const dataForm = reactive<DataForm>({
actorName: '',
head: '',
api: ''
})
const createdAtRange = ref<[string, string] | null>(null)
const dataList = ref<AuditLogInfo[]>([])
const pageIndex = ref<number>(1)
const pageSize = ref<number>(10)
const totalPage = ref<number>(0)
const dataListLoading = ref<boolean>(false)
function buildListParams (): PageParams {
const p: PageParams = { page: pageIndex.value, limit: pageSize.value }
const t = (s: string | null | undefined): string => (s != null && String(s).trim() !== '' ? String(s).trim() : '')
const actor = t(dataForm.actorName)
if (actor) p.actorName = actor
const head = t(dataForm.head)
if (head) p.head = head
const api = t(dataForm.api)
if (api) p.api = api
const r = createdAtRange.value
if (Array.isArray(r) && r.length === 2 && r[0] && r[1]) {
p.beginTime = r[0]
p.endTime = r[1]
}
return p
}
function getDataList (): void {
dataListLoading.value = true
getAuditLogList(buildListParams()).then((data) => {
if (data && data.code === 0) {
// 兼容:{ code, page };或 { code, data: { page } };或 data 本体即分页字段
const raw = data as AuditListResponsePayload
const page = raw.data?.page ?? raw.page ?? raw.data
if (page && (Array.isArray(page.list) || page.totalCount != null)) {
dataList.value = page.list || []
totalPage.value = page.totalCount || 0
} else {
dataList.value = []
totalPage.value = 0
}
} else {
dataList.value = []
totalPage.value = 0
}
dataListLoading.value = false
})
}
function sizeChangeHandle (val: number): void {
pageSize.value = val
pageIndex.value = 1
getDataList()
}
function currentChangeHandle (val: number): void {
pageIndex.value = val
getDataList()
}
onMounted(() => {
getDataList()
})
</script>