chenbiao 2 gadi atpakaļ
vecāks
revīzija
39973aa27a

+ 152 - 21
midjourney/pom.xml

@@ -4,32 +4,149 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
-        <groupId>com.netflix</groupId>
-        <artifactId>netflix</artifactId>
-        <version>1.0</version>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.4.3</version>
+        <relativePath/> <!-- lookup parent from repository -->
     </parent>
 
-    <groupId>com.sxfoundation</groupId>
+    <groupId>com.netflix</groupId>
     <artifactId>midjourney</artifactId>
+    <packaging>jar</packaging>
+
+
+    <properties>
+        <java.version>11</java.version>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+
+        <io-undertow.version>2.0.30.Final</io-undertow.version>
+        <xnio-nio.version>3.7.7.Final</xnio-nio.version>
+    </properties>
+
 
     <dependencies>
 
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
-            <!--
             <exclusions>
                 <exclusion>
                     <groupId>org.springframework.boot</groupId>
                     <artifactId>spring-boot-starter-tomcat</artifactId>
                 </exclusion>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-json</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.hibernate.validator</groupId>
+                    <artifactId>hibernate-validator</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>com.fasterxml.jackson.core</groupId>
+                    <artifactId>jackson-databind</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-undertow</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>io.undertow</groupId>
+                    <artifactId>undertow-core</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>io.undertow</groupId>
+                    <artifactId>undertow-servlet</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.jboss.xnio</groupId>
+            <artifactId>xnio-nio</artifactId>
+            <version>${xnio-nio.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.undertow</groupId>
+            <artifactId>undertow-core</artifactId>
+            <version>${io-undertow.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.jboss.xnio</groupId>
+                    <artifactId>xnio-nio</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.jboss.xnio</groupId>
+                    <artifactId>xnio-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>io.undertow</groupId>
+            <artifactId>undertow-servlet</artifactId>
+            <version>${io-undertow.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>io.undertow</groupId>
+                    <artifactId>undertow-core</artifactId>
+                </exclusion>
             </exclusions>
-             -->
         </dependency>
 
+
         <dependency>
             <groupId>com.netflix</groupId>
             <artifactId>netflix-common</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>mysql</groupId>
+                    <artifactId>mysql-connector-java</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.bouncycastle</groupId>
+                    <artifactId>bcprov-jdk15on</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>com.google.zxing</groupId>
+                    <artifactId>core</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-test</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>com.alipay.sdk</groupId>
+                    <artifactId>alipay-sdk-java</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-aop</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>com.google.guava</groupId>
+                    <artifactId>guava</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>com.tencentcloudapi</groupId>
+                    <artifactId>tencentcloud-sdk-java-sms</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>com.tencentcloudapi</groupId>
+                    <artifactId>tencentcloud-sdk-java-faceid</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>com.tencentcloudapi</groupId>
+                    <artifactId>tencentcloud-sdk-java</artifactId>
+                </exclusion>
+            </exclusions>
+            <version>1.0</version>
         </dependency>
 
         <dependency>
@@ -49,14 +166,14 @@
             <artifactId>spring-boot-starter-websocket</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
 
-    </dependencies>
 
-    <properties>
-        <maven.compiler.source>11</maven.compiler.source>
-        <maven.compiler.target>11</maven.compiler.target>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
+    </dependencies>
 
 
     <build>
@@ -64,20 +181,34 @@
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
-                <version>${spring.boot.version}</version>
                 <configuration>
                     <mainClass>${start-class}</mainClass>
-                    <layout>ZIP</layout>
+                    <layout>ZIP</layout><!-- Replace with your main class -->
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                    <compilerArgument>-Xlint:unchecked</compilerArgument>
                 </configuration>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>repackage</goal>
-                        </goals>
-                    </execution>
-                </executions>
             </plugin>
         </plugins>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+
+        <finalName>midjourney</finalName>
     </build>
 
 </project>

+ 16 - 0
midjourney/src/main/java/com/yhlxj/Application.java

@@ -5,8 +5,10 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import com.fasterxml.jackson.annotation.PropertyAccessor;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+import io.undertow.UndertowOptions;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
 import org.springframework.context.annotation.Bean;
 import org.springframework.data.redis.connection.RedisConnectionFactory;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -49,4 +51,18 @@ public class Application {
 		template.afterPropertiesSet();
 		return template;
 	}
+
+	/**
+	 * undertow 容器配置
+	 */
+	@Bean
+	public UndertowServletWebServerFactory factory() {
+		UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory();
+		// 开启http2 开启keep-alive 允许cookie最大化
+		factory.addBuilderCustomizers(builder ->
+				builder.setServerOption(UndertowOptions.ENABLE_HTTP2, false).
+						setServerOption(UndertowOptions.ALLOW_EQUALS_IN_COOKIE_VALUE, true).
+						setServerOption(UndertowOptions.ALWAYS_SET_KEEP_ALIVE, true));
+		return factory;
+	}
 }

+ 0 - 24
midjourney/src/main/java/com/yhlxj/dao/model/entity/GoodsDonSku.java

@@ -2,8 +2,6 @@ package com.yhlxj.dao.model.entity;
 
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
-import com.cyksj.model.views.DistributeSearchView;
-import com.cyksj.model.views.GoodsDiscountPlusPurchaseRelationFrontView;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
 import com.fasterxml.jackson.annotation.JsonInclude;
@@ -114,13 +112,6 @@ public class GoodsDonSku extends BaseEntity {
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     private String userOwns;
 
-    /**
-     * 专属用户列表
-     */
-    @DbIgnore
-    @TableField(exist = false)
-    private List<DistributeSearchView> userOwnsList;
-
     /**
      * 是否开启实物车票时长权益
      */
@@ -146,14 +137,6 @@ public class GoodsDonSku extends BaseEntity {
 //    @DbField("case when spec_val like '%月%' and spec_val not like '%年%' then 0 when spec_val like '%季%' then 1 when spec_val like '%半年%' then 2 when spec_val like '%年%' then 3 else 66 end")
 //    @TableField(exist = false)
 //    private Integer orderBy;
-
-    /**
-     * 加购规格
-     */
-    @DbIgnore
-    @TableField(exist = false)
-    private List<GoodsDiscountPlusPurchaseRelation> dpSku;
-
     /**
      * 是否是优惠加购规格
      */
@@ -200,13 +183,6 @@ public class GoodsDonSku extends BaseEntity {
      */
     private String specificGoodsIds;
 
-    /**
-     * 优惠加购商品规格展示
-     */
-    @DbIgnore
-    @TableField(exist = false)
-    private List<GoodsDiscountPlusPurchaseRelationFrontView> dpSkuList;
-
     /**
      * 前端展示
      */

+ 0 - 26
midjourney/src/main/java/com/yhlxj/service/common/EnvCommonService.java

@@ -29,24 +29,6 @@ public class EnvCommonService {
 	@Value(value = "${spring.profiles.active}")
 	private String env;
 
-	@Value(value = "${wechat.domain}")
-	private String domain;
-
-	public String getHost() {
-		if (isPreEnv()) {
-			return domain.replaceAll("8081", "8082");
-		}
-		return domain;
-	}
-
-	public String getDomain() {
-		return this.getHost().substring(0, this.getHost().indexOf("80"));
-	}
-
-	public String getDomain2() {
-		return this.getHost().substring(0, this.getHost().indexOf("/80"));
-	}
-
 	public Boolean isPrdEnv() {
 		return EnvCommonService.active_prd.equals(getEnv());
 	}
@@ -55,12 +37,4 @@ public class EnvCommonService {
 		return EnvCommonService.active_pre.equals(getEnv());
 	}
 
-	@PostConstruct
-	public void getDistributeUrl() {
-		DISTRIBUTE_DEFAULT_URL_PREFIX = getDomain();
-		if (!DISTRIBUTE_DEFAULT_URL_PREFIX.endsWith("/")) {
-			DISTRIBUTE_DEFAULT_URL_PREFIX += "/";
-		}
-		DISTRIBUTE_DEFAULT_URL_PREFIX += "%s";
-	}
 }

+ 2 - 0
midjourney/src/main/java/com/yhlxj/service/midjourney/MidjourneyService.java

@@ -34,4 +34,6 @@ public interface MidjourneyService {
     MidjourneyUserConversation cancelConversation(MidjourneyUser user, Long id);
 
     void notifyHook(String conversation) throws Exception;
+
+    MidjourneyUser getUser(String userToken);
 }

+ 90 - 50
midjourney/src/main/java/com/yhlxj/service/midjourney/impl/MidjourneyServiceImpl.java

@@ -14,11 +14,14 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
 import com.cyksj.common.util.Jsons;
+import com.cyksj.common.util.QueryWrapperUtils;
 import com.cyksj.common.util.StringUtil;
+import com.yhlxj.dao.mapper.GroupsRelationMapper;
 import com.yhlxj.dao.mapper.midjourney.MidjourneyUserConversationMapper;
 import com.yhlxj.dao.mapper.midjourney.MidjourneyUserMapper;
 import com.yhlxj.dao.model.dto.BlendDimensions;
 import com.yhlxj.dao.model.dto.MessageButton;
+import com.yhlxj.dao.model.entity.GroupsRelation;
 import com.yhlxj.dao.model.entity.MidjourneyAccount;
 import com.yhlxj.dao.model.entity.MidjourneyUser;
 import com.yhlxj.dao.model.entity.MidjourneyUserConversation;
@@ -36,7 +39,8 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import javax.imageio.stream.FileImageOutputStream;
-import java.io.*;
+import java.io.File;
+import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.nio.file.Files;
@@ -45,6 +49,8 @@ import java.util.*;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
 
+import static com.yhlxj.web.wss.MidjourneyServerEndpoint.WSS_SESSION_MAP;
+
 /**
  * @author zwhui
  * @date 2024/4/23 15:44
@@ -76,6 +82,28 @@ public class MidjourneyServiceImpl implements MidjourneyService {
 
     private final MidjourneyAccountService midjourneyAccountService;
 
+    private final GroupsRelationMapper groupsRelationMapper;
+
+    @Override
+    public MidjourneyUser getUser(String userToken) {
+        MidjourneyUser midjourneyUser = midjourneyUserMapper.selectOne(Wrappers.lambdaQuery(MidjourneyUser.class)
+                .eq(MidjourneyUser::getUserToken, userToken).last("limit 1"));
+        if (midjourneyUser == null){
+            throw new BusinessRuntimeException("账号不存在,请重新登录");
+        }
+        if(!redisService.hasKey(RedisService.key.MIDJOURNEY_FAST_LIMIT.getName() + midjourneyUser.getId())){
+            redisService.set(RedisService.key.MIDJOURNEY_FAST_LIMIT.getName() + midjourneyUser.getId(),midjourneyUser.getMjFastNum());
+        }
+
+        if(!redisService.hasKey(RedisService.key.MIDJOURNEY_RELAX_LIMIT.getName() + midjourneyUser.getId())){
+            redisService.set(RedisService.key.MIDJOURNEY_RELAX_LIMIT.getName() + midjourneyUser.getId(),midjourneyUser.getMjRelaxNum());
+        }
+        Long relationId = midjourneyUser.getRelationId();
+        GroupsRelation relation = groupsRelationMapper.selectById(relationId);
+        midjourneyUser.setAqType(relation.getAqType());
+
+        return midjourneyUser;
+    }
 
     @Override
     public MidjourneyUserConversation submitImagine(MidjourneyUser user, String prompt, String botType, List<String> base64Array) throws Exception {
@@ -176,49 +204,49 @@ public class MidjourneyServiceImpl implements MidjourneyService {
 
     @Override
     public MidjourneyUserConversation submitSeed(MidjourneyUser user, Long taskId, String botType) throws Exception {
-        SubmitResult result = seed(user.getMode(),"seed", taskId);
-        return saveConversation(user.getId(), user.getMode(), result,"SEED", StringUtils.EMPTY, botType);
+        //SubmitResult result = seed(user.getMode(),"seed", taskId);
+        //return saveConversation(user.getId(), user.getMode(), result,"SEED", StringUtils.EMPTY, botType);
+        return null;
     }
 
-    private SubmitResult seed(Integer mode, String seed, Long taskId) {
-        String url = "";
-        if (mode == 1) {
-            url = FAST_HOST;
-        } else if (mode == 2) {
-            url = RELAX_HOST;
-        }
-        url = url + String.format("/mj/task/%d/image-seed", taskId);
-        String body = HttpRequest.get(url).header("Authorization", FAST_TOKEN).execute().body();
-        log.info("seed body:{}", body);
-        SubmitResult submitResult = Jsons.parseObject(body, SubmitResult.class);
-        int code = submitResult.getCode();
-        if (code != 1 && code != 21 && code != 22) {
-            if (code == 3) {
-                if(mode == 2 && StringUtils.isNotBlank(accountWithMinUsage)){
-                    redisService.hdel(RedisService.key.MIDJOURNEY_ACCOUNT.getName(),accountWithMinUsage);
-                    String finalAccountWithMinUsage = accountWithMinUsage;
-                    TASK_EXECUTOR.execute(() -> {
-                        MidjourneyAccount account = midjourneyAccountService.getOne(Wrappers.lambdaQuery(MidjourneyAccount.class).eq(MidjourneyAccount::getInstanceId, finalAccountWithMinUsage).last("limit 1"));
-                        midjourneyAccountService.updateStatus(account.getId());
-                    });
-                }
-                throw BusinessRuntimeException.getInstance("账号不存在");
-            }
-            if (code == 4) {
-                throw BusinessRuntimeException.getInstance(submitResult.getDescription());
-            }
-            if (code == 24) {
-                JSONObject jsonObject = JSONUtil.parseObj(submitResult.getResult());
-                throw BusinessRuntimeException.getInstance("prompt包含敏感词:"+jsonObject.getStr("bannedWord"));
-            }
-            log.error("action:" + action + " error message:" + submitResult.getDescription());
-            throw BusinessRuntimeException.getInstance("队列已满,请稍后尝试");
-        }
-        if (StringUtils.isNotBlank(accountWithMinUsage) && mode == 2) {
-            submitResult.setInstanceId(Long.valueOf(accountWithMinUsage));
-        }
-        return submitResult;
-    }
+    //private SubmitResult seed(Integer mode, String seed, Long taskId) {
+    //    String url = "";
+    //    if (mode == 1) {
+    //        url = FAST_HOST;
+    //    } else if (mode == 2) {
+    //        url = RELAX_HOST;
+    //    }
+    //    url = url + String.format("/mj/task/%d/image-seed", taskId);
+    //    String body = HttpRequest.get(url).header("Authorization", FAST_TOKEN).execute().body();
+    //    log.info("seed body:{}", body);
+    //    SubmitResult submitResult = Jsons.parseObject(body, SubmitResult.class);
+    //    int code = submitResult.getCode();
+    //    if (code != 1 && code != 21 && code != 22) {
+    //        if (code == 3) {
+    //            if(mode == 2 && StringUtils.isNotBlank(accountWithMinUsage)){
+    //                redisService.hdel(RedisService.key.MIDJOURNEY_ACCOUNT.getName(),accountWithMinUsage);
+    //                String finalAccountWithMinUsage = accountWithMinUsage;
+    //                TASK_EXECUTOR.execute(() -> {
+    //                    MidjourneyAccount account = midjourneyAccountService.getOne(Wrappers.lambdaQuery(MidjourneyAccount.class).eq(MidjourneyAccount::getInstanceId, finalAccountWithMinUsage).last("limit 1"));
+    //                    midjourneyAccountService.updateStatus(account.getId());
+    //                });
+    //            }
+    //            throw BusinessRuntimeException.getInstance("账号不存在");
+    //        }
+    //        if (code == 4) {
+    //            throw BusinessRuntimeException.getInstance(submitResult.getDescription());
+    //        }
+    //        if (code == 24) {
+    //            JSONObject jsonObject = JSONUtil.parseObj(submitResult.getResult());
+    //            throw BusinessRuntimeException.getInstance("prompt包含敏感词:"+jsonObject.getStr("bannedWord"));
+    //        }
+    //        throw BusinessRuntimeException.getInstance("队列已满,请稍后尝试");
+    //    }
+    //    if (StringUtils.isNotBlank(accountWithMinUsage) && mode == 2) {
+    //        submitResult.setInstanceId(Long.valueOf(accountWithMinUsage));
+    //    }
+    //    return submitResult;
+    //}
 
     /**
      * 恢复次数
@@ -322,7 +350,7 @@ public class MidjourneyServiceImpl implements MidjourneyService {
                     .put("instanceId",accountWithMinUsage).build());
         }
         url = url + getActionUrl(action);
-        param.put("notifyHook",midjourneyHost +(EnvCommonService.active.equals(envCommonService.getEnv()) ? "/8081":"/8082") + "/api/applets/midjourney/notifyHook");
+        param.put("notifyHook",midjourneyHost +(EnvCommonService.active.equals(envCommonService.getEnv()) ? "/8083":"/8082") + "/api/applets/midjourney/notifyHook");
         String body = HttpRequest.post(url).body(Jsons.toJson(param)).header("Authorization", FAST_TOKEN).execute().body();
         log.info("action body:{}", body);
         SubmitResult submitResult = Jsons.parseObject(body, SubmitResult.class);
@@ -442,10 +470,19 @@ public class MidjourneyServiceImpl implements MidjourneyService {
     public MidjourneyUserConversation getConversationById(Long id){
 
         //从缓存中查询 该任务是否存在
-        MidjourneyUserConversation conversation = (MidjourneyUserConversation)redisService.get(RedisService.key.MIDJOURNEY_CONVERSATION.getName() + id);
-        if(conversation == null){
-            conversation = conversationMapper.selectById(id);
+        MidjourneyUserConversation conversation;
+        Object obj = redisService.get(RedisService.key.MIDJOURNEY_CONVERSATION.getName() + id);
+        if(obj == null){
+            conversation = conversationMapper.selectOne(QueryWrapperUtils.buildWrapper((wrapper)->{
+                wrapper.eq(MidjourneyUserConversation::getTaskId, id);
+            }));
             redisService.set(RedisService.key.MIDJOURNEY_CONVERSATION.getName() + id, conversation, RedisService.key.MIDJOURNEY_CONVERSATION.getTimeout());
+        }else {
+            try {
+                conversation = (MidjourneyUserConversation)obj;
+            }catch (Exception e){
+                conversation = JSONUtil.parseObj(obj).toBean(MidjourneyUserConversation.class);
+            }
         }
 
         return conversation;
@@ -584,9 +621,12 @@ public class MidjourneyServiceImpl implements MidjourneyService {
         conversation.setTaskId(jsons.getLong("id"));
         if (StringUtil.isNotBlank(conversation.getImageUrl())) {
             URL url = new URL(conversation.getImageUrl());
-
+            String scaling = "&quality=lossless&width=350&height=350";
+            if(url.getFile().contains("webp")){
+               scaling += "&format=webp";
+            }
             // 使用 Hutool 提取各个部分并构建新 URL
-            String newUrl = URLUtil.toURI(new URL(url.getProtocol(), "cdn.mj.liuliangbang.vip", url.getPort(), url.getFile()) + "?" + url.getQuery()).toString();
+            String newUrl = URLUtil.toURI(new URL(url.getProtocol(), "cdn.mj.liuliangbang.vip", url.getPort(), url.getFile() + scaling)).toString();
             //
             conversation.setImageUrl(newUrl);
         }
@@ -594,9 +634,9 @@ public class MidjourneyServiceImpl implements MidjourneyService {
 
         TASK_EXECUTOR.execute(()->{
             //WebSocket 直接发送 任务状态
-            WssSession wssSession = (WssSession) redisService.hget(RedisService.key.MIDJOURNEY_WS_SESSION.getName(), conversation.getTaskId().toString());
+            WssSession wssSession = WSS_SESSION_MAP.get(conversation.getUserId());
             if (wssSession != null) {
-                wssSession.sendMessage(WsMessageTypeEnum.SERVER_TASK_INFO, conversation);
+                wssSession.sendMessage(WsMessageTypeEnum.SERVER_TASK_INFO, new JSONObject(conversation));
             }
         });
 

+ 110 - 0
midjourney/src/main/java/com/yhlxj/util/SpringCtxUtils.java

@@ -0,0 +1,110 @@
+package com.yhlxj.util;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * @ClassName SpringCtxUtils
+ * @Author chan
+ * @Date 2020-04-27 16:19
+ * @Description
+ */
+@Component
+public final class SpringCtxUtils implements ApplicationContextAware {
+
+    private static ApplicationContext context;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        SpringCtxUtils.context = applicationContext;
+    }
+
+    public static ApplicationContext getContext() {
+        return context;
+    }
+
+    /**
+     * 获取对象
+     *
+     * @param beanIdOrName bean name
+     * @return Object 一个以所给名字注册的bean的实例
+     * @throws BeansException 异常
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T getBean(String beanIdOrName) throws BeansException {
+        return StringUtils.isEmpty(beanIdOrName) ? null : (T) context.getBean(beanIdOrName);
+    }
+
+    /**
+     * 获取类型为requiredType的对象
+     *
+     * @param clazz {@link Class}
+     * @return T
+     * @throws BeansException 异常
+     */
+    public static <T> T getBean(Class<T> clazz) throws BeansException {
+        return clazz == null ? null : (T) context.getBean(clazz);
+    }
+
+    /**
+     * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
+     *
+     * @param name bean name
+     * @return boolean
+     */
+    public static boolean containsBean(String name) {
+        return context.containsBean(name);
+    }
+
+    /**
+     * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
+     *
+     * @param name bean name
+     * @return boolean
+     * @throws NoSuchBeanDefinitionException 异常
+     */
+    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
+        return context.isSingleton(name);
+    }
+
+    /**
+     * @param name bean name
+     * @return Class 注册对象的类型
+     * @throws NoSuchBeanDefinitionException 异常
+     */
+    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
+        return context.getType(name);
+    }
+
+    /**
+     * 如果给定的bean名字在bean定义中有别名,则返回这些别名
+     *
+     * @param name bean name
+     * @return String array
+     * @throws NoSuchBeanDefinitionException 异常
+     */
+    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
+        return context.getAliases(name);
+    }
+
+    /**
+     * <pre>
+     *     静默获取bean,无视异常
+     * </pre>
+     *
+     * @param clazz
+     * @param <T>
+     * @return
+     */
+    public static <T> T getBeanQuietly(Class<T> clazz) {
+        try {
+            return clazz == null ? null : (T) context.getBean(clazz);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+}

+ 52 - 0
midjourney/src/main/java/com/yhlxj/web/config/JacksonConfig.java

@@ -0,0 +1,52 @@
+package com.yhlxj.web.config;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+
+/**
+ * @ClassName JacksonConfig
+ * @Author chan
+ * @Date 2020-04-24 15:21
+ * @Description json 转换
+ */
+@Configuration
+public class JacksonConfig {
+    @Bean
+    @Primary
+    @ConditionalOnMissingBean(ObjectMapper.class)
+    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
+        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
+        SimpleModule simpleModule = new SimpleModule();
+
+        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
+        objectMapper.registerModule(simpleModule);
+        simpleModule.addSerializer(BigDecimal.class, new JsonSerializer<>() {
+            @Override
+            public void serialize(BigDecimal decimal, JsonGenerator gen, SerializerProvider serializers)
+                    throws IOException {
+                gen.writeString(decimal.toPlainString());
+            }
+        });
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        objectMapper.setDateFormat(format);
+        objectMapper.registerModule(simpleModule);
+        //通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化,属性为NULL 不序列化
+        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+        return objectMapper;
+    }
+
+}

+ 6 - 4
midjourney/src/main/java/com/yhlxj/web/config/WebSocketConfiguration.java

@@ -5,13 +5,15 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.web.socket.server.standard.ServerEndpointExporter;
 
 /**
- * @author chan
- * @date 2024/6/28 17:33
- */
+*@author chan
+*@date 2024/6/28 17:33
+*/
 @Configuration
 public class WebSocketConfiguration {
+
     @Bean
     public ServerEndpointExporter serverEndpointExporter() {
         return new ServerEndpointExporter();
     }
-}
+
+}

+ 2 - 21
midjourney/src/main/java/com/yhlxj/web/mirror/MidjourneyController.java

@@ -37,7 +37,6 @@ import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.Date;
 import java.util.List;
-import java.util.Map;
 
 /** server/镜像服务/mj绘画
  * @author zwhui
@@ -70,25 +69,7 @@ public class MidjourneyController {
 
     public MidjourneyUser getUser(){
         String userToken = request.getHeader("user-token");
-
-        MidjourneyUser midjourneyUser = midjourneyUserMapper.selectOne(Wrappers.lambdaQuery(MidjourneyUser.class)
-                .eq(MidjourneyUser::getUserToken, userToken).last("limit 1"));
-        if (midjourneyUser == null){
-            throw new BusinessRuntimeException("账号不存在,请重新登录");
-        }
-        if(!redisService.hasKey(RedisService.key.MIDJOURNEY_FAST_LIMIT.getName() + midjourneyUser.getId())){
-            redisService.set(RedisService.key.MIDJOURNEY_FAST_LIMIT.getName() + midjourneyUser.getId(),midjourneyUser.getMjFastNum());
-        }
-
-        if(!redisService.hasKey(RedisService.key.MIDJOURNEY_RELAX_LIMIT.getName() + midjourneyUser.getId())){
-            redisService.set(RedisService.key.MIDJOURNEY_RELAX_LIMIT.getName() + midjourneyUser.getId(),midjourneyUser.getMjRelaxNum());
-        }
-        Long relationId = midjourneyUser.getRelationId();
-        GroupsRelation relation = groupsRelationMapper.selectById(relationId);
-        midjourneyUser.setAqType(relation.getAqType());
-
-        return midjourneyUser;
-
+       return midjourneyService.getUser(userToken);
     }
 
     @GetMapping("/midjourneyMirrorWithToken/{userToken}")
@@ -347,7 +328,7 @@ public class MidjourneyController {
         }
         Object conversation;
         try {
-            conversation = midjourneyService.submitSeed(user, seedDTO.getTaskId(),num, seedDTO.getBotType());
+            conversation = midjourneyService.submitSeed(user, seedDTO.getTaskId(), seedDTO.getBotType());
         } catch (Exception e) {
             recoverUserLimit(user.getId(), user.getMode(),num);
             throw BusinessRuntimeException.getInstance(e.getMessage());

+ 30 - 50
midjourney/src/main/java/com/yhlxj/web/wss/MidjourneyServerEndpoint.java

@@ -1,31 +1,25 @@
 package com.yhlxj.web.wss;
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.cyksj.common.exception.BusinessRuntimeException;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
-import com.cyksj.common.util.QueryWrapperUtils;
-import com.cyksj.common.util.SpringCtxUtils;
-import com.yhlxj.dao.mapper.midjourney.MidjourneyUserConversationMapper;
-import com.yhlxj.dao.mapper.midjourney.MidjourneyUserMapper;
-import com.yhlxj.dao.model.entity.GroupsRelation;
 import com.yhlxj.dao.model.entity.MidjourneyUser;
 import com.yhlxj.dao.model.entity.MidjourneyUserConversation;
 import com.yhlxj.dao.model.enums.WsMessageTypeEnum;
 import com.yhlxj.redis.RedisService;
 import com.yhlxj.service.midjourney.MidjourneyService;
-import lombok.RequiredArgsConstructor;
+import com.yhlxj.service.midjourney.impl.MidjourneyServiceImpl;
+import com.yhlxj.util.SpringCtxUtils;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.tomcat.websocket.WsSession;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
 import javax.websocket.*;
 import javax.websocket.server.PathParam;
 import javax.websocket.server.ServerEndpoint;
 import java.io.IOException;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * @author chan
@@ -33,21 +27,12 @@ import java.io.IOException;
  */
 @Component
 @ServerEndpoint("/ws/midjourney/{userToken}/{taskId}")
-@RequiredArgsConstructor
+@Slf4j
 public class MidjourneyServerEndpoint {
-
-    private static Logger logger = LoggerFactory.getLogger(MidjourneyServerEndpoint.class);
-
     private static final GlobalThreadPoolTaskExecutor TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
 
-    private final MidjourneyService midjourneyService;
-
-    private final MidjourneyUserConversationMapper midjourneyUserConversationMapper;
-
-    private final MidjourneyUserMapper midjourneyUserMapper;
-
-    private final RedisService redisService;
-
+    //webSocket
+    public static Map<Long, WssSession> WSS_SESSION_MAP = new ConcurrentHashMap<>();
 
     /**
      * 连接建立回调
@@ -56,36 +41,35 @@ public class MidjourneyServerEndpoint {
      */
     @OnOpen
     public void onOpen(Session session, @PathParam("userToken") String userToken, @PathParam("taskId") String taskId) throws IOException {
-        logger.info("[WS建立连接],token:{}, taskId:{}", userToken, taskId);
+        log.info("[WS建立连接],token:{}, taskId:{}", userToken, taskId);
 
         //检查uniodId是否合法
         if (StringUtils.isBlank(userToken) || StringUtils.isBlank(taskId)) {
 
-            logger.error("[WS建立连接失败],[参数非法],{},{}", userToken, taskId);
+            log.error("[WS建立连接失败],[参数非法],{},{}", userToken, taskId);
 
             session.getBasicRemote().sendText("入参错误");
             session.close();
         }
         MidjourneyUser user = getUser(userToken);
         if (user == null) {
-            logger.error("[WS建立连接失败],[用户过期],{},{}", userToken, taskId);
+            log.error("[WS建立连接失败],[用户过期],{},{}", userToken, taskId);
             session.getBasicRemote().sendText("用户过期");
             session.close();
         } else {
-            MidjourneyUserConversation conversation = midjourneyUserConversationMapper.selectOne(QueryWrapperUtils.buildWrapper((wrapper) -> {
-                wrapper.eq(MidjourneyUserConversation::getUserId, user.getId()).eq(MidjourneyUserConversation::getTaskId, taskId);
-            }));
+            MidjourneyService midjourneyService = SpringCtxUtils.getBean(MidjourneyServiceImpl.class);
+            MidjourneyUserConversation conversation = midjourneyService.getConversationById(Long.parseLong(taskId));
             WssSession wsSession = new WssSession(session);
             if (conversation == null) {
                 wsSession.sendMessage(WsMessageTypeEnum.SERVER_TASK_NOT_FIND, "任务不存在.");
                 session.close();
             } else {
-                if (!redisService.hHasKey(RedisService.key.MIDJOURNEY_WS_SESSION.getName(), taskId)) {
-                    redisService.hset(RedisService.key.MIDJOURNEY_WS_SESSION.getName(), taskId, wsSession, RedisService.key.MIDJOURNEY_WS_SESSION.getTimeout());
-                }
+                RedisService redisService = SpringCtxUtils.getBean(RedisService.class);
+                WSS_SESSION_MAP.put(user.getId(), wsSession);
                 TASK_EXECUTOR.execute(() -> {
                     redisService.set(RedisService.key.MIDJOURNEY_CONVERSATION.getName() + taskId, conversation, RedisService.key.MIDJOURNEY_CONVERSATION.getTimeout());
                 });
+                wsSession.sendMessage(WsMessageTypeEnum.SERVER_TASK_INFO, new JSONObject(conversation));
             }
 
         }
@@ -101,7 +85,7 @@ public class MidjourneyServerEndpoint {
     @OnMessage
     public void OnMessage(String message, Session session, @PathParam("userToken") String userToken, @PathParam("taskId") String taskId) {
         try {
-            logger.info("[WS收到消息],{},{},{}", userToken, taskId, message);
+            log.info("[WS收到消息],{},{},{}", userToken, taskId, message);
 
             WssSession wsSession = new WssSession(session);
             JSONObject body = null;//消息具体内容
@@ -113,32 +97,33 @@ public class MidjourneyServerEndpoint {
                     wsSession.pong();
                     return;
                 case MESSAGE:
-                    body = JSON.parseObject(message.substring(8));
+                    body = JSONUtil.parseObj(message.substring(8));
                     break;
                 default:
-                    logger.error("[WS消息类型异常],{},{},{}", userToken, taskId, message);
+                    log.error("[WS消息类型异常],{},{},{}", userToken, taskId, message);
                     return;
             }
 
             //根据子类型进行处理
-            switch (WsMessageTypeEnum.getMessageType(body.getString("type"))) {
+            switch (WsMessageTypeEnum.getMessageType(body.getStr("type"))) {
 
                 case CLIENT_TASK_ID: //首次查看任务状态
+                    MidjourneyService midjourneyService = SpringCtxUtils.getBean(MidjourneyService.class);
                     midjourneyService.getConversationById(body.getLong("taskId"));
                     break;
 
                 case CLIENT_CLOSE:
-                    logger.info("[WS连接关闭],{},{}", userToken, taskId);
+                    log.info("[WS连接关闭],{},{}", userToken, taskId);
                     //dailyQuizService.close(uniodId);
                     break;
 
                 default:
-                    logger.error("[WS消息子类型异常],{},{},{}", userToken, taskId, message);
+                    log.error("[WS消息子类型异常],{},{},{}", userToken, taskId, message);
 
             }
 
         } catch (Exception e) {
-            logger.error("[WS接收消息失败],{},{},{},{}", userToken, taskId, message, e);
+            log.error("[WS接收消息失败],{},{},{},{}", userToken, taskId, message, e);
         }
     }
 
@@ -150,7 +135,7 @@ public class MidjourneyServerEndpoint {
      */
     @OnError
     public void OnError(Session session, Throwable error) throws IOException {
-        logger.error("[WS ONERROR],{}", error.getMessage());
+        log.error("[WS ONERROR],{}", error.getMessage());
         if (session.isOpen()) {
             session.close();
         }
@@ -164,20 +149,15 @@ public class MidjourneyServerEndpoint {
     @OnClose
     public void OnClose(Session session, @PathParam("userToken") String userToken, @PathParam("taskId") String taskId) throws IOException {
 
-        logger.info("[WS连接关闭],{},{}", userToken, taskId);
+        log.info("[WS连接关闭],{},{}", userToken, taskId);
         if (session.isOpen()) {
             session.close();
         }
     }
 
     public MidjourneyUser getUser(String userToken) {
-
-        MidjourneyUser midjourneyUser = midjourneyUserMapper.selectOne(Wrappers.lambdaQuery(MidjourneyUser.class)
-                .eq(MidjourneyUser::getUserToken, userToken).last("limit 1"));
-        if (midjourneyUser == null) {
-            throw new BusinessRuntimeException("账号不存在,请重新登录");
-        }
-        return midjourneyUser;
+        MidjourneyService midjourneyService = SpringCtxUtils.getBean(MidjourneyServiceImpl.class);
+        return midjourneyService.getUser(userToken);
 
     }
 

+ 9 - 9
midjourney/src/main/java/com/yhlxj/web/wss/WssSession.java

@@ -1,15 +1,15 @@
 package com.yhlxj.web.wss;
 
-import com.alibaba.fastjson.JSONObject;
+import cn.hutool.json.JSONObject;
 import com.yhlxj.dao.model.enums.WsMessageTypeEnum;
 import lombok.AllArgsConstructor;
 import lombok.Data;
-import org.apache.tomcat.websocket.WsSession;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.websocket.*;
 import java.io.IOException;
+import java.io.Serializable;
 import java.util.List;
 import java.util.Set;
 
@@ -19,8 +19,8 @@ import java.util.Set;
  */
 @Data
 @AllArgsConstructor
-public class WssSession implements WssSendable {
-    private static Logger logger = LoggerFactory.getLogger(WsSession.class);
+public class WssSession implements WssSendable , Serializable {
+    private static Logger logger = LoggerFactory.getLogger(WssSession.class);
 
     private Session session;
 
@@ -35,14 +35,14 @@ public class WssSession implements WssSendable {
 
         //组织成形如 message:{"type":"type", "data":{...}}想
         JSONObject result = new JSONObject();
-        result.put("type", type.type);
-        result.put("content", object);
+        result.putOpt("type", type.type);
+        result.putOpt("content", object);
 
-        logger.info("[WS-SENDMESSAGE],{}", WsMessageTypeEnum.MESSAGE.type + ":" + result.toJSONString());
+        logger.info("[WS-SENDMESSAGE],{}", WsMessageTypeEnum.MESSAGE.type + ":" + result.toString());
         try {
-            getSession().getBasicRemote().sendText(WsMessageTypeEnum.MESSAGE.type + ":" + result.toJSONString());
+            getSession().getBasicRemote().sendText(WsMessageTypeEnum.MESSAGE.type + ":" + result.toString());
         } catch (Exception e) {
-            logger.info("[WS-SENDMESSAGE],[失败],{}", WsMessageTypeEnum.MESSAGE.type + ":" + result.toJSONString());
+            logger.info("[WS-SENDMESSAGE],[失败],{}", WsMessageTypeEnum.MESSAGE.type + ":" + result.toString());
         }
     }
 

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
midjourney/src/main/resources/application-dev.yml


+ 111 - 0
midjourney/src/main/resources/config/logback-debug.xml

@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+	<include resource="org/springframework/boot/logging/logback/defaults.xml" />
+	<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
+
+	<contextName>midjourney-server</contextName>
+
+	<property name="log_home" value="./logs"/>
+
+	<!-- 控制台输出 -->
+	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<!-- 日志输出的文件的格式 -->
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} | [%magenta(%thread) %green(%5L)] %highlight(%-5level) %cyan(%logger{50}) : %msg %n</pattern>
+			<charset>UTF-8</charset>
+		</encoder>
+
+	</appender>
+	<!-- 按照每天生成日志文件 -->
+	<appender name="ROOT-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender" level="INFO">
+		<append>true</append>
+
+        <!-- 过滤器,只记录 warn 和 info 级别的日志 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>WARN</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>NEUTRAL</onMismatch>
+        </filter>
+
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+
+	    <file>${log_home}/midjourney-default.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+			<FileNamePattern>${log_home}/midjourney-default.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+			<!-- kb/mb/gb -->
+			<maxFileSize>128MB</maxFileSize>
+			<!-- 日志文件保留天数 -->
+			<maxHistory>14</maxHistory>
+		</rollingPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} | [%magenta(%thread) %green(%5L)] %highlight(%-5level) %cyan(%logger{50}) : %msg %n</pattern>
+			<charset>UTF-8</charset>
+		</encoder>
+
+	</appender>
+
+	<!-- 按照每天生成日志文件 -->
+	<appender name="ERROR-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<append>true</append>
+
+		<!-- 过滤器,只记录 error 级别的日志 -->
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<level>ERROR</level>
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+
+		<!-- 日志名称 -->
+		<file>${log_home}/midjourney-error.log</file>
+		<!-- 每天生成一个日志文件,保存15天的日志文件 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+			<!--日志文件输出的文件名:按天回滚 daily -->
+			<FileNamePattern>${log_home}/midjourney-error.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+			<!-- kb/mb/gb -->
+			<maxFileSize>128MB</maxFileSize>
+			<!-- 日志文件保留天数 -->
+			<maxHistory>14</maxHistory>
+			<totalSizeCap>10GB</totalSizeCap>
+		</rollingPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} | [%magenta(%thread) %green(%5L)] %highlight(%-5level) %cyan(%logger{50}) : %msg %n</pattern>
+			<!-- 编码 -->
+			<charset>UTF-8</charset>
+		</encoder>
+	</appender>
+
+	<!-- 异步输出 -->
+	<appender name="ERROR_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
+		<!-- 不丢失日志.默认的. 如果discardingThreshold大于0,队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
+		<discardingThreshold>0</discardingThreshold>
+		<queueSize>10240</queueSize>
+		<appender-ref ref="ERROR-APPENDER" />
+	</appender>
+
+    <!-- 异步输出 -->
+	<appender name="ROOT_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
+		<!-- 不丢失日志.默认的. 如果discardingThreshold大于0,队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
+		<discardingThreshold>0</discardingThreshold>
+		<queueSize>10240</queueSize>
+		<appender-ref ref="ROOT-APPENDER" />
+	</appender>
+
+    <logger name="jdbc.audit" level="WARN" />
+    <logger name="jdbc.resultset" level="WARN" />
+    <logger name="jdbc.sqlonly" level="WARN" />
+    <logger name="jdbc.sqltiming" level="INFO" />
+    <logger name="jdbc.connection" level="WARN" />
+
+	<root level="INFO">
+		<appender-ref ref="STDOUT" />
+		<appender-ref ref="ERROR_ASYNC" />
+		<appender-ref ref="ROOT_ASYNC" />
+	</root>
+	
+	<shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>
+</configuration>

+ 105 - 0
midjourney/src/main/resources/config/logback.xml

@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+	<include resource="org/springframework/boot/logging/logback/defaults.xml" />
+	<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
+
+	<contextName>midjourney-server</contextName>
+
+	<property name="log_home" value="./logs"/>
+
+	<!-- 控制台输出 -->
+	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<!-- 日志输出的文件的格式 -->
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} | [%magenta(%thread) %green(%5L)] %highlight(%-5level) %cyan(%logger{50}) : %msg %n</pattern>
+			<charset>UTF-8</charset>
+		</encoder>
+
+	</appender>
+	<!-- 按照每天生成日志文件 -->
+	<appender name="ROOT-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender" level="INFO">
+		<append>true</append>
+
+		<!-- 过滤器,只记录 warn 和 info 级别的日志 -->
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<level>WARN</level>
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>NEUTRAL</onMismatch>
+		</filter>
+
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<level>INFO</level>
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+
+		<file>${log_home}/midjourney-default.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+			<FileNamePattern>${log_home}/midjourney-default.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+			<!-- kb/mb/gb -->
+			<maxFileSize>128MB</maxFileSize>
+			<!-- 日志文件保留天数 -->
+			<maxHistory>14</maxHistory>
+		</rollingPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} | [%magenta(%thread) %green(%5L)] %highlight(%-5level) %cyan(%logger{50}) : %msg %n</pattern>
+			<charset>UTF-8</charset>
+		</encoder>
+
+	</appender>
+
+	<!-- 按照每天生成日志文件 -->
+	<appender name="ERROR-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<append>true</append>
+
+		<!-- 过滤器,只记录 error 级别的日志 -->
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<level>ERROR</level>
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+
+		<!-- 日志名称 -->
+		<file>${log_home}/midjourney-error.log</file>
+		<!-- 每天生成一个日志文件,保存15天的日志文件 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+			<!--日志文件输出的文件名:按天回滚 daily -->
+			<FileNamePattern>${log_home}/midjourney.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+			<!-- kb/mb/gb -->
+			<maxFileSize>128MB</maxFileSize>
+			<!-- 日志文件保留天数 -->
+			<maxHistory>14</maxHistory>
+			<totalSizeCap>10GB</totalSizeCap>
+		</rollingPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} | [%magenta(%thread) %green(%5L)] %highlight(%-5level) %cyan(%logger{50}) : %msg %n</pattern>
+			<!-- 编码 -->
+			<charset>UTF-8</charset>
+		</encoder>
+	</appender>
+
+	<!-- 异步输出 -->
+	<appender name="ERROR_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
+		<!-- 不丢失日志.默认的. 如果discardingThreshold大于0,队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
+		<discardingThreshold>0</discardingThreshold>
+		<queueSize>10240</queueSize>
+		<appender-ref ref="ERROR-APPENDER" />
+	</appender>
+
+	<!-- 异步输出 -->
+	<appender name="ROOT_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
+		<!-- 不丢失日志.默认的. 如果discardingThreshold大于0,队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
+		<discardingThreshold>0</discardingThreshold>
+		<queueSize>10240</queueSize>
+		<appender-ref ref="ROOT-APPENDER" />
+	</appender>
+
+	<root level="INFO">
+		<appender-ref ref="STDOUT" />
+		<appender-ref ref="ERROR_ASYNC" />
+		<appender-ref ref="ROOT_ASYNC" />
+	</root>
+
+	<shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>
+</configuration>

+ 0 - 1
netflix-common/pom.xml

@@ -12,7 +12,6 @@
     <artifactId>netflix-common</artifactId>
 
     <name>netflix-common</name>
-    <description>有客来-common</description>
 
     <dependencies>
 

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels