diff --git a/logkuangjia/.gitignore b/logkuangjia/.gitignore
new file mode 100644
index 0000000..682d4ed
--- /dev/null
+++ b/logkuangjia/.gitignore
@@ -0,0 +1,27 @@
+# Created by .ignore support plugin (hsz.mobi)
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+/.idea/
+/target/
diff --git a/logkuangjia/pom.xml b/logkuangjia/pom.xml
new file mode 100644
index 0000000..d37e9b7
--- /dev/null
+++ b/logkuangjia/pom.xml
@@ -0,0 +1,202 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.3.9.RELEASE
+
+
+
+ com.ayi
+ woniu-web
+ 0.0.1-SNAPSHOT
+ woniu-web
+ create by woniu
+
+ jar
+
+
+ 1.8
+
+
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ 3.5.2
+
+
+ com.github.rholder
+ guava-retrying
+ 2.0.0
+
+
+
+ com.google.guava
+ guava
+ 29.0-jre
+
+
+
+ org.lionsoul
+ ip2region
+ 2.7.0
+
+
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
+
+ cn.hutool
+ hutool-all
+ 5.3.3
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+
+ org.projectlombok
+ lombok
+
+
+ org.springframework.boot
+ spring-boot-starter-cache
+
+
+
+ io.springfox
+ springfox-swagger2
+ 2.9.2
+
+
+
+ io.springfox
+ springfox-swagger-ui
+ 2.9.2
+
+
+
+
+
+
+
+
+
+
+
+ com.alibaba
+ druid-spring-boot-starter
+ 1.2.18
+
+
+
+
+
+
+
+ mysql
+ mysql-connector-java
+ 8.0.29
+
+
+
+ com.alipay.sofa
+ runtime-sofa-boot-starter
+ 3.18.0
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.github.ben-manes.caffeine
+ caffeine
+ 2.9.3
+
+
+
+ com.alibaba
+ fastjson
+ 1.2.76
+
+
+ com.alibaba
+ easyexcel
+ 3.0.5
+
+
+ org.testng
+ testng
+ RELEASE
+ compile
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/logkuangjia/src/main/java/com/woniu/WoNiuApplication.java b/logkuangjia/src/main/java/com/woniu/WoNiuApplication.java
new file mode 100644
index 0000000..6cb5f1c
--- /dev/null
+++ b/logkuangjia/src/main/java/com/woniu/WoNiuApplication.java
@@ -0,0 +1,21 @@
+package com.woniu;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+
+@SpringBootApplication
+@MapperScan("com.woniu.logger.mapper")
+@EnableAsync
+@EnableScheduling
+public class WoNiuApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(WoNiuApplication.class, args);
+ }
+
+
+}
diff --git a/logkuangjia/src/main/java/com/woniu/controller/IdGeneratorController.java b/logkuangjia/src/main/java/com/woniu/controller/IdGeneratorController.java
new file mode 100644
index 0000000..3ccd117
--- /dev/null
+++ b/logkuangjia/src/main/java/com/woniu/controller/IdGeneratorController.java
@@ -0,0 +1,34 @@
+package com.woniu.controller;
+
+import com.woniu.service.RedisIdempotentStorage;
+import com.woniu.utils.IdGeneratorUtil;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * 一个注解,优雅的实现接口幂等性!
+ *
+ * 关键因素1
+ * 幂等唯一标识,就是客户端与服务端一次请求时的唯一标识,一般情况下由客户端来生成,也可以让第三方来统一分配。
+ *
+ * 关键因素2
+ * 有了唯一标识以后,服务端只需要确保这个唯一标识只被使用一次即可,一种常见的方式就是利用数据库的唯一索引。
+ */
+@RestController
+@RequestMapping("/generate")
+public class IdGeneratorController {
+ @Resource
+ private RedisIdempotentStorage redisIdempotentStorage;
+
+ @RequestMapping("/getIdGeneratorToken")
+ @ResponseBody
+ public String getIdGeneratorToken() {
+ String generateId = IdGeneratorUtil.generateId();
+ redisIdempotentStorage.save(generateId);
+ return generateId;
+ }
+
+}
diff --git a/logkuangjia/src/main/java/com/woniu/controller/OrderController.java b/logkuangjia/src/main/java/com/woniu/controller/OrderController.java
new file mode 100644
index 0000000..99e6410
--- /dev/null
+++ b/logkuangjia/src/main/java/com/woniu/controller/OrderController.java
@@ -0,0 +1,20 @@
+package com.woniu.controller;
+
+import com.woniu.req.Order;
+import com.woniu.req.RequestData;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/order")
+public class OrderController {
+
+ @RequestMapping("/saveOrder")
+ public String saveOrder(@RequestBody RequestData requestData) {
+ return "success";
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/logkuangjia/src/main/java/com/woniu/controller/TestController.java b/logkuangjia/src/main/java/com/woniu/controller/TestController.java
new file mode 100644
index 0000000..fc17cbc
--- /dev/null
+++ b/logkuangjia/src/main/java/com/woniu/controller/TestController.java
@@ -0,0 +1,15 @@
+package com.woniu.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/test")
+public class TestController {
+
+ @RequestMapping("/hello")
+ public String hello() {
+ return "success";
+ }
+}
diff --git a/logkuangjia/src/main/java/com/woniu/logger/LoggerInfoApplicationListener.java b/logkuangjia/src/main/java/com/woniu/logger/LoggerInfoApplicationListener.java
new file mode 100644
index 0000000..7ddc200
--- /dev/null
+++ b/logkuangjia/src/main/java/com/woniu/logger/LoggerInfoApplicationListener.java
@@ -0,0 +1,66 @@
+package com.woniu.logger;
+
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;
+
+import com.woniu.logger.conf.LoggerConfig;
+import com.woniu.logger.sql.DdlSqlFactory;
+import com.woniu.logger.sql.IDdlSql;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+/**
+ * 功能描述: 日志信息启动执行
+ * 日志备份,创建日志表等操作
+ */
+@Component
+public class LoggerInfoApplicationListener implements CommandLineRunner {
+
+ @Autowired
+ private DataSource dataSource;
+ @Autowired
+ private LoggerConfig loggerConfig;
+ private IDdlSql ddl;
+
+ @Override
+ public void run(String... args) throws Exception {
+ // 判断数据库类型
+ Connection conn = dataSource.getConnection();
+ try (Statement statement = conn.createStatement()) {
+ DbType dbType = JdbcUtils.getDbType(conn.getMetaData().getURL());
+ ddl = DdlSqlFactory.valueOf(dbType.name()).getDdl();
+ // 查询表有没有存在
+ if (!existTable(statement)) {
+ createTable(statement);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 功能描述: 建表
+ */
+ private void createTable(Statement statement) throws SQLException {
+ statement.execute(ddl.createTable());
+ }
+
+
+ /**
+ * 功能描述: 是否存在表
+ */
+ private boolean existTable(Statement statement) throws SQLException {
+ ResultSet resultSet = statement.executeQuery(ddl.queryTable(""));
+ resultSet.next();
+ return resultSet.getInt(1) == 1;
+ }
+
+}
diff --git a/logkuangjia/src/main/java/com/woniu/logger/LoggerInfoBackTask.java b/logkuangjia/src/main/java/com/woniu/logger/LoggerInfoBackTask.java
new file mode 100644
index 0000000..49661b0
--- /dev/null
+++ b/logkuangjia/src/main/java/com/woniu/logger/LoggerInfoBackTask.java
@@ -0,0 +1,77 @@
+package com.woniu.logger;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;
+
+import com.woniu.logger.conf.LoggerConfig;
+import com.woniu.logger.conf.LoggerLevelEnum;
+import com.woniu.logger.sql.DdlSqlFactory;
+import com.woniu.logger.sql.IDdlSql;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+
+
+/**
+ * 功能描述: 日志备份任务
+ */
+@Component
+public class LoggerInfoBackTask {
+
+ @Autowired
+ private DataSource dataSource;
+ @Autowired
+ private LoggerConfig loggerConfig;
+
+ private IDdlSql ddl;
+
+ /**
+ * 功能描述: 每天0点1秒开始执行备份表(确定日期)
+ */
+ @Scheduled(cron = "1 0 0 * * ?")
+ public void backTask() throws Throwable {
+ if (LoggerLevelEnum.NONE.equals(loggerConfig.getLevel())) {
+ return;
+ }
+ Connection conn = dataSource.getConnection();
+ try (Statement statement = conn.createStatement()) {
+ DbType dbType = JdbcUtils.getDbType(conn.getMetaData().getURL());
+ ddl = DdlSqlFactory.valueOf(dbType.name()).getDdl();
+ String yesterday = DateUtil.format(DateUtil.yesterday(), DatePattern.PURE_DATE_FORMAT);
+ // 查询表有没有存在
+ if (!existTable(statement, yesterday)) {
+ backTable(statement, yesterday);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 功能描述: 每日备份操作
+ */
+ public void backTable(Statement statement, String yesterday) throws SQLException {
+ // 先备份
+ statement.execute(ddl.backTable(yesterday));
+ // 再创建表
+ statement.execute(ddl.createTable());
+ }
+
+ /**
+ * 功能描述: 是否存在表
+ */
+ private boolean existTable(Statement statement, String yesterday) throws SQLException {
+ ResultSet resultSet = statement.executeQuery(ddl.queryTable(yesterday));
+ resultSet.next();
+ return resultSet.getInt(1) == 1;
+ }
+
+}
diff --git a/logkuangjia/src/main/java/com/woniu/logger/aspect/RequestLogAspect.java b/logkuangjia/src/main/java/com/woniu/logger/aspect/RequestLogAspect.java
new file mode 100644
index 0000000..4599779
--- /dev/null
+++ b/logkuangjia/src/main/java/com/woniu/logger/aspect/RequestLogAspect.java
@@ -0,0 +1,90 @@
+package com.woniu.logger.aspect;
+
+
+import cn.hutool.core.net.NetUtil;
+import cn.hutool.json.JSONUtil;
+
+import com.woniu.logger.conf.LoggerConfig;
+import com.woniu.logger.conf.LoggerLevelEnum;
+import com.woniu.logger.entity.LoggerInfoEntity;
+import com.woniu.logger.service.ILoggerInfoService;
+import com.woniu.logger.util.HttpRequestUtil;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Optional;
+
+/**
+ * 功能描述: 日志切面
+ * 请求与响应参数日志记录框架
+ */
+@Order(99)
+@Aspect
+@Component
+public class RequestLogAspect {
+
+ @Autowired
+ private LoggerConfig loggerConfig;
+ @Autowired
+ private ILoggerInfoService loggerInfoService;
+
+ @Around("execution(* com.woniu.controller..*.*(..))")
+ public Object doAround(ProceedingJoinPoint point) throws Throwable {
+ // 如果没有开启,则直接返回
+ if (LoggerLevelEnum.NONE.equals(loggerConfig.getLevel())) {
+ return point.proceed();
+ }
+ long startTime = System.currentTimeMillis();
+ LoggerInfoEntity info = new LoggerInfoEntity();
+ // 设置url
+ info.setUrl(Optional.ofNullable((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).map(ServletRequestAttributes::getRequest).map(HttpServletRequest::getRequestURI).orElse(""));
+ // 设置类名
+ info.setClassName(point.getTarget().getClass().getName());
+ // 设置方法名
+ info.setMethodName(point.getSignature().getName());
+ // 设置请求IP地址
+ info.setReqIpAdr(HttpRequestUtil.getRealIpAddress());
+ // 设置响应IP地址
+ info.setRspIpAdr(NetUtil.getLocalhostStr());
+ // 设置请求头
+ info.setReqHeader(JSONUtil.toJsonStr(HttpRequestUtil.getHeader()));
+ // 设置请求体
+ info.setReqBody(JSONUtil.toJsonStr(point.getArgs()));
+ // 设置请求成功
+ info.setSuccessInd(Boolean.TRUE);
+ // 定义返回值
+ Object obj;
+ try {
+ Object result = point.proceed();
+ info.setRspBody(JSONUtil.toJsonStr(result));
+ obj = result;
+ } catch (Exception e) {
+ // 设置请求异常
+ info.setSuccessInd(Boolean.FALSE);
+ // 设置异常信息
+ info.setErrorMsg(e.getLocalizedMessage());
+ throw e;
+ } finally {
+ // 计算处理时间
+ info.setTotalTime(System.currentTimeMillis() - startTime);
+ // 如果为全部打印或正常打印,并且为正常标志,记录
+ if (LoggerLevelEnum.ALL.equals(loggerConfig.getLevel()) || (LoggerLevelEnum.PRINT.equals(loggerConfig.getLevel()) && info.getSuccessInd())) {
+ loggerInfoService.saveAsync(info);
+ }
+ // 如果为全部打印或者异常打印,并且为异常标志,记录
+ if (LoggerLevelEnum.ALL.equals(loggerConfig.getLevel()) || (LoggerLevelEnum.ERROR.equals(loggerConfig.getLevel())) && !info.getSuccessInd()) {
+ loggerInfoService.saveAsync(info);
+ }
+ }
+ return obj;
+ }
+
+}
+
diff --git a/logkuangjia/src/main/java/com/woniu/logger/conf/LoggerConfig.java b/logkuangjia/src/main/java/com/woniu/logger/conf/LoggerConfig.java
new file mode 100644
index 0000000..ead462d
--- /dev/null
+++ b/logkuangjia/src/main/java/com/woniu/logger/conf/LoggerConfig.java
@@ -0,0 +1,17 @@
+package com.woniu.logger.conf;
+
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "logger.project")
+public class LoggerConfig {
+
+ /** 定义日志级别 */
+ private LoggerLevelEnum level = LoggerLevelEnum.NONE;
+
+}
+
diff --git a/logkuangjia/src/main/java/com/woniu/logger/conf/LoggerLevelEnum.java b/logkuangjia/src/main/java/com/woniu/logger/conf/LoggerLevelEnum.java
new file mode 100644
index 0000000..caeb6f6
--- /dev/null
+++ b/logkuangjia/src/main/java/com/woniu/logger/conf/LoggerLevelEnum.java
@@ -0,0 +1,26 @@
+package com.woniu.logger.conf;
+
+
+/**
+ * 功能描述: 日志级别枚举
+ */
+public enum LoggerLevelEnum {
+
+ /**
+ * 不打印
+ */
+ NONE,
+ /**
+ * 打印正常
+ */
+ PRINT,
+ /**
+ * 打印异常
+ */
+ ERROR,
+ /**
+ * 全部打印
+ */
+ ALL,
+
+}
diff --git a/logkuangjia/src/main/java/com/woniu/logger/entity/LoggerInfoEntity.java b/logkuangjia/src/main/java/com/woniu/logger/entity/LoggerInfoEntity.java
new file mode 100644
index 0000000..6295a88
--- /dev/null
+++ b/logkuangjia/src/main/java/com/woniu/logger/entity/LoggerInfoEntity.java
@@ -0,0 +1,70 @@
+package com.woniu.logger.entity;
+
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+@Data
+@TableName(LoggerInfoEntity.TABLE_NAME)
+@ApiModel("日志信息")
+public class LoggerInfoEntity {
+
+ public static final String TABLE_NAME = "logger_info";
+
+ @ApiModelProperty("主键ID")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ @ApiModelProperty("访问的url")
+ @TableField("url")
+ private String url;
+
+ @ApiModelProperty("类名")
+ @TableField("class_name")
+ private String className;
+
+ @ApiModelProperty("方法名")
+ @TableField("method_name")
+ private String methodName;
+
+ @ApiModelProperty("请求的ip地址")
+ @TableField("req_ip_adr")
+ private String reqIpAdr;
+
+ @ApiModelProperty("响应的ip地址(集群提供)")
+ @TableField("rsp_ip_adr")
+ private String rspIpAdr;
+
+ @ApiModelProperty("成功标志")
+ @TableField("success_ind")
+ private Boolean successInd;
+
+ @ApiModelProperty("请求报文头")
+ @TableField("req_header")
+ private String reqHeader;
+
+ @ApiModelProperty("请求报文体")
+ @TableField("req_body")
+ private String reqBody;
+
+ @ApiModelProperty("响应报文体")
+ @TableField("rsp_body")
+ private String rspBody;
+
+ @ApiModelProperty("错误信息")
+ @TableField("error_msg")
+ private String errorMsg;
+
+ @ApiModelProperty("总耗时")
+ @TableField("total_time")
+ private Long totalTime;
+
+ @ApiModelProperty("创建时间")
+ @TableField(value = "create_time", fill = FieldFill.INSERT)
+ private LocalDate createTime;
+
+}
diff --git a/logkuangjia/src/main/java/com/woniu/logger/mapper/LoggerInfoMapper.java b/logkuangjia/src/main/java/com/woniu/logger/mapper/LoggerInfoMapper.java
new file mode 100644
index 0000000..ca7a618
--- /dev/null
+++ b/logkuangjia/src/main/java/com/woniu/logger/mapper/LoggerInfoMapper.java
@@ -0,0 +1,7 @@
+package com.woniu.logger.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.woniu.logger.entity.LoggerInfoEntity;
+
+public interface LoggerInfoMapper extends BaseMapper {
+}
diff --git a/logkuangjia/src/main/java/com/woniu/logger/service/ILoggerInfoService.java b/logkuangjia/src/main/java/com/woniu/logger/service/ILoggerInfoService.java
new file mode 100644
index 0000000..99970a1
--- /dev/null
+++ b/logkuangjia/src/main/java/com/woniu/logger/service/ILoggerInfoService.java
@@ -0,0 +1,29 @@
+package com.woniu.logger.service;
+
+/**
+ * @className: ILoggerInfoService
+ * @author: woniu
+ * @date: 2023/8/24
+ **/
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.woniu.logger.entity.LoggerInfoEntity;
+import org.springframework.scheduling.annotation.Async;
+
+/**
+ * 功能描述: 日志服务接口
+ */
+public interface ILoggerInfoService extends IService {
+
+ /**
+ * 功能描述: 异步保存
+ *
+ * @param info 日志信息
+ */
+ @Async
+ default void saveAsync(LoggerInfoEntity info) {
+ save(info);
+ }
+
+}
+
diff --git a/logkuangjia/src/main/java/com/woniu/logger/service/LoggerInfoServiceImpl.java b/logkuangjia/src/main/java/com/woniu/logger/service/LoggerInfoServiceImpl.java
new file mode 100644
index 0000000..6115f2c
--- /dev/null
+++ b/logkuangjia/src/main/java/com/woniu/logger/service/LoggerInfoServiceImpl.java
@@ -0,0 +1,12 @@
+package com.woniu.logger.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.woniu.logger.entity.LoggerInfoEntity;
+import com.woniu.logger.mapper.LoggerInfoMapper;
+import org.springframework.stereotype.Service;
+
+@Service
+public class LoggerInfoServiceImpl extends ServiceImpl implements ILoggerInfoService{
+
+
+}
diff --git a/logkuangjia/src/main/java/com/woniu/logger/sql/DdlSqlFactory.java b/logkuangjia/src/main/java/com/woniu/logger/sql/DdlSqlFactory.java
new file mode 100644
index 0000000..d468de1
--- /dev/null
+++ b/logkuangjia/src/main/java/com/woniu/logger/sql/DdlSqlFactory.java
@@ -0,0 +1,20 @@
+package com.woniu.logger.sql;
+
+import com.woniu.logger.sql.impl.MySQLDdlSql;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 功能描述: SQL执行ddl语句工厂
+ */
+@Getter
+@AllArgsConstructor
+public enum DdlSqlFactory {
+
+ MYSQL(new MySQLDdlSql()),
+ ;
+
+ private final IDdlSql ddl;
+
+}
+
diff --git a/logkuangjia/src/main/java/com/woniu/logger/sql/IDdlSql.java b/logkuangjia/src/main/java/com/woniu/logger/sql/IDdlSql.java
new file mode 100644
index 0000000..c6bddc1
--- /dev/null
+++ b/logkuangjia/src/main/java/com/woniu/logger/sql/IDdlSql.java
@@ -0,0 +1,29 @@
+package com.woniu.logger.sql;
+
+
+/**
+ * 功能描述: 数据库语句
+ */
+public interface IDdlSql {
+
+ /**
+ * 查询表是否存在
+ */
+ String queryTable(String date);
+
+ /**
+ * 建表语句
+ */
+ String createTable();
+
+ /**
+ * 备份表
+ */
+ String backTable(String date);
+
+ /**
+ * 删除表
+ */
+ String dropTable();
+
+}
diff --git a/logkuangjia/src/main/java/com/woniu/logger/sql/impl/MySQLDdlSql.java b/logkuangjia/src/main/java/com/woniu/logger/sql/impl/MySQLDdlSql.java
new file mode 100644
index 0000000..d251553
--- /dev/null
+++ b/logkuangjia/src/main/java/com/woniu/logger/sql/impl/MySQLDdlSql.java
@@ -0,0 +1,46 @@
+package com.woniu.logger.sql.impl;
+
+
+import cn.hutool.core.util.StrUtil;
+import com.woniu.logger.entity.LoggerInfoEntity;
+import com.woniu.logger.sql.IDdlSql;
+
+public class MySQLDdlSql implements IDdlSql {
+
+ @Override
+ public String queryTable(String date) {
+ return "select count(1) from information_schema.tables where table_name ='" + LoggerInfoEntity.TABLE_NAME + (StrUtil.isNotBlank(date) ? "_" + date : "") + "';";
+ }
+
+ @Override
+ public String createTable() {
+ return "create table " + LoggerInfoEntity.TABLE_NAME + "(" +
+ " `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',\n" +
+ " `url` varchar(500) COMMENT '访问的url',\n" +
+ " `class_name` varchar(500) COMMENT '类名',\n" +
+ " `method_name` varchar(100) COMMENT '方法名',\n" +
+ " `req_ip_adr` varchar(20) COMMENT '请求的ip地址',\n" +
+ " `rsp_ip_adr` varchar(20) COMMENT '响应的ip地址',\n" +
+ " `success_ind` tinyint COMMENT '成功标志',\n" +
+ " `req_header` text COMMENT '请求报文头',\n" +
+ " `req_body` text COMMENT '请求报文体',\n" +
+ " `rsp_body` text COMMENT '响应报文体',\n" +
+ " `error_msg` text COMMENT '错误信息',\n" +
+ " `total_time` Long COMMENT '总耗时',\n" +
+ " `create_time` datetime DEFAULT NULL COMMENT '创建时间',\n" +
+ " PRIMARY KEY (`id`) USING BTREE,\n" +
+ " KEY `idx_name` (`url`) USING BTREE\n" +
+ ") ENGINE=InnoDB COMMENT='日志信息';";
+ }
+
+ @Override
+ public String backTable(String date) {
+ return "rename table " + LoggerInfoEntity.TABLE_NAME + " to " + LoggerInfoEntity.TABLE_NAME + "_" + date + ";";
+ }
+
+ @Override
+ public String dropTable() {
+ return "drop table " + LoggerInfoEntity.TABLE_NAME + ";";
+ }
+
+}
diff --git a/logkuangjia/src/main/java/com/woniu/logger/util/HttpRequestUtil.java b/logkuangjia/src/main/java/com/woniu/logger/util/HttpRequestUtil.java
new file mode 100644
index 0000000..52cf8d5
--- /dev/null
+++ b/logkuangjia/src/main/java/com/woniu/logger/util/HttpRequestUtil.java
@@ -0,0 +1,88 @@
+package com.woniu.logger.util;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+/**
+ * 功能描述: 请求工具类
+ */
+public class HttpRequestUtil {
+
+ private static final String UNKNOWN = "unknown";
+ private static final String LOCALHOST_IP = "127.0.0.1";
+ // 客户端与服务器同为一台机器,获取的 ip 有时候是 ipv6 格式
+ private static final String LOCALHOST_IPV6 = "0:0:0:0:0:0:0:1";
+ private static final String SEPARATOR = ",";
+
+ public static HttpServletRequest getHttpServletRequest() {
+ ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+ if (servletRequestAttributes == null) {
+ return null;
+ }
+ return servletRequestAttributes.getRequest();
+ }
+
+ public static Map getHeader() {
+ HttpServletRequest request = getHttpServletRequest();
+ if (request == null) {
+ return new HashMap<>();
+ }
+ Map headerMap = new HashMap<>();
+ Enumeration headerNames = request.getHeaderNames();
+ while (headerNames.hasMoreElements()) {
+ String headerName = headerNames.nextElement();
+ headerMap.put(headerName, request.getHeader(headerName));
+ }
+ return headerMap;
+ }
+
+ public static String getRealIpAddress() {
+ HttpServletRequest request = getHttpServletRequest();
+ if (request == null) {
+ return "";
+ }
+ String ip = request.getHeader("x-forwarded-for");
+ if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
+ ip = request.getHeader("Proxy-Client-IP");
+ }
+ if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
+ ip = request.getHeader("X-Forwarded-For");
+ }
+ if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
+ ip = request.getHeader("WL-Proxy-Client-IP");
+ }
+ if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
+ ip = request.getHeader("X-Real-IP");
+ }
+ if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
+ ip = request.getRemoteAddr();
+ if (LOCALHOST_IP.equalsIgnoreCase(ip) || LOCALHOST_IPV6.equalsIgnoreCase(ip)) {
+ // 根据网卡取本机配置的 IP
+ InetAddress iNet = null;
+ try {
+ iNet = InetAddress.getLocalHost();
+ } catch (UnknownHostException e) {
+ e.printStackTrace();
+ }
+ if (iNet != null)
+ ip = iNet.getHostAddress();
+ }
+ }
+ // 对于通过多个代理的情况,分割出第一个 IP
+ if (ip != null && ip.length() > 15) {
+ if (ip.indexOf(SEPARATOR) > 0) {
+ ip = ip.substring(0, ip.indexOf(SEPARATOR));
+ }
+ }
+ return LOCALHOST_IPV6.equals(ip) ? LOCALHOST_IP : ip;
+ }
+
+}
diff --git a/logkuangjia/src/main/resources/application.properties b/logkuangjia/src/main/resources/application.properties
new file mode 100644
index 0000000..ed6229a
--- /dev/null
+++ b/logkuangjia/src/main/resources/application.properties
@@ -0,0 +1,57 @@
+#
+spring.application.name=www
+server.port=8081
+##1800s
+#server.servlet.session.timeout=1800
+#spring.jackson.time-zone=GMT+8
+#spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+#
+##Դ
+#spring.shardingsphere.datasource.names=m1,m2
+#
+spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8
+spring.datasource.username=root
+spring.datasource.password=123456
+spring.datasource.driver\class\name=com.mysql.cj.jdbc.Driver
+spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
+
+
+#spring.redis.host=192.168.56.10
+#spring.redis.port=6379
+#spring.redis.password=123456
+#
+#
+#spring.shardingsphere.datasource.m2.url=jdbc:mysql://127.0.0.1:3306/test2?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8
+#spring.shardingsphere.datasource.m2.username=root
+#spring.shardingsphere.datasource.m2.password=123456
+#spring.shardingsphere.datasource.m2.driver\class\name=com.mysql.cj.jdbc.Driver
+#spring.shardingsphere.datasource.m2.type=com.alibaba.druid.pool.DruidDataSource
+#
+## ָt_userݷֲݽڵ
+#spring.shardingsphere.sharding.tables.t_user.actual\data\nodes=m$->{1..2}.t_user_$->{1..2}
+#
+## ָt_userɲΪSNOWFLAKE
+#spring.shardingsphere.sharding.tables.t_user.key\generator.column=id
+#spring.shardingsphere.sharding.tables.t_user.key\generator.type=SNOWFLAKE
+#
+## ָt_userķֿԣֿƬͷƬ㷨
+#spring.shardingsphere.sharding.tables.t_user.database-strategy.inline.sharding\column=sex
+#spring.shardingsphere.sharding.tables.t_user.database-strategy.inline.algorithm\expression=m$->{sex % 2 + 1}
+#
+#
+## ָt_userķֱԣֱƬͷƬ㷨
+#spring.shardingsphere.sharding.tables.t_user.table\strategy.inline.sharding\column=id
+#spring.shardingsphere.sharding.tables.t_user.table\strategy.inline.algorithm\expression=t_user_$->{id % 2 + 1}
+#
+#
+## ̨־
+#logging.level.root=info
+#
+## sql־
+#spring.shardingsphere.props.sql.show=true
+#
+##mapperļɨ·
+#mybatis.mapper-locations=classpath:/mapper/*.xml
+#
+#
+#
diff --git a/logkuangjia/src/main/resources/application.yml b/logkuangjia/src/main/resources/application.yml
new file mode 100644
index 0000000..8dbeb4e
--- /dev/null
+++ b/logkuangjia/src/main/resources/application.yml
@@ -0,0 +1,18 @@
+#spring:
+# datasource:
+# type: com.alibaba.druid.pool.DruidDataSource
+# driverClassName: com.mysql.cj.jdbc.Driver
+# # 主库数据源
+# master:
+# url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+# username: root
+# password: 123456
+# slave:
+# url: jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+# username: root
+# password: 123456
+
+# 日志打印级别:不打印-NONE;打印正常-PRINT;打印异常-ERROR;全部打印-ALL
+logger:
+ project:
+ level: PRINT
\ No newline at end of file
diff --git a/logkuangjia/src/main/resources/ip2region/ip2region.xdb b/logkuangjia/src/main/resources/ip2region/ip2region.xdb
new file mode 100644
index 0000000..9f6502b
Binary files /dev/null and b/logkuangjia/src/main/resources/ip2region/ip2region.xdb differ
diff --git a/logkuangjia/src/main/resources/logback-spring.xml b/logkuangjia/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..9b029bd
--- /dev/null
+++ b/logkuangjia/src/main/resources/logback-spring.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ ${CONSOLE_LOG_PATTERN}
+
+ UTF-8
+
+
+
+
+
+
+
+
+
+
+
diff --git a/logkuangjia/src/main/resources/mapper/master/UserDaoMapper.xml b/logkuangjia/src/main/resources/mapper/master/UserDaoMapper.xml
new file mode 100644
index 0000000..846e3d0
--- /dev/null
+++ b/logkuangjia/src/main/resources/mapper/master/UserDaoMapper.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+ insert into t_user_1(id,name, sex) values (#{id},#{name}, #{sex})
+
+
+
+
+
+
+
diff --git a/logkuangjia/src/main/resources/mapper/slave/UserDaoMapper.xml b/logkuangjia/src/main/resources/mapper/slave/UserDaoMapper.xml
new file mode 100644
index 0000000..6500acb
--- /dev/null
+++ b/logkuangjia/src/main/resources/mapper/slave/UserDaoMapper.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+ insert into t_user_1(id,name, sex) values (#{id},#{name}, #{sex})
+
+
+
diff --git a/logkuangjia/src/main/resources/mybatis-config.xml b/logkuangjia/src/main/resources/mybatis-config.xml
new file mode 100644
index 0000000..b099e5d
--- /dev/null
+++ b/logkuangjia/src/main/resources/mybatis-config.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/logkuangjia/woniu-web.iml b/logkuangjia/woniu-web.iml
new file mode 100644
index 0000000..b2c1064
--- /dev/null
+++ b/logkuangjia/woniu-web.iml
@@ -0,0 +1,189 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file