diff --git a/.gitignore b/.gitignore
index 86cd45e..f657956 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,4 +11,5 @@
.idea
enlish-service/target
enlish-service/src/test
-enlish-framework/enlish-common/target
\ No newline at end of file
+enlish-framework/enlish-common/target
+enlish-framework/enlish-spring-boot-starter-biz-operationlog/target
\ No newline at end of file
diff --git a/enlish-framework/enlish-spring-boot-starter-biz-operationlog/pom.xml b/enlish-framework/enlish-spring-boot-starter-biz-operationlog/pom.xml
new file mode 100644
index 0000000..38c3dc4
--- /dev/null
+++ b/enlish-framework/enlish-spring-boot-starter-biz-operationlog/pom.xml
@@ -0,0 +1,31 @@
+
+ 4.0.0
+
+
+ com.yinlihupo
+ enlish-framework
+ ${revision}
+
+
+
+ jar
+
+ enlish-spring-boot-starter-biz-operationlog
+ ${project.artifactId}
+ 接口日志组件
+
+
+
+ com.yinlihupo
+ enlish-common
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
+
+
+
diff --git a/enlish-framework/enlish-spring-boot-starter-biz-operationlog/src/main/java/com/yinlihupo/framework/biz/operationlog/aspect/ApiOperationLog.java b/enlish-framework/enlish-spring-boot-starter-biz-operationlog/src/main/java/com/yinlihupo/framework/biz/operationlog/aspect/ApiOperationLog.java
new file mode 100644
index 0000000..88e7bed
--- /dev/null
+++ b/enlish-framework/enlish-spring-boot-starter-biz-operationlog/src/main/java/com/yinlihupo/framework/biz/operationlog/aspect/ApiOperationLog.java
@@ -0,0 +1,16 @@
+package com.yinlihupo.framework.biz.operationlog.aspect;
+
+import java.lang.annotation.*;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD})
+@Documented
+public @interface ApiOperationLog {
+
+ /**
+ * API 功能描述
+ */
+ String description() default "";
+
+}
+
diff --git a/enlish-framework/enlish-spring-boot-starter-biz-operationlog/src/main/java/com/yinlihupo/framework/biz/operationlog/aspect/ApiOperationLogAspect.java b/enlish-framework/enlish-spring-boot-starter-biz-operationlog/src/main/java/com/yinlihupo/framework/biz/operationlog/aspect/ApiOperationLogAspect.java
new file mode 100644
index 0000000..983597f
--- /dev/null
+++ b/enlish-framework/enlish-spring-boot-starter-biz-operationlog/src/main/java/com/yinlihupo/framework/biz/operationlog/aspect/ApiOperationLogAspect.java
@@ -0,0 +1,87 @@
+
+package com.yinlihupo.framework.biz.operationlog.aspect;
+
+
+import com.yinlihupo.framework.common.util.JsonUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Aspect
+@Slf4j
+public class ApiOperationLogAspect {
+
+ /** 以自定义 @ApiOperationLog 注解为切点,凡是添加 @ApiOperationLog 的方法,都会执行环绕中的代码 */
+ @Pointcut("@annotation(com.yinlihupo.framework.biz.operationlog.aspect.ApiOperationLog)")
+ public void apiOperationLog() {}
+
+ /**
+ * 环绕
+ */
+ @Around("apiOperationLog()")
+ public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
+ // 请求开始时间
+ long startTime = System.currentTimeMillis();
+
+ // 获取被请求的类和方法
+ String className = joinPoint.getTarget().getClass().getSimpleName();
+ String methodName = joinPoint.getSignature().getName();
+
+ // 请求入参
+ Object[] args = joinPoint.getArgs();
+ // 入参转 JSON 字符串
+ String argsJsonStr = Arrays.stream(args).map(toJsonStr()).collect(Collectors.joining(", "));
+
+ // 功能描述信息
+ String description = getApiOperationLogDescription(joinPoint);
+
+ // 打印请求相关参数
+ log.info("====== 请求开始: [{}], 入参: {}, 请求类: {}, 请求方法: {} =================================== ",
+ description, argsJsonStr, className, methodName);
+
+ // 执行切点方法
+ Object result = joinPoint.proceed();
+
+ // 执行耗时
+ long executionTime = System.currentTimeMillis() - startTime;
+
+ // 打印出参等相关信息
+ log.info("====== 请求结束: [{}], 耗时: {}ms, 出参: {} =================================== ",
+ description, executionTime, JsonUtils.toJsonString(result));
+
+ return result;
+ }
+
+ /**
+ * 获取注解的描述信息
+ */
+ private String getApiOperationLogDescription(ProceedingJoinPoint joinPoint) {
+ // 1. 从 ProceedingJoinPoint 获取 MethodSignature
+ MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+
+ // 2. 使用 MethodSignature 获取当前被注解的 Method
+ Method method = signature.getMethod();
+
+ // 3. 从 Method 中提取 LogExecution 注解
+ ApiOperationLog apiOperationLog = method.getAnnotation(ApiOperationLog.class);
+
+ // 4. 从 LogExecution 注解中获取 description 属性
+ return apiOperationLog.description();
+ }
+
+ /**
+ * 转 JSON 字符串
+ */
+ private Function