Ver código fonte

聊天、聊天记录,拓展问答 信息Base64解码

huiqi 3 semanas atrás
pai
commit
391796ed5e

+ 2 - 0
takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiApplication.java

@@ -90,6 +90,8 @@ public class TakaiApplication extends BaseEntity
 
     private List<SysUser> vipList;
 
+    private Integer sort;
+
 
     @Override
     public String toString() {

+ 2 - 0
takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiApplicationParams.java

@@ -54,4 +54,6 @@ public class TakaiApplicationParams {
     private String visible;
 
     private List<SysUser> vipList;
+
+    private Integer sort;
 }

+ 2 - 0
takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiApplicationResult.java

@@ -25,6 +25,8 @@ public class TakaiApplicationResult {
 
     private String visible;
 
+    private Integer sort;
+
     private String status;
 
     private String approver;

+ 9 - 1
takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiPromptInfo.java

@@ -1,11 +1,19 @@
 package com.takai.ai.domain.entity;
 
+import com.takai.common.config.DeepseekConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+
 public class TakaiPromptInfo {
 
     private String role;
 
     private String content;
 
+    private static final Base64.Decoder BASE64_DECODER = Base64.getDecoder();
 
     public String getRole() {
         return role;
@@ -16,7 +24,7 @@ public class TakaiPromptInfo {
     }
 
     public String getContent() {
-        return content;
+            return content;
     }
 
     public void setContent(String content) {

+ 54 - 5
takai-ai/src/main/java/com/takai/ai/service/impl/TakaiAiServiceImpl.java

@@ -8,6 +8,7 @@ import com.takai.ai.domain.TakaiSysOss;
 import com.takai.ai.domain.dto.*;
 import com.takai.ai.domain.entity.*;
 import com.takai.ai.mapper.*;
+import com.takai.ai.service.IMinioConfigService;
 import com.takai.ai.service.ITakaiAiService;
 import com.takai.ai.utils.*;
 import com.takai.common.annotation.DataSource;
@@ -129,6 +130,9 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
     @Autowired
     private TakaiFileInfoMapper fileInfoMapper;
 
+    @Autowired
+    private Base64DecodeUtil base64DecodeUtil;
+
     public static final String START_SIGN = "【";
     public static final String END_SIGN = "】";
     public static final String SYMBOL = "【示意图序号";
@@ -138,6 +142,9 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
     public static final String TODAY = "今日";
 
     public static final String BEFOR = "日前";
+
+    private final String OSS_URL= "https://minio.jkec.info:9000";
+
     @Autowired
     private SysProjectMapper sysProjectMapper;
 
@@ -198,6 +205,8 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                 //重新设置knowledgeIds为数组
                 json.put("knowledgeIds",idList);
                 String query = null;
+                decodeMessage(sseParams.getMessages());
+                decodeMessage(sseParams.getPrompt());
                 if(sseParams.getMessages() != null && !sseParams.getMessages().isEmpty() ) {
                     query = sseParams.getMessages().get(sseParams.getMessages().size() - 1).getContent();
                 } else {
@@ -255,7 +264,8 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                                         String url = redisCache.getCacheObject(key);
                                         if (org.springframework.util.StringUtils.hasText(url)) {
                                             if(url.contains("https://10.1.28.14:9000")){
-                                                url = url.replace("https://10.1.28.14:9000", "https://minio.jkec.info:9000");
+                                                //url = url.replace("https://10.1.28.14:9000", "https://minio.jkec.info:9000");
+                                                url = url.replace("https://10.1.28.14:9000", OSS_URL);
                                             }
                                             //匹配markdown图片格式
 //                                            symbolData = symbolData.replace(key, "![](" + url + ")");
@@ -273,7 +283,9 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                                             newData = symbolData;
                                             symbolData = "";
                                         }
-                                        newData = newData.replace(key, " ![](" + url + ")");
+                                        if(!StringUtils.isEmpty(url)) {
+                                            newData = newData.replace(key, " ![](" + url + ")");
+                                        }
                                     } else {
                                         newData = symbolData;
                                         symbolData = "";
@@ -361,6 +373,15 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
         return null;
     }
 
+    private void decodeMessage(List<TakaiPromptInfo> messages) {
+        if(messages == null || messages.isEmpty()) {
+            return;
+        }
+        for (TakaiPromptInfo message : messages) {
+            message.setContent(base64DecodeUtil.decodeIfNeeded(message.getContent()));
+        }
+    }
+
     @Override
     public List<String> asyncCompletions(TakaiCompletionsParams params) {
         List<String> list = new ArrayList<>();
@@ -369,6 +390,7 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
             TakaiPromptInfo info = new TakaiPromptInfo();
             info.setContent(deepseekConfig.getPrompt());
             info.setRole("user");
+            decodeMessage(params.getMessages());
             params.getMessages().add(info);
 
             JSONObject jsonObject = new JSONObject();
@@ -378,7 +400,9 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
             JSONObject result = getasyncCompletions(jsonObject);
             if (result != null && result.getInteger("code") == 200) {
                 JSONArray array = result.getJSONArray("data");
-                list.addAll(array.toJavaList(String.class));
+                if(array != null){
+                    list.addAll(array.toJavaList(String.class));
+                }
             }
         }
         return list;
@@ -446,6 +470,7 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
 
         for (TakaiDialogDetailReqDTO dto : dialogReqDTO.getMessages()) {
             dto.setDialogId(dialogId);
+            dto.setContent(base64DecodeUtil.decodeIfNeeded(dto.getContent()));
             TakaiDialogRespDTO detail = takaiDialogMapper.selectDialogDetailById(dto.getId());
             if (detail == null) {
                 if (dto.getSliceInfo() != null) dto.setSliceJson(JSON.toJSONString(dto.getSliceInfo()));
@@ -761,12 +786,34 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
 
     @Override
     public List<TakaiDocument> documentList(TakaiDocumentParams documentParams) {
-        return takaiDocumentMapper.selectDocumentList(TakaiDocument.builder().knowledgeId(documentParams.getKnowledge_id()).build());
+        List<TakaiDocument> documentList = takaiDocumentMapper.selectDocumentList(TakaiDocument.builder().knowledgeId(documentParams.getKnowledge_id()).build());
+        replaceOssUrl(documentList);
+        return documentList;
+    }
+
+    private void replaceOssUrl(List<TakaiDocument> documentList) {
+        if(documentList == null || documentList.isEmpty()) {
+            return;
+        }
+        for(TakaiDocument document : documentList) {
+            replaceDocUrl(document);
+        }
+    }
+
+    private void replaceDocUrl(TakaiDocument document) {
+        if(document == null) {
+            return;
+        }
+        String url = document.getUrl();
+        url = url.replace("https://10.1.28.14:9000", OSS_URL);
+        document.setUrl(url);
     }
 
     @Override
     public TakaiDocument documentDetail(String documentId) {
-        return takaiDocumentMapper.selectTargetDocument(TakaiDocument.builder().documentId(documentId).build());
+        TakaiDocument doc = takaiDocumentMapper.selectTargetDocument(TakaiDocument.builder().documentId(documentId).build());
+        replaceDocUrl(doc);
+        return doc;
     }
 
     @Override
@@ -845,6 +892,7 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                     .typeId(params.getTypeId())
                     .visible(params.getVisible())
                     .isDeepThink(params.getIsDeepThink())
+                    .sort(params.getSort())
                     .build();
             //关联项目
             if(params.getAppProId() != null){
@@ -926,6 +974,7 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                     .typeId(params.getTypeId())
                     .isDeepThink(params.getIsDeepThink())
                     .visible(params.getVisible())
+                    .sort(params.getSort())
                     .build();
             //关联项目
             if(params.getAppProId() != null){

+ 40 - 0
takai-ai/src/main/java/com/takai/ai/utils/Base64DecodeUtil.java

@@ -0,0 +1,40 @@
+package com.takai.ai.utils;
+
+import com.takai.common.config.DeepseekConfig;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+
+@Component
+public class Base64DecodeUtil {
+    // 注入配置类,获取解码开关
+    @Resource
+    private DeepseekConfig deepseekConfig;
+
+    // Java 8+ 内置Base64解码器(线程安全,可静态初始化)
+    private static final Base64.Decoder BASE64_DECODER = Base64.getDecoder();
+
+    /**
+     * 根据配置动态解码字符串
+     * @param encodedContent 可能经过Base64编码的字符串
+     * @return 解码后的字符串(无需解码则返回原字符串)
+     */
+    public String decodeIfNeeded(String encodedContent) {
+        // 1. 开关关闭、字符串为null/空,直接返回原内容
+        if (!deepseekConfig.isContentBase64Encode() || encodedContent == null || encodedContent.isEmpty()) {
+            return encodedContent;
+        }
+
+        try {
+            // 2. 开关开启,执行Base64解码(默认UTF-8,需调整编码可修改此处)
+            byte[] decodedBytes = BASE64_DECODER.decode(encodedContent);
+            return new String(decodedBytes, StandardCharsets.UTF_8);
+        } catch (IllegalArgumentException e) {
+            // 3. 非法Base64字符串,返回原内容(或抛出业务异常,按需调整)
+            System.err.printf("Base64解码失败,内容[%s]不是合法Base64字符串:%s%n", encodedContent, e.getMessage());
+            return encodedContent;
+        }
+    }
+}

+ 8 - 4
takai-ai/src/main/resources/mapper/takaiai/TakaiApplicationMapper.xml

@@ -22,6 +22,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="knowledgeInfo" column="knowledge_info" />
 		<result property="typeId" column="type_id" />
 		<result property="visible" column="visible" />
+		<result property="sort" column="sort" />
 		<result property="status" column="status" />
 		<result property="approver" column="approver" />
 		<result property="nodeOrder" column="node_order" />
@@ -40,6 +41,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="prompt"   column="prompt"   />
 		<result property="typeId" column="type_id" />
 		<result property="visible" column="visible" />
+		<result property="sort" column="sort" />
 		<result property="status"  column="status"  />
 		<result property="approver"  column="approver"  />
 		<result property="comment"   column="comment"   />
@@ -56,7 +58,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
 	<sql id="selectSql">
 		select appId, name, description, prompt, top_p, temperature, knowledge_ids, slice_count,model,icon_color,icon_type,max_token, param_desc, knowledge_info, type_id,
-			   status, approver, node_order, comment,remark, create_by, create_time, update_by, update_time, is_deep_think,visible
+			   status, approver, node_order, comment,remark, create_by, create_time, update_by, update_time, is_deep_think,visible,sort
 		from bm_application
     </sql>
 
@@ -104,7 +106,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 					AND sp.project_id = #{projectId}
 				</if>
 			</where>
-			ORDER BY bm.update_time DESC, bm.create_time DESC
+			ORDER BY sort IS NULL, sort ASC, bm.update_time DESC, bm.create_time DESC
 		</if>
 		<if test="params == null or !params.isAdmin">
 		SELECT DISTINCT
@@ -270,7 +272,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			AND ba.type_id = #{typeId}
 		</if>
 		<if test="addOrderBy == null or addOrderBy == 'Y'">
-			ORDER BY update_time DESC, create_time DESC
+			ORDER BY sort IS NULL, sort ASC, update_time DESC, create_time DESC
 		</if>
 		</if>
 	</select>
@@ -304,6 +306,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			<if test="comment != null and comment != ''">comment,</if>
 		    <if test="isDeepThink != null and isDeepThink != ''">is_deep_think,</if>
 			<if test="visible != null and visible != ''">visible,</if>
+		    <if test="sort != null">sort,</if>
  			create_time,
 		    update_time
  		)values(
@@ -329,6 +332,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			<if test="comment != null and comment != ''">#{comment},</if>
 			<if test="isDeepThink != null and isDeepThink != ''">#{isDeepThink},</if>
 			<if test="visible != null and visible != ''">#{visible},</if>
+			<if test="sort != null">#{sort},</if>
  			sysdate(),
 		    sysdate()
  		)
@@ -353,7 +357,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			<if test="maxToken != null and maxToken != ''">max_token = #{maxToken},</if>
 			<if test="isDeepThink != null and isDeepThink != ''">is_deep_think = #{isDeepThink},</if>
 			<if test="visible != null and visible != ''">visible = #{visible},</if>
-<!--			<if test="typeId != null and typeId != ''">type_id = #{typeId},</if>-->
+			<if test="sort != null">sort = #{sort},</if>
 			type_id = #{typeId},
 			<if test="status != null and status != ''">status = #{status},</if>
 			node_order = #{nodeOrder},

+ 1 - 1
takai-ai/src/main/resources/mapper/takaiai/TakaiDialogMapper.xml

@@ -181,7 +181,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 				d.app_id = #{appId}
 			</if>
 			<if test="userId != null and userId != null">
-				d.user_id = #{userId}
+				and d.user_id = #{userId}
 			</if>
 		</where>
 		ORDER BY d.create_time asc

+ 3 - 126
takai-common/src/main/java/com/takai/common/config/DeepseekConfig.java

@@ -1,9 +1,11 @@
 package com.takai.common.config;
 
 
+import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
 
+@Data
 @Component
 @ConfigurationProperties(prefix = "deepseek")
 public class DeepseekConfig {
@@ -40,131 +42,6 @@ public class DeepseekConfig {
 
     private String baseChat;
 
-    public String getBaseurl() {
-        return baseurl;
-    }
+    private boolean contentBase64Encode;
 
-    public void setBaseurl(String baseurl) {
-        this.baseurl = baseurl;
-    }
-
-    public String getCreateKnowledge() {
-        return createKnowledge;
-    }
-
-    public void setCreateKnowledge(String createKnowledge) {
-        this.createKnowledge = createKnowledge;
-    }
-
-    public String getDeleteKnowledge() {
-        return deleteKnowledge;
-    }
-
-    public void setDeleteKnowledge(String deleteKnowledge) {
-        this.deleteKnowledge = deleteKnowledge;
-    }
-
-    public String getSlicePage() {
-        return slicePage;
-    }
-
-    public void setSlicePage(String slicePage) {
-        this.slicePage = slicePage;
-    }
-
-    public String getDeleteSlice() {
-        return deleteSlice;
-    }
-
-    public void setDeleteSlice(String deleteSlice) {
-        this.deleteSlice = deleteSlice;
-    }
-
-    public String getSliceDetail() {
-        return sliceDetail;
-    }
-
-    public void setSliceDetail(String sliceDetail) {
-        this.sliceDetail = sliceDetail;
-    }
-
-    public String getUpdateSlice() {
-        return updateSlice;
-    }
-
-    public void setUpdateSlice(String updateSlice) {
-        this.updateSlice = updateSlice;
-    }
-
-    public String getUploadKnowledge() {
-        return uploadKnowledge;
-    }
-
-    public void setUploadKnowledge(String uploadKnowledge) {
-        this.uploadKnowledge = uploadKnowledge;
-    }
-
-    public String getChat() {
-        return chat;
-    }
-
-    public void setChat(String chat) {
-        this.chat = chat;
-    }
-
-    public String getAsyncCompletions() {
-        return asyncCompletions;
-    }
-
-    public String getPrompt() {
-        return prompt;
-    }
-
-    public void setPrompt(String prompt) {
-        this.prompt = prompt;
-    }
-
-    public void setAsyncCompletions(String asyncCompletions) {
-        this.asyncCompletions = asyncCompletions;
-    }
-
-    public String getDeleteDoc() {
-        return deleteDoc;
-    }
-
-    public void setDeleteDoc(String deleteDoc) {
-        this.deleteDoc = deleteDoc;
-    }
-
-    public String getAddSlice() {
-        return addSlice;
-    }
-
-    public void setAddSlice(String addSlice) {
-        this.addSlice = addSlice;
-    }
-
-    public String getSearchSlice() {
-        return searchSlice;
-    }
-
-    public void setSearchSlice(String searchSlice) {
-        this.searchSlice = searchSlice;
-    }
-
-    public String getWebSearch() {
-        return webSearch;
-    }
-
-    public void setWebSearch(String webSearch) {
-        this.webSearch = webSearch;
-    }
-
-    public String getBaseChat() {
-        return baseChat;
-    }
-
-    public void setBaseChat(String baseChat) {
-        this.baseChat = baseChat;
-    }
 }