Bläddra i källkod

删除无用模块

reghao 1 månad sedan
förälder
incheckning
44ee26e714
100 ändrade filer med 0 tillägg och 5469 borttagningar
  1. 0 21
      eureka/eureka-api/pom.xml
  2. 0 18
      eureka/eureka-api/src/main/java/cn/reghao/tnb/eureka/api/dto/EurekaInstance.java
  3. 0 13
      eureka/eureka-api/src/main/java/cn/reghao/tnb/eureka/api/iface/EurekaService.java
  4. 0 7
      eureka/eureka-server/Dockerfile
  5. 0 91
      eureka/eureka-server/pom.xml
  6. 0 17
      eureka/eureka-server/src/main/java/cn/reghao/tnb/eureka/server/EurekaServer.java
  7. 0 25
      eureka/eureka-server/src/main/java/cn/reghao/tnb/eureka/server/config/SpringLifecycle.java
  8. 0 0
      eureka/eureka-server/src/main/resources/application-dev.yml
  9. 0 0
      eureka/eureka-server/src/main/resources/application-test.yml
  10. 0 17
      eureka/eureka-server/src/main/resources/application.yml
  11. 0 68
      eureka/eureka-server/src/main/resources/logback-spring.xml
  12. 0 24
      eureka/pom.xml
  13. 0 25
      oauth2/oauth2-auth/pom.xml
  14. 0 11
      oauth2/oauth2-auth/src/main/java/cn/reghao/tnb/oauth2/auth/OAuth2AuthApplication.java
  15. 0 150
      oauth2/oauth2-auth/src/main/java/cn/reghao/tnb/oauth2/auth/config/SecurityConfig.java
  16. 0 32
      oauth2/oauth2-auth/src/main/resources/application.yml
  17. 0 25
      oauth2/oauth2-client/pom.xml
  18. 0 11
      oauth2/oauth2-client/src/main/java/cn/reghao/tnb/oauth2/client/OAuth2ClientApplication.java
  19. 0 24
      oauth2/oauth2-client/src/main/java/cn/reghao/tnb/oauth2/client/config/SecurityConfig.java
  20. 0 14
      oauth2/oauth2-client/src/main/resources/application.yml
  21. 0 25
      oauth2/oauth2-resource/pom.xml
  22. 0 11
      oauth2/oauth2-resource/src/main/java/cn/reghao/tnb/oauth2/resource/OAuth2ResourceApplication.java
  23. 0 14
      oauth2/oauth2-resource/src/main/resources/application.yml
  24. 0 24
      oauth2/pom.xml
  25. 0 3
      pom.xml
  26. 0 331
      sb/pom.xml
  27. 0 22
      sb/src/main/java/cn/reghao/tnb/sb/SpringBootApp.java
  28. 0 247
      sb/src/main/java/cn/reghao/tnb/sb/aliyun/AliyunCertificate.java
  29. 0 91
      sb/src/main/java/cn/reghao/tnb/sb/aliyun/AliyunDns.java
  30. 0 13
      sb/src/main/java/cn/reghao/tnb/sb/aliyun/model/AliyunCert.java
  31. 0 16
      sb/src/main/java/cn/reghao/tnb/sb/aliyun/model/AliyunKey.java
  32. 0 399
      sb/src/main/java/cn/reghao/tnb/sb/bayes/email/SpamBayes.java
  33. 0 262
      sb/src/main/java/cn/reghao/tnb/sb/bayes/email/SpamEvaluation.java
  34. 0 8
      sb/src/main/java/cn/reghao/tnb/sb/bayes/email/SpamJointProbability.java
  35. 0 38
      sb/src/main/java/cn/reghao/tnb/sb/bayes/email/SpamMain.java
  36. 0 110
      sb/src/main/java/cn/reghao/tnb/sb/bayes/email/SpamTest.java
  37. 0 90
      sb/src/main/java/cn/reghao/tnb/sb/bayes/email/SpamTrain.java
  38. 0 63
      sb/src/main/java/cn/reghao/tnb/sb/bayes/email/TextProcessor.java
  39. 0 67
      sb/src/main/java/cn/reghao/tnb/sb/bayes/income/Bayes.java
  40. 0 55
      sb/src/main/java/cn/reghao/tnb/sb/bayes/income/BayesMain.java
  41. 0 297
      sb/src/main/java/cn/reghao/tnb/sb/bayes/income/DataConverter.java
  42. 0 47
      sb/src/main/java/cn/reghao/tnb/sb/bayes/income/DecimalCalculator.java
  43. 0 21
      sb/src/main/java/cn/reghao/tnb/sb/config/CustomHealthIndicator.java
  44. 0 55
      sb/src/main/java/cn/reghao/tnb/sb/config/MyEndpoint.java
  45. 0 40
      sb/src/main/java/cn/reghao/tnb/sb/config/SpringLifecycle.java
  46. 0 59
      sb/src/main/java/cn/reghao/tnb/sb/config/WebConfig.java
  47. 0 21
      sb/src/main/java/cn/reghao/tnb/sb/config/jmx/SystemInfo.java
  48. 0 11
      sb/src/main/java/cn/reghao/tnb/sb/config/jmx/SystemInfoMBean.java
  49. 0 101
      sb/src/main/java/cn/reghao/tnb/sb/controller/IndexController.java
  50. 0 94
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/AutoBatis.java
  51. 0 46
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/StringUtil.java
  52. 0 16
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/MapperScan.java
  53. 0 16
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/PojoScan.java
  54. 0 19
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/field/Char.java
  55. 0 17
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/field/Datetime.java
  56. 0 18
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/field/Mediumint.java
  57. 0 18
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/field/Mediumtext.java
  58. 0 17
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/field/TimeStamp.java
  59. 0 17
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/field/Unique.java
  60. 0 17
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/field/Unsigned.java
  61. 0 19
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/field/Varchar.java
  62. 0 163
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/MapperManager.java
  63. 0 107
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/XmlGenerator.java
  64. 0 16
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/crud/DeleteGenerator.java
  65. 0 114
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/crud/InsertGenerator.java
  66. 0 16
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/crud/SelectGenerator.java
  67. 0 16
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/crud/UpdateGenerator.java
  68. 0 20
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/element/BaseElement.java
  69. 0 9
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/element/ContentGenerator.java
  70. 0 11
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/element/ElementName.java
  71. 0 18
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/element/InsertElement.java
  72. 0 22
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/element/MyBatisMapper.java
  73. 0 13
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/table/FieldType.java
  74. 0 74
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/table/SqlGenerator.java
  75. 0 43
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/table/Table.java
  76. 0 41
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/table/TableField.java
  77. 0 156
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/table/TableManager.java
  78. 0 25
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/table/ddl/DdlMapper.java
  79. 0 36
      sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/table/ddl/DdlProvider.java
  80. 0 31
      sb/src/main/java/cn/reghao/tnb/sb/db/hibernate/HibernateDemo.java
  81. 0 37
      sb/src/main/java/cn/reghao/tnb/sb/db/hibernate/User.java
  82. 0 164
      sb/src/main/java/cn/reghao/tnb/sb/db/mongo/MongoClientUtil.java
  83. 0 109
      sb/src/main/java/cn/reghao/tnb/sb/db/mongo/MongoDbClient.java
  84. 0 30
      sb/src/main/java/cn/reghao/tnb/sb/db/mongo/model/UserComment.java
  85. 0 181
      sb/src/main/java/cn/reghao/tnb/sb/db/mybatis/JdbcDemo.java
  86. 0 19
      sb/src/main/java/cn/reghao/tnb/sb/db/mybatis/MyBatisConfig.java
  87. 0 71
      sb/src/main/java/cn/reghao/tnb/sb/db/mybatis/MybatisDemo.java
  88. 0 24
      sb/src/main/java/cn/reghao/tnb/sb/db/mybatis/test/BaseObject.java
  89. 0 19
      sb/src/main/java/cn/reghao/tnb/sb/db/mybatis/test/config/MyBatisConfig.java
  90. 0 32
      sb/src/main/java/cn/reghao/tnb/sb/db/mybatis/test/jdbc/JdbcTest.java
  91. 0 16
      sb/src/main/java/cn/reghao/tnb/sb/db/mybatis/test/mapper/UserInfoMapper.java
  92. 0 42
      sb/src/main/java/cn/reghao/tnb/sb/db/mybatis/test/model/UserInfo.java
  93. 0 79
      sb/src/main/java/cn/reghao/tnb/sb/db/mysql/MyClient.java
  94. 0 84
      sb/src/main/java/cn/reghao/tnb/sb/db/mysql/PageListInterceptor.java
  95. 0 14
      sb/src/main/java/cn/reghao/tnb/sb/db/mysql/mapper/UserProfileMapper.java
  96. 0 15
      sb/src/main/java/cn/reghao/tnb/sb/db/mysql/model/UserProfile.java
  97. 0 38
      sb/src/main/java/cn/reghao/tnb/sb/db/rabbit/Recv.java
  98. 0 35
      sb/src/main/java/cn/reghao/tnb/sb/db/rabbit/Send.java
  99. 0 52
      sb/src/main/java/cn/reghao/tnb/sb/db/redis/ObjectSerializeCodec.java
  100. 0 29
      sb/src/main/java/cn/reghao/tnb/sb/db/redis/RedisConfig.java

+ 0 - 21
eureka/eureka-api/pom.xml

@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>eureka</artifactId>
-        <groupId>cn.reghao.tnb</groupId>
-        <version>1.0.0</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <groupId>cn.reghao.tnb.eureka</groupId>
-    <artifactId>eureka-api</artifactId>
-    <version>1.0.0-SNAPSHOT</version>
-
-    <properties>
-        <maven.compiler.source>21</maven.compiler.source>
-        <maven.compiler.target>21</maven.compiler.target>
-    </properties>
-
-</project>

+ 0 - 18
eureka/eureka-api/src/main/java/cn/reghao/tnb/eureka/api/dto/EurekaInstance.java

@@ -1,18 +0,0 @@
-package cn.reghao.tnb.eureka.api.dto;
-
-import lombok.Getter;
-import lombok.Setter;
-
-import java.io.Serializable;
-
-/**
- * @author reghao
- * @date 2025-04-24 15:11:49
- */
-@Setter
-@Getter
-public class EurekaInstance implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private String name;
-}

+ 0 - 13
eureka/eureka-api/src/main/java/cn/reghao/tnb/eureka/api/iface/EurekaService.java

@@ -1,13 +0,0 @@
-package cn.reghao.tnb.eureka.api.iface;
-
-import cn.reghao.tnb.eureka.api.dto.EurekaInstance;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2025-04-24 15:11:33
- */
-public interface EurekaService {
-    List<EurekaInstance> getRegistryServices();
-}

+ 0 - 7
eureka/eureka-server/Dockerfile

@@ -1,7 +0,0 @@
-FROM registry.cn-chengdu.aliyuncs.com/reghao/amazoncorretto:17.0.16-alpine3.22
-
-WORKDIR /app
-RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
-COPY target/tnb-eureka.jar /app/tnb-eureka.jar
-
-ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/tnb-eureka.jar"]

+ 0 - 91
eureka/eureka-server/pom.xml

@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>eureka</artifactId>
-        <groupId>cn.reghao.tnb</groupId>
-        <version>1.0.0</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <groupId>cn.reghao.tnb.eureka</groupId>
-    <artifactId>eureka-server</artifactId>
-
-    <properties>
-        <maven.compiler.source>21</maven.compiler.source>
-        <maven.compiler.target>21</maven.compiler.target>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>cn.reghao.tnb.eureka</groupId>
-            <artifactId>eureka-api</artifactId>
-            <version>1.0.0-SNAPSHOT</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
-        </dependency>
-    </dependencies>
-
-    <profiles>
-        <profile>
-            <id>dev</id>
-            <properties>
-                <profile.active>dev</profile.active>
-            </properties>
-            <activation>
-                <activeByDefault>true</activeByDefault>
-            </activation>
-        </profile>
-        <profile>
-            <id>test</id>
-            <properties>
-                <profile.active>test</profile.active>
-            </properties>
-        </profile>
-    </profiles>
-
-    <build>
-        <finalName>tnb-eureka</finalName>
-        <resources>
-            <resource>
-                <directory>src/main/resources</directory>
-                <filtering>true</filtering>
-                <includes>
-                    <include>application.yml</include>
-                    <include>application-${profile.active}.yml</include>
-                    <include>logback-spring.xml</include>
-                    <include>mapper/**</include>
-                </includes>
-            </resource>
-        </resources>
-
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.13.0</version>
-                <configuration>
-                    <compilerArgs>
-                        <arg>-parameters</arg>
-                    </compilerArgs>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-                <version>${springboot.version}</version>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>repackage</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-</project>

+ 0 - 17
eureka/eureka-server/src/main/java/cn/reghao/tnb/eureka/server/EurekaServer.java

@@ -1,17 +0,0 @@
-package cn.reghao.tnb.eureka.server;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
-
-/**
- * @author reghao
- * @date 2021-11-01 18:59:39
- */
-@SpringBootApplication
-@EnableEurekaServer
-public class EurekaServer {
-    public static void main(String[] args) {
-        SpringApplication.run(EurekaServer.class, args);
-    }
-}

+ 0 - 25
eureka/eureka-server/src/main/java/cn/reghao/tnb/eureka/server/config/SpringLifecycle.java

@@ -1,25 +0,0 @@
-package cn.reghao.tnb.eureka.server.config;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.DisposableBean;
-import org.springframework.boot.ApplicationArguments;
-import org.springframework.boot.ApplicationRunner;
-import org.springframework.stereotype.Component;
-
-/**
- * @author reghao
- * @date 2022-03-23 09:22:01
- */
-@Slf4j
-@Component
-public class SpringLifecycle implements ApplicationRunner, DisposableBean {
-    @Override
-    public void run(ApplicationArguments args) throws Exception {
-        log.info("EurekaServer 启动...");
-    }
-
-    @Override
-    public void destroy() {
-        log.info("EurekaServer 停止...");
-    }
-}

+ 0 - 0
eureka/eureka-server/src/main/resources/application-dev.yml


+ 0 - 0
eureka/eureka-server/src/main/resources/application-test.yml


+ 0 - 17
eureka/eureka-server/src/main/resources/application.yml

@@ -1,17 +0,0 @@
-server:
-  port: 6060
-spring:
-  application:
-    name: eureka-server
-  profiles:
-    active: @profile.active@
-eureka:
-  instance:
-    prefer-ip-address: true
-  client:
-    register-with-eureka: false
-    fetch-registry: false
-    service-url:
-      defaultZone: http://127.0.0.1:${server.port}/eureka
-  server:
-    enable-self-preservation: false

+ 0 - 68
eureka/eureka-server/src/main/resources/logback-spring.xml

@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<configuration>
-    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>
-                %d{HH:mm:ss.SSS} [%thread] %-5level %c %M %L - %msg%n
-            </pattern>
-        </layout>
-    </appender>
-
-    <!-- info 日志文件 -->
-    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>ERROR</level>
-            <onMatch>DENY</onMatch>
-            <onMismatch>ACCEPT</onMismatch>
-        </filter>
-        <encoder>
-            <pattern>
-                %d{HH:mm:ss.SSS} %-5level %c %M %L - %msg%n
-            </pattern>
-            <charset>UTF-8</charset>
-        </encoder>
-        <!-- 滚动策略 -->
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>
-                logs/eureka-info.%d.log
-            </fileNamePattern>
-        </rollingPolicy>
-    </appender>
-
-    <!-- error 日志文件 -->
-    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
-            <level>ERROR</level>
-        </filter>
-        <encoder>
-            <pattern>
-                %d{HH:mm:ss.SSS} %-5level %c %M %L - %msg%n
-            </pattern>
-            <charset>UTF-8</charset>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>
-                logs/eureka-error.%d.log
-            </fileNamePattern>
-        </rollingPolicy>
-    </appender>
-
-    <springProfile name="dev">
-        <root level="info">
-            <appender-ref ref="consoleLog"></appender-ref>
-        </root>
-    </springProfile>
-    <springProfile name="test">
-        <root level="info">
-            <appender-ref ref="fileInfoLog"></appender-ref>
-            <appender-ref ref="fileErrorLog"></appender-ref>
-        </root>
-    </springProfile>
-    <springProfile name="prod">
-        <root level="info">
-            <appender-ref ref="fileInfoLog"></appender-ref>
-            <appender-ref ref="fileErrorLog"></appender-ref>
-        </root>
-    </springProfile>
-</configuration>

+ 0 - 24
eureka/pom.xml

@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>tnb</artifactId>
-        <groupId>cn.reghao.tnb</groupId>
-        <version>1.0.0</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>eureka</artifactId>
-    <packaging>pom</packaging>
-    <modules>
-        <module>eureka-api</module>
-        <module>eureka-server</module>
-    </modules>
-
-    <properties>
-        <maven.compiler.source>21</maven.compiler.source>
-        <maven.compiler.target>21</maven.compiler.target>
-    </properties>
-
-</project>

+ 0 - 25
oauth2/oauth2-auth/pom.xml

@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>oauth2</artifactId>
-        <groupId>cn.reghao.tnb</groupId>
-        <version>1.0.0</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>oauth2-auth</artifactId>
-
-    <properties>
-        <maven.compiler.source>21</maven.compiler.source>
-        <maven.compiler.target>21</maven.compiler.target>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-oauth2-authorization-server</artifactId>
-        </dependency>
-    </dependencies>
-</project>

+ 0 - 11
oauth2/oauth2-auth/src/main/java/cn/reghao/tnb/oauth2/auth/OAuth2AuthApplication.java

@@ -1,11 +0,0 @@
-package cn.reghao.tnb.oauth2.auth;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class OAuth2AuthApplication {
-    public static void main(String[] args) {
-        SpringApplication.run(OAuth2AuthApplication.class, args);
-    }
-}

+ 0 - 150
oauth2/oauth2-auth/src/main/java/cn/reghao/tnb/oauth2/auth/config/SecurityConfig.java

@@ -1,150 +0,0 @@
-package cn.reghao.tnb.oauth2.auth.config;
-
-import com.nimbusds.jose.jwk.JWKSet;
-import com.nimbusds.jose.jwk.RSAKey;
-import com.nimbusds.jose.jwk.source.ImmutableJWKSet;
-import com.nimbusds.jose.jwk.source.JWKSource;
-import com.nimbusds.jose.proc.SecurityContext;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.annotation.Order;
-import org.springframework.http.MediaType;
-import org.springframework.security.config.Customizer;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import org.springframework.security.core.userdetails.User;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.oauth2.core.AuthorizationGrantType;
-import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
-import org.springframework.security.oauth2.core.oidc.OidcScopes;
-import org.springframework.security.oauth2.jwt.JwtDecoder;
-import org.springframework.security.oauth2.server.authorization.client.InMemoryRegisteredClientRepository;
-import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
-import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
-import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
-import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer;
-import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
-import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
-import org.springframework.security.provisioning.InMemoryUserDetailsManager;
-import org.springframework.security.web.SecurityFilterChain;
-import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
-import org.springframework.security.web.util.matcher.MediaTypeRequestMatcher;
-
-import java.security.KeyPair;
-import java.security.KeyPairGenerator;
-import java.security.interfaces.RSAPrivateKey;
-import java.security.interfaces.RSAPublicKey;
-import java.util.UUID;
-
-/**
- * @author reghao
- * @date 2025-11-11 14:09:34
- */
-@Configuration
-@EnableWebSecurity
-public class SecurityConfig {
-
-    @Bean
-    @Order(1)
-    public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http)
-            throws Exception {
-        OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
-        http.getConfigurer(OAuth2AuthorizationServerConfigurer.class)
-                .oidc(Customizer.withDefaults());	// Enable OpenID Connect 1.0
-        http
-                // Redirect to the login page when not authenticated from the
-                // authorization endpoint
-                .exceptionHandling((exceptions) -> exceptions
-                        .defaultAuthenticationEntryPointFor(
-                                new LoginUrlAuthenticationEntryPoint("/login"),
-                                new MediaTypeRequestMatcher(MediaType.TEXT_HTML)
-                        )
-                )
-                // Accept access tokens for User Info and/or Client Registration
-                .oauth2ResourceServer((resourceServer) -> resourceServer
-                        .jwt(Customizer.withDefaults()));
-
-        return http.build();
-    }
-
-    @Bean
-    @Order(2)
-    public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http)
-            throws Exception {
-        http
-                .authorizeHttpRequests((authorize) -> authorize
-                        .anyRequest().authenticated()
-                )
-                // Form login handles the redirect to the login page from the
-                // authorization server filter chain
-                .formLogin(Customizer.withDefaults());
-
-        return http.build();
-    }
-
-    @Bean
-    public UserDetailsService userDetailsService() {
-        UserDetails userDetails = User.withDefaultPasswordEncoder()
-                .username("user")
-                .password("password")
-                .roles("USER")
-                .build();
-
-        return new InMemoryUserDetailsManager(userDetails);
-    }
-
-    @Bean
-    public RegisteredClientRepository registeredClientRepository() {
-        RegisteredClient oidcClient = RegisteredClient.withId(UUID.randomUUID().toString())
-                .clientId("oidc-client")
-                .clientSecret("{noop}secret")
-                .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC)
-                .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
-                .authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)
-                .redirectUri("http://127.0.0.1:8080/login/oauth2/code/oidc-client")
-                .postLogoutRedirectUri("http://127.0.0.1:8080/")
-                .scope(OidcScopes.OPENID)
-                .scope(OidcScopes.PROFILE)
-                .clientSettings(ClientSettings.builder().requireAuthorizationConsent(true).build())
-                .build();
-
-        return new InMemoryRegisteredClientRepository(oidcClient);
-    }
-
-    @Bean
-    public JWKSource<SecurityContext> jwkSource() {
-        KeyPair keyPair = generateRsaKey();
-        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
-        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
-        RSAKey rsaKey = new RSAKey.Builder(publicKey)
-                .privateKey(privateKey)
-                .keyID(UUID.randomUUID().toString())
-                .build();
-        JWKSet jwkSet = new JWKSet(rsaKey);
-        return new ImmutableJWKSet<>(jwkSet);
-    }
-
-    private static KeyPair generateRsaKey() {
-        KeyPair keyPair;
-        try {
-            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
-            keyPairGenerator.initialize(2048);
-            keyPair = keyPairGenerator.generateKeyPair();
-        }
-        catch (Exception ex) {
-            throw new IllegalStateException(ex);
-        }
-        return keyPair;
-    }
-
-    @Bean
-    public JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
-        return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);
-    }
-
-    @Bean
-    public AuthorizationServerSettings authorizationServerSettings() {
-        return AuthorizationServerSettings.builder().build();
-    }
-}

+ 0 - 32
oauth2/oauth2-auth/src/main/resources/application.yml

@@ -1,32 +0,0 @@
-server:
-  port: 9000
-
-logging:
-  level:
-    org.springframework.security: trace
-
-spring:
-  security:
-    user:
-      name: user
-      password: password
-    oauth2:
-      authorizationserver:
-        client:
-          oidc-client:
-            registration:
-              client-id: "oidc-client"
-              client-secret: "{noop}secret"
-              client-authentication-methods:
-                - "client_secret_basic"
-              authorization-grant-types:
-                - "authorization_code"
-                - "refresh_token"
-              redirect-uris:
-                - "http://127.0.0.1:8080/login/oauth2/code/oidc-client"
-              post-logout-redirect-uris:
-                - "http://127.0.0.1:8080/"
-              scopes:
-                - "openid"
-                - "profile"
-            require-authorization-consent: true

+ 0 - 25
oauth2/oauth2-client/pom.xml

@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>oauth2</artifactId>
-        <groupId>cn.reghao.tnb</groupId>
-        <version>1.0.0</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>oauth2-client</artifactId>
-
-    <properties>
-        <maven.compiler.source>21</maven.compiler.source>
-        <maven.compiler.target>21</maven.compiler.target>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-oauth2-client</artifactId>
-        </dependency>
-    </dependencies>
-</project>

+ 0 - 11
oauth2/oauth2-client/src/main/java/cn/reghao/tnb/oauth2/client/OAuth2ClientApplication.java

@@ -1,11 +0,0 @@
-package cn.reghao.tnb.oauth2.client;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class OAuth2ClientApplication {
-    public static void main(String[] args) {
-        SpringApplication.run(OAuth2ClientApplication.class, args);
-    }
-}

+ 0 - 24
oauth2/oauth2-client/src/main/java/cn/reghao/tnb/oauth2/client/config/SecurityConfig.java

@@ -1,24 +0,0 @@
-package cn.reghao.tnb.oauth2.client.config;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.config.Customizer;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import org.springframework.security.web.SecurityFilterChain;
-
-/**
- * @author reghao
- * @date 2025-11-13 16:27:27
- */
-@Configuration
-@EnableWebSecurity
-public class SecurityConfig {
-    @Bean
-    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
-        http
-                // ...
-                .oauth2Client(Customizer.withDefaults());
-        return http.build();
-    }
-}

+ 0 - 14
oauth2/oauth2-client/src/main/resources/application.yml

@@ -1,14 +0,0 @@
-spring:
-  security:
-    oauth2:
-      client:
-        registration:
-          my-oauth2-client:
-            provider: my-auth-server
-            client-id: my-client-id
-            client-secret: my-client-secret
-            authorization-grant-type: authorization_code
-            scope: message.read,message.write
-        provider:
-          my-auth-server:
-            issuer-uri: https://my-auth-server.com

+ 0 - 25
oauth2/oauth2-resource/pom.xml

@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>oauth2</artifactId>
-        <groupId>cn.reghao.tnb</groupId>
-        <version>1.0.0</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>oauth2-resource</artifactId>
-
-    <properties>
-        <maven.compiler.source>21</maven.compiler.source>
-        <maven.compiler.target>21</maven.compiler.target>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
-        </dependency>
-    </dependencies>
-</project>

+ 0 - 11
oauth2/oauth2-resource/src/main/java/cn/reghao/tnb/oauth2/resource/OAuth2ResourceApplication.java

@@ -1,11 +0,0 @@
-package cn.reghao.tnb.oauth2.resource;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class OAuth2ResourceApplication {
-    public static void main(String[] args) {
-        SpringApplication.run(OAuth2ResourceApplication.class, args);
-    }
-}

+ 0 - 14
oauth2/oauth2-resource/src/main/resources/application.yml

@@ -1,14 +0,0 @@
-spring:
-  security:
-    oauth2:
-      client:
-        registration:
-          my-oauth2-client:
-            provider: my-auth-server
-            client-id: my-client-id
-            client-secret: my-client-secret
-            authorization-grant-type: authorization_code
-            scope: message.read,message.write
-        provider:
-          my-auth-server:
-            issuer-uri: https://my-auth-server.com

+ 0 - 24
oauth2/pom.xml

@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>tnb</artifactId>
-        <groupId>cn.reghao.tnb</groupId>
-        <version>1.0.0</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>oauth2</artifactId>
-    <packaging>pom</packaging>
-    <modules>
-        <module>oauth2-auth</module>
-        <module>oauth2-resource</module>
-        <module>oauth2-client</module>
-    </modules>
-
-    <properties>
-        <maven.compiler.source>21</maven.compiler.source>
-        <maven.compiler.target>21</maven.compiler.target>
-    </properties>
-
-</project>

+ 0 - 3
pom.xml

@@ -18,11 +18,8 @@
         <module>file</module>
         <module>user</module>
         <module>data</module>
-        <module>eureka</module>
         <module>search</module>
         <module>oss</module>
-        <module>sb</module>
-        <module>oauth2</module>
         <module>admin</module>
     </modules>
 

+ 0 - 331
sb/pom.xml

@@ -1,331 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>tnb</artifactId>
-        <groupId>cn.reghao.tnb</groupId>
-        <version>1.0.0</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>sb</artifactId>
-
-    <properties>
-        <maven.compiler.source>21</maven.compiler.source>
-        <maven.compiler.target>21</maven.compiler.target>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>cn.reghao.tnb.account</groupId>
-            <artifactId>account-api</artifactId>
-            <version>1.0.0-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>cn.reghao.tnb.content</groupId>
-            <artifactId>content-api</artifactId>
-            <version>1.0.0-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>cn.reghao.tnb.data</groupId>
-            <artifactId>data-api</artifactId>
-            <version>1.0.0-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>cn.reghao.tnb.user</groupId>
-            <artifactId>user-api</artifactId>
-            <version>1.0.0-SNAPSHOT</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-configuration-processor</artifactId>
-            <optional>true</optional>
-        </dependency>
-        <!--<dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-security</artifactId>
-        </dependency>-->
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-freemarker</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.xhtmlrenderer</groupId>
-            <artifactId>flying-saucer-pdf-itext5</artifactId>
-            <version>9.1.22</version>
-        </dependency>
-
-        <!-- 数据库和中间件 -->
-        <dependency>
-            <groupId>mysql</groupId>
-            <artifactId>mysql-connector-java</artifactId>
-            <version>8.0.17</version>
-        </dependency>
-        <dependency>
-            <groupId>com.zaxxer</groupId>
-            <artifactId>HikariCP</artifactId>
-            <version>3.3.1</version>
-        </dependency>
-        <!--<dependency>
-            <groupId>org.mybatis</groupId>
-            <artifactId>mybatis</artifactId>
-            <version>3.4.6</version>
-        </dependency>-->
-        <dependency>
-            <groupId>org.mybatis.spring.boot</groupId>
-            <artifactId>mybatis-spring-boot-starter</artifactId>
-            <version>1.3.2</version>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-jpa</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.xerial</groupId>
-            <artifactId>sqlite-jdbc</artifactId>
-            <version>3.34.0</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.derby</groupId>
-            <artifactId>derby</artifactId>
-            <version>10.16.1.1</version>
-            <scope>runtime</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.derby</groupId>
-            <artifactId>derbytools</artifactId>
-            <version>10.16.1.1</version>
-        </dependency>
-
-        <!--<dependency>
-            <groupId>io.lettuce</groupId>
-            <artifactId>lettuce-core</artifactId>
-            <version>6.1.10.RELEASE</version>
-        </dependency>-->
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-redis</artifactId>
-        </dependency>
-
-        <!--<dependency>
-            <groupId>org.mongodb</groupId>
-            <artifactId>mongodb-driver-sync</artifactId>
-            <version>4.4.2</version>
-        </dependency>-->
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-mongodb</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.rabbitmq</groupId>
-            <artifactId>amqp-client</artifactId>
-            <version>5.13.1</version>
-        </dependency>
-
-        <!-- 阿里云依赖 -->
-        <dependency>
-            <groupId>com.aliyun</groupId>
-            <artifactId>sts20150401</artifactId>
-            <version>1.1.4</version>
-        </dependency>
-        <dependency>
-            <groupId>com.aliyun</groupId>
-            <artifactId>alibabacloud-cas20200407</artifactId>
-            <version>3.0.0</version>
-        </dependency>
-        <dependency>
-            <groupId>com.aliyun</groupId>
-            <artifactId>alibabacloud-alidns20150109</artifactId>
-            <version>3.0.24</version>
-        </dependency>
-
-        <!-- kvm 依赖 -->
-        <dependency>
-            <groupId>net.java.dev.jna</groupId>
-            <artifactId>jna</artifactId>
-            <version>5.12.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.libvirt</groupId>
-            <artifactId>libvirt</artifactId>
-            <version>0.5.1</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.dom4j</groupId>
-            <artifactId>dom4j</artifactId>
-            <version>2.1.1</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-actuator</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.micrometer</groupId>
-            <artifactId>micrometer-registry-prometheus</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.huaban</groupId>
-            <artifactId>jieba-analysis</artifactId>
-            <version>1.0.2</version>
-        </dependency>
-        <dependency>
-            <groupId>org.jfree</groupId>
-            <artifactId>jfreechart</artifactId>
-            <version>1.0.19</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.curator</groupId>
-            <artifactId>curator-recipes</artifactId>
-            <version>5.1.0</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.apache.zookeeper</groupId>
-                    <artifactId>zookeeper</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.zookeeper</groupId>
-            <artifactId>zookeeper</artifactId>
-            <version>3.7.2</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-log4j12</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi</artifactId>
-            <version>3.17</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi-ooxml</artifactId>
-            <version>3.17</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi-ooxml-schemas</artifactId>
-            <version>3.17</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.tomcat</groupId>
-            <artifactId>tomcat-tribes</artifactId>
-            <version>9.0.43</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.tomcat</groupId>
-            <artifactId>tomcat-catalina-ha</artifactId>
-            <version>9.0.43</version>
-        </dependency>
-
-        <!-- AES 加密依赖 -->
-        <dependency>
-            <groupId>org.lz4</groupId>
-            <artifactId>lz4-java</artifactId>
-            <version>1.8.0</version>
-        </dependency>
-    </dependencies>
-
-    <profiles>
-        <profile>
-            <id>dev</id>
-            <properties>
-                <profile.active>dev</profile.active>
-            </properties>
-            <activation>
-                <activeByDefault>true</activeByDefault>
-            </activation>
-        </profile>
-        <profile>
-            <id>test</id>
-            <properties>
-                <profile.active>test</profile.active>
-            </properties>
-        </profile>
-    </profiles>
-
-    <build>
-        <finalName>springboot</finalName>
-        <resources>
-            <resource>
-                <directory>src/main/resources</directory>
-                <filtering>true</filtering>
-                <includes>
-                    <include>application.yml</include>
-                    <include>application-${profile.active}.yml</include>
-                    <include>**.properties</include>
-                    <include>**.xml</include>
-                    <include>**.lua</include>
-                    <include>mapper/**</include>
-                    <include>logback-spring.xml</include>
-                    <!-- 前端静态资源 -->
-                    <include>static/**</include>
-                    <include>templates/**</include>
-                    <include>fonts/**</include>
-                </includes>
-            </resource>
-        </resources>
-
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.8.1</version>
-                <configuration>
-                    <source>11</source>
-                    <target>11</target>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-resources-plugin</artifactId>
-                <version>2.4.3</version>
-                <configuration>
-                    <!-- 让 maven 不处理字体 -->
-                    <nonFilteredFileExtensions>
-                        <nonFilteredFileExtension>ttf</nonFilteredFileExtension>
-                        <nonFilteredFileExtension>woff</nonFilteredFileExtension>
-                        <nonFilteredFileExtension>woff2</nonFilteredFileExtension>
-                        <nonFilteredFileExtension>fbx</nonFilteredFileExtension>
-                    </nonFilteredFileExtensions>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-                <version>2.6.15</version>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>repackage</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-</project>

+ 0 - 22
sb/src/main/java/cn/reghao/tnb/sb/SpringBootApp.java

@@ -1,22 +0,0 @@
-package cn.reghao.tnb.sb;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.FilterType;
-
-/**
- * @author reghao
- * @date 2021-11-01 18:59:39
- */
-@SpringBootApplication
-@ComponentScan(basePackages = {"cn.reghao.tnb.sb"}
-        ,excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = {
-                "cn.reghao.tnb.sb.multi.mybatis.*", "cn.reghao.tnb.sb.zk.*"
-        })
-)
-public class SpringBootApp {
-    public static void main(String[] args) {
-        SpringApplication.run(SpringBootApp.class, args);
-    }
-}

+ 0 - 247
sb/src/main/java/cn/reghao/tnb/sb/aliyun/AliyunCertificate.java

@@ -1,247 +0,0 @@
-package cn.reghao.tnb.sb.aliyun;
-
-import ch.qos.logback.classic.Level;
-import ch.qos.logback.classic.Logger;
-import ch.qos.logback.classic.LoggerContext;
-import cn.reghao.jutil.jdk.converter.DateTimeConverter;
-import cn.reghao.jutil.jdk.security.RsaCryptor;
-import cn.reghao.jutil.jdk.serializer.JsonConverter;
-import cn.reghao.jutil.jdk.shell.ShellExecutor;
-import cn.reghao.jutil.jdk.shell.ShellResult;
-import cn.reghao.jutil.jdk.thread.ThreadPoolWrapper;
-import com.aliyun.auth.credentials.Credential;
-import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
-import com.aliyun.sdk.service.cas20200407.AsyncClient;
-import com.aliyun.sdk.service.cas20200407.models.*;
-import com.google.gson.Gson;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import darabonba.core.client.ClientOverrideConfiguration;
-import lombok.extern.slf4j.Slf4j;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.time.LocalDateTime;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.*;
-
-/**
- * @author reghao
- * @date 2025-03-27 16:14:53
- */
-@Slf4j
-public class AliyunCertificate {
-    static ScheduledExecutorService scheduler = ThreadPoolWrapper.scheduledThreadPool("checker", 10);
-    static Map<Long, ScheduledFuture<?>> futureMap = new HashMap<>();
-
-    static void setLogLevel() {
-        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
-        Logger rootLogger = loggerContext.getLogger("ROOT");
-        rootLogger.setLevel(Level.INFO);
-    }
-
-    public static void main(String[] args) throws Exception {
-        setLogLevel();
-
-        StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
-                .accessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
-                .accessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
-                //.securityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN")) // use STS token
-                .build());
-
-        // Endpoint 请参考 https://api.aliyun.com/product/cas
-        String endpoint = "cas.aliyuncs.com";
-        AsyncClient client = AsyncClient.builder()
-                .credentialsProvider(provider)
-                .overrideConfiguration(
-                        ClientOverrideConfiguration.create()
-                                .setEndpointOverride(endpoint)
-                )
-                .build();
-
-        String orderType = "";
-        //orderType = "CERT";
-        listUserCertificateOrder(client, orderType);
-        log.info("main-thread goto sleep...");
-        Thread.sleep(3600_000);
-
-        //createCertificate(client);
-        long orderId = 13588158L;
-        //describeCertificateState(client, orderId);
-        // Finally, close the client
-        client.close();
-    }
-
-    static void listUserCertificateOrder(AsyncClient client, String orderType) throws Exception {
-        ListUserCertificateOrderRequest listUserCertificateOrderRequest;
-        if (orderType.isBlank()) {
-            listUserCertificateOrderRequest = ListUserCertificateOrderRequest.builder()
-                    .build();
-        } else {
-            listUserCertificateOrderRequest = ListUserCertificateOrderRequest.builder()
-                    .orderType(orderType)
-                    .build();
-        }
-
-        CompletableFuture<ListUserCertificateOrderResponse> response = client.listUserCertificateOrder(listUserCertificateOrderRequest);
-        ListUserCertificateOrderResponse resp = response.get();
-        String jsonData = new Gson().toJson(resp);
-        JsonObject jsonObject = JsonConverter.jsonToObject(jsonData, JsonObject.class);
-        JsonArray jsonArray = jsonObject.get("body").getAsJsonObject().get("certificateOrderList").getAsJsonArray();
-        for (JsonElement jsonElement : jsonArray) {
-            JsonObject jsonObject1 = jsonElement.getAsJsonObject();
-            if (orderType.isBlank()) {
-                long orderId = jsonObject1.get("orderId").getAsLong();
-                describeCertificateState(client, orderId);
-
-                /*String domain = jsonObject1.get("domain").getAsString();
-                long endTimeMs = jsonObject1.get("certEndTime").getAsLong();
-                LocalDateTime expireDateTime = DateTimeConverter.localDateTime(endTimeMs);*/
-            } else {
-                long certificateId = jsonObject1.get("certificateId").getAsLong();
-                getUserCertificateDetail(client, certificateId);
-            }
-        }
-    }
-
-    static void getUserCertificateDetail(AsyncClient client, long certificateId) throws Exception {
-        GetUserCertificateDetailRequest getUserCertificateDetailRequest = GetUserCertificateDetailRequest.builder()
-                .certId(certificateId)
-                .certFilter(false)
-                .build();
-
-        CompletableFuture<GetUserCertificateDetailResponse> response = client.getUserCertificateDetail(getUserCertificateDetailRequest);
-        GetUserCertificateDetailResponse resp = response.get();
-        String jsonData = new Gson().toJson(resp);
-        JsonObject jsonObject = JsonConverter.jsonToObject(jsonData, JsonObject.class);
-        JsonObject certDetail = jsonObject.get("body").getAsJsonObject();
-        String domain = certDetail.get("sans").getAsString();
-        String certificate = certDetail.get("cert").getAsString();
-        String privateKey = certDetail.get("key").getAsString();
-        long notBefore = certDetail.get("notBefore").getAsLong();
-        long notAfter = certDetail.get("notAfter").getAsLong();
-        LocalDateTime expireDateTime = DateTimeConverter.localDateTime(notAfter);
-
-        String certPath = String.format("/home/reghao/Downloads/1/%s.pem", domain);
-        File certFile = new File(certPath);
-        if (!certFile.exists()) {
-            RsaCryptor.savePemFile(certificate, certPath);
-        }
-
-        String keyPath = String.format("/home/reghao/Downloads/1/%s.key", domain);;
-        File keyFile = new File(keyPath);
-        if (!keyFile.exists()) {
-            RsaCryptor.savePemFile(privateKey, keyPath);
-        }
-        System.out.println();
-    }
-
-    static void createCertificates(AsyncClient client) throws Exception {
-        List<String> domainList = List.of("tnb.reghao.cn", "api.reghao.cn", "oss.reghao.cn", "bnt.reghao.cn");
-        List<String> domainList1 = List.of("blog.reghao.cn", "git.reghao.cn", "docker.reghao.cn");
-        for (String domain : domainList) {
-            createCertificate(client, domain);
-            Thread.sleep(5_000);
-        }
-    }
-
-    static void createCertificate(AsyncClient client, String domain) throws ExecutionException, InterruptedException {
-        CreateCertificateRequestRequest createCertificateRequestRequest = CreateCertificateRequestRequest.builder()
-                .productCode("digicert-free-1-free")
-                .username("赵梓潼")
-                .phone("18782243510")
-                .email("lhao.sg@qq.com")
-                .domain(domain)
-                .validateType("DNS")
-                .build();
-
-        CompletableFuture<CreateCertificateRequestResponse> response = client.createCertificateRequest(createCertificateRequestRequest);
-        CreateCertificateRequestResponse resp = response.get();
-        String jsonData = new Gson().toJson(resp);
-        JsonObject jsonObject = JsonConverter.jsonToObject(jsonData, JsonObject.class);
-        JsonObject respBody = jsonObject.get("body").getAsJsonObject();
-        long orderId = respBody.get("orderId").getAsLong();
-        log.info("orderId -> {}", orderId);
-    }
-
-    static void describeCertificateState(AsyncClient client, long orderId) throws ExecutionException, InterruptedException {
-        DescribeCertificateStateRequest describeCertificateStateRequest = DescribeCertificateStateRequest.builder()
-                .orderId(orderId)
-                .build();
-
-        CompletableFuture<DescribeCertificateStateResponse> response = client.describeCertificateState(describeCertificateStateRequest);
-        DescribeCertificateStateResponse resp = response.get();
-        String jsonData = new Gson().toJson(resp);
-        JsonObject jsonObject = JsonConverter.jsonToObject(jsonData, JsonObject.class);
-        JsonObject respBody = jsonObject.get("body").getAsJsonObject();
-        String type = respBody.get("type").getAsString();
-        if ("certificate".equals(type)) {
-            String certificate = respBody.get("certificate").getAsString();
-            String privateKey = respBody.get("privateKey").getAsString();
-        } else if ("domain_verify".equals(type)) {
-            String recordDomain = respBody.get("recordDomain").getAsString();
-            String recordType = respBody.get("recordType").getAsString();
-            String recordValue = respBody.get("recordValue").getAsString();
-            String domain = recordDomain.replace("_dnsauth.", "");
-            // 添加 TXT 记录
-            AliyunDns.addTxtRecord(domain, recordDomain, recordValue);
-
-            CheckTask checkTask = new CheckTask(client, domain, orderId);
-            ScheduledFuture<?> future = scheduler.scheduleAtFixedRate(checkTask, 60, 60, TimeUnit.SECONDS);
-            futureMap.put(orderId, future);
-            Thread.sleep(5_000);
-        }
-    }
-
-    static class CheckTask implements Runnable {
-        private final AsyncClient client;
-        private final String domain;
-        private final long orderId;
-
-        public CheckTask(AsyncClient client, String domain, long orderId) {
-            this.client = client;
-            this.domain = domain;
-            this.orderId = orderId;
-        }
-
-        public void run() {
-            try {
-                DescribeCertificateStateRequest describeCertificateStateRequest = DescribeCertificateStateRequest.builder()
-                        .orderId(orderId)
-                        .build();
-
-                CompletableFuture<DescribeCertificateStateResponse> response = client.describeCertificateState(describeCertificateStateRequest);
-                DescribeCertificateStateResponse resp = response.get();
-                String jsonData = new Gson().toJson(resp);
-                JsonObject jsonObject = JsonConverter.jsonToObject(jsonData, JsonObject.class);
-                JsonObject respBody = jsonObject.get("body").getAsJsonObject();
-                String type = respBody.get("type").getAsString();
-                if ("certificate".equals(type)) {
-                    String certificate = respBody.get("certificate").getAsString();
-                    String privateKey = respBody.get("privateKey").getAsString();
-                    ScheduledFuture<?> future = futureMap.get(orderId);
-                    if (future != null) {
-                        log.info("{} - {} 证书已签发, 取消定时任务...", domain, orderId);
-                        future.cancel(true);
-                    }
-                } else {
-                    log.info("{} - {} 证书状态 {}...", domain, orderId, type);
-                }
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
-    }
-
-    static void reloadNginx() {
-        ShellExecutor shellExecutor = new ShellExecutor();
-        String cmd = "/usr/bin/nginx -t";
-        String cmd1 = "/usr/bin/nginx -s reload";
-        ShellResult shellResult = shellExecutor.exec(cmd.split("\\s+"));
-        String result = shellResult.getResult();
-        System.out.println(result);
-    }
-}

+ 0 - 91
sb/src/main/java/cn/reghao/tnb/sb/aliyun/AliyunDns.java

@@ -1,91 +0,0 @@
-package cn.reghao.tnb.sb.aliyun;
-
-import cn.reghao.jutil.jdk.serializer.JsonConverter;
-import com.aliyun.auth.credentials.Credential;
-import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
-import com.aliyun.sdk.service.alidns20150109.AsyncClient;
-import com.aliyun.sdk.service.alidns20150109.models.AddDomainRecordRequest;
-import com.aliyun.sdk.service.alidns20150109.models.AddDomainRecordResponse;
-import com.aliyun.sdk.service.alidns20150109.models.GetTxtRecordForVerifyRequest;
-import com.aliyun.sdk.service.alidns20150109.models.GetTxtRecordForVerifyResponse;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import darabonba.core.client.ClientOverrideConfiguration;
-
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-
-/**
- * @author reghao
- * @date 2025-03-28 16:22:34
- */
-public class AliyunDns {
-    public static void addTxtRecord(String domain, String rr, String value) throws ExecutionException, InterruptedException {
-        StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
-                .accessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
-                .accessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
-                //.securityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN")) // use STS token
-                .build());
-
-        // Endpoint 请参考 https://api.aliyun.com/product/Alidns
-        String endpoint = "alidns.cn-chengdu.aliyuncs.com";
-        String regionId = "cn-chengdu";
-        AsyncClient client = AsyncClient.builder()
-                .region(regionId)
-                .credentialsProvider(provider)
-                .overrideConfiguration(
-                        ClientOverrideConfiguration.create()
-                                .setEndpointOverride(endpoint)
-                )
-                .build();
-
-        /*String domain = "";
-        String rr = "";
-        String value = "";*/
-        AddDomainRecordRequest addDomainRecordRequest = AddDomainRecordRequest.builder()
-                .domainName(domain)
-                .type("TXT")
-                .rr(rr)
-                .value(value)
-                .build();
-
-        // Asynchronously get the return value of the API request
-        CompletableFuture<AddDomainRecordResponse> response = client.addDomainRecord(addDomainRecordRequest);
-        // Synchronously get the return value of the API request
-        AddDomainRecordResponse resp = response.get();
-        String jsonData = new Gson().toJson(resp);
-        JsonObject jsonObject = JsonConverter.jsonToObject(jsonData, JsonObject.class);
-        JsonObject respBody = jsonObject.get("body").getAsJsonObject();
-    }
-
-    static void test() throws ExecutionException, InterruptedException {
-        StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
-                .accessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
-                .accessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
-                //.securityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN")) // use STS token
-                .build());
-
-        // Endpoint 请参考 https://api.aliyun.com/product/Alidns
-        String endpoint = "alidns.cn-chengdu.aliyuncs.com";
-        String regionId = "cn-chengdu";
-        AsyncClient client = AsyncClient.builder()
-                .region(regionId)
-                .credentialsProvider(provider)
-                .overrideConfiguration(
-                        ClientOverrideConfiguration.create()
-                                .setEndpointOverride(endpoint)
-                )
-                .build();
-
-        GetTxtRecordForVerifyRequest getTxtRecordForVerifyRequest = GetTxtRecordForVerifyRequest.builder()
-                .domainName("")
-                .type("ADD_SUB_DOMAIN")
-                .lang("en")
-                .build();
-
-        CompletableFuture<GetTxtRecordForVerifyResponse> response = client.getTxtRecordForVerify(getTxtRecordForVerifyRequest);
-        GetTxtRecordForVerifyResponse resp = response.get();
-        System.out.println(new Gson().toJson(resp));
-        client.close();
-    }
-}

+ 0 - 13
sb/src/main/java/cn/reghao/tnb/sb/aliyun/model/AliyunCert.java

@@ -1,13 +0,0 @@
-package cn.reghao.tnb.sb.aliyun.model;
-
-/**
- * 阿里云 SSL 证书
- *
- * @author reghao
- * @date 2025-03-28 09:39:59
- */
-public class AliyunCert {
-    private String domain;
-    private String status;
-    private String expireAt;
-}

+ 0 - 16
sb/src/main/java/cn/reghao/tnb/sb/aliyun/model/AliyunKey.java

@@ -1,16 +0,0 @@
-package cn.reghao.tnb.sb.aliyun.model;
-
-import java.util.List;
-
-/**
- * 阿里云帐号
- *
- * @author reghao
- * @date 2025-03-28 09:50:27
- */
-public class AliyunKey {
-    private String aliyunAccount;
-    private String accessKeyId;
-    private String accessKeySecret;
-    private List<String> endpoints;
-}

+ 0 - 399
sb/src/main/java/cn/reghao/tnb/sb/bayes/email/SpamBayes.java

@@ -1,399 +0,0 @@
-package cn.reghao.tnb.sb.bayes.email;
-
-import cn.reghao.jutil.jdk.io.TextFile;
-import com.huaban.analysis.jieba.JiebaSegmenter;
-import org.jfree.chart.ChartFactory;
-import org.jfree.chart.ChartUtilities;
-import org.jfree.chart.JFreeChart;
-import org.jfree.chart.axis.ValueAxis;
-import org.jfree.chart.plot.PlotOrientation;
-import org.jfree.chart.plot.XYPlot;
-import org.jfree.data.xy.XYDataset;
-import org.jfree.data.xy.XYSeries;
-import org.jfree.data.xy.XYSeriesCollection;
-
-import java.awt.*;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
-import java.math.BigDecimal;
-import java.util.*;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author reghao
- * @date 2025-08-25 14:10:49
- */
-public class SpamBayes {
-    TextFile textFile = new TextFile();
-
-    public static Map<String, Integer> spamMailMap = new HashMap<>();//垃圾邮件分词表
-    public static Map<String, Integer> hamMailMap = new HashMap<>();//正常邮件分词表
-    public static Integer spamMailSegNum = 0;//垃圾邮件分词总数量
-    public static Integer hamMailSegNum = 0;//正常邮件分词总数量
-    public static Map<String, Double> spamMailRateMap = new HashMap<>();//垃圾邮件分词概率表
-    public static Map<String, Double> hamMailRateMap = new HashMap<>();//正常邮件分词概率表
-
-    public static double typeThreshold = -0.05d;//分类阈值,初值-0.05
-    public static final double MAX_TYPE_THRESHOLD = 1.051d;//分类阈值最大值,浮点数累加会产生误差,故设置多一位小数
-    public static final double TYPE_THRESHOLD_INCREASES = 0.05;//分类阈值增幅为0.1
-    public static final int TRAIN_MAX_NUM = 50000;//训练邮件最大数
-    public static final int TEST_MAX_NUM = 10000;//测试邮件最大数
-
-    public static double[] probability = new double[TEST_MAX_NUM];//测试邮件为垃圾邮件的概率数组
-    public static String[] testRealType = new String[TEST_MAX_NUM];//测试邮件真实的类型数组
-
-    public static int trainNum = 0;//实际训练邮件数
-    public static Integer spamTrainMailNum = 0;//垃圾邮件总数量
-    public static double spamTrainRate = 0d;//垃圾邮件率
-
-    public static int testNum = 0;//实际测试邮件数
-    public static double trainTime = 0d;//训练时间
-    public static double testTime = 0d;//测试时间
-
-    /*评价指标*/
-    public static int TP = 0;//实际为垃圾,预测也为垃圾
-    public static int FN = 0;//实际为垃圾,预测却为正常
-    public static int FP = 0;//实际为正常,预测却为垃圾
-    public static int TN = 0;//实际为正常,预测也为正常
-
-    /*被分对的样本数除以所有的样本数,通常来说,正确率越高,分类器越好*/
-    public static double accuracy = 0;//准确率Accuracy = (TP+TN)/(TP+FP+TN+FN)
-    /*被分为正例的示例中实际为正例的比例*/
-    public static double precision = 0;//精确率precision=TP/(TP+FP)
-    /*所有负例中被分对的比例,衡量了分类器对负例的识别能力*/
-    public static double specificity = 0;//特效率specificity=TN/N
-    /*所有正例中被分对的比例,衡量了分类器对正例的识别能力*/
-    public static double recall = 0;//召回率recall=TP/(TP+FN) = 灵敏度(Sensitivity)
-    /*F1-Score指标综合了Precision与Recall的产出的结果。
-    F1-Score的取值范围从0到1的,1代表模型的输出最好,0代表模型的输出结果最差。*/
-    public static double F1_Score = 0;//平衡F分数:准确率和召回率的调和平均数
-    /*True Positive Rate(TPR)和False Positive Rate(FPR)分别构成ROC曲线的y轴和x轴。*/
-    /*实际正样本中被预测正确的概率*/
-    public static double TPR = 0;//TPR=TP/(TP+FN) = recall = Sensitivity
-    /*实际负样本中被错误预测为正样本的概率*/
-    public static double FPR = 0;//FPR=FP/(FP+TN)
-    //ROC坐标集合,键为阈值,值为TPR和FPR组成的数组
-    List<Double[]> ROCLocalList = new ArrayList<>();
-
-    void train() {
-        String originalPath = "/home/reghao/Dropbox/dataset/trec06c/full/index";
-        List<String> list = textFile.read(originalPath);
-        for (String line : list.subList(0, TRAIN_MAX_NUM)) {
-            trainNum++;
-            String[] arr = line.split(" ");
-            String type = arr[0];
-            String contentPath = arr[1];
-
-            System.out.println(contentPath);
-            List<String> wordList = getWordList(contentPath);
-            if (type.equals("spam")) {
-                spamTrainMailNum ++;
-                spamMailSegNum += wordList.size();
-                for (String word : wordList) {
-                    spamMailMap.put(word, spamMailMap.containsKey(word) ? spamMailMap.get(word) + 1 : 1);
-                }
-            } else {
-                hamMailSegNum += wordList.size();
-                for (String word : wordList) {
-                    hamMailMap.put(word, hamMailMap.containsKey(word) ? hamMailMap.get(word) + 1 : 1);
-                }
-            }
-        }
-
-        spamTrainRate = (double) spamTrainMailNum/(double) trainNum;
-        setSpamMailRateMap();
-    }
-
-    JiebaSegmenter segmenter = new JiebaSegmenter();
-    List<String> getWordList(String contentPath) {
-        contentPath = contentPath.replace("..", "/home/reghao/Dropbox/dataset/trec06c");
-        String content = readFile(contentPath);
-        List<String> tmpList = segmenter.sentenceProcess(content);
-        return tmpList.stream().filter(text -> text.length() > 1).collect(Collectors.toList());
-    }
-
-    String readFile(String filePath) {
-        String charset = "gbk";
-        StringBuffer sb = new StringBuffer();
-        try {
-            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), charset));
-            String line = "";
-            int flag = 0;
-            while ((line = br.readLine()) != null) {
-                if (flag == 1) {
-                    sb.append(line);
-                }
-
-                if (line.equals("") || line.length() == 0) {
-                    flag = 1;
-                }
-            }
-        } catch (Exception e) {
-            // ignore
-        }
-
-        return sb.toString();
-    }
-
-    void setSpamMailRateMap() {
-        spamMailMap.forEach((key, value) -> {
-            try {
-                double rate = (double) value/(double) spamMailSegNum;
-                double allRate = rate;
-                allRate += (double) hamMailMap.getOrDefault(key, 1)/(double) hamMailSegNum;
-                spamMailRateMap.put(key, (double) rate/(double) allRate);
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        });
-    }
-
-    void test() {
-        String originalPath = "/home/reghao/Dropbox/dataset/trec06c/full/index";
-        List<String> list = textFile.read(originalPath);
-        int start = TRAIN_MAX_NUM;
-        int end = TRAIN_MAX_NUM + TEST_MAX_NUM;
-        for (String line : list.subList(start, Math.min(list.size(), end))) {
-            String[] arr = line.split(" ");
-            String type = arr[0];
-            String contentPath = arr[1];
-            List<String> wordList = getWordList(contentPath);
-
-            int flag = 0;
-            double rate = spamTrainRate;
-            double tmpRate = 1 - spamTrainRate;
-            for (String word : wordList) {
-                if (spamMailRateMap.containsKey(word)) {
-                    double spamTmp = spamMailRateMap.get(word);
-                    rate *= spamTmp * (((double)(spamMailMap.get(word) + (hamMailMap.containsKey(word)? hamMailMap.get(word): 0))) / (double) (spamMailSegNum + hamMailSegNum)) / spamTrainRate;
-                    tmpRate *= (1d - spamTmp) * (((double)spamMailMap.get(word)+(hamMailMap.containsKey(word)? hamMailMap.get(word): 0)) / (double) (spamMailSegNum + hamMailSegNum)) / spamTrainRate;;
-                    if (testNum == 1 || testNum == 2){
-                        System.out.println("rate:"+rate+"\ntempRate:"+tmpRate);
-                    }
-                    //当有一个概率非常趋近于0时,需要进行判断
-                    // 判断该邮件更接近垃圾邮件还是正常邮件
-                    if (rate < Math.pow(10, -300) || tmpRate < Math.pow(10, -300)){
-                        if (rate > 1){
-                            probability[testNum] = 1d;
-                            flag = 2;
-                            break;
-                        }else if (tmpRate > 1){
-                            probability[testNum] = 0d;
-                            flag = 3;
-                            break;
-                        }else {
-                            rate *= Math.pow(10, 7);
-                            tmpRate *= Math.pow(10, 7);
-                        }
-                    }
-                }
-            }
-
-            if (flag == 0) { //flag!=0代表已经手动设置过概率
-                probability[testNum] = rate / (rate + tmpRate);
-                System.out.println(probability[testNum]);
-            }
-            testRealType[testNum++] = type;
-        }
-    }
-
-    void initTestValue() {
-        TP = 0;
-        FP = 0;
-        TN = 0;
-        FN = 0;
-        accuracy = 0d;
-        specificity = 0d;
-        precision = 0d;
-        recall = 0d;
-        F1_Score = 0d;
-        TPR = 0d;
-        FPR = 0d;
-    }
-
-    void evaluation() {
-        /*--------------训练效率评估----------------------*/
-        System.out.println("\n---------------------------------训练效率------------------------------");
-        System.out.println("训练个数:" + trainNum);
-        System.out.format("训练时间为:%.1fs\n", trainTime);
-        System.out.println("测试个数:" + testNum);
-        System.out.format("测试时间为:%.1fs\n", testTime);
-
-        /*--------------模型评价指标----------------------*/
-        System.out.println("\n---------------------------------评价指标-------------------------------\n");
-        //评估各阈值下的指标,用于绘制ROC曲线
-        while(typeThreshold < MAX_TYPE_THRESHOLD) {
-            //初始化各个指标
-            initTestValue();
-            //得到该阈值下的混淆矩阵
-            for (int i = 0; i < testNum; i++){
-                BigDecimal bg = new BigDecimal(typeThreshold);
-                if (probability[i] >= bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()) {//概率大于阈值则判定为垃圾
-                    if (testRealType[i].equals("spam")) {
-                        TP++;
-                    } else {
-                        FP++;//误判为垃圾
-                    }
-                    //System.out.format("spam %s\n", typeAndIndex[1]);
-                } else {
-                    if (testRealType[i].equals("ham")) {
-                        TN++;
-                    } else {
-                        FN++;
-                    }
-                    //System.out.format("ham %s\n", typeAndIndex[1]);
-                }
-            }
-            System.out.format("\n\n------------------阈值(%.2f)-----------------\n\n ", typeThreshold);
-
-            //绘制混淆矩阵
-            System.out.println("------------------------------------------ ");
-            System.out.println("|                |         实际类         |");
-            System.out.println("|      数量      |------------------------|");
-            System.out.println("|                |   垃圾    |    正常    |");
-            System.out.println("|----------------|------------------------|");
-            System.out.println("|预测类  |  垃圾  |    " + TP + "     |     " + FP + "   |");
-            System.out.println("|       |  正常  |    " + FN + "      |      " + TN + "    |");
-            System.out.println("|----------------|------------------------|\n");
-
-            //根据混淆矩阵得到常用评价指标
-            accuracy = (double) (TP + TN) / (double) (TP + FP + FN + TN);
-            System.out.format("正确率(accuracy)= (TP+TN)/(P+N) = %.2f\n", accuracy);
-            specificity = (double) TN / (double) (TN + FP);
-            System.out.format("特效度(specificity)= TN/N = %.2f\n", specificity);
-            precision = (double) TP / (double) (TP + FP);
-            System.out.format("精度(precision)= TP/(TP+FP) = %.2f\n", precision);
-            recall = (double) TP / (double) (TP + FN);
-            System.out.format("召回率(recall)= 灵敏度(sensitive)= TP/(TP+FN) = %.2f\n", recall);
-            F1_Score = 2 * precision * recall / (precision + recall);
-            System.out.format("综合分类率(F1)= 2 * precision * recall / (precision + recall) = %.2f\n", F1_Score);
-
-            //得到ROC曲线坐标值
-            TPR = (double) TP / (double) (TP + FN);
-            FPR =  (double) FP / (double)(FP + TN);
-            //注入ROC坐标集合
-            ROCLocalList.add(new Double[]{FPR, TPR});
-            //提高阈值
-            typeThreshold += TYPE_THRESHOLD_INCREASES;
-        }
-
-
-
-        System.out.println("\n-----------------------------概率分布曲线------------------------------");
-        System.out.println("概率分布坐标点:");
-        //创建Dataset对象
-        XYDataset probabilityDataset = new XYSeriesCollection();
-        XYSeries pSeries = new XYSeries("Positives");
-        XYSeries nSeries = new XYSeries("Negatives");
-        for (int i = 0; i < probability.length; i++) {
-            int index;
-            BigDecimal bg = new BigDecimal(probability[i]);
-            double tempProbability = bg.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
-            if (testRealType[i].equals("spam")){
-                if ((index = pSeries.indexOf(tempProbability)) > -1) {
-                    pSeries.updateByIndex(index,  pSeries.getY(index).intValue() + 1);
-                }else{
-                    pSeries.add(tempProbability, new Integer(1));
-                }
-            }else{
-                if ((index = nSeries.indexOf(tempProbability)) > -1) {
-                    nSeries.updateByIndex(index, nSeries.getY(index).intValue() + 1);
-                }else{
-                    nSeries.add(tempProbability, new Integer(1));
-                }
-            }
-        }
-        System.out.println("正例坐标:");
-        for (int i = 0; i < pSeries.getItems().size();i++){
-            System.out.format("(%.2f, %d)", pSeries.getDataItem(i).getX(), pSeries.getDataItem(i).getY());
-        }
-        System.out.println("\n负例坐标:");
-        for (int i = 0; i < nSeries.getItems().size();i++){
-            System.out.format("(%.2f, %d)", nSeries.getDataItem(i).getX(), nSeries.getDataItem(i).getY());
-        }
-        ((XYSeriesCollection) probabilityDataset).addSeries(pSeries);
-        ((XYSeriesCollection) probabilityDataset).addSeries(nSeries);
-
-        String probabilityFilePath = "/home/reghao/Downloads/probability-Bayes.jpg";
-        createLineChart("垃圾邮件正负例概率分布图","概率","样本数",1000,500, probabilityDataset, probabilityFilePath);
-
-        System.out.println("\n-----------------------------ROC曲线------------------------------");
-        System.out.println("ROC曲线坐标点:");
-        for (Double[] doubles : ROCLocalList){
-            System.out.format("(%.2f, %.2f)", doubles[0], doubles[1]);
-        }
-        //创建Dataset对象
-        XYDataset xyDataset = new XYSeriesCollection();
-        XYSeries xySeries = new XYSeries("ROC");
-        for (Double[] doubles : ROCLocalList) {
-            xySeries.add(doubles[0],doubles[1]);
-        }
-        ((XYSeriesCollection) xyDataset).addSeries(xySeries);
-
-        //绘制ROC曲线并保存在ROC.jpg
-        String ROCFilePath = "/home/reghao/Downloads/ROC-Bayes.jpg";
-        createLineChart("垃圾邮件识别ROC曲线图", "FPR", "TPR",500,500, xyDataset, ROCFilePath);
-    }
-
-    void createLineChart(String title, String xAxis, String yAxis, int width, int height, XYDataset dataset, String filePath) {
-        try {
-            // 标题, X坐标, Y坐标, 数据集合, orientation, 是否显示 legend, 是否显示 tooltip, 是否使用 url 链接
-            JFreeChart chart = ChartFactory.createXYLineChart(title, xAxis, yAxis, dataset,
-                    PlotOrientation.VERTICAL,true, true, false);
-
-            chart.setBackgroundPaint(Color.WHITE);
-            Font font = new Font("宋体", Font.BOLD, 12);
-            chart.getTitle().setFont(font);
-            chart.setBackgroundPaint(Color.WHITE);
-
-            //获得坐标系
-            XYPlot xyPlot = chart.getXYPlot();
-
-            //设置标题字体
-            chart.getTitle().setFont(font);
-
-            //设置背景颜色
-            xyPlot.setBackgroundPaint(Color.WHITE);
-            // x轴 // 分类轴网格是否可见
-            xyPlot.setDomainGridlinesVisible(true);
-            // y轴 //数据轴网格是否可见
-            xyPlot.setRangeGridlinesVisible(true);
-            // 设置网格竖线颜色
-            xyPlot.setDomainGridlinePaint(Color.LIGHT_GRAY);
-            // 设置网格横线颜色
-            xyPlot.setRangeGridlinePaint(Color.LIGHT_GRAY);
-
-            // 取得Y轴
-            ValueAxis rangeAxis = xyPlot.getRangeAxis();
-            //设置字体
-            rangeAxis.setLabelFont(font);
-            rangeAxis.setAutoRange(true);
-            // 取得X轴
-            ValueAxis valueAxis = xyPlot.getDomainAxis();
-            valueAxis.setLabelFont(font);
-            valueAxis.setRange(0, 1);
-
-            // 设置X,Y轴坐标上的文字
-            valueAxis.setTickLabelFont(font);
-            rangeAxis.setTickLabelFont(font);
-            // 设置X,Y轴的标题文字
-            valueAxis.setLabelFont(font);
-            rangeAxis.setLabelFont(font);
-            ChartUtilities.saveChartAsJPEG(new File(filePath), chart, width, height);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public static void main(String[] args) {
-        SpamBayes spamBayes = new SpamBayes();
-        spamBayes.train();
-        System.out.println("-------------------------------测试------------------------------");
-        spamBayes.test();
-
-        spamBayes.evaluation();
-    }
-}

+ 0 - 262
sb/src/main/java/cn/reghao/tnb/sb/bayes/email/SpamEvaluation.java

@@ -1,262 +0,0 @@
-package cn.reghao.tnb.sb.bayes.email;
-
-import org.jfree.chart.ChartFactory;
-import org.jfree.chart.ChartUtilities;
-import org.jfree.chart.JFreeChart;
-import org.jfree.chart.axis.ValueAxis;
-import org.jfree.chart.plot.PlotOrientation;
-import org.jfree.chart.plot.XYPlot;
-import org.jfree.data.xy.XYDataset;
-import org.jfree.data.xy.XYSeries;
-import org.jfree.data.xy.XYSeriesCollection;
-
-import java.awt.*;
-import java.io.File;
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2025-08-25 16:46:33
- */
-public class SpamEvaluation {
-    int trainNum = 0;//实际训练邮件数
-    final int TEST_MAX_NUM = 10000;//测试邮件最大数
-    double[] probability = new double[TEST_MAX_NUM];//测试邮件为垃圾邮件的概率数组
-    String[] testRealType = new String[TEST_MAX_NUM];//测试邮件真实的类型数组
-    int testNum = 0;//实际测试邮件数
-
-    /*评价指标*/
-    int TP = 0;//实际为垃圾,预测也为垃圾
-    int FN = 0;//实际为垃圾,预测却为正常
-    int FP = 0;//实际为正常,预测却为垃圾
-    int TN = 0;//实际为正常,预测也为正常
-
-    /*被分对的样本数除以所有的样本数,通常来说,正确率越高,分类器越好*/
-    double accuracy = 0;//准确率Accuracy = (TP+TN)/(TP+FP+TN+FN)
-    /*被分为正例的示例中实际为正例的比例*/
-    double precision = 0;//精确率precision=TP/(TP+FP)
-    /*所有负例中被分对的比例,衡量了分类器对负例的识别能力*/
-    double specificity = 0;//特效率specificity=TN/N
-    /*所有正例中被分对的比例,衡量了分类器对正例的识别能力*/
-    double recall = 0;//召回率recall=TP/(TP+FN) = 灵敏度(Sensitivity)
-    /*F1-Score指标综合了Precision与Recall的产出的结果。
-    F1-Score的取值范围从0到1的,1代表模型的输出最好,0代表模型的输出结果最差。*/
-    double F1_Score = 0;//平衡F分数:准确率和召回率的调和平均数
-    /*True Positive Rate(TPR)和False Positive Rate(FPR)分别构成ROC曲线的y轴和x轴。*/
-    /*实际正样本中被预测正确的概率*/
-    double TPR = 0;//TPR=TP/(TP+FN) = recall = Sensitivity
-    /*实际负样本中被错误预测为正样本的概率*/
-    double FPR = 0;//FPR=FP/(FP+TN)
-    //ROC坐标集合,键为阈值,值为TPR和FPR组成的数组
-    List<Double[]> rocList = new ArrayList<>();
-
-    double typeThreshold = -0.05d;//分类阈值,初值-0.05
-    final double MAX_TYPE_THRESHOLD = 1.051d;//分类阈值最大值,浮点数累加会产生误差,故设置多一位小数
-    final double TYPE_THRESHOLD_INCREASES = 0.05;//分类阈值增幅为0.1
-
-    double trainTime = 0d;//训练时间
-    double testTime = 0d;//测试时间
-
-    public SpamEvaluation(SpamTrain spamTrain, SpamTest spamTest) {
-        this.trainNum = spamTrain.getTrainNum();
-        this.probability = spamTest.getProbability();
-        this.testRealType = spamTest.getTestRealType();
-        this.testNum = spamTest.getTestNum();
-        this.trainTime = spamTrain.getTrainTime();
-        this.testTime = spamTest.getTestTime();
-    }
-    
-    void evaluation() {
-        /*--------------训练效率评估----------------------*/
-        System.out.println("\n---------------------------------训练效率------------------------------");
-        System.out.println("训练个数:" + trainNum);
-        System.out.format("训练时间为:%.1fs\n", trainTime);
-        System.out.println("测试个数:" + testNum);
-        System.out.format("测试时间为:%.1fs\n", testTime);
-
-        /*--------------模型评价指标----------------------*/
-        System.out.println("\n---------------------------------评价指标-------------------------------\n");
-        //评估各阈值下的指标,用于绘制ROC曲线
-        while(typeThreshold < MAX_TYPE_THRESHOLD) {
-            //初始化各个指标
-            initTestValue();
-            //得到该阈值下的混淆矩阵
-            for (int i = 0; i < testNum; i++) {
-                BigDecimal bigDecimal = new BigDecimal(typeThreshold);
-                if (probability[i] >= bigDecimal.setScale(2, RoundingMode.HALF_UP).doubleValue()) {//概率大于阈值则判定为垃圾
-                    if (testRealType[i].equals("spam")) {
-                        TP++;
-                    } else {
-                        FP++;//误判为垃圾
-                    }
-                    //System.out.format("spam %s\n", typeAndIndex[1]);
-                } else {
-                    if (testRealType[i].equals("ham")) {
-                        TN++;
-                    } else {
-                        FN++;
-                    }
-                    //System.out.format("ham %s\n", typeAndIndex[1]);
-                }
-            }
-            System.out.format("\n\n------------------阈值(%.2f)-----------------\n\n ", typeThreshold);
-
-            //绘制混淆矩阵
-            System.out.println("------------------------------------------ ");
-            System.out.println("|                |         实际类         |");
-            System.out.println("|      数量      |------------------------|");
-            System.out.println("|                |   垃圾    |    正常    |");
-            System.out.println("|----------------|------------------------|");
-            System.out.println("|预测类  |  垃圾  |    " + TP + "     |     " + FP + "   |");
-            System.out.println("|       |  正常  |    " + FN + "      |      " + TN + "    |");
-            System.out.println("|----------------|------------------------|\n");
-
-            //根据混淆矩阵得到常用评价指标
-            accuracy = (double) (TP + TN) / (double) (TP + FP + FN + TN);
-            System.out.format("正确率(accuracy)= (TP+TN)/(P+N) = %.2f\n", accuracy);
-            specificity = (double) TN / (double) (TN + FP);
-            System.out.format("特效度(specificity)= TN/N = %.2f\n", specificity);
-            precision = (double) TP / (double) (TP + FP);
-            System.out.format("精度(precision)= TP/(TP+FP) = %.2f\n", precision);
-            recall = (double) TP / (double) (TP + FN);
-            System.out.format("召回率(recall)= 灵敏度(sensitive)= TP/(TP+FN) = %.2f\n", recall);
-            F1_Score = 2 * precision * recall / (precision + recall);
-            System.out.format("综合分类率(F1)= 2 * precision * recall / (precision + recall) = %.2f\n", F1_Score);
-
-            //得到ROC曲线坐标值
-            TPR = (double) TP / (double) (TP + FN);
-            FPR =  (double) FP / (double)(FP + TN);
-            // 放入ROC坐标集合
-            rocList.add(new Double[]{FPR, TPR});
-
-            // 提高阈值, 开始下一次评估
-            typeThreshold += TYPE_THRESHOLD_INCREASES;
-        }
-
-        //drawChart();
-    }
-
-    void initTestValue() {
-        TP = 0;
-        FP = 0;
-        TN = 0;
-        FN = 0;
-        accuracy = 0d;
-        specificity = 0d;
-        precision = 0d;
-        recall = 0d;
-        F1_Score = 0d;
-        TPR = 0d;
-        FPR = 0d;
-    }
-
-    void drawChart() {
-        System.out.println("\n-----------------------------概率分布曲线------------------------------");
-        System.out.println("概率分布坐标点:");
-        //创建Dataset对象
-        XYDataset probabilityDataset = new XYSeriesCollection();
-        XYSeries pSeries = new XYSeries("Positives");
-        XYSeries nSeries = new XYSeries("Negatives");
-        for (int i = 0; i < probability.length; i++) {
-            int index;
-            BigDecimal bg = new BigDecimal(probability[i]);
-            double tempProbability = bg.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
-            if (testRealType[i].equals("spam")){
-                if ((index = pSeries.indexOf(tempProbability)) > -1) {
-                    pSeries.updateByIndex(index,  pSeries.getY(index).intValue() + 1);
-                }else{
-                    pSeries.add(tempProbability, new Integer(1));
-                }
-            }else{
-                if ((index = nSeries.indexOf(tempProbability)) > -1) {
-                    nSeries.updateByIndex(index, nSeries.getY(index).intValue() + 1);
-                }else{
-                    nSeries.add(tempProbability, new Integer(1));
-                }
-            }
-        }
-        System.out.println("正例坐标:");
-        for (int i = 0; i < pSeries.getItems().size();i++){
-            System.out.format("(%.2f, %d)", pSeries.getDataItem(i).getX(), pSeries.getDataItem(i).getY());
-        }
-        System.out.println("\n负例坐标:");
-        for (int i = 0; i < nSeries.getItems().size();i++){
-            System.out.format("(%.2f, %d)", nSeries.getDataItem(i).getX(), nSeries.getDataItem(i).getY());
-        }
-        ((XYSeriesCollection) probabilityDataset).addSeries(pSeries);
-        ((XYSeriesCollection) probabilityDataset).addSeries(nSeries);
-
-        String probabilityFilePath = "/home/reghao/Downloads/probability-Bayes.jpg";
-        createLineChart("垃圾邮件正负例概率分布图","概率","样本数",1000,500, probabilityDataset, probabilityFilePath);
-
-        System.out.println("\n-----------------------------ROC曲线------------------------------");
-        System.out.println("ROC曲线坐标点:");
-        for (Double[] doubles : rocList){
-            System.out.format("(%.2f, %.2f)", doubles[0], doubles[1]);
-        }
-        //创建Dataset对象
-        XYDataset xyDataset = new XYSeriesCollection();
-        XYSeries xySeries = new XYSeries("ROC");
-        for (Double[] doubles : rocList) {
-            xySeries.add(doubles[0],doubles[1]);
-        }
-        ((XYSeriesCollection) xyDataset).addSeries(xySeries);
-
-        //绘制ROC曲线并保存在ROC.jpg
-        String ROCFilePath = "/home/reghao/Downloads/ROC-Bayes.jpg";
-        createLineChart("垃圾邮件识别ROC曲线图", "FPR", "TPR",500,500, xyDataset, ROCFilePath);
-    }
-    
-    void createLineChart(String title, String xAxis, String yAxis, int width, int height, XYDataset dataset, String filePath) {
-        try {
-            // 标题, X坐标, Y坐标, 数据集合, orientation, 是否显示 legend, 是否显示 tooltip, 是否使用 url 链接
-            JFreeChart chart = ChartFactory.createXYLineChart(title, xAxis, yAxis, dataset,
-                    PlotOrientation.VERTICAL,true, true, false);
-
-            chart.setBackgroundPaint(Color.WHITE);
-            Font font = new Font("宋体", Font.BOLD, 12);
-            chart.getTitle().setFont(font);
-            chart.setBackgroundPaint(Color.WHITE);
-
-            //获得坐标系
-            XYPlot xyPlot = chart.getXYPlot();
-
-            //设置标题字体
-            chart.getTitle().setFont(font);
-
-            //设置背景颜色
-            xyPlot.setBackgroundPaint(Color.WHITE);
-            // x轴 // 分类轴网格是否可见
-            xyPlot.setDomainGridlinesVisible(true);
-            // y轴 //数据轴网格是否可见
-            xyPlot.setRangeGridlinesVisible(true);
-            // 设置网格竖线颜色
-            xyPlot.setDomainGridlinePaint(Color.LIGHT_GRAY);
-            // 设置网格横线颜色
-            xyPlot.setRangeGridlinePaint(Color.LIGHT_GRAY);
-
-            // 取得Y轴
-            ValueAxis rangeAxis = xyPlot.getRangeAxis();
-            //设置字体
-            rangeAxis.setLabelFont(font);
-            rangeAxis.setAutoRange(true);
-            // 取得X轴
-            ValueAxis valueAxis = xyPlot.getDomainAxis();
-            valueAxis.setLabelFont(font);
-            valueAxis.setRange(0, 1);
-
-            // 设置X,Y轴坐标上的文字
-            valueAxis.setTickLabelFont(font);
-            rangeAxis.setTickLabelFont(font);
-            // 设置X,Y轴的标题文字
-            valueAxis.setLabelFont(font);
-            rangeAxis.setLabelFont(font);
-            ChartUtilities.saveChartAsJPEG(new File(filePath), chart, width, height);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-}

+ 0 - 8
sb/src/main/java/cn/reghao/tnb/sb/bayes/email/SpamJointProbability.java

@@ -1,8 +0,0 @@
-package cn.reghao.tnb.sb.bayes.email;
-
-/**
- * @author reghao
- * @date 2025-08-25 16:23:51
- */
-public class SpamJointProbability {
-}

+ 0 - 38
sb/src/main/java/cn/reghao/tnb/sb/bayes/email/SpamMain.java

@@ -1,38 +0,0 @@
-package cn.reghao.tnb.sb.bayes.email;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2025-08-25 17:40:54
- */
-public class SpamMain {
-    static final int maxTrainNum = 50000;//训练邮件最大数
-    static final int maxTestNum = 10000;//测试邮件最大数
-
-    public static void main(String[] args) {
-        String baseDir = "/home/reghao/Dropbox/dataset/trec06c";
-        TextProcessor textProcessor = new TextProcessor(baseDir);
-
-        String originalDataPath = String.format("%s/%s", baseDir, "full/index");
-        List<String> list = textProcessor.getTextLines(originalDataPath);
-
-        List<String> trainList = list.subList(0, maxTrainNum);
-        String trainDataPath = String.format("%s/%s", baseDir, "full/index_train");
-        textProcessor.write(trainDataPath, trainList);
-
-        List<String> testList = list.subList(maxTrainNum, maxTrainNum + maxTestNum);
-        String testDataPath = String.format("%s/%s", baseDir, "full/index_test");
-        textProcessor.write(testDataPath, testList);
-
-        SpamTrain spamTrain = new SpamTrain(textProcessor);
-        spamTrain.train(trainDataPath);
-
-        SpamTest spamTest = new SpamTest(spamTrain, maxTestNum);
-        spamTest.test(testDataPath);
-
-        /*SpamEvaluation spamEvaluation = new SpamEvaluation(spamTrain, spamTest);
-        spamEvaluation.evaluation();*/
-        System.out.println();
-    }
-}

+ 0 - 110
sb/src/main/java/cn/reghao/tnb/sb/bayes/email/SpamTest.java

@@ -1,110 +0,0 @@
-package cn.reghao.tnb.sb.bayes.email;
-
-import lombok.Getter;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author reghao
- * @date 2025-08-25 16:43:39
- */
-@Getter
-public class SpamTest {
-    TextProcessor textProcessor;
-    Map<String, Integer> spamMailMap;
-    Map<String, Integer> hamMailMap;
-    Integer spamMailSegNum;
-    Integer hamMailSegNum;
-    Map<String, Double> spamMailRateMap;
-    int trainNum;
-    Integer spamTrainMailNum;
-    double spamTrainRate;
-
-    double[] probability; // 测试邮件为垃圾邮件的概率数组
-    String[] testRealType; // 测试邮件真实的类型数组
-    int testNum = 0; // 实际测试邮件数
-    double testTime = 0D; // 测试时间
-
-    public SpamTest(SpamTrain spamTrain, int maxTestNum) {
-        this.textProcessor = spamTrain.getTextProcessor();
-        this.spamMailMap = spamTrain.getSpamMailMap();
-        this.hamMailMap = spamTrain.getHamMailMap();
-        this.spamMailSegNum = spamTrain.getSpamMailSegNum();
-        this.hamMailSegNum = spamTrain.getHamMailSegNum();
-        this.spamMailRateMap = spamTrain.getSpamMailRateMap();
-        this.trainNum = spamTrain.getTrainNum();
-        this.spamTrainMailNum = spamTrain.getSpamTrainMailNum();
-        this.spamTrainRate = spamTrain.getSpamTrainRate();
-        this.probability = new double[maxTestNum];
-        this.testRealType = new String[maxTestNum];
-    }
-
-    void test(String testDataPath) {
-        long testStartTime = System.currentTimeMillis();
-        List<String> list = textProcessor.getTextLines(testDataPath);
-        for (String line : list) {
-            // 每次处理一封邮件
-            String[] arr = line.split(" ");
-            String type = arr[0];
-            String contentPath = arr[1];
-            List<String> wordList = textProcessor.getWordList(contentPath);
-
-            // 标识当前邮件是否手动设置概率
-            int flag = 0;
-            // P(spam) 是所有邮件中垃圾邮件的概率(先验概率)
-            // P(spam) = spamTrainRate
-            // P(spam) * {P(spam|ti) * P(ti) / P(spam)} (i 从 1 ~ n)
-            double rate = spamTrainRate;
-            // P(ham) = 1 - P(spam) = 1 - spamTrainRate
-            // (1 - P(spam)) * {(1 - P(spam|ti)) * P(ti) / P(spam)} (i 从 1 ~ n)
-            double tmpRate = 1 - spamTrainRate;
-            for (String word : wordList) {
-                if (spamMailRateMap.containsKey(word)) {
-                    // P(spam|ti)
-                    double spamTmp = spamMailRateMap.get(word);
-
-                    int occurCount = spamMailMap.get(word) + hamMailMap.getOrDefault(word, 0);
-                    int segNum = spamMailSegNum + hamMailSegNum;
-                    // P(ti)
-                    double rate0 = (double) occurCount / (double) segNum;
-
-                    // P(spam) * {P(spam|ti) * P(ti) / P(spam)}
-                    rate *= spamTmp * rate0 / spamTrainRate;
-                    // (1 - P(spam)) * {(1 - P(spam|ti)) * P(ti) / P(spam)}
-                    tmpRate *= (1D - spamTmp) * rate0 / spamTrainRate;
-                    if (testNum == 1 || testNum == 2) {
-                        System.out.println("rate:"+rate+"\ntempRate:"+tmpRate);
-                    }
-
-                    // 当某个概率非常趋近 0 时需要判断该邮件更接近垃圾邮件还是正常邮件
-                    if (rate < Math.pow(10, -300) || tmpRate < Math.pow(10, -300)) {
-                        if (rate > 1) {
-                            probability[testNum] = 1D;
-                            flag = 2;
-                            break;
-                        } else if (tmpRate > 1) {
-                            probability[testNum] = 0D;
-                            flag = 3;
-                            break;
-                        } else {
-                            rate *= Math.pow(10, 7);
-                            tmpRate *= Math.pow(10, 7);
-                        }
-                    }
-                }
-            }
-
-            if (flag == 0) {
-                // flag != 0 表示已经手动设置过概率
-                probability[testNum] = rate / (rate + tmpRate);
-                System.out.println(probability[testNum]);
-            }
-
-            testRealType[testNum++] = type;
-        }
-
-        long testFinishTime = System.currentTimeMillis();
-        testTime = (testFinishTime - testStartTime) / 1000D;
-    }
-}

+ 0 - 90
sb/src/main/java/cn/reghao/tnb/sb/bayes/email/SpamTrain.java

@@ -1,90 +0,0 @@
-package cn.reghao.tnb.sb.bayes.email;
-
-import lombok.Getter;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author reghao
- * @date 2025-08-25 16:37:51
- */
-@Getter
-public class SpamTrain {
-    TextProcessor textProcessor;
-    Map<String, Integer> spamMailMap = new HashMap<>();// 垃圾邮件中的词语 -> 每个词语出现的次数
-    Map<String, Integer> hamMailMap = new HashMap<>();// 正常邮件中的词语 -> 每个词语出现的次数
-    Integer spamMailSegNum = 0;// 垃圾邮件中词语的总数量
-    Integer hamMailSegNum = 0;// 正常邮件中词语的总数量
-    Map<String, Double> spamMailRateMap = new HashMap<>(); // 垃圾邮件中每个词语出现的概率
-    Map<String, Double> hamMailRateMap = new HashMap<>();// 正常邮件中每个词语出现的概率
-    int trainNum = 0; // 训练的邮件数量
-    Integer spamTrainMailNum = 0; // 垃圾邮件的数量
-    double spamTrainRate = 0d; // 垃圾邮件率
-    double trainTime = 0d; // 训练时间
-
-    public SpamTrain(TextProcessor textProcessor) {
-        this.textProcessor = textProcessor;
-    }
-
-    void train(String trainDataPath) {
-        long trainStartTime = System.currentTimeMillis();
-        List<String> list = textProcessor.getTextLines(trainDataPath);
-        for (String line : list) {
-            trainNum++;
-            String[] arr = line.split(" ");
-            String type = arr[0];
-            String contentPath = arr[1];
-            System.out.println(contentPath);
-            List<String> wordList = textProcessor.getWordList(contentPath);
-
-            // 根据邮件类型分别处理
-            if (type.equals("spam")) {
-                spamTrainMailNum ++;
-
-                spamMailSegNum += wordList.size();
-                for (String word : wordList) {
-                    spamMailMap.put(word, spamMailMap.containsKey(word) ? spamMailMap.get(word) + 1 : 1);
-                }
-            } else {
-                hamMailSegNum += wordList.size();
-                for (String word : wordList) {
-                    hamMailMap.put(word, hamMailMap.containsKey(word) ? hamMailMap.get(word) + 1 : 1);
-                }
-            }
-        }
-
-        // 垃圾邮件率
-        spamTrainRate = (double) spamTrainMailNum / (double) trainNum;
-        setSpamMailRateMap();
-
-        long trainFinishTime = System.currentTimeMillis();
-        trainTime = (trainFinishTime - trainStartTime) / 1000D;
-    }
-
-    void setSpamMailRateMap() {
-        for (Map.Entry<String, Integer> entry : spamMailMap.entrySet()) {
-            String word = entry.getKey();
-            int occurCount = entry.getValue();
-
-            // P1(ti) 某个词语在垃圾邮件的词语中出现的概率
-            double rate = (double) occurCount / (double) spamMailSegNum;
-            // 某个词语在正常邮件中出现的次数, 若没有出现过则默认为 1 次(防止判断过于绝对)
-            int occurCountHam = hamMailMap.getOrDefault(word, 1);
-            // P2(ti) 某个词语在正常邮件的词语中出现的概率
-            double rateHam = (double) occurCountHam/(double) hamMailSegNum;
-            // P(ti) 某个词语在所有邮件的词语中出现的概率
-            // P(ti) = P1(ti) + P2(ti)
-            double allRate = rate + rateHam;
-            // 某个词语在邮件中出现时, 该邮件为垃圾邮件的概率
-            // P1(ti)/P(ti) = P1(ti)/(P1(ti) + P2(ti)) = P(spam|ti)
-            //
-            // 某个词语在邮件中出现时, 该邮件为正常邮件的概率
-            // P2(ti)/P(ti) = P2(ti)/(P1(ti) + P2(ti)) = P(ham|ti)
-            double spamRate = rate/allRate;
-            // 词语 -> 垃圾邮件概率
-            spamMailRateMap.put(word, spamRate);
-        }
-    }
-}

+ 0 - 63
sb/src/main/java/cn/reghao/tnb/sb/bayes/email/TextProcessor.java

@@ -1,63 +0,0 @@
-package cn.reghao.tnb.sb.bayes.email;
-
-import cn.reghao.jutil.jdk.io.TextFile;
-import com.huaban.analysis.jieba.JiebaSegmenter;
-
-import java.io.BufferedReader;
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author reghao
- * @date 2025-08-25 17:26:37
- */
-public class TextProcessor {
-    JiebaSegmenter segmenter = new JiebaSegmenter();
-    TextFile textFile = new TextFile();
-    String baseDir;
-
-    public TextProcessor(String baseDir) {
-        this.baseDir = baseDir;
-    }
-
-    void write(String filePath, List<String> lines) {
-        textFile.write(filePath, lines);
-    }
-
-    List<String> getTextLines(String filePath) {
-        return textFile.read(filePath);
-    }
-
-    List<String> getWordList(String contentPath) {
-        contentPath = contentPath.replace("..", baseDir);
-        String content = readFile(contentPath);
-
-        List<String> tmpList = segmenter.sentenceProcess(content);
-        return tmpList.stream().filter(text -> text.length() > 1).collect(Collectors.toList());
-    }
-
-    String readFile(String filePath) {
-        String charset = "gbk";
-        StringBuffer sb = new StringBuffer();
-        try {
-            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), charset));
-            String line = "";
-            int flag = 0;
-            while ((line = br.readLine()) != null) {
-                if (flag == 1) {
-                    sb.append(line);
-                }
-
-                if (line.equals("") || line.length() == 0) {
-                    flag = 1;
-                }
-            }
-        } catch (Exception e) {
-            // ignore
-        }
-
-        return sb.toString();
-    }
-}

+ 0 - 67
sb/src/main/java/cn/reghao/tnb/sb/bayes/income/Bayes.java

@@ -1,67 +0,0 @@
-package cn.reghao.tnb.sb.bayes.income;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author reghao
- * @date 2025-08-25 11:22:56
- */
-public class Bayes {
-    public String predictClass(List<List<String>> trainList, List<String> testList) {
-        Map<String, List<List<String>>> resultMap = getDataSet(trainList);
-        double max = 0.0;
-        String result = "";
-
-        for (int i = 0; i < resultMap.size(); i++) {
-            double current = 0.0;
-            String key = i == 0 ? "yes" : "no";
-            List<List<String>> tmpList = resultMap.get(key);
-            // 计算总概率 P(y)
-            current = DecimalCalculator.divide(tmpList.size(), trainList.size());
-            for (int j = 0; j < testList.size(); j++) {
-                double pv = calculate(tmpList, testList.get(j), j);
-                current = DecimalCalculator.multiply(current, pv);
-            }
-
-            if (max <= current) {
-                result = i == 0 ? "yes" : "no";
-                max = current;
-            }
-        }
-
-        return result;
-    }
-
-    public Map<String, List<List<String>>> getDataSet(List<List<String>> list) {
-        Map<String, List<List<String>>> map = new HashMap<>();
-        List<List<String>> positiveList = new ArrayList<>();
-        List<List<String>> negativeList = new ArrayList<>();
-        for (List<String> tmpList : list) {
-            // 获取最后一项
-            String result = tmpList.get(tmpList.size()-1);
-            if (result.equals("yes")) {
-                positiveList.add(tmpList);
-            } else {
-                negativeList.add(tmpList);
-            }
-        }
-
-        map.put("yes", positiveList);
-        map.put("no", negativeList);
-        return map;
-    }
-
-    public double calculate(List<List<String>> list, String str, int index) {
-        int count = 0;
-        for (int i = 0; i < list.size(); i++) {
-            if (str.equals(list.get(i).get(index))) {
-                count++;
-            }
-        }
-
-        return DecimalCalculator.divide(count, list.size(), 3);
-    }
-}

+ 0 - 55
sb/src/main/java/cn/reghao/tnb/sb/bayes/income/BayesMain.java

@@ -1,55 +0,0 @@
-package cn.reghao.tnb.sb.bayes.income;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2025-08-25 13:27:32
- */
-public class BayesMain {
-    String originalTrain = "/home/reghao/Dropbox/dataset/income/original/adult.data";
-    String processedTrain = "/home/reghao/Dropbox/dataset/income/processed/adultResult.txt";
-    String originalTest = "/home/reghao/Dropbox/dataset/income/original/adult1000.test";
-    String processedTest = "/home/reghao/Dropbox/dataset/income/processed/adult1000Result.txt";
-    String originalTest100 = "/home/reghao/Dropbox/dataset/income/original/adult100.test";
-    String processedTest100 = "/home/reghao/Dropbox/dataset/income/processed/adult100Result.txt";
-    String finalStr = "";
-    int wrongNumber = 0; // 记录错误的数量
-    List<List<String>> trainList;
-    List<List<String>> testList;
-
-    void process() {
-        boolean removeNoise = true; // 是否排除干扰数据
-
-        DataConverter dataConverter = new DataConverter();
-        dataConverter.processFile(originalTrain, processedTrain, removeNoise);
-        dataConverter.processFile(originalTest, processedTest, removeNoise);
-
-        trainList = dataConverter.readFile(processedTrain);
-        testList = dataConverter.readFile(processedTest);
-
-        Bayes bayes = new Bayes();
-        for (List<String> strList : testList) {
-            List<String> tmp = new ArrayList<>(strList);
-            String label = tmp.get(tmp.size() - 1);
-            tmp.remove(tmp.size() - 1);
-            finalStr = bayes.predictClass(trainList, tmp);
-
-            if (!label.equals(finalStr)) {
-                wrongNumber++;
-            }
-        }
-        System.out.printf("预测总数: %s, 错误数: %s\n", testList.size(), wrongNumber);
-
-        // 保留 10 位小数
-        double divResult = DecimalCalculator.divide(wrongNumber, testList.size(), 10);
-        double correctRate = DecimalCalculator.subtract(1.00000000, divResult);
-        System.out.println("正确率: " + correctRate*100 + "%");
-    }
-
-    public static void main(String[] args) {
-        BayesMain bayesMain = new BayesMain();
-        bayesMain.process();
-    }
-}

+ 0 - 297
sb/src/main/java/cn/reghao/tnb/sb/bayes/income/DataConverter.java

@@ -1,297 +0,0 @@
-package cn.reghao.tnb.sb.bayes.income;
-
-import cn.reghao.jutil.jdk.io.TextFile;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-/**
- * @author reghao
- * @date 2025-08-25 13:18:11
- */
-public class DataConverter {
-    private TextFile textFile = new TextFile();
-
-    public List<List<String>> readFile(String filePath) {
-        List<String> lines = textFile.read(filePath);
-        return lines.stream()
-                .map(line -> Arrays.asList(line.split(",")))
-                .collect(Collectors.toList());
-
-    }
-
-    public void processFile(String originalFile, String processedFile, boolean removeNoise) {
-        List<String> lines = textFile.read(originalFile);
-        List<String> processedList = lines.stream()
-                .map(line -> {
-                    if (removeNoise && line.contains("?")) {
-                        return null;
-                    }
-
-                    return this.processLine(line);
-                })
-                .filter(Objects::nonNull)
-                .collect(Collectors.toList());
-        textFile.write(processedFile, processedList);
-    }
-
-    public String processLine(String string ){
-        String temp[] = string.split(", ");
-        StringBuilder sb = new StringBuilder();
-        sb.append(ageConversion(temp[0])+",");
-        sb.append(workclassConversion(temp[1])+",");//workclass
-        sb.append("");//fnlwgt忽略
-        sb.append(educationConversion(temp[3])+",");//education
-        sb.append("");//education_num忽略
-        sb.append(maritalStatusConversion(temp[5])+",");//marital_status
-        sb.append(occupationConversion(temp[6])+",");//occupation
-        sb.append(relationshipConversion(temp[7])+",");//relationship
-        sb.append(raceConversion(temp[8])+",");//race
-        sb.append(sexConversion(temp[9])+",");//sex
-        sb.append("");//capital-gain
-        sb.append("");//capital-loss
-        sb.append(hoursPerWeekConversion(temp[12])+",");//hours-per-wee:每十个小时一个区间
-        sb.append(nativeCountryConversion(temp[13])+",");//nativeCountry:只分为两种,美国和外国
-        sb.append(resultConversion(temp[14]));
-        return sb.toString();
-    }
-
-    private int ageConversion(String string) {
-        if (!string.contains("?")) {
-            int ageTemp = Integer.parseInt(string);
-            if (ageTemp<10) {
-                return 1;
-            } else if (ageTemp<20) {
-                return 2;
-            } else if (ageTemp<30) {
-                return 3;
-            } else if (ageTemp<40) {
-                return 4;
-            } else if (ageTemp<50) {
-                return 5;
-            } else if (ageTemp<60) {
-                return 6;
-            } else if (ageTemp<70) {
-                return 7;
-            } else if (ageTemp<80) {
-                return 8;
-            } else if (ageTemp<90) {
-                return 9;
-            } else {
-                return 10;
-            }
-        }
-        return 0;
-    }
-    private int workclassConversion(String string) {
-        if (!string.contains("?")) {
-            if (string.contains("Private")) {
-                return 1;
-            } else if (string.contains("Self-emp-not-inc")) {
-                return 2;
-            } else if (string.contains("Self-emp-inc")) {
-                return 3;
-            } else if (string.contains("Federal-gov")) {
-                return 4;
-            } else if (string.contains("Local-gov")) {
-                return 5;
-            } else if (string.contains("State-gov")) {
-                return 6;
-            } else if (string.contains("Without-pay")) {
-                return 7;
-            } else if (string.contains("Never-worked")) {
-                return 8;
-            }
-        }
-        return 0;
-    }
-
-    private int educationConversion(String string) {
-        if (!string.contains("?")) {
-            if (string.contains("Bachelors")) {
-                return 1;
-            } else if (string.contains("Some-college")) {
-                return 2;
-            } else if (string.contains("11th")) {
-                return 3;
-            } else if (string.contains("HS-grad")) {
-                return 4;
-            } else if (string.contains("Prof-school")) {
-                return 5;
-            } else if (string.contains("Assoc-acdm")) {
-                return 6;
-            } else if (string.contains("Assoc-voc")) {
-                return 7;
-            } else if (string.contains("9th")) {
-                return 8;
-            } else if (string.contains("7th-8th")) {
-                return 9;
-            } else if (string.contains("12th")) {
-                return 10;
-            } else if (string.contains("Masters")) {
-                return 11;
-            } else if (string.contains("1st-4th")) {
-                return 12;
-            } else if (string.contains("10th")) {
-                return 13;
-            } else if (string.contains("Doctorate")) {
-                return 14;
-            } else if (string.contains("5th-6th")) {
-                return 15;
-            } else if (string.contains("Preschool")) {
-                return 16;
-            }
-        }
-        return 0;
-    }
-
-    private int maritalStatusConversion(String string) {
-        if (!string.contains("?")) {
-            if (string.contains("Married-civ-spouse")) {
-                return 1;
-            } else if (string.contains("Divorced")) {
-                return 2;
-            } else if (string.contains("Never-married")) {
-                return 3;
-            } else if (string.contains("Separated")) {
-                return 4;
-            } else if (string.contains("Widowed")) {
-                return 5;
-            } else if (string.contains("Married-spouse-absent")) {
-                return 6;
-            } else if (string.contains("Married-AF-spouse")) {
-                return 7;
-            }
-        }
-        return 0;
-    }
-    //occupation: Tech-support, Craft-repair, Other-service, Sales, Exec-managerial,
-    //Prof-specialty, Handlers-cleaners, Machine-op-inspct, Adm-clerical, Farming-fishing,
-    //Transport-moving, Priv-house-serv, Protective-serv, Armed-Forces.
-
-    private int occupationConversion(String string) {
-        if (!string.contains("?")) {
-            if (string.contains("Tech-support")) {
-                return 1;
-            } else if (string.contains("Craft-repair")) {
-                return 2;
-            } else if (string.contains("Other-service")) {
-                return 3;
-            } else if (string.contains("Sales")) {
-                return 4;
-            } else if (string.contains("Exec-managerial")) {
-                return 5;
-            } else if (string.contains("Prof-specialty")) {
-                return 6;
-            } else if (string.contains("Handlers-cleaners")) {
-                return 7;
-            } else if (string.contains("Machine-op-inspct")) {
-                return 8;
-            } else if (string.contains("Adm-clerical")) {
-                return 9;
-            } else if (string.contains("Farming-fishing")) {
-                return 10;
-            } else if (string.contains("Transport-moving")) {
-                return 11;
-            } else if (string.contains("Priv-house-serv")) {
-                return 12;
-            } else if (string.contains("Protective-serv")) {
-                return 13;
-            } else if (string.contains("Armed-Forces")) {
-                return 14;
-            }
-        }
-        return 0;
-    }
-    //relationship: Wife, Own-child, Husband, Not-in-family, Other-relative, Unmarried.
-    private int relationshipConversion(String string) {
-        if (!string.contains("?")) {
-            if (string.contains("Wife")) {
-                return 1;
-            } else if (string.contains("Own-child")) {
-                return 2;
-            } else if (string.contains("Husband")) {
-                return 3;
-            } else if (string.contains("Not-in-family")) {
-                return 4;
-            } else if (string.contains("Other-relative")) {
-                return 5;
-            } else if (string.contains("Unmarried")) {
-                return 6;
-            }
-        }
-        return 0;
-    }
-    //	race: White, Asian-Pac-Islander, Amer-Indian-Eskimo, Other, Black.
-    private int raceConversion(String string) {
-        if (!string.contains("?")) {
-            if (string.contains("White")) {
-                return 1;
-            } else if (string.contains("Asian-Pac-Islander")) {
-                return 2;
-            } else if (string.contains("Amer-Indian-Eskimo")) {
-                return 3;
-            } else if (string.contains("Other")) {
-                return 4;
-            } else if (string.contains("Black")) {
-                return 5;
-            }
-        }
-        return 0;
-    }
-
-    private int sexConversion(String string) {
-        if (!string.contains("?")) {
-            if (string.contains("Female")) {
-                return 1;
-            } else if (string.contains("Male")) {
-                return 2;
-            }
-        }
-        return 0;
-    }
-    private int hoursPerWeekConversion(String string) {
-        if (!string.contains("?")) {
-            int workHourTemp = Integer.parseInt(string);
-            if (workHourTemp<10) {
-                return 1;
-            } else if (workHourTemp<20) {
-                return 2;
-            } else if (workHourTemp<30) {
-                return 3;
-            } else if (workHourTemp<40) {
-                return 4;
-            } else if (workHourTemp<50) {
-                return 5;
-            } else if (workHourTemp<60) {
-                return 6;
-            } else if (workHourTemp<70) {
-                return 7;
-            } else if (workHourTemp<80) {
-                return 8;
-            } else {
-                return 9;
-            }
-        }
-        return 0;
-    }
-    private int nativeCountryConversion(String string) {
-        if (!string.contains("?")) {
-            if (string.contains("United-States")) {
-                return 1;
-            } else {
-                return 0;
-            }
-        }
-        return 0;
-    }
-    private String resultConversion(String string) {
-        if (string.contains(">50K")) {
-            return "yes";
-        } else {
-            return "no";
-        }
-    }
-}

+ 0 - 47
sb/src/main/java/cn/reghao/tnb/sb/bayes/income/DecimalCalculator.java

@@ -1,47 +0,0 @@
-package cn.reghao.tnb.sb.bayes.income;
-
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-
-/**
- * @author reghao
- * @date 2025-08-25 11:31:54
- */
-public class DecimalCalculator {
-    public static double add(double v1, double v2) {
-        BigDecimal b1 = new BigDecimal(Double.toString(v1));
-        BigDecimal b2 = new BigDecimal(Double.toString(v2));
-        return b1.add(b2).doubleValue();
-    }
-
-    public static double subtract(double v1, double v2) {
-        BigDecimal b1 = new BigDecimal(Double.toString(v1));
-        BigDecimal b2 = new BigDecimal(Double.toString(v2));
-        return b1.subtract(b2).doubleValue();
-    }
-
-    public static double multiply(double v1, double v2) {
-        BigDecimal b1 = new BigDecimal(Double.toString(v1));
-        BigDecimal b2 = new BigDecimal(Double.toString(v2));
-        return b1.multiply(b2).doubleValue();
-    }
-
-    public static double divide(double v1, double v2) {
-        // 保留两位小数, 向上取整
-        int scale = 2;
-        RoundingMode roundingMode = RoundingMode.HALF_UP;
-
-        BigDecimal b1 = new BigDecimal(Double.toString(v1));
-        BigDecimal b2 = new BigDecimal(Double.toString(v2));
-        return b1.divide(b2, scale, roundingMode).doubleValue();
-    }
-
-    public static double divide(double v1, double v2, int scale) {
-        // 保留 scale 位小数, 向上取整
-        RoundingMode roundingMode = RoundingMode.HALF_UP;
-
-        BigDecimal b1 = new BigDecimal(Double.toString(v1));
-        BigDecimal b2 = new BigDecimal(Double.toString(v2));
-        return b1.divide(b2, scale, roundingMode).doubleValue();
-    }
-}

+ 0 - 21
sb/src/main/java/cn/reghao/tnb/sb/config/CustomHealthIndicator.java

@@ -1,21 +0,0 @@
-package cn.reghao.tnb.sb.config;
-
-import org.springframework.boot.actuate.health.AbstractHealthIndicator;
-import org.springframework.boot.actuate.health.Health;
-import org.springframework.stereotype.Component;
-
-/**
- * @author reghao
- * @date 2025-07-15 09:51:12
- */
-@Component
-public class CustomHealthIndicator extends AbstractHealthIndicator {
-    @Override
-    protected void doHealthCheck(Health.Builder builder) throws Exception {
-        // 使用 builder 来创建健康状态信息
-        // 如果 throw 一个 exception,那么 status 就会被置为 DOWN,异常信息会被记录
-        builder.up()
-                .withDetail("app", "health")
-                .withDetail("error", "Nothing, looks good");
-    }
-}

+ 0 - 55
sb/src/main/java/cn/reghao/tnb/sb/config/MyEndpoint.java

@@ -1,55 +0,0 @@
-package cn.reghao.tnb.sb.config;
-
-import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
-import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
-import org.springframework.boot.actuate.endpoint.annotation.Selector;
-import org.springframework.boot.actuate.endpoint.annotation.WriteOperation;
-import org.springframework.stereotype.Component;
-import org.springframework.util.StringUtils;
-
-import jakarta.annotation.Nullable;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author reghao
- * @date 2025-07-14 16:53:19
- */
-//@Endpoint(id="myEndpoint")
-//@Component
-public class MyEndpoint {
-    private String STATUS = "up";
-    private String DETAIL = "ok";
-
-    @ReadOperation
-    public Map<String, String> getStatus(){
-        Map<String, String> map = new HashMap<>();
-        map.put("status", STATUS);
-        map.put("detail", DETAIL);
-        return map;
-    }
-
-    @ReadOperation
-    public Map<String, String> getStatusByName(@Selector String name){
-        Map<String, String> map = new HashMap<>();
-        if ("status".equals(name)) {
-            map.put("status", STATUS);
-        } else if ("detail".equals(name)){
-            map.put("detail", DETAIL);
-        }
-
-        return map;
-    }
-
-    // 动态修改指标
-    @WriteOperation
-    public void updateStatus(@Selector String name, @Nullable String value){
-        if (!StringUtils.isEmpty(value)){
-            if ("status".equals(name)){
-                STATUS = value;
-            }else if ("detail".equals(name)){
-                DETAIL = value;
-            }
-        }
-    }
-}

+ 0 - 40
sb/src/main/java/cn/reghao/tnb/sb/config/SpringLifecycle.java

@@ -1,40 +0,0 @@
-package cn.reghao.tnb.sb.config;
-
-import cn.reghao.tnb.sb.config.jmx.SystemInfo;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.DisposableBean;
-import org.springframework.boot.ApplicationArguments;
-import org.springframework.boot.ApplicationRunner;
-import org.springframework.stereotype.Component;
-
-import javax.management.*;
-import java.lang.management.ManagementFactory;
-
-/**
- * @author reghao
- * @date 2022-03-23 09:22:01
- */
-@Slf4j
-@Component
-public class SpringLifecycle implements ApplicationRunner, DisposableBean {
-    @Override
-    public void run(ApplicationArguments args) throws Exception {
-        log.info("springboot started...");
-        registerJmxMBean();
-    }
-
-    private void registerJmxMBean() throws NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException, MalformedObjectNameException {
-        MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
-
-        // ObjectName 的规范是: 包名:type=接口名,name=MBean名
-        String name = "cn.reghao.tnb.sb.config.jmx:type=SystemInfoMBean,name=systemInfo";
-        ObjectName objectName = new ObjectName(name);
-        SystemInfo systemInfo = new SystemInfo();
-        mBeanServer.registerMBean(systemInfo, objectName);
-    }
-
-    @Override
-    public void destroy() {
-        log.info("springboot shutdown...");
-    }
-}

+ 0 - 59
sb/src/main/java/cn/reghao/tnb/sb/config/WebConfig.java

@@ -1,59 +0,0 @@
-package cn.reghao.tnb.sb.config;
-
-import org.apache.catalina.connector.Connector;
-import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.util.StringUtils;
-import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2021-11-14 14:31:02
- */
-@Configuration
-public class WebConfig implements WebMvcConfigurer {
-    @Override
-    public void addResourceHandlers(ResourceHandlerRegistry registry) {
-        registry.addResourceHandler("/img/**")
-                .addResourceLocations("classpath:/static/img/");
-    }
-
-    /**
-     * Tomcat 配置多端口启动
-     *
-     * @param
-     * @return
-     * @date 2025-06-09 14:48:24
-     */
-    //@Bean
-    public TomcatServletWebServerFactory getFactory() {
-        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
-        Connector[] connectors = this.connectors();
-        if (connectors != null && connectors.length > 0) {
-            tomcat.addAdditionalTomcatConnectors(connectors);
-        }
-        return tomcat;
-    }
-
-    private Connector[] connectors() {
-        String ports = "8081,8082,8083,8084";
-        if (StringUtils.isEmpty(ports)) {
-            return null;
-        }
-        String[] port = ports.split(",");
-        List<Connector> connectors = new ArrayList<>();
-        for (String s : port) {
-            Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
-            connector.setPort(Integer.parseInt(s));
-            connector.setScheme("http");
-            //connector.setRedirectPort(8041);
-            connectors.add(connector);
-        }
-        return connectors.toArray(new Connector[]{});
-    }
-}

+ 0 - 21
sb/src/main/java/cn/reghao/tnb/sb/config/jmx/SystemInfo.java

@@ -1,21 +0,0 @@
-package cn.reghao.tnb.sb.config.jmx;
-
-/**
- * @author reghao
- * @date 2025-07-14 17:20:19
- */
-public class SystemInfo implements SystemInfoMBean {
-    @Override
-    public int getCpuCore() {
-        return Runtime.getRuntime().availableProcessors();
-    }
-    @Override
-    public long getTotalMemory() {
-        return Runtime.getRuntime().totalMemory();
-    }
-
-    @Override
-    public void shutdown() {
-        System.exit(0);
-    }
-}

+ 0 - 11
sb/src/main/java/cn/reghao/tnb/sb/config/jmx/SystemInfoMBean.java

@@ -1,11 +0,0 @@
-package cn.reghao.tnb.sb.config.jmx;
-
-/**
- * @author reghao
- * @date 2025-07-14 17:19:32
- */
-public interface SystemInfoMBean {
-    int getCpuCore();
-    long getTotalMemory();
-    void shutdown();
-}

+ 0 - 101
sb/src/main/java/cn/reghao/tnb/sb/controller/IndexController.java

@@ -1,101 +0,0 @@
-package cn.reghao.tnb.sb.controller;
-
-import cn.reghao.jutil.jdk.web.result.WebResult;
-import cn.reghao.tnb.sb.model.AccountProofModel;
-import com.itextpdf.text.pdf.BaseFont;
-import freemarker.template.Configuration;
-import freemarker.template.Template;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.*;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.ModelMap;
-import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.multipart.MultipartFile;
-import org.xhtmlrenderer.pdf.ITextRenderer;
-
-import java.io.ByteArrayOutputStream;
-import java.nio.charset.StandardCharsets;
-import java.time.LocalDate;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Random;
-
-/**
- * @author reghao
- * @date 2025-05-28 15:40:56
- */
-@Slf4j
-@Controller
-public class IndexController {
-    private final Configuration configuration;
-    private Random r = new Random();
-
-    public IndexController(Configuration configuration) {
-        this.configuration = configuration;
-    }
-
-    @GetMapping("/pdf/preview")
-    public ResponseEntity<byte[]> pdfPreview(ModelMap model) {
-        AccountProofModel accountProofModel = new AccountProofModel.Builder()
-                .generationDate(LocalDate.now().toString())
-                .memberName("Nick Liu")
-                .memberAddress("Nanshan District, Shenzhen city, Guangdong Province")
-                .accountNo("88888888888888")
-                .bankName("ICBC")
-                .bankSwiftCode("ABCDEFG")
-                .bankAddress("Shenzhen city of Guangdong Province")
-                .countryName("China")
-                .build();
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try {
-            String templateName = "/pdfview.ftl";
-            // 不建议直接创建Template实例,开销比较大,可以直接通过Configuration实例获取,有缓存机制
-            Template template = configuration.getTemplate(templateName);
-            String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, accountProofModel);
-
-            ITextRenderer renderer = new ITextRenderer();
-            // 如果内容有中文则需要添加支持中文的字体
-            renderer.getFontResolver().addFont("/fonts/calibri.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
-            renderer.setDocumentFromString(content);
-            renderer.layout();
-            renderer.createPDF(baos);
-            renderer.finishPDF();
-        } catch (Exception e) {
-            log.error("fail to generate pdf: {} {}", e.getMessage(), e);
-            return ResponseEntity.internalServerError().body(null);
-        }
-
-        HttpHeaders respHeaders = new HttpHeaders();
-        respHeaders.setContentType(MediaType.APPLICATION_PDF);
-        respHeaders.setContentDisposition(ContentDisposition.inline().filename("accountProof.pdf", StandardCharsets.UTF_8).build());
-        return new ResponseEntity<>(baos.toByteArray(), respHeaders, HttpStatus.OK);
-    }
-
-    @PostMapping(value = "/file/upload", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ResponseBody
-    public String uploadFile(MultipartFile file) {
-        String url = "fileService.putFile(file)";
-        Map<String, String> map = new HashMap<>();
-        map.put("name", file.getOriginalFilename());
-        map.put("url", url);
-        return WebResult.success(map);
-    }
-
-    @GetMapping(value = "/index/get", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ResponseBody
-    public String getIndex() throws InterruptedException {
-        int value = 40;
-        System.out.printf("Thread-%s sleep %ss\n", Thread.currentThread().getName(), value);
-        Thread.sleep(value*1000L);
-
-        double v = r.nextGaussian() * Math.sqrt(10) + 53;
-        Map<String, Object> map = new HashMap<>();
-        map.put("value", v);
-        map.put("timestamp", System.currentTimeMillis());
-        return WebResult.success(map);
-    }
-}

+ 0 - 94
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/AutoBatis.java

@@ -1,94 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis;
-
-import cn.reghao.tnb.sb.util.RuntimeClass;
-import cn.reghao.tnb.sb.db.autobatis.mapper.MapperManager;
-import cn.reghao.tnb.sb.db.autobatis.table.Table;
-import cn.reghao.tnb.sb.db.autobatis.table.TableManager;
-import cn.reghao.tnb.sb.db.autobatis.table.ddl.DdlMapper;
-import org.apache.ibatis.session.SqlSession;
-import org.apache.ibatis.session.SqlSessionFactory;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author reghao
- * @date 2020-04-02 17:57:50
- */
-public class AutoBatis {
-    private final SqlSessionFactory sessionFactory;
-    private final TableManager tableManager;
-    private MapperManager mapperManager;
-    private RuntimeClass rtClass;
-
-    public AutoBatis(SqlSessionFactory sqlSessionFactory) {
-        this.sessionFactory = sqlSessionFactory;
-        this.tableManager = new TableManager();
-        sessionFactory.getConfiguration().addMapper(DdlMapper.class);
-    }
-
-    public AutoBatis(SqlSessionFactory sqlSessionFactory, String configPath, String mapperDir) {
-        this.sessionFactory = sqlSessionFactory;
-        this.tableManager = new TableManager();
-        this.mapperManager = new MapperManager();
-        this.rtClass = new RuntimeClass();
-        sessionFactory.getConfiguration().addMapper(DdlMapper.class);
-    }
-
-    private DdlMapper ddlMapper() {
-        sessionFactory.getConfiguration().addMapper(DdlMapper.class);
-        SqlSession sqlSession = sessionFactory.openSession();
-        return sqlSession.getMapper(DdlMapper.class);
-    }
-
-    /**
-     * 创建 POJO 对应的表
-     *
-     * @param
-     * @return
-     * @date 2020-04-09 下午3:10
-     */
-    public void createTable(Class pojo) {
-        Table table = tableManager.classToTable(pojo);
-        try (SqlSession sqlSession = sessionFactory.openSession()) {
-            DdlMapper ddlMapper = sqlSession.getMapper(DdlMapper.class);
-            ddlMapper.create(table);
-        }
-    }
-
-    public void createTables(String pojoPkg) {
-        List<Class> classes = rtClass.classesInPackage(pojoPkg);
-        List<Table> tables = classes.stream()
-                .map(tableManager::classToTable)
-                .collect(Collectors.toList());
-
-        try (SqlSession sqlSession = sessionFactory.openSession()) {
-            DdlMapper ddlMapper = sqlSession.getMapper(DdlMapper.class);
-            tables.forEach(ddlMapper::create);
-        }
-    }
-
-    /**
-     * 创建 mapper 接口对应的 xml 文件,并将 mapper 注册到 mybatis 配置文件
-     *
-     * @param
-     * @return
-     * @date 2020-04-09 下午5:29
-     */
-    public void createMapper(Class mapper) {
-        mapperManager.mapperProcessor(mapper);
-    }
-
-    public void createMappers(String mapperPkg) {
-        List<Class> mappers = rtClass.classesInPackage(mapperPkg);
-        mappers.forEach(mapperManager::mapperProcessor);
-    }
-
-    public static void main(String[] args) throws Exception {
-        MapperManager mapperManager = new MapperManager();
-
-        String mapperPkg = "cn.reghao.jtool.autobatis.test.mapper";
-        String mapperDir = "/home/reghao/code/aha/autobatis/src/main/resources/mapper";
-        mapperManager.generateMapperFile(mapperPkg,mapperDir);
-    }
-}

+ 0 - 46
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/StringUtil.java

@@ -1,46 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2021-08-10 15:50:46
- */
-public class StringUtil {
-    /**
-     * 将 aaaBbbCcc 格式转化为 aaa_bbb_ccc 格式
-     *
-     * @date 2020-04-02 下午8:39
-     */
-    public static String separateByUnderline(String str) {
-        List<String> list = new ArrayList<>();
-
-        char[] chars = str.toCharArray();
-        StringBuilder sb = new StringBuilder();
-        sb.append(chars[0]);
-
-        for (int i = 1; i < chars.length; i++) {
-            if (chars[i] > 96 && chars[i] < 123) {
-                // lower case
-                sb.append(chars[i]);
-            } else if (chars[i] > 64 && chars[i] < 91) {
-                list.add(sb.toString());
-                sb.delete(0, sb.length());
-                sb.append(chars[i]);
-            }
-        }
-        list.add(sb.toString());
-        sb.delete(0, sb.length());
-
-        if (list.size() == 1) {
-            return list.get(0).toLowerCase();
-        }
-
-        for (String s : list) {
-            sb.append(s.toLowerCase()).append("_");
-        }
-        sb.deleteCharAt(sb.lastIndexOf("_"));
-        return sb.toString();
-    }
-}

+ 0 - 16
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/MapperScan.java

@@ -1,16 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * @author reghao
- * @date 2020-04-03 09:34:41
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.METHOD})
-public @interface MapperScan {
-    String[] value();
-}

+ 0 - 16
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/PojoScan.java

@@ -1,16 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * @author reghao
- * @date 2020-04-03 09:34:41
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.METHOD})
-public @interface PojoScan {
-    String[] value();
-}

+ 0 - 19
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/field/Char.java

@@ -1,19 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.annotation.field;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * mysql char 类型
- *
- * @author reghao
- * @date 2020-04-02 21:17:52
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.FIELD})
-public @interface Char {
-    String name() default "char";
-    int value() default 255;
-}

+ 0 - 17
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/field/Datetime.java

@@ -1,17 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.annotation.field;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * mysql 时间日期类型
- *
- * @author reghao
- * @date 2019-12-06 12:39:25
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.FIELD})
-public @interface Datetime {
-}

+ 0 - 18
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/field/Mediumint.java

@@ -1,18 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.annotation.field;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * mysql mediumint 类型
- *
- * @author reghao
- * @date 2019-12-06 12:39:25
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.FIELD})
-public @interface Mediumint {
-    String name() default "mediumint";
-}

+ 0 - 18
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/field/Mediumtext.java

@@ -1,18 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.annotation.field;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * mysql mediumint 类型
- *
- * @author reghao
- * @date 2019-12-06 12:39:25
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.FIELD})
-public @interface Mediumtext {
-    String name() default "mediumtext";
-}

+ 0 - 17
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/field/TimeStamp.java

@@ -1,17 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.annotation.field;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * mysql 时间戳类型
- *
- * @author reghao
- * @date 2019-12-06 12:39:25
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.FIELD})
-public @interface TimeStamp {
-}

+ 0 - 17
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/field/Unique.java

@@ -1,17 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.annotation.field;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * UNIQUE 约束,一个 POJO 中只能指定一个字段为 UNIQUE
- *
- * @author reghao
- * @date 2019-12-06 12:39:25
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.FIELD})
-public @interface Unique {
-}

+ 0 - 17
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/field/Unsigned.java

@@ -1,17 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.annotation.field;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * 标识 MySQL 数值类型为无符号
- *
- * @author reghao
- * @date 2019-12-06 12:39:25
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.FIELD})
-public @interface Unsigned {
-}

+ 0 - 19
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/annotation/field/Varchar.java

@@ -1,19 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.annotation.field;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * mysql varchar 类型
- *
- * @author reghao
- * @date 2020-04-02 21:17:52
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.FIELD})
-public @interface Varchar {
-    String name() default "varchar";
-    int value() default 255;
-}

+ 0 - 163
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/MapperManager.java

@@ -1,163 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.mapper;
-
-import cn.reghao.tnb.sb.db.autobatis.mapper.crud.DeleteGenerator;
-import cn.reghao.tnb.sb.db.autobatis.mapper.crud.InsertGenerator;
-import cn.reghao.tnb.sb.db.autobatis.mapper.crud.SelectGenerator;
-import cn.reghao.tnb.sb.db.autobatis.mapper.crud.UpdateGenerator;
-import cn.reghao.tnb.sb.db.autobatis.mapper.element.BaseElement;
-import cn.reghao.tnb.sb.db.autobatis.mapper.element.ElementName;
-import cn.reghao.tnb.sb.db.autobatis.mapper.element.InsertElement;
-import cn.reghao.tnb.sb.db.autobatis.mapper.element.MyBatisMapper;
-import cn.reghao.tnb.sb.db.autobatis.StringUtil;
-import cn.reghao.tnb.sb.util.ClassUtil;
-import cn.reghao.tnb.sb.util.RuntimeClass;
-
-import java.io.File;
-import java.lang.reflect.Method;
-import java.lang.reflect.Parameter;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.*;
-
-/**
- * 1.扫描 mapper 接口
- * 2.解析 mapper 方法
- * 3.根据方法名字生成相应的内容
- * 4.添加内容并生成 mapper xml 文件
- * TODO 5.在 MyBatis 配置文件中注册 mapper 接口
- *
- * @author reghao
- * @date 2019-12-06 11:29:14
- */
-public class MapperManager {
-    // mybatis 配置文件
-    private final String mybatisConfig = "";
-    private RuntimeClass runtimeClass = new RuntimeClass();
-    private InsertGenerator insertGenerator = new InsertGenerator();
-    private UpdateGenerator updateGenerator = new UpdateGenerator();
-    private DeleteGenerator deleteGenerator = new DeleteGenerator();
-    private SelectGenerator selectGenerator = new SelectGenerator();
-
-    /**
-     * @param mapperPkg mapper 接口所在包
-     * @param mapperDir mapper xml 文件所在目录
-     * @return
-     * @date 2021-08-11 下午6:43
-     */
-    public void generateMapperFile(String mapperPkg, String mapperDir) {
-        List<Class> classList = runtimeClass.classesInPackage(mapperPkg);
-        classList.forEach(clazz -> {
-            try {
-                String mapper = ClassUtil.classname(clazz);
-                MyBatisMapper myBatisMapper = scanMapper(clazz);
-
-                // 生成 mapper 文件
-                String xmlPath = String.format("%s/%s.xml", mapperDir, mapper);
-                XmlGenerator.createMapperXml(myBatisMapper, new File(xmlPath));
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        });
-    }
-
-    /**
-     * 通过 mapper 接口生成 mapper 文件,并将 mapper 注册到 mybatis-config.xml
-     *
-     * @param clazz mapper 接口
-     * @date 2020-04-03 下午2:58
-     */
-    @Deprecated
-    public void mapperProcessor(Class clazz) {
-        String mapper = ClassUtil.classname(clazz);
-        try {
-            MyBatisMapper myBatisMapper = scanMapper(clazz);
-            String xmlPath = "mapperDir" + "/" + mapper + ".xml";
-            XmlGenerator.createMapperXml(myBatisMapper, new File(xmlPath));
-
-            /*File configXml = new File(mybatisConfig);
-            String value = xmlPath.split("/src/main/resources/")[1];
-            registerMapper(configXml, value);*/
-        } catch (Exception e) {
-            System.out.println("处理 mapper 接口时发生异常");
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * 扫描 mapper 接口中的 insert 方法
-     *
-     * @param
-     * @return
-     * @date 2020-04-07 上午10:34
-     */
-    private MyBatisMapper scanMapper(Class clazz) throws Exception {
-        if (!clazz.isInterface()) {
-            System.out.println(clazz.getName() + " 不是一个接口,忽略");
-        }
-
-        Method[] methods = clazz.getDeclaredMethods();
-        List<BaseElement> elements = new ArrayList<>();
-        // 将 mapper 接口中的方法解析为一个 MapperElement 对象
-        for (Method method : methods) {
-            String methodName = method.getName();
-            if (methodName.startsWith("insert")) {
-                Parameter[] params = method.getParameters();
-                if (params.length != 1) {
-                    throw new Exception("insert 方法的参数只能是一个...");
-                }
-
-                // 方法参数
-                Class paramClass;
-                Type type = method.getParameters()[0].getParameterizedType();
-                if (type instanceof ParameterizedType) {
-                    // 集合中的参数化类型
-                    ParameterizedType pt = (ParameterizedType) type;
-                    paramClass = (Class) pt.getActualTypeArguments()[0];
-                } else {
-                    paramClass = (Class) type;
-                }
-
-                String className = ClassUtil.classname(paramClass);
-                String tableName = StringUtil.separateByUnderline(className);
-                Map<String, String> map = ClassUtil.fieldAndTableName(paramClass);
-
-                Map<String, String> attributes = new LinkedHashMap<>();
-                attributes.put("id", methodName);
-                attributes.put("useGeneratedKeys", "true");
-                attributes.put("keyProperty", "id");
-
-                InsertElement insertElement = new InsertElement();
-                if (methodName.toLowerCase(Locale.ROOT).contains("batch")) {
-                    InsertElement foreachElement = new InsertElement();
-                    foreachElement.setName(ElementName.foreach);
-                    Map<String, String> childAttributes = new LinkedHashMap<>();
-                    // TODO 指定 list 或 set
-                    childAttributes.put("collection", "list");
-                    childAttributes.put("item", "item");
-                    childAttributes.put("index", "index");
-                    childAttributes.put("separator", ",");
-                    foreachElement.setAttributes(childAttributes);
-                    insertElement.setForeachElement(foreachElement);
-                    //continue;
-                }
-
-                insertElement.setName(ElementName.insert);
-                insertElement.setAttributes(attributes);
-                insertElement.setTableName(tableName);
-                insertElement.setClassFields(new ArrayList<>(map.keySet()));
-                insertElement.setTableFields(new ArrayList<>(map.values()));
-                insertGenerator.setElementContent(insertElement);
-                elements.add(insertElement);
-            }
-        }
-
-        return new MyBatisMapper(clazz.getName(), elements);
-    }
-
-    private void registerMapper(File configXml, String value) throws Exception {
-        String parent = "mappers";
-        String element = "mapper";
-        String attribute = "resource";
-        XmlGenerator.registerMapper(configXml, parent, element, attribute, value);
-    }
-}

+ 0 - 107
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/XmlGenerator.java

@@ -1,107 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.mapper;
-
-import cn.reghao.tnb.sb.db.autobatis.mapper.element.InsertElement;
-import cn.reghao.tnb.sb.db.autobatis.mapper.element.MyBatisMapper;
-import org.dom4j.Attribute;
-import org.dom4j.Document;
-import org.dom4j.DocumentHelper;
-import org.dom4j.Element;
-import org.dom4j.io.OutputFormat;
-import org.dom4j.io.SAXReader;
-import org.dom4j.io.XMLWriter;
-import org.dom4j.tree.DefaultAttribute;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * @author reghao
- * @date 2020-04-03 17:04:51
- */
-public class XmlGenerator {
-    /**
-     * 创建 MyBatis mapper xml 文件
-     *
-     * @param
-     * @return
-     * @date 2020-04-03 下午10:10
-     */
-    public static void createMapperXml(MyBatisMapper myBatisMapper, File xmlFile) throws Exception {
-        if (xmlFile.exists()) {
-            return;
-        }
-
-        Document document = DocumentHelper.createDocument();
-        document.addDocType("mapper",
-                "-//mybatis.org//DTD Mapper 3.0//EN",
-                "http://mybatis.org/dtd/mybatis-3-mapper.dtd");
-
-        Element mapper = document.addElement("mapper")
-                .addAttribute("namespace", myBatisMapper.getNamespace());
-        myBatisMapper.getElements().forEach(element -> {
-            Element tmp = mapper.addElement(element.getName().name());
-            element.getAttributes().forEach(tmp::addAttribute);
-            element.getContent().forEach(tmp::addText);
-
-            if (element instanceof InsertElement) {
-                InsertElement insertElement = (InsertElement) element;
-                InsertElement foreachElement = insertElement.getForeachElement();
-                if (foreachElement != null) {
-                    Element tmp1 = tmp.addElement(foreachElement.getName().name());
-                    foreachElement.getAttributes().forEach(tmp1::addAttribute);
-                    foreachElement.getContent().forEach(tmp1::addText);
-                }
-            }
-        });
-
-        OutputFormat outputFormat = new OutputFormat();
-        outputFormat.setIndent(true);
-        outputFormat.setIndentSize(4);
-        outputFormat.setNewlines(true);
-        outputFormat.setPadText(true);
-
-        XMLWriter writer = new XMLWriter(new FileWriter(xmlFile), outputFormat);
-        writer.write(document);
-        writer.flush();
-        writer.close();
-    }
-
-    /**
-     * 在 mybatis config 中注册 mapper 接口
-     *
-     * @param parent 父节点
-     * @param element 待添加的子节点
-     * @param attribute 子节点的属性
-     * @param value 子节点的属性值
-     *
-     * @date 2020-04-03 下午5:20
-     */
-    public static void registerMapper(File xmlFile, String parent, String element, String attribute, String value)
-            throws Exception {
-        SAXReader reader = new SAXReader();
-        Document document = reader.read(xmlFile);
-        Element parentNode = document.getRootElement().element(parent);
-
-        Set<String> attributeValues = new HashSet<>();
-        parentNode.elements().forEach(element1 -> {
-            String attrValue = element1.attribute(attribute).getValue();
-            attributeValues.add(attrValue.substring(attrValue.lastIndexOf("/")));
-        });
-
-        // 若 mapper 已注册则不处理
-        if (attributeValues.contains(value.substring(value.lastIndexOf("/")))) {
-            return;
-        }
-
-        Element newElement = parentNode.addElement(element);
-        Attribute attr = new DefaultAttribute(attribute, value);
-        newElement.add(attr);
-
-        XMLWriter writer = new XMLWriter(new FileWriter(xmlFile));
-        writer.write(document);
-        writer.flush();
-        writer.close();
-    }
-}

+ 0 - 16
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/crud/DeleteGenerator.java

@@ -1,16 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.mapper.crud;
-
-import cn.reghao.tnb.sb.db.autobatis.mapper.element.BaseElement;
-import cn.reghao.tnb.sb.db.autobatis.mapper.element.ContentGenerator;
-
-/**
- * 创建 insert sql
- *
- * @author reghao
- * @date 2020-04-03 22:17:59
- */
-public class DeleteGenerator implements ContentGenerator {
-    @Override
-    public void setElementContent(BaseElement element) throws Exception {
-    }
-}

+ 0 - 114
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/crud/InsertGenerator.java

@@ -1,114 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.mapper.crud;
-
-import cn.reghao.tnb.sb.db.autobatis.mapper.element.BaseElement;
-import cn.reghao.tnb.sb.db.autobatis.mapper.element.ContentGenerator;
-import cn.reghao.tnb.sb.db.autobatis.mapper.element.InsertElement;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 创建 insert sql
- *
- * @author reghao
- * @date 2020-04-03 22:17:59
- */
-public class InsertGenerator implements ContentGenerator {
-    @Override
-    public void setElementContent(BaseElement element) throws Exception {
-        if (!(element instanceof InsertElement)) {
-            throw new Exception("类型不是 InsertElement");
-        }
-
-        InsertElement insertElement = (InsertElement) element;
-        List<String> content = insertContent(insertElement);
-
-        List<String> classFields = insertElement.getClassFields();
-        InsertElement foreachElement = insertElement.getForeachElement();
-        if (foreachElement != null) {
-            // values 语句
-            content.add("        values ");
-            foreachElement.setContent(writeForeachClassFields(classFields));
-        } else {
-            // values 语句
-            content.add("        " + String.format("values %s", System.lineSeparator()));
-            // 写入类字段
-            content.add("        " + writeClassFields(classFields) + System.lineSeparator());
-        }
-        insertElement.setContent(content);
-    }
-
-    private List<String> insertContent(InsertElement insertElement) {
-        List<String> tableFields = insertElement.getTableFields();
-        List<String> classFields = insertElement.getClassFields();
-        List<String> content = new ArrayList<>();
-        // insert 语句
-        content.add(String.format("%s        insert ignore into %s %s",
-                System.lineSeparator(), insertElement.getTableName(), System.lineSeparator()));
-        // 表字段
-        content.add("        " + writeTableFields(tableFields) + System.lineSeparator());
-        // values 语句
-        //content.add("        " + String.format("values %s", System.lineSeparator()));
-        // 类字段
-        //content.add("        " + writeClassFields(classFields) + System.lineSeparator());
-        return content;
-    }
-
-    /**
-     * 插入表字段
-     *
-     * @param
-     * @return
-     * @date 2021-08-10 下午4:00
-     */
-    private String writeTableFields(List<String> tableFields) {
-        StringBuffer sb = new StringBuffer();
-        sb.append("(");
-        tableFields.forEach(field -> {
-            sb.append("`").append(field).append("`,");
-        });
-        sb.append(") ");
-        return sb.toString();
-    }
-
-    /**
-     * 插入类字段
-     *
-     * @param
-     * @return
-     * @date 2021-08-10 下午4:01
-     */
-    private String writeClassFields(List<String> classFields) {
-        StringBuffer sb = new StringBuffer();
-        sb.append("(");
-        classFields.forEach(field -> {
-            sb.append("#{").append(field).append("},");
-        });
-        sb.append(") ");
-        return sb.toString();
-    }
-
-    /**
-     * foreach 标签中的类字段
-     *
-     * @param
-     * @return
-     * @date 2021-08-11 下午5:04
-     */
-    private List<String> writeForeachClassFields(List<String> classFields) {
-        List<String> list = new ArrayList<>();
-        String item = "item";
-        StringBuilder sb = new StringBuilder();
-        sb.append(System.lineSeparator());
-        sb.append("            (");
-        int i = 0;
-        for (; i < classFields.size()-1; i++) {
-            sb.append("#{").append(item).append(".").append(classFields.get(i)).append("},");
-        }
-        sb.append("#{").append(item).append(".").append(classFields.get(i)).append("})");
-        sb.append(System.lineSeparator());
-
-        list.add(sb.toString());
-        return list;
-    }
-}

+ 0 - 16
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/crud/SelectGenerator.java

@@ -1,16 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.mapper.crud;
-
-import cn.reghao.tnb.sb.db.autobatis.mapper.element.BaseElement;
-import cn.reghao.tnb.sb.db.autobatis.mapper.element.ContentGenerator;
-
-/**
- * 创建 insert sql
- *
- * @author reghao
- * @date 2020-04-03 22:17:59
- */
-public class SelectGenerator implements ContentGenerator {
-    @Override
-    public void setElementContent(BaseElement element) throws Exception {
-    }
-}

+ 0 - 16
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/crud/UpdateGenerator.java

@@ -1,16 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.mapper.crud;
-
-import cn.reghao.tnb.sb.db.autobatis.mapper.element.BaseElement;
-import cn.reghao.tnb.sb.db.autobatis.mapper.element.ContentGenerator;
-
-/**
- * 创建 insert sql
- *
- * @author reghao
- * @date 2020-04-03 22:17:59
- */
-public class UpdateGenerator implements ContentGenerator {
-    @Override
-    public void setElementContent(BaseElement element) throws Exception {
-    }
-}

+ 0 - 20
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/element/BaseElement.java

@@ -1,20 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.mapper.element;
-
-import lombok.Data;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author reghao
- * @date 2021-08-11 13:30:54
- */
-@Data
-public class BaseElement {
-    // 标签名字
-    private ElementName name;
-    // 标签属性
-    private Map<String, String> attributes;
-    private String tableName;
-    private List<String> content;
-}

+ 0 - 9
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/element/ContentGenerator.java

@@ -1,9 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.mapper.element;
-
-/**
- * @author reghao
- * @date 2021-08-11 14:24:41
- */
-public interface ContentGenerator {
-    void setElementContent(BaseElement element) throws Exception;
-}

+ 0 - 11
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/element/ElementName.java

@@ -1,11 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.mapper.element;
-
-/**
- * mapper 元素名字
- *
- * @author reghao
- * @date 2020-04-03 10:35:46
- */
-public enum ElementName {
-    insert, update, delete, select, foreach
-}

+ 0 - 18
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/element/InsertElement.java

@@ -1,18 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.mapper.element;
-
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2021-08-11 13:30:54
- */
-@Data
-public class InsertElement extends BaseElement {
-    // 表字段
-    private List<String> tableFields;
-    // 类字段
-    private List<String> classFields;
-    private InsertElement foreachElement;
-}

+ 0 - 22
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/mapper/element/MyBatisMapper.java

@@ -1,22 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.mapper.element;
-
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * MyBatis mapper xml 文件
- *
- * @author reghao
- * @date 2020-04-03 10:30:57
- */
-@Data
-public class MyBatisMapper {
-    private String namespace;
-    private List<BaseElement> elements;
-
-    public MyBatisMapper(String namespace, List<BaseElement> elements) {
-        this.namespace = namespace;
-        this.elements = elements;
-    }
-}

+ 0 - 13
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/table/FieldType.java

@@ -1,13 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.table;
-
-/**
- * @author reghao
- * @date 2020-04-02 22:59:31
- */
-public enum FieldType {
-    numeric,
-    unsigned_numeric,
-    string,
-    timestamp,
-    datetime
-}

+ 0 - 74
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/table/SqlGenerator.java

@@ -1,74 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.table;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2020-04-03 09:22:13
- */
-public class SqlGenerator {
-    public String copyTableSql(String srcTable, String destTable) {
-        String sql = String.format("create table %s like %s", destTable, srcTable);
-        return sql;
-    }
-
-    public String createSql(Table table) {
-        String tableName = table.getName();
-        String sqlSnippets = assembleSql(table.getTableFields());
-
-        String line1 = "CREATE TABLE `" + tableName + "`  (\n";
-        String line2 = "`id` int NOT NULL AUTO_INCREMENT,\n";
-        //String line3 = "`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,\n";
-        String line4 = "PRIMARY KEY (`id`) USING BTREE\n";
-        String end = ") ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n";
-
-        String uniqueLine;
-        if (table.getUniqueKey() != null) {
-            uniqueLine = "UNIQUE KEY (`" + table.getUniqueKey() + "`) USING BTREE,\n";
-            //return line1 + line2 + sqlSnippets + line3 + uniqueLine + line4 + end;
-            return line1 + line2 + sqlSnippets + uniqueLine + line4 + end;
-        } else {
-            //return line1 + line2 + sqlSnippets + line3 + line4 + end;
-            return line1 + line2 + sqlSnippets + line4 + end;
-        }
-    }
-
-    private String assembleSql(List<TableField> tableFields) {
-        // 所有字段都是 NOT NULL,且不指定默认值
-        String unsignedNumeric = "`{FIELD}` {TYPE} UNSIGNED NOT NULL DEFAULT 0,\n";
-        String numeric = "`{FIELD}` {TYPE} NOT NULL DEFAULT 0,\n";
-        String string = "`{FIELD}` {TYPE} NOT NULL DEFAULT \"\",\n";
-        String timestamp = "`{FIELD}` {TYPE} NOT NULL DEFAULT CURRENT_TIMESTAMP,\n";
-
-        StringBuilder sb = new StringBuilder();
-        tableFields.forEach(field -> {
-            String fieldName = field.getName();
-            String fieldType = field.getSqlType();
-            switch (field.getType()) {
-                case numeric:
-                    sb.append(numeric.replace("{FIELD}", fieldName).replace("{TYPE}", fieldType));
-                    break;
-                case unsigned_numeric:
-                    sb.append(unsignedNumeric.replace("{FIELD}", fieldName).replace("{TYPE}", fieldType));
-                    break;
-                case string:
-                    sb.append(string.replace("{FIELD}", fieldName).replace("{TYPE}", fieldType));
-                    break;
-                case timestamp:
-                    sb.append(timestamp.replace("{FIELD}", fieldName).replace("{TYPE}", fieldType));
-                    break;
-                default:
-            }
-        });
-
-        return sb.toString();
-    }
-
-    public String truncateSql(String table) {
-        return "truncate table " + table;
-    }
-
-    public String dropSql(String table) {
-        return "drop table " + table;
-    }
-}

+ 0 - 43
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/table/Table.java

@@ -1,43 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.table;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2020-04-02 22:29:08
- */
-public class Table {
-    private String name;
-    private String uniqueKey;
-    private List<TableField> tableFields;
-
-    public Table(String name, String uniqueKey, List<TableField> tableFields) {
-        this.name = name;
-        this.uniqueKey = uniqueKey;
-        this.tableFields = tableFields;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getUniqueKey() {
-        return uniqueKey;
-    }
-
-    public void setUniqueKey(String uniqueKey) {
-        this.uniqueKey = uniqueKey;
-    }
-
-    public List<TableField> getTableFields() {
-        return tableFields;
-    }
-
-    public void setTableFields(List<TableField> tableFields) {
-        this.tableFields = tableFields;
-    }
-}

+ 0 - 41
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/table/TableField.java

@@ -1,41 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.table;
-
-/**
- * @author reghao
- * @date 2020-04-02 22:43:12
- */
-public class TableField {
-    private FieldType type;
-    private String name;
-    private String sqlType;
-
-    public TableField(FieldType type, String name, String sqlType) {
-        this.type = type;
-        this.name = name;
-        this.sqlType = sqlType;
-    }
-
-    public FieldType getType() {
-        return type;
-    }
-
-    public void setType(FieldType type) {
-        this.type = type;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getSqlType() {
-        return sqlType;
-    }
-
-    public void setSqlType(String sqlType) {
-        this.sqlType = sqlType;
-    }
-}

+ 0 - 156
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/table/TableManager.java

@@ -1,156 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.table;
-
-import cn.reghao.tnb.sb.db.autobatis.annotation.field.*;
-import cn.reghao.tnb.sb.db.autobatis.StringUtil;
-import cn.reghao.tnb.sb.util.ClassUtil;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * MyBatis 表自动化管理工具
- *
- * @author reghao
- * @date 2019-11-28 09:38:18
- */
-public class TableManager {
-    private static Map<String, String> typeMap = new HashMap<>();
-
-    static {
-        // 数值类型
-        typeMap.put("boolean", "tinyint(1)");
-        typeMap.put("short", "smallint");
-        typeMap.put("int", "int");
-        typeMap.put("long", "bigint");
-        typeMap.put("double", "decimal");
-        typeMap.put("java.lang.Boolean", "tinyint(1)");
-        typeMap.put("java.lang.Short", "int");
-        typeMap.put("java.lang.Integer", "int");
-        typeMap.put("java.lang.Long", "bigint");
-        typeMap.put("java.lang.Double", "decimal");
-        // 字符串类型
-        typeMap.put("java.lang.String", "varchar");
-        // 日期类型
-        typeMap.put("java.sql.Timestamp", "timestamp");
-    }
-
-    /**
-     * 类转换为表结构
-     *
-     * @param
-     * @return
-     * @date 2020-04-02 下午10:26
-     */
-    public Table classToTable(Class clazz) {
-        String classname = ClassUtil.classname(clazz);
-        String tableName = StringUtil.separateByUnderline(classname);
-        String uniqueKey = null;
-
-        List<TableField> tableFields = new ArrayList<>();
-        Field[] fields = clazz.getDeclaredFields();
-        List<Field> list = new ArrayList<>();
-        list.addAll(Arrays.asList(fields));
-        list.addAll(superClassFields(clazz));
-
-        for (Field field : list) {
-            String fieldName = StringUtil.separateByUnderline(field.getName());
-            String typeName = field.getType().getName();
-
-            Unique unique = field.getAnnotation(Unique.class);
-            if (unique != null) {
-                uniqueKey = fieldName;
-            }
-
-            Mediumint mediumint = field.getAnnotation(Mediumint.class);
-            Char char1 = field.getAnnotation(Char.class);
-            Varchar varchar = field.getAnnotation(Varchar.class);
-            Mediumtext mediumtext = field.getAnnotation(Mediumtext.class);
-            TimeStamp timestamp = field.getAnnotation(TimeStamp.class);
-            if (mediumint != null) {
-                String type = mediumint.name();
-                tableFields.add(new TableField(FieldType.numeric, fieldName, type));
-            } else if (char1 != null) {
-                int len = char1.value();
-                String type = char1.name() + "(" + len + ")";
-                tableFields.add(new TableField(FieldType.string, fieldName, type));
-            } else if (varchar != null) {
-                int len = varchar.value();
-                String type = typeMap.get(typeName) + "(" + len + ")";
-                tableFields.add(new TableField(FieldType.string, fieldName, type));
-            } else if (mediumtext != null) {
-                String type = mediumtext.name();
-                tableFields.add(new TableField(FieldType.string, fieldName, type));
-            } else if (timestamp != null) {
-                String type = typeMap.get(typeName);
-                tableFields.add(new TableField(FieldType.timestamp, fieldName, type));
-            } else {
-                tableFields.add(new TableField(FieldType.numeric, fieldName, typeMap.get(typeName)));
-            }
-        }
-
-        return new Table(tableName, uniqueKey, tableFields);
-    }
-
-    /**
-     * 父类的字段
-     *
-     * @param
-     * @return
-     * @date 2020-04-17 下午3:21
-     */
-    private List<Field> superClassFields(Class clazz) {
-        Class superClass = clazz.getSuperclass();
-        return Arrays.stream(superClass.getDeclaredFields())
-                .filter(field -> field.getModifiers() == Modifier.PROTECTED)
-                .collect(Collectors.toList());
-    }
-
-    public String tableName(Class clazz) {
-        String classname = ClassUtil.classname(clazz);
-        return StringUtil.separateByUnderline(classname);
-    }
-
-    /**
-     * 表字段
-     *
-     * @param
-     * @return
-     * @date 2020-04-03 下午2:02
-     */
-    public List<String> tableFields(Class clazz) {
-        Field[] fields = clazz.getDeclaredFields();
-        List<Field> list = new ArrayList<>();
-        list.addAll(Arrays.asList(fields));
-        list.addAll(superClassFields(clazz));
-
-        List<String> list1 = new ArrayList<>();
-        for (Field field : list) {
-            list1.add(StringUtil.separateByUnderline(field.getName()));
-        }
-
-        return list1;
-    }
-
-    /**
-     * 类字段
-     *
-     * @param
-     * @return
-     * @date 2020-04-03 下午2:02
-     */
-    public List<String> classFields(Class clazz) {
-        Field[] fields = clazz.getDeclaredFields();
-        List<Field> list = new ArrayList<>();
-        list.addAll(Arrays.asList(fields));
-        list.addAll(superClassFields(clazz));
-
-        List<String> list1 = new ArrayList<>();
-        for (Field field : list) {
-            list1.add(field.getName());
-        }
-
-        return list1;
-    }
-}

+ 0 - 25
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/table/ddl/DdlMapper.java

@@ -1,25 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.table.ddl;
-
-import cn.reghao.tnb.sb.db.autobatis.table.Table;
-import org.apache.ibatis.annotations.UpdateProvider;
-
-/**
- * @author reghao
- * @date 2019-11-28 09:10:52
- */
-public interface DdlMapper {
-    @UpdateProvider(type = DdlProvider.class, method = "createDatabase")
-    void createDatabase(String db);
-
-    @UpdateProvider(type = DdlProvider.class, method = "copyTableSql")
-    void copyTable(String srcTable, String destTable);
-
-    @UpdateProvider(type = DdlProvider.class, method = "createSql")
-    void create(Table table);
-
-    @UpdateProvider(type = DdlProvider.class, method = "truncateSql")
-    void truncate(String table);
-
-    @UpdateProvider(type = DdlProvider.class, method = "dropSql")
-    void drop(String table);
-}

+ 0 - 36
sb/src/main/java/cn/reghao/tnb/sb/db/autobatis/table/ddl/DdlProvider.java

@@ -1,36 +0,0 @@
-package cn.reghao.tnb.sb.db.autobatis.table.ddl;
-
-import cn.reghao.tnb.sb.db.autobatis.table.SqlGenerator;
-import cn.reghao.tnb.sb.db.autobatis.table.Table;
-
-/**
- * DDL SQL 语句
- *
- * @author reghao
- * @date 2020-04-03 01:19:45
- */
-public class DdlProvider {
-    private final SqlGenerator sqlGenerator = new SqlGenerator();
-
-    public String createDatabase(String db) {
-        String charset = "utf8mb4";
-        String collate = "utf8mb4_general_ci";
-        return String.format("create database if not exists %s default charset %s collate %s", db, charset, collate);
-    }
-
-    public String copyTableSql(String srcTable, String destTable) {
-        return String.format("create table %s like %s", destTable, srcTable);
-    }
-
-    public String createSql(Table table) {
-        return sqlGenerator.createSql(table);
-    }
-
-    public String truncateSql(String table) {
-        return sqlGenerator.truncateSql(table);
-    }
-
-    public String dropSql(String table) {
-        return sqlGenerator.dropSql(table);
-    }
-}

+ 0 - 31
sb/src/main/java/cn/reghao/tnb/sb/db/hibernate/HibernateDemo.java

@@ -1,31 +0,0 @@
-package cn.reghao.tnb.sb.db.hibernate;
-
-import org.hibernate.Session;
-import org.hibernate.SessionFactory;
-import org.hibernate.Transaction;
-import org.hibernate.cfg.Configuration;
-
-/**
- * @author reghao
- * @date 2023-04-13 15:50:31
- */
-public class HibernateDemo {
-    public static void main(String[] args) {
-        User user = new User("zhangsan", 1);
-
-        Configuration configuration = new Configuration();
-        configuration.configure("/hibernate.cfg.xml")
-                .addAnnotatedClass(User.class);
-
-        SessionFactory sessionFactory = configuration.buildSessionFactory();
-        // 打开Session
-        Session session = sessionFactory.openSession();
-        // 开始一个事务
-        Transaction trans = session.beginTransaction();
-        // 持久化操作
-        session.save(user);
-        // 提交事务
-        trans.commit();
-        // 关闭Session
-    }
-}

+ 0 - 37
sb/src/main/java/cn/reghao/tnb/sb/db/hibernate/User.java

@@ -1,37 +0,0 @@
-package cn.reghao.tnb.sb.db.hibernate;
-
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-import jakarta.persistence.*;
-import java.io.Serializable;
-
-/**
- * @author reghao
- * @date 2023-04-13 16:00:57
- */
-@NoArgsConstructor
-@Setter
-@Getter
-@Entity
-@Table(name="z_user")
-public class User implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    @Id
-    @GeneratedValue(strategy=GenerationType.IDENTITY)
-    @Column(name = "id", insertable = false, updatable = false)
-    private Integer id;
-
-    @Column(name = "username")
-    private String username;
-    @Column(name = "gender")
-    private Integer gender;
-
-    public User(String username, int gender) {
-        this.id = 1;
-        this.username = "reghao";
-        this.gender = 1;
-    }
-}

+ 0 - 164
sb/src/main/java/cn/reghao/tnb/sb/db/mongo/MongoClientUtil.java

@@ -1,164 +0,0 @@
-package cn.reghao.tnb.sb.db.mongo;
-
-import cn.reghao.jutil.jdk.serializer.JsonConverter;
-import cn.reghao.tnb.sb.db.mongo.model.UserComment;
-import com.mongodb.BasicDBObject;
-import com.mongodb.MongoClientSettings;
-import com.mongodb.MongoCredential;
-import com.mongodb.ServerAddress;
-import com.mongodb.client.*;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-import org.bson.json.JsonMode;
-import org.bson.json.JsonWriterSettings;
-import org.springframework.stereotype.Component;
-
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author reghao
- * @date 2024-12-08 14:32:04
- */
-//@Component
-public class MongoClientUtil {
-    private final JsonWriterSettings settings = JsonWriterSettings.builder().outputMode(JsonMode.RELAXED).build();
-
-    public void mongo() {
-        String host = "127.0.0.1";
-        String authDB = "admin";
-        String username = "dev";
-        String password = "Dev@123456";
-
-        ServerAddress serverAddress = new ServerAddress(host);
-        MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
-                .applyToSocketSettings(builder ->
-                        builder.readTimeout(0, TimeUnit.SECONDS)
-                                .connectTimeout(0, TimeUnit.SECONDS))
-                .applyToConnectionPoolSettings(builder ->
-                        builder.minSize(10).maxSize(20)
-                                .maxConnectionIdleTime(0, TimeUnit.SECONDS)
-                                .maxConnectionLifeTime(0, TimeUnit.SECONDS))
-                .credential(MongoCredential.createCredential(username, authDB, password.toCharArray()))
-                .applyToServerSettings(builder ->
-                        builder.minHeartbeatFrequency(10, TimeUnit.SECONDS)
-                                .heartbeatFrequency(20, TimeUnit.SECONDS))
-                .applyToClusterSettings(builder -> builder.hosts(List.of(serverAddress)))
-                .build();
-
-        MongoClient mongoClient = MongoClients.create(mongoClientSettings);
-        JsonWriterSettings settings = JsonWriterSettings.builder().outputMode(JsonMode.RELAXED).build();
-
-        MongoDatabase db = mongoClient.getDatabase("tnb_content_tdb");
-        MongoCollection<Document> videoCol = db.getCollection("UserComment");
-
-        BasicDBObject query = new BasicDBObject();
-        String videoId = "123456";
-        query.put("commentId", videoId);
-
-        Document document = videoCol.find(query).first();
-        if (document == null) {
-            return;
-        }
-
-        document.remove("createTime");
-        document.remove("updateTime");
-
-        String jsonData = document.toJson(settings);
-        UserComment userComment = JsonConverter.jsonToObject(jsonData, UserComment.class);
-    }
-
-    private MongoDatabase getMongoDatabase(String dbName) {
-        String host = "127.0.0.1";
-        String authDB = "admin";
-        String username = "dev";
-        String password = "Dev@123456";
-
-        ServerAddress serverAddress = new ServerAddress(host);
-        MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
-                .applyToSocketSettings(builder ->
-                        builder.readTimeout(0, TimeUnit.SECONDS)
-                                .connectTimeout(0, TimeUnit.SECONDS))
-                .applyToConnectionPoolSettings(builder ->
-                        builder.minSize(10).maxSize(20)
-                                .maxConnectionIdleTime(0, TimeUnit.SECONDS)
-                                .maxConnectionLifeTime(0, TimeUnit.SECONDS))
-                .credential(MongoCredential.createCredential(username, authDB, password.toCharArray()))
-                //.applicationName("SpiderParser")
-                .applyToServerSettings(builder ->
-                        builder.minHeartbeatFrequency(10, TimeUnit.SECONDS)
-                                .heartbeatFrequency(20, TimeUnit.SECONDS))
-                .applyToClusterSettings(builder -> builder.hosts(List.of(serverAddress)))
-                .build();
-
-        MongoClient mongoClient = MongoClients.create(mongoClientSettings);
-        return mongoClient.getDatabase(dbName);
-    }
-
-    public MongoCollection<Document> getCollection(String colName) {
-        String host = "127.0.0.1";
-        String authDB = "admin";
-        String username = "dev";
-        String password = "Dev@123456";
-
-        ServerAddress serverAddress = new ServerAddress(host);
-        MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
-                .applyToSocketSettings(builder ->
-                        builder.readTimeout(0, TimeUnit.SECONDS)
-                                .connectTimeout(0, TimeUnit.SECONDS))
-                .applyToConnectionPoolSettings(builder ->
-                        builder.minSize(10).maxSize(20)
-                                .maxConnectionIdleTime(0, TimeUnit.SECONDS)
-                                .maxConnectionLifeTime(0, TimeUnit.SECONDS))
-                .credential(MongoCredential.createCredential(username, authDB, password.toCharArray()))
-                //.applicationName("SpiderParser")
-                .applyToServerSettings(builder ->
-                        builder.minHeartbeatFrequency(10, TimeUnit.SECONDS)
-                                .heartbeatFrequency(20, TimeUnit.SECONDS))
-                .applyToClusterSettings(builder -> builder.hosts(List.of(serverAddress)))
-                .build();
-
-        MongoClient mongoClient = MongoClients.create(mongoClientSettings);
-        MongoDatabase db = mongoClient.getDatabase("tnb_content_tdb");
-        return db.getCollection(colName);
-    }
-
-    public UserComment getVideoUser(String videoId, MongoCollection<Document> videoCol) {
-        BasicDBObject query = new BasicDBObject();
-        query.put("bvId", videoId);
-        query.put("feedVideo", false);
-
-        Document document = videoCol.find(query).first();
-        if (document == null) {
-            return null;
-        }
-
-        Object object = document.get("biliUser");
-        if (object instanceof Document) {
-            Document user = (Document) object;
-            user.remove("createTime");
-            user.remove("updateTime");
-
-            String jsonData = user.toJson(settings);
-            return JsonConverter.jsonToObject(jsonData, UserComment.class);
-        }
-
-        return null;
-    }
-
-    public void updateVideo(String videoId, MongoCollection<Document> videoCol) {
-        BasicDBObject filter = new BasicDBObject();
-        filter.put("bvId", videoId);
-        Bson update = new Document("$set", new Document().append("feedVideo", true));
-        videoCol.updateOne(filter, update);
-    }
-
-    private void findAll(BasicDBObject query, MongoCollection<Document> videoCol) {
-        //MongoCursor<Document> cursor = videoCol.find(query).sort(Sorts.orderBy(Sorts.descending("times"))).skip(0).limit(10).iterator();
-        MongoCursor<Document> cursor = videoCol.find(query).skip(0).limit(1).iterator();
-        if (cursor.hasNext()) {
-            Document document1 = cursor.next();
-            System.out.println();
-        }
-    }
-}

+ 0 - 109
sb/src/main/java/cn/reghao/tnb/sb/db/mongo/MongoDbClient.java

@@ -1,109 +0,0 @@
-package cn.reghao.tnb.sb.db.mongo;
-
-import com.mongodb.MongoBulkWriteException;
-import com.mongodb.MongoClientSettings;
-import com.mongodb.MongoCredential;
-import com.mongodb.ServerAddress;
-import com.mongodb.client.*;
-import com.mongodb.client.model.InsertManyOptions;
-import com.mongodb.client.result.InsertManyResult;
-import org.bson.Document;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.function.Consumer;
-
-/**
- * @author reghao
- * @date 2021-12-29 14:35:24
- */
-public class MongoDbClient {
-    //private MongoConverter mongoConverter;
-    private final MongoCollection<Document> collection;
-
-    public MongoDbClient(/*MongoConverter mongoConverter*/) {
-        String host = "127.0.0.1";
-        String username = "dev";
-        String password = "Dev@123456";
-        String authDb = "admin";
-
-        MongoCredential credential = MongoCredential.createCredential(username, authDb, password.toCharArray());
-        MongoClient client = MongoClients.create(
-                MongoClientSettings.builder()
-                        .credential(credential)
-                        .applyToClusterSettings(
-                                builder -> builder.hosts(Collections.singletonList(new ServerAddress(host))))
-                        .build());
-
-        String database = "reghao_spider_rdb";
-        MongoDatabase db = client.getDatabase(database);
-        this.collection = db.getCollection("UnparsedData");
-    }
-
-    public void getAndConvert() {
-        Document query = new Document();
-        query.append("parser", "AnswersDataParser");
-
-        List<Document> list = new ArrayList<>();
-        FindIterable<Document> iterable = collection.find(query);
-        iterable.forEach(document -> {
-            parse(document, list);
-        });
-        updateAll(list);
-    }
-
-    private void parse(Document document, List<Document> list) {
-        //UnparsedData unparsedData = mongoConverter.read(UnparsedData.class, document);
-        //unparsedData.setParser("AnswersJsonDataParser");
-
-        Document doc = new Document();
-        //mongoConverter.write(unparsedData, doc);
-        list.add(doc);
-        if (list.size() > 10000) {
-            updateAll(list);
-            list.clear();
-        }
-    }
-
-    public void saveAll(List<Document> list) {
-        InsertManyOptions options = new InsertManyOptions();
-        options.ordered(false);
-        try {
-            InsertManyResult result = collection.insertMany(list, options);
-        } catch (MongoBulkWriteException e) {
-            e.getMessage();
-        }
-    }
-
-    public void updateAll(List<Document> list) {
-        try {
-            list.forEach(document -> {
-                Document filter = new Document();
-                filter.put("url", document.get("url"));
-                collection.findOneAndReplace(filter, document);
-            });
-        } catch (Exception e) {
-            e.getMessage();
-        }
-    }
-
-    public void getAndProcess() {
-        Document query = new Document();
-        query.append("site", "bilibili");
-        //query.append("parser", "parser");
-        collection.find(query).noCursorTimeout(true).forEach(new DataConsumer());
-    }
-
-    static class DataConsumer implements Consumer<Document> {
-        @Override
-        public void accept(Document document) {
-            System.out.println();
-        }
-    }
-
-    public static void main(String[] args) {
-        MongoDbClient client = new MongoDbClient();
-        client.getAndProcess();
-    }
-}

+ 0 - 30
sb/src/main/java/cn/reghao/tnb/sb/db/mongo/model/UserComment.java

@@ -1,30 +0,0 @@
-package cn.reghao.tnb.sb.db.mongo.model;
-
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2024-12-19 22:32:44
- */
-@NoArgsConstructor
-@Setter
-@Getter
-public class UserComment {
-    private Long pCommentId;
-    private Long commentId;
-    private String content;
-    private String imgSrc;
-    private List<String> commentImages;
-    private Integer likes;
-    private Boolean liked;
-    private Integer postType;
-    private String postId;
-    private Long avId;
-    private String location;
-    private Long publishAt;
-    private Long publishBy;
-}

+ 0 - 181
sb/src/main/java/cn/reghao/tnb/sb/db/mybatis/JdbcDemo.java

@@ -1,181 +0,0 @@
-package cn.reghao.tnb.sb.db.mybatis;
-
-import java.sql.*;
-
-/**
- * @author reghao
- * @date 2023-04-13 16:35:00
- */
-public class JdbcDemo {
-    static String driver = "com.mysql.cj.jdbc.Driver";
-    static String url = "jdbc:mysql://localhost:3306/reghao_atest_rdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8";
-    static String username = "dev";
-    static String password = "Dev@123456";
-
-    static Connection getConnection() throws ClassNotFoundException, SQLException {
-        Class.forName(driver);
-        Connection conn = DriverManager.getConnection(url, username, password);
-        return conn;
-    }
-
-    static Statement getStatement() throws SQLException, ClassNotFoundException {
-        Connection conn = getConnection();
-        Statement stmt = conn.createStatement();
-        return stmt;
-    }
-
-    static void update() {
-    }
-
-    static void delete() {
-    }
-
-    static void insert1() throws SQLException, ClassNotFoundException {
-        Class.forName(driver);
-        Connection conn = DriverManager.getConnection(url, username, password);
-
-        // 使用占位符定义 sql 语句
-        String sql = "INSERT INTO emp(empno,ename,job,sal,hiredate,mgr,comm,deptno) VALUES(?,?,?,?,?,?,?,?)";
-
-        // 使用连接对象取得发送 sql 语句的对象 (PreparedStatement 接口对象)
-        PreparedStatement pstmt = conn.prepareStatement(sql);
-
-        // 设置占位符内容
-        /*pstmt.setInt(1, emp.getEmpno());
-        pstmt.setString(2,emp.getEname());
-        pstmt.setString(3,emp.getJob());
-        pstmt.setDouble(4,emp.getSal());
-        pstmt.setDate(5,new java.sql.Date(emp.getHiredate().getTime()));
-        pstmt.setInt(6,emp.getMgr());
-        pstmt.setDouble(7,emp.getComm());
-        pstmt.setInt(8,emp.getDeptno());*/
-
-        // 执行 sql 语句
-        int ret = pstmt.executeUpdate();
-
-        //rs.close();
-        pstmt.close();
-        conn.close();
-    }
-
-    static void select0() throws ClassNotFoundException, SQLException {
-        Class.forName(driver);
-        Connection conn = DriverManager.getConnection(url, username, password);
-        Statement stmt = conn.createStatement();
-
-        String sql = "select * from user limit 100";
-        sql = "select * from user where id = 1";
-        sql = "select * from user where id = ?";
-        ResultSet rs = stmt.executeQuery(sql);
-        while (rs.next()) {
-            int id = rs.getInt("id");
-            String url = rs.getString("username");
-            System.out.printf("%s: %s%n\n", id, url);
-        }
-
-        rs.close();
-        stmt.close();
-        conn.close();
-    }
-
-    static void select2() throws SQLException, ClassNotFoundException {
-        Statement stmt = getStatement();
-        String sql = "select * from user limit 100";
-        ResultSet rs = stmt.executeQuery(sql);
-        while (rs.next()) {
-            int id = rs.getInt("id");
-            String url = rs.getString("username");
-            System.out.printf("%s: %s%n\n", id, url);
-        }
-
-        rs.close();
-        stmt.close();
-    }
-
-    static void select3() throws SQLException, ClassNotFoundException {
-        Class.forName(driver);
-        Connection conn = DriverManager.getConnection(url, username, password);
-        Statement stmt = conn.createStatement();
-
-        String sql = "select * from user limit 100";
-        ResultSet rs = stmt.executeQuery(sql);
-        while (rs.next()) {
-            int id = rs.getInt("id");
-            String url = rs.getString("username");
-            System.out.printf("%s: %s%n\n", id, url);
-        }
-
-        rs.close();
-        stmt.close();
-        conn.close();
-    }
-
-    static void insert() throws ClassNotFoundException, SQLException {
-        Class.forName(driver);
-        Connection conn = DriverManager.getConnection(url, username, password);
-        Statement stmt = conn.createStatement();
-
-        String sql = "select * from user limit 100";
-        ResultSet rs = stmt.executeQuery(sql);
-        while (rs.next()) {
-            int id = rs.getInt("id");
-            String url = rs.getString("username");
-            System.out.printf("%s: %s%n\n", id, url);
-        }
-
-        rs.close();
-        stmt.close();
-        conn.close();
-    }
-
-    static void select() throws ClassNotFoundException, SQLException {
-        Class.forName(driver);
-        Connection conn = DriverManager.getConnection(url, username, password);
-        Statement stmt = conn.createStatement();
-
-        String sql = "select * from file_meta limit 100";
-        ResultSet rs = stmt.executeQuery(sql);
-        while (rs.next()) {
-            int id = rs.getInt("id");
-            String url = rs.getString("object_name");
-            System.out.printf("%s: %s%n\n", id, url);
-        }
-
-        rs.close();
-        stmt.close();
-        conn.close();
-    }
-
-    static void select1() throws ClassNotFoundException, SQLException {
-        Class.forName(driver);
-        Connection conn = DriverManager.getConnection(url, username, password);
-
-        String sql = "select * from user limit 100";
-        sql = "select * from file_meta where id=?";
-        //sql = "select * from ? where id=10";
-
-        PreparedStatement pstmt = conn.prepareStatement(sql);
-        int id0 = 10;
-        pstmt.setInt(1, id0);
-
-        ResultSet rs = pstmt.executeQuery();
-        while (rs.next()) {
-            // 获取字段的 JDBC 类型
-            String jdbcType = rs.getMetaData().getColumnTypeName(1);
-            // 获取字段的 Java 类型
-            String javaType = rs.getMetaData().getColumnClassName(1);
-
-            int id = rs.getInt("id");
-            String url = rs.getString("object_name");
-            System.out.printf("%s: %s%n\n", id, url);
-        }
-
-        rs.close();
-        pstmt.close();
-        conn.close();
-    }
-
-    public static void main(String[] args) throws ClassNotFoundException, SQLException {
-        select1();
-    }
-}

+ 0 - 19
sb/src/main/java/cn/reghao/tnb/sb/db/mybatis/MyBatisConfig.java

@@ -1,19 +0,0 @@
-package cn.reghao.tnb.sb.db.mybatis;
-
-import org.apache.ibatis.session.SqlSessionFactory;
-import org.apache.ibatis.session.SqlSessionFactoryBuilder;
-
-import java.io.InputStream;
-
-/**
- * @author reghao
- * @date 2021-12-29 14:10:37
- */
-public class MyBatisConfig {
-    public static SqlSessionFactory sqlSessionFactory() {
-        String env = "dev";
-        String resource = "mybatis-config.xml";
-        InputStream is = MyBatisConfig.class.getClassLoader().getResourceAsStream(resource);
-        return new SqlSessionFactoryBuilder().build(is, env);
-    }
-}

+ 0 - 71
sb/src/main/java/cn/reghao/tnb/sb/db/mybatis/MybatisDemo.java

@@ -1,71 +0,0 @@
-package cn.reghao.tnb.sb.db.mybatis;
-
-import cn.reghao.tnb.sb.multi.mybatis.mapper.UserMapper;
-import cn.reghao.tnb.sb.multi.mybatis.model.User;
-import org.apache.ibatis.io.Resources;
-import org.apache.ibatis.session.SqlSession;
-import org.apache.ibatis.session.SqlSessionFactory;
-import org.apache.ibatis.session.SqlSessionFactoryBuilder;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * @author reghao
- * @date 2023-04-13 16:18:54
- */
-public class MybatisDemo {
-    static void select() throws IOException {
-        String resource = "mybatis-config.xml";
-        // 1.加载配置文件
-        InputStream inputStream = Resources.getResourceAsStream(resource);
-        // 2.创建SqlSessionFactory对象实际创建的是DefaultSqlSessionFactory对象
-        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
-        // 3.创建SqlSession对象实际创建的是DefaultSqlSession对象
-        SqlSession sqlSession = sqlSessionFactory.openSession();
-
-        // 4.创建代理对象
-        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
-        // 5.执行查询语句
-        User user = mapper.findByName("abc");
-
-        // 6.释放资源
-        sqlSession.close();
-        inputStream.close();
-    }
-
-    static void select1() {
-        SqlSessionFactory sqlSessionFactory = MyBatisConfig.sqlSessionFactory();
-        SqlSession session = sqlSessionFactory.openSession(true);
-        UserMapper userMapper = session.getMapper(UserMapper.class);
-
-        User user = userMapper.findByName("abc");
-        session.close();
-    }
-
-    static void insert() {
-        SqlSessionFactory sqlSessionFactory = MyBatisConfig.sqlSessionFactory();
-        SqlSession session = sqlSessionFactory.openSession(true);
-        UserMapper userMapper = session.getMapper(UserMapper.class);
-
-        User user = userMapper.findByName("abc");
-        /*for (int i = 0; i < 2; i++) {
-            List<User> list = new ArrayList<>();
-            for (int j = 0; j < 10_000; j++) {
-                String name = RandomString.getString(8);
-                list.add(new User(name, 30));
-            }
-            userMapper.saveAll(list);
-            System.out.println(LocalDateTime.now() + " save 1w records");
-        }*/
-
-        /*session.commit();
-        session.rollback();*/
-        session.close();
-    }
-
-    public static void main(String[] args) throws IOException {
-        //select();
-        insert();
-    }
-}

+ 0 - 24
sb/src/main/java/cn/reghao/tnb/sb/db/mybatis/test/BaseObject.java

@@ -1,24 +0,0 @@
-package cn.reghao.tnb.sb.db.mybatis.test;
-
-import lombok.Data;
-
-import java.io.Serializable;
-import java.time.LocalDateTime;
-
-@Data
-public class BaseObject<T> implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    protected T id;
-    // 逻辑删除
-    private Boolean deleted;
-    protected LocalDateTime createTime;
-    protected LocalDateTime updateTime;
-
-    public BaseObject() {
-        this.deleted = false;
-        LocalDateTime now = LocalDateTime.now();
-        this.createTime = now;
-        this.updateTime = now;
-    }
-}

+ 0 - 19
sb/src/main/java/cn/reghao/tnb/sb/db/mybatis/test/config/MyBatisConfig.java

@@ -1,19 +0,0 @@
-package cn.reghao.tnb.sb.db.mybatis.test.config;
-
-import org.apache.ibatis.session.SqlSessionFactory;
-import org.apache.ibatis.session.SqlSessionFactoryBuilder;
-
-import java.io.InputStream;
-
-/**
- * @author reghao
- * @date 2021-12-29 14:10:37
- */
-public class MyBatisConfig {
-    public static SqlSessionFactory sqlSessionFactory() {
-        String env = "dev";
-        String resource = "mybatis/config/mybatis-config.xml";
-        InputStream is = MyBatisConfig.class.getClassLoader().getResourceAsStream(resource);
-        return new SqlSessionFactoryBuilder().build(is, env);
-    }
-}

+ 0 - 32
sb/src/main/java/cn/reghao/tnb/sb/db/mybatis/test/jdbc/JdbcTest.java

@@ -1,32 +0,0 @@
-package cn.reghao.tnb.sb.db.mybatis.test.jdbc;
-
-import java.sql.*;
-
-/**
- * @author reghao
- * @date 2022-01-28 10:31:43
- */
-public class JdbcTest {
-    static String driver = "com.mysql.cj.jdbc.Driver";
-    static String url = "jdbc:mysql://localhost:3306/reghao_spider_rdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8";
-    static String username = "dev";
-    static String password = "Dev@123456";
-
-    public static void main(String[] args) throws ClassNotFoundException, SQLException {
-        Class.forName(driver);
-        Connection conn = DriverManager.getConnection(url, username, password);
-        Statement stmt = conn.createStatement();
-
-        String sql = "select * from url_resource limit 100";
-        ResultSet rs = stmt.executeQuery(sql);
-        while (rs.next()) {
-            int id = rs.getInt("id");
-            String url = rs.getString("url");
-            System.out.printf("%s: %s%n\n", id, url);
-        }
-
-        rs.close();
-        stmt.close();
-        conn.close();
-    }
-}

+ 0 - 16
sb/src/main/java/cn/reghao/tnb/sb/db/mybatis/test/mapper/UserInfoMapper.java

@@ -1,16 +0,0 @@
-package cn.reghao.tnb.sb.db.mybatis.test.mapper;
-
-import cn.reghao.tnb.sb.db.mybatis.test.model.UserInfo;
-import org.apache.ibatis.annotations.Insert;
-import org.apache.ibatis.annotations.Mapper;
-
-/**
- * @author reghao
- * @date 2021-04-19 22:22:11
- */
-@Mapper
-public interface UserInfoMapper {
-    @Insert("insert into user_info (user_id,username,id,deleted,create_time,update_time) " +
-            "values (#{userId},#{username},#{id},#{deleted},#{createTime},#{updateTime})")
-    void save(UserInfo userInfo);
-}

+ 0 - 42
sb/src/main/java/cn/reghao/tnb/sb/db/mybatis/test/model/UserInfo.java

@@ -1,42 +0,0 @@
-package cn.reghao.tnb.sb.db.mybatis.test.model;
-
-import cn.reghao.tnb.sb.db.mybatis.test.BaseObject;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-/**
- * @author reghao
- * @date 2021-03-10 04:35:11
- */
-@NoArgsConstructor
-@Data
-public class UserInfo extends BaseObject<Integer> {
-    private Long userId;
-    private String username;
-
-    public UserInfo(long userId, String username) {
-        this.userId = userId;
-        this.username = username;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = 17;
-        result = result * 31 + userId.hashCode();
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object other) {
-        if (other == this) {
-            return true;
-        }
-
-        if (other instanceof UserInfo) {
-            UserInfo o = (UserInfo) other;
-            return o.userId.equals(userId);
-        } else {
-            return false;
-        }
-    }
-}

+ 0 - 79
sb/src/main/java/cn/reghao/tnb/sb/db/mysql/MyClient.java

@@ -1,79 +0,0 @@
-package cn.reghao.tnb.sb.db.mysql;
-
-import cn.reghao.tnb.sb.db.mysql.mapper.UserProfileMapper;
-import cn.reghao.tnb.sb.db.mysql.model.UserProfile;
-import com.zaxxer.hikari.HikariConfig;
-import com.zaxxer.hikari.HikariDataSource;
-import org.apache.ibatis.mapping.Environment;
-import org.apache.ibatis.session.Configuration;
-import org.apache.ibatis.session.SqlSession;
-import org.apache.ibatis.session.SqlSessionFactory;
-import org.apache.ibatis.session.SqlSessionFactoryBuilder;
-import org.apache.ibatis.transaction.TransactionFactory;
-import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
-
-import javax.sql.DataSource;
-import java.io.InputStream;
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2025-05-15 15:16:17
- */
-public class MyClient {
-    public DataSource getDataSource() {
-        String host = "127.0.0.1";
-        int port = 3306;
-        String username = "dev";
-        String password = "Dev@123456";
-        String database = "tnb_account_rdb";
-
-        HikariConfig hikariConfig = new HikariConfig();
-        hikariConfig.setMinimumIdle(5);
-        hikariConfig.setMaximumPoolSize(10);
-        hikariConfig.setAutoCommit(true);
-        hikariConfig.setIdleTimeout(30000);
-        hikariConfig.setPoolName("EvaluationHikariCP");
-        hikariConfig.setMaxLifetime(1800000);
-        hikariConfig.setConnectionTimeout(60000);
-        hikariConfig.setConnectionTestQuery("SELECT 1");
-        hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
-
-        String prefix = String.format("jdbc:mysql://%s:%s/%s?", host, port, database);
-        String jdbcUrl = prefix + "useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8";
-        hikariConfig.setJdbcUrl(jdbcUrl);
-        hikariConfig.setUsername(username);
-        hikariConfig.setPassword(password);
-        return new HikariDataSource(hikariConfig);
-    }
-
-    public SqlSessionFactory getSqlSessionFactory(List<Class<?>> mapperList) {
-        DataSource dataSource = getDataSource();
-        String env = "dev";
-        TransactionFactory transactionFactory = new JdbcTransactionFactory();
-        Environment environment = new Environment(env, transactionFactory, dataSource);
-        Configuration configuration = new Configuration(environment);
-        mapperList.forEach(configuration::addMapper);
-        return new SqlSessionFactoryBuilder().build(configuration);
-    }
-
-    public SqlSessionFactory getSqlSessionFactory() {
-        String env = "dev";
-        String resource = "mybatis-config.xml";
-        InputStream is = this.getClass().getClassLoader().getResourceAsStream(resource);
-        return new SqlSessionFactoryBuilder().build(is, env);
-    }
-
-    public static void main(String[] args) {
-        List<Class<?>> mapperList = List.of(UserProfileMapper.class);
-
-        MyClient myClient = new MyClient();
-        SqlSessionFactory sqlSessionFactory = myClient.getSqlSessionFactory();
-        try (SqlSession session = sqlSessionFactory.openSession()) {
-            UserProfileMapper mapper = session.getMapper(UserProfileMapper.class);
-            List<UserProfile> list = mapper.findAll();
-            UserProfile userProfile = mapper.findByUserId(1);
-            System.out.println(userProfile);
-        }
-    }
-}

+ 0 - 84
sb/src/main/java/cn/reghao/tnb/sb/db/mysql/PageListInterceptor.java

@@ -1,84 +0,0 @@
-package cn.reghao.tnb.sb.db.mysql;
-
-import cn.reghao.jutil.jdk.web.db.Page;
-import org.apache.ibatis.binding.MapperMethod;
-import org.apache.ibatis.executor.parameter.ParameterHandler;
-import org.apache.ibatis.executor.statement.StatementHandler;
-import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.plugin.*;
-import org.apache.ibatis.reflection.MetaObject;
-import org.apache.ibatis.reflection.SystemMetaObject;
-
-import java.sql.Connection;
-import java.util.Properties;
-
-/**
- * MyBatis 分页拦截器
- *
- * @author reghao
- * @date 2021-04-26 17:40:32
- */
-@Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class,Integer.class})})
-public class PageListInterceptor implements Interceptor {
-    private final String methodSuffix = "ByPage";
-    @Deprecated
-    private int page;
-    @Deprecated
-    private int size;
-    private String dbType;
-    private Properties properties = new Properties();
-
-    @Override
-    public Object intercept(Invocation invocation) throws Throwable {
-        StatementHandler statementHandler = (StatementHandler)invocation.getTarget();
-        MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
-        while(metaObject.hasGetter("h")){
-            Object object = metaObject.getValue("h");
-            metaObject = SystemMetaObject.forObject(object);
-        }
-
-        while(metaObject.hasGetter("target")){
-            Object object = metaObject.getValue("target");
-            metaObject = SystemMetaObject.forObject(object);
-        }
-
-        MappedStatement mappedStatement = (MappedStatement)metaObject.getValue("delegate.mappedStatement");
-        String mapId = mappedStatement.getId();
-        if (mapId.matches(String.format(".+%s$", methodSuffix))){
-            ParameterHandler parameterHandler = (ParameterHandler)metaObject.getValue("delegate.parameterHandler");
-            Object object = parameterHandler.getParameterObject();
-            Page page;
-            if (object instanceof Page) {
-                page = (Page) object;
-            } else if (object instanceof MapperMethod.ParamMap) {
-                MapperMethod.ParamMap paramMap = (MapperMethod.ParamMap) object;
-                Object param1 = paramMap.get("param1");
-                if (param1 instanceof Page) {
-                    page = (Page) param1;
-                } else {
-                    throw new Exception("byPage 方法的第一个参数不是 Page 类型");
-                }
-            } else {
-                throw new Exception("没有 Page 类型的参数");
-            }
-
-            String sql = (String) metaObject.getValue("delegate.boundSql.sql");
-            //sql += " limit "+(page-1)*size +","+size;
-            sql += String.format(" limit %s,%s", (page.getPage()-1)*page.getSize(), page.getSize());
-            metaObject.setValue("delegate.boundSql.sql", sql);
-        }
-        return invocation.proceed();
-    }
-
-    @Override
-    public Object plugin(Object target) {
-        return Plugin.wrap(target, this);
-    }
-
-    @Override
-    public void setProperties(Properties properties) {
-        String limit = properties.getProperty("limit","10");
-        this.page = Integer.parseInt(limit);
-        this.dbType = properties.getProperty("dbType", "mysql");
-    }
-}

+ 0 - 14
sb/src/main/java/cn/reghao/tnb/sb/db/mysql/mapper/UserProfileMapper.java

@@ -1,14 +0,0 @@
-package cn.reghao.tnb.sb.db.mysql.mapper;
-
-import cn.reghao.tnb.sb.db.mysql.model.UserProfile;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2025-05-15 15:27:53
- */
-public interface UserProfileMapper {
-    List<UserProfile> findAll();
-    UserProfile findByUserId(long userId);
-}

+ 0 - 15
sb/src/main/java/cn/reghao/tnb/sb/db/mysql/model/UserProfile.java

@@ -1,15 +0,0 @@
-package cn.reghao.tnb.sb.db.mysql.model;
-
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * @author reghao
- * @date 2025-05-15 15:29:54
- */
-@Setter
-@Getter
-public class UserProfile {
-    private Long userId;
-    private Integer gender;
-}

+ 0 - 38
sb/src/main/java/cn/reghao/tnb/sb/db/rabbit/Recv.java

@@ -1,38 +0,0 @@
-package cn.reghao.tnb.sb.db.rabbit;
-
-import com.rabbitmq.client.Channel;
-import com.rabbitmq.client.Connection;
-import com.rabbitmq.client.ConnectionFactory;
-import com.rabbitmq.client.DeliverCallback;
-import java.nio.charset.StandardCharsets;
-
-/**
- * @author reghao
- * @date 2025-05-15 15:03:36
- */
-public class Recv {
-    private final static String QUEUE_NAME = "hello";
-
-    public static void main(String[] argv) throws Exception {
-        String host = "localhost";
-        String username = "dev";
-        String password = "Dev@123456";
-
-        ConnectionFactory factory = new ConnectionFactory();
-        factory.setHost(host);
-        factory.setUsername(username);
-        factory.setPassword(password);
-
-        Connection connection = factory.newConnection();
-        Channel channel = connection.createChannel();
-
-        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
-        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
-
-        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
-            String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
-            System.out.println(" [x] Received '" + message + "'");
-        };
-        channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
-    }
-}

+ 0 - 35
sb/src/main/java/cn/reghao/tnb/sb/db/rabbit/Send.java

@@ -1,35 +0,0 @@
-package cn.reghao.tnb.sb.db.rabbit;
-
-import cn.reghao.jutil.jdk.converter.DateTimeConverter;
-import com.rabbitmq.client.Channel;
-import com.rabbitmq.client.Connection;
-import com.rabbitmq.client.ConnectionFactory;
-
-import java.nio.charset.StandardCharsets;
-import java.time.LocalDateTime;
-
-/**
- * @author reghao
- * @date 2025-05-15 15:53:57
- */
-public class Send {
-    private final static String QUEUE_NAME = "hello";
-
-    public static void main(String[] argv) throws Exception {
-        String host = "localhost";
-        String username = "dev";
-        String password = "Dev@123456";
-
-        ConnectionFactory factory = new ConnectionFactory();
-        factory.setHost(host);
-        factory.setUsername(username);
-        factory.setPassword(password);
-        try (Connection connection = factory.newConnection();
-             Channel channel = connection.createChannel()) {
-            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
-            String message = "Hello World At " + DateTimeConverter.format(LocalDateTime.now());
-            channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));
-            System.out.println(" [x] Sent '" + message + "'");
-        }
-    }
-}

+ 0 - 52
sb/src/main/java/cn/reghao/tnb/sb/db/redis/ObjectSerializeCodec.java

@@ -1,52 +0,0 @@
-package cn.reghao.tnb.sb.db.redis;
-
-import io.lettuce.core.codec.RedisCodec;
-
-import java.io.*;
-import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-
-/**
- * 存储对象到 Redis 时使用的序列化编码器
- *
- * @author reghao
- * @date 2021-03-05 00:33:20
- */
-public class ObjectSerializeCodec<T> implements RedisCodec<String, T> {
-    private final Charset charset = StandardCharsets.UTF_8;
-
-    @Override
-    public String decodeKey(ByteBuffer bytes) {
-        return charset.decode(bytes).toString();
-    }
-
-    @Override
-    public T decodeValue(ByteBuffer bytes) {
-        try {
-            byte[] array = new byte[bytes.remaining()];
-            bytes.get(array);
-            ObjectInputStream is = new ObjectInputStream(new ByteArrayInputStream(array));
-            return (T)is.readObject();
-        } catch (Exception e) {
-            return null;
-        }
-    }
-
-    @Override
-    public ByteBuffer encodeKey(String key) { // str -> bytes -> byteBuffer
-        return ByteBuffer.wrap(key.getBytes(charset));
-    }
-
-    @Override
-    public ByteBuffer encodeValue(T value) {
-        try {
-            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
-            ObjectOutputStream os = new ObjectOutputStream(bytes);
-            os.writeObject(value);
-            return ByteBuffer.wrap(bytes.toByteArray());
-        } catch (IOException e) {
-            return null;
-        }
-    }
-}

+ 0 - 29
sb/src/main/java/cn/reghao/tnb/sb/db/redis/RedisConfig.java

@@ -1,29 +0,0 @@
-package cn.reghao.tnb.sb.db.redis;
-
-/**
- * @author reghao
- * @date 2020-03-23 15:33:04
- */
-public class RedisConfig {
-    private String host;
-    private String password;
-    private int db;
-
-    public RedisConfig(String host, String password, int db) {
-        this.host = host;
-        this.password = password;
-        this.db = db;
-    }
-
-    public String getHost() {
-        return host;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public int getDb() {
-        return db;
-    }
-}

Vissa filer visades inte eftersom för många filer har ändrats