Bladeren bron

first commit

1 week geleden
commit
63fcbc120a

+ 33 - 0
.gitignore

@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/

+ 105 - 0
pom.xml

@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.zhentao</groupId>
+    <artifactId>mazhongjunsale</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>mazhongjunsale</name>
+    <description>mazhongjunsale</description>
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <spring-boot.version>2.6.13</spring-boot.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.kafka</groupId>
+            <artifactId>spring-kafka</artifactId>
+            <version>2.8.0</version>
+        </dependency>
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.7.15</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.30</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <configuration>
+                    <mainClass>com.zhentao.MazhongjunsaleApplication</mainClass>
+                    <skip>true</skip>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>repackage</id>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 12 - 0
src/main/java/com/zhentao/MazhongjunsaleApplication.java

@@ -0,0 +1,12 @@
+package com.zhentao;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class MazhongjunsaleApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(MazhongjunsaleApplication.class, args);
+    }
+
+}

+ 20 - 0
src/main/java/com/zhentao/commons/KafkaMessage.java

@@ -0,0 +1,20 @@
+package com.zhentao.commons;
+
+import lombok.Data;
+
+@Data
+public class KafkaMessage {
+    private String msgId;
+    private String msgType;
+    private String content;
+
+    // constructors, getters and setters
+    public KafkaMessage() {
+    }
+
+    public KafkaMessage(String msgId, String msgType, String content) {
+        this.msgId = msgId;
+        this.msgType = msgType;
+        this.content = content;
+    }
+}

+ 14 - 0
src/main/java/com/zhentao/config/KafkaConsumerConfig.java

@@ -0,0 +1,14 @@
+package com.zhentao.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.kafka.support.converter.JsonMessageConverter;
+import org.springframework.kafka.support.converter.RecordMessageConverter;
+
+@Configuration
+public class KafkaConsumerConfig {
+    @Bean
+    public RecordMessageConverter converter() {
+        return new JsonMessageConverter();
+    }
+}

+ 21 - 0
src/main/java/com/zhentao/controller/Controller.java

@@ -0,0 +1,21 @@
+package com.zhentao.controller;
+
+import com.zhentao.result.ResultVo;
+import com.zhentao.service.TestService;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+@RestController
+@RequestMapping("/api")
+public class Controller {
+    @Resource
+    private TestService service;
+    @RequestMapping("hello")
+    public ResultVo hello(Integer goodsId, HttpServletRequest request) {
+        ResultVo resultVo = service.checkSign(goodsId,request);
+        return resultVo;
+    }
+}

+ 49 - 0
src/main/java/com/zhentao/controller/Diff.java

@@ -0,0 +1,49 @@
+package com.zhentao.controller;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import org.springframework.util.DigestUtils;
+
+import java.util.Map;
+import java.util.TreeMap;
+
+public class Diff {
+    private static final String APP_ID = "test_app";
+    private static final String APP_SECRET = "12";
+    private static final String API_URL = "http://localhost:8080/api/hello";
+    public static void main(String[] args) {
+        Long goodsId = 123L;
+        String reqId = "req_123";
+        Long reqTime = System.currentTimeMillis();
+        Map<String, String> params = new TreeMap<>(); // TreeMap自动按key排序
+        params.put("goodsId", goodsId.toString());
+        params.put("reqId", reqId);
+        params.put("reqTime", reqTime.toString());
+        params.put("appId", APP_ID);
+        StringBuilder sb = new StringBuilder();
+        for (Map.Entry<String,String> entry:params.entrySet()) {
+            sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
+        }
+        sb.append(APP_SECRET);
+        String sign = DigestUtils.md5DigestAsHex(sb.toString().getBytes());
+        HttpResponse response = HttpRequest.get(API_URL + "?goodsId=" + goodsId)
+                .header("reqId", reqId)
+                .header("reqTime", reqTime.toString())
+                .header("appId", APP_ID)
+                .header("sign", sign)
+                .execute();
+        JSONObject json = JSONUtil.parseObj(response.body());
+        String status = json.getStr("status");
+        if ("200".equals(status)) {
+            System.out.println("响应结果: " + json);
+            System.out.println("商品名称: " + json.getStr("data"));
+        }else {
+            System.err.println("响应结果: " + json);
+            System.err.println("请求失败,状态码: " + status);
+        }
+
+
+    }
+}

+ 25 - 0
src/main/java/com/zhentao/result/ResultVo.java

@@ -0,0 +1,25 @@
+package com.zhentao.result;
+
+import lombok.Data;
+
+@Data
+public class ResultVo {
+    private Integer status;
+    private String msg;
+    private Object Data;
+    public static ResultVo success(String msg, Object object) {
+        ResultVo result = new ResultVo();
+        result.setStatus(200);
+        result.setMsg(msg);
+        result.setData(object);
+        return result;
+    }
+
+    public static ResultVo failed(String msg, Object object) {
+        ResultVo result = new ResultVo();
+        result.setStatus(1002);
+        result.setMsg(msg);
+        result.setData(object);
+        return result;
+    }
+}

+ 9 - 0
src/main/java/com/zhentao/service/TestService.java

@@ -0,0 +1,9 @@
+package com.zhentao.service;
+
+import com.zhentao.result.ResultVo;
+
+import javax.servlet.http.HttpServletRequest;
+
+public interface TestService {
+    ResultVo checkSign(Integer goodsId, HttpServletRequest request);
+}

+ 40 - 0
src/main/java/com/zhentao/service/impl/TestServiceImpl.java

@@ -0,0 +1,40 @@
+package com.zhentao.service.impl;
+
+import com.zhentao.result.ResultVo;
+import com.zhentao.service.TestService;
+import org.springframework.stereotype.Service;
+import org.springframework.util.DigestUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+import java.util.TreeMap;
+
+@Service
+public class TestServiceImpl implements TestService {
+    private static final String APP_SECRET = "123";
+    @Override
+    public ResultVo checkSign(Integer goodsId, HttpServletRequest request) {
+        String reqId = request.getHeader("reqId");
+        String reqTime = request.getHeader("reqTime");
+        String appId = request.getHeader("appId");
+        String sign = request.getHeader("sign");
+        Map<String, String> map = new TreeMap<>();
+        map.put("goodsId", goodsId.toString());
+        map.put("reqId", reqId);
+        map.put("reqTime", reqTime.toString());
+        map.put("appId", appId);
+        StringBuilder sb = new StringBuilder();
+        for (Map.Entry<String, String> entry : map.entrySet()) {
+            sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
+        }
+        sb.append(APP_SECRET); // 最后拼接appSecret
+        String s = DigestUtils.md5DigestAsHex(sb.toString().getBytes());
+        if (!s.equalsIgnoreCase(sign)) {
+            System.err.println("签名验证失败");
+            return ResultVo.failed("签名验证失败",null);
+        }
+        System.err.println("签名验证成功");
+        // 5. 返回成功结果
+        return ResultVo.success("RemiK80",sb.toString());
+    }
+}

+ 13 - 0
src/main/java/com/zhentao/task/KafkaMessageConsumer.java

@@ -0,0 +1,13 @@
+package com.zhentao.task;
+
+import com.zhentao.commons.KafkaMessage;
+import org.springframework.kafka.annotation.KafkaListener;
+import org.springframework.stereotype.Component;
+
+@Component
+public class KafkaMessageConsumer {
+    @KafkaListener(topics = "test-topic",groupId = "test-group")
+    public void consume(KafkaMessage message){
+        System.out.println("收到消息: " + message);
+    }
+}

+ 37 - 0
src/main/java/com/zhentao/util/OrderId.java

@@ -0,0 +1,37 @@
+package com.zhentao.util;
+
+import redis.clients.jedis.Jedis;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+
+public class OrderId {
+    private static final String REDIS_HOST = "localhost";
+    private static final int REDIS_PORT = 6379;
+    private static final String ORDER_KEY_PREFIX = "order:counter:";
+    private static final int ORDER_SEQ_LENGTH = 5;
+
+    public static void main(String[] args) {
+        String orderNumber = generateOrderNumber("ORD");
+        String orderNumber2 = generateOrderNumber("ORD");
+        System.out.println("生成的订单号: " + orderNumber);
+        System.out.println("生成的订单号: " + orderNumber2);
+    }
+
+    public static String generateOrderNumber(String prefix) {
+        Jedis jedis = new Jedis(REDIS_HOST, REDIS_PORT);
+        // 获取当前日期,格式化为yyMMdd
+        String datePart = LocalDateTime.now()
+                .format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
+        // Redis键名,按日期分隔计数器
+        String redisKey = ORDER_KEY_PREFIX + datePart;
+        // 原子递增并获取序列号
+        long seq = jedis.incr(redisKey);
+        // 格式化序列号,不足长度时前补零
+        String seqPart = String.format("%0" + ORDER_SEQ_LENGTH + "d", seq);
+        // 组合完整订单号: 前缀+日期+序列号
+        return prefix + datePart + seqPart;
+    }
+}
+

+ 18 - 0
src/main/resources/application.yml

@@ -0,0 +1,18 @@
+server:
+  port: 8080
+spring:
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai
+    username: root
+    password: Mm20021203
+  kafka:
+    bootstrap-servers: localhost:9092
+    # 消费者配置
+    consumer:
+      group-id: my-group
+      auto-offset-reset: earliest
+      enable-auto-commit: false
+      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
+      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
+

+ 13 - 0
src/test/java/com/zhentao/MazhongjunsaleApplicationTests.java

@@ -0,0 +1,13 @@
+package com.zhentao;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class MazhongjunsaleApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}