Browse Source

【项目开发】

1.修改pom文件配置
2.优化代码,把demo示例改为服务类
3.增加技术文档
ChenYL 9 months ago
parent
commit
a174d106ec
48 changed files with 897 additions and 645 deletions
  1. 5 149
      data-easy/pom.xml
  2. 2 14
      data-easy/src/main/java/com/dataeasy/server/core/config/BizConfig.java
  3. 7 7
      data-easy/src/main/java/com/dataeasy/server/core/config/FeignConfig.java
  4. 0 23
      data-easy/src/main/java/com/dataeasy/server/core/config/GraphQLClientConfig.java
  5. 0 37
      data-easy/src/main/java/com/dataeasy/server/core/config/WxMpProperties.java
  6. 3 3
      data-easy/src/main/java/com/dataeasy/server/demo/TestController.java
  7. 2 2
      data-easy/src/main/java/com/dataeasy/server/demo/msg/LogHandler.java
  8. 1 1
      data-easy/src/main/java/com/dataeasy/server/demo/msg/MpEntryController.java
  9. 1 1
      data-easy/src/main/java/com/dataeasy/server/demo/msg/SubscribeHandler.java
  10. 1 1
      data-easy/src/main/java/com/dataeasy/server/demo/msg/WeChatMsgPushConfig.java
  11. 1 1
      data-easy/src/main/java/com/dataeasy/server/demo/msg/WeChatMsgPushUtil.java
  12. 1 1
      data-easy/src/main/java/com/dataeasy/server/demo/msg/WxMpConfiguration.java
  13. 1 1
      data-easy/src/main/java/com/dataeasy/server/demo/pay/DateTimeUtils.java
  14. 1 32
      data-easy/src/main/java/com/dataeasy/server/demo/pay/PayService.java
  15. 1 2
      data-easy/src/main/java/com/dataeasy/server/demo/pay/WxPayConfiguration.java
  16. 1 1
      data-easy/src/main/java/com/dataeasy/server/demo/pay/WxPayProperties.java
  17. 313 0
      doc/技术文档.md
  18. 155 0
      pom.xml
  19. 1 139
      product-hunt/pom.xml
  20. 0 183
      product-hunt/src/main/java/com/producthunt/server/TestController.java
  21. 7 1
      product-hunt/src/main/java/com/producthunt/server/core/config/HzApiConfig.java
  22. 13 4
      product-hunt/src/main/java/com/producthunt/server/core/config/ProductHuntConfig.java
  23. 2 2
      product-hunt/src/main/java/com/producthunt/server/dto/PostNode.java
  24. 1 1
      product-hunt/src/main/java/com/producthunt/server/dto/PostPageInfo.java
  25. 1 1
      product-hunt/src/main/java/com/producthunt/server/dto/PostResponse.java
  26. 4 5
      product-hunt/src/main/java/com/producthunt/server/feign/FinanceFeign.java
  27. 4 4
      product-hunt/src/main/java/com/producthunt/server/feign/HzApiFeign.java
  28. 4 4
      product-hunt/src/main/java/com/producthunt/server/feign/ProductHuntFeign.java
  29. 1 2
      product-hunt/src/main/java/com/producthunt/server/feign/dto/finance/BondResponse.java
  30. 1 5
      product-hunt/src/main/java/com/producthunt/server/feign/dto/finance/FinanceRequest.java
  31. 1 1
      product-hunt/src/main/java/com/producthunt/server/feign/dto/finance/StockResponse.java
  32. 1 1
      product-hunt/src/main/java/com/producthunt/server/feign/dto/hzapi/DaLeTouResponse.java
  33. 1 1
      product-hunt/src/main/java/com/producthunt/server/feign/dto/hzapi/HzApiBaseResponse.java
  34. 1 1
      product-hunt/src/main/java/com/producthunt/server/feign/dto/hzapi/HzApiRequest.java
  35. 1 1
      product-hunt/src/main/java/com/producthunt/server/feign/dto/hzapi/ShuangSeQiuResponse.java
  36. 1 3
      product-hunt/src/main/java/com/producthunt/server/feign/dto/producthunt/OauthRequest.java
  37. 1 1
      product-hunt/src/main/java/com/producthunt/server/feign/dto/producthunt/OauthResponse.java
  38. 33 0
      product-hunt/src/main/java/com/producthunt/server/service/controller/ProductHuntController.java
  39. 17 0
      product-hunt/src/main/java/com/producthunt/server/service/manager/IAiChatManager.java
  40. 27 0
      product-hunt/src/main/java/com/producthunt/server/service/manager/IFinanceManager.java
  41. 25 0
      product-hunt/src/main/java/com/producthunt/server/service/manager/IHzApiManager.java
  42. 20 0
      product-hunt/src/main/java/com/producthunt/server/service/manager/IProductHuntManager.java
  43. 30 0
      product-hunt/src/main/java/com/producthunt/server/service/manager/impl/AiChatManagerImpl.java
  44. 47 0
      product-hunt/src/main/java/com/producthunt/server/service/manager/impl/FinanceManagerImpl.java
  45. 47 0
      product-hunt/src/main/java/com/producthunt/server/service/manager/impl/HzApiManagerImpl.java
  46. 109 0
      product-hunt/src/main/java/com/producthunt/server/service/manager/impl/ProductHuntManagerImpl.java
  47. 0 5
      product-hunt/src/main/resources/application-dev.yaml
  48. 0 4
      product-hunt/src/main/resources/application-prod.yaml

+ 5 - 149
data-easy/pom.xml

@@ -12,29 +12,10 @@
     <artifactId>data-easy</artifactId>
     <artifactId>data-easy</artifactId>
 
 
     <properties>
     <properties>
-        <maven.compiler.source>21</maven.compiler.source>
-        <maven.compiler.target>21</maven.compiler.target>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <java.version>21</java.version>
-        <spring-cloud.version>2023.0.3</spring-cloud.version>
+        <wxjava.version>4.7.0</wxjava.version>
         <jwt.version>4.4.0</jwt.version>
         <jwt.version>4.4.0</jwt.version>
-        <tk-mybatis.version>5.0.1</tk-mybatis.version>
-        <jasypt.version>3.0.5</jasypt.version>
-        <wechatpay.version>0.2.16</wechatpay.version>
     </properties>
     </properties>
 
 
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.springframework.cloud</groupId>
-                <artifactId>spring-cloud-dependencies</artifactId>
-                <version>${spring-cloud.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
     <dependencies>
     <dependencies>
         <dependency>
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <groupId>org.springframework.cloud</groupId>
@@ -57,10 +38,6 @@
             <groupId>org.springframework.boot</groupId>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-aop</artifactId>
             <artifactId>spring-boot-starter-aop</artifactId>
         </dependency>
         </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-graphql</artifactId>
-        </dependency>
         <dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-cache</artifactId>
             <artifactId>spring-boot-starter-cache</artifactId>
@@ -76,17 +53,14 @@
         <dependency>
         <dependency>
             <groupId>com.mysql</groupId>
             <groupId>com.mysql</groupId>
             <artifactId>mysql-connector-j</artifactId>
             <artifactId>mysql-connector-j</artifactId>
-            <scope>runtime</scope>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>org.projectlombok</groupId>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
             <artifactId>lombok</artifactId>
-            <optional>true</optional>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>tk.mybatis</groupId>
             <groupId>tk.mybatis</groupId>
             <artifactId>mapper-spring-boot-starter</artifactId>
             <artifactId>mapper-spring-boot-starter</artifactId>
-            <version>${tk-mybatis.version}</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>com.auth0</groupId>
             <groupId>com.auth0</groupId>
@@ -101,150 +75,32 @@
         <dependency>
         <dependency>
             <groupId>com.github.binarywang</groupId>
             <groupId>com.github.binarywang</groupId>
             <artifactId>wx-java-mp-spring-boot-starter</artifactId>
             <artifactId>wx-java-mp-spring-boot-starter</artifactId>
-            <version>4.7.0</version>
+            <version>${wxjava.version}</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>com.github.binarywang</groupId>
             <groupId>com.github.binarywang</groupId>
             <artifactId>weixin-java-pay</artifactId>
             <artifactId>weixin-java-pay</artifactId>
-            <version>4.7.0</version>
+            <version>${wxjava.version}</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>com.github.binarywang</groupId>
             <groupId>com.github.binarywang</groupId>
             <artifactId>wx-java-miniapp-spring-boot-starter</artifactId>
             <artifactId>wx-java-miniapp-spring-boot-starter</artifactId>
-            <version>4.7.0</version>
+            <version>${wxjava.version}</version>
         </dependency>
         </dependency>
     </dependencies>
     </dependencies>
 
 
-    <!-- 配置阿里云仓库 -->
-    <repositories>
-        <repository>
-            <id>aliyun-repos</id>
-            <url>https://maven.aliyun.com/repository/public</url>
-            <releases>
-                <enabled>true</enabled>
-            </releases>
-            <snapshots>
-                <enabled>false</enabled>
-            </snapshots>
-        </repository>
-    </repositories>
-    <pluginRepositories>
-        <pluginRepository>
-            <id>aliyun-repos</id>
-            <url>https://maven.aliyun.com/repository/public</url>
-            <releases>
-                <enabled>true</enabled>
-            </releases>
-            <snapshots>
-                <enabled>false</enabled>
-            </snapshots>
-        </pluginRepository>
-    </pluginRepositories>
-
     <build>
     <build>
         <plugins>
         <plugins>
-            <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-                <configuration>
-                    <!--引入第三方jar包时,不添加则引入的第三方jar不会被打入jar包中-->
-                    <includeSystemScope>true</includeSystemScope>
-                    <!--排除第三方jar文件-->
-                    <includes>
-                        <include>
-                            <groupId>nothing</groupId>
-                            <artifactId>nothing</artifactId>
-                        </include>
-                    </includes>
-                    <excludes>
-                        <exclude>
-                            <groupId>org.projectlombok</groupId>
-                            <artifactId>lombok</artifactId>
-                        </exclude>
-                    </excludes>
-                </configuration>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>repackage</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-
-            <!-- 2、完成对Java代码的编译,可以指定项目源码的jdk版本,编译后的jdk版本,以及编码 -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <!-- 源代码使用的JDK版本 -->
-                    <source>${java.version}</source>
-                    <!-- 需要生成的目标class文件的编译版本 -->
-                    <target>${java.version}</target>
-                    <!-- 字符集编码 -->
-                    <encoding>UTF-8</encoding>
-                    <!-- 用来传递编译器自身不包含但是却支持的参数选项 -->
-                    <!--                    <compilerArguments>-->
-                    <!--                        <verbose/>-->
-                    <!--                        &lt;!&ndash; windwos环境(二选一) &ndash;&gt;-->
-                    <!--                        <bootclasspath>${java.home}/lib/rt.jar:${java.home}/lib/jce.jar</bootclasspath>-->
-                    <!--                        &lt;!&ndash; Linux环境(二选一) &ndash;&gt;-->
-                    <!--                        <bootclasspath>${java.home}/lib/rt.jar:${java.home}/lib/jce.jar</bootclasspath>-->
-                    <!--                    </compilerArguments>-->
-                    <annotationProcessorPaths>
-                        <path>
-                            <groupId>org.projectlombok</groupId>
-                            <artifactId>lombok</artifactId>
-                            <version>${lombok.version}</version>
-                        </path>
-                    </annotationProcessorPaths>
-                </configuration>
-            </plugin>
-
-            <!-- 3、将所有依赖的jar文件复制到target/lib目录 -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>copy-dependencies</id>
-                        <phase>prepare-package</phase>
-                        <goals>
-                            <goal>copy-dependencies</goal>
-                        </goals>
-                        <configuration>
-                            <!--复制到哪个路径,${project.build.directory} 缺醒为 target,其他内置参数见下面解释-->
-                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
-                            <overWriteReleases>false</overWriteReleases>
-                            <overWriteSnapshots>false</overWriteSnapshots>
-                            <overWriteIfNewer>true</overWriteIfNewer>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-
-            <!-- 4、指定启动类,指定配置文件,将依赖打成外部jar包 -->
             <plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
                 <artifactId>maven-jar-plugin</artifactId>
                 <configuration>
                 <configuration>
                     <archive>
                     <archive>
                         <manifest>
                         <manifest>
-                            <!-- 是否要把第三方jar加入到类构建路径 -->
-                            <addClasspath>true</addClasspath>
-                            <!-- 外部依赖jar包的最终位置 -->
-                            <classpathPrefix>lib/</classpathPrefix>
                             <!-- 项目启动类 -->
                             <!-- 项目启动类 -->
-                            <mainClass>com.punchsettle.server.Application</mainClass>
+                            <mainClass>com.dataeasy.server.Application</mainClass>
                         </manifest>
                         </manifest>
                     </archive>
                     </archive>
-                    <!--资源文件不打进jar包中,做到配置跟项目分离的效果-->
-                    <!--                    <excludes>-->
-                    <!--                        &lt;!&ndash; 业务jar中过滤application.properties/yml文件,在jar包外控制 &ndash;&gt;-->
-                    <!--                        <exclude>*.properties</exclude>-->
-                    <!--                        <exclude>*.xml</exclude>-->
-                    <!--                        <exclude>*.yml</exclude>-->
-                    <!--                    </excludes>-->
                 </configuration>
                 </configuration>
             </plugin>
             </plugin>
         </plugins>
         </plugins>

+ 2 - 14
data-easy/src/main/java/com/dataeasy/server/core/config/BizConfig.java

@@ -8,27 +8,15 @@ import org.springframework.context.annotation.Configuration;
 @Configuration
 @Configuration
 public class BizConfig {
 public class BizConfig {
 
 
-    /**
-     * 微信小程序appid
-     */
-    @Value("${biz.wechat.mini-program.app-id}")
-    private String wechatMiniProgramAppId;
-
-    /**
-     * 微信小程序secret
-     */
-    @Value("${biz.wechat.mini-program.secret}")
-    private String wechatMiniProgramSecret;
-
     /**
     /**
      * 生成token的密钥
      * 生成token的密钥
      */
      */
-    @Value("${biz.token.password}")
+//    @Value("${biz.token.password}")
     private String TokenPassword;
     private String TokenPassword;
 
 
     /**
     /**
      * token过期时间
      * token过期时间
      */
      */
-    @Value("${biz.token.expire:1}")
+//    @Value("${biz.token.expire:1}")
     private Integer TokenExpire;
     private Integer TokenExpire;
 }
 }

+ 7 - 7
data-easy/src/main/java/com/dataeasy/server/core/config/FeignConfig.java

@@ -28,13 +28,13 @@ public class FeignConfig {
     @Autowired
     @Autowired
     private BizConfig bizConfig;
     private BizConfig bizConfig;
 
 
-    @Bean("myInterceptor")
-    public RequestInterceptor requestInterceptor() {
-        return template -> {
-            template.query("appid", bizConfig.getWechatMiniProgramAppId()).query("secret",
-                bizConfig.getWechatMiniProgramSecret());
-        };
-    }
+//    @Bean("myInterceptor")
+//    public RequestInterceptor requestInterceptor() {
+//        return template -> {
+//            template.query("appid", bizConfig.getWechatMiniProgramAppId()).query("secret",
+//                bizConfig.getWechatMiniProgramSecret());
+//        };
+//    }
 
 
     /**
     /**
      * 调整Feign日志输出 注:FeignClient只能输出debug等级的日志
      * 调整Feign日志输出 注:FeignClient只能输出debug等级的日志

+ 0 - 23
data-easy/src/main/java/com/dataeasy/server/core/config/GraphQLClientConfig.java

@@ -1,23 +0,0 @@
-package com.dataeasy.server.core.config;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.graphql.client.GraphQlClient;
-import org.springframework.graphql.client.HttpGraphQlClient;
-import org.springframework.graphql.client.HttpSyncGraphQlClient;
-
-/**
- * @author tyuio
- * @version 1.0.0
- * @description GraphQL客户端配置
- * @date 2025/2/17 18:55
- */
-@Configuration
-public class GraphQLClientConfig {
-
-    @Bean
-    public GraphQlClient graphQLClient() {
-        return HttpSyncGraphQlClient.builder().url("https://api.producthunt.com/v2/api/graphql")
-                .header("Authorization", "Bearer v3QzROqoB52Y7nf9DhX5-Vg_g_gRsoPtgFmM1lIZTRE").build();
-    }
-}

+ 0 - 37
data-easy/src/main/java/com/dataeasy/server/core/config/WxMpProperties.java

@@ -1,37 +0,0 @@
-package com.dataeasy.server.core.config;
-
-import lombok.Data;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.stereotype.Component;
-
-/**
- * @author tyuio
- * @version 1.0.0
- * @description 微信配置
- * @date 2025/2/28 16:38
- */
-@Data
-@Component
-@ConfigurationProperties(prefix = "wx")
-public class WxMpProperties {
-
-    /**
-     * 设置微信公众号的appid
-     */
-    private String appId;
-
-    /**
-     * 设置微信公众号的app secret
-     */
-    private String secret;
-
-    /**
-     * 设置微信公众号的token
-     */
-    private String token;
-
-    /**
-     * 设置微信公众号的EncodingAESKey
-     */
-    private String aesKey;
-}

+ 3 - 3
data-easy/src/main/java/com/dataeasy/server/TestController.java → data-easy/src/main/java/com/dataeasy/server/demo/TestController.java

@@ -1,6 +1,7 @@
-package com.dataeasy.server;
+package com.dataeasy.server.demo;
 
 
 import com.dataeasy.server.common.annotation.IgnoreResponseWrapper;
 import com.dataeasy.server.common.annotation.IgnoreResponseWrapper;
+import com.dataeasy.server.demo.pay.PayService;
 import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
 import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -8,8 +9,7 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
-import com.dataeasy.server.msg.WeChatMsgPushUtil;
-import com.dataeasy.server.pay.PayService;
+import com.dataeasy.server.demo.msg.WeChatMsgPushUtil;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.exception.WxPayException;
 
 
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.api.WxMaService;

+ 2 - 2
data-easy/src/main/java/com/dataeasy/server/msg/LogHandler.java → data-easy/src/main/java/com/dataeasy/server/demo/msg/LogHandler.java

@@ -1,4 +1,4 @@
-package com.dataeasy.server.msg;
+package com.dataeasy.server.demo.msg;
 
 
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.session.WxSessionManager;
 import me.chanjar.weixin.common.session.WxSessionManager;
@@ -23,7 +23,7 @@ public class LogHandler implements WxMpMessageHandler {
     public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,
     public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,
                                     Map<String, Object> context, WxMpService wxMpService,
                                     Map<String, Object> context, WxMpService wxMpService,
                                     WxSessionManager sessionManager) {
                                     WxSessionManager sessionManager) {
-        log.info("\n接收到请求消息,内容:{}", wxMessage);
+        log.info("接收到请求消息,内容:{}", wxMessage);
         return null;
         return null;
     }
     }
 
 

+ 1 - 1
data-easy/src/main/java/com/dataeasy/server/msg/MpEntryController.java → data-easy/src/main/java/com/dataeasy/server/demo/msg/MpEntryController.java

@@ -1,4 +1,4 @@
-package com.dataeasy.server.msg;
+package com.dataeasy.server.demo.msg;
 
 
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.mp.api.WxMpMessageRouter;
 import me.chanjar.weixin.mp.api.WxMpMessageRouter;

+ 1 - 1
data-easy/src/main/java/com/dataeasy/server/msg/SubscribeHandler.java → data-easy/src/main/java/com/dataeasy/server/demo/msg/SubscribeHandler.java

@@ -1,4 +1,4 @@
-package com.dataeasy.server.msg;
+package com.dataeasy.server.demo.msg;
 
 
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.error.WxErrorException;

+ 1 - 1
data-easy/src/main/java/com/dataeasy/server/msg/WeChatMsgPushConfig.java → data-easy/src/main/java/com/dataeasy/server/demo/msg/WeChatMsgPushConfig.java

@@ -1,4 +1,4 @@
-package com.dataeasy.server.msg;
+package com.dataeasy.server.demo.msg;
 
 
 import lombok.Data;
 import lombok.Data;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;

+ 1 - 1
data-easy/src/main/java/com/dataeasy/server/msg/WeChatMsgPushUtil.java → data-easy/src/main/java/com/dataeasy/server/demo/msg/WeChatMsgPushUtil.java

@@ -1,4 +1,4 @@
-package com.dataeasy.server.msg;
+package com.dataeasy.server.demo.msg;
 
 
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.error.WxErrorException;

+ 1 - 1
data-easy/src/main/java/com/dataeasy/server/msg/WxMpConfiguration.java → data-easy/src/main/java/com/dataeasy/server/demo/msg/WxMpConfiguration.java

@@ -1,4 +1,4 @@
-package com.dataeasy.server.msg;
+package com.dataeasy.server.demo.msg;
 
 
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import me.chanjar.weixin.mp.api.WxMpMessageRouter;
 import me.chanjar.weixin.mp.api.WxMpMessageRouter;

+ 1 - 1
data-easy/src/main/java/com/dataeasy/server/pay/DateTimeUtils.java → data-easy/src/main/java/com/dataeasy/server/demo/pay/DateTimeUtils.java

@@ -1,4 +1,4 @@
-package com.dataeasy.server.pay;
+package com.dataeasy.server.demo.pay;
 
 
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;

+ 1 - 32
data-easy/src/main/java/com/dataeasy/server/pay/PayService.java → data-easy/src/main/java/com/dataeasy/server/demo/pay/PayService.java

@@ -1,4 +1,4 @@
-package com.dataeasy.server.pay;
+package com.dataeasy.server.demo.pay;
 
 
 import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
 import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
 import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
 import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
@@ -54,7 +54,6 @@ public class PayService {
 
 
         try {
         try {
             String xmlResult = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding());
             String xmlResult = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding());
-//            WxPayOrderNotifyResult payResult = wxPayService.parseOrderNotifyResult(xmlResult);
             SignatureHeader signatureHeader = new SignatureHeader();
             SignatureHeader signatureHeader = new SignatureHeader();
             signatureHeader.setNonce(request.getHeader("Wechatpay-Nonce"));
             signatureHeader.setNonce(request.getHeader("Wechatpay-Nonce"));
             signatureHeader.setSignature(request.getHeader("Wechatpay-Signature"));
             signatureHeader.setSignature(request.getHeader("Wechatpay-Signature"));
@@ -67,36 +66,6 @@ public class PayService {
             log.info("内部订单ID:{}", masterOrderId);
             log.info("内部订单ID:{}", masterOrderId);
             log.info("商户号订单ID:{}", wxTransactionId);
             log.info("商户号订单ID:{}", wxTransactionId);
             log.info("微信真实支付金额:{}", payResult.getAmount());
             log.info("微信真实支付金额:{}", payResult.getAmount());
-//            BigDecimal wxRealPayAmount = new BigDecimal(BaseWxPayResult.fenToYuan(payResult.getTotalFee()));//微信真实支付金额
-//            StOrder stOrder = stOrderMapper.selectByEOrderId(masterOrderId);
-//            Date nowTime = new Date();
-//            if(stOrder.getPayStatus() == 1){
-//                //下一个进程进来的时候,上一个进程已经修改了订单支付状态
-//
-//                return WxPayNotifyResponse.success("处理成功!");
-//            }
-//            StOrder orderRequest = new StOrder();
-//            orderRequest.setPayStatus(1);//标记已支付
-//            orderRequest.setMasterOrderId(masterOrderId);
-//            orderRequest.setPaymentTime(nowTime);
-//            orderRequest.setStoreReceiveTime(nowTime);
-//            orderRequest.setOrderStatus(10);  //等待顾客取货
-//            stOrderMapper.updateByMasterOrderIdSelective(orderRequest);
-//            StOrderPay stOrderPay = new StOrderPay();
-//            stOrderPay.setMasterOrderId(masterOrderId);
-//            stOrderPay.setWxRealPayAmount(wxRealPayAmount);
-//            stOrderPay.setWxTransactionId(wxTransactionId);
-//            stOrderPay.setPayWay(1); //支付方式    微信支付:1    支付宝支付:2
-//            stOrderPayMapper.insert(stOrderPay);
-//
-//            /**
-//             * 打印订单
-//             */
-//            List<StPrinter> stPrinterList = stPrinterMapper.selectPrintersByStoreId(stOrder.getStoreId());
-//            for (StPrinter stPrinter:stPrinterList) {
-//                stPrinterService.printOrder(stOrder.getEOrderId(),stOrder.getStoreId(),stPrinter.getOkPrinterSn());
-//            }
-
             log.info("微信支付,回调处理成功");
             log.info("微信支付,回调处理成功");
             return WxPayNotifyV3Response.success("处理成功!");
             return WxPayNotifyV3Response.success("处理成功!");
         } catch (Exception e) {
         } catch (Exception e) {

+ 1 - 2
data-easy/src/main/java/com/dataeasy/server/pay/WxPayConfiguration.java → data-easy/src/main/java/com/dataeasy/server/demo/pay/WxPayConfiguration.java

@@ -1,11 +1,10 @@
-package com.dataeasy.server.pay;
+package com.dataeasy.server.demo.pay;
 
 
 import com.github.binarywang.wxpay.config.WxPayConfig;
 import com.github.binarywang.wxpay.config.WxPayConfig;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
 import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Configuration;

+ 1 - 1
data-easy/src/main/java/com/dataeasy/server/pay/WxPayProperties.java → data-easy/src/main/java/com/dataeasy/server/demo/pay/WxPayProperties.java

@@ -1,4 +1,4 @@
-package com.dataeasy.server.pay;
+package com.dataeasy.server.demo.pay;
 
 
 import lombok.Data;
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.boot.context.properties.ConfigurationProperties;

+ 313 - 0
doc/技术文档.md

@@ -0,0 +1,313 @@
+# 小石得数
+
+
+
+## 系统功能
+
+* 用户
+  * 登录
+  * 注销
+  * 修改昵称
+* 小程序
+  * 可订阅列表查询
+  * 已订阅列表查询
+  * 已订阅源的消息发送控制配置
+  * 订阅源详情查看
+  * 订阅支付
+  * 每天推送的订阅源数据查看
+    * 新股
+    * 新债
+    * 双色球
+    * 大乐透
+    * Product Hunt的top30榜单
+* 订单历史记录查询
+* 系统定时任务
+  * 获取新股、新债数据并推送
+  * 获取双色球数据并推送
+  * 获取大乐透数据并推送
+  * 获取Product Hunt数据并推送
+
+
+
+
+
+## 表设计
+
+
+
+### 用户表
+
+表名:user
+
+| 字段             | 类型         | 描述                               |
+| ---------------- | ------------ | ---------------------------------- |
+| id               | bigint       | 主键                               |
+| union_id         | varchar(128) | 微信唯一标识id                     |
+| open_id          | varchar(128) | 微信用户标识id                     |
+| nickname         | varchar(100) | 用户昵称                           |
+| created_by       | bigint       | 创建人                             |
+| creation_time    | timestamp    | 创建时间                           |
+| last_updated_by  | bigint       | 最后更新人                         |
+| last_update_time | timestamp    | 最后更新时间                       |
+| version          | bigint       | 版本号                             |
+| delete_flag      | tinyint      | 逻辑删除标志(0-未删除,1-已删除) |
+
+
+
+### 系统字典表
+
+表名:sys_dict
+
+| 字段             | 类型         | 描述                               |
+| ---------------- | ------------ | ---------------------------------- |
+| id               | bigint       | 主键                               |
+| dict_code        | varchar(100) | 字典编码                           |
+| dict_name        | varchar(100) | 字典名称                           |
+| description      | varchar(200) | 描述                               |
+| status           | int          | 状态(1-启用,0-失效)               |
+| created_by       | bigint       | 创建人                             |
+| creation_time    | timestamp    | 创建时间                           |
+| last_updated_by  | bigint       | 最后更信人                         |
+| last_update_time | timestamp    | 最后更新时间                       |
+| version          | bigint       | 版本号                             |
+| delete_flag      | tinyint      | 逻辑删除标志(0-未删除,1-已删除) |
+
+
+
+### 系统字典项表
+
+表名:sys_dict_item
+
+| 字段             | 类型         | 描述                               |
+| ---------------- | ------------ | ---------------------------------- |
+| id               | bigint       | 主键                               |
+| dict_id          | bigint       | 字典表主键                         |
+| data_type        | int          | 数据类型(0-String,1-Number)     |
+| item_code        | varchar(100) | 字典项编码                         |
+| item_name        | varchar(100) | 字典项名称                         |
+| description      | varchar(200) | 描述                               |
+| status           | int          | 状态(1-启用,0-失效)               |
+| created_by       | bigint       | 创建人                             |
+| creation_time    | timestamp    | 创建时间                           |
+| last_updated_by  | bigint       | 最后更信人                         |
+| last_update_time | timestamp    | 最后更新时间                       |
+| version          | bigint       | 版本号                             |
+| delete_flag      | tinyint      | 逻辑删除标志(0-未删除,1-已删除) |
+
+
+
+### Product Hunt数据表
+
+表名:data_product_hunt_post
+
+表注释:Product Hunt榜单的帖子数据
+
+| 字段             | 类型          | 描述                               |
+| ---------------- | ------------- | ---------------------------------- |
+| id               | bigint        | 主键                               |
+| rank_date        | varchar(8)    | 榜单日期                           |
+| rank_num         | int           | 排名位置                           |
+| post_id          | bigint        | 帖子ID                             |
+| name             | varchar(200)  | 帖子名称                           |
+| tagline          | varchar(300)  | 帖子的标语                         |
+| description      | varchar(1000) | 帖子信息                           |
+| votesCount       | int           | 投票数                             |
+| createdAt        | timestamp     | 帖子的创建日期和时间               |
+| featuredAt       | timestamp     | 帖子被特色展示的日期和时间         |
+| website          | varchar(500)  | 指向该帖子网站的重定向 URL         |
+| url              | varchar(500)  | 帖子URL                            |
+| created_by       | bigint        | 创建人                             |
+| creation_time    | timestamp     | 创建时间                           |
+| last_updated_by  | bigint        | 最后更信人                         |
+| last_update_time | timestamp     | 最后更新时间                       |
+| version          | bigint        | 版本号                             |
+| delete_flag      | tinyint       | 逻辑删除标志(0-未删除,1-已删除) |
+
+
+
+### 大乐透数据表
+
+表名:data_da_le_tou
+
+| 字段             | 类型      | 描述                               |
+| ---------------- | --------- | ---------------------------------- |
+| id               | bigint    | 主键                               |
+| number           |           | 开奖号码,以竖杠隔开               |
+| number1          |           | 特别号码1,第一个尾号              |
+| number2          |           | 特别号码2,第二个尾号              |
+| qihao            |           | 期号                               |
+| time             |           | 开奖日期                           |
+| no1num           |           | 一等奖注数                         |
+| no2num           |           | 二等奖注数                         |
+| no3num           |           | 三等奖注数                         |
+| no4num           |           | 四等奖注数                         |
+| no5num           |           | 五等奖注数                         |
+| no6num           |           | 六等奖注数                         |
+| no7num           |           | 七等奖注数                         |
+| no8num           |           | 八等奖注数                         |
+| no9num           |           | 九等奖注数                         |
+| no1money         |           | 一等奖金额                         |
+| no2money         |           | 二等奖金额                         |
+| no3money         |           | 三等奖金额                         |
+| no4money         |           | 四等奖金额                         |
+| no5money         |           | 五等奖金额                         |
+| no6money         |           | 六等奖金额                         |
+| no7money         |           | 七等奖金额                         |
+| no8money         |           | 八等奖金额                         |
+| no9money         |           | 九等奖金额                         |
+| name             |           | 彩票名称                           |
+| xiaoshou         |           | 销售额                             |
+| jiangchi         |           | 奖池金额                           |
+| endtime          |           | 截止兑奖时间                       |
+| no1numjia        |           | 一等奖追加注数                     |
+| no1moneyjia      |           | 一等奖追加奖金                     |
+| no2numjia        |           | 二等奖追加注数                     |
+| no2moneyjia      |           | 二等奖追加奖金                     |
+| created_by       | bigint    | 创建人                             |
+| creation_time    | timestamp | 创建时间                           |
+| last_updated_by  | bigint    | 最后更信人                         |
+| last_update_time | timestamp | 最后更新时间                       |
+| version          | bigint    | 版本号                             |
+| delete_flag      | tinyint   | 逻辑删除标志(0-未删除,1-已删除) |
+
+
+
+### 双色球数据表
+表名:data_shuang_se_qiu
+
+| 字段             | 类型      | 描述                               |
+| ---------------- | --------- | ---------------------------------- |
+| id               | bigint    | 主键                               |
+| number           |           | 开奖号码,以竖杠隔开               |
+| number1          |           | 特别号码,尾号                     |
+| qihao            |           | 期号                               |
+| time             |           | 开奖日期                           |
+| no1num           |           | 一等奖注数                         |
+| no2num           |           | 二等奖注数                         |
+| no3num           |           | 三等奖注数                         |
+| no4num           |           | 四等奖注数                         |
+| no5num           |           | 五等奖注数                         |
+| no6num           |           | 六等奖注数                         |
+| no1money         |           | 一等奖金额                         |
+| no2money         |           | 二等奖金额                         |
+| no3money         |           | 三等奖金额                         |
+| no4money         |           | 四等奖金额                         |
+| no5money         |           | 五等奖金额                         |
+| no6money         |           | 六等奖金额                         |
+| name             |           | 彩票名称                           |
+| xiaoshou         |           | 销售额                             |
+| jiangchi         |           | 奖池金额                           |
+| no1msg           |           | 一等奖中奖地域                     |
+| created_by       | bigint    | 创建人                             |
+| creation_time    | timestamp | 创建时间                           |
+| last_updated_by  | bigint    | 最后更信人                         |
+| last_update_time | timestamp | 最后更新时间                       |
+| version          | bigint    | 版本号                             |
+| delete_flag      | tinyint   | 逻辑删除标志(0-未删除,1-已删除) |
+
+
+
+### 新股数据表
+
+表名:data_ipo_stock
+
+| 字段                              | 类型      | 描述                               |
+| --------------------------------- | --------- | ---------------------------------- |
+| id                                | bigint    | 主键                               |
+| stock_code                        |           | 股票代码                           |
+| stock_short_name                  |           | 股票简称                           |
+| subscription_code                 |           | 申购代码                           |
+| total_issued                      |           | 发行总数                           |
+| online_issued                     |           | 网上发行                           |
+| max_market_value_for_subscription |           | 顶格申购需配市值                   |
+| subscription_limit                |           | 申购上限                           |
+| issue_price                       |           | 发行价格                           |
+| latest_price                      |           | 最新价                             |
+| first_day_closing_price           |           | 首日收盘价                         |
+| subscription_date                 |           | 申购日期                           |
+| winning_number_announcement_date  |           | 中签号公布日                       |
+| payment_date_for_winning          |           | 中签缴款日期                       |
+| listing_date                      |           | 上市日期                           |
+| issue_p_e_ratio                   |           | 发行市盈率                         |
+| industry_p_e_ratio                |           | 行业市盈率                         |
+| winning_rate                      |           | 中签率                             |
+| cumulative_bid_multiple           |           | 询价累计报价倍数                   |
+| bidding_firms_count               |           | 配售对象报价家数                   |
+| consecutive_limit_up_days         |           | 连续一字板数量                     |
+| increase_rate                     |           | 涨幅                               |
+| profit_rer_winning_lot            |           | 每中一签获利                       |
+| created_by                        | bigint    | 创建人                             |
+| creation_time                     | timestamp | 创建时间                           |
+| last_updated_by                   | bigint    | 最后更信人                         |
+| last_update_time                  | timestamp | 最后更新时间                       |
+| version                           | bigint    | 版本号                             |
+| delete_flag                       | tinyint   | 逻辑删除标志(0-未删除,1-已删除) |
+
+
+
+### 新债数据表
+
+表名:data_ipo_bond
+
+| 字段                               | 类型      | 描述                               |
+| ---------------------------------- | --------- | ---------------------------------- |
+| id                                 | bigint    | 主键                               |
+| bond_code                          | varchar() | 债券代码                           |
+| bond_short_name                    |           | 债券简称                           |
+| announcement_date                  |           | 公告日期                           |
+| issue_start_date                   |           | 发行起始日                         |
+| issue_end_date                     |           | 发行终止日                         |
+| planned_issue_amount               |           | 计划发行总量                       |
+| actual_issue_amount                |           | 实际发行总量                       |
+| issue_par_value                    |           | 发行面值                           |
+| issue_price                        |           | 发行价格                           |
+| issue_method                       |           | 发行方式                           |
+| issue_target                       |           | 发行对象                           |
+| issue_scope                        |           | 发行范围                           |
+| underwriting_method                |           | 承销方式                           |
+| fundraising_purpose                |           | 募资用途说明                       |
+| initial_conversion_price           |           | 初始转股价格                       |
+| conversion_start_date              |           | 转股开始日期                       |
+| conversion_end_date                |           | 转股终止日期                       |
+| online_subscription_date           |           | 网上申购日期                       |
+| online_subscription_code           |           | 网上申购代码                       |
+| online_subscription_short_name     |           | 网上申购简称                       |
+| online_subscription_max            |           | 网上申购数量上限                   |
+| online_subscription_min            |           | 网上申购数量下限                   |
+| online_subscription_unit           |           | 网上申购单位                       |
+| online_subscription_result_date    |           | 网上申购中签结果公告日及退款日     |
+| priority_subscription_date         |           | 优先申购日                         |
+| allotment_price                    |           | 配售价格                           |
+| creditor_registration_date         |           | 债权登记日                         |
+| priority_subscription_payment_date |           | 优先申购缴款日                     |
+| conversion_code                    |           | 转股代码                           |
+| trading_market                     |           | 交易市场                           |
+| bond_name                          |           | 债券名称                           |
+| created_by                         | bigint    | 创建人                             |
+| creation_time                      | timestamp | 创建时间                           |
+| last_updated_by                    | bigint    | 最后更信人                         |
+| last_update_time                   | timestamp | 最后更新时间                       |
+| version                            | bigint    | 版本号                             |
+| delete_flag                        | tinyint   | 逻辑删除标志(0-未删除,1-已删除) |
+
+
+
+### 定时任务执行记录表
+
+表名:
+
+
+
+
+订阅源表
+
+订阅源详情表
+
+用户的订阅源配置表
+
+用户的订阅时间表
+
+订单表
+
+
+

+ 155 - 0
pom.xml

@@ -20,4 +20,159 @@
         <module>data-easy</module>
         <module>data-easy</module>
     </modules>
     </modules>
 
 
+    <properties>
+        <maven.compiler.source>21</maven.compiler.source>
+        <maven.compiler.target>21</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <java.version>21</java.version>
+        <spring-cloud.version>2023.0.3</spring-cloud.version>
+        <tk-mybatis.version>5.0.1</tk-mybatis.version>
+        <jasypt.version>3.0.5</jasypt.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>tk.mybatis</groupId>
+                <artifactId>mapper-spring-boot-starter</artifactId>
+                <version>${tk-mybatis.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.github.ulisesbocchio</groupId>
+                <artifactId>jasypt-spring-boot-starter</artifactId>
+                <version>${jasypt.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <!-- 配置阿里云仓库 -->
+    <repositories>
+        <repository>
+            <id>aliyun-repos</id>
+            <url>https://maven.aliyun.com/repository/public</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>aliyun-repos</id>
+            <url>https://maven.aliyun.com/repository/public</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <!--引入第三方jar包时,不添加则引入的第三方jar不会被打入jar包中-->
+                    <includeSystemScope>true</includeSystemScope>
+                    <!--排除第三方jar文件-->
+                    <includes>
+                        <include>
+                            <groupId>nothing</groupId>
+                            <artifactId>nothing</artifactId>
+                        </include>
+                    </includes>
+                    <excludes>
+                        <exclude>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                        </exclude>
+                    </excludes>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <!-- 2、完成对Java代码的编译,可以指定项目源码的jdk版本,编译后的jdk版本,以及编码 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <!-- 源代码使用的JDK版本 -->
+                    <source>${java.version}</source>
+                    <!-- 需要生成的目标class文件的编译版本 -->
+                    <target>${java.version}</target>
+                    <!-- 字符集编码 -->
+                    <encoding>UTF-8</encoding>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                            <version>${lombok.version}</version>
+                        </path>
+                    </annotationProcessorPaths>
+                </configuration>
+            </plugin>
+
+            <!-- 3、将所有依赖的jar文件复制到target/lib目录 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-dependencies</id>
+                        <phase>prepare-package</phase>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <!--复制到哪个路径,${project.build.directory} 缺醒为 target,其他内置参数见下面解释-->
+                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
+                            <overWriteReleases>false</overWriteReleases>
+                            <overWriteSnapshots>false</overWriteSnapshots>
+                            <overWriteIfNewer>true</overWriteIfNewer>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+        <pluginManagement>
+            <plugins>
+                <!-- 4、指定启动类,指定配置文件,将依赖打成外部jar包 -->
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-jar-plugin</artifactId>
+                    <configuration>
+                        <archive>
+                            <manifest>
+                                <!-- 是否要把第三方jar加入到类构建路径 -->
+                                <addClasspath>true</addClasspath>
+                                <!-- 外部依赖jar包的最终位置 -->
+                                <classpathPrefix>lib/</classpathPrefix>
+                                <!-- 项目启动类 -->
+<!--                                <mainClass>com.xxxx.server.Application</mainClass>-->
+                            </manifest>
+                        </archive>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
 </project>
 </project>

+ 1 - 139
product-hunt/pom.xml

@@ -12,26 +12,11 @@
     <artifactId>product-hunt</artifactId>
     <artifactId>product-hunt</artifactId>
 
 
     <properties>
     <properties>
-        <maven.compiler.source>21</maven.compiler.source>
-        <maven.compiler.target>21</maven.compiler.target>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <java.version>21</java.version>
-        <spring-cloud.version>2023.0.3</spring-cloud.version>
-        <jwt.version>4.4.0</jwt.version>
-        <tk-mybatis.version>5.0.1</tk-mybatis.version>
-        <jasypt.version>3.0.5</jasypt.version>
         <spring-ai.version>1.0.0-M6</spring-ai.version>
         <spring-ai.version>1.0.0-M6</spring-ai.version>
     </properties>
     </properties>
 
 
     <dependencyManagement>
     <dependencyManagement>
         <dependencies>
         <dependencies>
-            <dependency>
-                <groupId>org.springframework.cloud</groupId>
-                <artifactId>spring-cloud-dependencies</artifactId>
-                <version>${spring-cloud.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
             <dependency>
             <dependency>
                 <groupId>org.springframework.ai</groupId>
                 <groupId>org.springframework.ai</groupId>
                 <artifactId>spring-ai-bom</artifactId>
                 <artifactId>spring-ai-bom</artifactId>
@@ -54,7 +39,6 @@
         <dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
             <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <groupId>org.springframework.boot</groupId>
@@ -79,155 +63,33 @@
         <dependency>
         <dependency>
             <groupId>com.mysql</groupId>
             <groupId>com.mysql</groupId>
             <artifactId>mysql-connector-j</artifactId>
             <artifactId>mysql-connector-j</artifactId>
-            <scope>runtime</scope>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>org.projectlombok</groupId>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
             <artifactId>lombok</artifactId>
-            <optional>true</optional>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>tk.mybatis</groupId>
             <groupId>tk.mybatis</groupId>
             <artifactId>mapper-spring-boot-starter</artifactId>
             <artifactId>mapper-spring-boot-starter</artifactId>
-            <version>${tk-mybatis.version}</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>com.github.ulisesbocchio</groupId>
             <groupId>com.github.ulisesbocchio</groupId>
             <artifactId>jasypt-spring-boot-starter</artifactId>
             <artifactId>jasypt-spring-boot-starter</artifactId>
-            <version>${jasypt.version}</version>
         </dependency>
         </dependency>
     </dependencies>
     </dependencies>
 
 
-    <!-- 配置阿里云仓库 -->
-    <repositories>
-        <repository>
-            <id>aliyun-repos</id>
-            <url>https://maven.aliyun.com/repository/public</url>
-            <releases>
-                <enabled>true</enabled>
-            </releases>
-            <snapshots>
-                <enabled>false</enabled>
-            </snapshots>
-        </repository>
-    </repositories>
-    <pluginRepositories>
-        <pluginRepository>
-            <id>aliyun-repos</id>
-            <url>https://maven.aliyun.com/repository/public</url>
-            <releases>
-                <enabled>true</enabled>
-            </releases>
-            <snapshots>
-                <enabled>false</enabled>
-            </snapshots>
-        </pluginRepository>
-    </pluginRepositories>
-
     <build>
     <build>
         <plugins>
         <plugins>
-            <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-                <configuration>
-                    <!--引入第三方jar包时,不添加则引入的第三方jar不会被打入jar包中-->
-                    <includeSystemScope>true</includeSystemScope>
-                    <!--排除第三方jar文件-->
-                    <includes>
-                        <include>
-                            <groupId>nothing</groupId>
-                            <artifactId>nothing</artifactId>
-                        </include>
-                    </includes>
-                    <excludes>
-                        <exclude>
-                            <groupId>org.projectlombok</groupId>
-                            <artifactId>lombok</artifactId>
-                        </exclude>
-                    </excludes>
-                </configuration>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>repackage</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-
-            <!-- 2、完成对Java代码的编译,可以指定项目源码的jdk版本,编译后的jdk版本,以及编码 -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <!-- 源代码使用的JDK版本 -->
-                    <source>${java.version}</source>
-                    <!-- 需要生成的目标class文件的编译版本 -->
-                    <target>${java.version}</target>
-                    <!-- 字符集编码 -->
-                    <encoding>UTF-8</encoding>
-                    <!-- 用来传递编译器自身不包含但是却支持的参数选项 -->
-                    <!--                    <compilerArguments>-->
-                    <!--                        <verbose/>-->
-                    <!--                        &lt;!&ndash; windwos环境(二选一) &ndash;&gt;-->
-                    <!--                        <bootclasspath>${java.home}/lib/rt.jar:${java.home}/lib/jce.jar</bootclasspath>-->
-                    <!--                        &lt;!&ndash; Linux环境(二选一) &ndash;&gt;-->
-                    <!--                        <bootclasspath>${java.home}/lib/rt.jar:${java.home}/lib/jce.jar</bootclasspath>-->
-                    <!--                    </compilerArguments>-->
-                    <annotationProcessorPaths>
-                        <path>
-                            <groupId>org.projectlombok</groupId>
-                            <artifactId>lombok</artifactId>
-                            <version>${lombok.version}</version>
-                        </path>
-                    </annotationProcessorPaths>
-                </configuration>
-            </plugin>
-
-            <!-- 3、将所有依赖的jar文件复制到target/lib目录 -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>copy-dependencies</id>
-                        <phase>prepare-package</phase>
-                        <goals>
-                            <goal>copy-dependencies</goal>
-                        </goals>
-                        <configuration>
-                            <!--复制到哪个路径,${project.build.directory} 缺醒为 target,其他内置参数见下面解释-->
-                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
-                            <overWriteReleases>false</overWriteReleases>
-                            <overWriteSnapshots>false</overWriteSnapshots>
-                            <overWriteIfNewer>true</overWriteIfNewer>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-
-            <!-- 4、指定启动类,指定配置文件,将依赖打成外部jar包 -->
             <plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
                 <artifactId>maven-jar-plugin</artifactId>
                 <configuration>
                 <configuration>
                     <archive>
                     <archive>
                         <manifest>
                         <manifest>
-                            <!-- 是否要把第三方jar加入到类构建路径 -->
-                            <addClasspath>true</addClasspath>
-                            <!-- 外部依赖jar包的最终位置 -->
-                            <classpathPrefix>lib/</classpathPrefix>
                             <!-- 项目启动类 -->
                             <!-- 项目启动类 -->
-                            <mainClass>com.punchsettle.server.Application</mainClass>
+                            <mainClass>com.producthunt.server.Application</mainClass>
                         </manifest>
                         </manifest>
                     </archive>
                     </archive>
-                    <!--资源文件不打进jar包中,做到配置跟项目分离的效果-->
-                    <!--                    <excludes>-->
-                    <!--                        &lt;!&ndash; 业务jar中过滤application.properties/yml文件,在jar包外控制 &ndash;&gt;-->
-                    <!--                        <exclude>*.properties</exclude>-->
-                    <!--                        <exclude>*.xml</exclude>-->
-                    <!--                        <exclude>*.yml</exclude>-->
-                    <!--                    </excludes>-->
                 </configuration>
                 </configuration>
             </plugin>
             </plugin>
         </plugins>
         </plugins>

+ 0 - 183
product-hunt/src/main/java/com/producthunt/server/TestController.java

@@ -1,183 +0,0 @@
-package com.producthunt.server;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.producthunt.server.core.config.HzApiConfig;
-import com.producthunt.server.feign.FinanceFeign;
-import com.producthunt.server.feign.dto.FinanceRequest;
-import com.producthunt.server.feign.dto.BondResponse;
-import com.producthunt.server.feign.dto.HzApiRequest;
-import com.producthunt.server.feign.dto.StockResponse;
-import org.springframework.ai.chat.client.ChatClient;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.core.io.Resource;
-import org.springframework.graphql.client.GraphQlClient;
-import org.springframework.util.CollectionUtils;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import com.producthunt.server.core.config.ProductHuntConfig;
-import com.producthunt.server.feign.HzApiFeign;
-import com.producthunt.server.feign.ProductHuntFeign;
-import com.producthunt.server.feign.dto.DaLeTouResponse;
-import com.producthunt.server.feign.dto.OauthRequest;
-import com.producthunt.server.feign.dto.OauthResponse;
-import com.producthunt.server.feign.dto.ShuangSeQiuResponse;
-
-/**
- * @author tyuio
- * @version 1.0.0
- * @description TODO
- * @date 2025/2/17 19:17
- */
-@RestController
-@RequestMapping("/test")
-public class TestController {
-
-    @Autowired
-    private ProductHuntFeign productHuntFeign;
-
-    @Autowired
-    private ProductHuntConfig productHuntConfig;
-
-    @GetMapping("/t1")
-    public OauthResponse t1() {
-        OauthRequest oauthRequest = new OauthRequest();
-        oauthRequest.setClientId(productHuntConfig.getClientId());
-        oauthRequest.setClientSecret(productHuntConfig.getClientSecret());
-        return productHuntFeign.getOauthToken(oauthRequest);
-    }
-
-    @Autowired
-    private GraphQlClient graphQlClient;
-
-    /**
-     * Product Hunt 查询模板(按投票数排序,限定时间范围)
-     */
-    private final String queryTemplate = """
-        {
-                   posts(order: VOTES, postedAfter: "%sT00:00:00Z", postedBefore: "%sT23:59:59Z", after: "%s") {
-                     nodes {
-                       id
-                       name
-                       tagline
-                       description
-                       votesCount
-                       createdAt
-                       featuredAt
-                       website
-                       url
-                     }
-                     pageInfo {
-                       hasNextPage
-                       endCursor
-                     }
-                   }
-                 }
-        """;
-
-    @GetMapping("/t2")
-    public List<PostNode> t2() {
-        List<PostNode> posts = new ArrayList<>();
-        boolean hasNextPage = true;
-        String endCursor = "";
-        String dateStr = "2025-02-22";
-        while (hasNextPage) {
-            // 设置查询模板并发起查询,好像无法直接一次性查询指定数量,只能分页查询并且要自己控制所需数量
-            String queryDocument = String.format(queryTemplate, dateStr, dateStr, endCursor);
-            PostResponse postResponse =
-                graphQlClient.document(queryDocument).retrieveSync("posts").toEntity(PostResponse.class);
-            // 把获取到的帖子信息放入容器
-            if (!CollectionUtils.isEmpty(postResponse.getNodes())) {
-                posts.addAll(postResponse.getNodes());
-            }
-            // 帖子数量大于30则退出
-            if (posts.size() > 30) {
-                break;
-            }
-            // 没有下一页了则跳出循环
-            if (!postResponse.getPageInfo().getHasNextPage()) {
-                break;
-            }
-            hasNextPage = postResponse.getPageInfo().getHasNextPage();
-        }
-        return posts.subList(0, 30);
-    }
-
-    @Autowired
-    private ChatClient.Builder chatClientBuilder;
-
-    // 通过@Value注解注入资源文件
-    @Value("classpath:/prompts/system-message.st")
-    private Resource promptSystemMessage;
-
-    @GetMapping("/t3")
-    public String t3() {
-
-//        // 1. 定义用户消息模板
-        String userText = """
-    Enter a prompt, set your preferences, and let AI build a high-converting, fully optimized eCommerce store in minutes—no coding, no design skills, no hassle. Launch your store effortlessly and start selling instantly! 🚀
-    """;
-//// 创建用户提示模板对象
-//        PromptTemplate userPromptTemplate = new PromptTemplate(userText);
-//// 根据模板和参数创建用户消息
-//        Message userMessage = userPromptTemplate.createMessage();
-//
-//// 创建系统提示模板对象
-//        SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(promptSystemMessage);
-//// 根据模板和参数创建系统消息
-//        Message systemMessage = systemPromptTemplate.createMessage();
-//// 创建包含其他消息和系统消息的提示
-//        Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
-
-// 3. 创建包含用户消息和系统消息的提示
-
-        // 单个提问
-        ChatClient chatClient = chatClientBuilder.defaultSystem(promptSystemMessage).build();
-        return chatClient.prompt().user(userText).call().content();
-    }
-
-
-    @Autowired
-    private HzApiFeign hzApiFeign;
-
-    @Autowired
-    private HzApiConfig hzApiConfig;
-
-    @GetMapping("/t4")
-    public DaLeTouResponse t4() {
-        HzApiRequest request = new HzApiRequest();
-        request.setId(hzApiConfig.getId());
-        request.setKey(hzApiConfig.getKey());
-        return hzApiFeign.getDaLeTou(request);
-    }
-
-    @GetMapping("/t5")
-    public ShuangSeQiuResponse t5() {
-        HzApiRequest request = new HzApiRequest();
-        request.setId(hzApiConfig.getId());
-        request.setKey(hzApiConfig.getKey());
-        return hzApiFeign.getShuangSeQiu(request);
-    }
-
-    @Autowired
-    private FinanceFeign financeFeign;
-
-    @GetMapping("/t6")
-    public List<StockResponse> t6(){
-        FinanceRequest financeRequest = new FinanceRequest();
-        financeRequest.setSymbol("全部股票");
-        return financeFeign.getStockXgsglbEm(financeRequest);
-    }
-
-    @GetMapping("/t7")
-    public List<BondResponse> t7(){
-        FinanceRequest financeRequest = new FinanceRequest();
-        financeRequest.setStartDate("20250101");
-        financeRequest.setEndDate("20250131");
-        return financeFeign.getBondCovIssueCninfo(financeRequest);
-    }
-}

+ 7 - 1
product-hunt/src/main/java/com/producthunt/server/core/config/HzApiConfig.java

@@ -1,9 +1,10 @@
 package com.producthunt.server.core.config;
 package com.producthunt.server.core.config;
 
 
-import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
+import lombok.Data;
+
 /**
 /**
  * @author tyuio
  * @author tyuio
  * @version 1.0.0
  * @version 1.0.0
@@ -15,6 +16,11 @@ import org.springframework.stereotype.Component;
 @ConfigurationProperties("hz-api")
 @ConfigurationProperties("hz-api")
 public class HzApiConfig {
 public class HzApiConfig {
 
 
+    /**
+     * 平台接口地址
+     */
+    private String baseUrl;
+
     /**
     /**
      * 账号ID
      * 账号ID
      */
      */

+ 13 - 4
product-hunt/src/main/java/com/producthunt/server/core/config/ProductHuntConfig.java

@@ -1,12 +1,10 @@
 package com.producthunt.server.core.config;
 package com.producthunt.server.core.config;
 
 
-import lombok.Data;
-import lombok.Getter;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
+import lombok.Data;
+
 /**
 /**
  * @author tyuio
  * @author tyuio
  * @version 1.0.0
  * @version 1.0.0
@@ -18,6 +16,16 @@ import org.springframework.stereotype.Component;
 @ConfigurationProperties("product-hunt")
 @ConfigurationProperties("product-hunt")
 public class ProductHuntConfig {
 public class ProductHuntConfig {
 
 
+    /**
+     * Product Hunt平台API地址
+     */
+    private String baseUrl;
+
+    /**
+     * GraphQL接口地址
+     */
+    private String graphqlUrl;
+
     /**
     /**
      * 应用ID
      * 应用ID
      */
      */
@@ -27,4 +35,5 @@ public class ProductHuntConfig {
      * 应用密钥
      * 应用密钥
      */
      */
     private String clientSecret;
     private String clientSecret;
+
 }
 }

+ 2 - 2
product-hunt/src/main/java/com/producthunt/server/PostNode.java → product-hunt/src/main/java/com/producthunt/server/dto/PostNode.java

@@ -1,4 +1,4 @@
-package com.producthunt.server;
+package com.producthunt.server.dto;
 
 
 import lombok.Data;
 import lombok.Data;
 
 
@@ -19,7 +19,7 @@ public class PostNode {
     private Long id;
     private Long id;
 
 
     /**
     /**
-     * 子名称
+     * 子名称
      */
      */
     private String name;
     private String name;
 
 

+ 1 - 1
product-hunt/src/main/java/com/producthunt/server/PostPageInfo.java → product-hunt/src/main/java/com/producthunt/server/dto/PostPageInfo.java

@@ -1,4 +1,4 @@
-package com.producthunt.server;
+package com.producthunt.server.dto;
 
 
 import lombok.Data;
 import lombok.Data;
 
 

+ 1 - 1
product-hunt/src/main/java/com/producthunt/server/PostResponse.java → product-hunt/src/main/java/com/producthunt/server/dto/PostResponse.java

@@ -1,4 +1,4 @@
-package com.producthunt.server;
+package com.producthunt.server.dto;
 
 
 import lombok.Data;
 import lombok.Data;
 
 

+ 4 - 5
product-hunt/src/main/java/com/producthunt/server/feign/FinanceFeign.java

@@ -1,8 +1,8 @@
 package com.producthunt.server.feign;
 package com.producthunt.server.feign;
 
 
-import com.producthunt.server.feign.dto.BondResponse;
-import com.producthunt.server.feign.dto.FinanceRequest;
-import com.producthunt.server.feign.dto.StockResponse;
+import com.producthunt.server.feign.dto.finance.BondResponse;
+import com.producthunt.server.feign.dto.finance.FinanceRequest;
+import com.producthunt.server.feign.dto.finance.StockResponse;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.cloud.openfeign.SpringQueryMap;
 import org.springframework.cloud.openfeign.SpringQueryMap;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -15,8 +15,7 @@ import java.util.List;
  * @description 新股、新债数据服务接口
  * @description 新股、新债数据服务接口
  * @date 2025/2/28 15:12
  * @date 2025/2/28 15:12
  */
  */
-//@FeignClient(name = "stock-service", url = "http://192.168.123.242:8000")
-@FeignClient(name = "stock-service", url = "http://127.0.0.1:8000")
+@FeignClient(name = "stock-service", url = "${finance.base-url}")
 public interface FinanceFeign {
 public interface FinanceFeign {
 
 
     /**
     /**

+ 4 - 4
product-hunt/src/main/java/com/producthunt/server/feign/HzApiFeign.java

@@ -1,8 +1,8 @@
 package com.producthunt.server.feign;
 package com.producthunt.server.feign;
 
 
-import com.producthunt.server.feign.dto.DaLeTouResponse;
-import com.producthunt.server.feign.dto.HzApiRequest;
-import com.producthunt.server.feign.dto.ShuangSeQiuResponse;
+import com.producthunt.server.feign.dto.hzapi.DaLeTouResponse;
+import com.producthunt.server.feign.dto.hzapi.HzApiRequest;
+import com.producthunt.server.feign.dto.hzapi.ShuangSeQiuResponse;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.cloud.openfeign.SpringQueryMap;
 import org.springframework.cloud.openfeign.SpringQueryMap;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.GetMapping;
  * @description 接口盒子平台接口服务
  * @description 接口盒子平台接口服务
  * @date 2025/2/28 11:27
  * @date 2025/2/28 11:27
  */
  */
-@FeignClient(name = "hz-api-service", url = "https://cn.apihz.cn")
+@FeignClient(name = "hz-api-service", url = "${hz-api.base-url}")
 public interface HzApiFeign {
 public interface HzApiFeign {
 
 
     /**
     /**

+ 4 - 4
product-hunt/src/main/java/com/producthunt/server/feign/ProductHuntFeign.java

@@ -1,19 +1,19 @@
 package com.producthunt.server.feign;
 package com.producthunt.server.feign;
 
 
-import com.producthunt.server.feign.dto.OauthRequest;
-import com.producthunt.server.feign.dto.OauthResponse;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.cloud.openfeign.SpringQueryMap;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestBody;
 
 
+import com.producthunt.server.feign.dto.producthunt.OauthRequest;
+import com.producthunt.server.feign.dto.producthunt.OauthResponse;
+
 /**
 /**
  * @author tyuio
  * @author tyuio
  * @version 1.0.0
  * @version 1.0.0
  * @description ProductHunt服务接口
  * @description ProductHunt服务接口
  * @date 2025/2/17 18:58
  * @date 2025/2/17 18:58
  */
  */
-@FeignClient(name = "product-hunt-service", url = "https://api.producthunt.com")
+@FeignClient(name = "product-hunt-service", url = "${product-hunt.base-url}")
 public interface ProductHuntFeign {
 public interface ProductHuntFeign {
 
 
     /**
     /**

+ 1 - 2
product-hunt/src/main/java/com/producthunt/server/feign/dto/BondResponse.java → product-hunt/src/main/java/com/producthunt/server/feign/dto/finance/BondResponse.java

@@ -1,9 +1,8 @@
-package com.producthunt.server.feign.dto;
+package com.producthunt.server.feign.dto.finance;
 
 
 import java.io.Serial;
 import java.io.Serial;
 import java.io.Serializable;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
-import java.util.Date;
 
 
 import com.fasterxml.jackson.annotation.JsonAlias;
 import com.fasterxml.jackson.annotation.JsonAlias;
 import lombok.Data;
 import lombok.Data;

+ 1 - 5
product-hunt/src/main/java/com/producthunt/server/feign/dto/FinanceRequest.java → product-hunt/src/main/java/com/producthunt/server/feign/dto/finance/FinanceRequest.java

@@ -1,12 +1,8 @@
-package com.producthunt.server.feign.dto;
+package com.producthunt.server.feign.dto.finance;
 
 
-import com.fasterxml.jackson.annotation.JsonProperty;
 import feign.Param;
 import feign.Param;
 import lombok.Data;
 import lombok.Data;
 
 
-import java.io.Serial;
-import java.io.Serializable;
-
 /**
 /**
  * @author tyuio
  * @author tyuio
  * @version 1.0.0
  * @version 1.0.0

+ 1 - 1
product-hunt/src/main/java/com/producthunt/server/feign/dto/StockResponse.java → product-hunt/src/main/java/com/producthunt/server/feign/dto/finance/StockResponse.java

@@ -1,4 +1,4 @@
-package com.producthunt.server.feign.dto;
+package com.producthunt.server.feign.dto.finance;
 
 
 import java.io.Serial;
 import java.io.Serial;
 import java.io.Serializable;
 import java.io.Serializable;

+ 1 - 1
product-hunt/src/main/java/com/producthunt/server/feign/dto/DaLeTouResponse.java → product-hunt/src/main/java/com/producthunt/server/feign/dto/hzapi/DaLeTouResponse.java

@@ -1,4 +1,4 @@
-package com.producthunt.server.feign.dto;
+package com.producthunt.server.feign.dto.hzapi;
 
 
 import lombok.Data;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;

+ 1 - 1
product-hunt/src/main/java/com/producthunt/server/feign/dto/HzApiBaseResponse.java → product-hunt/src/main/java/com/producthunt/server/feign/dto/hzapi/HzApiBaseResponse.java

@@ -1,4 +1,4 @@
-package com.producthunt.server.feign.dto;
+package com.producthunt.server.feign.dto.hzapi;
 
 
 import lombok.Data;
 import lombok.Data;
 
 

+ 1 - 1
product-hunt/src/main/java/com/producthunt/server/feign/dto/HzApiRequest.java → product-hunt/src/main/java/com/producthunt/server/feign/dto/hzapi/HzApiRequest.java

@@ -1,4 +1,4 @@
-package com.producthunt.server.feign.dto;
+package com.producthunt.server.feign.dto.hzapi;
 
 
 import lombok.Data;
 import lombok.Data;
 
 

+ 1 - 1
product-hunt/src/main/java/com/producthunt/server/feign/dto/ShuangSeQiuResponse.java → product-hunt/src/main/java/com/producthunt/server/feign/dto/hzapi/ShuangSeQiuResponse.java

@@ -1,4 +1,4 @@
-package com.producthunt.server.feign.dto;
+package com.producthunt.server.feign.dto.hzapi;
 
 
 import lombok.Data;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;

+ 1 - 3
product-hunt/src/main/java/com/producthunt/server/feign/dto/OauthRequest.java → product-hunt/src/main/java/com/producthunt/server/feign/dto/producthunt/OauthRequest.java

@@ -1,8 +1,6 @@
-package com.producthunt.server.feign.dto;
+package com.producthunt.server.feign.dto.producthunt;
 
 
-import com.fasterxml.jackson.annotation.JsonAlias;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import feign.Param;
 import lombok.Data;
 import lombok.Data;
 
 
 /**
 /**

+ 1 - 1
product-hunt/src/main/java/com/producthunt/server/feign/dto/OauthResponse.java → product-hunt/src/main/java/com/producthunt/server/feign/dto/producthunt/OauthResponse.java

@@ -1,4 +1,4 @@
-package com.producthunt.server.feign.dto;
+package com.producthunt.server.feign.dto.producthunt;
 
 
 import com.fasterxml.jackson.annotation.JsonAlias;
 import com.fasterxml.jackson.annotation.JsonAlias;
 import lombok.Data;
 import lombok.Data;

+ 33 - 0
product-hunt/src/main/java/com/producthunt/server/service/controller/ProductHuntController.java

@@ -0,0 +1,33 @@
+package com.producthunt.server.service.controller;
+
+import com.producthunt.server.dto.PostNode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.producthunt.server.service.manager.IProductHuntManager;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description Product Hunt 控制器
+ * @date 2025/3/5 11:20
+ */
+@Slf4j
+@RestController
+@RequestMapping("/producthunt")
+public class ProductHuntController {
+
+    @Autowired
+    private IProductHuntManager productHuntManager;
+
+    @GetMapping("/getTop30Posts")
+    public List<PostNode> getTop30Posts() {
+        return productHuntManager.getTop30Posts();
+    }
+}

+ 17 - 0
product-hunt/src/main/java/com/producthunt/server/service/manager/IAiChatManager.java

@@ -0,0 +1,17 @@
+package com.producthunt.server.service.manager;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description AI大模型 服务类
+ * @date 2025/3/5 12:30
+ */
+public interface IAiChatManager {
+
+    /**
+     * 文本翻译
+     * @param text
+     * @return
+     */
+    String translate(String text);
+}

+ 27 - 0
product-hunt/src/main/java/com/producthunt/server/service/manager/IFinanceManager.java

@@ -0,0 +1,27 @@
+package com.producthunt.server.service.manager;
+
+import com.producthunt.server.feign.dto.finance.BondResponse;
+import com.producthunt.server.feign.dto.finance.StockResponse;
+
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 金融相关 服务类
+ * @date 2025/3/5 11:20
+ */
+public interface IFinanceManager {
+
+    /**
+     * 获取股票列表
+     * @return
+     */
+    List<StockResponse> getStockList();
+
+    /**
+     * 获取债券列表(当天)
+     * @return
+     */
+    List<BondResponse> getBondList();
+}

+ 25 - 0
product-hunt/src/main/java/com/producthunt/server/service/manager/IHzApiManager.java

@@ -0,0 +1,25 @@
+package com.producthunt.server.service.manager;
+
+import com.producthunt.server.feign.dto.hzapi.DaLeTouResponse;
+import com.producthunt.server.feign.dto.hzapi.ShuangSeQiuResponse;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 接口盒子平台 服务类
+ * @date 2025/3/5 12:06
+ */
+public interface IHzApiManager {
+
+    /**
+     * 获取大乐透开奖数据(当期)
+     * @return
+     */
+    DaLeTouResponse getDaLeTou();
+
+    /**
+     * 获取双色球开奖数据(当期)
+     * @return
+     */
+    ShuangSeQiuResponse getShuangSeQiu();
+}

+ 20 - 0
product-hunt/src/main/java/com/producthunt/server/service/manager/IProductHuntManager.java

@@ -0,0 +1,20 @@
+package com.producthunt.server.service.manager;
+
+import com.producthunt.server.dto.PostNode;
+
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description Product Hunt服务类
+ * @date 2025/3/5 12:13
+ */
+public interface IProductHuntManager {
+
+    /**
+     * 查询Product Hunt Top30 的帖子(当天)
+     * @return
+     */
+    List<PostNode> getTop30Posts();
+}

+ 30 - 0
product-hunt/src/main/java/com/producthunt/server/service/manager/impl/AiChatManagerImpl.java

@@ -0,0 +1,30 @@
+package com.producthunt.server.service.manager.impl;
+
+import com.producthunt.server.service.manager.IAiChatManager;
+import org.springframework.ai.chat.client.ChatClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.Resource;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description TODO
+ * @date 2025/3/5 12:31
+ */
+public class AiChatManagerImpl implements IAiChatManager {
+
+    @Autowired
+    private ChatClient.Builder chatClientBuilder;
+
+    // 通过@Value注解注入资源文件
+    @Value("classpath:/prompts/system-message.st")
+    private Resource promptSystemMessage;
+
+    @Override
+    public String translate(String text) {
+        // 单个提问
+        ChatClient chatClient = chatClientBuilder.defaultSystem(promptSystemMessage).build();
+        return chatClient.prompt().user(text).call().content();
+    }
+}

+ 47 - 0
product-hunt/src/main/java/com/producthunt/server/service/manager/impl/FinanceManagerImpl.java

@@ -0,0 +1,47 @@
+package com.producthunt.server.service.manager.impl;
+
+import com.producthunt.server.feign.FinanceFeign;
+import com.producthunt.server.feign.dto.finance.BondResponse;
+import com.producthunt.server.feign.dto.finance.FinanceRequest;
+import com.producthunt.server.feign.dto.finance.StockResponse;
+import com.producthunt.server.service.manager.IFinanceManager;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 金融 服务类
+ * @date 2025/3/5 12:01
+ */
+@Slf4j
+@Component
+public class FinanceManagerImpl implements IFinanceManager {
+
+    @Autowired
+    private FinanceFeign financeFeign;
+
+    @Override
+    public List<StockResponse> getStockList() {
+        FinanceRequest financeRequest = new FinanceRequest();
+        financeRequest.setSymbol("全部股票");
+        return financeFeign.getStockXgsglbEm(financeRequest);
+    }
+
+    @Override
+    public List<BondResponse> getBondList() {
+        LocalDate today = LocalDate.now();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+        String todayStr = sdf.format(today);
+
+        FinanceRequest financeRequest = new FinanceRequest();
+        financeRequest.setStartDate(todayStr);
+        financeRequest.setEndDate(todayStr);
+        return financeFeign.getBondCovIssueCninfo(financeRequest);
+    }
+}

+ 47 - 0
product-hunt/src/main/java/com/producthunt/server/service/manager/impl/HzApiManagerImpl.java

@@ -0,0 +1,47 @@
+package com.producthunt.server.service.manager.impl;
+
+import com.producthunt.server.core.config.HzApiConfig;
+import com.producthunt.server.feign.HzApiFeign;
+import com.producthunt.server.feign.dto.hzapi.DaLeTouResponse;
+import com.producthunt.server.feign.dto.hzapi.HzApiRequest;
+import com.producthunt.server.feign.dto.hzapi.ShuangSeQiuResponse;
+import com.producthunt.server.service.manager.IHzApiManager;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 藉口盒子平台 服务类
+ * @date 2025/3/5 12:08
+ */
+@Slf4j
+@Component
+public class HzApiManagerImpl implements IHzApiManager {
+
+    @Autowired
+    private HzApiFeign hzApiFeign;
+
+    @Autowired
+    private HzApiConfig hzApiConfig;
+
+    private HzApiRequest buildCommonRequest() {
+        HzApiRequest request = new HzApiRequest();
+        request.setId(hzApiConfig.getId());
+        request.setKey(hzApiConfig.getKey());
+        return request;
+    }
+
+    @Override
+    public DaLeTouResponse getDaLeTou() {
+        HzApiRequest request = buildCommonRequest();
+        return hzApiFeign.getDaLeTou(request);
+    }
+
+    @Override
+    public ShuangSeQiuResponse getShuangSeQiu() {
+        HzApiRequest request = buildCommonRequest();
+        return hzApiFeign.getShuangSeQiu(request);
+    }
+}

+ 109 - 0
product-hunt/src/main/java/com/producthunt/server/service/manager/impl/ProductHuntManagerImpl.java

@@ -0,0 +1,109 @@
+package com.producthunt.server.service.manager.impl;
+
+import com.producthunt.server.dto.PostNode;
+import com.producthunt.server.dto.PostResponse;
+import com.producthunt.server.core.config.ProductHuntConfig;
+import com.producthunt.server.feign.ProductHuntFeign;
+import com.producthunt.server.feign.dto.producthunt.OauthRequest;
+import com.producthunt.server.feign.dto.producthunt.OauthResponse;
+import com.producthunt.server.service.manager.IProductHuntManager;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.graphql.client.GraphQlClient;
+import org.springframework.graphql.client.HttpSyncGraphQlClient;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description Product Hunt服务类
+ * @date 2025/3/5 12:15
+ */
+@Slf4j
+@Component
+public class ProductHuntManagerImpl implements IProductHuntManager {
+
+    @Autowired
+    private ProductHuntFeign productHuntFeign;
+
+    @Autowired
+    private ProductHuntConfig productHuntConfig;
+
+    /**
+     * Product Hunt 查询模板(按投票数排序,限定时间范围)
+     */
+    private final String queryTemplate = """
+        {
+                   posts(order: VOTES, postedAfter: "%sT00:00:00Z", postedBefore: "%sT23:59:59Z", after: "%s") {
+                     nodes {
+                       id
+                       name
+                       tagline
+                       description
+                       votesCount
+                       createdAt
+                       featuredAt
+                       website
+                       url
+                     }
+                     pageInfo {
+                       hasNextPage
+                       endCursor
+                     }
+                   }
+                 }
+        """;
+
+    private String getAccessToken() {
+        OauthRequest oauthRequest = new OauthRequest();
+        oauthRequest.setClientId(productHuntConfig.getClientId());
+        oauthRequest.setClientSecret(productHuntConfig.getClientSecret());
+        OauthResponse oauthToken = productHuntFeign.getOauthToken(oauthRequest);
+        return oauthToken.getAccessToken();
+    }
+
+    @Override
+    public List<PostNode> getTop30Posts() {
+        // 获取查询的日期范围
+        LocalDate today = LocalDate.now();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        String dateStr = sdf.format(today);
+
+        // 构造GraphQl客户端
+        String accessToken = getAccessToken();
+        String bearerToken = String.format("Bearer %s", accessToken);
+        GraphQlClient graphQlClient = HttpSyncGraphQlClient.builder().url(productHuntConfig.getGraphqlUrl())
+                .header("Authorization", bearerToken).build();
+
+        // 查询
+        List<PostNode> posts = new ArrayList<>();
+        boolean hasNextPage = true;
+        String endCursor = "";
+        while (hasNextPage) {
+            // 设置查询模板并发起查询,好像无法直接一次性查询指定数量,只能分页查询并且要自己控制所需数量
+            String queryDocument = String.format(queryTemplate, dateStr, dateStr, endCursor);
+            PostResponse postResponse =
+                    graphQlClient.document(queryDocument).retrieveSync("posts").toEntity(PostResponse.class);
+            // 把获取到的帖子信息放入容器
+            if (!CollectionUtils.isEmpty(postResponse.getNodes())) {
+                posts.addAll(postResponse.getNodes());
+            }
+            // 帖子数量大于30则退出
+            if (posts.size() > 30) {
+                break;
+            }
+            // 没有下一页了则跳出循环
+            if (!postResponse.getPageInfo().getHasNextPage()) {
+                break;
+            }
+            hasNextPage = postResponse.getPageInfo().getHasNextPage();
+        }
+        return posts.subList(0, 30);
+    }
+}

+ 0 - 5
product-hunt/src/main/resources/application-dev.yaml

@@ -10,11 +10,6 @@ spring:
         options:
         options:
           model: deepseek-ai/DeepSeek-V3
           model: deepseek-ai/DeepSeek-V3
 
 
-logging:
-  level:
-    com.producthunt.server: debug
-    org.springframework.ai.chat.client.advisor=DEBUG:
-
 # Product Hunt平台配置
 # Product Hunt平台配置
 product-hunt:
 product-hunt:
   client-id: ENC(ANqnssfEBJfIYM2s2D4ZHw1kwndMGp1zxxz3/c1VrsoiwauH5SQq/dB9NObC1AnnI19/AodFB8/bEja1xf+zXw==)
   client-id: ENC(ANqnssfEBJfIYM2s2D4ZHw1kwndMGp1zxxz3/c1VrsoiwauH5SQq/dB9NObC1AnnI19/AodFB8/bEja1xf+zXw==)

+ 0 - 4
product-hunt/src/main/resources/application-prod.yaml

@@ -11,10 +11,6 @@ spring:
         options:
         options:
           model: deepseek-ai/DeepSeek-V3
           model: deepseek-ai/DeepSeek-V3
 
 
-logging:
-  level:
-    com.producthunt.server: info
-
 # Product Hunt平台配置
 # Product Hunt平台配置
 product-hunt:
 product-hunt:
   client-id: ENC(uiT7ZiWWHooEYfs42QqDWMxwMgE18uEaE7PMVB2/AYURrn//Jd54BO6Q1a/J6mGFdrQwiO02X0YZeobglUXW2A==)
   client-id: ENC(uiT7ZiWWHooEYfs42QqDWMxwMgE18uEaE7PMVB2/AYURrn//Jd54BO6Q1a/J6mGFdrQwiO02X0YZeobglUXW2A==)