zhijiezhao před 2 roky
rodič
revize
673bbf6a3d

+ 5 - 1
pom.xml

@@ -30,7 +30,11 @@
     </dependencyManagement>
 
     <dependencies>
-		<dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+        <dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-web</artifactId>
 		</dependency>

+ 2 - 0
src/main/java/com/caimei365/commodity/CommodityApplication.java

@@ -3,6 +3,7 @@ package com.caimei365.commodity;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 
 /**
  * `@EnableEurekaClient`: 声明一个Eureka客户端,只能注册到Eureka Server
@@ -13,6 +14,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  */
 @EnableDiscoveryClient
 @SpringBootApplication
+@EnableFeignClients(basePackages = {"com.caimei365.commodity.feign"})
 public class CommodityApplication {
 
     public static void main(String[] args) {

+ 15 - 0
src/main/java/com/caimei365/commodity/annotation/IpSave.java

@@ -0,0 +1,15 @@
+package com.caimei365.commodity.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * @author Administrator
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface IpSave {
+
+    String saveName();
+
+}

+ 75 - 0
src/main/java/com/caimei365/commodity/annotation/IpSaveAspect.java

@@ -0,0 +1,75 @@
+package com.caimei365.commodity.annotation;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.caimei365.commodity.feign.ToolsFeign;
+import com.caimei365.commodity.model.dto.MessageDto;
+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 org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
+import org.springframework.data.redis.core.RedisCallback;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.expression.EvaluationContext;
+import org.springframework.expression.Expression;
+import org.springframework.expression.ExpressionParser;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.expression.spel.support.StandardEvaluationContext;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import redis.clients.jedis.commands.JedisCommands;
+import redis.clients.jedis.params.SetParams;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+
+
+/**
+ */
+@Slf4j
+@Aspect
+@Component
+public class IpSaveAspect {
+
+    @Resource
+    private ToolsFeign toolsFeign;
+    /**
+     * 切入点,根据自定义IpSave实际路径进行调整
+     */
+    @Pointcut("@annotation(com.caimei365.commodity.annotation.IpSave)")
+    public void executeIdempotent() {
+    }
+
+    @Around("executeIdempotent()")
+    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
+      	//获取方法对象
+        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
+        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
+        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
+        HttpServletRequest request = servletRequestAttributes.getRequest();
+        // ip
+        String remoteAddr = request.getRemoteAddr();
+        // 接口路径
+        String requestURI = request.getRequestURI();
+        // 接口真实发送参数
+        String queryString = request.getQueryString();
+        //获取自定义注解
+        IpSave ipSave = method.getAnnotation(IpSave.class);
+        // 访问名 注解的值
+        String s = ipSave.saveName();
+
+        //异步给mq存
+        toolsFeign.sendCommonMessage("IpSave","你好",null,null,1,null,null);
+
+        return joinPoint.proceed();
+    }
+}
+

+ 3 - 0
src/main/java/com/caimei365/commodity/controller/CouponApi.java

@@ -1,6 +1,7 @@
 package com.caimei365.commodity.controller;
 
 import com.caimei365.commodity.annotation.Idempotent;
+import com.caimei365.commodity.annotation.IpSave;
 import com.caimei365.commodity.model.ResponseJson;
 import com.caimei365.commodity.model.dto.CollarCouponsDto;
 import com.caimei365.commodity.model.dto.RedeemCouponsDto;
@@ -42,6 +43,7 @@ public class CouponApi {
             @ApiImplicitParam(required = false, name = "pageSize", value = "每页数量")
     })
     @GetMapping("/center")
+    @IpSave(saveName = "领券中心")
     public ResponseJson<PageInfo<CouponVo>> couponCenter(Integer userId, Integer status,
                                                          @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
                                                          @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
@@ -97,6 +99,7 @@ public class CouponApi {
 
     @ApiOperation("领取优惠券")
     @PostMapping("/collar")
+    @IpSave(saveName = "领取优惠券")
     @Idempotent(prefix = "idempotent_collarCoupons", keys = {"#couponsDto"}, expire = 5)
     public ResponseJson<String> collarCoupons(CollarCouponsDto couponsDto) {
         if (couponsDto.getCouponId() == null || couponsDto.getSource() == null || couponsDto.getUserId() == null) {

+ 2 - 0
src/main/java/com/caimei365/commodity/controller/ProductPageApi.java

@@ -1,5 +1,6 @@
 package com.caimei365.commodity.controller;
 
+import com.caimei365.commodity.annotation.IpSave;
 import com.caimei365.commodity.annotation.Statistics;
 import com.caimei365.commodity.model.ResponseJson;
 import com.caimei365.commodity.model.po.AnnouncementPo;
@@ -228,6 +229,7 @@ public class ProductPageApi {
             @ApiImplicitParam(required = false, name = "userId", value = "用户id"),
             @ApiImplicitParam(required = false, name = "productId", value = "商品Id")
     })
+    @IpSave(saveName = "详情")
     @Statistics(prefix = "statistics_details", field = "productId")
     @GetMapping("/product/details")
     public ResponseJson<ProductDetailVo> getProductDetails(Integer productId, Integer userId) {

+ 23 - 0
src/main/java/com/caimei365/commodity/feign/ToolsFeign.java

@@ -0,0 +1,23 @@
+package com.caimei365.commodity.feign;
+
+import com.caimei365.commodity.model.dto.MessageDto;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/9/8
+ */
+@FeignClient("CAIMEI365-CLOUD-TOOLS")
+public interface ToolsFeign {
+    /**
+     * 请求发消息
+     */
+    @PostMapping("/tools/mq/send")
+    String sendCommonMessage(@RequestParam String topic, @RequestParam String content, @RequestParam String tag, @RequestParam Integer sort, @RequestParam Integer async, @RequestParam Integer oneway, @RequestParam Integer delay);
+
+}

+ 58 - 0
src/main/java/com/caimei365/commodity/model/dto/MessageDto.java

@@ -0,0 +1,58 @@
+package com.caimei365.commodity.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/6/17
+ */
+@ApiModel("发送消息接收参数")
+@Data
+public class MessageDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 消息主题
+     */
+    @NotNull
+    @ApiModelProperty("消息主题")
+    private String topic;
+    /**
+     * 消息内容
+     */
+    @NotNull
+    @ApiModelProperty("消息内容")
+    private String content;
+    /**
+     * 消息标签(可选)
+     */
+    @ApiModelProperty("消息标签(可选)")
+    private String tag;
+    /**
+     * 有序消息(可选)
+     */
+    @ApiModelProperty("有序消息(可选):1是,0否")
+    private Integer sort;
+    /**
+     * 异步消息(可选)
+     */
+    @ApiModelProperty("异步消息(可选):1是,0否")
+    private Integer async;
+    /**
+     * 单向消息(可选)
+     */
+    @ApiModelProperty("单向消息(可选):1是,0否")
+    private Integer oneway;
+    /**
+     * 延时消息(可选)
+     */
+    @ApiModelProperty("延时消息(可选),延时等级:1-18,0否,对应时间依次:1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h")
+    private Integer delay;
+
+}