完善新操作日志的页面修改
parent
2fccaa2b9a
commit
1768d27e11
@ -1,35 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<parent>
|
|
||||||
<artifactId>ruoyi</artifactId>
|
|
||||||
<groupId>com.ruoyi</groupId>
|
|
||||||
<version>3.3.0</version>
|
|
||||||
</parent>
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<artifactId>ruoyi-common</artifactId>
|
|
||||||
|
|
||||||
<description>
|
|
||||||
common通用工具
|
|
||||||
</description>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
|
|
||||||
<!-- yml解析器 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.yaml</groupId>
|
|
||||||
<artifactId>snakeyaml</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- 解析客户端操作系统、浏览器等 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>eu.bitwalker</groupId>
|
|
||||||
<artifactId>UserAgentUtils</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</project>
|
|
||||||
@ -1,41 +0,0 @@
|
|||||||
package com.ruoyi.common.annotation;
|
|
||||||
|
|
||||||
import java.lang.annotation.Documented;
|
|
||||||
import java.lang.annotation.ElementType;
|
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
import java.lang.annotation.Target;
|
|
||||||
import com.ruoyi.common.enums.BusinessType;
|
|
||||||
import com.ruoyi.common.enums.OperatorType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 自定义操作日志记录注解
|
|
||||||
*
|
|
||||||
* @author ruoyi
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@Target({ ElementType.PARAMETER, ElementType.METHOD })
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
|
||||||
@Documented
|
|
||||||
public @interface Log
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* 模块
|
|
||||||
*/
|
|
||||||
public String title() default "";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 功能
|
|
||||||
*/
|
|
||||||
public BusinessType businessType() default BusinessType.OTHER;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 操作人类别
|
|
||||||
*/
|
|
||||||
public OperatorType operatorType() default OperatorType.MANAGE;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否保存请求的参数
|
|
||||||
*/
|
|
||||||
public boolean isSaveRequestData() default true;
|
|
||||||
}
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
package com.ruoyi.framework.config;
|
|
||||||
|
|
||||||
import java.util.TimeZone;
|
|
||||||
|
|
||||||
import org.mybatis.spring.annotation.MapperScan;
|
|
||||||
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
import org.springframework.context.annotation.EnableAspectJAutoProxy;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 程序注解配置
|
|
||||||
*
|
|
||||||
* @author ruoyi
|
|
||||||
*/
|
|
||||||
@Configuration
|
|
||||||
// 表示通过aop框架暴露该代理对象,AopContext能够访问
|
|
||||||
@EnableAspectJAutoProxy(exposeProxy = true)
|
|
||||||
// 指定要扫描的Mapper类的包的路径
|
|
||||||
@MapperScan("com.ruoyi.**.mapper")
|
|
||||||
public class ApplicationConfig {
|
|
||||||
/**
|
|
||||||
* 时区配置
|
|
||||||
*/
|
|
||||||
@Bean
|
|
||||||
public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() {
|
|
||||||
return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,35 +0,0 @@
|
|||||||
import request from '@/utils/request'
|
|
||||||
|
|
||||||
// 查询操作日志列表
|
|
||||||
export function list(query) {
|
|
||||||
return request({
|
|
||||||
url: '/monitor/operlog/list',
|
|
||||||
method: 'get',
|
|
||||||
params: query
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 删除操作日志
|
|
||||||
export function delOperlog(operId) {
|
|
||||||
return request({
|
|
||||||
url: '/monitor/operlog/' + operId,
|
|
||||||
method: 'delete'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 清空操作日志
|
|
||||||
export function cleanOperlog() {
|
|
||||||
return request({
|
|
||||||
url: '/monitor/operlog/clean',
|
|
||||||
method: 'delete'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 导出操作日志
|
|
||||||
export function exportOperlog(query) {
|
|
||||||
return request({
|
|
||||||
url: '/monitor/operlog/export',
|
|
||||||
method: 'get',
|
|
||||||
params: query
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询操作日志列表
|
||||||
|
export function listOperateLog(query) {
|
||||||
|
return request({
|
||||||
|
url: '/system/operate-log/page',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 导出操作日志
|
||||||
|
export function exportOperateLog(query) {
|
||||||
|
return request({
|
||||||
|
url: '/system/operate-log/export',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
@ -1,318 +1,275 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
<el-form-item label="系统模块" prop="title">
|
<el-form-item label="系统模块" prop="title">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.title"
|
v-model="queryParams.title"
|
||||||
placeholder="请输入系统模块"
|
placeholder="请输入系统模块"
|
||||||
clearable
|
clearable
|
||||||
style="width: 240px;"
|
style="width: 240px;"
|
||||||
size="small"
|
size="small"
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="操作人员" prop="operName">
|
<el-form-item label="操作人员" prop="operName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.operName"
|
v-model="queryParams.operName"
|
||||||
placeholder="请输入操作人员"
|
placeholder="请输入操作人员"
|
||||||
clearable
|
clearable
|
||||||
style="width: 240px;"
|
style="width: 240px;"
|
||||||
size="small"
|
size="small"
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="类型" prop="businessType">
|
<el-form-item label="类型" prop="type">
|
||||||
<el-select
|
<el-select
|
||||||
v-model="queryParams.businessType"
|
v-model="queryParams.type"
|
||||||
placeholder="操作类型"
|
placeholder="操作类型"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
size="small"
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in typeOptions"
|
v-for="dict in this.getDictDatas(DICT_TYPE.SYS_OPERATE_TYPE)"
|
||||||
:key="dict.dictValue"
|
:key="parseInt(dict.value)"
|
||||||
:label="dict.dictLabel"
|
:label="dict.label"
|
||||||
:value="dict.dictValue"
|
:value="parseInt(dict.value)"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="状态" prop="status">
|
<el-form-item label="状态" prop="status">
|
||||||
<el-select
|
<el-select
|
||||||
v-model="queryParams.status"
|
v-model="queryParams.success"
|
||||||
placeholder="操作状态"
|
placeholder="操作状态"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
size="small"
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in statusOptions"
|
:key="true"
|
||||||
:key="dict.dictValue"
|
label="成功"
|
||||||
:label="dict.dictLabel"
|
:value="true"
|
||||||
:value="dict.dictValue"
|
/>
|
||||||
/>
|
<el-option
|
||||||
</el-select>
|
:key="false"
|
||||||
</el-form-item>
|
label="失败"
|
||||||
<el-form-item label="操作时间">
|
:value="false"
|
||||||
<el-date-picker
|
/>
|
||||||
v-model="dateRange"
|
</el-select>
|
||||||
size="small"
|
</el-form-item>
|
||||||
style="width: 240px"
|
<el-form-item label="操作时间">
|
||||||
value-format="yyyy-MM-dd"
|
<el-date-picker
|
||||||
type="daterange"
|
v-model="dateRange"
|
||||||
range-separator="-"
|
size="small"
|
||||||
start-placeholder="开始日期"
|
style="width: 240px"
|
||||||
end-placeholder="结束日期"
|
value-format="yyyy-MM-dd"
|
||||||
></el-date-picker>
|
type="daterange"
|
||||||
</el-form-item>
|
range-separator="-"
|
||||||
<el-form-item>
|
start-placeholder="开始日期"
|
||||||
<el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
end-placeholder="结束日期"
|
||||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
></el-date-picker>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
<el-form-item>
|
||||||
|
<el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||||
<el-row :gutter="10" class="mb8">
|
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||||
<el-col :span="1.5">
|
</el-form-item>
|
||||||
<el-button
|
</el-form>
|
||||||
type="danger"
|
|
||||||
icon="el-icon-delete"
|
<el-row :gutter="10" class="mb8">
|
||||||
size="mini"
|
<el-col :span="1.5">
|
||||||
:disabled="multiple"
|
<el-button
|
||||||
@click="handleDelete"
|
type="warning"
|
||||||
v-hasPermi="['monitor:operlog:remove']"
|
icon="el-icon-download"
|
||||||
>删除</el-button>
|
size="mini"
|
||||||
</el-col>
|
@click="handleExport"
|
||||||
<el-col :span="1.5">
|
v-hasPermi="['system:config:export']"
|
||||||
<el-button
|
>导出</el-button>
|
||||||
type="danger"
|
</el-col>
|
||||||
icon="el-icon-delete"
|
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||||
size="mini"
|
</el-row>
|
||||||
@click="handleClean"
|
|
||||||
v-hasPermi="['monitor:operlog:remove']"
|
<el-table v-loading="loading" :data="list">
|
||||||
>清空</el-button>
|
<el-table-column label="日志编号" align="center" prop="id" />
|
||||||
</el-col>
|
<el-table-column label="操作模块" align="center" prop="module" />
|
||||||
<el-col :span="1.5">
|
<el-table-column label="操作名" align="center" prop="name" width="180" />
|
||||||
<el-button
|
<el-table-column label="操作类型" align="center" prop="type">
|
||||||
type="warning"
|
<template slot-scope="scope">
|
||||||
icon="el-icon-download"
|
<span>{{ getDictDataLabel(DICT_TYPE.SYS_OPERATE_TYPE, scope.row.type) }}</span>
|
||||||
size="mini"
|
</template>
|
||||||
@click="handleExport"
|
</el-table-column>
|
||||||
v-hasPermi="['system:config:export']"
|
<el-table-column label="操作人" align="center" prop="userNickname" />
|
||||||
>导出</el-button>
|
<el-table-column label="操作结果" align="center" prop="status">
|
||||||
</el-col>
|
<template slot-scope="scope">
|
||||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
<span>{{ scope.row.resultCode === 0 ? '成功' : '失败' }}</span>
|
||||||
</el-row>
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
|
<el-table-column label="操作日期" align="center" prop="startTime" width="180">
|
||||||
<el-table-column type="selection" width="55" align="center" />
|
<template slot-scope="scope">
|
||||||
<el-table-column label="日志编号" align="center" prop="operId" />
|
<span>{{ parseTime(scope.row.startTime) }}</span>
|
||||||
<el-table-column label="系统模块" align="center" prop="title" />
|
</template>
|
||||||
<el-table-column label="操作类型" align="center" prop="businessType" :formatter="typeFormat" />
|
</el-table-column>
|
||||||
<el-table-column label="请求方式" align="center" prop="requestMethod" />
|
<el-table-column label="执行时长" align="center" prop="startTime">
|
||||||
<el-table-column label="操作人员" align="center" prop="operName" />
|
<template slot-scope="scope">
|
||||||
<el-table-column label="主机" align="center" prop="operIp" width="130" :show-overflow-tooltip="true" />
|
<span>{{ scope.row.duration }} ms</span>
|
||||||
<el-table-column label="操作地点" align="center" prop="operLocation" :show-overflow-tooltip="true" />
|
</template>
|
||||||
<el-table-column label="操作状态" align="center" prop="status" :formatter="statusFormat" />
|
</el-table-column>
|
||||||
<el-table-column label="操作日期" align="center" prop="operTime" width="180">
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<span>{{ parseTime(scope.row.operTime) }}</span>
|
<el-button
|
||||||
</template>
|
size="mini"
|
||||||
</el-table-column>
|
type="text"
|
||||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
icon="el-icon-view"
|
||||||
<template slot-scope="scope">
|
@click="handleView(scope.row,scope.index)"
|
||||||
<el-button
|
v-hasPermi="['system:operate-log:query']"
|
||||||
size="mini"
|
>详细</el-button>
|
||||||
type="text"
|
</template>
|
||||||
icon="el-icon-view"
|
</el-table-column>
|
||||||
@click="handleView(scope.row,scope.index)"
|
</el-table>
|
||||||
v-hasPermi="['monitor:operlog:query']"
|
|
||||||
>详细</el-button>
|
<pagination
|
||||||
</template>
|
v-show="total>0"
|
||||||
</el-table-column>
|
:total="total"
|
||||||
</el-table>
|
:page.sync="queryParams.pageNo"
|
||||||
|
:limit.sync="queryParams.pageSize"
|
||||||
<pagination
|
@pagination="getList"
|
||||||
v-show="total>0"
|
/>
|
||||||
:total="total"
|
|
||||||
:page.sync="queryParams.pageNum"
|
<!-- 操作日志详细 -->
|
||||||
:limit.sync="queryParams.pageSize"
|
<el-dialog title="操作日志详细" :visible.sync="open" width="700px" append-to-body>
|
||||||
@pagination="getList"
|
<el-form ref="form" :model="form" label-width="100px" size="mini">
|
||||||
/>
|
<el-row>
|
||||||
|
<el-col :span="12">
|
||||||
<!-- 操作日志详细 -->
|
<el-form-item label="操作模块:">{{ form.title }} / {{ typeFormat(form) }}</el-form-item>
|
||||||
<el-dialog title="操作日志详细" :visible.sync="open" width="700px" append-to-body>
|
<el-form-item
|
||||||
<el-form ref="form" :model="form" label-width="100px" size="mini">
|
label="登录信息:"
|
||||||
<el-row>
|
>{{ form.operName }} / {{ form.operIp }} / {{ form.operLocation }}</el-form-item>
|
||||||
<el-col :span="12">
|
</el-col>
|
||||||
<el-form-item label="操作模块:">{{ form.title }} / {{ typeFormat(form) }}</el-form-item>
|
<el-col :span="12">
|
||||||
<el-form-item
|
<el-form-item label="请求地址:">{{ form.operUrl }}</el-form-item>
|
||||||
label="登录信息:"
|
<el-form-item label="请求方式:">{{ form.requestMethod }}</el-form-item>
|
||||||
>{{ form.operName }} / {{ form.operIp }} / {{ form.operLocation }}</el-form-item>
|
</el-col>
|
||||||
</el-col>
|
<el-col :span="24">
|
||||||
<el-col :span="12">
|
<el-form-item label="操作方法:">{{ form.method }}</el-form-item>
|
||||||
<el-form-item label="请求地址:">{{ form.operUrl }}</el-form-item>
|
</el-col>
|
||||||
<el-form-item label="请求方式:">{{ form.requestMethod }}</el-form-item>
|
<el-col :span="24">
|
||||||
</el-col>
|
<el-form-item label="请求参数:">{{ form.operParam }}</el-form-item>
|
||||||
<el-col :span="24">
|
</el-col>
|
||||||
<el-form-item label="操作方法:">{{ form.method }}</el-form-item>
|
<el-col :span="24">
|
||||||
</el-col>
|
<el-form-item label="返回参数:">{{ form.jsonResult }}</el-form-item>
|
||||||
<el-col :span="24">
|
</el-col>
|
||||||
<el-form-item label="请求参数:">{{ form.operParam }}</el-form-item>
|
<el-col :span="12">
|
||||||
</el-col>
|
<el-form-item label="操作状态:">
|
||||||
<el-col :span="24">
|
<div v-if="form.status === 0">正常</div>
|
||||||
<el-form-item label="返回参数:">{{ form.jsonResult }}</el-form-item>
|
<div v-else-if="form.status === 1">失败</div>
|
||||||
</el-col>
|
</el-form-item>
|
||||||
<el-col :span="12">
|
</el-col>
|
||||||
<el-form-item label="操作状态:">
|
<el-col :span="12">
|
||||||
<div v-if="form.status === 0">正常</div>
|
<el-form-item label="操作时间:">{{ parseTime(form.operTime) }}</el-form-item>
|
||||||
<div v-else-if="form.status === 1">失败</div>
|
</el-col>
|
||||||
</el-form-item>
|
<el-col :span="24">
|
||||||
</el-col>
|
<el-form-item label="异常信息:" v-if="form.status === 1">{{ form.errorMsg }}</el-form-item>
|
||||||
<el-col :span="12">
|
</el-col>
|
||||||
<el-form-item label="操作时间:">{{ parseTime(form.operTime) }}</el-form-item>
|
</el-row>
|
||||||
</el-col>
|
</el-form>
|
||||||
<el-col :span="24">
|
<div slot="footer" class="dialog-footer">
|
||||||
<el-form-item label="异常信息:" v-if="form.status === 1">{{ form.errorMsg }}</el-form-item>
|
<el-button @click="open = false">关 闭</el-button>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
</el-dialog>
|
||||||
</el-form>
|
</div>
|
||||||
<div slot="footer" class="dialog-footer">
|
</template>
|
||||||
<el-button @click="open = false">关 闭</el-button>
|
|
||||||
</div>
|
<script>
|
||||||
</el-dialog>
|
import { listOperateLog, exportOperateLog } from "@/api/system/operatelog";
|
||||||
</div>
|
|
||||||
</template>
|
export default {
|
||||||
|
name: "Operlog",
|
||||||
<script>
|
data() {
|
||||||
import { list, delOperlog, cleanOperlog, exportOperlog } from "@/api/monitor/operlog";
|
return {
|
||||||
|
// 遮罩层
|
||||||
export default {
|
loading: true,
|
||||||
name: "Operlog",
|
// 显示搜索条件
|
||||||
data() {
|
showSearch: true,
|
||||||
return {
|
// 总条数
|
||||||
// 遮罩层
|
total: 0,
|
||||||
loading: true,
|
// 表格数据
|
||||||
// 选中数组
|
list: [],
|
||||||
ids: [],
|
// 是否显示弹出层
|
||||||
// 非多个禁用
|
open: false,
|
||||||
multiple: true,
|
// 类型数据字典
|
||||||
// 显示搜索条件
|
typeOptions: [],
|
||||||
showSearch: true,
|
// 类型数据字典
|
||||||
// 总条数
|
statusOptions: [],
|
||||||
total: 0,
|
// 日期范围
|
||||||
// 表格数据
|
dateRange: [],
|
||||||
list: [],
|
// 表单参数
|
||||||
// 是否显示弹出层
|
form: {},
|
||||||
open: false,
|
// 查询参数
|
||||||
// 类型数据字典
|
queryParams: {
|
||||||
typeOptions: [],
|
pageNo: 1,
|
||||||
// 类型数据字典
|
pageSize: 10,
|
||||||
statusOptions: [],
|
title: undefined,
|
||||||
// 日期范围
|
operName: undefined,
|
||||||
dateRange: [],
|
businessType: undefined,
|
||||||
// 表单参数
|
status: undefined
|
||||||
form: {},
|
},
|
||||||
// 查询参数
|
|
||||||
queryParams: {
|
};
|
||||||
pageNum: 1,
|
},
|
||||||
pageSize: 10,
|
created() {
|
||||||
title: undefined,
|
this.getList();
|
||||||
operName: undefined,
|
},
|
||||||
businessType: undefined,
|
methods: {
|
||||||
status: undefined
|
/** 查询登录日志 */
|
||||||
}
|
getList() {
|
||||||
};
|
this.loading = true;
|
||||||
},
|
listOperateLog(this.addDateRange(this.queryParams, [
|
||||||
created() {
|
this.dateRange[0] ? this.dateRange[0] + ' 00:00:00' : undefined,
|
||||||
this.getList();
|
this.dateRange[1] ? this.dateRange[1] + ' 23:59:59' : undefined,
|
||||||
this.getDicts("sys_oper_type").then(response => {
|
])).then( response => {
|
||||||
this.typeOptions = response.data;
|
this.list = response.data.list;
|
||||||
});
|
this.total = response.data.total;
|
||||||
this.getDicts("sys_common_status").then(response => {
|
this.loading = false;
|
||||||
this.statusOptions = response.data;
|
}
|
||||||
});
|
);
|
||||||
},
|
},
|
||||||
methods: {
|
// 操作日志状态字典翻译
|
||||||
/** 查询登录日志 */
|
statusFormat(row, column) {
|
||||||
getList() {
|
return this.selectDictLabel(this.statusOptions, row.status);
|
||||||
this.loading = true;
|
},
|
||||||
list(this.addDateRange(this.queryParams, this.dateRange)).then( response => {
|
// 操作日志类型字典翻译
|
||||||
this.list = response.rows;
|
typeFormat(row, column) {
|
||||||
this.total = response.total;
|
return this.selectDictLabel(this.typeOptions, row.businessType);
|
||||||
this.loading = false;
|
},
|
||||||
}
|
/** 搜索按钮操作 */
|
||||||
);
|
handleQuery() {
|
||||||
},
|
this.queryParams.pageNo = 1;
|
||||||
// 操作日志状态字典翻译
|
this.getList();
|
||||||
statusFormat(row, column) {
|
},
|
||||||
return this.selectDictLabel(this.statusOptions, row.status);
|
/** 重置按钮操作 */
|
||||||
},
|
resetQuery() {
|
||||||
// 操作日志类型字典翻译
|
this.dateRange = [];
|
||||||
typeFormat(row, column) {
|
this.resetForm("queryForm");
|
||||||
return this.selectDictLabel(this.typeOptions, row.businessType);
|
this.handleQuery();
|
||||||
},
|
},
|
||||||
/** 搜索按钮操作 */
|
/** 详细按钮操作 */
|
||||||
handleQuery() {
|
handleView(row) {
|
||||||
this.queryParams.pageNum = 1;
|
this.open = true;
|
||||||
this.getList();
|
this.form = row;
|
||||||
},
|
},
|
||||||
/** 重置按钮操作 */
|
/** 导出按钮操作 */
|
||||||
resetQuery() {
|
handleExport() {
|
||||||
this.dateRange = [];
|
const queryParams = this.queryParams;
|
||||||
this.resetForm("queryForm");
|
this.$confirm('是否确认导出所有操作日志数据项?', "警告", {
|
||||||
this.handleQuery();
|
confirmButtonText: "确定",
|
||||||
},
|
cancelButtonText: "取消",
|
||||||
// 多选框选中数据
|
type: "warning"
|
||||||
handleSelectionChange(selection) {
|
}).then(function() {
|
||||||
this.ids = selection.map(item => item.operId)
|
return exportOperateLog(queryParams);
|
||||||
this.multiple = !selection.length
|
}).then(response => {
|
||||||
},
|
this.download(response.msg);
|
||||||
/** 详细按钮操作 */
|
})
|
||||||
handleView(row) {
|
}
|
||||||
this.open = true;
|
}
|
||||||
this.form = row;
|
};
|
||||||
},
|
</script>
|
||||||
/** 删除按钮操作 */
|
|
||||||
handleDelete(row) {
|
|
||||||
const operIds = row.operId || this.ids;
|
|
||||||
this.$confirm('是否确认删除日志编号为"' + operIds + '"的数据项?', "警告", {
|
|
||||||
confirmButtonText: "确定",
|
|
||||||
cancelButtonText: "取消",
|
|
||||||
type: "warning"
|
|
||||||
}).then(function() {
|
|
||||||
return delOperlog(operIds);
|
|
||||||
}).then(() => {
|
|
||||||
this.getList();
|
|
||||||
this.msgSuccess("删除成功");
|
|
||||||
})
|
|
||||||
},
|
|
||||||
/** 清空按钮操作 */
|
|
||||||
handleClean() {
|
|
||||||
this.$confirm('是否确认清空所有操作日志数据项?', "警告", {
|
|
||||||
confirmButtonText: "确定",
|
|
||||||
cancelButtonText: "取消",
|
|
||||||
type: "warning"
|
|
||||||
}).then(function() {
|
|
||||||
return cleanOperlog();
|
|
||||||
}).then(() => {
|
|
||||||
this.getList();
|
|
||||||
this.msgSuccess("清空成功");
|
|
||||||
})
|
|
||||||
},
|
|
||||||
/** 导出按钮操作 */
|
|
||||||
handleExport() {
|
|
||||||
const queryParams = this.queryParams;
|
|
||||||
this.$confirm('是否确认导出所有操作日志数据项?', "警告", {
|
|
||||||
confirmButtonText: "确定",
|
|
||||||
cancelButtonText: "取消",
|
|
||||||
type: "warning"
|
|
||||||
}).then(function() {
|
|
||||||
return exportOperlog(queryParams);
|
|
||||||
}).then(response => {
|
|
||||||
this.download(response.msg);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (1, 1, '男', '1', 'sys_user_sex', 0, '性别男', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 05:48:53', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (2, 2, '女', '2', 'sys_user_sex', 0, '性别女', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 05:48:55', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (8, 1, '正常', '0', 'sys_job_status', 0, '正常状态', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (9, 2, '暂停', '1', 'sys_job_status', 0, '停用状态', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (10, 1, '默认', 'DEFAULT', 'sys_job_group', 0, '默认分组', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (11, 2, '系统', 'SYSTEM', 'sys_job_group', 0, '系统分组', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (12, 1, '是', 'Y', 'sys_yes_no', 0, '系统默认是', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (13, 2, '否', 'N', 'sys_yes_no', 0, '系统默认否', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (14, 1, '通知', '1', 'sys_notice_type', 0, '通知', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (15, 2, '公告', '2', 'sys_notice_type', 0, '公告', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 00:02:28', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (16, 0, '其它', '0', 'sys_operate_type', 0, '其它操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:12', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (17, 1, '查询', '1', 'sys_operate_type', 0, '查询操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:10', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (18, 2, '新增', '2', 'sys_operate_type', 0, '新增操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:17', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (19, 3, '修改', '3', 'sys_operate_type', 0, '修改操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:20', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (20, 4, '删除', '4', 'sys_operate_type', 0, '删除操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:51:24', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (22, 5, '导出', '5', 'sys_operate_type', 0, '导出操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:49:20', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (23, 6, '导入', '6', 'sys_operate_type', 0, '导入操作', 'admin', '2021-01-05 17:03:48', '', '2021-01-16 13:49:24', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (27, 1, '开启', '0', 'sys_common_status', 0, '开启状态', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 02:57:12', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (28, 2, '关闭', '1', 'sys_common_status', 0, '关闭状态', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 05:48:32', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (29, 1, '目录', '1', 'sys_menu_type', 0, '目录', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:33:30', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (30, 2, '菜单', '2', 'sys_menu_type', 0, '菜单', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:33:35', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (31, 3, '按钮', '3', 'sys_menu_type', 0, '按钮', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:33:38', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (32, 1, '内置', '1', 'sys_role_type', 0, '内置角色', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:34:22', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (33, 2, '自定义', '2', 'sys_role_type', 0, '自定义角色', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 13:34:26', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (34, 1, '全部数据权限', '1', 'sys_data_scope', 0, '全部数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:02', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (35, 2, '指定部门数据权限', '2', 'sys_data_scope', 0, '指定部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:20', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (36, 3, '本部门数据权限', '3', 'sys_data_scope', 0, '本部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:29', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (37, 4, '本部门及以下数据权限', '4', 'sys_data_scope', 0, '本部门及以下数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:32', b'0');
|
||||||
|
INSERT INTO `ruoyi-vue-pro`.`sys_dict_data`(`id`, `sort`, `label`, `value`, `dict_type`, `status`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (38, 5, '仅本人数据权限', '5', 'sys_data_scope', 0, '仅本人数据权限', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 19:38:38', b'0');
|
||||||
@ -1,2 +1,2 @@
|
|||||||
### 请求 /captcha/get-image 接口 => 成功
|
### 请求 /captcha/get-image 接口 => 成功
|
||||||
GET {{baseUrl}}/captcha/get-image
|
GET {{baseUrl}}/system/captcha/get-image
|
||||||
|
|||||||
@ -0,0 +1,3 @@
|
|||||||
|
### 请求 /system/operate-log/demo 接口 => 成功
|
||||||
|
GET {{baseUrl}}/system/operate-log/demo
|
||||||
|
Authorization: Bearer {{token}}
|
||||||
@ -1 +0,0 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.controller.logger;
|
|
||||||
@ -0,0 +1,39 @@
|
|||||||
|
package cn.iocoder.dashboard.modules.system.controller.logger.vo;
|
||||||
|
|
||||||
|
import cn.iocoder.dashboard.common.pojo.PageParam;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||||
|
|
||||||
|
@ApiModel("操作日志分页列表 Request VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
public class SysOperateLogPageReqVO extends PageParam {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "操作模块", example = "订单", notes = "模拟匹配")
|
||||||
|
private String module;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "用户昵称", example = "芋道", notes = "模拟匹配")
|
||||||
|
private String userNickname;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "操作分类", example = "1", notes = "参见 SysOperateLogTypeEnum 枚举类")
|
||||||
|
private Integer type;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "操作状态", example = "true")
|
||||||
|
private Boolean success;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "开始时间", example = "2020-10-24")
|
||||||
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
|
private Date beginTime;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "结束时间", example = "2020-10-24")
|
||||||
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
|
private Date endTime;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
package cn.iocoder.dashboard.modules.system.controller.logger.vo;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
@ApiModel("操作日志 Response VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class SysOperateLogRespVO extends SysOperateLogBaseVO {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "日志编号", required = true, example = "1024")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "用户昵称", required = true, example = "芋艿")
|
||||||
|
private String userNickname;
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,9 +1,30 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.dal.mysql.dao.logger;
|
package cn.iocoder.dashboard.modules.system.dal.mysql.dao.logger;
|
||||||
|
|
||||||
|
import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants;
|
||||||
|
import cn.iocoder.dashboard.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX;
|
||||||
|
import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX;
|
||||||
|
import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogPageReqVO;
|
||||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO;
|
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO;
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface SysOperateLogMapper extends BaseMapper<SysOperateLogDO> {
|
public interface SysOperateLogMapper extends BaseMapperX<SysOperateLogDO> {
|
||||||
|
|
||||||
|
default PageResult<SysOperateLogDO> selectPage(SysOperateLogPageReqVO reqVO, Collection<Long> userIds) {
|
||||||
|
QueryWrapperX<SysOperateLogDO> query = new QueryWrapperX<SysOperateLogDO>()
|
||||||
|
.likeIfPresent("module", reqVO.getModule())
|
||||||
|
.inIfPresent("user_id", userIds)
|
||||||
|
.eqIfPresent("operate_type", reqVO.getType())
|
||||||
|
.betweenIfPresent("start_time", reqVO.getBeginTime(), reqVO.getEndTime());
|
||||||
|
if (Boolean.TRUE.equals(reqVO.getSuccess())) {
|
||||||
|
query.eq("result_code", GlobalErrorCodeConstants.SUCCESS.getCode());
|
||||||
|
} else if (Boolean.FALSE.equals(reqVO.getSuccess())) {
|
||||||
|
query.gt("result_code", GlobalErrorCodeConstants.SUCCESS.getCode());
|
||||||
|
}
|
||||||
|
return selectPage(reqVO, query);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,9 +1,21 @@
|
|||||||
package cn.iocoder.dashboard.modules.system.service.logger;
|
package cn.iocoder.dashboard.modules.system.service.logger;
|
||||||
|
|
||||||
|
import cn.iocoder.dashboard.common.pojo.PageResult;
|
||||||
import cn.iocoder.dashboard.framework.logger.operatelog.core.service.OperateLogFrameworkService;
|
import cn.iocoder.dashboard.framework.logger.operatelog.core.service.OperateLogFrameworkService;
|
||||||
|
import cn.iocoder.dashboard.modules.system.controller.logger.vo.SysOperateLogPageReqVO;
|
||||||
|
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 操作日志 Service 接口
|
* 操作日志 Service 接口
|
||||||
*/
|
*/
|
||||||
public interface SysOperateLogService extends OperateLogFrameworkService {
|
public interface SysOperateLogService extends OperateLogFrameworkService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得操作日志分页列表
|
||||||
|
*
|
||||||
|
* @param reqVO 分页条件
|
||||||
|
* @return 操作日志分页列表
|
||||||
|
*/
|
||||||
|
PageResult<SysOperateLogDO> pageOperateLog(SysOperateLogPageReqVO reqVO);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue