package com.kidgrow.log.service.impl;
import com.kidgrow.log.model.Audit;
import com.kidgrow.log.properties.LogDbProperties;
import com.kidgrow.log.service.IAuditService;
import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.scheduling.annotation.Async;
import javax.annotation.PostConstruct;
import javax.sql.DataSource;
/**
* 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020
*
* @Description: 审计日志实现类-数据库
* @Project:
* @CreateDate: Created in 2020/3/25 16:58
* @Author: liuke
*/
@Slf4j
@ConditionalOnProperty(name = "kidgrow.audit-log.log-type", havingValue = "db")
@ConditionalOnClass(JdbcTemplate.class)
public class DbAuditServiceImpl implements IAuditService {
private static final String INSERT_SQL = " insert into sys_logger " +
" (application_name, class_name, method_name, user_id, user_name, client_id, operation, timestamp) " +
" values (?,?,?,?,?,?,?,?)";
private final JdbcTemplate jdbcTemplate;
public DbAuditServiceImpl(@Autowired(required = false) LogDbProperties logDbProperties, DataSource dataSource) {
//优先使用配置的日志数据源,否则使用默认的数据源
if (logDbProperties != null && StringUtils.isNotEmpty(logDbProperties.getJdbcUrl())) {
dataSource = new HikariDataSource(logDbProperties);
}
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@PostConstruct
public void init() {
String sql = "CREATE TABLE IF NOT EXISTS `sys_logger` (\n" +
" `id` int(11) NOT NULL AUTO_INCREMENT,\n" +
" `application_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '应用名',\n" +
" `class_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '类名',\n" +
" `method_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '方法名',\n" +
" `user_id` int(11) NULL COMMENT '用户id',\n" +
" `user_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '用户名',\n" +
" `client_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '租户id',\n" +
" `operation` varchar(1024) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '操作信息',\n" +
" `timestamp` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '创建时间',\n" +
" PRIMARY KEY (`id`) USING BTREE\n" +
") ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;";
this.jdbcTemplate.execute(sql);
}
@Async
@Override
public void save(Audit audit) {
this.jdbcTemplate.update(INSERT_SQL
, audit.getApplicationName(), audit.getClassName(), audit.getMethodName()
, audit.getUserId(), audit.getUserName(), audit.getClientId()
, audit.getOperation(), audit.getTimestamp());
}
}