1 files renamed
5 files modified
| | |
| | | @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;
|
| | | }
|
| | | }
|
| | |
| | | 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.beans.factory.annotation.Autowired;
|
| | | import org.springframework.core.NamedThreadLocal;
|
| | | import org.springframework.http.HttpMethod;
|
| | | import org.springframework.stereotype.Component;
|
| | | import org.springframework.validation.BindingResult;
|
| | |
| | | /** 排除敏感属性字段 */
|
| | | public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword", "newPassword", "confirmPassword" };
|
| | |
|
| | | /** 计算操作消耗时间 */
|
| | | private static final ThreadLocal<Long> TIME_THREADLOCAL = new NamedThreadLocal<Long>("Cost Time");
|
| | |
|
| | | @Autowired
|
| | | private AsyncLogService asyncLogService;
|
| | |
|
| | | /**
|
| | | * 处理请求前执行
|
| | | */
|
| | | @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());
|
| | | // 保存数据库
|
| | | asyncLogService.saveSysLog(operLog);
|
| | | }
|
| | |
| | | log.error("异常信息:{}", exp.getMessage());
|
| | | exp.printStackTrace();
|
| | | }
|
| | | finally
|
| | | {
|
| | | TIME_THREADLOCAL.remove();
|
| | | }
|
| | | }
|
| | |
|
| | | /**
|
| | |
| | | /**
|
| | | * 会话注销,根据指定Token
|
| | | *
|
| | | * @param tokenValue 指定token
|
| | | * @param token 指定token
|
| | | */
|
| | | public static void logoutByToken(String token)
|
| | | {
|
| | |
| | |
|
| | | /**
|
| | | * 获取当前登录用户信息
|
| | | * |
| | | * @param token 指定token
|
| | | * @return 用户信息
|
| | | */
|
| | | public static LoginUser getLoginUser(String token)
|
| | | {
|
| | |
| | |
|
| | | /**
|
| | | * 验证当前用户有效期
|
| | | * |
| | | * @param loginUser 用户信息
|
| | | */
|
| | | public static void verifyLoginUserExpire(LoginUser loginUser)
|
| | | {
|
| | |
| | | <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_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_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_param, json_result, status, error_msg, oper_time)
|
| | | values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{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_param, json_result, status, error_msg, cost_time, oper_time)
|
| | | values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{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="businessType">
|
| | |
| | | </template>
|
| | | </el-table-column>
|
| | | <el-table-column label="请求方式" align="center" prop="requestMethod" />
|
| | | <el-table-column label="操作人员" align="center" prop="operName" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']" width="100"/>
|
| | | <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="status">
|
| | | <template slot-scope="scope">
|
| | | <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="180" 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">
|
| File was renamed from sql/ry_20220814.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 = '操作日志记录';
|
| | |
|