MOKASZ\lw12420 %!s(int64=2) %!d(string=hai) anos
pai
achega
4a3121e296
Modificáronse 59 ficheiros con 2911 adicións e 280 borrados
  1. 11 0
      Dockerfile
  2. 26 0
      docker-compose.yml
  3. 63 56
      launch-admin/pom.xml
  4. 6 5
      launch-admin/src/main/java/com/webflux/launchadmin/LaunchAdminApplication.java
  5. 13 0
      launch-admin/src/main/java/com/webflux/launchadmin/config/BaseConstants.java
  6. 79 0
      launch-admin/src/main/java/com/webflux/launchadmin/config/BaseContextHandler.java
  7. 220 0
      launch-admin/src/main/java/com/webflux/launchadmin/config/LoginWebFiter.java
  8. 25 0
      launch-admin/src/main/java/com/webflux/launchadmin/config/MyWebConfiguration.java
  9. 13 0
      launch-admin/src/main/java/com/webflux/launchadmin/context/UserContext.java
  10. 70 0
      launch-admin/src/main/java/com/webflux/launchadmin/context/XxlSsoUser.java
  11. 26 0
      launch-admin/src/main/java/com/webflux/launchadmin/dispatcher/MailTask.java
  12. 28 0
      launch-admin/src/main/java/com/webflux/launchadmin/dispatcher/config/ScheduleConfig.java
  13. 0 18
      launch-admin/src/main/java/com/webflux/launchadmin/elasticSearch/entity/Index1.java
  14. 0 13
      launch-admin/src/main/java/com/webflux/launchadmin/elasticSearch/entity/Index2.java
  15. 0 29
      launch-admin/src/main/java/com/webflux/launchadmin/elasticSearch/service/TweeTEsService.java
  16. 3 0
      launch-admin/src/main/java/com/webflux/launchadmin/global/GlobalExceptionHandler.java
  17. 0 41
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/TweetController.java
  18. 196 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbIn/HomePageInController.java
  19. 19 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbIn/request/HomePageItemRequest.java
  20. 45 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbIn/request/HomePageItemSaveRequest.java
  21. 47 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbIn/request/HomePageItemUpdateRequest.java
  22. 13 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbIn/request/HomePageRequest.java
  23. 25 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbIn/request/HomePageSaveRequest.java
  24. 29 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbIn/request/HomePageUpdateRequest.java
  25. 108 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbOut/HomePageOutController.java
  26. 31 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbOut/request/HomePageItemOutRequest.java
  27. 9 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbOut/resp/DataList.java
  28. 132 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/testController.java
  29. 21 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/entity/lb/HomePageTemp.java
  30. 26 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/entity/lb/HomePageTempItem.java
  31. 9 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/repository/lb/HomePageTempItemRepository.java
  32. 9 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/repository/lb/HomePageTempRepository.java
  33. 5 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/repository/test/TweetRepository.java
  34. 9 7
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/service/test/TweetService.java
  35. 12 0
      launch-admin/src/main/resources/application-dev.yml
  36. 12 0
      launch-admin/src/main/resources/application-prod.yml
  37. 17 0
      launch-admin/src/main/resources/application.yml
  38. 0 37
      launch-admin/src/main/resources/bootstrap.yml
  39. 25 0
      launch-admin/src/main/resources/smart-doc.json
  40. 12 3
      launch-admin/src/test/java/com/webflux/launchadmin/LaunchAdminApplicationTests.java
  41. 17 0
      launch-common/pom.xml
  42. 23 0
      launch-common/src/main/java/com/webflux/launchcommon/returnObj/CustomExceptionHandler.java
  43. 6 0
      launch-common/src/main/java/com/webflux/launchcommon/returnObj/Paged.java
  44. 40 0
      launch-common/src/main/java/com/webflux/launchcommon/returnObj/RData.java
  45. 101 0
      launch-common/src/main/java/com/webflux/launchcommon/returnObj/RStatus.java
  46. 88 0
      launch-common/src/main/java/com/webflux/launchcommon/returnObj/RW.java
  47. 156 0
      launch-common/src/main/java/com/webflux/launchcommon/utils/AjaxResult.java
  48. 114 0
      launch-common/src/main/java/com/webflux/launchcommon/utils/Constants.java
  49. 97 0
      launch-common/src/main/java/com/webflux/launchcommon/utils/HttpStatus.java
  50. 105 0
      launch-common/src/main/java/com/webflux/launchcommon/utils/R.java
  51. 26 0
      launch-common/src/main/java/com/webflux/launchcommon/utils/RL.java
  52. 119 0
      launch-common/src/main/java/com/webflux/launchcommon/utils/ServletUtils.java
  53. 452 0
      launch-common/src/main/java/com/webflux/launchcommon/utils/StringUtils.java
  54. 9 41
      launch-r2dbc/pom.xml
  55. 20 0
      launch-redis/pom.xml
  56. 45 0
      launch-redis/src/main/java/com/weblux/launchredis/config/ReactiveRedisConfig.java
  57. 54 0
      launch-redis/src/main/java/com/weblux/launchredis/config/RedisConfig.java
  58. 25 0
      launch-redis/src/main/java/com/weblux/launchredis/utils/ReactiveRedisServer.java
  59. 20 30
      pom.xml

+ 11 - 0
Dockerfile

@@ -0,0 +1,11 @@
+FROM jdk21-alpine:3.18
+
+ARG env
+
+ENV ENVIRMENT=${env:+"dev"}
+ENV ENVIRMENT=${ENVIRMENT:-"prod"}
+
+COPY ./launch-admin/target/*.jar  /app/lbservice.jar
+
+
+CMD ["java","-Xms1g","-Xmx2g","-jar","-Dspring.profiles.active=${ENVIRMENT}", "/app/lbservice.jar","--server.port=8080"]

+ 26 - 0
docker-compose.yml

@@ -0,0 +1,26 @@
+version: "3.7"
+
+services:
+  galaxy-micro-service:
+    build:
+      context: .
+      dockerfile: ./Dockerfile
+    image: webflux:latest
+    container_name: webflux
+    healthcheck:
+      test: ["CMD-SHELL","curl --fail http://localhost:8080/actuator/health"]
+      interval: 10s
+      timeout: 5s
+      retries: 3
+    deploy:
+      resources:
+        limits:
+          memory: 2048M
+    ports:
+      - "8080:8080"
+    restart: always
+    networks:
+      - backend
+networks:
+  backend:
+    driver: bridge

+ 63 - 56
launch-admin/pom.xml

@@ -22,62 +22,23 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <java.version>21</java.version>
         <spring-cloud.version>2023.0.0-RC1</spring-cloud.version>
-        <nacos.client.version>2.2.1</nacos.client.version>
+
         <r2dbc-mysql>1.0.5</r2dbc-mysql>
         <openapi.ui>2.2.0</openapi.ui>
         <validation>3.2.0</validation>
         <cola-component-dto>4.3.2</cola-component-dto>
         <revision>2022.0.0.0</revision>
+        <redis.clients>5.0.2</redis.clients>
     </properties>
 
     <dependencies>
-        <!--web -->
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
-        </dependency>
-        <!--cloud -->
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-config</artifactId>
-        </dependency>
-        <!--Nacos-->
-        <dependency>
-            <groupId>com.alibaba.nacos</groupId>
-            <artifactId>nacos-client</artifactId>
-            <version>${nacos.client.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.alibaba.cloud</groupId>
-            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
-            <version>${revision}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.alibaba.cloud</groupId>
-            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
-            <version>${revision}</version>
-        </dependency>
-        <!-- 使用bootstrap.yml必须依赖此类 -->
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-bootstrap</artifactId>
-        </dependency>
-        <!--webflux-->
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-webflux</artifactId>
-        </dependency>
-        <!-- SpringCloud Openfeign -->
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-openfeign</artifactId>
-        </dependency>
-        <!-- SpringCloud Loadbalancer -->
 
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>redis.clients</groupId>-->
+<!--            <artifactId>jedis</artifactId>-->
+<!--            <version>2.9.0</version>-->
+<!--        </dependency>-->
+
         <!-- db -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -90,7 +51,17 @@
             <artifactId>r2dbc-mysql</artifactId>
             <version>${r2dbc-mysql}</version>
         </dependency>
-
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.3.7</version>
+        </dependency>
+        <!--单点登录 -->
+<!--        <dependency>-->
+<!--            <groupId>com.xuxueli</groupId>-->
+<!--            <artifactId>xxl-sso-core</artifactId>-->
+<!--            <version>1.1.1-SNAPSHOT</version>-->
+<!--        </dependency>-->
         <!--  r2dbc 连接池 -->
         <dependency>
             <groupId>io.r2dbc</groupId>
@@ -125,11 +96,6 @@
             <artifactId>cola-component-dto</artifactId>
             <version>${cola-component-dto}</version>
         </dependency>
-        <!--elasticsearch -->
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
-        </dependency>
         <!--lombok -->
         <dependency>
             <groupId>org.projectlombok</groupId>
@@ -159,16 +125,57 @@
             <groupId>com.launch.webflux</groupId>
             <artifactId>launch-elasticsearch</artifactId>
         </dependency>
-    </dependencies>
 
+    </dependencies>
     <build>
         <plugins>
             <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
+                <groupId>com.github.shalousun</groupId>
+                <artifactId>smart-doc-maven-plugin</artifactId>
+                <version>2.3.1</version>
+                <!--建议用最新版本-->
+                <configuration>
+                    <!--指定生成文档的使用的配置文件,配置文件放在自己的项目中-->
+                    <configFile>./src/main/resources/smart-doc.json</configFile>
+                    <!--指定项目名称-->
+                    <projectName>SmartDoc-Demo</projectName>
+                    <!--smart-doc实现自动分析依赖树加载第三方依赖的源码,如果一些框架依赖库加载不到导致报错,这时请使用excludes排除掉-->
+                    <excludes>
+                        <!--格式为:groupId:artifactId;参考如下-->
+                        <!--1.0.7版本开始你还可以用正则匹配排除,如:poi.* -->
+                        <exclude>com.alibaba:fastjson</exclude>
+                    </excludes>
+                    <!--自1.0.8版本开始,插件提供includes支持-->
+                    <!--smart-doc能自动分析依赖树加载所有依赖源码,原则上会影响文档构建效率,因此你可以使用includes来让插件加载你配置的组件-->
+                    <includes>
+                        <!--格式为:groupId:artifactId;参考如下-->
+                        <include>com.launch.system.controller.tool.product</include>
+                    </includes>
+                </configuration>
+                <executions>
+                    <execution>
+                        <!--如果不需要在执行编译时启动smart-doc,则将phase注释掉-->
+                        <!--<phase>compile</phase>-->
+                        <goals>
+                            <!--smart-doc提供了html、openapi、markdown等goal,可按需配置-->
+                            <!--<goal>html</goal>-->
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                </configuration>
             </plugin>
         </plugins>
     </build>
+
     <repositories>
         <repository>
             <id>spring-milestones</id>

+ 6 - 5
launch-admin/src/main/java/com/webflux/launchadmin/LaunchAdminApplication.java

@@ -1,15 +1,16 @@
 package com.webflux.launchadmin;
 
 
+
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
-@EnableTransactionManagement //r2dbc开启事务
-@EnableDiscoveryClient  //开启springclound
-//@EnableFeignClients (scanBasePackages = {"com.*"})
-@SpringBootApplication
+@EnableTransactionManagement
+@SpringBootApplication(scanBasePackages = "com.*")
+
+@EnableScheduling
 public class LaunchAdminApplication {
 
     public static void main(String[] args) {

+ 13 - 0
launch-admin/src/main/java/com/webflux/launchadmin/config/BaseConstants.java

@@ -0,0 +1,13 @@
+package com.webflux.launchadmin.config;
+
+/**
+ * @Description:
+ * @Author: launch
+ */
+public class BaseConstants {
+    public static String CONTEXT_KEY_USER_ID = "userId";
+    public static String CONTEXT_KEY_USER_NAME = "userName";
+    public static String CONTEXT_KEY_XXL_SSO_SESSION = "xxl_sso_session";
+    public static String CONTEXT_KEY_SYSCODE = "sysCode";
+    public static String CONTEXT_KEY_USERINFO = "userInfo";
+}

+ 79 - 0
launch-admin/src/main/java/com/webflux/launchadmin/config/BaseContextHandler.java

@@ -0,0 +1,79 @@
+package com.webflux.launchadmin.config;
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @Author: launch
+ */
+public class BaseContextHandler {
+    public static ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<Map<String, Object>>();
+
+    public static void set(String key, Object value) {
+        Map<String, Object> map = threadLocal.get();
+        if (map == null) {
+            map = new HashMap<String, Object>();
+            threadLocal.set(map);
+        }
+        map.put(key, value);
+    }
+
+    public static Object get(String key) {
+        Map<String, Object> map = threadLocal.get();
+        if (map == null) {
+            map = new HashMap<String, Object>();
+            threadLocal.set(map);
+        }
+        return map.get(key);
+    }
+
+    public static String getUserId() {
+        Object value = get(BaseConstants.CONTEXT_KEY_USER_ID);
+        return returnObjectValue(value);
+    }
+
+    public static String getUserName() {
+        Object value = get(BaseConstants.CONTEXT_KEY_USER_NAME);
+        return returnObjectValue(value);
+    }
+
+    public static String getSessionId() {
+        Object value = get(BaseConstants.CONTEXT_KEY_XXL_SSO_SESSION);
+        return returnObjectValue(value);
+    }
+
+    public static Long getSysCode() {
+        Object value = get(BaseConstants.CONTEXT_KEY_SYSCODE);
+        return value == null ? null : (Long) value;
+    }
+
+
+
+    public static void setSessionId(String sessionId) {
+        set(BaseConstants.CONTEXT_KEY_XXL_SSO_SESSION, sessionId);
+    }
+
+    public static void setUserName(String userName) {
+        set(BaseConstants.CONTEXT_KEY_USER_NAME, userName);
+    }
+
+    public static void setUserId(String userID) {
+        set(BaseConstants.CONTEXT_KEY_USER_ID, userID);
+    }
+
+    public static void setSysCode(Long sysCode) {
+        set(BaseConstants.CONTEXT_KEY_SYSCODE, sysCode);
+    }
+
+
+    private static String returnObjectValue(Object value) {
+        return value == null ? null : value.toString();
+    }
+
+    public static void remove() {
+        threadLocal.remove();
+    }
+
+}

+ 220 - 0
launch-admin/src/main/java/com/webflux/launchadmin/config/LoginWebFiter.java

@@ -0,0 +1,220 @@
+package com.webflux.launchadmin.config;
+
+
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.webflux.launchadmin.context.UserContext;
+import com.webflux.launchadmin.context.XxlSsoUser;
+import com.webflux.launchcommon.utils.RL;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.data.redis.core.ReactiveRedisTemplate;
+import org.springframework.http.HttpCookie;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.server.RequestPath;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.stereotype.Component;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.server.ServerWebExchange;
+import org.springframework.web.server.WebFilter;
+import org.springframework.web.server.WebFilterChain;
+import reactor.core.publisher.Mono;
+
+import java.io.IOException;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+@Component
+@Slf4j
+public class LoginWebFiter implements WebFilter {
+//    @Autowired
+//    private ReactiveRedisTemplate<String,Object> reactiveRedisTemplate;
+    @Value("${xxl.sso.excluded.paths}")
+    private String xxlSsoExcludedPaths;
+    @Value("${xxl.sso.excluded.start}")
+    private String xxlSsoExcludedstart;
+    @Value("${xxl.sso.server}")
+    private String loginPageUrl;
+    @SneakyThrows
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
+        ServerHttpRequest request = exchange.getRequest();
+        RequestPath path = request.getPath();
+        String string = path.toString();
+        String[] split = xxlSsoExcludedPaths.split(",");
+        String[] split1 = xxlSsoExcludedstart.split(",");
+        Optional<String> first = Stream.of(split).filter(string::equals).findFirst();
+        Optional<String> first1 = Stream.of(split1).filter(string::contains).findFirst();
+        if (first.isEmpty() && first1.isEmpty()) {
+            //验证权限
+           try {
+               String sessionid = getSessionid(exchange);
+               BaseContextHandler.setSessionId(sessionid);
+               Boolean user = getUser(getSessionid(exchange));
+
+
+               if (!user) {
+                   return notLogin(exchange);
+               }
+           }catch (Exception e){
+               //日志
+               log.error("LoginWebFiter getUserInfo E:"+ e.getMessage());
+           }
+        }
+        System.out.println("...abcd");
+        Mono<Void> filter = chain.filter(exchange); //放行
+        //流一旦经过某个操作就会变成新流
+        Mono<Void> voidMono = filter.doOnError(err -> {
+            System.out.println("目标方法异常以后...");
+        }) // 目标方法发生异常后做事
+                .doFinally(signalType -> {
+                    System.out.println("目标方法执行以后...");
+                });// 目标方法执行之后
+        //上面执行不花时间。
+        return voidMono; //看清楚返回的是谁!!!
+    }
+
+    private Mono<Void> notLogin(ServerWebExchange exchange) {
+        ServerHttpResponse response = exchange.getResponse();
+        response.setStatusCode( org.springframework.http.HttpStatus.NOT_IMPLEMENTED);
+        response.getHeaders().add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
+        RL result =new RL();
+        result.setCode(501);
+        result.setLoginPageUrl(loginPageUrl);
+        result.setMsg("sso not login.");
+        DataBuffer dataBuffer = response.bufferFactory().wrap(JSONUtil.toJsonStr(result).getBytes());
+        return response.writeWith(Mono.just(dataBuffer));
+    }
+
+    private static String  getSessionid(ServerWebExchange exchange) {
+        MultiValueMap<String, HttpCookie> cookies = exchange.getRequest().getCookies();
+        if (!cookies.containsKey("xxl_sso_sessionid")) {
+            return null;
+        }
+        String xxl_sso_sessionid = cookies.get("xxl_sso_sessionid").toString();
+        if (Objects.isNull(xxl_sso_sessionid)) {
+            return null;
+        }
+        return xxl_sso_sessionid.replace("[","").replace("]","");
+    }
+
+    public Boolean getUser(String cookie) throws IOException {
+        if (Objects.isNull(cookie)) {
+            log.error("111111111");
+            return false;
+        }
+        if(UserContext.cMap.containsKey(cookie)){
+            XxlSsoUser xxlSsoUser = UserContext.cMap.get(cookie);
+            BaseContextHandler.setUserId(xxlSsoUser.getUserid());
+            BaseContextHandler.setUserName(xxlSsoUser.getUsername());
+            return true;
+        }
+        CloseableHttpClient httpclient = HttpClients.createDefault();
+        //https://kuaitou.mokamrp.com/api/system/qwlb/getAdminInfo
+        HttpGet httpget = new HttpGet("http://test.ad-frontend.mokamrp.com/api/system/qwlb/getAdminInfo");
+        httpget.setHeader("Cookie",cookie);
+        CloseableHttpResponse response = httpclient.execute(httpget);
+        try {
+            HttpEntity entity = response.getEntity();
+            String result = EntityUtils.toString(entity);
+            EntityUtils.consume(entity);
+            log.error("3");
+            if (Objects.nonNull(result)) {
+                log.error("4");
+                JSONObject jsonObject = JSONUtil.parseObj(result);
+                if (jsonObject.containsKey("code") && jsonObject.get("code", Integer.class) == 200) {
+                    log.error("5");
+                    if(jsonObject.containsKey("data")){
+                        log.error("7");
+                        XxlSsoUser data = jsonObject.get("data", XxlSsoUser.class);
+                        BaseContextHandler.setUserId(data.getUserid());
+                        BaseContextHandler.setUserName(data.getUsername());
+                        UserContext.cMap.put(cookie,data);
+                        System.out.println(data);
+                        return true;
+                    }
+                }else if(jsonObject.containsKey("code") && jsonObject.get("code", Integer.class) == 501){
+                    return false;
+                }else {
+                    return true;
+                }
+            }
+            log.error("8");
+        } catch (Exception e) {
+            return true;
+        } finally {
+            response.close();
+        }
+        log.error("2222222222222");
+        return true;
+
+    }
+
+
+
+
+//    public static String parseStoreKey(String sessionId) {
+//        if (sessionId != null && sessionId.indexOf("_") > -1) {
+//            String[] sessionIdArr = sessionId.split("_");
+//            if (sessionIdArr.length == 2 && sessionIdArr[0] != null && sessionIdArr[0].trim().length() > 0) {
+//                String userId = sessionIdArr[0].trim();
+//                return userId;
+//            }
+//        }
+//
+//        return null;
+//    }
+//    private static String  xxl0(ServerWebExchange exchange) {
+//
+//        MultiValueMap<String, HttpCookie> cookies = exchange.getRequest().getCookies();
+//        if (!cookies.containsKey("xxl_sso_sessionid")) {
+//            return null;
+//        }
+//        String xxl_sso_sessionid = cookies.get("xxl_sso_sessionid").toString();
+//        if (Objects.isNull(xxl_sso_sessionid)) {
+//            return null;
+//        }
+//        String xxl_sso_sessionid1 = xxl_sso_sessionid.replace("[","");
+//        String xxl_sso_sessionid2 =xxl_sso_sessionid1.replace("]","");
+//
+//        String[] split = xxl_sso_sessionid2.split("=");
+//        if(Objects.isNull(split[1])){
+//            return null;
+//        }
+//        String value = split[1];
+//        String s = parseStoreKey(value);
+//        return redisKey(s);
+//    }
+//    private static String redisKey(String sessionId) {
+//        return "xxl_sso_sessionid".concat("#").concat(sessionId);
+//    }
+//
+//
+//
+//    public Boolean  xxl1(ServerWebExchange exchange){
+//        String key = xxl0(exchange);
+//        if (Objects.isNull(key)) {
+//            return false;
+//        }
+//        Mono<Object> objectMono = reactiveRedisTemplate.opsForValue().get(key);
+//    //    Optional<Object> o = objectMono.blockOptional();
+//        return false;
+//
+//    }
+//
+//    private Mono<Void> unauthorizedResponse(ServerWebExchange exchange, String msg) {
+//        return ServletUtils.webFluxResponseWriter(exchange.getResponse(), msg, HttpStatus.UNAUTHORIZED);
+//    }
+}

+ 25 - 0
launch-admin/src/main/java/com/webflux/launchadmin/config/MyWebConfiguration.java

@@ -0,0 +1,25 @@
+package com.webflux.launchadmin.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.reactive.config.CorsRegistry;
+import org.springframework.web.reactive.config.WebFluxConfigurer;
+
+@Configuration
+public class MyWebConfiguration {
+
+    //配置底层
+    @Bean
+    public WebFluxConfigurer webFluxConfigurer(){
+
+        return new WebFluxConfigurer() {
+            @Override
+            public void addCorsMappings(CorsRegistry registry) {
+                registry.addMapping("/**")
+                        .allowedHeaders("*")
+                        .allowedMethods("*")
+                        .allowedOrigins("localhost");
+            }
+        };
+    }
+}

+ 13 - 0
launch-admin/src/main/java/com/webflux/launchadmin/context/UserContext.java

@@ -0,0 +1,13 @@
+package com.webflux.launchadmin.context;
+
+
+
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.ConcurrentHashMap;
+@Component
+public  class UserContext {
+    public static ConcurrentHashMap<String, XxlSsoUser> cMap = new ConcurrentHashMap();
+
+
+}

+ 70 - 0
launch-admin/src/main/java/com/webflux/launchadmin/context/XxlSsoUser.java

@@ -0,0 +1,70 @@
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by FernFlower decompiler)
+//
+
+package com.webflux.launchadmin.context;
+
+import java.io.Serializable;
+import java.util.Map;
+
+public class XxlSsoUser implements Serializable {
+    private static final long serialVersionUID = 42L;
+    private String userid;
+    private String username;
+    private Map<String, String> plugininfo;
+    private String version;
+    private int expireMinute;
+    private long expireFreshTime;
+
+    public XxlSsoUser() {
+    }
+
+    public String getUserid() {
+        return this.userid;
+    }
+
+    public void setUserid(String userid) {
+        this.userid = userid;
+    }
+
+    public String getUsername() {
+        return this.username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public Map<String, String> getPlugininfo() {
+        return this.plugininfo;
+    }
+
+    public void setPlugininfo(Map<String, String> plugininfo) {
+        this.plugininfo = plugininfo;
+    }
+
+    public String getVersion() {
+        return this.version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public int getExpireMinute() {
+        return this.expireMinute;
+    }
+
+    public void setExpireMinute(int expireMinute) {
+        this.expireMinute = expireMinute;
+    }
+
+    public long getExpireFreshTime() {
+        return this.expireFreshTime;
+    }
+
+    public void setExpireFreshTime(long expireFreshTime) {
+        this.expireFreshTime = expireFreshTime;
+    }
+}

+ 26 - 0
launch-admin/src/main/java/com/webflux/launchadmin/dispatcher/MailTask.java

@@ -0,0 +1,26 @@
+package com.webflux.launchadmin.dispatcher;
+
+import com.webflux.launchadmin.context.UserContext;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class MailTask {
+
+
+
+	//@Scheduled(cron="0/30 * *  * * ? ")   //每600秒执行一次
+	public void handleTask(){
+    }
+
+    //清空用户Map数据 每天凌晨执行
+	@Scheduled(cron="1 0 0 * * ? * ")
+	public void clearUserContextMap(){
+		log.info("清空用户Map数据》》》》》》》》》》》》》》》》》》》》》》开始");
+		UserContext.cMap.clear();
+		log.info("清空用户Map数据》》》》》》》》》》》》》》》》》》》》》》 结束");
+	}
+}

+ 28 - 0
launch-admin/src/main/java/com/webflux/launchadmin/dispatcher/config/ScheduleConfig.java

@@ -0,0 +1,28 @@
+package com.webflux.launchadmin.dispatcher.config;
+ 
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.SchedulingConfigurer;
+import org.springframework.scheduling.config.ScheduledTaskRegistrar;
+ 
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+ 
+/**
+ * 没有此配置,则schedule为单线程串行执行
+ */
+@Configuration
+@EnableScheduling
+public class ScheduleConfig implements SchedulingConfigurer {
+ 
+    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
+        taskRegistrar.setScheduler(taskExecutor());
+    }
+ 
+    //配置线程池---触发器和任务共用的
+    @Bean()
+    public Executor taskExecutor() {
+        return Executors.newScheduledThreadPool(10);
+    }
+}

+ 0 - 18
launch-admin/src/main/java/com/webflux/launchadmin/elasticSearch/entity/Index1.java

@@ -1,18 +0,0 @@
-package com.webflux.launchadmin.elasticSearch.entity;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import org.springframework.data.annotation.Id;
-import org.springframework.data.elasticsearch.annotations.Document;
-import org.springframework.data.elasticsearch.annotations.Field;
-import org.springframework.data.elasticsearch.annotations.FieldType;
-
-@Document(indexName = "index001")
-@Data
-@AllArgsConstructor
-public class Index1 {
-    @Id
-    private Long id;
-    @Field(name = "name",type = FieldType.Annotated_Text)
-    private String name;
-}

+ 0 - 13
launch-admin/src/main/java/com/webflux/launchadmin/elasticSearch/entity/Index2.java

@@ -1,13 +0,0 @@
-package com.webflux.launchadmin.elasticSearch.entity;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import org.springframework.data.annotation.Id;
-import org.springframework.data.elasticsearch.annotations.Document;
-import org.springframework.data.elasticsearch.annotations.Field;
-import org.springframework.data.elasticsearch.annotations.FieldType;
-
-@Document(indexName = "index001")
-public record Index2(@Id  Long id, @Field(name = "name",type = FieldType.Annotated_Text) String name) {
-
-}

+ 0 - 29
launch-admin/src/main/java/com/webflux/launchadmin/elasticSearch/service/TweeTEsService.java

@@ -1,29 +0,0 @@
-package com.webflux.launchadmin.elasticSearch.service;
-
-
-import com.webflux.launchadmin.elasticSearch.entity.Index1;
-import com.webflux.launchadmin.elasticSearch.entity.Index2;
-import jakarta.annotation.Resource;
-import org.springframework.data.elasticsearch.client.elc.ReactiveElasticsearchTemplate;
-import org.springframework.stereotype.Service;
-import reactor.core.publisher.Flux;
-import reactor.core.publisher.Mono;
-
-@Service
-public class TweeTEsService {
-
-
-
-    @Resource
-    private ReactiveElasticsearchTemplate reactiveElasticsearchTemplate;
-
-    public Mono<Index1> mySave(Index1 es) {
-        return reactiveElasticsearchTemplate.save(es);
-    }
-    public Mono<Index2> mySave2(Index2 es) {
-        return reactiveElasticsearchTemplate.save(es);
-    }
-    public Mono<Index2> get() {
-        return reactiveElasticsearchTemplate.get("1",Index2.class);
-    }
-}

+ 3 - 0
launch-admin/src/main/java/com/webflux/launchadmin/global/GlobalExceptionHandler.java

@@ -1,6 +1,7 @@
 package com.webflux.launchadmin.global;
 
 import com.alibaba.cola.dto.Response;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ResponseBody;
@@ -8,11 +9,13 @@ import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestControllerAdvice;
 
 @RestControllerAdvice
+@Slf4j
 public class GlobalExceptionHandler {
     @ResponseBody
     @ResponseStatus(HttpStatus.BAD_REQUEST)
     @ExceptionHandler(Exception.class)
     public Response handleException(Exception e) {
+      //  log.error(e.toString());
         return Response.buildFailure("未知异常", e.getMessage());
     }
 }

+ 0 - 41
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/TweetController.java

@@ -1,41 +0,0 @@
-package com.webflux.launchadmin.mysql.controller;
-
-
-import com.webflux.launchadmin.elasticSearch.entity.Index1;
-import com.webflux.launchadmin.elasticSearch.entity.Index2;
-import com.webflux.launchadmin.elasticSearch.service.TweeTEsService;
-import com.webflux.launchadmin.mysql.entity.test.Tweet;
-import com.webflux.launchadmin.mysql.service.test.TweetService;
-import jakarta.annotation.Resource;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import reactor.core.publisher.Flux;
-import reactor.core.publisher.Mono;
-
-
-@RestController
-@RequestMapping("tweet")
-public class TweetController {
-
-    @Resource
-    private TweeTEsService repository;
-
-    @Resource
-    private TweetService tweetService;
-    @GetMapping("getAll")
-    public Flux<Tweet> getAll(){
-       return tweetService.getAll();
-    }
-
-    @GetMapping("saveEs")
-    public Mono<Index1> saveEs(){
-        Index1 index1 = new Index1(1l,"xiao");
-        return repository.mySave(index1);
-    }
-    @GetMapping("getEs")
-    public Mono<Index2> getEs(){
-        return repository.get();
-    }
-
-}

+ 196 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbIn/HomePageInController.java

@@ -0,0 +1,196 @@
+package com.webflux.launchadmin.mysql.controller.lbIn;
+
+import com.webflux.launchadmin.config.BaseContextHandler;
+import com.webflux.launchadmin.mysql.controller.lbIn.request.*;
+import com.webflux.launchadmin.mysql.entity.lb.HomePageTemp;
+import com.webflux.launchadmin.mysql.entity.lb.HomePageTempItem;
+import com.webflux.launchadmin.mysql.entity.test.Tweet;
+import com.webflux.launchadmin.mysql.repository.lb.HomePageTempItemRepository;
+import com.webflux.launchadmin.mysql.repository.lb.HomePageTempRepository;
+import com.webflux.launchcommon.returnObj.Paged;
+import com.webflux.launchcommon.returnObj.RStatus;
+import jakarta.annotation.Resource;
+import jakarta.validation.constraints.NotNull;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
+import org.springframework.data.relational.core.query.Criteria;
+import org.springframework.data.relational.core.query.Query;
+import org.springframework.data.relational.core.query.Update;
+import org.springframework.web.bind.annotation.*;
+import reactor.core.publisher.Mono;
+
+import java.time.ZonedDateTime;
+import java.util.Objects;
+
+
+/**
+ * 首页模版
+ * @author lw12420
+ * @date 2024/04/22
+ */
+@RestController
+@RequestMapping("/in/homePage")
+public class HomePageInController {
+
+    @Resource
+    private R2dbcEntityTemplate template;
+
+    @Resource
+    private HomePageTempRepository tempRepository;
+
+    @Resource
+    private HomePageTempItemRepository itemRepository;
+
+    /**
+     * 列表查询(首页模版)
+     * @param request
+     * @return {@link Mono}<{@link RStatus}<{@link Paged}<{@link HomePageTemp}>>>
+     */
+    @PostMapping("pageTemp")
+    public Mono<RStatus<Paged<HomePageTemp>>> page(@RequestBody HomePageRequest request)   {
+        Criteria criteria= Criteria.empty() ;
+        if (Objects.nonNull(request.getHomePageName()) && "" != request.getHomePageName()) {
+             criteria = criteria.and("home_page_name").is(request.getHomePageName());
+        }
+        if (Objects.nonNull(request.getTypeId()) && 0L != request.getTypeId()) {
+            criteria = criteria.and("type_id").is(request.getTypeId());
+        }
+        Query query = Query.query(criteria);
+        Criteria finalCriteria = criteria;
+        Mono<Paged<HomePageTemp>> pagedMono = template.count(query, HomePageTemp.class).flatMap(fm ->
+                template.select(Query.query(finalCriteria)
+                        .offset(request.getPageNum())
+                        .limit(request.getPageSize())
+                        .sort(Sort.by(Sort.Order.desc("create_time"))),HomePageTemp.class)
+                        .collectList()
+                        .map(list -> new Paged<>(fm, list))
+        );
+        return RStatus.successList(pagedMono);
+    }
+
+
+    /**
+     * 子页面列表查询(子页面)
+     * @param request
+     * @return {@link Mono}<{@link RStatus}<{@link Paged}<{@link HomePageTempItem}>>>
+     */
+    @PostMapping("pageTempItem")
+    public Mono<RStatus<Paged<HomePageTempItem>>> pageTempItem(@RequestBody HomePageItemRequest request)   {
+        Criteria criteria= Criteria.where("home_page_id").is(request.getHomePageId()).and("item_type").is(request.getItmeType()) ;
+        Query query = Query.query(criteria);
+        Criteria finalCriteria = criteria;
+        Mono<Paged<HomePageTempItem>> pagedMono = template.count(query, HomePageTempItem.class).flatMap(fm ->
+                template.select(Query.query(finalCriteria)
+                        .offset(request.getPageNum())
+                        .limit(request.getPageSize())
+                        .sort(Sort.by(Sort.Order.desc("create_time"))),HomePageTempItem.class)
+                        .collectList()
+                        .map(list -> new Paged<>(fm, list))
+        );
+        return RStatus.successList(pagedMono);
+    }
+
+    /**
+     * 保存(首页模版)
+     * @param saveRequest
+     * @return {@link Mono}<{@link RStatus}<{@link HomePageTemp}>>
+     */
+    @PostMapping("saveTemp")
+    public Mono<RStatus<HomePageTemp>> saveTemp(@RequestBody HomePageSaveRequest saveRequest){
+        HomePageTemp homePageTemp = new HomePageTemp(null,
+                saveRequest.getHomePageName(),
+                saveRequest.getTypeId(),
+                saveRequest.getTypeName(),
+                BaseContextHandler.getUserId(),
+                BaseContextHandler.getUserName(),
+                ZonedDateTime.now(),
+                ZonedDateTime.now());
+        Mono<HomePageTemp> insert = template.insert(homePageTemp);
+        return  RStatus.success(insert);
+    }
+
+    /**
+     * 子页面保存(子页面)
+     * @param saveRequest
+     * @return {@link Mono}<{@link RStatus}<{@link HomePageTempItem}>>
+     */
+    @PostMapping("saveTempItem")
+    public Mono<RStatus<HomePageTempItem>> saveTempItem(@RequestBody HomePageItemSaveRequest saveRequest){
+        HomePageTempItem homePageTempItem = new HomePageTempItem(null,
+                saveRequest.getHomePageId(),BaseContextHandler.getUserId(),
+                BaseContextHandler.getUserName(),
+                ZonedDateTime.now(),
+                ZonedDateTime.now(),
+                saveRequest.getItmeType(),
+                saveRequest.getTitle(),
+                saveRequest.getUrl(),
+                saveRequest.getUrlSize(),
+                saveRequest.getUrlWidth(),
+                saveRequest.getUrlHigh(),
+                saveRequest.getUrlMd5(),
+                saveRequest.getLink()
+              );
+        Mono<HomePageTempItem> insert = template.insert(homePageTempItem);
+        return  RStatus.success(insert);
+    }
+
+    /**
+     * 修改(首页模版)
+     * @param saveRequest
+     * @return {@link Mono}<{@link RStatus}<{@link HomePageTemp}>>
+     */
+    @PostMapping("updateTemp")
+    public Mono<RStatus<Long>> update(@RequestBody HomePageUpdateRequest saveRequest){
+        Criteria empty = Criteria.where("home_page_id").is(saveRequest.getHomePageId());
+        Update update = Update.update("update_time", ZonedDateTime.now());
+        if(Objects.nonNull(saveRequest.getHomePageName()) && !"".equals(saveRequest.getHomePageName())){
+            update.set("homePageName",saveRequest.getHomePageName());
+        }
+        if(Objects.nonNull(saveRequest.getTypeName()) && !"".equals(saveRequest.getTypeName())){
+            update.set("typeName",saveRequest.getTypeName());
+        }
+        if(Objects.nonNull(saveRequest.getTypeId()) && 0L!=saveRequest.getTypeId()){
+            update.set("typeId ",saveRequest.getTypeId());
+        }
+        Mono<Long> update1 = template.update(Query.query(empty), update, HomePageTemp.class);
+        return  RStatus.success(update1);
+    }
+
+    /**
+     * 子页面修改(子页面)
+     * @param saveRequest
+     * @return {@link Mono}<{@link RStatus}<{@link Long}>>
+     */
+    @PostMapping("updateTempItem")
+    public Mono<RStatus<Long>> updateTempItem(@RequestBody HomePageItemUpdateRequest saveRequest){
+        Criteria empty = Criteria.where("home_page_item_id").is(saveRequest.getHomePageItemId());
+        Update update = Update.update("update_time", ZonedDateTime.now());
+        if(Objects.nonNull(saveRequest.getTitle()) && !"".equals(saveRequest.getTitle())){
+            update.set("title",saveRequest.getTitle());
+        }
+        if(Objects.nonNull(saveRequest.getLink()) && !"".equals(saveRequest.getLink())){
+            update.set("link",saveRequest.getLink());
+        }
+        if(Objects.nonNull(saveRequest.getUrl()) && !"".equals(saveRequest.getUrl())){
+            update.set("url ",saveRequest.getUrl());
+            update.set("url_md5 ",saveRequest.getUrlMd5());
+            update.set("url_width ",saveRequest.getUrlWidth());
+            update.set("url_high ",saveRequest.getUrlHigh());
+        }
+        Mono<Long> update1 = template.update(Query.query(empty), update, HomePageTempItem.class);
+        return  RStatus.success(update1);
+    }
+
+    /**
+     * 子页面delete(子页面)
+     * @param homePageItemId
+     * @return {@link Mono}<{@link RStatus}<{@link Void}>>
+     */
+    @DeleteMapping("deleteItemById/{homePageItemId}")
+    public Mono<RStatus<Void>> deleteItemById (@PathVariable("homePageItemId")  @NotNull  Long homePageItemId){
+        return RStatus.success(itemRepository.deleteById(homePageItemId));
+    }
+
+
+
+}

+ 19 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbIn/request/HomePageItemRequest.java

@@ -0,0 +1,19 @@
+package com.webflux.launchadmin.mysql.controller.lbIn.request;
+
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class HomePageItemRequest {
+
+    private Integer pageNum;
+    private Integer pageSize;
+    @NotNull
+    private String homePageId;
+    /**
+     * Banner:b 推荐:t 热门:r
+     */
+    @NotEmpty
+    private  String itmeType;
+}

+ 45 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbIn/request/HomePageItemSaveRequest.java

@@ -0,0 +1,45 @@
+package com.webflux.launchadmin.mysql.controller.lbIn.request;
+
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class HomePageItemSaveRequest {
+    @NotNull
+    private Long homePageId;
+    /**
+     * Banner:b 推荐:t 热门:r
+     */
+    @NotNull
+    private String itmeType;
+    /**
+     * 标题
+     */
+    private  String title;
+    /**
+     * 封面url
+     */
+    private String url;
+    /**
+     * 选填
+     */
+    private  Long urlSize;
+    /**
+     * 选填
+     */
+    private Long urlWidth;
+    /**
+     * 选填
+     */
+    private Long urlHigh;
+    /**
+     * 选填
+     */
+    private String urlMd5;
+
+    /**
+     * 链接
+     */
+    private String link;
+}

+ 47 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbIn/request/HomePageItemUpdateRequest.java

@@ -0,0 +1,47 @@
+package com.webflux.launchadmin.mysql.controller.lbIn.request;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class HomePageItemUpdateRequest {
+
+    @NotNull
+    private Long  homePageItemId;
+    @NotNull
+    private Long homePageId;
+    /**
+     * Banner:b 推荐:t 热门:r
+     */
+//    @NotNull
+//    private String itmeType;
+    /**
+     * 标题
+     */
+    private  String title;
+    /**
+     * url
+     */
+    private String url;
+    /**
+     * 选填
+     */
+    private  Long urlSize;
+    /**
+     * 选填
+     */
+    private Long urlWidth;
+    /**
+     * 选填
+     */
+    private Long urlHigh;
+    /**
+     * 选填
+     */
+    private String urlMd5;
+    /**
+     * 链接
+     */
+
+    private String link;
+}

+ 13 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbIn/request/HomePageRequest.java

@@ -0,0 +1,13 @@
+package com.webflux.launchadmin.mysql.controller.lbIn.request;
+
+import io.r2dbc.spi.Parameter;
+import lombok.Data;
+
+@Data
+public class HomePageRequest {
+
+    private Integer pageNum;
+    private Integer pageSize;
+    private String homePageName;
+    private Long typeId;
+}

+ 25 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbIn/request/HomePageSaveRequest.java

@@ -0,0 +1,25 @@
+package com.webflux.launchadmin.mysql.controller.lbIn.request;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class HomePageSaveRequest {
+
+    /**
+     *名称
+     */
+    @NotNull
+    private   String homePageName;
+    /**
+     * 类型 id
+     */
+    @NotNull
+    private Long typeId;
+    /**
+     * 类型 name
+     */
+    @NotNull
+    private String typeName;
+
+}

+ 29 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbIn/request/HomePageUpdateRequest.java

@@ -0,0 +1,29 @@
+package com.webflux.launchadmin.mysql.controller.lbIn.request;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class HomePageUpdateRequest {
+    /**
+     * 修改必填
+     */
+    @NotNull
+    private Long homePageId;
+    /**
+     *名称
+     */
+    @NotNull
+    private   String homePageName;
+    /**
+     * 类型 id
+     */
+    @NotNull
+    private Long typeId;
+    /**
+     * 类型 name
+     */
+    @NotNull
+    private String typeName;
+
+}

+ 108 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbOut/HomePageOutController.java

@@ -0,0 +1,108 @@
+package com.webflux.launchadmin.mysql.controller.lbOut;
+
+import com.webflux.launchadmin.mysql.controller.lbIn.request.HomePageItemRequest;
+import com.webflux.launchadmin.mysql.controller.lbOut.request.HomePageItemOutRequest;
+import com.webflux.launchadmin.mysql.controller.lbOut.resp.DataList;
+import com.webflux.launchadmin.mysql.entity.lb.HomePageTempItem;
+import com.webflux.launchadmin.mysql.repository.lb.HomePageTempItemRepository;
+import com.webflux.launchadmin.mysql.repository.lb.HomePageTempRepository;
+import com.webflux.launchcommon.returnObj.Paged;
+import com.webflux.launchcommon.returnObj.RStatus;
+import jakarta.annotation.Resource;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
+import org.springframework.data.relational.core.query.Criteria;
+import org.springframework.data.relational.core.query.Query;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import reactor.core.publisher.Mono;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.stream.Collectors;
+
+
+/**
+ * 首页模版
+ * @author lw12420
+ * @date 2024/04/22
+ */
+@RestController
+@RequestMapping("/out/homePage")
+public class HomePageOutController {
+
+
+    @Resource
+    private R2dbcEntityTemplate template;
+
+    @Resource
+    private HomePageTempRepository tempRepository;
+
+    @Resource
+    private HomePageTempItemRepository itemRepository;
+
+
+    /**
+     * H5 短剧查询
+     * @param request
+     * @return {@link Mono}<{@link RStatus}<{@link DataList}<{@link HomePageTempItem}>>>
+     */
+    @PostMapping("pageTempItem")
+    public Mono<RStatus<DataList<HomePageTempItem>>> pageTempItem(@RequestBody HomePageItemOutRequest request)   {
+        Criteria criteria= Criteria.where("home_page_id").is(request.getHomePageId()) ;
+        Query query = Query.query(criteria);
+        Mono<DataList<HomePageTempItem>> map = template.select(query, HomePageTempItem.class).collectList().map(mp -> {
+            Map<String, List<HomePageTempItem>> collect = mp.stream().collect(Collectors.groupingBy(HomePageTempItem::itmeType));
+            Integer bannerSize = request.getBannerSize();
+            Integer hotSize = request.getHotSize();
+            Integer recommendSize = request.getRecommendSize();
+            List<HomePageTempItem> bannerList = new ArrayList<>();
+            List<HomePageTempItem> hotList = new ArrayList<>();
+            List<HomePageTempItem> recommendList = new ArrayList<>();
+            collect.forEach((k, v) -> {
+                if ("b".equals(k)) {
+                    if (v.size() <= bannerSize || bannerSize==0) {
+                        bannerList.addAll(v);
+                    } else {
+                        bannerList.addAll(selectRandomData(v, bannerSize));
+                    }
+                } else if ("r".equals(k)) {
+                    if (v.size() <= hotSize|| hotSize==0) {
+                        hotList.addAll(v);
+                    } else {
+                        hotList.addAll(selectRandomData(v, hotSize));
+                    }
+                } else if ("t".equals(k)) {
+                    if (v.size() <= recommendSize|| recommendSize==0) {
+                        recommendList.addAll(v);
+                    } else {
+                        recommendList.addAll(selectRandomData(v, recommendSize));
+                    }
+                }
+            });
+            return new DataList(bannerList, hotList, recommendList);
+        });
+
+        return RStatus.successList(map);
+    }
+
+    public static <T> List<T> selectRandomData(List<T> dataList, int count) {
+        List<T> selectedData = new ArrayList<>();
+        Random random = new Random();
+
+        while (selectedData.size() < count) {
+            int randomIndex = random.nextInt(dataList.size());
+            T data = dataList.get(randomIndex);
+
+            if (!selectedData.contains(data)) {
+                selectedData.add(data);
+            }
+        }
+        return selectedData;
+    }
+
+}

+ 31 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbOut/request/HomePageItemOutRequest.java

@@ -0,0 +1,31 @@
+package com.webflux.launchadmin.mysql.controller.lbOut.request;
+
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class HomePageItemOutRequest {
+
+    /**
+     * 全部:0 ;其他数值对应数量
+     */
+    @NotNull
+    private Integer bannerSize;
+    /**
+     * 全部:0 ;其他数值对应数量
+     */
+    @NotNull
+    private Integer hotSize;
+
+    /**
+     * 全部:0 ;其他数值对应数量recommend
+     */
+    @NotNull
+    private Integer recommendSize;
+
+
+    @NotNull
+    private String homePageId;
+
+}

+ 9 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbOut/resp/DataList.java

@@ -0,0 +1,9 @@
+package com.webflux.launchadmin.mysql.controller.lbOut.resp;
+
+import java.util.List;
+
+public record DataList<T>(
+        List<T> Bannerlists,
+        List<T> hotLists,
+        List<T> recommendLists) {
+}

+ 132 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/testController.java

@@ -0,0 +1,132 @@
+package com.webflux.launchadmin.mysql.controller;
+
+
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+
+import com.webflux.launchadmin.context.UserContext;
+import com.webflux.launchadmin.context.XxlSsoUser;
+import com.webflux.launchadmin.mysql.entity.test.Tweet;
+import com.webflux.launchadmin.mysql.repository.test.TweetRepository;
+import com.webflux.launchcommon.returnObj.Paged;
+import com.webflux.launchcommon.returnObj.RData;
+import com.webflux.launchcommon.returnObj.RStatus;
+import io.r2dbc.spi.Connection;
+import io.r2dbc.spi.ConnectionFactories;
+import io.r2dbc.spi.ConnectionFactory;
+import io.r2dbc.spi.ConnectionMetadata;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
+import org.springframework.data.redis.core.ReactiveRedisTemplate;
+import org.springframework.data.relational.core.query.Criteria;
+import org.springframework.data.relational.core.query.Query;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import reactor.core.publisher.Mono;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Objects;
+
+
+/**
+ * 测试
+ */
+@RestController
+@RequestMapping("test")
+@Slf4j
+public class testController {
+
+    @Autowired
+    private ReactiveRedisTemplate<String,Object> reactiveRedisTemplate;
+    @Resource
+    private TweetRepository tweetRepository;
+    @Resource
+    private R2dbcEntityTemplate template;
+
+    @GetMapping("get5")
+    public void  get5()   {
+        // Notice: the query string must be URL encoded 172.18.71.27:3306/launch_platform
+//        ConnectionFactory connectionFactory = ConnectionFactories.get("r2dbcs:mysql://launch_platform:launch_platform@172.18.71.27:3306/launch_platform");
+//        R2dbcEntityTemplate template = new R2dbcEntityTemplate(connectionFactory);
+//        Mono<Tweet> joe = template.insert(new Tweet(null, "Joe"));
+//        joe.subscribe(System.out::println);
+
+
+    }
+    @GetMapping("get4")
+    public void  get4()   {
+        // url: r2dbcs:mysql://172.18.71.27:3306/launch_platform?serverZoneId=GMT%2b8&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8  # r2dbcs:mysql://127.0.0.1:3306/test?serverZoneId=GMT%2b8&characterEncoding=UTF-8
+        //    username: launch_platform # root
+        //    password: launch_platform # 'QWERqwer!@#123'
+        // Notice: the query string must be URL encoded 172.18.71.27:3306/launch_platform
+//        ConnectionFactory connectionFactory = ConnectionFactories.get("r2dbcs:mysql://wx_share_liuwei:Wx_ShARe56578AwCH@rm-uf6xylut5n33hb3o5ro.mysql.rds.aliyuncs.com:3306/wx_share_test");
+//        R2dbcEntityTemplate template = new R2dbcEntityTemplate(connectionFactory);
+//        Mono<Tweet> joe = template.insert(new Tweet(10L, "Joe"));
+//        joe.subscribe(System.out::println);
+
+
+    }
+
+
+    @GetMapping("get3")
+    public Mono<RStatus<Paged>>  test3()   {
+        Mono<Paged> pagedMono = template.count(Query.query(Criteria.where("text").is("a")), Tweet.class).flatMap(fm ->
+                tweetRepository.findByText("a", PageRequest.of(1, 2)).collectList().map(list -> new Paged(fm, list))
+        );
+        Mono<RStatus<Paged>> rStatusMono = RStatus.successList(pagedMono);
+        return rStatusMono;
+    }
+
+    @GetMapping("get2")
+    public Mono<RStatus<List<String>>>  test2()   {
+        Mono<List<String>> listMono = Mono.just(List.of("1","2","3"));
+        Mono<RStatus<List<String>>> rStatusMono = RStatus.successList(listMono);
+        return rStatusMono;
+
+    }
+    /**
+     * 测试
+     * @throws IOException
+     */
+    @GetMapping("get1")
+    public void  test1() throws IOException {
+
+        String cookie="xxl_sso_sessionid=163d1c98_105d7dd139984b53be1b39fb7e8ad1c8";
+        CloseableHttpClient httpclient = HttpClients.createDefault();
+        HttpGet httpget = new HttpGet("https://kuaitou.mokamrp.com/api/system/admin/getAdminInfo");
+        httpget.setHeader("Cookie",cookie);
+        CloseableHttpResponse response = httpclient.execute(httpget);
+        try {
+            HttpEntity entity = response.getEntity();
+            String result = EntityUtils.toString(entity);
+            EntityUtils.consume(entity);
+            if (Objects.nonNull(result)) {
+                JSONObject jsonObject = JSONUtil.parseObj(result);
+                if (jsonObject.containsKey("code") && jsonObject.get("code", Integer.class) == 200) {
+                    if(jsonObject.containsKey("data")){
+                        com.webflux.launchadmin.context.XxlSsoUser data = jsonObject.get("data", XxlSsoUser.class);
+                        UserContext.cMap.put(cookie,data);
+                    }
+                }else {
+                  //  return false;
+                }
+            }
+        } catch (Exception e) {
+           // return true;
+        } finally {
+            response.close();
+        }
+    }
+
+}

+ 21 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/entity/lb/HomePageTemp.java

@@ -0,0 +1,21 @@
+package com.webflux.launchadmin.mysql.entity.lb;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.relational.core.mapping.Table;
+
+import java.time.ZonedDateTime;
+
+@Table("home_page_temp")
+public record HomePageTemp(
+        @Id Long homePageId,
+        String homePageName,
+        Long typeId,
+        String typeName,
+        String userId,
+        String UserName,
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") ZonedDateTime createTime,
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") ZonedDateTime updateTime
+
+) {
+}

+ 26 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/entity/lb/HomePageTempItem.java

@@ -0,0 +1,26 @@
+package com.webflux.launchadmin.mysql.entity.lb;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.relational.core.mapping.Table;
+
+import java.time.ZonedDateTime;
+
+@Table("home_page_temp_item")
+public record HomePageTempItem(
+        @Id Long homePageItemId,
+        Long homePageId,
+        String userId,
+        String userName,
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") ZonedDateTime createTime,
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") ZonedDateTime updateTime,
+        String itmeType,
+        String title,
+        String url,
+        Long urlSize,
+        Long urlWidth,
+        Long urlHigh,
+        String urlMd5,
+        String link
+) {
+}

+ 9 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/repository/lb/HomePageTempItemRepository.java

@@ -0,0 +1,9 @@
+package com.webflux.launchadmin.mysql.repository.lb;
+
+import com.webflux.launchadmin.mysql.entity.lb.HomePageTempItem;
+import org.springframework.data.r2dbc.repository.R2dbcRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface HomePageTempItemRepository extends R2dbcRepository<HomePageTempItem,Long> {
+}

+ 9 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/repository/lb/HomePageTempRepository.java

@@ -0,0 +1,9 @@
+package com.webflux.launchadmin.mysql.repository.lb;
+
+import com.webflux.launchadmin.mysql.entity.lb.HomePageTemp;
+import org.springframework.data.r2dbc.repository.R2dbcRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface HomePageTempRepository extends R2dbcRepository<HomePageTemp,Long> {
+}

+ 5 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/repository/test/TweetRepository.java

@@ -2,9 +2,14 @@ package com.webflux.launchadmin.mysql.repository.test;
 
 
 import com.webflux.launchadmin.mysql.entity.test.Tweet;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.r2dbc.repository.R2dbcRepository;
 import org.springframework.stereotype.Repository;
+import reactor.core.publisher.Flux;
 
 @Repository
 public interface TweetRepository extends R2dbcRepository<Tweet,Long> {
+
+    Flux<Tweet> findByText(String text, Pageable pageable);
+
 }

+ 9 - 7
launch-admin/src/main/java/com/webflux/launchadmin/mysql/service/test/TweetService.java

@@ -5,16 +5,18 @@ import com.webflux.launchadmin.mysql.repository.test.TweetRepository;
 import jakarta.annotation.Resource;
 import org.springframework.data.r2dbc.repository.R2dbcRepository;
 import org.springframework.stereotype.Service;
+import org.springframework.web.reactive.DispatcherHandler;
 import reactor.core.publisher.Flux;
 
 @Service
 public class TweetService {
-    @Resource
-    private R2dbcRepository repository;
-    @Resource
-    private TweetRepository tweetRepository;
+//    @Resource
+//    private R2dbcRepository repository;
+//    @Resource
+//    private TweetRepository tweetRepository;
 
-    public Flux<Tweet> getAll(){
-       return tweetRepository.findAll();
-    }
+//    public Flux<Tweet> getAll(){
+//
+//        return tweetRepository.findAll();
+//    }
 }

+ 12 - 0
launch-admin/src/main/resources/application-dev.yml

@@ -0,0 +1,12 @@
+spring:
+  data:
+    redis:
+      host: 47.103.172.247
+      port: 52525
+      password: NTZY_LOg666%$_redis
+      database: 0
+      timeout: 10000
+  r2dbc:
+    url: r2dbcs:mysql://rm-uf6xylut5n33hb3o5ro.mysql.rds.aliyuncs.com:3306/wx_share_test?serverZoneId=GMT%2b8&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&ssl=false&sslMode=DISABLED
+    username: wx_share_liuwei
+    password: Wx_ShARe56578AwCH

+ 12 - 0
launch-admin/src/main/resources/application-prod.yml

@@ -0,0 +1,12 @@
+spring:
+  data:
+    redis:
+      host: 47.103.172.247
+      port: 52525
+      password: NTZY_LOg666%$_redis
+      database: 0
+      timeout: 10000
+  r2dbc:
+    url: r2dbcs:mysql://rm-uf6xylut5n33hb3o5ro.mysql.rds.aliyuncs.com:3306/wx_share_test?serverZoneId=GMT%2b8&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&ssl=false&sslMode=DISABLED
+    username: wx_share_liuwei
+    password: Wx_ShARe56578AwCH

+ 17 - 0
launch-admin/src/main/resources/application.yml

@@ -0,0 +1,17 @@
+server:
+  port: 9800
+
+spring:
+  application:
+    name: launch-webflux
+  profiles:
+    # 环境配置
+    active: dev
+
+
+xxl:
+  sso:
+    server: https://sso.mokamrp.com/sso/login?redirect_url=https://test.space.mokamrp.com
+    excluded:
+      paths: /assetManagementHugeCreatedEvent/conversion
+      start: /out/

+ 0 - 37
launch-admin/src/main/resources/bootstrap.yml

@@ -1,37 +0,0 @@
-server:
-  port: 8080
-#  servlet:
-#    context-path: /
-#  compression:
-#    enabled: true
-#    mime-types: text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json
-#    min-response-size: 1024
-#  http2:
-#    enabled: true
-
-springdoc:
-  swagger-ui:
-    path: /launch/index.html
-    enabled: true
-  api-docs:
-    path: /launch/v3/api-docs
-    enabled: true #开启swagger界面 依赖openApi 需要openApi打开
-
-spring:
-  application:
-    name: launch-webflux
-  cloud:
-    nacos:
-      discovery:
-        server-addr: 172.18.71.46:8848  # 127.0.0.1:8848  #
-  elasticsearch:
-    rest:
-      uris: 127.0.0.1:9200
-  r2dbc:
-    url: r2dbcs:mysql://172.18.71.27:3306/launch_platform?serverZoneId=GMT%2b8&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8  # r2dbcs:mysql://127.0.0.1:3306/test?serverZoneId=GMT%2b8&characterEncoding=UTF-8
-    username: launch_platform # root
-    password: launch_platform # 'QWERqwer!@#123'
-
-#    url: jdbc:mysql://172.18.71.27:3306/launch_platform?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-#      username: launch_platform
-#      password: launch_platform

+ 25 - 0
launch-admin/src/main/resources/smart-doc.json

@@ -0,0 +1,25 @@
+{
+  "outPath": "F://smart_doc_dome",
+  "serverUrl": "http://127.0.0.1:9201",
+  "isStrict": false,
+  "packageFilters": "com.webflux.launchadmin.mysql.controller",
+  "projectName": "API",
+  "appKey": "",
+  "appToken": "7d846275fe5b46988e32d7c637838d07",
+  "secret": "",
+  "openUrl": "http://localhost:7788/api",
+  "debugEnvName": "测试环境",
+  "debugEnvUrl": "http://127.0.0.1:9201",
+  "author": "liuwei",
+  "sortByTitle": true,
+  "requestHeaders": [
+    {
+      "name": "Cookie",
+      "type": "string",
+      "desc": "你的xxl_sso_sessionid",
+      "value": "xxl_sso_sessionid=163d1c98_140055b8ccc444ba8b1b4acb72cd65ad",
+      "required": false,
+      "since": "-"
+    }
+  ]
+}

+ 12 - 3
launch-admin/src/test/java/com/webflux/launchadmin/LaunchAdminApplicationTests.java

@@ -3,11 +3,20 @@ package com.webflux.launchadmin;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Spliterator;
+import java.util.concurrent.Phaser;
+import java.util.stream.Stream;
+
 @SpringBootTest
 class LaunchAdminApplicationTests {
 
-    @Test
-    void contextLoads() {
-    }
+@Test
+    public void te(){
+
+
+}
 
 }

+ 17 - 0
launch-common/pom.xml

@@ -17,6 +17,23 @@
     <description>通用工具</description>
 
     <dependencies>
+        <!--webflux-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-webflux</artifactId>
+        </dependency>
+        <!--lombok -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.3.7</version>
+        </dependency>
+
     </dependencies>
 
 

+ 23 - 0
launch-common/src/main/java/com/webflux/launchcommon/returnObj/CustomExceptionHandler.java

@@ -0,0 +1,23 @@
+package com.webflux.launchcommon.returnObj;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import reactor.core.publisher.Mono;
+
+@Slf4j
+@RestControllerAdvice
+public class CustomExceptionHandler {
+
+    @ExceptionHandler(Exception.class)
+    public Mono<RW<Object>> handleCustomException(Exception e) {
+        log.info("捕获到未处理的Exception异常:{}",e);
+        return RW.fail("9999",Mono.just(e.getMessage()));
+    }
+
+//    @ExceptionHandler(BusinessException.class)
+//    public Mono<RW<Object>> handleBusinessException(BusinessException e) {
+//        log.info("捕获到BusinessException异常:{}",e);
+//        return RW.fail(e.getCode(),e.getMessage());
+//    }
+}

+ 6 - 0
launch-common/src/main/java/com/webflux/launchcommon/returnObj/Paged.java

@@ -0,0 +1,6 @@
+package com.webflux.launchcommon.returnObj;
+
+import java.util.List;
+
+public record Paged<T>(long total, List<T> list) {
+}

+ 40 - 0
launch-common/src/main/java/com/webflux/launchcommon/returnObj/RData.java

@@ -0,0 +1,40 @@
+package com.webflux.launchcommon.returnObj;
+
+
+import lombok.Data;
+import reactor.core.publisher.Mono;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 返回结果
+ *
+ * @author lyr
+ */
+@Data
+public class RData<T> implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+
+    private Integer page = 1;
+    private Integer size = 10;
+    private Long total = 10L;
+    private T list;
+
+
+
+   public static <T> RData<T> createR(Integer page, Integer size, Long total,  T list){
+       RData<T> trData = new RData<>();
+       trData.setList(list);
+       trData.setSize(size);
+       trData.setPage(page);
+       trData.setTotal(total);
+       return trData;
+   }
+
+
+
+}
+

+ 101 - 0
launch-common/src/main/java/com/webflux/launchcommon/returnObj/RStatus.java

@@ -0,0 +1,101 @@
+package com.webflux.launchcommon.returnObj;
+
+
+import lombok.Data;
+import reactor.core.publisher.Mono;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 返回结果
+ *
+ * @author lyr
+ */
+@Data
+public class RStatus<T> implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    // 处理成功
+    public static final String OK = "200";
+    // 成功描述
+    public static final String OK_MSG = "操作成功";
+    // 其他错误
+    public static final String ERR = "500";
+    // 其他错误
+    public static final String ERR_MSG = "操作失败";
+
+    public static final RStatus SUCCESS = new RStatus(OK, OK_MSG);
+
+    private String code = ERR;
+
+    private String msg = "";
+
+    private T data;
+
+    public static <T> Mono<RStatus<T>> fail(Mono<T> monoData) {
+        return createR(ERR, ERR_MSG,monoData);
+    }
+
+    public static <T> Mono<RStatus<T>> fail(String message, Mono<T> monoData) {
+        return createR(ERR, message, monoData);
+    }
+
+    public static <T> Mono<RStatus<T>> fail(String code, String message, Mono<T> monoData) {
+        return createR(code, message,monoData);
+    }
+
+    public static <T> Mono<RStatus<T>> success(String message, Mono<T> monoData) {
+        return createR(OK, message,monoData);
+    }
+
+    public static <T> Mono<RStatus<T>> success(Mono<T> monoData) {
+        return createR(OK, OK_MSG, monoData);
+    }
+    public static <T> Mono<RStatus<T>> successList(Mono<T> monoData) {
+        return createRList(OK, OK_MSG, monoData);
+    }
+
+
+   private static <T> Mono<RStatus<T>> createR(String code, String msg, Mono<T> monoData){
+      return monoData.map(data->{
+           final RStatus rw = new RStatus();
+           rw.setData(data);
+           rw.setCode(code);
+           rw.setMsg(msg);
+           return rw;
+       });
+
+    }
+
+
+    private static <T> Mono<RStatus<T>> createRList(String code, String msg, Mono<T> monoData){
+        return monoData.map(data->{
+            final RStatus rw = new RStatus();
+            rw.setData(data);
+            rw.setCode(code);
+            rw.setMsg(msg);
+            return rw;
+        });
+    }
+
+    public RStatus() {
+    }
+
+    private RStatus(String code, String message) {
+        this.code = code;
+        this.msg = message;
+    }
+
+    private RStatus(String code, String message, T result) {
+        this.code = code;
+        this.msg = message;
+        this.data = result;
+    }
+
+    public boolean isSuccess(){
+        return OK.equals(code);
+    }
+
+}
+

+ 88 - 0
launch-common/src/main/java/com/webflux/launchcommon/returnObj/RW.java

@@ -0,0 +1,88 @@
+package com.webflux.launchcommon.returnObj;
+
+
+import lombok.Data;
+import reactor.core.publisher.Mono;
+
+import java.io.Serializable;
+
+/**
+ * 返回结果
+ *
+ * @author lyr
+ */
+@Data
+public class RW<T> implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    // 处理成功
+    public static final String OK = "200";
+    // 成功描述
+    public static final String OK_MSG = "操作成功";
+    // 其他错误
+    public static final String ERR = "500";
+    // 其他错误
+    public static final String ERR_MSG = "操作失败";
+
+    public static final RW SUCCESS = new RW(OK, OK_MSG);
+
+    private String code = ERR;
+
+    private String msg = "";
+
+    private T data;
+
+    public static <T> Mono<RW<T>> fail(Mono<T> monoData) {
+        return createR(ERR, ERR_MSG,monoData);
+    }
+
+    public static <T> Mono<RW<T>> fail(String message,Mono<T> monoData) {
+        return createR(ERR, message, monoData);
+    }
+
+    public static <T> Mono<RW<T>> fail(String code, String message,Mono<T> monoData) {
+        return createR(code, message,monoData);
+    }
+
+    public static <T> Mono<RW<T>> success(String message,Mono<T> monoData) {
+        return createR(OK, message,monoData);
+    }
+
+    public static <T> Mono<RW<T>> success(Mono<T> monoData) {
+        return createR(OK, OK_MSG, monoData);
+    }
+
+
+
+   private static <T> Mono<RW<T>> createR(String code, String msg, Mono<T> monoData){
+      return monoData.map(data->{
+           final RW rw = new RW();
+           rw.setData(data);
+           rw.setCode(code);
+           rw.setMsg(msg);
+           return rw;
+       });
+
+    }
+
+
+    public RW() {
+    }
+
+    private RW(String code, String message) {
+        this.code = code;
+        this.msg = message;
+    }
+
+    private RW(String code, String message, T result) {
+        this.code = code;
+        this.msg = message;
+        this.data = result;
+    }
+
+    public boolean isSuccess(){
+        return OK.equals(code);
+    }
+
+}
+

+ 156 - 0
launch-common/src/main/java/com/webflux/launchcommon/utils/AjaxResult.java

@@ -0,0 +1,156 @@
+package com.webflux.launchcommon.utils;
+
+
+
+import java.util.HashMap;
+
+/**
+ * ajax结果
+ * 操作消息提醒
+ *
+ * @author launch
+ * @date 2022/10/19
+ */
+public class AjaxResult extends HashMap<String, Object> {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 状态码
+     */
+    public static final String CODE_TAG = "code";
+
+    /**
+     * 返回内容
+     */
+    public static final String MSG_TAG = "msg";
+
+    /**
+     * 数据对象
+     */
+    public static final String DATA_TAG = "data";
+
+    /**
+     * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。
+     */
+    public AjaxResult() {
+    }
+
+    /**
+     * 初始化一个新创建的 AjaxResult 对象
+     *
+     * @param code 状态码
+     * @param msg  返回内容
+     */
+    public AjaxResult(int code, String msg) {
+        super.put(CODE_TAG, code);
+        super.put(MSG_TAG, msg);
+    }
+
+    /**
+     * 初始化一个新创建的 AjaxResult 对象
+     *
+     * @param code 状态码
+     * @param msg  返回内容
+     * @param data 数据对象
+     */
+    public AjaxResult(int code, String msg, Object data) {
+        super.put(CODE_TAG, code);
+        super.put(MSG_TAG, msg);
+        if (StringUtils.isNotNull(data)) {
+            super.put(DATA_TAG, data);
+        }
+    }
+
+    /**
+     * 方便链式调用
+     *
+     * @param key
+     * @param value
+     * @return
+     */
+    @Override
+    public AjaxResult put(String key, Object value) {
+        super.put(key, value);
+        return this;
+    }
+
+    /**
+     * 返回成功消息
+     *
+     * @return 成功消息
+     */
+    public static AjaxResult success() {
+        return AjaxResult.success("操作成功");
+    }
+
+    /**
+     * 返回成功数据
+     *
+     * @return 成功消息
+     */
+    public static AjaxResult success(Object data) {
+        return AjaxResult.success("操作成功", data);
+    }
+
+    /**
+     * 返回成功消息
+     *
+     * @param msg 返回内容
+     * @return 成功消息
+     */
+    public static AjaxResult success(String msg) {
+        return AjaxResult.success(msg, null);
+    }
+
+    /**
+     * 返回成功消息
+     *
+     * @param msg  返回内容
+     * @param data 数据对象
+     * @return 成功消息
+     */
+    public static AjaxResult success(String msg, Object data) {
+        return new AjaxResult(HttpStatus.SUCCESS, msg, data);
+    }
+
+    /**
+     * 返回错误消息
+     *
+     * @return
+     */
+    public static AjaxResult error() {
+        return AjaxResult.error("操作失败");
+    }
+
+    /**
+     * 返回错误消息
+     *
+     * @param msg 返回内容
+     * @return 警告消息
+     */
+    public static AjaxResult error(String msg) {
+        return AjaxResult.error(msg, null);
+    }
+
+    /**
+     * 返回错误消息
+     *
+     * @param msg  返回内容
+     * @param data 数据对象
+     * @return 警告消息
+     */
+    public static AjaxResult error(String msg, Object data) {
+        return new AjaxResult(HttpStatus.ERROR, msg, data);
+    }
+
+    /**
+     * 返回错误消息
+     *
+     * @param code 状态码
+     * @param msg  返回内容
+     * @return 警告消息
+     */
+    public static AjaxResult error(int code, String msg) {
+        return new AjaxResult(code, msg, null);
+    }
+}

+ 114 - 0
launch-common/src/main/java/com/webflux/launchcommon/utils/Constants.java

@@ -0,0 +1,114 @@
+package com.webflux.launchcommon.utils;
+
+/**
+ * 通用常量信息
+ * 
+ * @author launch
+ */
+public class Constants
+{
+    /**
+     * UTF-8 字符集
+     */
+    public static final String UTF8 = "UTF-8";
+
+    /**
+     * GBK 字符集
+     */
+    public static final String GBK = "GBK";
+
+    /**
+     * RMI 远程方法调用
+     */
+    public static final String LOOKUP_RMI = "rmi://";
+
+    /**
+     * http请求
+     */
+    public static final String HTTP = "http://";
+
+    /**
+     * https请求
+     */
+    public static final String HTTPS = "https://";
+
+    /**
+     * 成功标记
+     */
+    public static final Integer SUCCESS = 200;
+
+    /**
+     * 失败标记
+     */
+    public static final Integer FAIL = 500;
+
+    /**
+     * 登录成功
+     */
+    public static final String LOGIN_SUCCESS = "Success";
+
+    /**
+     * 注销
+     */
+    public static final String LOGOUT = "Logout";
+
+    /**
+     * 注册
+     */
+    public static final String REGISTER = "Register";
+
+    /**
+     * 登录失败
+     */
+    public static final String LOGIN_FAIL = "Error";
+
+    /**
+     * 当前记录起始索引
+     */
+    public static final String PAGE_NUM = "pageNum";
+
+    /**
+     * 每页显示记录数
+     */
+    public static final String PAGE_SIZE = "pageSize";
+
+    /**
+     * 排序列
+     */
+    public static final String ORDER_BY_COLUMN = "orderByColumn";
+
+    /**
+     * 排序的方向 "desc" 或者 "asc".
+     */
+    public static final String IS_ASC = "isAsc";
+
+    /**
+     * 验证码 redis key
+     */
+    public static final String CAPTCHA_CODE_KEY = "captcha_codes:";
+
+    /**
+     * 验证码有效期(分钟)
+     */
+    public static final long CAPTCHA_EXPIRATION = 2;
+
+    /**
+     * 令牌有效期(分钟)
+     */
+    public final static long TOKEN_EXPIRE = 720;
+
+    /**
+     * 参数管理 cache key
+     */
+    public static final String SYS_CONFIG_KEY = "sys_config:";
+
+    /**
+     * 字典管理 cache key
+     */
+    public static final String SYS_DICT_KEY = "sys_dict:";
+
+    /**
+     * 资源映射路径 前缀
+     */
+    public static final String RESOURCE_PREFIX = "/profile";
+}

+ 97 - 0
launch-common/src/main/java/com/webflux/launchcommon/utils/HttpStatus.java

@@ -0,0 +1,97 @@
+package com.webflux.launchcommon.utils;
+
+/**
+ * 返回状态码
+ *
+ * @author launch
+ */
+public class HttpStatus {
+
+    /**
+     * 执行
+     */
+    public static final int EXECUTE = 456789;
+    /**
+     * 等待
+     */
+    public static final int WAIT = 987987;
+    /**
+     * 操作成功
+     */
+    public static final int SUCCESS = 200;
+
+    /**
+     * 对象创建成功
+     */
+    public static final int CREATED = 201;
+
+    /**
+     * 请求已经被接受
+     */
+    public static final int ACCEPTED = 202;
+
+    /**
+     * 操作已经执行成功,但是没有返回数据
+     */
+    public static final int NO_CONTENT = 204;
+
+    /**
+     * 资源已被移除
+     */
+    public static final int MOVED_PERM = 301;
+
+    /**
+     * 重定向
+     */
+    public static final int SEE_OTHER = 303;
+
+    /**
+     * 资源没有被修改
+     */
+    public static final int NOT_MODIFIED = 304;
+
+    /**
+     * 参数列表错误(缺少,格式不匹配)
+     */
+    public static final int BAD_REQUEST = 400;
+
+    /**
+     * 未授权
+     */
+    public static final int UNAUTHORIZED = 401;
+
+    /**
+     * 访问受限,授权过期
+     */
+    public static final int FORBIDDEN = 403;
+
+    /**
+     * 资源,服务未找到
+     */
+    public static final int NOT_FOUND = 404;
+
+    /**
+     * 不允许的http方法
+     */
+    public static final int BAD_METHOD = 405;
+
+    /**
+     * 资源冲突,或者资源被锁
+     */
+    public static final int CONFLICT = 409;
+
+    /**
+     * 不支持的数据,媒体类型
+     */
+    public static final int UNSUPPORTED_TYPE = 415;
+
+    /**
+     * 系统内部错误
+     */
+    public static final int ERROR = 500;
+
+    /**
+     * 接口未实现
+     */
+    public static final int NOT_IMPLEMENTED = 501;
+}

+ 105 - 0
launch-common/src/main/java/com/webflux/launchcommon/utils/R.java

@@ -0,0 +1,105 @@
+package com.webflux.launchcommon.utils;
+
+
+import java.io.Serializable;
+
+/**
+ * 响应信息主体
+ *
+ * @author launch
+ */
+public class R<T> implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 成功 */
+    public static final int SUCCESS = Constants.SUCCESS;
+
+    /** 失败 */
+    public static final int FAIL = Constants.FAIL;
+
+    private int code;
+
+    private String msg;
+
+    private T data;
+
+    public static <T> R<T> ok()
+    {
+        return restResult(null, SUCCESS, null);
+    }
+
+    public static <T> R<T> ok(T data)
+    {
+        return restResult(data, SUCCESS, null);
+    }
+
+    public static <T> R<T> ok(T data, String msg)
+    {
+        return restResult(data, SUCCESS, msg);
+    }
+
+    public static <T> R<T> fail()
+    {
+        return restResult(null, FAIL, null);
+    }
+
+    public static <T> R<T> fail(String msg)
+    {
+        return restResult(null, FAIL, msg);
+    }
+
+    public static <T> R<T> fail(T data)
+    {
+        return restResult(data, FAIL, null);
+    }
+
+    public static <T> R<T> fail(T data, String msg)
+    {
+        return restResult(data, FAIL, msg);
+    }
+
+    public static <T> R<T> fail(int code, String msg)
+    {
+        return restResult(null, code, msg);
+    }
+
+    private static <T> R<T> restResult(T data, int code, String msg)
+    {
+        R<T> apiResult = new R<>();
+        apiResult.setCode(code);
+        apiResult.setData(data);
+        apiResult.setMsg(msg);
+        return apiResult;
+    }
+
+    public int getCode()
+    {
+        return code;
+    }
+
+    public void setCode(int code)
+    {
+        this.code = code;
+    }
+
+    public String getMsg()
+    {
+        return msg;
+    }
+
+    public void setMsg(String msg)
+    {
+        this.msg = msg;
+    }
+
+    public T getData()
+    {
+        return data;
+    }
+
+    public void setData(T data)
+    {
+        this.data = data;
+    }
+}

+ 26 - 0
launch-common/src/main/java/com/webflux/launchcommon/utils/RL.java

@@ -0,0 +1,26 @@
+package com.webflux.launchcommon.utils;
+
+
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 响应信息主体
+ *
+ * @author launch
+ */
+@Data
+public class RL implements Serializable
+{
+
+    private int code;
+
+    private String msg;
+
+    private String loginPageUrl;
+
+
+
+}

+ 119 - 0
launch-common/src/main/java/com/webflux/launchcommon/utils/ServletUtils.java

@@ -0,0 +1,119 @@
+package com.webflux.launchcommon.utils;
+
+
+import cn.hutool.json.JSONUtil;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import reactor.core.publisher.Mono;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+
+/**
+ * 客户端工具类
+ * 
+ * @author launch
+ */
+public class ServletUtils
+{
+
+
+
+    /**
+     * 内容编码
+     * 
+     * @param str 内容
+     * @return 编码后的内容
+     */
+    public static String urlEncode(String str)
+    {
+        try
+        {
+            return URLEncoder.encode(str, Constants.UTF8);
+        }
+        catch (UnsupportedEncodingException e)
+        {
+            return "";
+        }
+    }
+
+    /**
+     * 内容解码
+     * 
+     * @param str 内容
+     * @return 解码后的内容
+     */
+    public static String urlDecode(String str)
+    {
+        try
+        {
+            return URLDecoder.decode(str, Constants.UTF8);
+        }
+        catch (UnsupportedEncodingException e)
+        {
+            return "";
+        }
+    }
+
+    /**
+     * 设置webflux模型响应
+     *
+     * @param response ServerHttpResponse
+     * @param value 响应内容
+     * @return Mono<Void>
+     */
+    public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, Object value)
+    {
+        return webFluxResponseWriter(response, HttpStatus.OK, value, R.FAIL);
+    }
+
+    /**
+     * 设置webflux模型响应
+     *
+     * @param response ServerHttpResponse
+     * @param code 响应状态码
+     * @param value 响应内容
+     * @return Mono<Void>
+     */
+    public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, Object value, int code)
+    {
+        return webFluxResponseWriter(response, HttpStatus.OK, value, code);
+    }
+
+    /**
+     * 设置webflux模型响应
+     *
+     * @param response ServerHttpResponse
+     * @param status http状态码
+     * @param code 响应状态码
+     * @param value 响应内容
+     * @return Mono<Void>
+     */
+    public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, HttpStatus status, Object value, int code)
+    {
+        return webFluxResponseWriter(response, MediaType.APPLICATION_JSON_VALUE, status, value, code);
+    }
+
+    /**
+     * 设置webflux模型响应
+     *
+     * @param response ServerHttpResponse
+     * @param contentType content-type
+     * @param status http状态码
+     * @param code 响应状态码
+     * @param value 响应内容
+     * @return Mono<Void>
+     */
+    public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, String contentType, HttpStatus status, Object value, int code)
+    {
+        response.setStatusCode(status);
+        response.getHeaders().add(HttpHeaders.CONTENT_TYPE, contentType);
+        R<?> result = R.fail(code, value.toString());
+        DataBuffer dataBuffer = response.bufferFactory().wrap(JSONUtil.toJsonStr(result).getBytes());
+        return response.writeWith(Mono.just(dataBuffer));
+    }
+}

+ 452 - 0
launch-common/src/main/java/com/webflux/launchcommon/utils/StringUtils.java

@@ -0,0 +1,452 @@
+package com.webflux.launchcommon.utils;
+
+
+import org.springframework.util.AntPathMatcher;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 字符串工具类
+ * 
+ * @author launch
+ */
+public class StringUtils extends org.springframework.util.StringUtils
+{
+    /** 空字符串 */
+    private static final String NULLSTR = "";
+
+    /** 下划线 */
+    private static final char SEPARATOR = '_';
+
+    /**
+     * 获取参数不为空值
+     * 
+     * @param value defaultValue 要判断的value
+     * @return value 返回值
+     */
+    public static <T> T nvl(T value, T defaultValue)
+    {
+        return value != null ? value : defaultValue;
+    }
+
+    /**
+     * * 判断一个Collection是否为空, 包含List,Set,Queue
+     * 
+     * @param coll 要判断的Collection
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Collection<?> coll)
+    {
+        return isNull(coll) || coll.isEmpty();
+    }
+
+    /**
+     * * 判断一个Collection是否非空,包含List,Set,Queue
+     * 
+     * @param coll 要判断的Collection
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Collection<?> coll)
+    {
+        return !isEmpty(coll);
+    }
+
+    /**
+     * * 判断一个对象数组是否为空
+     * 
+     * @param objects 要判断的对象数组
+     ** @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Object[] objects)
+    {
+        return isNull(objects) || (objects.length == 0);
+    }
+
+    /**
+     * * 判断一个对象数组是否非空
+     * 
+     * @param objects 要判断的对象数组
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Object[] objects)
+    {
+        return !isEmpty(objects);
+    }
+
+    /**
+     * * 判断一个Map是否为空
+     * 
+     * @param map 要判断的Map
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Map<?, ?> map)
+    {
+        return isNull(map) || map.isEmpty();
+    }
+
+    /**
+     * * 判断一个Map是否为空
+     * 
+     * @param map 要判断的Map
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Map<?, ?> map)
+    {
+        return !isEmpty(map);
+    }
+
+    /**
+     * * 判断一个字符串是否为空串
+     * 
+     * @param str String
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(String str)
+    {
+        return isNull(str) || NULLSTR.equals(str.trim());
+    }
+
+    /**
+     * * 判断一个字符串是否为非空串
+     * 
+     * @param str String
+     * @return true:非空串 false:空串
+     */
+    public static boolean isNotEmpty(String str)
+    {
+        return !isEmpty(str);
+    }
+
+    /**
+     * * 判断一个对象是否为空
+     * 
+     * @param object Object
+     * @return true:为空 false:非空
+     */
+    public static boolean isNull(Object object)
+    {
+        return object == null;
+    }
+
+    /**
+     * * 判断一个对象是否非空
+     * 
+     * @param object Object
+     * @return true:非空 false:空
+     */
+    public static boolean isNotNull(Object object)
+    {
+        return !isNull(object);
+    }
+
+    /**
+     * * 判断一个对象是否是数组类型(Java基本型别的数组)
+     * 
+     * @param object 对象
+     * @return true:是数组 false:不是数组
+     */
+    public static boolean isArray(Object object)
+    {
+        return isNotNull(object) && object.getClass().isArray();
+    }
+
+    /**
+     * 去空格
+     */
+    public static String trim(String str)
+    {
+        return (str == null ? "" : str.trim());
+    }
+
+    /**
+     * 截取字符串
+     * 
+     * @param str 字符串
+     * @param start 开始
+     * @return 结果
+     */
+    public static String substring(final String str, int start)
+    {
+        if (str == null)
+        {
+            return NULLSTR;
+        }
+
+        if (start < 0)
+        {
+            start = str.length() + start;
+        }
+
+        if (start < 0)
+        {
+            start = 0;
+        }
+        if (start > str.length())
+        {
+            return NULLSTR;
+        }
+
+        return str.substring(start);
+    }
+
+    /**
+     * 截取字符串
+     * 
+     * @param str 字符串
+     * @param start 开始
+     * @param end 结束
+     * @return 结果
+     */
+    public static String substring(final String str, int start, int end)
+    {
+        if (str == null)
+        {
+            return NULLSTR;
+        }
+
+        if (end < 0)
+        {
+            end = str.length() + end;
+        }
+        if (start < 0)
+        {
+            start = str.length() + start;
+        }
+
+        if (end > str.length())
+        {
+            end = str.length();
+        }
+
+        if (start > end)
+        {
+            return NULLSTR;
+        }
+
+        if (start < 0)
+        {
+            start = 0;
+        }
+        if (end < 0)
+        {
+            end = 0;
+        }
+
+        return str.substring(start, end);
+    }
+
+    /**
+     * 判断是否为空,并且不是空白字符
+     * 
+     * @param str 要判断的value
+     * @return 结果
+     */
+    public static boolean hasText(String str)
+    {
+        return (str != null && !str.isEmpty() && containsText(str));
+    }
+
+    private static boolean containsText(CharSequence str)
+    {
+        int strLen = str.length();
+        for (int i = 0; i < strLen; i++)
+        {
+            if (!Character.isWhitespace(str.charAt(i)))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+
+
+
+    /**
+     * 驼峰转下划线命名
+     */
+    public static String toUnderScoreCase(String str)
+    {
+        if (str == null)
+        {
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        // 前置字符是否大写
+        boolean preCharIsUpperCase = true;
+        // 当前字符是否大写
+        boolean curreCharIsUpperCase = true;
+        // 下一字符是否大写
+        boolean nexteCharIsUpperCase = true;
+        for (int i = 0; i < str.length(); i++)
+        {
+            char c = str.charAt(i);
+            if (i > 0)
+            {
+                preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1));
+            }
+            else
+            {
+                preCharIsUpperCase = false;
+            }
+
+            curreCharIsUpperCase = Character.isUpperCase(c);
+
+            if (i < (str.length() - 1))
+            {
+                nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1));
+            }
+
+            if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase)
+            {
+                sb.append(SEPARATOR);
+            }
+            else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase)
+            {
+                sb.append(SEPARATOR);
+            }
+            sb.append(Character.toLowerCase(c));
+        }
+
+        return sb.toString();
+    }
+
+    /**
+     * 是否包含字符串
+     * 
+     * @param str 验证字符串
+     * @param strs 字符串组
+     * @return 包含返回true
+     */
+    public static boolean inStringIgnoreCase(String str, String... strs)
+    {
+        if (str != null && strs != null)
+        {
+            for (String s : strs)
+            {
+                if (str.equalsIgnoreCase(trim(s)))
+                {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld
+     * 
+     * @param name 转换前的下划线大写方式命名的字符串
+     * @return 转换后的驼峰式命名的字符串
+     */
+    public static String convertToCamelCase(String name)
+    {
+        StringBuilder result = new StringBuilder();
+        // 快速检查
+        if (name == null || name.isEmpty())
+        {
+            // 没必要转换
+            return "";
+        }
+        else if (!name.contains("_"))
+        {
+            // 不含下划线,仅将首字母大写
+            return name.substring(0, 1).toUpperCase() + name.substring(1);
+        }
+        // 用下划线将原始字符串分割
+        String[] camels = name.split("_");
+        for (String camel : camels)
+        {
+            // 跳过原始字符串中开头、结尾的下换线或双重下划线
+            if (camel.isEmpty())
+            {
+                continue;
+            }
+            // 首字母大写
+            result.append(camel.substring(0, 1).toUpperCase());
+            result.append(camel.substring(1).toLowerCase());
+        }
+        return result.toString();
+    }
+
+    /**
+     * 驼峰式命名法 例如:user_name->userName
+     */
+    public static String toCamelCase(String s)
+    {
+        if (s == null)
+        {
+            return null;
+        }
+        s = s.toLowerCase();
+        StringBuilder sb = new StringBuilder(s.length());
+        boolean upperCase = false;
+        for (int i = 0; i < s.length(); i++)
+        {
+            char c = s.charAt(i);
+
+            if (c == SEPARATOR)
+            {
+                upperCase = true;
+            }
+            else if (upperCase)
+            {
+                sb.append(Character.toUpperCase(c));
+                upperCase = false;
+            }
+            else
+            {
+                sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串
+     * 
+     * @param str 指定字符串
+     * @param strs 需要检查的字符串数组
+     * @return 是否匹配
+     */
+    public static boolean matches(String str, List<String> strs)
+    {
+        if (isEmpty(str) || isEmpty(strs))
+        {
+            return false;
+        }
+        for (String pattern : strs)
+        {
+            if (isMatch(pattern, str))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 判断url是否与规则配置: 
+     * ? 表示单个字符; 
+     * * 表示一层路径内的任意字符串,不可跨层级; 
+     * ** 表示任意层路径;
+     * 
+     * @param pattern 匹配规则
+     * @param url 需要匹配的url
+     * @return
+     */
+    public static boolean isMatch(String pattern, String url)
+    {
+        AntPathMatcher matcher = new AntPathMatcher();
+        return matcher.match(pattern, url);
+    }
+
+    @SuppressWarnings("unchecked")
+    public static <T> T cast(Object obj)
+    {
+        return (T) obj;
+    }
+}

+ 9 - 41
launch-r2dbc/pom.xml

@@ -28,53 +28,21 @@
     </properties>
 
     <dependencies>
-        <!--web -->
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
-        </dependency>
+
         <!--cloud -->
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-config</artifactId>
-        </dependency>
+
         <!--Nacos-->
-        <dependency>
-            <groupId>com.alibaba.nacos</groupId>
-            <artifactId>nacos-client</artifactId>
-            <version>${nacos.client.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.alibaba.cloud</groupId>
-            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
-            <version>${revision}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.alibaba.cloud</groupId>
-            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
-            <version>${revision}</version>
-        </dependency>
+
+
+
         <!-- 使用bootstrap.yml必须依赖此类 -->
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-bootstrap</artifactId>
-        </dependency>
-        <!--webflux-->
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-webflux</artifactId>
-        </dependency>
+
+
         <!-- SpringCloud Openfeign -->
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-openfeign</artifactId>
-        </dependency>
+
         <!-- SpringCloud Loadbalancer -->
 
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
-        </dependency>
+
         <!-- db -->
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 20 - 0
launch-redis/pom.xml

@@ -11,10 +11,30 @@
     <artifactId>launch-redis</artifactId>
 
     <description>Demo project for Spring Boot</description>
+    <properties>
+        <redis.clients>5.0.2</redis.clients>
+        <xxl-version>1.1.1-SNAPSHOT</xxl-version>
 
+    </properties>
 
     <dependencies>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.launch.webflux</groupId>
+            <artifactId>launch-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+
+
     </dependencies>
 
 </project>

+ 45 - 0
launch-redis/src/main/java/com/weblux/launchredis/config/ReactiveRedisConfig.java

@@ -0,0 +1,45 @@
+package com.weblux.launchredis.config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory;
+import org.springframework.data.redis.core.ReactiveRedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializationContext;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+/**
+ * 反应redis配置
+ */
+@Configuration
+public class ReactiveRedisConfig {
+
+    @Bean
+    public RedisSerializationContext<String, Object> redisSerializationContext() {
+        RedisSerializationContext.RedisSerializationContextBuilder<String, Object> builder =
+                RedisSerializationContext.newSerializationContext();
+        Jackson2JsonRedisSerializer<Object> redisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
+        ObjectMapper om = new ObjectMapper();
+        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
+        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
+        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+        redisSerializer.setObjectMapper(om);
+
+        builder.key(new StringRedisSerializer());
+        builder.value(redisSerializer);
+        builder.hashKey(new StringRedisSerializer());
+        builder.hashValue(redisSerializer);
+
+        return builder.build();
+    }
+
+    @Bean
+    public ReactiveRedisTemplate<String, Object> reactiveRedisTemplate(ReactiveRedisConnectionFactory connectionFactory) {
+        return new ReactiveRedisTemplate<>(connectionFactory,redisSerializationContext());
+    }
+}
+

+ 54 - 0
launch-redis/src/main/java/com/weblux/launchredis/config/RedisConfig.java

@@ -0,0 +1,54 @@
+package com.weblux.launchredis.config;
+
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+
+@Configuration
+public class RedisConfig {
+
+    /**
+     * retemplate相关配置
+     * @param factory
+     * @return
+     */
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
+
+        RedisTemplate<String, Object> template = new RedisTemplate<>();
+        // 配置连接工厂
+        template.setConnectionFactory(factory);
+
+        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
+        Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
+
+        ObjectMapper om = new ObjectMapper();
+        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
+        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
+        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+        jacksonSeial.setObjectMapper(om);
+
+        // 值采用json序列化
+        template.setValueSerializer(jacksonSeial);
+        //使用StringRedisSerializer来序列化和反序列化redis的key值
+        template.setKeySerializer(new StringRedisSerializer());
+
+        // 设置hash key 和value序列化模式
+        template.setHashKeySerializer(new StringRedisSerializer());
+        template.setHashValueSerializer(jacksonSeial);
+        template.afterPropertiesSet();
+
+        return template;
+    }
+
+}
+

+ 25 - 0
launch-redis/src/main/java/com/weblux/launchredis/utils/ReactiveRedisServer.java

@@ -0,0 +1,25 @@
+package com.weblux.launchredis.utils;
+
+import jakarta.annotation.Resource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.ReactiveRedisTemplate;
+import org.springframework.stereotype.Component;
+import reactor.core.publisher.Mono;
+
+import java.time.Duration;
+@Component
+@SuppressWarnings(value = { "unchecked", "rawtypes" })
+public class ReactiveRedisServer {
+
+    @Resource
+    private ReactiveRedisTemplate<String,String> reactiveRedisTemplate;
+
+
+    public Mono<String> getKey(String key){
+      return reactiveRedisTemplate.opsForValue().get(key);
+    }
+
+    public Mono<Boolean> setKey(String key,String value,Long seconds){
+        return reactiveRedisTemplate.opsForValue().set(key, value, Duration.ofSeconds(seconds));
+    }
+}

+ 20 - 30
pom.xml

@@ -14,45 +14,45 @@
     <artifactId>launch</artifactId>
     <version>1.0.0</version>
     <name>platform</name>
-    <description>platform</description>
+    <description>投放【webflux】</description>
 
     <!-- 当前Maven工程的打包方式,可选值有下面三种: -->
     <!-- jar:表示这个工程是一个Java工程  -->
     <!-- war:表示这个工程是一个Web工程 -->
     <!-- pom:表示这个工程是“管理其他工程”的工程 -->
-<!--    <packaging>jar</packaging>-->
     <packaging>pom</packaging>
+
     <properties>
         <launch.version>1.0.0</launch.version>
         <!-- 工程构建过程中读取源码时使用的字符集 -->
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <java.version>21</java.version>
         <spring-cloud.version>2023.0.0-RC1</spring-cloud.version>
-        <nacos.client.version>2.2.1</nacos.client.version>
+
         <r2dbc-mysql>1.0.5</r2dbc-mysql>
         <openapi.ui>2.2.0</openapi.ui>
         <validation>3.2.0</validation>
         <cola-component-dto>4.3.2</cola-component-dto>
         <revision>2022.0.0.0</revision>
+        <spring-data-bom>2023.1.0</spring-data-bom>
     </properties>
 
     <dependencyManagement>
         <dependencies>
             <dependency>
-                <groupId>org.springframework.cloud</groupId>
-                <artifactId>spring-cloud-dependencies</artifactId>
-                <version>${spring-cloud.version}</version>
-                <type>pom</type>
+                <groupId>org.springframework.data</groupId>
+                <artifactId>spring-data-bom</artifactId>
+                <version>${spring-data-bom}</version>
                 <scope>import</scope>
+                <type>pom</type>
             </dependency>
             <dependency>
-                <groupId>com.alibaba.cloud</groupId>
-                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
-                <version>${revision}</version>
-                <type>pom</type>
-                <scope>import</scope>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-actuator</artifactId>
+                <version>2.4.5</version>
             </dependency>
 
+
             <dependency>
                 <groupId>com.launch.webflux</groupId>
                 <artifactId>launch-common</artifactId>
@@ -84,27 +84,17 @@
         <module>launch-elasticsearch</module>
     </modules>
 
-
     <build>
         <plugins>
             <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-                <version>3.2.0</version>
-                <executions>
-                    <execution>
-                        <id>pre-integration-test</id>
-                        <goals>
-                            <goal>start</goal>
-                        </goals>
-                    </execution>
-                    <execution>
-                        <id>post-integration-test</id>
-                        <goals>
-                            <goal>stop</goal>
-                        </goals>
-                    </execution>
-                </executions>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                </configuration>
             </plugin>
         </plugins>
     </build>