From 28f0293588d9d2a969cca613a39616af040f2181 Mon Sep 17 00:00:00 2001 From: life <1733802689@qq.com> Date: Sun, 8 Oct 2023 08:58:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 8 + .idea/compiler.xml | 20 ++ .idea/encodings.xml | 7 + .idea/inspectionProfiles/Project_Default.xml | 36 ++ .idea/jarRepositories.xml | 25 ++ .idea/misc.xml | 14 + .idea/vcs.xml | 6 + Three.iml | 2 + holiday03-GTP/pom.xml | 57 ++++ .../java/com/sikadi/user/GTPApplication.java | 13 + .../sikadi/user/controller/GTPController.java | 37 +++ .../main/java/com/sikadi/user/dto/MsgDTO.java | 41 +++ .../sikadi/user/dto/request/RequestDTO.java | 86 +++++ .../sikadi/user/dto/response/ResponseDTO.java | 111 +++++++ .../user/listener/XfXhStreamClient.java | 145 ++++++++ .../user/listener/XfXhWebSocketListener.java | 69 ++++ .../com/sikadi/user/mapper/XfXhConfig.java | 48 +++ .../com/sikadi/user/service/GTPService.java | 6 + .../user/service/impl/GTPServiceImpl.java | 76 +++++ .../src/main/resources/bootstrap.yml | 40 +++ holiday03-GTP/target/classes/bootstrap.yml | 40 +++ .../com/sikadi/user/GTPApplication.class | Bin 0 -> 728 bytes .../user/controller/GTPController.class | Bin 0 -> 1180 bytes .../classes/com/sikadi/user/dto/MsgDTO.class | Bin 0 -> 3501 bytes .../dto/request/RequestDTO$HeaderDTO.class | Bin 0 -> 2564 bytes .../RequestDTO$ParameterDTO$ChatDTO.class | Bin 0 -> 3471 bytes .../dto/request/RequestDTO$ParameterDTO.class | Bin 0 -> 2263 bytes .../RequestDTO$PayloadDTO$MessageDTO.class | Bin 0 -> 2478 bytes .../dto/request/RequestDTO$PayloadDTO.class | Bin 0 -> 2404 bytes .../sikadi/user/dto/request/RequestDTO.class | Bin 0 -> 3840 bytes .../dto/response/ResponseDTO$HeaderDTO.class | Bin 0 -> 3453 bytes .../ResponseDTO$PayloadDTO$ChoicesDTO.class | Bin 0 -> 3341 bytes ...ponseDTO$PayloadDTO$UsageDTO$TextDTO.class | Bin 0 -> 3925 bytes .../ResponseDTO$PayloadDTO$UsageDTO.class | Bin 0 -> 2444 bytes .../dto/response/ResponseDTO$PayloadDTO.class | Bin 0 -> 3111 bytes .../user/dto/response/ResponseDTO.class | Bin 0 -> 3193 bytes .../user/listener/XfXhStreamClient.class | Bin 0 -> 7737 bytes .../user/listener/XfXhWebSocketListener.class | Bin 0 -> 4228 bytes .../com/sikadi/user/mapper/XfXhConfig.class | Bin 0 -> 5314 bytes .../com/sikadi/user/service/GTPService.class | Bin 0 -> 218 bytes .../user/service/impl/GTPServiceImpl.class | Bin 0 -> 3698 bytes .../target/holiday03-GTP-1.0-SNAPSHOT.jar | Bin 0 -> 35142 bytes .../target/maven-archiver/pom.properties | 3 + .../compile/default-compile/createdFiles.lst | 20 ++ .../compile/default-compile/inputFiles.lst | 10 + .../default-testCompile/createdFiles.lst | 0 .../default-testCompile/inputFiles.lst | 0 holiday03-common/pom.xml | 162 +++++++++ .../com/bwie/common/constants/Constants.java | 21 ++ .../bwie/common/constants/JwtConstants.java | 30 ++ .../bwie/common/constants/TokenConstants.java | 27 ++ .../com/bwie/common/result/PageResult.java | 37 +++ .../java/com/bwie/common/result/Result.java | 56 ++++ .../java/com/bwie/common/utils/DLXQueue.java | 77 +++++ .../com/bwie/common/utils/DelayedQueue.java | 77 +++++ .../java/com/bwie/common/utils/FastUtil.java | 55 ++++ .../java/com/bwie/common/utils/HttpUtils.java | 310 ++++++++++++++++++ .../java/com/bwie/common/utils/JwtUtils.java | 106 ++++++ .../java/com/bwie/common/utils/MsgUtil.java | 34 ++ .../java/com/bwie/common/utils/OssUtil.java | 153 +++++++++ .../com/bwie/common/utils/StringUtils.java | 71 ++++ .../com/bwie/common/utils/TelSmsUtils.java | 87 +++++ .../java/com/bwie/common/utils/TtlQueue.java | 66 ++++ .../com/bwie/common/constants/Constants.class | Bin 0 -> 651 bytes .../bwie/common/constants/JwtConstants.class | Bin 0 -> 544 bytes .../common/constants/TokenConstants.class | Bin 0 -> 526 bytes .../com/bwie/common/result/PageResult.class | Bin 0 -> 3491 bytes .../com/bwie/common/result/Result.class | Bin 0 -> 5080 bytes .../com/bwie/common/utils/DLXQueue.class | Bin 0 -> 3405 bytes .../com/bwie/common/utils/DelayedQueue.class | Bin 0 -> 4633 bytes .../com/bwie/common/utils/FastUtil.class | Bin 0 -> 2594 bytes .../com/bwie/common/utils/HttpUtils$1.class | Bin 0 -> 1011 bytes .../com/bwie/common/utils/HttpUtils.class | Bin 0 -> 10281 bytes .../com/bwie/common/utils/JwtUtils.class | Bin 0 -> 2871 bytes .../com/bwie/common/utils/MsgUtil.class | Bin 0 -> 2322 bytes .../com/bwie/common/utils/OssUtil.class | Bin 0 -> 5448 bytes .../com/bwie/common/utils/StringUtils.class | Bin 0 -> 1805 bytes .../com/bwie/common/utils/TelSmsUtils.class | Bin 0 -> 3742 bytes .../com/bwie/common/utils/TtlQueue.class | Bin 0 -> 2956 bytes .../target/holiday03-common-1.0-SNAPSHOT.jar | Bin 0 -> 27196 bytes .../target/maven-archiver/pom.properties | 3 + .../compile/default-compile/createdFiles.lst | 16 + .../compile/default-compile/inputFiles.lst | 15 + .../default-testCompile/createdFiles.lst | 0 .../default-testCompile/inputFiles.lst | 0 pom.xml | 71 ++++ 86 files changed, 2394 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 Three.iml create mode 100644 holiday03-GTP/pom.xml create mode 100644 holiday03-GTP/src/main/java/com/sikadi/user/GTPApplication.java create mode 100644 holiday03-GTP/src/main/java/com/sikadi/user/controller/GTPController.java create mode 100644 holiday03-GTP/src/main/java/com/sikadi/user/dto/MsgDTO.java create mode 100644 holiday03-GTP/src/main/java/com/sikadi/user/dto/request/RequestDTO.java create mode 100644 holiday03-GTP/src/main/java/com/sikadi/user/dto/response/ResponseDTO.java create mode 100644 holiday03-GTP/src/main/java/com/sikadi/user/listener/XfXhStreamClient.java create mode 100644 holiday03-GTP/src/main/java/com/sikadi/user/listener/XfXhWebSocketListener.java create mode 100644 holiday03-GTP/src/main/java/com/sikadi/user/mapper/XfXhConfig.java create mode 100644 holiday03-GTP/src/main/java/com/sikadi/user/service/GTPService.java create mode 100644 holiday03-GTP/src/main/java/com/sikadi/user/service/impl/GTPServiceImpl.java create mode 100644 holiday03-GTP/src/main/resources/bootstrap.yml create mode 100644 holiday03-GTP/target/classes/bootstrap.yml create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/GTPApplication.class create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/controller/GTPController.class create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/dto/MsgDTO.class create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/dto/request/RequestDTO$HeaderDTO.class create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/dto/request/RequestDTO$ParameterDTO$ChatDTO.class create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/dto/request/RequestDTO$ParameterDTO.class create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/dto/request/RequestDTO$PayloadDTO$MessageDTO.class create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/dto/request/RequestDTO$PayloadDTO.class create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/dto/request/RequestDTO.class create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/dto/response/ResponseDTO$HeaderDTO.class create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/dto/response/ResponseDTO$PayloadDTO$ChoicesDTO.class create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/dto/response/ResponseDTO$PayloadDTO$UsageDTO$TextDTO.class create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/dto/response/ResponseDTO$PayloadDTO$UsageDTO.class create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/dto/response/ResponseDTO$PayloadDTO.class create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/dto/response/ResponseDTO.class create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/listener/XfXhStreamClient.class create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/listener/XfXhWebSocketListener.class create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/mapper/XfXhConfig.class create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/service/GTPService.class create mode 100644 holiday03-GTP/target/classes/com/sikadi/user/service/impl/GTPServiceImpl.class create mode 100644 holiday03-GTP/target/holiday03-GTP-1.0-SNAPSHOT.jar create mode 100644 holiday03-GTP/target/maven-archiver/pom.properties create mode 100644 holiday03-GTP/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 holiday03-GTP/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 holiday03-GTP/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst create mode 100644 holiday03-GTP/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst create mode 100644 holiday03-common/pom.xml create mode 100644 holiday03-common/src/main/java/com/bwie/common/constants/Constants.java create mode 100644 holiday03-common/src/main/java/com/bwie/common/constants/JwtConstants.java create mode 100644 holiday03-common/src/main/java/com/bwie/common/constants/TokenConstants.java create mode 100644 holiday03-common/src/main/java/com/bwie/common/result/PageResult.java create mode 100644 holiday03-common/src/main/java/com/bwie/common/result/Result.java create mode 100644 holiday03-common/src/main/java/com/bwie/common/utils/DLXQueue.java create mode 100644 holiday03-common/src/main/java/com/bwie/common/utils/DelayedQueue.java create mode 100644 holiday03-common/src/main/java/com/bwie/common/utils/FastUtil.java create mode 100644 holiday03-common/src/main/java/com/bwie/common/utils/HttpUtils.java create mode 100644 holiday03-common/src/main/java/com/bwie/common/utils/JwtUtils.java create mode 100644 holiday03-common/src/main/java/com/bwie/common/utils/MsgUtil.java create mode 100644 holiday03-common/src/main/java/com/bwie/common/utils/OssUtil.java create mode 100644 holiday03-common/src/main/java/com/bwie/common/utils/StringUtils.java create mode 100644 holiday03-common/src/main/java/com/bwie/common/utils/TelSmsUtils.java create mode 100644 holiday03-common/src/main/java/com/bwie/common/utils/TtlQueue.java create mode 100644 holiday03-common/target/classes/com/bwie/common/constants/Constants.class create mode 100644 holiday03-common/target/classes/com/bwie/common/constants/JwtConstants.class create mode 100644 holiday03-common/target/classes/com/bwie/common/constants/TokenConstants.class create mode 100644 holiday03-common/target/classes/com/bwie/common/result/PageResult.class create mode 100644 holiday03-common/target/classes/com/bwie/common/result/Result.class create mode 100644 holiday03-common/target/classes/com/bwie/common/utils/DLXQueue.class create mode 100644 holiday03-common/target/classes/com/bwie/common/utils/DelayedQueue.class create mode 100644 holiday03-common/target/classes/com/bwie/common/utils/FastUtil.class create mode 100644 holiday03-common/target/classes/com/bwie/common/utils/HttpUtils$1.class create mode 100644 holiday03-common/target/classes/com/bwie/common/utils/HttpUtils.class create mode 100644 holiday03-common/target/classes/com/bwie/common/utils/JwtUtils.class create mode 100644 holiday03-common/target/classes/com/bwie/common/utils/MsgUtil.class create mode 100644 holiday03-common/target/classes/com/bwie/common/utils/OssUtil.class create mode 100644 holiday03-common/target/classes/com/bwie/common/utils/StringUtils.class create mode 100644 holiday03-common/target/classes/com/bwie/common/utils/TelSmsUtils.class create mode 100644 holiday03-common/target/classes/com/bwie/common/utils/TtlQueue.class create mode 100644 holiday03-common/target/holiday03-common-1.0-SNAPSHOT.jar create mode 100644 holiday03-common/target/maven-archiver/pom.properties create mode 100644 holiday03-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 holiday03-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 holiday03-common/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst create mode 100644 holiday03-common/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst create mode 100644 pom.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..73f69e0 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..5197cd9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aff9be2 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..6560a98 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,36 @@ + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..d5ee13e --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..88aa9a7 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Three.iml b/Three.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/Three.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/holiday03-GTP/pom.xml b/holiday03-GTP/pom.xml new file mode 100644 index 0000000..6cadb64 --- /dev/null +++ b/holiday03-GTP/pom.xml @@ -0,0 +1,57 @@ + + + + Three + com.bwie + 1.0-SNAPSHOT + + 4.0.0 + + holiday03-GTP + + + 8 + 8 + UTF-8 + + + + + + com.bwie + holiday03-common + + + + org.springframework.boot + spring-boot-starter-web + + + + com.alibaba + druid-spring-boot-starter + 1.2.8 + + + + mysql + mysql-connector-java + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.2.2 + + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.4.1 + + + + + diff --git a/holiday03-GTP/src/main/java/com/sikadi/user/GTPApplication.java b/holiday03-GTP/src/main/java/com/sikadi/user/GTPApplication.java new file mode 100644 index 0000000..8d188b6 --- /dev/null +++ b/holiday03-GTP/src/main/java/com/sikadi/user/GTPApplication.java @@ -0,0 +1,13 @@ +package com.sikadi.user; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class GTPApplication { + + public static void main(String[] args) { + SpringApplication.run(GTPApplication.class, args); + } + +} diff --git a/holiday03-GTP/src/main/java/com/sikadi/user/controller/GTPController.java b/holiday03-GTP/src/main/java/com/sikadi/user/controller/GTPController.java new file mode 100644 index 0000000..70d41f3 --- /dev/null +++ b/holiday03-GTP/src/main/java/com/sikadi/user/controller/GTPController.java @@ -0,0 +1,37 @@ +package com.sikadi.user.controller; + +import com.bwie.common.result.Result; +import com.sikadi.user.service.GTPService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * Gtp回答 + */ +@RestController +public class GTPController { + + @Autowired + private GTPService gtpService; + + + + + /** + * 发送问题 + * + * @param ques 问题 + * @return 星火大模型的回答 + */ + @GetMapping("/send") + public Result send(@RequestParam("ques") String ques) { + String s = gtpService.send(ques); + return Result.success(s); + } + + + + +} diff --git a/holiday03-GTP/src/main/java/com/sikadi/user/dto/MsgDTO.java b/holiday03-GTP/src/main/java/com/sikadi/user/dto/MsgDTO.java new file mode 100644 index 0000000..e6baab7 --- /dev/null +++ b/holiday03-GTP/src/main/java/com/sikadi/user/dto/MsgDTO.java @@ -0,0 +1,41 @@ +package com.sikadi.user.dto; + + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *工具类 + **/ +@Data +@AllArgsConstructor +@NoArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +public class MsgDTO { + /** + * 角色 + */ + private String role; + /** + * 消息内容 + */ + private String content; + /** + * 响应结果字段:结果序号,取值为[0,10]; 当前为保留字段,开发者可忽略 + */ + private Integer index; + + public static final String ROLE_USER = "user"; + public static final String ROLE_ASSISTANT = "assistant"; + + public static MsgDTO createUserMsg(String content) { + return new MsgDTO(ROLE_USER, content, null); + } + + public static MsgDTO createAssistantMsg(String content) { + return new MsgDTO(ROLE_ASSISTANT, content, null); + } + +} diff --git a/holiday03-GTP/src/main/java/com/sikadi/user/dto/request/RequestDTO.java b/holiday03-GTP/src/main/java/com/sikadi/user/dto/request/RequestDTO.java new file mode 100644 index 0000000..df48c94 --- /dev/null +++ b/holiday03-GTP/src/main/java/com/sikadi/user/dto/request/RequestDTO.java @@ -0,0 +1,86 @@ +package com.sikadi.user.dto.request; + + +import com.alibaba.fastjson.annotation.JSONField; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.sikadi.user.dto.MsgDTO; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 工具类 + */ +@NoArgsConstructor +@Data +public class RequestDTO { + + @JsonProperty("header") + private HeaderDTO header; + @JsonProperty("parameter") + private ParameterDTO parameter; + @JsonProperty("payload") + private PayloadDTO payload; + + @NoArgsConstructor + @Data + @AllArgsConstructor + public static class HeaderDTO { + /** + * 应用appid,从开放平台控制台创建的应用中获取 + */ + @JSONField(name = "app_id") + private String appId; + /** + * 每个用户的id,用于区分不同用户,最大长度32 + */ + @JSONField(name = "uid") + private String uid; + } + + @NoArgsConstructor + @Data + @AllArgsConstructor + public static class ParameterDTO { + private ChatDTO chat; + + @NoArgsConstructor + @Data + @AllArgsConstructor + public static class ChatDTO { + /** + * 指定访问的领域,general指向V1.5版本 generalv2指向V2版本。注意:不同的取值对应的url也不一样! + */ + @JsonProperty("domain") + private String domain; + /** + * 核采样阈值。用于决定结果随机性,取值越高随机性越强即相同的问题得到的不同答案的可能性越高 + */ + @JsonProperty("temperature") + private Float temperature; + /** + * 模型回答的tokens的最大长度 + */ + @JSONField(name = "max_tokens") + private Integer maxTokens; + } + } + + @NoArgsConstructor + @Data + @AllArgsConstructor + public static class PayloadDTO { + @JsonProperty("message") + private MessageDTO message; + + @NoArgsConstructor + @Data + @AllArgsConstructor + public static class MessageDTO { + @JsonProperty("text") + private List text; + } + } +} diff --git a/holiday03-GTP/src/main/java/com/sikadi/user/dto/response/ResponseDTO.java b/holiday03-GTP/src/main/java/com/sikadi/user/dto/response/ResponseDTO.java new file mode 100644 index 0000000..6abf2a6 --- /dev/null +++ b/holiday03-GTP/src/main/java/com/sikadi/user/dto/response/ResponseDTO.java @@ -0,0 +1,111 @@ +package com.sikadi.user.dto.response; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.sikadi.user.dto.MsgDTO; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 工具类 + **/ +@NoArgsConstructor +@Data +public class ResponseDTO { + + @JsonProperty("header") + private HeaderDTO header; + @JsonProperty("payload") + private PayloadDTO payload; + + @NoArgsConstructor + @Data + public static class HeaderDTO { + /** + * 错误码,0表示正常,非0表示出错 + */ + @JsonProperty("code") + private Integer code; + /** + * 会话是否成功的描述信息 + */ + @JsonProperty("message") + private String message; + /** + * 会话的唯一id,用于讯飞技术人员查询服务端会话日志使用,出现调用错误时建议留存该字段 + */ + @JsonProperty("sid") + private String sid; + /** + * 会话状态,取值为[0,1,2];0代表首次结果;1代表中间结果;2代表最后一个结果 + */ + @JsonProperty("status") + private Integer status; + } + + @NoArgsConstructor + @Data + public static class PayloadDTO { + @JsonProperty("choices") + private ChoicesDTO choices; + /** + * 在最后一次结果返回 + */ + @JsonProperty("usage") + private UsageDTO usage; + + @NoArgsConstructor + @Data + public static class ChoicesDTO { + /** + * 文本响应状态,取值为[0,1,2]; 0代表首个文本结果;1代表中间文本结果;2代表最后一个文本结果 + */ + @JsonProperty("status") + private Integer status; + /** + * 返回的数据序号,取值为[0,9999999] + */ + @JsonProperty("seq") + private Integer seq; + /** + * 响应文本 + */ + @JsonProperty("text") + private List text; + + } + + @NoArgsConstructor + @Data + public static class UsageDTO { + @JsonProperty("text") + private TextDTO text; + + @NoArgsConstructor + @Data + public static class TextDTO { + /** + * 保留字段,可忽略 + */ + @JsonProperty("question_tokens") + private Integer questionTokens; + /** + * 包含历史问题的总tokens大小 + */ + @JsonProperty("prompt_tokens") + private Integer promptTokens; + /** + * 回答的tokens大小 + */ + @JsonProperty("completion_tokens") + private Integer completionTokens; + /** + * prompt_tokens和completion_tokens的和,也是本次交互计费的tokens大小 + */ + @JsonProperty("total_tokens") + private Integer totalTokens; + } + } + } +} diff --git a/holiday03-GTP/src/main/java/com/sikadi/user/listener/XfXhStreamClient.java b/holiday03-GTP/src/main/java/com/sikadi/user/listener/XfXhStreamClient.java new file mode 100644 index 0000000..569975d --- /dev/null +++ b/holiday03-GTP/src/main/java/com/sikadi/user/listener/XfXhStreamClient.java @@ -0,0 +1,145 @@ +package com.sikadi.user.listener; + + +import com.alibaba.fastjson.JSONObject; +import com.sikadi.user.dto.MsgDTO; +import com.sikadi.user.dto.request.RequestDTO; +import com.sikadi.user.mapper.XfXhConfig; +import lombok.extern.slf4j.Slf4j; +import okhttp3.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.*; + +@Component +@Slf4j +public class XfXhStreamClient { + @Resource + private XfXhConfig xfXhConfig; + + @Value("${xfxh.QPS}") + private int connectionTokenCount; + + /** + * 获取令牌 + */ + public static int GET_TOKEN_STATUS = 0; + /** + * 归还令牌 + */ + public static int BACK_TOKEN_STATUS = 1; + + /** + * 操作令牌 + * + * @param status 0-获取令牌 1-归还令牌 + * @return 是否操作成功 + */ + public synchronized boolean operateToken(int status) { + if (status == GET_TOKEN_STATUS) { + // 获取令牌 + if (connectionTokenCount != 0) { + // 说明还有令牌,将令牌数减一 + connectionTokenCount -= 1; + return true; + } else { + return false; + } + } else { + // 放回令牌 + connectionTokenCount += 1; + return true; + } + } + + /** + * 发送消息 + * + * @param uid 每个用户的id,用于区分不同用户 + * @param msgList 发送给大模型的消息,可以包含上下文内容 + * @return 获取websocket连接,以便于我们在获取完整大模型回复后手动关闭连接 + */ + public WebSocket sendMsg(String uid, List msgList, WebSocketListener listener) { + // 获取鉴权url + String authUrl = this.getAuthUrl(); + // 鉴权方法生成失败,直接返回 null + if (authUrl == null) { + return null; + } + OkHttpClient okHttpClient = new OkHttpClient.Builder().build(); + // 将 https/http 连接替换为 ws/wss 连接 + String url = authUrl.replace("http://", "ws://").replace("https://", "wss://"); + Request request = new Request.Builder().url(url).build(); + // 建立 wss 连接 + WebSocket webSocket = okHttpClient.newWebSocket(request, listener); + // 组装请求参数 + RequestDTO requestDTO = getRequestParam(uid, msgList); + // 发送请求 + webSocket.send(JSONObject.toJSONString(requestDTO)); + return webSocket; + } + + /** + * 生成鉴权方法,具体实现不用关心,这是讯飞官方定义的鉴权方式 + * + * @return 鉴权访问大模型的路径 + */ + public String getAuthUrl() { + try { + URL url = new URL(xfXhConfig.getHostUrl()); + // 时间 + SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US); + format.setTimeZone(TimeZone.getTimeZone("GMT")); + String date = format.format(new Date()); + // 拼接 + String preStr = "host: " + url.getHost() + "\n" + + "date: " + date + "\n" + + "GET " + url.getPath() + " HTTP/1.1"; + // SHA256加密 + Mac mac = Mac.getInstance("hmacsha256"); + SecretKeySpec spec = new SecretKeySpec(xfXhConfig.getApiSecret().getBytes(StandardCharsets.UTF_8), "hmacsha256"); + mac.init(spec); + + byte[] hexDigits = mac.doFinal(preStr.getBytes(StandardCharsets.UTF_8)); + // Base64加密 + String sha = Base64.getEncoder().encodeToString(hexDigits); + // 拼接 + String authorizationOrigin = String.format("api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"", xfXhConfig.getApiKey(), "hmac-sha256", "host date request-line", sha); + // 拼接地址 + HttpUrl httpUrl = Objects.requireNonNull(HttpUrl.parse("https://" + url.getHost() + url.getPath())).newBuilder(). + addQueryParameter("authorization", Base64.getEncoder().encodeToString(authorizationOrigin.getBytes(StandardCharsets.UTF_8))). + addQueryParameter("date", date). + addQueryParameter("host", url.getHost()). + build(); + + return httpUrl.toString(); + } catch (Exception e) { + log.error("鉴权方法中发生错误:" + e.getMessage()); + return null; + } + } + + /** + * 获取请求参数 + * + * @param uid 每个用户的id,用于区分不同用户 + * @param msgList 发送给大模型的消息,可以包含上下文内容 + * @return 请求DTO,该 DTO 转 json 字符串后生成的格式参考 resources/demo-json/request.json + */ + public RequestDTO getRequestParam(String uid, List msgList) { + RequestDTO requestDTO = new RequestDTO(); + requestDTO.setHeader(new RequestDTO.HeaderDTO(xfXhConfig.getAppId(), uid)); + requestDTO.setParameter(new RequestDTO.ParameterDTO(new RequestDTO.ParameterDTO.ChatDTO(xfXhConfig.getDomain(), xfXhConfig.getTemperature(), xfXhConfig.getMaxTokens()))); + requestDTO.setPayload(new RequestDTO.PayloadDTO(new RequestDTO.PayloadDTO.MessageDTO(msgList))); + return requestDTO; + } + +} + diff --git a/holiday03-GTP/src/main/java/com/sikadi/user/listener/XfXhWebSocketListener.java b/holiday03-GTP/src/main/java/com/sikadi/user/listener/XfXhWebSocketListener.java new file mode 100644 index 0000000..beff6bc --- /dev/null +++ b/holiday03-GTP/src/main/java/com/sikadi/user/listener/XfXhWebSocketListener.java @@ -0,0 +1,69 @@ +package com.sikadi.user.listener; + + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.nacos.shaded.org.checkerframework.checker.nullness.qual.Nullable; +import com.sikadi.user.dto.MsgDTO; +import com.sikadi.user.dto.response.ResponseDTO; +import lombok.extern.slf4j.Slf4j; +import okhttp3.Response; +import okhttp3.WebSocket; +import okhttp3.WebSocketListener; + +import javax.validation.constraints.NotNull; + +@Slf4j +public class XfXhWebSocketListener extends WebSocketListener { + private StringBuilder answer = new StringBuilder(); + + private boolean wsCloseFlag = false; + + public StringBuilder getAnswer() { + return answer; + } + + public boolean isWsCloseFlag() { + return wsCloseFlag; + } + + @Override + public void onOpen(@NotNull WebSocket webSocket, @NotNull Response response) { + super.onOpen(webSocket, response); + } + + @Override + public void onMessage(@NotNull WebSocket webSocket, @NotNull String text) { + super.onMessage(webSocket, text); + // 将大模型回复的 JSON 文本转为 ResponseDTO 对象 + ResponseDTO responseData = JSONObject.parseObject(text, ResponseDTO.class); + // 如果响应数据中的 header 的 code 值不为 0,则表示响应错误 + if (responseData.getHeader().getCode() != 0) { + // 日志记录 + log.error("发生错误,错误码为:" + responseData.getHeader().getCode() + "; " + "信息:" + responseData.getHeader().getMessage()); + // 设置回答 + this.answer = new StringBuilder("大模型响应错误,请稍后再试"); + // 关闭连接标识 + wsCloseFlag = true; + return; + } + // 将回答进行拼接 + for (MsgDTO msgDTO : responseData.getPayload().getChoices().getText()) { + this.answer.append(msgDTO.getContent()); + } + // 对最后一个文本结果进行处理 + if (2 == responseData.getHeader().getStatus()) { + wsCloseFlag = true; + } + } + + @Override + public void onFailure(@NotNull WebSocket webSocket, @NotNull Throwable t, @Nullable Response response) { + super.onFailure(webSocket, t, response); + } + + @Override + public void onClosed(@NotNull WebSocket webSocket, int code, @NotNull String reason) { + super.onClosed(webSocket, code, reason); + } +} + diff --git a/holiday03-GTP/src/main/java/com/sikadi/user/mapper/XfXhConfig.java b/holiday03-GTP/src/main/java/com/sikadi/user/mapper/XfXhConfig.java new file mode 100644 index 0000000..89c5ad9 --- /dev/null +++ b/holiday03-GTP/src/main/java/com/sikadi/user/mapper/XfXhConfig.java @@ -0,0 +1,48 @@ +package com.sikadi.user.mapper; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * @author 爱意遂放弃 + * @create 2022-10-15 10:46 + */ +@Configuration +@ConfigurationProperties(prefix = "xfxh") +@Data +public class XfXhConfig { + /** + * 服务引擎使用 讯飞星火认知大模型V2.0,如果使用 V1.5 需要将 hostUrl 修改为 https://spark-api.xf-yun.com/v1.1/chat + */ + private String hostUrl; + /** + * 发送请求时指定的访问领域,如果是 V1.5版本 设置为 general,如果是 V2版本 设置为 generalv2 + */ + private String domain; + /** + * 核采样阈值。用于决定结果随机性,取值越高随机性越强即相同的问题得到的不同答案的可能性越高。取值 [0,1] + */ + private Float temperature; + /** + * 模型回答的tokens的最大长度,V1.5取值为[1,4096],V2.0取值为[1,8192]。 + */ + private Integer maxTokens; + /** + * 大模型回复问题的最大响应时长,单位 s + */ + private Integer maxResponseTime; + /** + * 用于权限验证,从服务接口认证信息中获取 + */ + private String appId; + /** + * 用于权限验证,从服务接口认证信息中获取 + */ + private String apiKey; + /** + * 用于权限验证,从服务接口认证信息中获取 + */ + private String apiSecret; + +} diff --git a/holiday03-GTP/src/main/java/com/sikadi/user/service/GTPService.java b/holiday03-GTP/src/main/java/com/sikadi/user/service/GTPService.java new file mode 100644 index 0000000..4b2cf64 --- /dev/null +++ b/holiday03-GTP/src/main/java/com/sikadi/user/service/GTPService.java @@ -0,0 +1,6 @@ +package com.sikadi.user.service; + +public interface GTPService { + + String send(String ques); +} diff --git a/holiday03-GTP/src/main/java/com/sikadi/user/service/impl/GTPServiceImpl.java b/holiday03-GTP/src/main/java/com/sikadi/user/service/impl/GTPServiceImpl.java new file mode 100644 index 0000000..71a037a --- /dev/null +++ b/holiday03-GTP/src/main/java/com/sikadi/user/service/impl/GTPServiceImpl.java @@ -0,0 +1,76 @@ +package com.sikadi.user.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.sikadi.user.dto.MsgDTO; +import com.sikadi.user.listener.XfXhStreamClient; +import com.sikadi.user.listener.XfXhWebSocketListener; +import com.sikadi.user.mapper.XfXhConfig; +import com.sikadi.user.service.GTPService; +import lombok.extern.log4j.Log4j2; +import okhttp3.WebSocket; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.UUID; + + +/** + * 修改 + **/ +@Service +@Log4j2 +public class GTPServiceImpl implements GTPService { + + @Autowired + private XfXhStreamClient xfXhStreamClient; + + @Autowired + private XfXhConfig xfXhConfig; + + @Override + public String send(String ques) { + + // 如果是无效字符串,则不对大模型进行请求 + if (StrUtil.isBlank(ques)) { + return "无效问题,请重新输入"; + } + + // 创建消息对象 + MsgDTO msgDTO = MsgDTO.createUserMsg(ques); + // 创建监听器 + XfXhWebSocketListener listener = new XfXhWebSocketListener(); + // 发送问题给大模型,生成 websocket 连接 + WebSocket webSocket = xfXhStreamClient.sendMsg(UUID.randomUUID().toString().substring(0, 10), Collections.singletonList(msgDTO), listener); + if (webSocket == null) { + // 归还令牌 + xfXhStreamClient.operateToken(XfXhStreamClient.BACK_TOKEN_STATUS); + return "系统内部错误,请联系管理员"; + } + try { + int count = 0; + // 为了避免死循环,设置循环次数来定义超时时长 + int maxCount = xfXhConfig.getMaxResponseTime() * 5; + while (count <= maxCount) { + Thread.sleep(200); + if (listener.isWsCloseFlag()) { + break; + } + count++; + } + if (count > maxCount) { + return "大模型响应超时,请联系管理员"; + } + // 响应大模型的答案 + return listener.getAnswer().toString(); + } catch (InterruptedException e) { + log.error("错误:" + e.getMessage()); + return "系统内部错误,请联系管理员"; + } finally { + // 关闭 websocket 连接 + webSocket.close(1000, ""); + // 归还令牌 + xfXhStreamClient.operateToken(XfXhStreamClient.BACK_TOKEN_STATUS); + } + } +} diff --git a/holiday03-GTP/src/main/resources/bootstrap.yml b/holiday03-GTP/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..01cd534 --- /dev/null +++ b/holiday03-GTP/src/main/resources/bootstrap.yml @@ -0,0 +1,40 @@ +# Tomcat +server: + port: 9001 +# Spring +spring: + main: + allow-circular-references: true + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + application: + # 应用名称 + name: sikadi-user + profiles: + # 环境配置 + active: dev + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: 182.254.222.21:8848 + config: + # 配置中心地址 + server-addr: 182.254.222.21:8848 + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + namespace: Sikadi +xfxh: + hostUrl: https://spark-api.xf-yun.com/v2.1/chat + domain: generalv2 + temperature: 0.5 + maxTokens: 2048 + maxResponseTime: 30 + QPS: 2 + appId: 9f22c545 + apiKey: a8e17cdcbc9addd7f21e81dff71bc177 + apiSecret: N2NjMDU3ZTQwYjBkODI5ZGM3ZTVjYWY3 diff --git a/holiday03-GTP/target/classes/bootstrap.yml b/holiday03-GTP/target/classes/bootstrap.yml new file mode 100644 index 0000000..01cd534 --- /dev/null +++ b/holiday03-GTP/target/classes/bootstrap.yml @@ -0,0 +1,40 @@ +# Tomcat +server: + port: 9001 +# Spring +spring: + main: + allow-circular-references: true + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + application: + # 应用名称 + name: sikadi-user + profiles: + # 环境配置 + active: dev + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: 182.254.222.21:8848 + config: + # 配置中心地址 + server-addr: 182.254.222.21:8848 + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + namespace: Sikadi +xfxh: + hostUrl: https://spark-api.xf-yun.com/v2.1/chat + domain: generalv2 + temperature: 0.5 + maxTokens: 2048 + maxResponseTime: 30 + QPS: 2 + appId: 9f22c545 + apiKey: a8e17cdcbc9addd7f21e81dff71bc177 + apiSecret: N2NjMDU3ZTQwYjBkODI5ZGM3ZTVjYWY3 diff --git a/holiday03-GTP/target/classes/com/sikadi/user/GTPApplication.class b/holiday03-GTP/target/classes/com/sikadi/user/GTPApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..26ef0bfb6416b700f10b5da05a7be79301d87e79 GIT binary patch literal 728 zcmaJf~P_!{9AM(W5=-c zNonN{80v$aX@C~P``BbWSC?X@c#%uXk4{fM&*!O%g;Pei(Z))EP6sdWl3{3U!t=RR zIyti%X^wF!@_h8O;+Z%PHrfdnA;(5L`P=ca(Pt_t ztcX%sX+dru9x*h=W+oX{L#5?$kwwy;`do%yXkw90g;m~ubT-_%${9X{|KHu?Wp z>w`rjPbn^JLP-4uVdDR*bmwMvB0N)0T1sqBOkrbrsQhgG=Tz@{niw{}7uu;zPF1e_ zx>_4oJ_VH@EM%$VUlh&|T_sKO@io5C!&K-R;UfY%5&zY|{E?7cC5w}0q?^NQus>zE zOVWoyC2J%*4+-d@Pu4PC;WdHy;=K|KX!U~O4VHgA)%$w{9Z-Ok3Pua-ctidT`kTZp QsTwv*xrJ@gzU^D!A8(7gI{*Lx literal 0 HcmV?d00001 diff --git a/holiday03-GTP/target/classes/com/sikadi/user/controller/GTPController.class b/holiday03-GTP/target/classes/com/sikadi/user/controller/GTPController.class new file mode 100644 index 0000000000000000000000000000000000000000..f8010e55aa6ddac81e2a9fbcc43143909aa75285 GIT binary patch literal 1180 zcma)6T~8B16g{)FRN4v^KT%Oc#8S|C&=`}d2_cb}BBT&re45=3WnjBocV}t*SDKjk z@!${eM;Xr)QmBCVuyc3rz31Gy_s*SPzkmD$@ET8w@Gw$9u8cfJ1uA>$K*>-=ZMp96 z>A(t%zA}-qZv;lF3)^G3gs}pOWt31Bs0MLIre^}c75Tr zs)%d2UcikqZsL}}w2R>PjAk00P8`WZr&(xavo8b+X%+-JO$DBvlU z(Jj*ER^k?GI?*tZewTH8oop%63rsfRK!w{XF>ZgP%-LPTc(qd10YO7$P21hLwV_`iof{pSWWFRv3(jwD{jVF66m+4U*n-`{?y&N^O|{98oXNecuMMc!1?kx znSv`PjB<**QOett9wo<=>mBYSrJ&5$zCwKNo9}XUW^i<-xjF(m;2!Q%3J%f?a(!^q z%{_IM+7}cSzvHrpwWV*k`iVLZj>o+WAhJZPihn*#7iTn@w=V6Xsc|kS$ jryi&A5x@EOY&RaGNF1$ForlFimP^1NZ!9_M literal 0 HcmV?d00001 diff --git a/holiday03-GTP/target/classes/com/sikadi/user/dto/MsgDTO.class b/holiday03-GTP/target/classes/com/sikadi/user/dto/MsgDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..646791e12e5c7c8d29c7e55e4af7efdf0b451c57 GIT binary patch literal 3501 zcmb7HZBx`%7(I74*#ro(uAr_`Q9*?TTx+e>MXZQWS9!54V0~#dED<70f=SlukMMh^ zKcIf`LpxJ-#?ExwFLtKCsjWRX$-)9Fqcddh+j-7??s=a3B>er~o8JKp!_$xuI8b(1 z^S-@eF53C3Z+ZE}z|BwkOIK#6btnRgoNR_b%76x)?FHMhgNp)%-ie3iV>4edouzy! z@N8#kXvdkN6Ie@@H`F(;qgkNI^nKe8Oebg}y5M(9niYYL`Xfv)JhaNeP~U9{K4_p5 zpAfuc1;vQBqqnaia~BS4IAY+aBu{Th67f+mOK#>%)*b`LaGdUwbtXJ#`zF#@MG5US z&?lkIgpNjsZAKUR4GdtAel45+@~FE=sgk{Y#S9~wH*gA{@|>&Yiba#M8Qio3f}Buf zU*LNEaX%_zbq8Pfu?wHclsFT5Fwc0-Oizs6n=6gY2(;FAoi{60`nW4x8!45FrP-0G zSpv$QWd_z9lZ(kFaH@f8eG~7`%^_w=bo{mn+p(sqs|%JlYc52&sfxa60lR-MeT`5^`3PCJ#eEl)4h^g^~%<`Ekn=}RgjbN zHV9;As!m|9TJyGVGa@67;|6A6Gcg5DhC)9uea7U;Y9;@W4*9N=H`hV=YaADya;3Ux zG3@H&D5cJRlwr>Xfj%`ob#H2JVuH8zvg-zZ;F)VtcKB^6+;4`71r23+ofdg#H*U1; zJa$*CxYjYaykX;JIdHwF0zcHpH3mkcS50TJV);E2uDeoQ+qpz;GMs(7W;KA{sk@A| znpHOyQ;eFGO34naAsr6{jz;n5l>rj-bi&EVM*;`kyMe8?-}+I@=X%9 ze0#9X;&YA#&W3YIj=!iIH?iM@b2v}C0ug7)B-k3iLEOqDbK*7BpF_(b{-(mUqqrau z5iZ_sm@}&20HnM49=fK6bjNq5qi#6Py`*<}w$eK__bXbqy47CCqvA_kB2dVeO#|b$ zt;YKs8uL}zz&NwjxU-@02rkE>7T6}}O)A&_5-q>5m%xUcMrge^Ld1Scsbx3?zh^>W zTao5qv@vDdhf>PSSf|__QeMFrcb4LA@-p+GlrqWIDceIzelSFo;vCy1Qa|g@{RCBc z(f=pJk5H2@`u~8K9LT-G-f+myfvExh6qLcg(2`Z&V)t_xgIVPj4%HCd1(lHQLMp3D zOzJH%&(WGyv#C1JiGoJZiGrThBuI}zT2`-tloxa;xlRAOk)!MSKf^e_;>kMj1Xr0$ z3G~25k#kApP{uX(6h7m)&R-Ri#7wZ4LWP%dl06L`4q}Qu9n;*iABLv?gIyZLzu2px zi+?)1`=f4CeYY0&aSE!)&$~EA=joBmBvmRY5Awc5s$Bp=>ApNjoJd#05b;}!Q;fPe zNs1JS=F&qKl;JQCo#~-vhCxsFKZiE>3c34ozPq5vg{%^<=rTCb(usl^E-@~lk)Bn< zrOw7uUyL@4rA}f7H}EyxQQ6M0mq0T`Ez#>Fx^Wt_>?tfN`!L6z8jATnQtvpSP)s2x zAe(oDZ;TUiq62CTP{Syjr(#&D4z_{ZI!iF!oL{df7r3J=M;R#(pA%BPH#iAwtq{>2 zk4k1HJ~-bF%#7&n-DRtgsXg}^r^70d8+eJf+~7-WyNRt~y~suQ^?YrQ>jgQ&k}R{N zUH$_>A7$uUlLVx>l;)(YCH%tW@8+t?&9~nBT@7lRf}3Pa;2YeM%%r)^=Z=ND_!i%B aO6Tw%9}7zyWe8oyLsTwhu?iQDko_ODys~Nl literal 0 HcmV?d00001 diff --git a/holiday03-GTP/target/classes/com/sikadi/user/dto/request/RequestDTO$HeaderDTO.class b/holiday03-GTP/target/classes/com/sikadi/user/dto/request/RequestDTO$HeaderDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..63ba30bb24b191cdc4549c05d681500fc2563586 GIT binary patch literal 2564 zcmb7FU2_vv7=BK&o86>o6DkE_3xWh`o0dfog@&R~s4X@Hn^I=BT&3AA4;n&-Fw!p&HHvE6v$k5TqnFDke-~{$ihU{KrW9V zI)Uw5&Cs)a`$5MJLTfFaudm-KFWItb`&$}qj(e}FoR8#DP@dBr zr)GQ;9`HGN$CB_49HKQwAOJ$XWQOz0%x;rUv*tCl%Yf40+khox@>f6QLHi9ELm>h5SE-W@IzyRbfxb5+tTJNVl3Dw!G$T=`+dD_8BTeD}pZ| zyuBnzDoqA?VaxUfaw@lSLZ_if*xi}Y5h)~)jSr&ra6Ocbt(x3PZl~W~Tdv(;sAb0W z?V!_EeD6BZ%8`*7dU3`Ar{AogyjZU8b^M0C=qO|hyPa@Gk)F`3vO$)-AT+Qj@ZOts z5#hS#d0`OxawoF))r9j>-!a zFpD#sg?igK?lt}i#t%G9Vb}QNKx4ja1B{1XH=Z15Y~d_JsK|4i6#$v(%2ODx=RFZw zABr`Syw#mzsNScYF1RT&lXHVz4!^0(805rdA#%z0JjwDe&IY5kD%0OX*Pc{$kxWtgEWV%8@W!g`c z{)%;(rZ{(jaeE#wMDX%MNRcAJpLC&fo-0-_Yx5C^6UAza5SqoxV;Hl~aO`U(AD`3I zK}kzaOa&~DCI$nhF0CjQ6FyBqs<_OUDxG<*QtY9#1WEyRl6?M{D=h-&CbU-+Xaq+H z0s9 z3a=XHH0Ofq^{8>CXP#mo)sIHqb39hOB^A{)1f)U-oJ7WB>pF literal 0 HcmV?d00001 diff --git a/holiday03-GTP/target/classes/com/sikadi/user/dto/request/RequestDTO$ParameterDTO$ChatDTO.class b/holiday03-GTP/target/classes/com/sikadi/user/dto/request/RequestDTO$ParameterDTO$ChatDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..69fb46ccb6609a9d341aef7a38ab8ec0c5955ead GIT binary patch literal 3471 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 Juz)X+e+lYw>b(E} literal 0 HcmV?d00001 diff --git a/holiday03-GTP/target/classes/com/sikadi/user/dto/request/RequestDTO$PayloadDTO$MessageDTO.class b/holiday03-GTP/target/classes/com/sikadi/user/dto/request/RequestDTO$PayloadDTO$MessageDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..4234e1b144416632dac1497102ec83d5c1aeaa0a GIT binary patch literal 2478 zcma)8U31e$6g}%mkz))ofrN%qK1!g8^PxcL2RI1@6H35N+&GiYv@hK_Y9gXYL0U89 zU-YrlA5dO+pffF<;i1#Mv@`upZRuG_iJjOj%-H*-yXT&J?%kFC{O9E_0A{h0Lk2w- zj66*A3KSm7$I|wszhN(}J#-pMpm)agT{S1rGdi}~hb;Om@6Gd{v;ZVR(&J%hlRAR49<$89-jZ`T| zFURueM?oOlkpBFmrt|~`M-#&~dZn>1wDCY5CvZ~0+HllLj5#nm)`^SSyF@b|ORq^9MiOd&#r2)V=JuKs zu1KN_3{--K^j2l)>Up|os7;sd=DKoy(}dIebVpiV8@?6o<@7|S*sB6V2l?*q>~Sts z9km&(*JLQS9qL2=R}Le*#`_rYMW8h~d@i(-f!cIJCRb}Sl9X~TUP~uO>x${9%AHh1 zv$niYohRY~3ovw|rpMwpQ{$`(l5!C^xhK-WBFfc+X4r7@x zDhPK4zHL9BsbKaKE1Sy1uOHpN=^(Nya`8r3PB6=MSV1>bkVvL~a+i7ZrDIBzCr+eIgkYkA?M<;Oxz z;8KUA-ITJhEO7S!O<7Bcthm6NFvDw0u;um4_B>}9uD{Fv2-h$2KN4}6<$xDH+e>_8 zvlr~m;?EF2#CtBY)sKNiyvH`57+@4*oC$s168YffA7MS`!wg!R>s>aVk8O$s8OH>S z7^K2ontE?>{3lqNLQfmYQj9W`Sfms*JsqULB&`#AdgTIFrnq7XP70|4cBcZo)%iFH z;W>Mgd&=X*?_nCx#(zWhJD5Gs#(zb&I#GOqqw$o3|(Mt_0@wj_z)iv*rbDxIm#f%0I$bk>tHV; z^NMLP7_1Ns6hgeBBCUBw=t8}LQp)ZcdtIYBP3$G{akv1Jpp){*r9?D=3F7MbYV@KN z%jweZT70#(;@d-@eMj->mH#L{12c4y;rG^D+~344_WBIo=KmhjkigJT1B$w&g|YfbI-YV?*8@fvtI#BU?GnT zdTdw)WRVjnK9rB8>&sx>U3l!eSWXns zhoXSfkior2E$IvN57+mTsFuDk&Zi1^1E&S@>q>WU1a1$Pjv7V=X9_rL!pM=b^kXCH zKmq6Q79-n`@kT9NBVP(Qdy2BZUBG!<5IEbEo2nKD4XHo(G@XK2%Rt8hOT$Ntsg#mn zSw~*5UKJQvY6aSBs#P!c9{6f12tqBj$5RE|_IY2+SgYuprtdzKjm*&ndkTt}V()HWisOG7*}{4-^pjhI&Iq0tLfhXs?Ekw;!k0%bL>7$*m6I z?Bdew+&$vXvN|Faw|rhHr|a+NFiDWWX;xzQ;Jvivm%~=nP}80fwXb`rt{Goq&GW9! zgt4|kiLSodjUx3sVW?vr$*n|#xG#svJU+o~8&jq}?+6Taqw#{r;ihtvppufEmJJ<7 z+XCOEFI>kl0iBV-ny=!adKhlDwyFo&rJlUBabuB@m;SzKaw%doQuj%>`d7r8n{dx`&dVon`S*y1@}<|~(0&}PfOK>Wx_ z216XpYv5B{;b>6kfU9_yR+!ew@#W1w!G6k@>CN>+HxHwPp7!Q3dYe#l<;u^n_a8me z-hC$V=p1drN=TJWK!S_nL4Itfe4J^Y@su`8-&&>o1G3gm<##yWBipl6`3=t8NO>2> z+e=PP&W~^yvqt~Ku>tE3oP2`9=zz70{h$9pMyZz( zWGaK=W4KS$81&8$KSmieM}h}z1#e zPId}4*U)L8^_l3$ZUMb2H!7}N5jfsCR-mDfGThf56NA_*V3eeD`B7a~1O|p@Hj`K! zxub;NG4U?;(TP>d58V?uF+9?#=@ug@X!}jPuPmp@vaEOt|A2`P@S%W7{HD(Wr#m;% z)N1&5(8M8pB#;RpBeG6z2QWrg0wX3yF-E$|(koB8D^`$I(|ydv!zPX(FEF?+*Q`m` zDM|m9?Ni9{eCha}zz@UQXR1?;w;bizvcXjBPoo6+!$E3CbG(_khSgElyb zU<}_4^G#qkk7diBW)@}^+rIKq!!*(9KYgRrCN?6^dWXX4H8v@_PFN{bq1idPqm5Sx% zW?XlzUM+5oZfxc)#l?-P)kgeoOg_Bci}93+ASPv{vS9mG(ZBg4s!dj;=UF`UT`|hcxyErJ?>xq>1md8T3(WdvY#f1uTS#ojjgG3o z{{I%`xeAHI0bZ5~-Z@Er`HlfIfTJC3kMeiSV>hAR8(SB8xWK2w)`k8+oo^^E9Vb|x ztzerP{T1RTb`m(juUZCyPx7nmQUIrLnypZ81AgCD{u%m@T#PFZv{mNC-$uE6v+`hD zWnS@Zly_}b&bC!PgHK4L+IE5aRJ5i?$9{pn+38(@_MT88a#|4*2B1K_6sr-r*%Aw$ zaGY&tqq|cZVJssXYOu*h58a=@xpp>ob!sC_i^xX*RvZ1a!516-Cs*PO+b;V2bZqo{ zq_pQ_f57+-spRvq-(k#-kG{Y_Fk~lteVm_ycKA>1$ZD^!>lw_$S?vYhYe)?CwCCJVGM1-d$nJ$3ZHDYA&f`-$ zGk_H4Yp_xqanG zgm{67LcLGLlhdjceRa3Um03y#z9BXSnMm&-<}}T8()-i0hn7 z1!R7M^czlSBvS|y2qE53yfsd!i26bI!4m& fajwifz0KBUyU6w-+a>na*xunvh3z_AJVN$gCSL0{v4ibQ zOyU{wgv1jFiB~3}J-`G*+5>`@A@Mgc#_!rr>ZV~TQgVInJ-_pP?y>*+=h1Hf&Z3$^ z7h)=uG~!4I^lj>Q^g>m))(cnHHjT0;kT_#nrgu&tHkw~eLPJtTDvfTW1x}XjTER89 z^om(%xQ0`xcy_@t+`4VKMqw!=F0EY6%@}&ca7YO#WxHYs49soYnzcM*-Ec}${c~yb zqEA4r8Lq3Z6WJd@E_;q?t^2_KGzKIv=9(2LIG9F8I+bue-D|ih9vw&{i{}NjvTjX( z($K2{gQF2`L5!vRbqPL{#$g0wj z-iBRS)E&KMFc=z3QL0tW9W526M#?1!VinmElJHwXK-fDQI&47(Z+jbtL$C}d7u=DQ ze->`KeFjU*<`zf?tk%|NwysQ1z-{fdK-PCA6qIxiy((|b>-8{|@x`Ut`Dr>iOYeD) z8&wW~cxYeEHH~SxmSQEx+sE$o>>zNaX4!5yW#h6b3)UBz0Vm{rCv?GZy&2o}RNN34 z-RlIQu8X$qxt^ofgL=5V3EWKKW86}q%d4;^klUUqrgg{OG75oP!R@%Lmp$9LEAUOU z)FCiXI-^^as^RA5Y=0bJTQ@quZ$vaSr%mK2R57JjtIMWmlr%7zr=v-0 z4NhjNVw@EdN5kAplDYREeovegdA7x@Wf{&?Rd-#3U6O2xtJn}2*_ED7QLES#IPz>L z`y)sZ=b*+h1t?tkQUGrvcinux&i^TwWS5-iyBWP?aDwk<43NQ5zMGLj4-fgK;`#=y z6!;W;#>akz_=!Xp-sCFTpoY_2r4|BEM2Sx!M?BY^!aqa(k<6&@;f}%_1=e7vJDUo9Pk_qPjAbQC_rH+{^HxyT@8u@YnBzd&uz*pM%s2@qk%WHy7c zo|AbL-1P0Pu)te5-^oVLUTp*&655cPwl3;r_!m0c*tb_3L9>N6A)Pb2gPT6b~CRJ#>c)#T)98~2efYykKG^t9oqcF*h38YTM`Es zCb$%p$v@GZRUTvCJ)|eI%0s-+L<|?>gbWuG*|@|c9;5#rdb06sA_5vIssxP`wX7;Z zS_o3JS_G6YCJD+HQ`w{hr9x0Ln`(lT`}8^%xotu3)PrbRz4HK5xWtGD@g1gl1H1T* z^d&CyEQT?BfwxI1T(>YoDvo&=m?f1!m8dJER5+~qJESyx#mvo-O5$rAB=!)h=hUgt>P8B&{ zrs<7nYMiD|bT5n^C z0mX2PX&^oM%Brd#XzTdNyJ#S=)5o0jQK3d9EnS5nZBQqhq{C(;6w6?-f1nw$EXnXkKs zlV9`fykofAw&fc6#gMqVe5-#!->upDnj}kA+pHKaNg8)O-K)C-N6JmlvzBM98%|L= zJCsJZ^b~iE9l1W7Mixf|6wi3X;4*<)-7{g_a6Nz+L~+I6LYGikgd4J4%jV@I;i zrqPdc0xDU{ew^8c#b~54yqCrR1{rBpcdI3P&G1p4&9XMbX^dc0;MkVFX_RcMqI-8t zk3tq9vphm}Bbrkq$To4eLKMwy$#YC=y(o}dtXrPBWvrO4xmq)(EXyVsCcO#d%d*T5 zbk{SSM_aZ0hF;lpZ7Z+u3FU8az2Ml}hU4whTH>Kzt23F@lDTfNzz*rLmN>?JtF6s5 z=dQCcijy>=1b}pxP0N_CZ><{6vd+*1vSquX*H(1Ll6yFcaK?MB)c zTE$-zt28ETiD7fz!g*lXY_DoK0-X}e{>EsgeeT{;3pQocsc^@qeReRF9RWXBbaARG zn{)bhSg6Fp;_TctMls9$S(ti_bFA)}SNb{W45dHN);v4tQGuh4y7$I4 z%$Tw@GLbW9OlHX0nm1hUy6t)@?g$LL>4`;K)3)uoo}+IEg>$=;;E{0`_f&i(r}Jxp z{w9j1_0Zll@R*Mu3Kw0!|gBI_GW#%7^zB_V1%zH!b)SfPoMUaKvco>A0rU!V{Lt$9$7H4o~6pcf{@$Qf2gzGQVK1dp!ttYsNa zsiwQG;i{+zTzXT8BbS0eN7FGEP1h>c1uyZIruOm1o*2^X8(9R?nGM<(qAk z12`_z_s2{t?i(r4n1newH2e$H*5r%6mEJ%iOkM&L6r?C2;cCv3>3?~~Brwa*+oGv7D2`Q6&f$S4>U5CewpQD6zX^{5CRimAp8HP{B1)3O>aQ|E4(sbGX9QG@GEt8NE(Qg~NuP zC8gm8eGVh7YJcO93hgC&RmAwOiI+GYkf|uyKzfQuEAq220F(_XNU^;nk}{F#R7I=V z7)d#tC5Et9yAmz(KEWWLvP5Gvk))y9nc}!I;TPg$rdVYew9N1msH4yD?tRHWT~Opk zP6>B3S)5?2uaNM!SQlSO%O(7+lkK6N3>=0~$FYc;C^MV{76_y4*bZ{$8Fd_I*>|@{ zDeUND+?P;GFuz6e6&VV_6oLRkh*uPEu49tXgG581A*1YPg<{EwSW~iXB8t;bGKnqZi+Vd4sw`~oiHw*Owi=X`6l_yvF8K<{9 literal 0 HcmV?d00001 diff --git a/holiday03-GTP/target/classes/com/sikadi/user/dto/response/ResponseDTO$PayloadDTO$UsageDTO$TextDTO.class b/holiday03-GTP/target/classes/com/sikadi/user/dto/response/ResponseDTO$PayloadDTO$UsageDTO$TextDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..8d1ab2be9536bbb37e5afcb6b0a7a92709c1fc2c GIT binary patch literal 3925 zcmbtX-ES0C6#w0Jc4xYsvfGvxRuBOf`w6R}fLlPIrBZC6w52GZFx^hup}RB7&Mbk% zXXBHJPZ|?nB{4iGQA~I+`htmnlZd}NAKlpxO`}P7=G=3B=bq1d&-9PKp8f*h6ucBV z(5XVvkw8))bH})6}e$3dOxo%b`r0E?x($cP8sXFC~7r>>US4W=|Wav<(WY+hR!ksz>q_Ep_ zJfjpSrO4lhw_TG6o2->n%Xfq~(eZhPyH8teSqoX8Ks>ypGrLhQO|}v1v{^cG2*zSsp>Q>lwDkeBX|T9r@oTr0ucd z$yoHNmc2e9kX@+Ro>exNE!SEpnP+XA{>wVie12B;(VF3UX7zr#l)qyXH(kfh8(X0K zMXs5xidpp@aJR%gqf}#v>8NvVd134H1g){P?yYyk7EkvZVQZ-b=}OO9wt1;mUNNgn z23-{Bn{|ptY1yb+avd@iZ^NR`)4tFDxAz%JuiM&CgYD`uvdsRTGrbLGb>65NWs}*W zBWdc#`-t5`PILFLXUL89jDT=tg!O|KwmXyScpGMw`^ZRhQHG&NIvz9zWhmwGuD0 zbc^3TxkmSTbFCiexduy`=LBsnu(RRhZ#8>r(WzC7=CmcdC=)_W04R13QqpCQS_YZ z1A(vNJr)9kO)nVsYRPnSvyQV_t4zdNBn&XdX;55xP%+!UZ^ZD?of>0>TTB|I(xT;= z6B^b8O7W!ChsTjvY?y3sTlav2pm#qQGK8eB=P{V*#R0IySl(=2xRPYe*`*$eMMo?xP;C$)e zv{3luaEHK~Ty^t(l)txJyiEb8Z>!)K1)RREg5wl$^0o?2podI;aq#($oKSoVz7wNA zL;OIZ0|h>%7`TcFKIJY1;3U6VK$^pt&qn1Rp?*(cT=`~OWe(sr%011>Mq6c0=r+ok zX63cE${gQql>3{NH`^+o#=GeBV=gdAS*+yf*iTTKGq&t&4+e-ZV=|jTS?b--BB(#xkwQ-E$pKEU;vt1iOvxPSLT5TMsjmh>l`nPK%=-bf7K&y=t zw82k1=9oPwKH;Vicd@ z0x5;-P0Wx=U=AiOl1idP{QIPM8Q~0ONon|km(3ihE_{hSxI`+2%k<+I(yI0+cBs&v zV^Bp0|1|L&y92W8A4u-&ck~piq{vVDpeQViAVra^hKw_QF~rYEbgRhwWt!fIXvb;p zDCBoFpR&xKatoCkRWcJNl~aB(_hu$GSV}E3_7LjfCm6jg`3DM$6l9f9qR9dWqFf>2 zi&$GR`Q1)P$42GFgmN~0^&^l;w8C~h0SiIvv9^cX-P* zdY*8NmUIkPcwNW#gs~bNShI)M;eHBGr) z%wPanhE$W=bKms1#V}M@JV~lre4v~MGk67;8T2h76$ryZp?F@o#4wz}6_ra;s6;%a zbS{I}@H(Z}=3cwzw1lr}eUNJLMg~_g%5bH_cSOyxn_PZjN^-J2$!+N|JSdz`ZpDZm zYtl9CttvxqwP#DSBQ{LW+_c19+jbKud^xKbx!CEgNsg+TN~Up)jE8r$+k)1W?qUWMc2K< zde+ZNvJE;KOG37tR)f2|BS;C#lsSsYsqP~Fj%*8;p-(Z&2VI`_pM{GHYm!7<;@yyX zqOn?Enj^$I^$Q)Ko<-f52%S^X3F^dfnHuys-cj|^YfjH?ig{CMn~j{iapg??wk$lk z;CNC8=~H;o<3?Eb97lT6<=ue2H;}|k8Xw_f9d}j7-ebrgCuG{Y&WVLaZhX$3xHM&G&bayct>3cx-Oz`{mz|`W}h+e)(6Vmc~j4xZp2oa%p*thDojR2l{i`@3`~`nMzJOz>x2u?GsEq zqD_$CL;!!3U=3xAkvc;dM}_oKf{fC9jP{n0Be}<*;cdbiLQ+rtg^M~;e`8ojjQ&!L zoP1_wqM)e{XGr7@VJfi_ih)Wcs&rJV!!oIYRs2*!#0p_C^{oqQ_bowa1T>nhPHEG= z03+FIo9L&q5;Q(mx8S!?Knp84&Ei;1O>QFvl!AuaKfjp$lgHg8I?sN zvWyW?F!qcTIbO$@YQy*Newf_^S=DuEmDm%)$I12zNC&-{4inMvfiKO6xZ~SNOp#3y j(lq^Qn4{HoN_`%aSb+M^X&!a5_i46Bc8NOvGvxjSN3uGl literal 0 HcmV?d00001 diff --git a/holiday03-GTP/target/classes/com/sikadi/user/dto/response/ResponseDTO$PayloadDTO.class b/holiday03-GTP/target/classes/com/sikadi/user/dto/response/ResponseDTO$PayloadDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..28ee8f3675fcf1ad5f4bd2f33240519a9fa5c1ef GIT binary patch literal 3111 zcmbtWU2_vv7=BK&$!^oM4V41Xihx0zv?VB1AZZZ@A1$_}wxuZebx7A{X}Vi?H;nxo zUOD~%x#2=*6lb__^af}A4gL%-MSRZgwprSY!-Q#b&U?;zKcDwK@7X{9ef%qcDSVzm z0!bZO7Ad3!a`)tYS#C;ut$gF|J+tl$q$e%g^3Mw-M~W*wFwmnTlSMDG0;lTEM%lC0 z<*HR~d8S)l^_{Y7dYg{zndQZZxV(I$upqaZj$9=vpw}CYRX06>3$tA)DAYo6>Z&S# z`m-27P9W9tbi-R~M zkXbYR$TfjWBgL-Vh{dK-^J*5aDM!+#^1@T*UeDq%-k@(Z7dTBAyEGPyIf0{D9K)N` z+mK$P=ByG)W_)Ilb#gq5xA3;W!40`?)*QPo{acn#CfoC+?K6?zjJ#~LUCHkRP>dyK z$#*S#ttyaTY}vlGVXj!7b+>6=v~9G&*3qWsH!PZ)=q5ZG z&3Lhzs=YMG#T8!hIn!@As|(VV8z!TtcLuFQrF5}78|_5Uf^ZZVdu|IMbo_?t3S<>1 zg`FGE&EiBH=U7^Vt-VrvQR+AmeXsb#WB0=Zl_u@OHRwJn^!HB%UrB?olwlwI&XUZwBz|YrUgb`v~f|_CCBkS-<6vo z^4>riA7n6#IUV!rX0as}+74OveP`V)hkk{Z?W(N%j=LrBZM+FZjG@wLX|Fa-uQ2O4 z>#fb|-T-4e&j~JXZJHg}@5K1Sm!KL)EmBdF&E}Hjn^glJ3Y6lYwHy9Ol;|ljb|lEg zlqj+WW^CJZYfb5S>Ltju`E}f66Ms>BV=qhWVW7fxC)M$hz+^WHZ$^&-v%gL1xFc|U zPr5o~LC2>8hyS0IWgDgpN7>sGY_LA>=Tlj28 z;gfg=$-r_Y2%UbGMt_FB+wYTs^a1jyNJ76A6+-o{ibime+lv}MQ*gSIjlLJP5uzU1 zP>Wre8DRK)rs2nj3p^VYC7~`2dM@o z@E-jf!V=Cf>j@Na8E3hdL<#3{j+BOLEW-+^6y_LFl~fv&)PICuea1iN*I_)x0UZhc z8{#Prg=CLFgw6!f(bUIN1jad4A|*VYXn%5PD~LN zb+0DyKB)vUIEf2%ElFPv;vy+60OvZiXWY;Tjt~R{LOdf=d!0}lLr85iZ1ZT(Z;_4m zE}<4hdRD1or2Q&L70_em47;yY2x54l`y=l)rdC0H1y_Ul8fG{f)OMY}1uSxPjNThe X_!7IvGN~2Lw>W>y`8GbmXUP8tJ3h)= literal 0 HcmV?d00001 diff --git a/holiday03-GTP/target/classes/com/sikadi/user/dto/response/ResponseDTO.class b/holiday03-GTP/target/classes/com/sikadi/user/dto/response/ResponseDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..87deb9d9a88ef141bf1f2b93acb13a4e71833c09 GIT binary patch literal 3193 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 literal 0 HcmV?d00001 diff --git a/holiday03-GTP/target/classes/com/sikadi/user/listener/XfXhWebSocketListener.class b/holiday03-GTP/target/classes/com/sikadi/user/listener/XfXhWebSocketListener.class new file mode 100644 index 0000000000000000000000000000000000000000..3078ddce6af3f7751ce6ee51577814ecb17592bc GIT binary patch literal 4228 zcmbVP`&$&(8Ga8e%mRZTMlA;8rDy;zVrg&{2U(fkt;M69f~RjicsZpPL>tgKoly zZ)qLSkQ7)tDo;qmmd=RL7kHL4(vh|7A=9gdhVm-ZK-W;KV*%;}Hm2Qi!?(udkY!|j z(=+VYuyJhoSfTb{ zz%{)16eD-sp8noytiVbQt8}c!7X?-*J!xBma!?w>(ho*`*D((C_4f1*j+*I!-cCr* zH*;@WTZ%%ID%k0?rSGR&3w9#KR5hBgM#ow_NH0gsV81DOdjeZpTDw0h^yWy3PS9K{ z+BB@wu^t-)9=>-I0vcg-x zj*eaUGIL;Dj+vdVla|3zE6DK452O?L0^162C5OMjrPx@Zm+@8&cB4Z>r;a_?D^Ncl zu0Vz9c`k2iap4&`g9AxCD)8XU8&^KMdU@vJvokNBnYnfLUuVzXxpwX2_n*6SZTj}r zGczwfKl99)JJ()O$=apTf3Kp$K^@&V6b0e1JY~CbNMP%|@FCWU2+@nf8osLI2>Jvz ze`Z3=+K7;JW?U<6GNv7$4@q-uAOiImn4U*<9K+)RyFLe~0&@{#`^}R~%7z?QvVmnA zs&J-i@C3f5;p;lSfo}>d2`WwfgZao7r;!qXZ~>-YhF$b6rljQeDo_opz^ zlc<~stSO8~uKv!~WUWa=wXUw)a?GCW_@L?aD^J22m6rB^^epurZzh6_#U$8NRGdG( zm+~BiZFk&H@6QpfxN%dm*7A=QcG9ZJ+$12dDBmjc{hAudTt^F0$MZw3x$*b-4Jy?Du>jc)gIbivga_`iHx!ZAE(!gT<6j&Qx#7W}>o8VBmX{1$Q^(1S% zZ}hl9Pu8|+d-YsH`7`ENs~ivcEYMUGIMt9Nw$oT5h|;*21p<1`$vrZV0&OKNkNyVHL_r*Bi@i z7!Kp%a7r z#%t_w-9TNzM0B5iT_t{BjVrjS;SZ`A{!yTLHY+XXgga)&b79mU^O^E$VRpoVka~v58J;+kLFWsU+SMSU2;+OSjLy zp6{2@!|h9_KfH14P&DPpH;5ND?bafgmV3x^OTpBROW9PoZTB8_(mRchDZcN6RC(umiY> zuaqIYk%oQK*sty+q3(n-2d2<7h5nm3F0eh(n7D~=37p3Y^)xK-0YM31f;|QI z=#~Hevm&zX^TfV|tFezhq47sqre2mg52?8<6+}2Q@T(f_e?| z-&oU781-`$xreB8XoyMB&ox2iB%{7z8YkwnU?*>TSBSkWlFK7b<`F0H8h#aWCK>Xf zJVaJo9`fNe8qaZJDaz+^VhM@%YYHf8)T!i}rG}yir;uWpO@#UF`7k>Ov-AJLyolFh zn3ovhIWR90!6km?1(Eo2)Xn3|kvECUVVbI3T1B+#ud1Qu2EP9;+7&=ikjZsC?l;^k s!*B5hS5;Yl$IqYeXTGhbo2~qJ;xDK|FV|~aALG+oT;ImKxQ@pE0hw`KBme*a literal 0 HcmV?d00001 diff --git a/holiday03-GTP/target/classes/com/sikadi/user/mapper/XfXhConfig.class b/holiday03-GTP/target/classes/com/sikadi/user/mapper/XfXhConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..9c6f8e17925fb114411280cc559c27e3cf8f240c GIT binary patch literal 5314 zcmb_g>vP;z75`m(ccop+-t{JSvw4w+6Z}ZBlt2JE4oTg(F}2eWyJ^}2t+JMF#p~5p zl2eB_lxHcA@)#IC@C`Dgu%HT6R_hv{ly+p7fdm z)wvG)Lf|>Al}X7rV4y6?3QO*~<+P+~&_ESC1o{GdoqSfX;n@O%DgT+KYXzbEkbz-5 zBv4$pHW%GByX6b)NFirifxTjTA+}~W5&blq%x!1rx`5AdmVRlJs z-eKTC_+eJtdECA!Rfh~5mZ~CE3wFb^gA%nz3>?Kf1@wm1I{(6k)f5;SO?`q2<>c5i z5$10R%Ho!WCU zgi?9Vz#}pATo^^Eebm5tsg<8kZ5+rRJZ9hmX34Q?`AncCE;_Srw#r<6+`t^>1s+5mXN7gcg^7)-Uf9KA->8BF`WFJLu{LkD zqvXk7x;#67o`Gad6+GMDXtJRj-N7l1q{2{))!rGt=@3i(Kmy-l|buiui4;6K}XiX`Ao-at{WuYZO`S-5;(Ts?R_cHlc&)3 z>}6+@HM_aIxypQdgcN?@S#4EAez}0Jl<-x&tl?|2LA@d{(%Iyk)(vh*brlKKvu3PD z;Cfu#AEfIg0xHrAR%@wg`y+F%ySCAuOf{pZh*O#_$Hkj%I|Ke~3Lo!8DOE%!_=Z5MvrePY@=u9l2h{RQDOGcFn50lNNT-lgh1sG6nJtl|vSmt)F)3$TE!&%J zTE1`l8eSDRa!(wy!lU6k0{b5f_RB;evzX(pMuZ)_^%;;5yGC}U7CS@T;knO0DKsiITCWe<-Oba zSI~Y=V-Gsc)l6q@zZuT`Tb+k9oq77maIS21-ks^pV@HPb&aKY-Go5(^$#CAa)%j4S zGY=OT&U>~xAI)^;Atb|j|5oSmOlO`|GMo=?bv}{lynsb6s9a~0Pnmp$@rl= zj5jlP{Ez6X<=({LEf~jZxjQ%(BkE?Jkh)o@8YKh&;Im1oAO9lTI;8<_P%~&zDvJWn!lhIZ zN4Qb8DGiDV?7<6^s(c&xeS0+hKN!%UzlC89J^a(fTiB(<;{QR6JKb|k(wzKNt&%kC zz_NMfWp>IKr#DFzW7RwJaf}%?i(j6ky%nZCe_m3>cHDc26n!N6XJztqZYoUfy_LyT zrnX+0xCQO_9n3s0^>s5R4Ygck(PhFb(@8TQnwaaMlU~cmrc-7iG!+sPD?oXfrWTr* z{E?Ryo2E=XH0gYKXjwv1!^Yg{D$sVvW#iZ+0@a)x4uX_2O^v5ilxw z{1qFNdYC?c#tjCqm;def4PK;_!x{Vto0Rf+8ZY4{r2?_5_&6mE-(-q@f|8D(a+Cig zr6T^ocKazxC7C?pm#EyOBBwzYf(Zj5?(zklagS6CAs+)`Os-oM!3rr@2f0-nfwgXM z2cKbxT=aWfI$qhf$dUgZQxhaU{TI$RC;xkvZI0Ya_px{0{vbp|(szH74$s?wNX4A^ zbaM8&#I=>j*`q9pQ@l)GqrB?8PV$naa+cTh>-Z3`^>CCv1RsquFNe>Bh5T83j?Xev j;`4mI#J7CG#~1M>4&*Dp%yV|$$UDW;ufe-Qr literal 0 HcmV?d00001 diff --git a/holiday03-GTP/target/classes/com/sikadi/user/service/GTPService.class b/holiday03-GTP/target/classes/com/sikadi/user/service/GTPService.class new file mode 100644 index 0000000000000000000000000000000000000000..a79d09618806684a90226882bbfb6d634123c9ac GIT binary patch literal 218 zcmZXOO%4G;5QSe2W*7_3U?FVu0mPOKAsH8FJ(baZW}>@i4rk#24kbz~EG+8hy-L1% z&)59{V1a&uh%hqMRe5{XxmC4ir=%KdSgrQE?7Jpt6NV?%?eS`rx`3DQ9< PIuX?&bU!9~(j%mAE>1W$ literal 0 HcmV?d00001 diff --git a/holiday03-GTP/target/classes/com/sikadi/user/service/impl/GTPServiceImpl.class b/holiday03-GTP/target/classes/com/sikadi/user/service/impl/GTPServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..7ee88409a405145c7985357ab4bee6b7dbc4395f GIT binary patch literal 3698 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 + + + Three + com.bwie + 1.0-SNAPSHOT + + 4.0.0 + + holiday03-common + + + 8 + 8 + UTF-8 + + + + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + io.jsonwebtoken + jjwt + 0.9.1 + + + + com.alibaba + fastjson + 1.2.80 + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.springframework.boot + spring-boot-starter-validation + + + + org.apache.commons + commons-lang3 + + + + org.projectlombok + lombok + + + + cn.hutool + hutool-all + 5.8.3 + + + + com.aliyun + dysmsapi20170525 + 2.0.1 + + + + org.springframework.boot + spring-boot-starter-amqp + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + 2.9.10 + + + + com.aliyun.oss + aliyun-sdk-oss + 3.10.2 + + + + com.github.tobato + fastdfs-client + 1.26.5 + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + + + com.aliyun.oss + aliyun-sdk-oss + 3.11.0 + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + cn.hutool + hutool-all + 5.8.18 + + + org.springframework.boot + spring-boot-starter-web + + + com.alibaba + fastjson + 1.2.67 + + + org.java-websocket + Java-WebSocket + 1.3.8 + + + com.squareup.okhttp3 + okhttp + 4.10.0 + + + org.projectlombok + lombok + + + + diff --git a/holiday03-common/src/main/java/com/bwie/common/constants/Constants.java b/holiday03-common/src/main/java/com/bwie/common/constants/Constants.java new file mode 100644 index 0000000..a8a2243 --- /dev/null +++ b/holiday03-common/src/main/java/com/bwie/common/constants/Constants.java @@ -0,0 +1,21 @@ +package com.bwie.common.constants; + +/** + * @ClassName Constants + * @Description 系统常量 + * @Author Lichuang + * @Date 2023/10/3 15:05 + * @Version 1.0 + */ +public class Constants { + /** + * 成功标记 + */ + public static final Integer SUCCESS = 200; + public static final String SUCCESS_MSG = "操作成功"; + /** + * 失败标记 + */ + public static final Integer ERROR = 500; + public static final String ERROR_MSG = "操作异常"; +} diff --git a/holiday03-common/src/main/java/com/bwie/common/constants/JwtConstants.java b/holiday03-common/src/main/java/com/bwie/common/constants/JwtConstants.java new file mode 100644 index 0000000..5101de0 --- /dev/null +++ b/holiday03-common/src/main/java/com/bwie/common/constants/JwtConstants.java @@ -0,0 +1,30 @@ +package com.bwie.common.constants; + +/** + * @ClassName JwtConstants + * @Description Jwt常量 + * @Author Lichuang + * @Date 2023/10/3 15:07 + * @Version 1.0 + */ +public class JwtConstants { + /** + * 用户ID字段 + */ + public static final String DETAILS_USER_ID = "user_id"; + + /** + * 用户名字段 + */ + public static final String DETAILS_USERNAME = "username"; + + /** + * 用户标识 + */ + public static final String USER_KEY = "user_key"; + + /** + * 令牌秘钥 + */ + public final static String SECRET = "abcdefghijklmnopqrstuvwxyz"; +} diff --git a/holiday03-common/src/main/java/com/bwie/common/constants/TokenConstants.java b/holiday03-common/src/main/java/com/bwie/common/constants/TokenConstants.java new file mode 100644 index 0000000..d8841a1 --- /dev/null +++ b/holiday03-common/src/main/java/com/bwie/common/constants/TokenConstants.java @@ -0,0 +1,27 @@ +package com.bwie.common.constants; + +/** + * @ClassName TokenConstants + * @Description 令牌常量 + * @Author Lichuang + * @Date 2023/10/3 15:08 + * @Version 1.0 + */ +public class TokenConstants { + /** + * 缓存有效期,默认720(分钟) + */ + public final static long EXPIRATION = 720; + /** + * 缓存刷新时间,默认120(分钟) + */ + public final static long REFRESH_TIME = 120; + /** + * 权限缓存前缀 + */ + public final static String LOGIN_TOKEN_KEY = "login_tokens:"; + /** + * token标识 + */ + public static final String TOKEN = "token"; +} diff --git a/holiday03-common/src/main/java/com/bwie/common/result/PageResult.java b/holiday03-common/src/main/java/com/bwie/common/result/PageResult.java new file mode 100644 index 0000000..4ec8dc0 --- /dev/null +++ b/holiday03-common/src/main/java/com/bwie/common/result/PageResult.java @@ -0,0 +1,37 @@ +package com.bwie.common.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @ClassName PageResult + * @Description 列表返回结果集 + * @Author Lichuang + * @Date 2023/10/3 15:09 + * @Version 1.0 + */ +@Data +public class PageResult implements Serializable { + /** + * 总条数 + */ + private long total; + /** + * 结果集合 + */ + private List list; + public PageResult() { + } + public PageResult(long total, List list) { + this.total = total; + this.list = list; + } + public static PageResult toPageResult(long total, List list){ + return new PageResult(total , list); + } + public static Result> toResult(long total, List list){ + return Result.success(PageResult.toPageResult(total,list)); + } +} diff --git a/holiday03-common/src/main/java/com/bwie/common/result/Result.java b/holiday03-common/src/main/java/com/bwie/common/result/Result.java new file mode 100644 index 0000000..322b701 --- /dev/null +++ b/holiday03-common/src/main/java/com/bwie/common/result/Result.java @@ -0,0 +1,56 @@ +package com.bwie.common.result; + +import com.bwie.common.constants.Constants; +import lombok.Data; + +import java.io.Serializable; + +/** + * @ClassName Result + * @Description 响应信息主体 + * @Author Lichuang + * @Date 2023/10/3 15:08 + * @Version 1.0 + */ +@Data +public class Result implements Serializable { + private static final long serialVersionUID = 1L; + /** 成功 */ + public static final int SUCCESS = Constants.SUCCESS; + /** 失败 */ + public static final int FAIL = Constants.ERROR; + private int code; + private String msg; + private T data; + public static Result success() { + return restResult(null, SUCCESS, Constants.SUCCESS_MSG); + } + public static Result success(T data) { + return restResult(data, SUCCESS, Constants.SUCCESS_MSG); + } + public static Result success(T data, String msg) { + return restResult(data, SUCCESS, msg); + } + public static Result error() { + return restResult(null, FAIL, Constants.ERROR_MSG); + } + public static Result error(String msg) { + return restResult(null, FAIL, msg); + } + public static Result error(T data) { + return restResult(data, FAIL, Constants.ERROR_MSG); + } + public static Result error(T data, String msg) { + return restResult(data, FAIL, msg); + } + public static Result error(int code, String msg) { + return restResult(null, code, msg); + } + private static Result restResult(T data, int code, String msg) { + Result apiResult = new Result<>(); + apiResult.setCode(code); + apiResult.setData(data); + apiResult.setMsg(msg); + return apiResult; + } +} diff --git a/holiday03-common/src/main/java/com/bwie/common/utils/DLXQueue.java b/holiday03-common/src/main/java/com/bwie/common/utils/DLXQueue.java new file mode 100644 index 0000000..2e506fb --- /dev/null +++ b/holiday03-common/src/main/java/com/bwie/common/utils/DLXQueue.java @@ -0,0 +1,77 @@ +package com.bwie.common.utils; + +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.DirectExchange; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + +@Component +public class DLXQueue { + // routingKey + private static final String DEAD_ROUTING_KEY = "dead.routingkey"; + private static final String ROUTING_KEY = "routingkey"; + private static final String DEAD_EXCHANGE = "dead.exchange"; + private static final String EXCHANGE = "common.exchange"; + @Autowired + RabbitTemplate rabbitTemplate; + @Resource + RabbitAdmin rabbitAdmin; + + /** + * 发送死信队列,过期后进入死信交换机,进入死信队列 + * + * @param queueName 队列名称 + * @param deadQueueName 死信队列名称 + * @param params 消息内容 + * @param expiration 过期时间 毫秒 + */ + public void sendDLXQueue(String queueName, String deadQueueName, Object params, Integer expiration) { + /** + * ----------------------------------先创建一个ttl队列和死信队列-------------------------------------------- + */ + Map map = new HashMap<>(); + // 队列设置存活时间,单位ms, 必须是整形数据。 + map.put("x-message-ttl", expiration); + // 设置死信交换机 + map.put("x-dead-letter-exchange", DEAD_EXCHANGE); + // 设置死信交换器路由 + map.put("x-dead-letter-routing-key", DEAD_ROUTING_KEY); + /*参数1:队列名称 参数2:持久化 参数3:是否排他 参数4:自动删除队列 参数5:队列参数*/ + Queue queue = new Queue(queueName, true, false, false, map); + rabbitAdmin.declareQueue(queue); + /** + * ---------------------------------创建交换机--------------------------------------------- + */ + DirectExchange directExchange = new DirectExchange(EXCHANGE, true, false); + rabbitAdmin.declareExchange(directExchange); + /** + * ---------------------------------队列绑定交换机--------------------------------------------- + */ + Binding binding = BindingBuilder.bind(queue).to(directExchange).with(ROUTING_KEY); + rabbitAdmin.declareBinding(binding); + /** + * ---------------------------------在创建一个死信交换机和队列,接收死信队列--------------------------------------------- + */ + DirectExchange deadExchange = new DirectExchange(DEAD_EXCHANGE, true, false); + rabbitAdmin.declareExchange(deadExchange); + + Queue deadQueue = new Queue(deadQueueName, true, false, false); + rabbitAdmin.declareQueue(deadQueue); + /** + * ---------------------------------队列绑定死信交换机--------------------------------------------- + */ + // 将队列和交换机绑定 + Binding deadbinding = BindingBuilder.bind(deadQueue).to(deadExchange).with(DEAD_ROUTING_KEY); + rabbitAdmin.declareBinding(deadbinding); + // 发送消息 + rabbitTemplate.convertAndSend(EXCHANGE, ROUTING_KEY, params); + } +} diff --git a/holiday03-common/src/main/java/com/bwie/common/utils/DelayedQueue.java b/holiday03-common/src/main/java/com/bwie/common/utils/DelayedQueue.java new file mode 100644 index 0000000..ffc5e1c --- /dev/null +++ b/holiday03-common/src/main/java/com/bwie/common/utils/DelayedQueue.java @@ -0,0 +1,77 @@ +package com.bwie.common.utils; + +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.CustomExchange; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + +/** + * 发送延迟队列的工具类 + */ +@Component +public class DelayedQueue { + + // routingKey + private static final String DELAYED_ROUTING_KEY = "delayed.routingkey"; + + // 延迟队列交换机 + private static final String DELAYED_EXCHANGE = "delayed.exchange"; + + @Autowired + RabbitTemplate rabbitTemplate; + + @Resource + RabbitAdmin rabbitAdmin; + + /** + * 发送延迟队列 + * + * @param queueName 队列名称 + * @param params 消息内容 + * @param expiration 延迟时间 毫秒 + */ + public void sendDelayedQueue(String queueName, Object params, Integer expiration) { + // 先创建一个队列 + Queue queue = new Queue(queueName); + rabbitAdmin.declareQueue(queue); + + // 创建延迟队列交换机 + CustomExchange customExchange = createCustomExchange(); + rabbitAdmin.declareExchange(customExchange); + + // 将队列和交换机绑定 + Binding binding = BindingBuilder.bind(queue).to(customExchange).with(DELAYED_ROUTING_KEY).noargs(); + rabbitAdmin.declareBinding(binding); + + // 发送延迟消息 + rabbitTemplate.convertAndSend(DELAYED_EXCHANGE, DELAYED_ROUTING_KEY, params, msg -> { + // 发送消息的时候 延迟时长 + msg.getMessageProperties().setDelay(expiration); + return msg; + }); + } + + private CustomExchange createCustomExchange() { + Map arguments = new HashMap<>(); + /** + * 参数说明: + * 1.交换机的名称 + * 2.交换机的类型 + * 3.是否需要持久化 + * 4.是否自动删除 + * 5.其它参数 + */ + arguments.put("x-delayed-type", "direct"); + return new CustomExchange(DELAYED_EXCHANGE, "x-delayed-message", true, false, arguments); + } + +} + diff --git a/holiday03-common/src/main/java/com/bwie/common/utils/FastUtil.java b/holiday03-common/src/main/java/com/bwie/common/utils/FastUtil.java new file mode 100644 index 0000000..9f4050a --- /dev/null +++ b/holiday03-common/src/main/java/com/bwie/common/utils/FastUtil.java @@ -0,0 +1,55 @@ +package com.bwie.common.utils; + +import com.github.tobato.fastdfs.domain.fdfs.StorePath; +import com.github.tobato.fastdfs.service.FastFileStorageClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; + +/** + * @BelongsProject: 0107day02 + * @BelongsPackage: com.bw.config + * @Author: zhupengfei + * @CreateTime: 2023-02-01 08:52 + */ +@Component +public class FastUtil { + private static final Logger log = LoggerFactory.getLogger(FastUtil.class); + + @Resource + private FastFileStorageClient storageClient ; + + /** + * 上传文件 + */ + public String upload(MultipartFile multipartFile) throws Exception { + String originalFilename = multipartFile.getOriginalFilename(). + substring(multipartFile.getOriginalFilename(). + lastIndexOf(".") + 1); + StorePath storePath = this.storageClient.uploadImageAndCrtThumbImage( + multipartFile.getInputStream(), + multipartFile.getSize(),originalFilename , null); + return storePath.getFullPath() ; + } + /** + * 删除文件 + */ + public String deleteFile(String fileUrl) { + if (StringUtils.isEmpty(fileUrl)) { + log.info("fileUrl == >>文件路径为空..."); + return "文件路径不能为空"; + } + try { + StorePath storePath = StorePath.parseFromUrl(fileUrl); + storageClient.deleteFile(storePath.getGroup(), storePath.getPath()); + } catch (Exception e) { + log.error(e.getMessage()); + } + return "删除成功"; + } + +} diff --git a/holiday03-common/src/main/java/com/bwie/common/utils/HttpUtils.java b/holiday03-common/src/main/java/com/bwie/common/utils/HttpUtils.java new file mode 100644 index 0000000..56f9897 --- /dev/null +++ b/holiday03-common/src/main/java/com/bwie/common/utils/HttpUtils.java @@ -0,0 +1,310 @@ +package com.bwie.common.utils; + +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.HttpClient; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.conn.ClientConnectionManager; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.conn.ssl.SSLSocketFactory; +import org.apache.http.entity.ByteArrayEntity; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.message.BasicNameValuePair; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class HttpUtils { + + /** + * get + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @return + * @throws Exception + */ + public static HttpResponse doGet(String host, String path, String method, + Map headers, + Map querys) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpGet request = new HttpGet(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + return httpClient.execute(request); + } + + /** + * post form + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param bodys + * @return + * @throws Exception + */ + public static HttpResponse doPost(String host, String path, String method, + Map headers, + Map querys, + Map bodys) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPost request = new HttpPost(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (bodys != null) { + List nameValuePairList = new ArrayList(); + + for (String key : bodys.keySet()) { + nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key))); + } + UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8"); + formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8"); + request.setEntity(formEntity); + } + + return httpClient.execute(request); + } + + /** + * Post StringAppGTP + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpResponse doPost(String host, String path, String method, + Map headers, + Map querys, + String body) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPost request = new HttpPost(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (StringUtils.isNotBlank(body)) { + request.setEntity(new StringEntity(body, "utf-8")); + } + + return httpClient.execute(request); + } + + /** + * Post stream + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpResponse doPost(String host, String path, String method, + Map headers, + Map querys, + byte[] body) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPost request = new HttpPost(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (body != null) { + request.setEntity(new ByteArrayEntity(body)); + } + + return httpClient.execute(request); + } + + /** + * Put StringAppGTP + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpResponse doPut(String host, String path, String method, + Map headers, + Map querys, + String body) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPut request = new HttpPut(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (StringUtils.isNotBlank(body)) { + request.setEntity(new StringEntity(body, "utf-8")); + } + + return httpClient.execute(request); + } + + /** + * Put stream + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpResponse doPut(String host, String path, String method, + Map headers, + Map querys, + byte[] body) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPut request = new HttpPut(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (body != null) { + request.setEntity(new ByteArrayEntity(body)); + } + + return httpClient.execute(request); + } + + /** + * Delete + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @return + * @throws Exception + */ + public static HttpResponse doDelete(String host, String path, String method, + Map headers, + Map querys) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpDelete request = new HttpDelete(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + return httpClient.execute(request); + } + + private static String buildUrl(String host, String path, Map querys) throws UnsupportedEncodingException { + StringBuilder sbUrl = new StringBuilder(); + sbUrl.append(host); + if (!StringUtils.isBlank(path)) { + sbUrl.append(path); + } + if (null != querys) { + StringBuilder sbQuery = new StringBuilder(); + for (Map.Entry query : querys.entrySet()) { + if (0 < sbQuery.length()) { + sbQuery.append("&"); + } + if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) { + sbQuery.append(query.getValue()); + } + if (!StringUtils.isBlank(query.getKey())) { + sbQuery.append(query.getKey()); + if (!StringUtils.isBlank(query.getValue())) { + sbQuery.append("="); + sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8")); + } + } + } + if (0 < sbQuery.length()) { + sbUrl.append("?").append(sbQuery); + } + } + + return sbUrl.toString(); + } + + private static HttpClient wrapClient(String host) { + HttpClient httpClient = new DefaultHttpClient(); + if (host.startsWith("https://")) { + sslClient(httpClient); + } + + return httpClient; + } + + private static void sslClient(HttpClient httpClient) { + try { + SSLContext ctx = SSLContext.getInstance("TLS"); + X509TrustManager tm = new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { + return null; + } + public void checkClientTrusted(X509Certificate[] xcs, String str) { + + } + public void checkServerTrusted(X509Certificate[] xcs, String str) { + + } + }; + ctx.init(null, new TrustManager[] { tm }, null); + SSLSocketFactory ssf = new SSLSocketFactory(ctx); + ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + ClientConnectionManager ccm = httpClient.getConnectionManager(); + SchemeRegistry registry = ccm.getSchemeRegistry(); + registry.register(new Scheme("https", 443, ssf)); + } catch (KeyManagementException ex) { + throw new RuntimeException(ex); + } catch (NoSuchAlgorithmException ex) { + throw new RuntimeException(ex); + } + } +} diff --git a/holiday03-common/src/main/java/com/bwie/common/utils/JwtUtils.java b/holiday03-common/src/main/java/com/bwie/common/utils/JwtUtils.java new file mode 100644 index 0000000..014e8c1 --- /dev/null +++ b/holiday03-common/src/main/java/com/bwie/common/utils/JwtUtils.java @@ -0,0 +1,106 @@ +package com.bwie.common.utils; + +import com.bwie.common.constants.JwtConstants; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +import java.util.Map; + +/** + * @ClassName JwtUtils + * @Description Jwt工具类 + * @Author Lichuang + * @Date 2023/10/3 16:10 + * @Version 1.0 + */ +public class JwtUtils { + public static String secret = JwtConstants.SECRET; + /** + * 从数据声明生成令牌 + * + * @param claims 数据声明 + * @return 令牌 + */ + public static String createToken(Map claims){ + String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, secret).compact(); + return token; + } + /** + * 从令牌中获取数据声明 + * + * @param token 令牌 + * @return 数据声明 + */ + public static Claims parseToken(String token){ + return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); + } + /** + * 根据令牌获取用户标识 + * + * @param token 令牌 + * @return 用户ID + */ + public static String getUserKey(String token){ + Claims claims = parseToken(token); + return getValue(claims, JwtConstants.USER_KEY); + } + /** + * 根据令牌获取用户标识 + * + * @param claims 身份信息 + * @return 用户ID + */ + public static String getUserKey(Claims claims){ + return getValue(claims, JwtConstants.USER_KEY); + } + /** + * 根据令牌获取用户ID + * + * @param token 令牌 + * @return 用户ID + */ + public static String getUserId(String token){ + Claims claims = parseToken(token); + return getValue(claims, JwtConstants.DETAILS_USER_ID); + } + /** + * 根据身份信息获取用户ID + * + * @param claims 身份信息 + * @return 用户ID + */ + public static String getUserId(Claims claims){ + return getValue(claims, JwtConstants.DETAILS_USER_ID); + } + /** + * 根据令牌获取用户名 + * + * @param token 令牌 + * @return 用户名 + */ + public static String getUserName(String token){ + Claims claims = parseToken(token); + return getValue(claims, JwtConstants.DETAILS_USERNAME); + } + /** + * 根据身份信息获取用户名 + * + * @param claims 身份信息 + * @return 用户名 + */ + public static String getUserName(Claims claims){ + return getValue(claims, JwtConstants.DETAILS_USERNAME); + } + /** + * 根据身份信息获取键值 + * + * @param claims 身份信息 + * @param key 键 + * @return 值 + */ + public static String getValue(Claims claims, String key){ + Object obj = claims.get(key); + return obj == null ? "" : obj.toString(); + } +} diff --git a/holiday03-common/src/main/java/com/bwie/common/utils/MsgUtil.java b/holiday03-common/src/main/java/com/bwie/common/utils/MsgUtil.java new file mode 100644 index 0000000..fc8b620 --- /dev/null +++ b/holiday03-common/src/main/java/com/bwie/common/utils/MsgUtil.java @@ -0,0 +1,34 @@ +package com.bwie.common.utils; + + +import org.apache.http.HttpResponse; + +import java.util.HashMap; +import java.util.Map; + +public class MsgUtil { + + + public static void sendMsg(String phone, String code){ + String host = "http://dingxin.market.alicloudapi.com"; + String path = "/dx/sendSms"; + String method = "POST"; + //StringAppGTP appcode = "0d534f614a8647ca94d697eec974aa63"; + String appcode = "dcb3dabebd3843a7a138901659ed112a"; + Map headers = new HashMap(); + headers.put("Authorization", "APPCODE " + appcode); + Map querys = new HashMap(); + querys.put("mobile", phone); + querys.put("param", "code:"+code); + querys.put("tpl_id", "TP1711063"); + Map bodys = new HashMap(); + + try { + + HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys); + System.out.println(response.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/holiday03-common/src/main/java/com/bwie/common/utils/OssUtil.java b/holiday03-common/src/main/java/com/bwie/common/utils/OssUtil.java new file mode 100644 index 0000000..bf88011 --- /dev/null +++ b/holiday03-common/src/main/java/com/bwie/common/utils/OssUtil.java @@ -0,0 +1,153 @@ +package com.bwie.common.utils; + +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.model.GetObjectRequest; +import com.aliyun.oss.model.PutObjectRequest; +import lombok.extern.log4j.Log4j2; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; +import java.time.LocalDateTime; +import java.util.UUID; + +/** + * Oss服务调用 + */ +@Log4j2 +public class OssUtil { + + /** + * Endpoint 存储对象概述 阿里云主账号AccessKey,accessKeySecret拥有所有API的访问权限 访问路径前缀 存储对象概述 + */ + private static String endPoint = "oss-cn-shanghai.aliyuncs.com"; + private static String accessKeyId = "LTAI5tPHcqEdn49yrDCNpLhb"; + private static String accessKeySecret = "C29u7EmS0TFlgMBzVszvuPFUxsKJuW"; + private static String accessPre = "https://liushiqian.oss-cn-shanghai.aliyuncs.com/"; + + /** + * bucket名称 + * @return + */ + private static String bucketName = "liushiqian"; + + private static OSS ossClient ; + + static { + ossClient = new OSSClientBuilder().build( + endPoint, + accessKeyId, + accessKeySecret); + log.info("oss服务连接成功!"); + } + + /** + * 默认路径上传本地文件 + * @param filePath + */ + public static String uploadFile(String filePath){ + return uploadFileForBucket(bucketName,getOssFilePath(filePath) ,filePath); + } + + /** + * 默认路径上传multipartFile文件 + * @param multipartFile + */ + public static String uploadMultipartFile(MultipartFile multipartFile) { + return uploadMultipartFile(bucketName,getOssFilePath(multipartFile.getOriginalFilename()),multipartFile); + } + /** + * 上传 multipartFile 类型文件 + * @param bucketName + * @param ossPath + * @param multipartFile + */ + public static String uploadMultipartFile(String bucketName , String ossPath , MultipartFile multipartFile){ + InputStream inputStream = null; + try { + inputStream = multipartFile.getInputStream(); + } catch (IOException e) { + e.printStackTrace(); + } + uploadFileInputStreamForBucket(bucketName, ossPath, inputStream); + return accessPre+ossPath; + } + + /** + * 使用File上传PutObject上传文件 ** 程序默认使用次方法上传 + * @param bucketName 实例名称 + * @param ossPath oss存储路径 + * @param filePath 本地文件路径 + */ + public static String uploadFileForBucket(String bucketName , String ossPath , String filePath) { + // 创建PutObjectRequest对象。 + PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, ossPath, new File(filePath)); + + // 上传 + ossClient.putObject(putObjectRequest); + return accessPre+ossPath; + } + + /** + * 使用文件流上传到指定的bucket实例 + * @param bucketName 实例名称 + * @param ossPath oss存储路径 + * @param filePath 本地文件路径 + */ + public static String uploadFileInputStreamForBucket(String bucketName , String ossPath , String filePath){ + + // 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。 + InputStream inputStream = null; + try { + inputStream = new FileInputStream(filePath); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + // 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。 + uploadFileInputStreamForBucket(bucketName, ossPath, inputStream); + return accessPre+ossPath; + } + + public static void uploadFileInputStreamForBucket(String bucketName , String ossPath , InputStream inputStream ){ + ossClient.putObject(bucketName, ossPath, inputStream); + } + + /** + * 下载 + * @param ossFilePath + * @param filePath + */ + public static void downloadFile(String ossFilePath , String filePath ){ + downloadFileForBucket(bucketName , ossFilePath , filePath); + } + /** + * 下载 + * @param bucketName 实例名称 + * @param ossFilePath oss存储路径 + * @param filePath 本地文件路径 + */ + public static void downloadFileForBucket(String bucketName , String ossFilePath , String filePath ){ + ossClient.getObject(new GetObjectRequest(bucketName, ossFilePath), new File(filePath)); + } + + /** + * + * @return + */ + public static String getOssDefaultPath(){ + LocalDateTime now = LocalDateTime.now(); + String url = + now.getYear()+"/"+ + now.getMonth()+"/"+ + now.getDayOfMonth()+"/"+ + now.getHour()+"/"+ + now.getMinute()+"/"; + return url; + } + + public static String getOssFilePath(String filePath){ + String fileSuf = filePath.substring(filePath.indexOf(".") + 1); + return getOssDefaultPath() + UUID.randomUUID().toString() + "." + fileSuf; + } + +} diff --git a/holiday03-common/src/main/java/com/bwie/common/utils/StringUtils.java b/holiday03-common/src/main/java/com/bwie/common/utils/StringUtils.java new file mode 100644 index 0000000..0a1f5c4 --- /dev/null +++ b/holiday03-common/src/main/java/com/bwie/common/utils/StringUtils.java @@ -0,0 +1,71 @@ +package com.bwie.common.utils; + +import org.springframework.util.AntPathMatcher; + +import java.util.Collection; +import java.util.List; + +/** + * @ClassName StringUtils + * @Description 字符串处理工具类 + * @Author Lichuang + * @Date 2023/10/3 16:11 + * @Version 1.0 + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils { + + /** + * * 判断一个对象是否为空 + * + * @param object Object + * @return true:为空 false:非空 + */ + public static boolean isNull(Object object) { + return object == null; + } + + /** + * * 判断一个Collection是否为空, 包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Collection coll) { + return isNull(coll) || coll.isEmpty(); + } + + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) { + if (isEmpty(str) || isEmpty(strs)) { + return false; + } + for (String pattern : strs) { + if (isMatch(pattern, str)) + { + return true; + } + } + return false; + } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return + */ + public static boolean isMatch(String pattern, String url) { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } +} diff --git a/holiday03-common/src/main/java/com/bwie/common/utils/TelSmsUtils.java b/holiday03-common/src/main/java/com/bwie/common/utils/TelSmsUtils.java new file mode 100644 index 0000000..324f67a --- /dev/null +++ b/holiday03-common/src/main/java/com/bwie/common/utils/TelSmsUtils.java @@ -0,0 +1,87 @@ +package com.bwie.common.utils; + +import com.alibaba.fastjson.JSONObject; +import com.aliyun.dysmsapi20170525.Client; +import com.aliyun.dysmsapi20170525.models.SendSmsRequest; +import com.aliyun.dysmsapi20170525.models.SendSmsResponse; +import com.aliyun.teaopenapi.models.Config; +import lombok.extern.log4j.Log4j2; + +import java.util.Map; + +/** + * 短信工具类 + */ +@Log4j2 +public class TelSmsUtils { + + /** + * 阿里云主账号AccessKey,accessKeySecret拥有所有API的访问权限 + */ + private static String accessKeyId = "LTAIEVXszCmcd1T5"; + private static String accessKeySecret = "2zHwciQXln8wExSEnkIYtRTSwLeRNd"; + + /** + * 短信访问域名 + */ + private static String endpoint = "dysmsapi.aliyuncs.com"; + /** + * 短信签名 + */ + private static String signName = "登录验证"; + + /** + * 实例化短信对象 + */ + private static Client client; + + static { + log.info("初始化短信服务开始"); + long startTime = System.currentTimeMillis(); + try { + client = initClient(); + log.info("初始化短信成功:{}",signName); + } catch (Exception e) { + e.printStackTrace(); + } + log.info("初始化短信服务结束:耗时:{}MS",(System.currentTimeMillis()-startTime)); + } + /** + * 初始化短信对象 + * @return + * @throws Exception + */ + private static Client initClient() throws Exception { + Config config = new Config() + // 您的AccessKey ID + .setAccessKeyId(accessKeyId) + // 您的AccessKey Secret + .setAccessKeySecret(accessKeySecret); + // 访问的域名 + config.endpoint = endpoint; + return new Client(config); + } + + /** + * 发送单条短信 + * @param tel + * @param templateCode SMS_153991546 + * @param sendDataMap + */ + public static String sendSms(String tel , String templateCode , Map sendDataMap){ + SendSmsRequest sendSmsRequest = new SendSmsRequest() + .setPhoneNumbers(tel) + .setSignName(signName) + .setTemplateCode(templateCode) + .setTemplateParam(JSONObject.toJSONString(sendDataMap)); + SendSmsResponse sendSmsResponse = null; + try { + log.info("发送短信验证码:消息内容是:【{}】", JSONObject.toJSONString(sendDataMap)); + sendSmsResponse = client.sendSms(sendSmsRequest); + } catch (Exception e) { + log.error("短信发送异常,手机号:【{}】,短信内容:【{}】,异常信息:【{}】", tel, sendDataMap, e); + } + return JSONObject.toJSONString(sendSmsResponse.getBody()); + } + +} diff --git a/holiday03-common/src/main/java/com/bwie/common/utils/TtlQueue.java b/holiday03-common/src/main/java/com/bwie/common/utils/TtlQueue.java new file mode 100644 index 0000000..082c605 --- /dev/null +++ b/holiday03-common/src/main/java/com/bwie/common/utils/TtlQueue.java @@ -0,0 +1,66 @@ +package com.bwie.common.utils; + +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.DirectExchange; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + +/** + * 发送TTL队列 设置 消息的存活时间 如果超过了存活时间 + * 该条消息还没有被消费 则自动从队列中消息 ,如果配置了死信队列则消息会进入死信队列 + */ +@Component +public class TtlQueue { + // routingKey + private static final String TTL_KEY = "ttl.routingkey"; + private static final String TTL_EXCHANGE = "ttl.exchange"; + + @Autowired + RabbitTemplate rabbitTemplate; + + @Resource + RabbitAdmin rabbitAdmin; + + /** + * 发送TTL队列 + * + * @param queueName 队列名称 + * @param params 消息内容 + * @param expiration 过期时间 毫秒 + */ + public void sendTtlQueue(String queueName, Object params, Integer expiration) { + /** + * ----------------------------------先创建一个ttl队列-------------------------------------------- + */ + Map map = new HashMap<>(); + // 队列设置存活时间,单位ms,必须是整形数据。 + map.put("x-message-ttl", expiration); + /*参数1:队列名称 参数2:持久化 参数3:是否排他 参数4:自动删除队列 参数5:队列参数*/ + Queue queue = new Queue(queueName, true, false, false, map); + rabbitAdmin.declareQueue(queue); + + /** + * ---------------------------------创建交换机--------------------------------------------- + */ + DirectExchange directExchange = new DirectExchange(TTL_EXCHANGE, true, false); + rabbitAdmin.declareExchange(directExchange); + /** + * ---------------------------------队列绑定交换机--------------------------------------------- + */ + // 将队列和交换机绑定 + Binding binding = BindingBuilder.bind(queue).to(directExchange).with(TTL_KEY); + rabbitAdmin.declareBinding(binding); + + // 发送消息 + rabbitTemplate.convertAndSend(TTL_EXCHANGE, TTL_KEY, params); + } +} + diff --git a/holiday03-common/target/classes/com/bwie/common/constants/Constants.class b/holiday03-common/target/classes/com/bwie/common/constants/Constants.class new file mode 100644 index 0000000000000000000000000000000000000000..b56f976d56759b8998e54920e961234cc031b971 GIT binary patch literal 651 zcma)4%TC)+5Iqx;*fGw#KvUk2poB&J0nlzDijdMqic7Z0F_+-Tu_ea|dsYakQl)My z@eNfMjSyvB^*b8Aplj5*X;P>vq;Bq!c)c(&I;0)5kLQcU*H|J}e>u5qSf{jXuBkk8`V0Lo`1v-EQW@=}T*rR2W` O-Zp_eGaHN}DEJFTMG9zM0Iwv$LOH?;ik;uvJ736B_a*6fnt9>G1(KJgz#%jnflu%rJQ!SH$X!jP{AZ89obQiT1g zc+g5AO(=H#f!28vuEx#4m;95Xz>&d7v;7BGR;EbE=r`9!JNwr-spX4|%Ey4kMjw}f2%cgSWi6tY)NV}+wVzb9ln z2uBzl5tQgn8tdFfA|X-n@7yp`NY@+>I_}VRIvy*zy5DuYmNOI~PsBuUFGhq?{lEK` zdEur%9(LWT2vhTa&v6*ejeVr}=0E}k%pn89e0Tz=%!@OeWnM<^$Immb&hQ#Lycv>Q kH#k9y7*I;DpqD7Jz%{hNv721gs8_IsZ6?AF*BExc0jkSyivR!s literal 0 HcmV?d00001 diff --git a/holiday03-common/target/classes/com/bwie/common/result/PageResult.class b/holiday03-common/target/classes/com/bwie/common/result/PageResult.class new file mode 100644 index 0000000000000000000000000000000000000000..0de247c51daafec5d08943ee0671730e380f5fd4 GIT binary patch literal 3491 zcmb_eZBrXn6n<{9n@!S%q_ohc1qzm8NTAUcYbAiR*jg}9C`fJVOP8?1mXO8lrky(D zC%^au{Gk2-`=!q4Oy8!?I6BVQ8UKQRMXl%T-H;`LmJiOr?%i|mInQ}{&bj&X->1I- z7(*$J5W*T19V#LM$y>&4BUduYtGUa|x6Gm|5E-?~mOCyGP7f@_5JgNwT*p4>0=-3h zBe#6VGIO-pu*Rmv4e zl8@7wHg@KKz`^u%~OyDQV$6-g(Dh{>gYt5K-VrBwRkkA zS}dB5BXBw`-3z2EKd>91RQKXLrlSYF0@0#TzVKOdb3BeQFUvo>k3m|lIS+K3gW zbezVpz@ZIe-JG<`MZ>*nxpb)PxJKEfz)$Ry=sI&2+=^9R&1*PAHT1-mom(&~mQk`k zHm&i&D9*U>A+jl0gQ^m@ib^ zHH%z3zFYq5L?P21+b!JPtXWCFT)pOAa>jJm?3FpAVr-bMSt0OLQ(olZfhB>Z(Z!Kw zx{U9pv3EbBu3e+%sU~YL<)grz|Hm=u!{}c9<^msTVrwn8QD=+nN_v{pr;$W*{D9vo z^_ju@ha08!%nO?uqdE07nQV8>tPmNQI(>2=#XXt-(Z7diG8{?Ef@>7lXN*msjOyH# zshJBj^QNfjD*hmh^!bxe_03b|WUKI~^BdQjC4K`5jPG2V=3u0xq0Pv#_<~)n6wQkk zH(jFM11GsHY5bnIZP#%t#-=2*lZfDxIBvqwu*_qiD9~4LY^!|RUN>{nJvkXJ8b#Nx z+!gpHIKljb(�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 literal 0 HcmV?d00001 diff --git a/holiday03-common/target/classes/com/bwie/common/utils/DelayedQueue.class b/holiday03-common/target/classes/com/bwie/common/utils/DelayedQueue.class new file mode 100644 index 0000000000000000000000000000000000000000..166ccd866f470fe07b7de1b19a7f54f840dc233f GIT binary patch literal 4633 zcmbtYYj+dJ8Ggo+y|P%qI6!NXrj2oeZ?H6k0u~{aFR@*OacsxLq$yoVgS=SU6}u~J zx9K(MJ!zBP@ArHAp*^R^wBelofS!Ks-|6WyyDMvrC1lbM+S!?%_nr5B-s|XJ|9$75 z0G`F4)964#LsCa4x&(S|nRiU1Y}zH`YW|ii_yS!QE!*-h2_y!GmNldVjyrD2@T#t5 zmu|XdMXo#UnqgLMSB-+>O5=r^tjRPqq!rVB0!IdO4YrHEqRR{|cVj;eXgH{&2Zsdu z3r@wzuUnE#Diy~zYQ9zWj7eEGH)S#4DX`Bq^Lfk97Aux5@N}-FAmP4Ho`nWYCXGjM zSi=z=NAVtk(+|r)KrhNd*>q(j(S^a*LNw6G4DCiBP5t|H9K)jmhYPMWeK}F{e5W$C zQCOt`B*hyXYQudeMWEjMbUcpt3ml9DZLk|@Cu@Bxt&_$R=+|&u#{ixb7;Onupyaq^ z7irb;npG}JS0I_^g1}n40|O8V&ckpYn3SGx*`{wf_Jm{Kv`RHsx>WrH1~m-n7{-Xe z`2WvRpu=|rUTvpD1GR_KV_MqMwF-6e1&1DQmoCfAm{uvA6zDC6L2$|qx2(y{Gz^^9 z@If6<0ErCIF0D?PJrsaBD;@5R(h<19X;;hc{1xF9h7Zq#VP zmr2WZOt<6-47ClR$ajO-$>_LG2$ zX^ml!jGAhoO4n6^LqQ=@rNx*rz11sbHH|qWQdppT8z&=(Px_lxnZgqNsA##Yg8Q(H zYZ_kCv4ZOY`x{)yft9gZW1&1BSEnv&qwqy5@k$UaY4~W{47)SYr|>cA(vY_jnmmn{ z@o`mj&HJQj3GVglA-n-1)FsIL1r#+%9XC-Dc(SFf<6yIdm84%s-gT<9vn3gSXWGW! zE+TrHgi`LfK~w&MpC ziV&P{>aTfe+MaRKEclMQX_(stMz-cV>-4%}M&QvvoQ?SB1?f38w;=g7IpGv3&cU2z z%eh)5FWn`Rhbt|df>~ZRT}#cQ#iYM#QJR5V`$mhrdpw3{fZ=xYH5P|*w@2;v_&D6% zw^dg-$8M29RW;c*QkFQ{5xGEGZd5Hd0FPFR*`v-*pfg}b-)xHPeVr(kIZ(K-u{za; zaA&lUgQgl9R%d||ZAj~dfDm4h{;E@)SISCXx>UHEMJX(T%4|Eb2oE{B(`?K^k?GFv z+Jxv%GI?Zzkbl5Eai`%Ks0=9ru)inH9XLZXWF-9hL5l38zwZY&IwqyJy^S ze9w2yYG_06U>Clh#t-mA4L{QHWBh~{mPTr~>^shyG;#sjq%fnf=7oipZ_NH3$2=km z5129SVp)0vImcP6RWlDX@D9QyiXPv-_mAO`52lS5tBCW2SuQVHzRdLCXKXy%^+k2l z?y>F25a?g1o6#?Iyn#1)-I}%8B~O%1&r{{(NYmz@SJFN8w8x@dODh1~Q01%xqnzK4&BwXQo{`^OzIAc*I6_^HV{1NF zlAQCh&S#A?gQMWsIeZu5uYBpi9X{1(;4s$t)WZ$fz$Rw`pTH-%OA-Hvj5Lmm_n@te z+(q|Ta`P@z(>7( z3ZJIP>g_Z5EE423i_hWn0jd}98eXR&=kOT5fG<+@FLCGo1j#`{kVK)vi#ByvT330H zV%C2Tb1Qc-pBw3Yp?C2gcrk%%_we!x6?r9@ARIUT!d-~~&jTER=cvjI|3a7z1U?#a zi3CpZgfHVOJmag}sW1;$z6Q~gR?f`b>hy7r>h$!;7V^Y+bwr&KT21{M16&~GSnPy! zpfo>F?XTk-w0e?c@{{U9IgZBUc literal 0 HcmV?d00001 diff --git a/holiday03-common/target/classes/com/bwie/common/utils/FastUtil.class b/holiday03-common/target/classes/com/bwie/common/utils/FastUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..615a08123b954c394c977dc0d94d8b9117bf46c2 GIT binary patch literal 2594 zcmbVOYf}?f7=8``HiT6Xp$b~TI|<5)(yEQnS_&2mVgaeOH#f;iSlsNUyBk4!`O?nR z=}c$(sWZ-Wrv1>FPCwON21Td-fc_4(_D^*BoZS!+W2c%-_MCmsd)~|QKIgpo^PgLH z01V>O1nLmeP_Lr_jRGz6<|WgxO{ZW?X69u!5NJGZIaV+v5bH_KHY1KE4GA61&;<v(9{&JWBR<8GlKJ+gaHU}v5LIP2NngM-~eL-)V= z;_mIG2RDAccjxoFH*fv*)2+U~zGl3PS2Uc^@hXN%|Fwn$>MbYlu8E~`gp#vyj0kLb z)bdvkKKmoGufRO1<8_P)=sd2z9QE8H0}>dib&Q^=T5sqWSEY&*_>-PnE-A04bxbOu zqN}QeBI=turZ6p#$VpoUGP*GK)rjM9S|w*SoaOEE@DdqW%*s+=xlRHzcuU7QHvCUL5Zcg?m@O|NGhx_pg3^@5}EJ_y89)m^w1Z^7yUAe$>p8 zm*hbc?M8JK*t0s|VO~u>S-y5Bnb9#-b^@y?XD#2#*gRB@8<;9!GHh#@;i6$yg~pWh z-LjXJ+*v>D=6Jq0j9ZR8%|j@?8Iu-5nq^IU*7Pj(UJ=#@a~4f@hqZh1B}TiA(HReG z9|rvYFLtK*5c&%Fcr8}jKvc{A2#2RI8xnqPw`i^9t4UqK;T0j!|I|DsHL8RmSS=GW zm~(SyOx4r^=~1+Iby-)ASFJz<3(>x6p=y^1YnAg(Xr==*dvU@nRjL#}p0z7|HZdI* zI)ZH7N|WhR_zI+ILg+I_=?0fe(inD&CD&mWO0$V{vb%%7PIVcDGxjqG)aRl+KVR6w?ji0)}xzkzl(i)2ex4+ zzq^p++`#TImQ>`g5(_<}2!}CkX5)5IqD6zreF%>c`n0N&ok74^gP^Jke+p%)soZZ< zDaLWI_a+WqL(8u?+IoB$Lv?6Kvw4KQF^WEYCnSpAKrNi0inb;}RA)Q~%W>ywz-x znF(B`G>%x?ISn)VN=}QR@Jh9wJE*8WO|6|b@&0c(s%k1$)wG?~KccJ-A6IGd3Ggr8 Cp}&~` literal 0 HcmV?d00001 diff --git a/holiday03-common/target/classes/com/bwie/common/utils/HttpUtils$1.class b/holiday03-common/target/classes/com/bwie/common/utils/HttpUtils$1.class new file mode 100644 index 0000000000000000000000000000000000000000..82c0cf935306b8949c4cc36831dd25968b4eca28 GIT binary patch literal 1011 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 literal 0 HcmV?d00001 diff --git a/holiday03-common/target/classes/com/bwie/common/utils/JwtUtils.class b/holiday03-common/target/classes/com/bwie/common/utils/JwtUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..d373d88c8e97f0033603c14c87266c22fa72603d GIT binary patch literal 2871 zcma)8ZBrXn6n^do*d#24ricY;tu0mvFOe!%4aF8}Ei}+-fcjSJCRvhAHoIxE0r3y{ zRqKp`9~{3q<8N{tpS!!z%?oWZlg+(%?>*-^&w0+d`RBhs{seFf`*A3UsOZzsj{$*^ zvc9jUEZr`q9_GqM-W3>FHf_^g5r|CB?8XsAOhsJ7AT)td(@B*Zj(uR{T&H5#sf`1- zA)w}(rd2TN0+**}GF|qp`tQ?&IEP^sBO1;lAuw_FR)JWS1Agc3bPN-C zL&c$=HOwGM_%*%WklDS| zJ-d&**NkKi^C}iJr0}l5csuRn!`~?|#N0|=Nx%c+P#_iLH%v^|NJ6e|Xm}6r3!L-N z`AXS1AloxN8fy^o2e_%?Lk%C{V}T2uh^4rThP&z%h_aO^zh2TRmIcPzPx^4;)X9p5 zPjFix?!nxaRUC{%>s#6DDq!GmiS@C?Bg(xzCLtC#JgGggb!$Uk``=CSO4o4bL7Pc8I zMe&6IWOLfqup{*ubsb-dQ9Nd+&~y2Mu~#ga<%(6co!YZ{!)@*#{BZcAK;N2EU|7Q$ z(>Au6)tph^)^iqD5*a72Tf2JQl=EP*&n=lu>y=D9qpek&78qpF>aG#w>{<{>s0Vda z4QnMIw5(yD%hTO#F<#50SXxmX)=rQuwH{gS%tmM>AZ~>?M>Y+&lOpo*E)9jeQ#+Lqh~Te_aQ*wM=Zy?K?;y>{5*yU-g8{I3_7o?yJi zs3|wg!yplY-WByq@#rNL2 z0-XQ_a-8`-C;2YVS%Kev!3kjSt6+~X*sM5`G2G>^ggbGBcRcU23J7OWA%-P^zmS$7 z!hubN0-NyMo;uOFHHIQeA>$IamOR3(%xq%q2%o+%=f^ZpLKi|YX@SXps03{iToA#D z@p52%F+i>++wA)M-weU@EuF%YT*Od06Xtpsn70Y@PVX=)=mN9Vt`BqLRWPkHVLs>r zGfSA;y~DJ+!ECkb!+i28n7n?1yvV>KWOyt&dyGv5n{$67n)v)DsB^y|+b-!M|ALe} z<5&DsUeb9SW2kzPj`IJE4Tn~1T-Bibi}Na!H5Jc1X~Yyy+*Q7eqH$WBvKr)PAhG)^ R#$|PiP<19abGfFV`9BM`nLYpj literal 0 HcmV?d00001 diff --git a/holiday03-common/target/classes/com/bwie/common/utils/MsgUtil.class b/holiday03-common/target/classes/com/bwie/common/utils/MsgUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..f650fdee78d6b955509935f74c2fc8c0d250dcbf GIT binary patch literal 2322 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 literal 0 HcmV?d00001 diff --git a/holiday03-common/target/classes/com/bwie/common/utils/StringUtils.class b/holiday03-common/target/classes/com/bwie/common/utils/StringUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..56739df4f5d7a76b9e453b2b04b24f479d8ad9a6 GIT binary patch literal 1805 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 Yc>pwUx&#Az0sNVM1_q|2|MS292kKtJ<^TWy literal 0 HcmV?d00001 diff --git a/holiday03-common/target/maven-archiver/pom.properties b/holiday03-common/target/maven-archiver/pom.properties new file mode 100644 index 0000000..914628b --- /dev/null +++ b/holiday03-common/target/maven-archiver/pom.properties @@ -0,0 +1,3 @@ +artifactId=holiday03-common +groupId=com.bwie +version=1.0-SNAPSHOT diff --git a/holiday03-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/holiday03-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..a9e4d2a --- /dev/null +++ b/holiday03-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,16 @@ +com\bwie\common\result\PageResult.class +com\bwie\common\utils\DelayedQueue.class +com\bwie\common\utils\MsgUtil.class +com\bwie\common\utils\TelSmsUtils.class +com\bwie\common\utils\HttpUtils.class +com\bwie\common\utils\JwtUtils.class +com\bwie\common\utils\StringUtils.class +com\bwie\common\constants\JwtConstants.class +com\bwie\common\utils\HttpUtils$1.class +com\bwie\common\constants\Constants.class +com\bwie\common\utils\TtlQueue.class +com\bwie\common\utils\DLXQueue.class +com\bwie\common\constants\TokenConstants.class +com\bwie\common\utils\OssUtil.class +com\bwie\common\result\Result.class +com\bwie\common\utils\FastUtil.class diff --git a/holiday03-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/holiday03-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..b1ec09f --- /dev/null +++ b/holiday03-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,15 @@ +D:\Project\Three\holiday03-common\src\main\java\com\bwie\common\constants\JwtConstants.java +D:\Project\Three\holiday03-common\src\main\java\com\bwie\common\utils\OssUtil.java +D:\Project\Three\holiday03-common\src\main\java\com\bwie\common\constants\TokenConstants.java +D:\Project\Three\holiday03-common\src\main\java\com\bwie\common\utils\DelayedQueue.java +D:\Project\Three\holiday03-common\src\main\java\com\bwie\common\utils\JwtUtils.java +D:\Project\Three\holiday03-common\src\main\java\com\bwie\common\utils\TelSmsUtils.java +D:\Project\Three\holiday03-common\src\main\java\com\bwie\common\result\PageResult.java +D:\Project\Three\holiday03-common\src\main\java\com\bwie\common\utils\HttpUtils.java +D:\Project\Three\holiday03-common\src\main\java\com\bwie\common\utils\StringUtils.java +D:\Project\Three\holiday03-common\src\main\java\com\bwie\common\utils\TtlQueue.java +D:\Project\Three\holiday03-common\src\main\java\com\bwie\common\utils\DLXQueue.java +D:\Project\Three\holiday03-common\src\main\java\com\bwie\common\utils\FastUtil.java +D:\Project\Three\holiday03-common\src\main\java\com\bwie\common\constants\Constants.java +D:\Project\Three\holiday03-common\src\main\java\com\bwie\common\result\Result.java +D:\Project\Three\holiday03-common\src\main\java\com\bwie\common\utils\MsgUtil.java diff --git a/holiday03-common/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/holiday03-common/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/holiday03-common/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/holiday03-common/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..b8d0096 --- /dev/null +++ b/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + com.bwie + Three + pom + 1.0-SNAPSHOT + + holiday03-common + holiday03-GTP + + + + 8 + 8 + UTF-8 + + + + + + spring-boot-starter-parent + org.springframework.boot + 2.6.2 + + + + + + + + org.springframework.cloud + spring-cloud-dependencies + 2021.0.0 + pom + import + + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + 2021.1 + pom + import + + + + com.alibaba.nacos + nacos-client + 2.0.4 + + + com.bwie + holiday03-common + 1.0-SNAPSHOT + + + + + + + menghang-releases + 梦航-maven + http://124.221.214.183:8081/repository/maven-releases/ + + + +