| | |
| | | import org.aspectj.lang.annotation.AfterReturning;
|
| | | import org.aspectj.lang.annotation.AfterThrowing;
|
| | | import org.aspectj.lang.annotation.Aspect;
|
| | | import org.aspectj.lang.annotation.Before;
|
| | | import org.slf4j.Logger;
|
| | | import org.slf4j.LoggerFactory;
|
| | | import org.springframework.core.NamedThreadLocal;
|
| | | import org.springframework.stereotype.Component;
|
| | | import org.springframework.validation.BindingResult;
|
| | | import org.springframework.web.multipart.MultipartFile;
|
| | |
| | |
|
| | | /** 排除敏感属性字段 */
|
| | | public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword", "newPassword", "confirmPassword" };
|
| | |
|
| | | /** 计算操作消耗时间 */
|
| | | private static final ThreadLocal<Long> TIME_THREADLOCAL = new NamedThreadLocal<Long>("Cost Time");
|
| | |
|
| | | /**
|
| | | * 处理请求前执行
|
| | | */
|
| | | @Before(value = "@annotation(controllerLog)")
|
| | | public void boBefore(JoinPoint joinPoint, Log controllerLog)
|
| | | {
|
| | | TIME_THREADLOCAL.set(System.currentTimeMillis());
|
| | | }
|
| | |
|
| | | /**
|
| | | * 处理完请求后执行
|
| | |
| | | operLog.setRequestMethod(ServletUtils.getRequest().getMethod());
|
| | | // 处理设置注解上的参数
|
| | | getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult);
|
| | | // 设置消耗时间
|
| | | operLog.setCostTime(System.currentTimeMillis() - TIME_THREADLOCAL.get());
|
| | | // 保存数据库
|
| | | AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
|
| | | }
|
| | |
| | | log.error("异常信息:{}", exp.getMessage());
|
| | | exp.printStackTrace();
|
| | | }
|
| | | finally
|
| | | {
|
| | | TIME_THREADLOCAL.remove();
|
| | | }
|
| | | }
|
| | |
|
| | | /**
|
| | |
| | | @Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
|
| | | private Date operTime;
|
| | |
|
| | | /** 消耗时间 */
|
| | | @Excel(name = "消耗时间", suffix = "毫秒")
|
| | | private Long costTime;
|
| | |
|
| | | public Long getOperId()
|
| | | {
|
| | | return operId;
|
| | |
| | | {
|
| | | this.operTime = operTime;
|
| | | }
|
| | |
|
| | | public Long getCostTime()
|
| | | {
|
| | | return costTime;
|
| | | }
|
| | |
|
| | | public void setCostTime(Long costTime)
|
| | | {
|
| | | this.costTime = costTime;
|
| | | }
|
| | | }
|
| | |
| | | <result property="status" column="status" />
|
| | | <result property="errorMsg" column="error_msg" />
|
| | | <result property="operTime" column="oper_time" />
|
| | | <result property="costTime" column="cost_time" />
|
| | | </resultMap>
|
| | |
|
| | | <sql id="selectOperLogVo">
|
| | | select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time
|
| | | select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time, cost_time
|
| | | from sys_oper_log
|
| | | </sql>
|
| | |
|
| | | <insert id="insertOperlog" parameterType="SysOperLog">
|
| | | insert into sys_oper_log(title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time)
|
| | | values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, sysdate())
|
| | | insert into sys_oper_log(title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, cost_time, oper_time)
|
| | | values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, #{costTime}, sysdate())
|
| | | </insert>
|
| | |
|
| | | <select id="selectOperLogList" parameterType="SysOperLog" resultMap="SysOperLogResult">
|
| | |
| | | </el-row> |
| | | |
| | | <el-table ref="tables" v-loading="loading" :data="list" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="handleSortChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column type="selection" width="50" align="center" /> |
| | | <el-table-column label="日志编号" align="center" prop="operId" /> |
| | | <el-table-column label="系统模块" align="center" prop="title" /> |
| | | <el-table-column label="系统模块" align="center" prop="title" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="操作类型" align="center" prop="businessType"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag :options="dict.type.sys_oper_type" :value="scope.row.businessType"/> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="请求方式" align="center" prop="requestMethod" /> |
| | | <el-table-column label="操作人员" align="center" prop="operName" width="100" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']" /> |
| | | <el-table-column label="操作人员" align="center" prop="operName" width="110" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']" /> |
| | | <el-table-column label="操作地址" align="center" prop="operIp" width="130" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="操作地点" align="center" prop="operLocation" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="操作状态" align="center" prop="status"> |
| | |
| | | <dict-tag :options="dict.type.sys_common_status" :value="scope.row.status"/> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作日期" align="center" prop="operTime" sortable="custom" :sort-orders="['descending', 'ascending']" width="180"> |
| | | <el-table-column label="操作日期" align="center" prop="operTime" width="160" sortable="custom" :sort-orders="['descending', 'ascending']"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.operTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="消耗时间" align="center" prop="costTime" width="110" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ scope.row.costTime }}毫秒</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
| | |
| | | <el-col :span="24"> |
| | | <el-form-item label="返回参数:">{{ form.jsonResult }}</el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-col :span="6"> |
| | | <el-form-item label="操作状态:"> |
| | | <div v-if="form.status === 0">正常</div> |
| | | <div v-else-if="form.status === 1">失败</div> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="消耗时间:">{{ form.costTime }}毫秒</el-form-item> |
| | | </el-col> |
| | | <el-col :span="10"> |
| | | <el-form-item label="操作时间:">{{ parseTime(form.operTime) }}</el-form-item> |
| | | </el-col> |
| | | <el-col :span="24"> |
文件名从 sql/ry_20220822.sql 修改 |
| | |
| | | status int(1) default 0 comment '操作状态(0正常 1异常)',
|
| | | error_msg varchar(2000) default '' comment '错误消息',
|
| | | oper_time datetime comment '操作时间',
|
| | | cost_time bigint(20) default 0 comment '消耗时间',
|
| | | primary key (oper_id)
|
| | | ) engine=innodb auto_increment=100 comment = '操作日志记录';
|
| | |
|