Browse Source

app基本开发完成

xudm 2 months ago
parent
commit
6fb5855133

+ 6 - 0
pom.xml

@@ -62,6 +62,12 @@
             <artifactId>spring-boot-starter-validation</artifactId>
         </dependency>
 
+        <!--  aop      -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+
         <!--  redis      -->
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 110 - 0
src/main/java/com/xs/core/common/aspect/ApiLogAdvice.java

@@ -0,0 +1,110 @@
+//package com.xs.core.common.aspect;
+//
+//import com.alibaba.fastjson2.JSON;
+//import com.alibaba.fastjson2.JSONWriter;
+//import com.xs.core.model.log.entity.ApiRequestLog;
+//import com.xs.core.service.log.IApiRequestLogService;
+//import jakarta.servlet.http.HttpServletRequest;
+//import jakarta.servlet.http.HttpServletResponse;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.core.MethodParameter;
+//import org.springframework.core.annotation.Order;
+//import org.springframework.http.HttpInputMessage;
+//import org.springframework.http.MediaType;
+//import org.springframework.http.converter.HttpMessageConverter;
+//import org.springframework.http.server.ServerHttpRequest;
+//import org.springframework.http.server.ServerHttpResponse;
+//import org.springframework.http.server.ServletServerHttpRequest;
+//import org.springframework.http.server.ServletServerHttpResponse;
+//import org.springframework.web.bind.annotation.ControllerAdvice;
+//import org.springframework.web.context.request.RequestContextHolder;
+//import org.springframework.web.context.request.ServletRequestAttributes;
+//import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdviceAdapter;
+//import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
+//
+//import java.io.IOException;
+//import java.lang.reflect.Type;
+//import java.time.LocalDateTime;
+//import java.time.ZoneOffset;
+//import java.util.concurrent.CompletableFuture;
+//
+//@ControllerAdvice
+//@Slf4j
+//@Order(10)
+//public class ApiLogAdvice extends RequestBodyAdviceAdapter implements ResponseBodyAdvice<Object> {
+//
+//    @Autowired
+//    private IApiRequestLogService logService;
+//
+//    private ThreadLocal<ApiRequestLog> apiLogThreadLocal = new ThreadLocal<>();
+//
+//    @Override
+//    public boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
+//        return true;
+//    }
+//
+//    @Override
+//    public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
+//        ApiRequestLog log = new ApiRequestLog();
+//        log.setRequestTime(LocalDateTime.now());
+//        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+//        if (attributes != null) {
+//            HttpServletRequest request = attributes.getRequest();
+//            log.setRequestMethod(request.getMethod());
+//            log.setRequestUrl(request.getRequestURI());
+//            log.setIpAddress(request.getRemoteAddr());
+//            log.setUserAgent(request.getHeader("User-Agent"));
+//        }
+//        apiLogThreadLocal.set(log);
+//        return super.beforeBodyRead(inputMessage, parameter, targetType, converterType);
+//    }
+//
+//    @Override
+//    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
+//        return true;
+//    }
+//
+//    @Override
+//    public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
+//        ApiRequestLog log = apiLogThreadLocal.get();
+//        log.setRequestParams(objectToJson(body));
+//        return body;
+//    }
+//
+//    @Override
+//    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest servletRequest, ServerHttpResponse servletResponse) {
+//        ApiRequestLog log1 = apiLogThreadLocal.get();
+//        ServletServerHttpRequest request = (ServletServerHttpRequest) servletRequest;
+//        ServletServerHttpResponse response = (ServletServerHttpResponse) servletResponse;
+//        HttpServletRequest httpServletRequest = request.getServletRequest();
+//        HttpServletResponse httpServletResponse = response.getServletResponse();
+//        if (log1 != null) {
+//            log1.setResponseBody(objectToJson(body));
+//            log1.setResponseStatus(httpServletResponse.getStatus());
+//            log1.setExecutionTime(System.currentTimeMillis() - log1.getRequestTime().toInstant(ZoneOffset.UTC).toEpochMilli());
+//            saveLog(log1);
+//            apiLogThreadLocal.remove();
+//        }
+//        return body;
+//    }
+//
+//    private void saveLog(ApiRequestLog log1) {
+//        try {
+//            CompletableFuture.runAsync(() -> {
+//                logService.save(log1);
+//            });
+//        } catch (Exception e) {
+//            log.error("Failed to save API log", e);
+//        }
+//    }
+//
+//    private String objectToJson(Object obj) {
+//        try {
+//            return JSON.toJSONString(obj, JSONWriter.Feature.WriteMapNullValue);
+//        } catch (Exception e) {
+//            log.error("Error converting object to JSON", e);
+//            return null;
+//        }
+//    }
+//}

+ 94 - 0
src/main/java/com/xs/core/common/aspect/ApiLogAspect.java

@@ -0,0 +1,94 @@
+//package com.xs.core.common.aspect;
+//
+//import com.alibaba.fastjson2.JSON;
+//import com.alibaba.fastjson2.JSONWriter;
+//import com.xs.core.common.content.UserContext;
+//import com.xs.core.common.content.UserContextHolder;
+//import com.xs.core.model.log.entity.ApiRequestLog;
+//import com.xs.core.service.log.IApiRequestLogService;
+//import jakarta.servlet.http.HttpServletRequest;
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.commons.lang3.exception.ExceptionUtils;
+//import org.aspectj.lang.ProceedingJoinPoint;
+//import org.aspectj.lang.annotation.Around;
+//import org.aspectj.lang.annotation.Aspect;
+//import org.aspectj.lang.reflect.MethodSignature;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.http.HttpStatus;
+//import org.springframework.stereotype.Component;
+//
+//import java.time.LocalDateTime;
+//import java.util.HashMap;
+//import java.util.Map;
+//import java.util.concurrent.CompletableFuture;
+//
+////@Aspect
+////@Component
+//@Slf4j
+//public class ApiLogAspect {
+////    @Autowired
+////    private IApiRequestLogService logService;
+////
+////    @Autowired
+////    private HttpServletRequest request;
+//
+////    @Around("execution(* com.xs.core.controller..*.*(..))")
+//    public Object logApiRequest(ProceedingJoinPoint joinPoint) throws Throwable {
+//        long startTime = System.currentTimeMillis();
+//
+//
+//        ApiRequestLog log1 = new ApiRequestLog();
+//        log1.setRequestTime(LocalDateTime.now());
+//        log1.setRequestMethod(request.getMethod());
+//        log1.setRequestUrl(request.getRequestURI());
+//        log1.setIpAddress(request.getRemoteAddr());
+//        log1.setUserAgent(request.getHeader("User-Agent"));
+//        UserContext context = UserContextHolder.getContext();
+//        if (context != null) {
+//            log1.setUserId(context.getId());
+//        }
+//        // 获取方法参数
+//        Object[] args = joinPoint.getArgs();
+//        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+//        String[] parameterNames = signature.getParameterNames();
+//
+//        // 记录请求参数
+//        Map<String, Object> requestParams = new HashMap<>();
+//        for (int i = 0; i < args.length; i++) {
+//            requestParams.put(parameterNames[i], args[i]);
+//        }
+//        log1.setRequestParams(objectToJson(requestParams));
+//
+//        Object result = null;
+//        try {
+//            result = joinPoint.proceed();
+//            log1.setResponseStatus(HttpStatus.OK.value());
+//            log1.setResponseBody(objectToJson(result));
+//        } catch (Exception e) {
+//            log1.setResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
+//            log1.setErrorMessage(ExceptionUtils.getStackTrace(e));
+//            log1.setResponseBody(objectToJson(e));
+//            result = e;  // 将异常赋值给 result,以便后续可能的处理
+//        } finally {
+//            log1.setExecutionTime(System.currentTimeMillis() - startTime);
+//            //异步保存日志
+//            CompletableFuture.runAsync(() -> {
+//                logService.save(log1);
+//            });
+//        }
+//        // 如果发生了异常,在这里重新抛出
+//        if (result instanceof Throwable) {
+//            throw (Throwable) result;
+//        }
+//        return result;
+//    }
+//
+//    private String objectToJson(Object obj) {
+//        try {
+//            return JSON.toJSONString(obj, JSONWriter.Feature.WriteMapNullValue);
+//        } catch (Exception e) {
+//            log.error("Error converting object to JSON", e);
+//            return null;
+//        }
+//    }
+//}

+ 16 - 0
src/main/java/com/xs/core/mapper/log/ApiRequestLogMapper.java

@@ -0,0 +1,16 @@
+package com.xs.core.mapper.log;
+
+import com.xs.core.model.log.entity.ApiRequestLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 接口请求日志表 Mapper 接口
+ * </p>
+ *
+ * @author xudm
+ * @since 2024-12-23
+ */
+public interface ApiRequestLogMapper extends BaseMapper<ApiRequestLog> {
+
+}

+ 72 - 0
src/main/java/com/xs/core/model/log/entity/ApiRequestLog.java

@@ -0,0 +1,72 @@
+package com.xs.core.model.log.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 接口请求日志表
+ * </p>
+ *
+ * @author xudm
+ * @since 2024-12-23
+ */
+@Getter
+@Setter
+@TableName("b_api_request_log")
+public class ApiRequestLog extends Model<ApiRequestLog> {
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @TableField("request_time")
+    private LocalDateTime requestTime;
+
+    @TableField("request_method")
+    private String requestMethod;
+
+    @TableField("request_url")
+    private String requestUrl;
+
+    @TableField("request_params")
+    private String requestParams;
+
+    @TableField("request_body")
+    private String requestBody;
+
+    @TableField("response_status")
+    private Integer responseStatus;
+
+    @TableField("response_body")
+    private String responseBody;
+
+    @TableField("ip_address")
+    private String ipAddress;
+
+    @TableField("user_agent")
+    private String userAgent;
+
+    @TableField("execution_time")
+    private Long executionTime;
+
+    @TableField("user_id")
+    private Long userId;
+
+    @TableField("error_message")
+    private String errorMessage;
+
+    @TableField("created_at")
+    private LocalDateTime createdAt;
+
+    @Override
+    public Serializable pkVal() {
+        return this.id;
+    }
+}

+ 1 - 1
src/main/java/com/xs/core/model/task/resp/TaskInfoResp.java

@@ -13,7 +13,7 @@ public class TaskInfoResp implements Serializable {
      * id
      */
     @Schema(description = "任务id")
-    private Long id;
+    private String id;
 
     /**
      * 任务名称

+ 0 - 1
src/main/java/com/xs/core/model/user/req/AppLoginReq.java

@@ -14,7 +14,6 @@ public class AppLoginReq {
     private String lastName;
 
     @Schema(description = "tg小程序用户id", example = "7678353292")
-    @NotBlank(message = "tg小程序用户id不能为空")
     private String id;
 
     @Schema(description = "语言编码", example = "zh-hans")

+ 20 - 0
src/main/java/com/xs/core/service/Impl/log/ApiRequestLogServiceImpl.java

@@ -0,0 +1,20 @@
+package com.xs.core.service.Impl.log;
+
+import com.xs.core.model.log.entity.ApiRequestLog;
+import com.xs.core.mapper.log.ApiRequestLogMapper;
+import com.xs.core.service.log.IApiRequestLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 接口请求日志表 服务实现类
+ * </p>
+ *
+ * @author xudm
+ * @since 2024-12-23
+ */
+@Service
+public class ApiRequestLogServiceImpl extends ServiceImpl<ApiRequestLogMapper, ApiRequestLog> implements IApiRequestLogService {
+
+}

+ 1 - 6
src/main/java/com/xs/core/service/Impl/task/TaskServiceImpl.java

@@ -58,7 +58,7 @@ public class TaskServiceImpl implements TaskService {
             newRecord.setCreateTime(LocalDateTime.now());
             newRecord.setStartTime(LocalDateTime.now());
             newRecord.setRewardAmount(taskInfo.getGoldCoin());
-            taskRecordService.save(record);
+            taskRecordService.save(newRecord);
         } else {
             //说明任务已经开始 根据任务状态进行处理
             Integer status = record.getStatus();
@@ -67,11 +67,6 @@ public class TaskServiceImpl implements TaskService {
                 record.setStatus(2);
                 record.setUpdateTime(LocalDateTime.now());
                 taskRecordService.updateById(record);
-            } else if (status == 2) {
-                //说明任务已经完成 领取奖励
-                record.setStatus(3);
-                record.setUpdateTime(LocalDateTime.now());
-                taskRecordService.updateById(record);
                 //领取奖励
                 walletService.coinTransaction(CoinTransactionTypeEnum.ADD, CoinTransactionCategoryEnum.TASK_REWARDS, "任务奖励", "任务奖励", new BigDecimal(record.getRewardAmount()), userId);
             }

+ 16 - 0
src/main/java/com/xs/core/service/log/IApiRequestLogService.java

@@ -0,0 +1,16 @@
+package com.xs.core.service.log;
+
+import com.xs.core.model.log.entity.ApiRequestLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 接口请求日志表 服务类
+ * </p>
+ *
+ * @author xudm
+ * @since 2024-12-23
+ */
+public interface IApiRequestLogService extends IService<ApiRequestLog> {
+
+}

+ 2 - 2
src/main/java/com/xs/core/utils/MyGenerator.java

@@ -25,7 +25,7 @@ import java.util.Map;
 public class MyGenerator {
 
     //数据库连接信息
-    static String url = "jdbc:mysql://192.168.241.131:3306/continew?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai",
+    static String url = "jdbc:mysql://192.168.241.132:3306/continew?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai",
             username = "continew",
             password = "continew123456";
 
@@ -57,7 +57,7 @@ public class MyGenerator {
 
     public static void main(String[] args) {
         // 项目名 例如app  web
-        generatorByBusinessModule("task", new String[]{"b_user_task_record", "b_task_info"});
+        generatorByBusinessModule("log", new String[]{"b_api_request_log"});
     }
 
     /**