• SpringBoot利用AOP写一个日志管理(Log)


    1. 需求

    目前有这么个问题,有两个系统CSP和OMS,这俩系统共用的是同一套日志操作:Log;目前想区分下这俩系统的日志操作,那没办法了,只能重写一份Log的日志操作;

    你也可以参照若依框架的日志系统实现。

    2. 新建一张日志表

    sys_oper_csp_log

    /*
     Navicat Premium Data Transfer
    
     Date: 08/09/2022 09:21:45
    */
    
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for sys_oper_csp_log
    -- ----------------------------
    DROP TABLE IF EXISTS `sys_oper_csp_log`;
    CREATE TABLE `sys_oper_csp_log`  (
      `oper_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '日志主键',
      `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '模块标题',
      `business_type` int(2) NULL DEFAULT 0 COMMENT '业务类型(0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据)',
      `method` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '方法名称',
      `request_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '请求方式',
      `operator_type` int(1) NULL DEFAULT 0 COMMENT '操作类别(0其它 1后台用户 2手机端用户)',
      `oper_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '操作人员',
      `dept_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '部门名称',
      `oper_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '请求URL',
      `oper_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '主机地址',
      `oper_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '操作地点',
      `oper_param` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '请求参数',
      `json_result` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '返回参数',
      `status` int(1) NULL DEFAULT 0 COMMENT '操作状态(0正常 1异常)',
      `error_msg` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '错误消息',
      `oper_time` datetime NULL DEFAULT NULL COMMENT '操作时间',
      PRIMARY KEY (`oper_id`) USING BTREE,
      INDEX `idx_time`(`oper_time`, `title`, `oper_name`) USING BTREE
    ) ENGINE = InnoD CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'CSP系统操作日志记录';
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    3. 写相应的Controller层

    package com.juepeiscm.csp.controller.csplog;
    
    import com.juepeiscm.admin.api.domain.SysOperLog;
    import com.juepeiscm.common.core.controller.BaseController;
    import com.juepeiscm.common.core.domain.AjaxResult;
    import com.juepeiscm.common.core.page.TableDataInfo;
    import com.juepeiscm.common.enums.BusinessType;
    import com.juepeiscm.common.utils.poi.ExcelUtil;
    import com.juepeiscm.csp.annotation.CspLog;
    import com.juepeiscm.csp.domain.csplog.SysOperCspLog;
    import com.juepeiscm.csp.service.csplog.ISysOperCspLogService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.security.access.prepost.PreAuthorize;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.List;
    
    /**
     * 操作CSP系统日志
     * @Author: py.sun
     * @Date: 2022/9/7 14:51
     */
    @RestController
    @RequestMapping({"/csplog/opercsplog"})
    public class SysOperCsplogController extends BaseController {
        @Autowired
        private ISysOperCspLogService operCspLogService;
    
        public SysOperCsplogController() {
        }
    
        /**
         * 查询操作日志列表
         * @param sysOperCspLog
         * @return
         */
        @PreAuthorize("@ss.hasPermi('monitor:operlog:list')")
        @GetMapping({"/list"})
        public TableDataInfo list(SysOperCspLog sysOperCspLog) {
            this.startPage();
            List<SysOperCspLog> list = this.operCspLogService.selectOperLogList(sysOperCspLog);
            return this.getDataTable(list);
        }
    
        /**
         * 查询系统模块的分类
         * @param
         * @return
         */
        @GetMapping({"/listTitle"})
        public TableDataInfo listTitle() {
            this.startPage();
            List<String> list = this.operCspLogService.selectOperLogListTitle();
            return this.getDataTable(list);
        }
    
        @CspLog(
                title = "导出CSP系统日志",
                businessType = BusinessType.EXPORT
        )
        @PreAuthorize("@ss.hasPermi('monitor:operlog:export')")
        @GetMapping({"/export"})
        public AjaxResult export(SysOperCspLog operLog) {
            List<SysOperCspLog> list = this.operCspLogService.selectOperLogList(operLog);
            ExcelUtil<SysOperCspLog> util = new ExcelUtil(SysOperLog.class);
            return util.exportExcel(list, "操作CSP系统日志");
        }
    
        @CspLog(
                title = "操作CSP系统日志",
                businessType = BusinessType.DELETE
        )
        @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
        @DeleteMapping({"/{operIds}"})
        public AjaxResult remove(@PathVariable Long[] operIds) {
            return this.toAjax(this.operCspLogService.deleteOperLogByIds(operIds));
        }
    
        @CspLog(
                title = "清除CSP系统日志",
                businessType = BusinessType.CLEAN
        )
        @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
        @DeleteMapping({"/clean"})
        public AjaxResult clean() {
            this.operCspLogService.cleanOperLog();
            return AjaxResult.success();
        }
    
    
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93

    Service接口层

    package com.juepeiscm.csp.service.csplog;
    
    import com.juepeiscm.admin.api.domain.SysOperLog;
    import com.juepeiscm.csp.domain.csplog.SysOperCspLog;
    
    import java.util.List;
    
    /**
     * @Author: py.sun
     * @Date: 2022/9/7 15:02
     */
    public interface ISysOperCspLogService {
        void insertOperlog(SysOperCspLog var1);
    
        List<SysOperCspLog> selectOperLogList(SysOperCspLog var1);
    
        List<String> selectOperLogListTitle();
    
        int deleteOperLogByIds(Long[] var1);
    
        SysOperLog selectOperLogById(Long var1);
    
        void cleanOperLog();
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    Service实现

    package com.juepeiscm.csp.service.impl.csplog;
    
    import com.juepeiscm.admin.api.domain.SysOperLog;
    import com.juepeiscm.common.core.domain.AjaxResult;
    import com.juepeiscm.common.core.domain.entity.SysDept;
    import com.juepeiscm.common.core.domain.entity.SysUser;
    import com.juepeiscm.common.core.domain.model.LoginUser;
    import com.juepeiscm.common.exception.CustomException;
    import com.juepeiscm.common.utils.SecurityUtils;
    import com.juepeiscm.common.utils.ServletUtils;
    import com.juepeiscm.common.utils.StringUtils;
    import com.juepeiscm.csp.domain.csplog.SysOperCspLog;
    import com.juepeiscm.csp.mapper.csplog.SysOperCspLogMapper;
    import com.juepeiscm.csp.service.csplog.ISysOperCspLogService;
    import com.juepeiscm.framework.web.service.TokenService;
    import com.juepeiscm.uam.service.ISysDeptService;
    import com.juepeiscm.uam.version.UamVersion;
    import org.apache.dubbo.config.annotation.Reference;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    /**
     * @Author: py.sun
     * @Date: 2022/9/7 15:03
     */
    @Service
    public class SysOperCspLogServiceImpl implements ISysOperCspLogService {
        @Autowired
        private SysOperCspLogMapper operLogMapper;
    
        @Autowired
        private TokenService tokenService;
    
        @Reference(version = UamVersion.idV)
        public ISysDeptService deptService;
    
        @Override
        public void insertOperlog(SysOperCspLog sysOperCspLog) {
            try {
                this.operLogMapper.insertOperlog(sysOperCspLog);
            } catch (Exception e) {
                e.printStackTrace();
                throw new CustomException("CSP系统日志插入失败,请联系管理员!!!");
            }
    
        }
    
        @Override
        public List<SysOperCspLog> selectOperLogList(SysOperCspLog sysOperCspLog) {
            return this.operLogMapper.selectOperLogList(sysOperCspLog);
        }
    
        @Override
        public List<String> selectOperLogListTitle() {
            return this.operLogMapper.selectOperLogListTitle();
        }
    
        @Override
        public int deleteOperLogByIds(Long[] operIds) {
            return this.operLogMapper.deleteOperLogByIds(operIds);
        }
    
        @Override
        public SysOperLog selectOperLogById(Long operId) {
            return this.operLogMapper.selectOperLogById(operId);
        }
    
        @Override
        public void cleanOperLog() {
            this.operLogMapper.cleanOperLog();
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    Mapper接口

    package com.juepeiscm.csp.mapper.csplog;
    
    import com.juepeiscm.admin.api.domain.SysOperLog;
    import com.juepeiscm.csp.domain.csplog.SysOperCspLog;
    
    import java.util.List;
    
    /**
     * @Author: py.sun
     * @Date: 2022/9/7 15:06
     */
    public interface SysOperCspLogMapper {
    
        void insertOperlog(SysOperCspLog var1);
    
        List<SysOperCspLog> selectOperLogList(SysOperCspLog sysOperCspLog);
    
        List<String> selectOperLogListTitle();
    
        int deleteOperLogByIds(Long[] var1);
    
        SysOperLog selectOperLogById(Long var1);
    
        void cleanOperLog();
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    Mapper.xml(我用的是Mybatis)

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.juepeiscm.csp.mapper.csplog.SysOperCspLogMapper">
    
        <resultMap type="SysOperCspLog" id="SysOperLogResult">
            <id     property="operId"         column="oper_id"        />
            <result property="title"          column="title"          />
            <result property="businessType"   column="business_type"  />
            <result property="method"         column="method"         />
            <result property="requestMethod"  column="request_method" />
            <result property="operatorType"   column="operator_type"  />
            <result property="operName"       column="oper_name"      />
            <result property="deptName"       column="dept_name"      />
            <result property="operUrl"        column="oper_url"       />
            <result property="operIp"         column="oper_ip"        />
            <result property="operLocation"   column="oper_location"  />
            <result property="operParam"      column="oper_param"     />
            <result property="jsonResult"     column="json_result"    />
            <result property="status"         column="status"         />
            <result property="errorMsg"       column="error_msg"      />
            <result property="operTime"       column="oper_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
            from sys_oper_csp_log
        </sql>
    
        <insert id="insertOperlog" parameterType="SysOperCspLog">
            insert into sys_oper_csp_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>
    
        <select id="selectOperLogList" parameterType="SysOperCspLog" resultMap="SysOperLogResult">
            <include refid="selectOperLogVo"/>
            <where>
                <if test="title != null and title != ''">
                    AND title like concat('%', #{title}, '%')
                </if>
                <if test="businessType != null and businessType != ''">
                    AND business_type = #{businessType}
                </if>
                <if test="businessTypes != null and businessTypes.length > 0">
                    AND business_type in
                    <foreach collection="businessTypes" item="businessType" open="(" separator="," close=")">
                        #{businessType}
                    </foreach>
                </if>
                <if test="status != null">
                    AND status = #{status}
                </if>
                <if test="operName != null and operName != ''">
                    AND oper_name like concat('%', #{operName}, '%')
                </if>
                <if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
                    and date_format(oper_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')
                </if>
                <if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
                    and date_format(oper_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
                </if>
            </where>
            order by oper_id desc
        </select>
    
        <delete id="deleteOperLogByIds" parameterType="Long">
            delete from sys_oper_csp_log where oper_id in
            <foreach collection="array" item="operId" open="(" separator="," close=")">
                #{operId}
            </foreach>
        </delete>
    
        <select id="selectOperLogById" parameterType="Long" resultMap="SysOperLogResult">
            <include refid="selectOperLogVo"/>
            where oper_id = #{operId}
        </select>
    
        <select id="selectOperLogListTitle" resultType="java.lang.String">
            select distinct(title)  from sys_oper_csp_log
        </select>
    
        <update id="cleanOperLog">
            truncate table sys_oper_csp_log
        </update>
    
    </mapper>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88

    CspLog

    定义一个日志管理的名称:CspLog

    package com.juepeiscm.csp.annotation;
    
    import com.juepeiscm.common.enums.BusinessType;
    import com.juepeiscm.common.enums.OperatorType;
    
    import java.lang.annotation.*;
    
    /**
     * CSP系统的日志管理
     * @Author: py.sun
     * @Date: 2022/9/7 14:42
     * @Target表示注解可以使用到哪些地方,可以是类,方法,或者是属性上,定义在ElementType枚举中:
     * @Retention作用是定义被它所注解的注解保留多久,一共有三种策略,定义在RetentionPolicy枚举中:
     *
     * 我们的@CspLog注解,可以作用在方法和参数上,将由编译器记录在类文件中,并在运行时由VM保留,因此可以反射性地读取。该注解是通过AOP进行解析的
     */
    @Target({ElementType.PARAMETER, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface CspLog {
        /**
         * 模块
         * @return
         */
        String title() default "";
    
        /**
         * 功能
         * @return
         */
        BusinessType businessType() default BusinessType.OTHER;
    
        /**
         * 操作人类别
         * @return
         */
        OperatorType operatorType() default OperatorType.MANAGE;
    
        /**
         * 是否保存请求的参数
         * @return
         */
        boolean isSaveRequestData() default true;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    实体类SysOperCspLog

    package com.juepeiscm.csp.domain.csplog;
    
    import com.fasterxml.jackson.annotation.JsonFormat;
    import com.juepeiscm.common.annotation.Excel;
    import com.juepeiscm.common.core.domain.BaseEntity;
    
    import java.util.Date;
    
    /**
     * @Author: py.sun
     * @Date: 2022/9/7 15:04
     */
    public class SysOperCspLog extends BaseEntity {
        private static final long serialVersionUID = 1L;
        @Excel(
                name = "操作序号",
                cellType = Excel.ColumnType.NUMERIC
        )
        private Long operId;
        @Excel(
                name = "操作模块"
        )
        private String title;
        @Excel(
                name = "业务类型",
                readConverterExp = "0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据"
        )
        private Integer businessType;
        private Integer[] businessTypes;
        @Excel(
                name = "请求方法"
        )
        private String method;
        @Excel(
                name = "请求方式"
        )
        private String requestMethod;
        @Excel(
                name = "操作类别",
                readConverterExp = "0=其它,1=后台用户,2=手机端用户"
        )
        private Integer operatorType;
        @Excel(
                name = "操作人员"
        )
        private String operName;
        @Excel(
                name = "部门名称"
        )
        private String deptName;
        @Excel(
                name = "请求地址"
        )
        private String operUrl;
        @Excel(
                name = "操作地址"
        )
        private String operIp;
        @Excel(
                name = "操作地点"
        )
        private String operLocation;
        @Excel(
                name = "请求参数"
        )
        private String operParam;
        @Excel(
                name = "返回参数"
        )
        private String jsonResult;
        @Excel(
                name = "状态",
                readConverterExp = "0=正常,1=异常"
        )
        private Integer status;
        @Excel(
                name = "错误消息"
        )
        private String errorMsg;
        @JsonFormat(
                pattern = "yyyy-MM-dd HH:mm:ss"
        )
        @Excel(
                name = "操作时间",
                width = 30.0D,
                dateFormat = "yyyy-MM-dd HH:mm:ss"
        )
        private Date operTime;
    
        public SysOperCspLog() {
        }
    
        public Long getOperId() {
            return this.operId;
        }
    
        public void setOperId(Long operId) {
            this.operId = operId;
        }
    
        public String getTitle() {
            return this.title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public Integer getBusinessType() {
            return this.businessType;
        }
    
        public void setBusinessType(Integer businessType) {
            this.businessType = businessType;
        }
    
        public Integer[] getBusinessTypes() {
            return this.businessTypes;
        }
    
        public void setBusinessTypes(Integer[] businessTypes) {
            this.businessTypes = businessTypes;
        }
    
        public String getMethod() {
            return this.method;
        }
    
        public void setMethod(String method) {
            this.method = method;
        }
    
        public String getRequestMethod() {
            return this.requestMethod;
        }
    
        public void setRequestMethod(String requestMethod) {
            this.requestMethod = requestMethod;
        }
    
        public Integer getOperatorType() {
            return this.operatorType;
        }
    
        public void setOperatorType(Integer operatorType) {
            this.operatorType = operatorType;
        }
    
        public String getOperName() {
            return this.operName;
        }
    
        public void setOperName(String operName) {
            this.operName = operName;
        }
    
        public String getDeptName() {
            return this.deptName;
        }
    
        public void setDeptName(String deptName) {
            this.deptName = deptName;
        }
    
        public String getOperUrl() {
            return this.operUrl;
        }
    
        public void setOperUrl(String operUrl) {
            this.operUrl = operUrl;
        }
    
        public String getOperIp() {
            return this.operIp;
        }
    
        public void setOperIp(String operIp) {
            this.operIp = operIp;
        }
    
        public String getOperLocation() {
            return this.operLocation;
        }
    
        public void setOperLocation(String operLocation) {
            this.operLocation = operLocation;
        }
    
        public String getOperParam() {
            return this.operParam;
        }
    
        public void setOperParam(String operParam) {
            this.operParam = operParam;
        }
    
        public String getJsonResult() {
            return this.jsonResult;
        }
    
        public void setJsonResult(String jsonResult) {
            this.jsonResult = jsonResult;
        }
    
        public Integer getStatus() {
            return this.status;
        }
    
        public void setStatus(Integer status) {
            this.status = status;
        }
    
        public String getErrorMsg() {
            return this.errorMsg;
        }
    
        public void setErrorMsg(String errorMsg) {
            this.errorMsg = errorMsg;
        }
    
        public Date getOperTime() {
            return this.operTime;
        }
    
        public void setOperTime(Date operTime) {
            this.operTime = operTime;
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230

    10. 定义日志管理的切面

    大家一定要记住哈,所有针对实体的SysOperCspLog赋值操作必须在这里main执行。

    package com.juepeiscm.csp.controller.utils;
    
    import com.alibaba.fastjson.JSON;
    import com.juepeiscm.common.core.domain.entity.SysDept;
    import com.juepeiscm.common.core.domain.model.LoginUser;
    import com.juepeiscm.common.enums.BusinessStatus;
    import com.juepeiscm.common.enums.HttpMethod;
    import com.juepeiscm.common.utils.ServletUtils;
    import com.juepeiscm.common.utils.StringUtils;
    import com.juepeiscm.common.utils.ip.IpUtils;
    import com.juepeiscm.common.utils.spring.SpringUtils;
    import com.juepeiscm.csp.annotation.CspLog;
    import com.juepeiscm.csp.domain.csplog.SysOperCspLog;
    import com.juepeiscm.framework.aspectj.LogAspect;
    import com.juepeiscm.framework.manager.AsyncManager;
    import com.juepeiscm.framework.web.service.TokenService;
    import com.juepeiscm.uam.service.ISysDeptService;
    import com.juepeiscm.uam.version.UamVersion;
    import org.apache.dubbo.config.annotation.Reference;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.Signature;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.aspectj.lang.reflect.MethodSignature;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    import org.springframework.validation.BindingResult;
    import org.springframework.web.multipart.MultipartFile;
    import org.springframework.web.servlet.HandlerMapping;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.lang.reflect.Method;
    import java.util.Collection;
    import java.util.Iterator;
    import java.util.Map;
    
    /**
     * @Author: py.sun
     * @Date: 2022/9/7 16:31
     * 操作日志记录处理
     */
    @Aspect
    @Component
    public class CspLogAspect {
        private static final Logger log = LoggerFactory.getLogger(CspLog.class);
    
        @Reference(version = UamVersion.idV)
        public ISysDeptService deptService;
    
        public CspLogAspect() {
        }
    
        //把@CspLog配置为切入点。   配置织入点
        @Pointcut("@annotation(com.juepeiscm.csp.annotation.CspLog)")
        public void logPointCut() {
        }
    
        //拦截异常操作
        // 处理完请求后执行该方法。也就是用@CspLog注解的方法,执行完后,调用handleLog方法,处理返回结果。
        @AfterReturning(
                pointcut = "logPointCut()",
                returning = "jsonResult"
        )
        public void doAfterReturning(JoinPoint joinPoint, Object jsonResult) {
            this.handleLog(joinPoint, (Exception)null, jsonResult);
        }
    
        @AfterThrowing(
                value = "logPointCut()",
                throwing = "e"
        )
        public void doAfterThrowing(JoinPoint joinPoint, Exception e) {
            this.handleLog(joinPoint, e, (Object)null);
        }
    
        // 如果函数抛出了异常,也是执行handleLog方法,不过和正常返回的参数不一样,此处是为了处理异常。
        protected void handleLog(JoinPoint joinPoint, Exception e, Object jsonResult) {
            try {
                // 获得注解
                CspLog controllerLog = this.getAnnotationLog(joinPoint);
                if (controllerLog == null) {
                    return;
                }
    
                // 获取当前的用户
                LoginUser loginUser = ((TokenService) SpringUtils.getBean(TokenService.class)).getLoginUser(ServletUtils.getRequest());
                // *========数据库日志=========*//
                SysOperCspLog operLog = new SysOperCspLog();
                operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
                // 请求的地址
                String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
                operLog.setOperIp(ip);
                // 返回参数
                operLog.setJsonResult(JSON.toJSONString(jsonResult));
                operLog.setOperUrl(ServletUtils.getRequest().getRequestURI());
                if (loginUser != null) {
                    operLog.setOperName(loginUser.getUsername());
                }
    
                // 获取当前登录用户的部门名称
                SysDept sysDept = deptService.selectDeptIdByUserIdAndAppId(loginUser.getUser().getUserId(), "oms");
                if(sysDept != null && StringUtils.isNotEmpty(sysDept.getDeptName())){
                        operLog.setDeptName(sysDept.getDeptName());
                }
    
                if (e != null) {
                    operLog.setStatus(BusinessStatus.FAIL.ordinal());
                    operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000));
                }
    
                // 设置方法名称
                String className = joinPoint.getTarget().getClass().getName();
                String methodName = joinPoint.getSignature().getName();
                operLog.setMethod(className + "." + methodName + "()");
                // 设置请求方式
                operLog.setRequestMethod(ServletUtils.getRequest().getMethod());
                // 处理设置注解上的参数
                this.getControllerMethodDescription(joinPoint, controllerLog, operLog);
                // 保存数据库
                AsyncManager.me().execute(AsyncFactoryCsp.recordOper(operLog));
            } catch (Exception var10) {
                // 记录本地异常日志
                log.error("==前置通知异常==");
                log.error("异常信息:{}", var10.getMessage());
                var10.printStackTrace();
            }
    
        }
    
        public void getControllerMethodDescription(JoinPoint joinPoint, CspLog log, SysOperCspLog operLog) throws Exception {
            operLog.setBusinessType(log.businessType().ordinal());
            operLog.setTitle(log.title());
            operLog.setOperatorType(log.operatorType().ordinal());
            if (log.isSaveRequestData()) {
                this.setRequestValue(joinPoint, operLog);
            }
    
        }
    
        private void setRequestValue(JoinPoint joinPoint, SysOperCspLog operLog) throws Exception {
            String requestMethod = operLog.getRequestMethod();
            if (!HttpMethod.PUT.name().equals(requestMethod) && !HttpMethod.POST.name().equals(requestMethod)) {
                Map<?, ?> paramsMap = (Map)ServletUtils.getRequest().getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
                operLog.setOperParam(StringUtils.substring(paramsMap.toString(), 0, 2000));
            } else {
                String params = this.argsArrayToString(joinPoint.getArgs());
                operLog.setOperParam(StringUtils.substring(params, 0, 2000));
            }
    
        }
    
        private CspLog getAnnotationLog(JoinPoint joinPoint) throws Exception {
            Signature signature = joinPoint.getSignature();
            MethodSignature methodSignature = (MethodSignature)signature;
            Method method = methodSignature.getMethod();
            return method != null ? (CspLog)method.getAnnotation(CspLog.class) : null;
        }
    
        private String argsArrayToString(Object[] paramsArray) {
            String params = "";
            if (paramsArray != null && paramsArray.length > 0) {
                for(int i = 0; i < paramsArray.length; ++i) {
                    if (StringUtils.isNotNull(paramsArray[i]) && !this.isFilterObject(paramsArray[i])) {
                        Object jsonObj = JSON.toJSON(paramsArray[i]);
                        params = params + jsonObj.toString() + " ";
                    }
                }
            }
    
            return params.trim();
        }
    
        public boolean isFilterObject(Object o) {
            Class<?> clazz = o.getClass();
            if (clazz.isArray()) {
                return clazz.getComponentType().isAssignableFrom(MultipartFile.class);
            } else {
                Iterator iter;
                if (Collection.class.isAssignableFrom(clazz)) {
                    Collection collection = (Collection)o;
                    iter = collection.iterator();
                    if (iter.hasNext()) {
                        return iter.next() instanceof MultipartFile;
                    }
                } else if (Map.class.isAssignableFrom(clazz)) {
                    Map map = (Map)o;
                    iter = map.entrySet().iterator();
                    if (iter.hasNext()) {
                        Map.Entry entry = (Map.Entry)iter.next();
                        return entry.getValue() instanceof MultipartFile;
                    }
                }
    
                return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse || o instanceof BindingResult;
            }
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203

    AsyncFactoryCsp

    package com.juepeiscm.csp.controller.utils;
    import com.juepeiscm.common.utils.ip.AddressUtils;
    import com.juepeiscm.common.utils.spring.SpringUtils;
    import com.juepeiscm.csp.domain.csplog.SysOperCspLog;
    import com.juepeiscm.csp.service.csplog.ISysOperCspLogService;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.util.TimerTask;
    
    /**
     * @Author: py.sun
     * @Date: 2022/9/7 16:47
     */
    public class AsyncFactoryCsp {
        private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user");
    
        public AsyncFactoryCsp() {
        }
    
        public static TimerTask recordOper(final SysOperCspLog operLog) {
            return new TimerTask() {
                public void run() {
                    operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp()));
                    ((ISysOperCspLogService) SpringUtils.getBean(ISysOperCspLogService.class)).insertOperlog(operLog);
                }
            };
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    12. 写一个Controller的Demo来执行一条日志试试

    在这里插入代码片package com.juepeiscm.csp.controller.order;
    
    import com.alibaba.fastjson.JSON;
    import com.juepeiscm.admin.api.service.ISysDictDataService;
    import com.juepeiscm.common.annotation.RepeatSubmit;
    import com.juepeiscm.common.core.controller.BaseController;
    import com.juepeiscm.common.core.domain.AjaxResult;
    import com.juepeiscm.common.core.domain.entity.SysDictData;
    import com.juepeiscm.common.core.page.TableDataInfo;
    import com.juepeiscm.common.enums.BusinessType;
    import com.juepeiscm.common.exception.BaseException;
    import com.juepeiscm.common.utils.StringUtils;
    import com.juepeiscm.common.utils.poi.ExcelUtil;
    import com.juepeiscm.csp.annotation.CspLog;
    import com.juepeiscm.csp.domain.order.CspGodownEntry;
    import com.juepeiscm.csp.domain.order.CspGodownEntryDetails;
    import com.juepeiscm.csp.service.common.MenuLogService;
    import com.juepeiscm.csp.service.data.ICspGoodsdataService;
    import com.juepeiscm.csp.service.order.ICspGodownEntryService;
    import com.juepeiscm.csp.vo.GodownEntryExcel;
    import com.juepeiscm.csp.vo.GoodsDataForGodownEntryDetails;
    import io.swagger.annotations.Api;
    import io.swagger.annotations.ApiOperation;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.security.access.prepost.PreAuthorize;
    import org.springframework.util.CollectionUtils;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.multipart.MultipartFile;
    
    import javax.validation.Valid;
    import java.math.BigDecimal;
    import java.math.RoundingMode;
    import java.util.*;
    import java.util.stream.Collectors;
    
    /**
     * 入库订单Controller
     *
     * @author juepeiscm
     * @date 2021-07-23
     */
    @Api(tags = "入库订单接口")
    @RestController
    @RequestMapping("/order/godownEntry")
    public class CspGodownEntryController extends BaseController {
    
        private static final Logger logger = LoggerFactory.getLogger(CspGodownEntryController.class);
    
        @Autowired
        private ICspGodownEntryService cspGodownEntryService;
        @Autowired
        private ICspGoodsdataService goodsDataService;
        @Autowired
        private MenuLogService menuLogService;
        @Autowired
        private ISysDictDataService sysDictDataService;
    
        /**
         * 新增入库订单Demo
         */
        @PreAuthorize("@ss.hasPermi('order:godownEntry:add')")
        @ApiOperation(value = "新增入库订单")
        @CspLog(title = "入库订单demo4", businessType = BusinessType.INSERT)
        @PostMapping("/addOrder")
        @RepeatSubmit
        public AjaxResult addDemo(@RequestBody @Valid CspGodownEntry godownEntry) {
            try {
                return toAjax(cspGodownEntryService.insertOmsGodownEntry(godownEntry));
            } catch (Exception e) {
                e.printStackTrace();
                return AjaxResult.error("新增失败,请联系管理员");
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77

    测试下,看看数据库内容

    在这里插入图片描述

    如果大家还有什么疑问,请留言!!!!!

  • 相关阅读:
    笙默考试管理系统-MyExamTest----codemirror(24)
    CMU 15-445 Project #3 - Query Execution(Task #1、Task #2)
    SpringBoot Admin监控平台《二》基础报警设置
    [Elastic-Job2.1.5源码]-12-调度作业的服务器IP和进程信息的持久化是如何设计的?
    px4+vio实现无人机室内定位
    灵性图书馆:好书推荐-《新零极限》
    js运动雏形及其相关问题和运动框架
    PostGreSQL模式schema
    Neo4j图数据库_web页面关闭登录实现免登陆访问_常用的cypher语句_删除_查询_创建关系图谱---Neo4j图数据库工作笔记0013
    【Py】使用flask-apscheduler动态调整作业参数(附源码)
  • 原文地址:https://blog.csdn.net/weixin_44372802/article/details/126767590