<script lang="ts" setup name="LoginLog"> import { reactive, ref } from 'vue' import { ElLoading, ElMessage, ElMessageBox } from 'element-plus' import { Delete, Download } from '@element-plus/icons-vue' import type { IlistQuery } from './log-interface' import { delLoginLog, getLoginLogList, loginExport } from '@/api/system/log' import { exportFile } from '@/utils/exportUtils' import { getDictByCode } from '@/api/system/dict' const { proxy } = getCurrentInstance() as any const listQuery: IlistQuery = reactive({ keywords: '', // 用户姓名 ip: '', // ip地址 beginTime: '', endTime: '', offset: 1, limit: 20, sort: '', order: '', }) const timeRange = ref([]) const columns = [ { text: '日志名称', value: 'logName', width: 150, }, { text: '用户姓名', value: 'userName', }, { text: '登录ip', value: 'ip', }, // { // text: '操作成功与否', // value: 'succeed', // }, { text: '操作时间', value: 'createTime', }, ] const list = ref([]) const total = ref(20) const logTypeList = ref(null) const listLoading = ref(true) const dialogFormVisible = ref(false) const dialogStatus = ref('') // 获取日志数据 const fetchData = (isNowPage = true) => { listLoading.value = true if (!isNowPage) { // 是否显示当前页,否则跳转第一页 listQuery.offset = 1 } getLoginLogList(listQuery).then((response) => { list.value = response.data.rows total.value = parseInt(response.data.total) listLoading.value = false }) } fetchData() // 打开详情对话框 const detail = (row: any) => { ElMessageBox.alert(row.message, '详情', { confirmButtonText: '确定', }) } // 清空日志 const cleanAll = () => { ElMessageBox.confirm('确定要清空全部日志吗?', '确认操作', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning', }).then(() => { delLoginLog().then((response) => { if (response.code === 200) { ElMessage({ message: '删除成功', type: 'success', }) list.value = [] total.value = 0 // this.fetchData() } }) }) } // 查询数据 const search = () => { fetchData(false) } // 页数发生变化后的操作,可能是页码变化,可能是每页容量变化,此函数必写 const changePage = (val: { size: number; page: number }) => { if (val && val.size) { listQuery.limit = val.size } if (val && val.page) { listQuery.offset = val.page } fetchData() } // 导出 const exportExcelBtn = () => { const loading = ElLoading.service({ lock: true, text: '下载中请稍后', background: 'rgba(255, 255, 255, 0.8)', }) if (list.value.length > 0) { const params = { ...listQuery, limit: 999999, offset: 1, } loginExport(params).then((res: any) => { exportFile(res.data, '登录日志') loading.close() }) .catch((_) => { loading.close() }) } else { ElMessage.warning('无数据可导出数据') } loading.close() } // 时间变更 watch(timeRange, (val) => { if (val) { listQuery.beginTime = `${val[0]}` listQuery.endTime = `${val[1]}` } else { listQuery.beginTime = '' listQuery.endTime = '' } }) </script> <template> <div class="list-login-log"> <app-container> <!-- 筛选条件 --> <search-area @search="search"> <search-item> <el-input v-model.trim="listQuery.keywords" placeholder="用户姓名" clearable /> </search-item> <search-item> <el-input v-model.trim="listQuery.ip" placeholder="登录ip" clearable /> </search-item> <search-item> <el-date-picker v-model="timeRange" range-separator="至" type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss" start-placeholder="开始时间" end-placeholder="结束时间" /> </search-item> <template #btns> <!-- <el-button v-if="proxy.hasPerm('/sys/loginLog/delLoginLog')" class="search-btn" type="info" :icon="Delete" @click="cleanAll" > 清空日志 </el-button> --> <el-button class="search-btn" type="info" :icon="Download" @click="exportExcelBtn"> 导出日志 </el-button> </template> </search-area> <table-container> <!-- 查询结果Table显示 --> <normal-table :data="list" :total="total" :columns="columns" :query="listQuery" :list-loading="listLoading" @change="changePage" > <template #columns> <el-table-column label="操作结果" width="100" align="center"> <template #default="scope"> <el-button v-if="scope.row.succeed === '成功'" type="success" plain size="small" disabled> {{ scope.row.succeed }} </el-button> <el-button v-else type="info" plain disabled> {{ scope.row.succeed }} </el-button> </template> </el-table-column> </template> </normal-table> </table-container> </app-container> </div> </template>