ruoyi-admin/src/main/resources/application.yml
@@ -322,6 +322,9 @@ spring: ai: openai: api-key: sk-xX base-url: https://api.pandarobot.chat/ ollama: base-url: http://localhost:11434 mcp: ruoyi-common/ruoyi-common-chat/src/main/java/org/ruoyi/common/chat/request/ChatRequest.java
@@ -49,7 +49,7 @@ /** * ç¨æ·id */ private String userId; private Long userId; /** * åºç¨ID ruoyi-modules-api/ruoyi-chat-api/pom.xml
@@ -60,17 +60,12 @@ <!-- <dependency>--> <!-- <groupId>org.springframework.ai</groupId>--> <!-- <artifactId>spring-ai-mcp</artifactId>--> <!-- </dependency>--> <!-- <dependency>--> <!-- <groupId>org.springframework.ai</groupId>--> <!-- <artifactId>spring-ai-openai</artifactId>--> <!-- <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>--> <!-- </dependency>--> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-ollama-spring-boot-starter</artifactId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> </dependency> </dependencies> ruoyi-modules/ruoyi-chat/pom.xml
@@ -113,12 +113,6 @@ <groupId>org.ruoyi</groupId> <artifactId>ruoyi-system-api</artifactId> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-ollama</artifactId> <version>1.0.0-M6</version> <scope>compile</scope> </dependency> </dependencies> ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/listener/SSEEventSourceListener.java
@@ -18,7 +18,7 @@ import org.ruoyi.common.core.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.util.Objects; @@ -34,13 +34,13 @@ public class SSEEventSourceListener extends EventSourceListener { @Autowired(required = false) public SSEEventSourceListener(ResponseBodyEmitter emitter) { public SSEEventSourceListener(SseEmitter emitter) { this.emitter = emitter; } private ResponseBodyEmitter emitter; private SseEmitter emitter; private StringBuilder stringBuffer; private StringBuilder stringBuffer = new StringBuilder(); private String modelName; @@ -61,7 +61,6 @@ @Override public void onEvent(@NotNull EventSource eventSource, String id, String type, String data) { try { if ("[DONE]".equals(data)) { //æåååº emitter.complete(); @@ -72,25 +71,23 @@ chatCostService.deductToken(chatRequest); return; } // è§£æè¿åå 容 ObjectMapper mapper = new ObjectMapper(); ChatCompletionResponse completionResponse = mapper.readValue(data, ChatCompletionResponse.class); if(completionResponse == null || CollectionUtil.isEmpty(completionResponse.getChoices())){ return; } Object content = completionResponse.getChoices().get(0).getDelta().getContent(); if(content == null){ content = completionResponse.getChoices().get(0).getDelta().getReasoningContent(); if(content == null) return; if(content != null ){ if(StringUtils.isEmpty(modelName)){ modelName = completionResponse.getModel(); } stringBuffer.append(content); emitter.send(content); } if(StringUtils.isEmpty(modelName)){ modelName = completionResponse.getModel(); } stringBuffer.append(content); emitter.send(data); } catch (Exception e) { log.error("sseä¿¡æ¯æ¨é失败{}å 容ï¼{}",e.getMessage(),data); eventSource.cancel(); emitter.completeWithError(e); } } ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/IChatCostService.java
@@ -40,4 +40,9 @@ * å¤æç¨æ·æ¯å¦ä»è´¹ */ void checkUserGrade(); /** * è·åç»å½ç¨æ·id */ Long getUserId(); } ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/IChatService.java
@@ -22,5 +22,5 @@ * 客æ·ç«¯åéæ¶æ¯å°æå¡ç«¯ * @param chatRequest 请æ±å¯¹è±¡ */ SseEmitter mcpChat(ChatRequest chatRequest,SseEmitter emitter); void mcpChat(ChatRequest chatRequest,SseEmitter emitter); } ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/ChatCostServiceImpl.java
@@ -6,6 +6,7 @@ import org.ruoyi.chat.enums.BillingType; import org.ruoyi.chat.enums.UserGradeType; import org.ruoyi.chat.service.chat.IChatCostService; import org.ruoyi.common.chat.config.LocalCache; import org.ruoyi.common.chat.request.ChatRequest; import org.ruoyi.common.chat.utils.TikTokensUtil; import org.ruoyi.common.core.domain.model.LoginUser; @@ -96,6 +97,12 @@ chatToken.setUserId(chatMessageBo.getUserId()); chatTokenService.editToken(chatToken); } Object userId = LocalCache.CACHE.get("userId"); if(userId!=null){ chatMessageBo.setUserId((Long) userId); }else { chatMessageBo.setUserId(getUserId()); } // ä¿åæ¶æ¯è®°å½ chatMessageService.insertByBo(chatMessageBo); } ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OllamaServiceImpl.java
@@ -7,24 +7,13 @@ import io.github.ollama4j.models.chat.OllamaChatRequestModel; import io.github.ollama4j.models.generate.OllamaStreamHandler; import lombok.extern.slf4j.Slf4j; import org.ruoyi.chat.service.chat.IChatService; import org.ruoyi.chat.util.SSEUtil; import org.ruoyi.common.chat.entity.chat.Message; import org.ruoyi.common.chat.request.ChatRequest; import org.ruoyi.domain.vo.ChatModelVo; import org.ruoyi.service.IChatModelService; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor; import org.springframework.ai.chat.memory.ChatMemory; import org.springframework.ai.chat.memory.InMemoryChatMemory; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.ollama.api.OllamaModel; import org.springframework.ai.ollama.api.OllamaOptions; import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.io.IOException; @@ -35,27 +24,11 @@ @Service @Slf4j public class OllamaServiceImpl implements IChatService { public class OllamaServiceImpl { @Autowired private IChatModelService chatModelService; @Autowired private IChatModelService chatModelService; private final ChatClient chatClient; private final ChatMemory chatMemory = new InMemoryChatMemory(); public OllamaServiceImpl(ChatClient.Builder chatClientBuilder,ToolCallbackProvider tools) { this.chatClient = chatClientBuilder .defaultTools(tools) .defaultOptions( OllamaOptions.builder() .model(OllamaModel.QWEN_2_5_7B) .temperature(0.4) .build()) .build(); } @Override public SseEmitter chat(ChatRequest chatRequest,SseEmitter emitter) { ChatModelVo chatModelVo = chatModelService.selectModelByName(chatRequest.getModel()); String host = chatModelVo.getApiHost(); @@ -100,44 +73,4 @@ return emitter; } @Override public SseEmitter mcpChat(ChatRequest chatRequest, SseEmitter emitter) { List<Message> msgList = chatRequest.getMessages(); // æ·»å è®°å¿ for (int i = 0; i < msgList.size(); i++) { org.springframework.ai.chat.messages.Message springAiMessage = new UserMessage(msgList.get(i).getContent().toString()); chatMemory.add(String.valueOf(i),springAiMessage); } var messageChatMemoryAdvisor = new MessageChatMemoryAdvisor(chatMemory, chatRequest.getUserId(), 10); this.chatClient.prompt(chatRequest.getPrompt()) .advisors(messageChatMemoryAdvisor) .stream() .chatResponse() .subscribe( chatResponse -> { try { emitter.send(chatResponse, MediaType.APPLICATION_JSON); } catch (IOException e) { e.printStackTrace(); } }, error -> { try { emitter.completeWithError(error); } catch (Exception e) { e.printStackTrace(); } }, () -> { try { emitter.complete(); } catch (Exception e) { e.printStackTrace(); } } ); return emitter; } } ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/OpenAIServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,78 @@ package org.ruoyi.chat.service.chat.impl; import lombok.extern.slf4j.Slf4j; import org.ruoyi.chat.service.chat.IChatService; import org.ruoyi.common.chat.entity.chat.Message; import org.ruoyi.common.chat.request.ChatRequest; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor; import org.springframework.ai.chat.memory.ChatMemory; import org.springframework.ai.chat.memory.InMemoryChatMemory; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.openai.OpenAiChatOptions; import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.stereotype.Service; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import reactor.core.publisher.Flux; import reactor.core.scheduler.Schedulers; import java.io.IOException; import java.util.List; @Service @Slf4j public class OpenAIServiceImpl implements IChatService { private final ChatClient chatClient; private final ChatMemory chatMemory = new InMemoryChatMemory(); public OpenAIServiceImpl(ChatClient.Builder chatClientBuilder, ToolCallbackProvider tools) { this.chatClient = chatClientBuilder .defaultTools(tools) .defaultOptions( OpenAiChatOptions.builder() .model("gpt-4o-mini") .temperature(0.4) .build()) .build(); } @Override public SseEmitter chat(ChatRequest chatRequest,SseEmitter emitter) { return emitter; } @Override public void mcpChat(ChatRequest chatRequest, SseEmitter emitter) { List<Message> msgList = chatRequest.getMessages(); // æ·»å è®°å¿ for (int i = 0; i < msgList.size(); i++) { org.springframework.ai.chat.messages.Message springAiMessage = new UserMessage(msgList.get(i).getContent().toString()); chatMemory.add(String.valueOf(i), springAiMessage); } var messageChatMemoryAdvisor = new MessageChatMemoryAdvisor(chatMemory, chatRequest.getUserId().toString(), 10); Flux<String> content = chatClient .prompt(chatRequest.getPrompt()) .advisors(messageChatMemoryAdvisor) .stream().content(); content.publishOn(Schedulers.boundedElastic()) .doOnNext(text -> { try { emitter.send(text); } catch (IOException e) { emitter.completeWithError(e); } }) .doOnError(error -> { log.error("Error in SSE stream: ", error); emitter.completeWithError(error); }) .doOnComplete(emitter::complete) .subscribe(); } } ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java
@@ -11,11 +11,13 @@ import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.ruoyi.chat.config.ChatConfig; import org.ruoyi.chat.listener.SSEEventSourceListener; import org.ruoyi.chat.service.chat.IChatCostService; import org.ruoyi.chat.service.chat.IChatService; import org.ruoyi.chat.service.chat.ISseService; import org.ruoyi.chat.util.IpUtil; import org.ruoyi.chat.util.SSEUtil; import org.ruoyi.common.chat.config.LocalCache; import org.ruoyi.common.chat.request.ChatRequest; import org.ruoyi.common.chat.entity.Tts.TextToSpeech; import org.ruoyi.common.chat.entity.chat.ChatCompletion; @@ -33,7 +35,9 @@ import org.ruoyi.common.redis.utils.RedisUtils; import org.ruoyi.domain.vo.ChatModelVo; import org.ruoyi.service.EmbeddingService; import org.ruoyi.service.IChatModelService; import org.ruoyi.service.VectorStoreService; import org.springframework.core.io.InputStreamResource; import org.springframework.core.io.Resource; @@ -74,27 +78,35 @@ private final IChatService chatService; private final IChatModelService chatModelService; private static final String requestIdTemplate = "company-%d"; private static final ObjectMapper mapper = new ObjectMapper(); private final ChatConfig chatConfig; @Override public SseEmitter sseChat(ChatRequest chatRequest, HttpServletRequest request) { SseEmitter sseEmitter = new SseEmitter(0L); SseEmitter sseEmitter = new SseEmitter(); try { // æå»ºæ¶æ¯å表å¢å èç½ãç¥è¯åºçå 容 buildChatMessageList(chatRequest); if (!StpUtil.isLogin()) { // æªç»å½ç¨æ·éå¶å¯¹è¯æ¬¡æ° checkUnauthenticatedUserChatLimit(request); }else { LocalCache.CACHE.put("userId", chatCostService.getUserId()); chatRequest.setUserId(chatCostService.getUserId()); // ä¿åæ¶æ¯è®°å½ å¹¶æ£é¤è´¹ç¨ // chatCostService.deductToken(chatRequest); } // æ ¹æ®æ¨¡ååç§°åç¼è°ç¨ä¸åçå¤çé»è¾ switchModelAndHandle(chatRequest,sseEmitter); // æªç»å½ç¨æ·éå¶å¯¹è¯æ¬¡æ° checkUnauthenticatedUserChatLimit(request); // ä¿åæ¶æ¯è®°å½ å¹¶æ£é¤è´¹ç¨ chatCostService.deductToken(chatRequest); } catch (Exception e) { String message = e.getMessage(); SSEUtil.sendErrorEvent(sseEmitter, message); return sseEmitter; log.error(e.getMessage(),e); sseEmitter.completeWithError(e); } return sseEmitter; } @@ -106,8 +118,7 @@ * @throws ServiceException 妿彿¥å 费次æ°å·²ç¨å® */ public void checkUnauthenticatedUserChatLimit(HttpServletRequest request) throws ServiceException { // æªç»å½ç¨æ·éå¶å¯¹è¯æ¬¡æ° if (!StpUtil.isLogin()) { String clientIp = IpUtil.getClientIp(request); // 访客æ¯å¤©é»è®¤åªè½å¯¹è¯5次 int timeWindowInSeconds = 5; @@ -125,13 +136,14 @@ count++; RedisUtils.setCacheObject(redisKey, count); } } } /** * æ ¹æ®æ¨¡ååç§°åç¼è°ç¨ä¸åçå¤çé»è¾ */ private void switchModelAndHandle(ChatRequest chatRequest,SseEmitter emitter) { SSEEventSourceListener openAIEventSourceListener = new SSEEventSourceListener(emitter); String model = chatRequest.getModel(); // å¦ææ¨¡åå称以ollamaå¼å¤´ï¼åè°ç¨ollamaä¸é¨ç½²çæ¬å°æ¨¡å if (model.startsWith("ollama-")) { @@ -142,8 +154,24 @@ } else { throw new IllegalArgumentException("Invalid ollama model name: " + chatRequest.getModel()); } } else if (model.startsWith("gpt-4-gizmo")) { chatRequest.setModel("gpt-4-gizmo"); } else { if (model.startsWith("gpt-4-gizmo")) { chatRequest.setModel("gpt-4-gizmo"); } ChatModelVo chatModelVo = chatModelService.selectModelByName(chatRequest.getModel()); //openAiStreamClient = chatConfig.createOpenAiStreamClient(chatModelVo.getApiHost(), chatModelVo.getApiKey()); ChatCompletion completion = ChatCompletion .builder() .messages(chatRequest.getMessages()) .model(chatRequest.getModel()) .temperature(0.2) .topP(1.0) .stream(true) .build(); openAiStreamClient.streamChatCompletion(completion, openAIEventSourceListener); } } @@ -151,9 +179,10 @@ * æå»ºæ¶æ¯å表 */ private void buildChatMessageList(ChatRequest chatRequest){ ChatModelVo chatModelVo = chatModelService.selectModelByName(chatRequest.getModel()); // è·åå¯¹è¯æ¶æ¯å表 List<Message> messages = chatRequest.getMessages(); String sysPrompt = chatRequest.getSysPrompt(); String sysPrompt = chatModelVo.getSystemPrompt(); if(StringUtils.isEmpty(sysPrompt)){ sysPrompt ="ä½ æ¯ä¸ä¸ªç±RuoYI-AIå¼åç人工æºè½å©æï¼ååå«çç«å©æãä½ æ é¿ä¸è±æå¯¹è¯ï¼è½å¤ç解并å¤çåç§é®é¢ï¼æä¾å®å ¨ãæå¸®å©ãåç¡®çåçã" + "å½åæ¶é´ï¼"+ DateUtils.getDate(); @@ -162,8 +191,9 @@ Message sysMessage = Message.builder().content(sysPrompt).role(Message.Role.SYSTEM).build(); messages.add(0,sysMessage); chatRequest.setSysPrompt(sysPrompt); // æ¥è¯¢åéåºç¸å ³ä¿¡æ¯å å ¥å°ä¸ä¸æ if(chatRequest.getKid()!=null){ if(StringUtils.isNotEmpty(chatRequest.getKid())){ List<Message> knMessages = new ArrayList<>(); String content = messages.get(messages.size() - 1).getContent().toString(); List<String> nearestList; ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/util/SSEUtil.java
@@ -1,6 +1,7 @@ package org.ruoyi.chat.util; import lombok.extern.slf4j.Slf4j; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.io.IOException; @@ -19,7 +20,7 @@ * @param sseEmitter sseäºä»¶å¯¹è±¡ * @param errorMessage éè¯¯ä¿¡æ¯ */ public static void sendErrorEvent(SseEmitter sseEmitter, String errorMessage) { public static void sendErrorEvent(ResponseBodyEmitter sseEmitter, String errorMessage) { SseEmitter.SseEventBuilder event = SseEmitter.event() .name("error") .data(errorMessage); ruoyi-modules/ruoyi-demo/pom.xml
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/controller/MailController.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/controller/RedisCacheController.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/controller/RedisLockController.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/controller/RedisPubSubController.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/controller/RedisRateLimiterController.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/controller/SmsController.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/controller/Swagger3DemoController.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/controller/TestBatchController.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/controller/TestDemoController.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/controller/TestEncryptController.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/controller/TestExcelController.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/controller/TestI18nController.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/controller/TestSensitiveController.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/controller/TestTreeController.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/controller/queue/BoundedQueueController.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/controller/queue/DelayedQueueController.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/controller/queue/PriorityDemo.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/controller/queue/PriorityQueueController.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/domain/TestDemo.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/domain/TestDemoEncrypt.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/domain/TestTree.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/domain/bo/TestDemoBo.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/domain/bo/TestDemoImportVo.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/domain/bo/TestTreeBo.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/domain/vo/TestDemoVo.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/domain/vo/TestTreeVo.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/mapper/TestDemoEncryptMapper.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/mapper/TestDemoMapper.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/mapper/TestTreeMapper.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/service/ITestDemoService.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/service/ITestTreeService.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/service/impl/TestDemoServiceImpl.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/java/org/ruoyi/demo/service/impl/TestTreeServiceImpl.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/resources/excel/µ¥Áбí.xlsxBinary files differ
ruoyi-modules/ruoyi-demo/src/main/resources/excel/¶àÁбí.xlsxBinary files differ
ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-demo/src/main/resources/mapper/package-info.md
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-generator/src/main/java/org/ruoyi/generator/domain/GenTableColumn.java
@@ -41,7 +41,7 @@ /** * åæè¿° */ @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) private String columnComment; /** @@ -63,43 +63,43 @@ /** * æ¯å¦ä¸»é®ï¼1æ¯ï¼ */ @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) private String isPk; /** * æ¯å¦èªå¢ï¼1æ¯ï¼ */ @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) private String isIncrement; /** * æ¯å¦å¿ å¡«ï¼1æ¯ï¼ */ @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) private String isRequired; /** * æ¯å¦ä¸ºæå ¥å段ï¼1æ¯ï¼ */ @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) private String isInsert; /** * æ¯å¦ç¼è¾å段ï¼1æ¯ï¼ */ @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) private String isEdit; /** * æ¯å¦åè¡¨åæ®µï¼1æ¯ï¼ */ @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) private String isList; /** * æ¯å¦æ¥è¯¢å段ï¼1æ¯ï¼ */ @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) @TableField(updateStrategy = FieldStrategy.ALWAYS, jdbcType = JdbcType.VARCHAR) private String isQuery; /**