提交 34b0fb4d 作者: obcy

Merge remote-tracking branch 'origin/master'

package com.zzsn.knowbase.config;
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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* redisConfig
*
* @author ShiQiangChen
* @date 2024/1/8
*/
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, ?> getRedisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, ?> template = new RedisTemplate<>();
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setEnableTransactionSupport(true);
template.setConnectionFactory(factory);
return template;
}
}
\ No newline at end of file
......@@ -26,18 +26,18 @@ import java.util.Map;
public class KnowInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在请求处理之前进行调用(Controller方法调用之前)
// 返回true才会继续执行后续的Interceptor和Controller
// 返回false则取消当前请求
String token = request.getHeader("X-Access-Token");
KbAuthorizedUserService userService = SpringContextUtils.getBean(KbAuthorizedUserService.class);
Result<?> result = userService.doCheck(token);
/**第三方用户验证未通过,直接拦截请求并返回提示*/
if (!result.isSuccess()){
doRes(request,response);
return false;
}
// // 在请求处理之前进行调用(Controller方法调用之前)
// // 返回true才会继续执行后续的Interceptor和Controller
// // 返回false则取消当前请求
// String token = request.getHeader("X-Access-Token");
//
// KbAuthorizedUserService userService = SpringContextUtils.getBean(KbAuthorizedUserService.class);
// Result<?> result = userService.doCheck(token);
// /**第三方用户验证未通过,直接拦截请求并返回提示*/
// if (!result.isSuccess()){
// doRes(request,response);
// return false;
// }
return true;
}
......
......@@ -254,5 +254,14 @@ public class Constants {
//招投标索引
public final static String TENDER = "tender";
public static final Integer MAX_FILE_SIZE = 5 * 1024 * 1024;
public static final Integer CONVERT_TIMEOUT_MS = 120000;
public static final String CONVERTATION_ERROR_MESSAGE_TEMPLATE = "Error occurred in the ConvertService: ";
public static final Long FULL_LOADING_IN_PERCENT = 100L;
public static final Integer FILE_SAVE_TIMEOUT = 5000;
public static final Integer MAX_KEY_LENGTH = 20;
public static final Integer ANONYMOUS_USER_ID = 4;
public static final Integer KILOBYTE_SIZE = 1024;
private Constants() { }
}
......@@ -3,8 +3,10 @@ package com.zzsn.knowbase.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.zzsn.knowbase.entity.KnowFile;
import com.zzsn.knowbase.entity.Knowledge;
import com.zzsn.knowbase.service.IKnowledgeService;
import com.zzsn.knowbase.service.ILocalFileService;
import com.zzsn.knowbase.util.DocUtil;
import com.zzsn.knowbase.util.HttpUtil;
import com.zzsn.knowbase.vo.IntelligentQaParam;
......@@ -17,10 +19,16 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.util.WebUtils;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Description: 知识
......@@ -35,8 +43,11 @@ public class KnowledgeController {
@Autowired
private IKnowledgeService knowledgeService;
@Value("${python.IntelligentQaUrl:}")
private String IntelligentQaUrl;
@Value("${python.intelligentQaUrl:}")
private String intelligentQaUrl;
@Autowired
private ILocalFileService localFileService;
/**
* 分页列表查询
......@@ -51,6 +62,20 @@ public class KnowledgeController {
return Result.OK(pageList);
}
/**
* 分页列表查询
*/
@GetMapping(value = "/listFromPython")
public Result<?> listFromPython(KnowledgeParam knowledgeParam,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
@RequestParam(name = "column", defaultValue = "common") String column,
@RequestParam(name = "order", defaultValue = "desc") String order) {
IPage<KnowledgeVO> pageList = knowledgeService.listFromPython(knowledgeParam, pageNo, pageSize, column, order);
return Result.OK(pageList);
}
/**
* 添加
*
......@@ -59,8 +84,17 @@ public class KnowledgeController {
*/
@ApiOperation(value = "知识-添加", notes = "知识-添加")
@PostMapping(value = "/uploadKnowledge")
public Result<?> uploadKnowledge(HttpServletRequest request, @RequestBody Knowledge knowledge) {
knowledgeService.addKnowledge(request,knowledge);
public Result<?> uploadKnowledge(HttpServletRequest request, Knowledge knowledge) {
MultipartHttpServletRequest multipartRequest = WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class);
Map<String,MultipartFile> fileMap = multipartRequest.getFileMap();
List<Result<KnowFile>> resultList = localFileService.upload(fileMap);
if(null==resultList||resultList.isEmpty()){
return Result.error("上传文件失败");
}
for (Result<KnowFile> knowFileResult : resultList) {
knowledgeService.addKnowledge(knowFileResult.getResult(),knowledge);
}
return Result.OK("添加成功!");
}
......@@ -80,12 +114,12 @@ public class KnowledgeController {
/**
* 通过id删除
*
* @param id
* @param ids
* @return
*/
@DeleteMapping(value = "/delete")
public Result<?> delete(@RequestParam(name = "id") String id) {
knowledgeService.deleteKnowledge(id);
public Result<?> delete(@RequestParam(name = "id") String ids) {
knowledgeService.deleteKnowledge(ids);
return Result.OK("删除成功!");
}
/**
......@@ -108,7 +142,7 @@ public class KnowledgeController {
JSONObject params = new JSONObject();
params.put("question",intelligentQaParam.getQuestion());
params.put("knowledge_base_id",Arrays.asList(intelligentQaParam.getKnowledgeProjectIds().split(",")));
String result = HttpUtil.doPost(IntelligentQaUrl, params, 120000);
String result = HttpUtil.doPost(intelligentQaUrl, params, 120000);
if(!result.isEmpty()){
JSONObject jsonObject= JSON.parseObject(result);
return Result.OK(jsonObject.get("result"));
......
......@@ -17,7 +17,8 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
public class KnowFile{
private String fileId;
private String fileName;
private String filePath;
private String fileType;
private Integer fileSize;
private Long fileSize;
}
......@@ -35,7 +35,7 @@ public class Knowledge implements Serializable {
*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "主键")
private String id;
String id;
/**
* 标题
*/
......@@ -79,6 +79,10 @@ public class Knowledge implements Serializable {
*/
private String publishDate;
/**
* 审核时间
*/
private String verifyTime;
/**
* 审核状态
*/
private Integer verifyStatus;
......@@ -101,6 +105,7 @@ public class Knowledge implements Serializable {
private Integer deleteFlag;
private List<Content> contents;
private List<KnowFile> files;
private Integer score;
}
......
/**
*
* (c) Copyright Ascensio System SIA 2023
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.zzsn.knowbase.enums;
public enum DocumentType {
word,
cell,
slide
}
package com.zzsn.knowbase.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.zzsn.knowbase.entity.KnowFile;
import com.zzsn.knowbase.entity.Knowledge;
import com.zzsn.knowbase.vo.KnowledgeParam;
import com.zzsn.knowbase.vo.KnowledgeVO;
......@@ -19,7 +20,7 @@ public interface IKnowledgeService {
/**
* 新增
*/
void addKnowledge(HttpServletRequest httpServletRequest,Knowledge knowledge);
void addKnowledge(KnowFile knowFile, Knowledge knowledge);
/**
* 修改
......@@ -29,7 +30,7 @@ public interface IKnowledgeService {
/**
* 删除
*/
void deleteKnowledge(String id) ;
void deleteKnowledge(String ids) ;
/**
* 分页检索
......@@ -41,4 +42,6 @@ public interface IKnowledgeService {
* @return
*/
IPage<KnowledgeVO> queryPageList(KnowledgeParam knowledgeParam, Integer pageNo, Integer pageSize, String column, String order);
IPage<KnowledgeVO> listFromPython(KnowledgeParam knowledgeParam, Integer pageNo, Integer pageSize, String column, String order);
}
package com.zzsn.knowbase.service;
import com.zzsn.knowbase.entity.KnowFile;
import com.zzsn.knowbase.vo.Result;
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Map;
/**
* @Version 1.0
* @Author: ZhangJingKun
* @Date: 2024/1/9 9:34
* @Content: 文件上传下载服务
*/
public interface ILocalFileService {
/**
* 文件上传
* @param file
* @return
*/
Result<KnowFile> upload(MultipartFile file);
/**
* 批量文件上传
* @param fileMap
* @return
*/
List<Result<KnowFile>> upload(Map<String,MultipartFile> fileMap);
/**
* 文件下载
* @param fileName
* @param filePath
* @return
*/
ResponseEntity<Resource> download(String fileName, String filePath);
}
package com.zzsn.knowbase.service.impl;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zzsn.knowbase.constant.Constants;
......@@ -10,9 +12,11 @@ import com.zzsn.knowbase.entity.Knowledge;
import com.zzsn.knowbase.kafka.message.KnowledgeMessage;
import com.zzsn.knowbase.kafka.producer.ProduceInfo;
import com.zzsn.knowbase.service.IKnowledgeService;
import com.zzsn.knowbase.service.ILocalFileService;
import com.zzsn.knowbase.util.*;
import com.zzsn.knowbase.vo.KnowledgeParam;
import com.zzsn.knowbase.vo.KnowledgeVO;
import com.zzsn.knowbase.vo.Result;
import org.apache.commons.lang3.StringUtils;
import org.apache.lucene.search.join.ScoreMode;
import org.elasticsearch.action.search.SearchRequest;
......@@ -20,16 +24,20 @@ import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.NestedQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.htmlcleaner.CleanerProperties;
import org.htmlcleaner.HtmlCleaner;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.util.WebUtils;
import springfox.documentation.spring.web.json.Json;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
......@@ -39,6 +47,8 @@ import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import static org.apache.commons.lang3.StringUtils.split;
/**
* @Description: 知识
* @Author: chenshiqiang
......@@ -54,35 +64,40 @@ class KnowledgeServiceImpl implements IKnowledgeService {
private CodeGenerateUtil codeGenerateUtil;
@Autowired
private ProduceInfo produceInfo;
@Value("${python.searchUrl:}")
private String searchUrl;
@Value("${python.delete:}")
private String deleteUrl;
@Override
public void addKnowledge(HttpServletRequest httpServletRequest,Knowledge knowledge) {
@Autowired
private RedisUtil redisUtil;
@Override
public void addKnowledge(KnowFile knowFile, Knowledge knowledge) {
if (null == knowledge.getId()) {
knowledge.setId(codeGenerateUtil.geneIdNo(Constants.FINANCE, 8));
}
if (null == knowledge.getVerifyStatus()) {
knowledge.setVerifyStatus(0);
}
knowledge.setCreateTime(cn.hutool.core.date.DateUtil.formatDateTime(new Date()).replace(" ", "T"));
knowledge.setDeleteFlag(0);
List<KnowFile> knowFileList = new ArrayList<>();
knowFileList.add(KnowFile.builder()
.fileId(codeGenerateUtil.geneIdNo(Constants.FINANCE, 8))
.filePath("C:/bbb.docx")
.build());
knowFileList.add(knowFile);
knowledge.setFiles(knowFileList);
List<Content> contentList=new ArrayList<>();
List<Content> contentList = new ArrayList<>();
List<String> contentStringList = new ArrayList<>();
String html = null;
try {
html = DocUtil.docParseHtml(knowledge.getFiles().get(0).getFilePath());
html = DocUtil.docParseHtml(knowledge.getFiles().get(0).getFilePath());
String htmlWithTable = html.replace("<p>", "");
contentStringList = Arrays.asList(htmlWithTable.split("</p>"));
} catch (IOException e) {
e.printStackTrace();
}
if(!contentStringList.isEmpty()){
if (!contentStringList.isEmpty()) {
knowledge.setTitle(contentStringList.get(0));
for (String s : contentStringList) {
contentList.add(Content.builder()
......@@ -94,22 +109,23 @@ class KnowledgeServiceImpl implements IKnowledgeService {
knowledge.setContents(contentList);
esOpUtil.docSavaByEntity(Constants.ES_DATA_FOR_KNOWLEDGE, knowledge.getId(), knowledge);
KnowledgeMessage knowledgeMessage= new KnowledgeMessage();
BeanUtils.copyProperties( knowledge,knowledgeMessage);
//删除
deleteForPython(knowledge.getId());
KnowledgeMessage knowledgeMessage = new KnowledgeMessage();
BeanUtils.copyProperties(knowledge, knowledgeMessage);
// CleanerProperties props = new CleanerProperties();
// props.setPruneTags("table");
// String htmlWithoutTable = new HtmlCleaner(props).clean(html).getText().toString();
// htmlWithoutTable = htmlWithoutTable.replace("<p>", "");
// List<String>contentStringWithoutTableList = Arrays.asList(htmlWithoutTable.split("</p>"));
List<Content> messageContentList=contentList.stream()
.filter(item->item.getContent().length()>10)
.filter(item->!item.getContent().contains("<img"))
.filter(item->!item.getContent().contains("<table"))
.filter(item->!item.getContent().contains("<tr>"))
.filter(item->!item.getContent().contains("</tr>"))
.filter(item->!item.getContent().contains("<td>"))
.filter(item->!item.getContent().contains("</td>"))
List<Content> messageContentList = contentList.stream()
.filter(item -> item.getContent().length() > 10)
.filter(item -> !item.getContent().contains("<img"))
.filter(item -> !item.getContent().contains("<table"))
.filter(item -> !item.getContent().contains("<tr>"))
.filter(item -> !item.getContent().contains("</tr>"))
.filter(item -> !item.getContent().contains("<td>"))
.filter(item -> !item.getContent().contains("</td>"))
.collect(Collectors.toList());
knowledgeMessage.setContents(messageContentList);
produceInfo.sendKnowledgeContents(knowledgeMessage);
......@@ -121,8 +137,24 @@ class KnowledgeServiceImpl implements IKnowledgeService {
}
@Override
public void deleteKnowledge(String id) {
esOpUtil.docDeleteById(Constants.ES_DATA_FOR_KNOWLEDGE, id);
public void deleteKnowledge(String ids) {
String[] split = ids.split(",");
for (String id : split) {
esOpUtil.docDeleteById(Constants.ES_DATA_FOR_KNOWLEDGE, id);
deleteForPython(id);
}
}
public void deleteForPython(String id) {
JSONObject params = new JSONObject();
params.put("knowledge_base_id",id);
try {
HttpUtil.doPost(deleteUrl, params, 120000);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
......@@ -160,8 +192,57 @@ class KnowledgeServiceImpl implements IKnowledgeService {
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
if (StringUtils.isNotEmpty(knowledgeParam.getTitle())) {
boolQuery.must(QueryBuilders.matchPhraseQuery("title", knowledgeParam.getTitle()));
// if (StringUtils.isNotEmpty(knowledgeParam.getTitle())) {
// boolQuery.must(QueryBuilders.matchPhraseQuery("title", knowledgeParam.getTitle()));
// }
// if (StringUtils.isNotEmpty(knowledgeParam.getContent())) {
// BoolQueryBuilder nestedBoolQueryBuilder = QueryBuilders.boolQuery();
// nestedBoolQueryBuilder.must(QueryBuilders.matchPhraseQuery("contents.content", knowledgeParam.getContent()));
// NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("contents", nestedBoolQueryBuilder, ScoreMode.None);
// boolQuery.must(nestedQueryBuilder);
// }
//搜索条件
if (StringUtils.isNotBlank(knowledgeParam.getSearchInfo())) {
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(knowledgeParam.getSearchInfo());
if ("精确".equals(knowledgeParam.getSearchAccuracy())) {
multiMatchQueryBuilder.type(MultiMatchQueryBuilder.Type.PHRASE);
if (null != knowledgeParam.getSearchScope() && Integer.valueOf(1).equals(knowledgeParam.getSearchScope())) {
multiMatchQueryBuilder.field("title");
} else if (null != knowledgeParam.getSearchScope() && Integer.valueOf(2).equals(knowledgeParam.getSearchScope())) {
BoolQueryBuilder nestedBoolQueryBuilder = QueryBuilders.boolQuery();
multiMatchQueryBuilder.field("contents.content");
nestedBoolQueryBuilder.must(multiMatchQueryBuilder);
NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("contents", nestedBoolQueryBuilder, ScoreMode.None);
boolQuery.must(nestedQueryBuilder);
} else {
multiMatchQueryBuilder.field("title", 60);
BoolQueryBuilder nestedBoolQueryBuilder = QueryBuilders.boolQuery();
multiMatchQueryBuilder.field("contents.content", 20);
nestedBoolQueryBuilder.must(multiMatchQueryBuilder);
NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("contents", nestedBoolQueryBuilder, ScoreMode.None);
boolQuery.must(nestedQueryBuilder);
}
} else {
if (null != knowledgeParam.getSearchScope() && Integer.valueOf(1).equals(knowledgeParam.getSearchScope())) {
multiMatchQueryBuilder.field("title");
} else if (null != knowledgeParam.getSearchScope() && Integer.valueOf(2).equals(knowledgeParam.getSearchScope())) {
BoolQueryBuilder nestedBoolQueryBuilder = QueryBuilders.boolQuery();
multiMatchQueryBuilder.field("contents.content");
nestedBoolQueryBuilder.must(multiMatchQueryBuilder);
NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("contents", nestedBoolQueryBuilder, ScoreMode.None);
boolQuery.must(nestedQueryBuilder);
} else {
multiMatchQueryBuilder.field("title", 3);
BoolQueryBuilder nestedBoolQueryBuilder = QueryBuilders.boolQuery();
multiMatchQueryBuilder.field("contents.content", 1);
nestedBoolQueryBuilder.must(multiMatchQueryBuilder);
NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("contents", nestedBoolQueryBuilder, ScoreMode.None);
boolQuery.must(nestedQueryBuilder);
}
}
boolQuery.must(multiMatchQueryBuilder);
}
if (StringUtils.isNotEmpty(knowledgeParam.getOrigin())) {
boolQuery.must(QueryBuilders.matchPhraseQuery("origin", knowledgeParam.getOrigin()));
......@@ -185,12 +266,7 @@ class KnowledgeServiceImpl implements IKnowledgeService {
boolQuery.filter(QueryBuilders.rangeQuery("publishDate").lte(EsDateUtil.esFieldDateFormat(DateUtil.dateToString(new Date()))));
}
if (StringUtils.isNotBlank(knowledgeParam.getContent())) {
BoolQueryBuilder nestedBoolQueryBuilder = QueryBuilders.boolQuery();
nestedBoolQueryBuilder.must(QueryBuilders.termQuery("contents.content", knowledgeParam.getContent()));
NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("contents", nestedBoolQueryBuilder, ScoreMode.None);
boolQuery.must(nestedQueryBuilder);
}
searchSourceBuilder.query(boolQuery);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = null;
......@@ -214,4 +290,86 @@ class KnowledgeServiceImpl implements IKnowledgeService {
return pageData;
}
@Override
public IPage<KnowledgeVO> listFromPython(KnowledgeParam knowledgeParam, Integer pageNo, Integer pageSize, String column, String order) {
Object data = redisUtil.get(genKey(knowledgeParam));
// if (org.springframework.util.StringUtils.isEmpty(data)) {
if (true) {
JSONObject params = new JSONObject();
params.put("type", null == knowledgeParam.getTypes() ? null : Arrays.asList(knowledgeParam.getTypes().split(",")));
params.put("startTime", knowledgeParam.getStartTime());
params.put("endTime", knowledgeParam.getEndTime());
params.put("author", knowledgeParam.getAuthor());
params.put("origin", knowledgeParam.getOrigin());
params.put("verifierName", knowledgeParam.getVerifierName());
params.put("verifyStatus", knowledgeParam.getVerifyStatus());
params.put("verifyStartTime", knowledgeParam.getVerifyStartTime());
params.put("knowledge_base_id", knowledgeParam.getKnowledgeProjectId());
params.put("verifyEndTime", knowledgeParam.getVerifyEndTime());
params.put("score_threshold", 600);//score
params.put("vector_search_top_k", 100);//number
if (knowledgeParam.getSearchScope().equals(2)) {
params.put("question", knowledgeParam.getSearchInfo());
}
String result = null;
try {
result = HttpUtil.doPost(searchUrl, params, 120000);
} catch (IOException e) {
e.printStackTrace();
}
if (result == null||!result.contains("results")) {
return null;
}
JSONObject jsonObject = JSONObject.parseObject(result);
data=jsonObject.get("results");
redisUtil.set(genKey(knowledgeParam), data,100000000);
}
JSONArray jsonArray = JSONObject.parseArray(data.toString());
List<KnowledgeVO> knowledgeList=new ArrayList<>(jsonArray.size());
for (Object o : jsonArray) {
JSONObject one = JSONObject.parseObject(o.toString());
knowledgeList.add(KnowledgeVO.builder()
.id((String) one.get("id"))
.score((int) one.get("score"))
.verifyStatus("".equals(one.get("verifyStatus"))?0:(int)one.get("verifyStatus"))
.verifyTime(one.get("verifyTime").toString())
.publishDate(one.get("publishDate").toString())
.type(one.get("type").toString())
.verifierName(one.get("verifierName").toString())
.content(one.get("content").toString())
.build());
}
IPage<KnowledgeVO> pageData = new Page<>(pageNo, pageSize, knowledgeList.size());
pageData.setRecords(knowledgeList);
return pageData;
}
private String genKey(KnowledgeParam knowledgeParam) {
String type = (knowledgeParam.getTypes() == null ? "" : knowledgeParam.getTypes());
String knowledgeProjectId = (knowledgeParam.getKnowledgeProjectId() == null ? "" : knowledgeParam.getKnowledgeProjectId());
String startTime = (knowledgeParam.getStartTime() == null ? "" : knowledgeParam.getStartTime());
String endTime = (knowledgeParam.getEndTime() == null ? "" : knowledgeParam.getEndTime());
String author = (knowledgeParam.getAuthor() == null ? "" : knowledgeParam.getAuthor());
String origin = (knowledgeParam.getOrigin() == null ? "" : knowledgeParam.getOrigin());
String verifierName = (knowledgeParam.getVerifierName() == null ? "" : knowledgeParam.getVerifierName());
String verifyStatus = (knowledgeParam.getVerifyStatus() == null ? "" : String.valueOf(knowledgeParam.getVerifyStatus()));
String verifyStartTime = (knowledgeParam.getVerifyStartTime() == null ? "" : knowledgeParam.getVerifyStartTime());
String verifyEndTime = (knowledgeParam.getVerifyEndTime() == null ? "" : knowledgeParam.getVerifyEndTime());
String searchInfo = (knowledgeParam.getSearchInfo() == null ? "" : knowledgeParam.getSearchInfo());
return type + "#" +
knowledgeProjectId + "#" +
startTime + "#" +
endTime + "#" +
author + "#" +
origin + "#" +
verifierName + "#" +
verifyStatus + "#" +
verifyStartTime + "#" +
verifyEndTime + "#" +
searchInfo + "#";
}
}
package com.zzsn.knowbase.service.impl;
import com.zzsn.knowbase.entity.KnowFile;
import com.zzsn.knowbase.service.ILocalFileService;
import com.zzsn.knowbase.util.file.FileUtility;
import com.zzsn.knowbase.vo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
/**
* @Version 1.0
* @Author: ZhangJingKun
* @Date: 2024/1/9 9:36
* @Content:
*/
@Service
@Slf4j
public class LocalFileServiceImpl implements ILocalFileService {
@Autowired
private FileUtility fileUtility;
@Value("${files.storage}")
String filesStorage;
@Override
public Result<KnowFile> upload(MultipartFile file) {
try {
String fullFileName = file.getOriginalFilename(); // get file name
String fileExtension = fileUtility.getFileExtension(fullFileName); // get file extension
long fileSize = file.getSize(); // get file size
// check if the file size exceeds the maximum file size or is less than 0
if (fileUtility.getMaxFileSize() < fileSize || fileSize <= 0) {
Result result = Result.error("文件大小不正确!");
return result;
}
// check if file extension is supported by the editor
if (!fileUtility.getFileExts().contains(fileExtension)) {
Result result = Result.error("不支持的文件类型!");
return result;
}
String fileName = file.getOriginalFilename();
String fileSuffix = getFileSuffix(fileName);
String uid = UUID.randomUUID().toString();
String filePath = getFilePath() + uid + "." + fileSuffix;
byte[] bytes = file.getBytes(); // get file in bytes
//Files.write(Paths.get(filePath), bytes);
file.transferTo(new File(filePath));
KnowFile knowFile = new KnowFile();
knowFile.setFileId(uid);
knowFile.setFileName(fileName);
knowFile.setFilePath(filePath);
knowFile.setFileType(fileSuffix);
knowFile.setFileSize(fileSize);
Result result = Result.OK(knowFile);
return result; // create user metadata and return it
} catch (Exception e) {
e.printStackTrace();
}
// if the operation of file uploading is unsuccessful, an error occurs
Result result = Result.error("上传文件时出现问题!");
return result;
}
@Override
public List<Result<KnowFile>> upload(Map<String, MultipartFile> fileMap) {
List<Result<KnowFile>> list = new ArrayList<>();
for (Map.Entry<String,MultipartFile> entity : fileMap.entrySet()) {
MultipartFile file = entity.getValue();// 获取上传文件对象
Result<KnowFile> result = upload(file);
list.add(result);
}
return list;
}
/**
* 文件下载
*/
@Override
public ResponseEntity<Resource> download(String fileName, String filePath) {
Path path = Paths.get(filePath);
try {
Resource resource = new UrlResource(path.toUri());
if (resource.exists() || resource.isReadable()) {
return ResponseEntity.ok()
.header("Content-Disposition", "attachment; filename=\"" + fileName + "\"")
.body(resource);
} else {
throw new RuntimeException("文件不存在或不可读");
}
} catch (MalformedURLException e) {
e.printStackTrace();
throw new RuntimeException("文件读取失败");
}
}
//获取文件夹路径
private String getFilePath(){
LocalDate currentDate = LocalDate.now();
//System.out.println("当前日期: " + currentDate);
String filePath = filesStorage + currentDate + "/";
//判断文件夹是否存在,不存在创建
Path directory = Paths.get(filePath);
if (!Files.exists(directory)) {
try {
Files.createDirectories(directory);
log.info("文件夹创建成功:" + filePath);
} catch (IOException e) {
log.error("文件夹创建失败:" + filePath);
e.printStackTrace();
}
}
return filePath;
}
//获取文件后缀
private String getFileSuffix(String fileName){
int lastIndexOfDot = fileName.lastIndexOf('.');
String fileExtension = "";
if (lastIndexOfDot != -1) {
fileExtension = fileName.substring(lastIndexOfDot + 1);
}
return fileExtension;
}
}
package com.zzsn.knowbase.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* redis 工具类
*/
@Component
public class RedisUtil {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 指定缓存失效时间
*
* @param key 键
* @param time 时间(秒)
*/
public boolean expire(String key, long time) {
try {
if (time > 0) {
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根据key 获取过期时间
*
* @param key 键 不能为null
* @return 时间(秒) 返回0代表为永久有效
*/
public long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
/**
* 判断key是否存在
*
* @param key 键
* @return true 存在 false不存在
*/
public boolean hasKey(String key) {
try {
return redisTemplate.hasKey(key);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 删除缓存
*
* @param key 可以传一个值 或多个
*/
@SuppressWarnings("unchecked")
public void del(String... key) {
if (key != null && key.length > 0) {
if (key.length == 1) {
redisTemplate.delete(key[0]);
} else {
redisTemplate.delete(CollectionUtils.arrayToList(key));
}
}
}
// ============================String=============================
/**
* 普通缓存获取
*
* @param key 键
* @return 值
*/
public Object get(String key) {
return key == null ? null : redisTemplate.opsForValue().get(key);
}
/**
* 普通缓存放入
*
* @param key 键
* @param value 值
* @return true成功 false失败
*/
public boolean set(String key, Object value) {
try {
redisTemplate.opsForValue().set(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 普通缓存放入并设置时间
*
* @param key 键
* @param value 值
* @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
* @return true成功 false 失败
*/
public boolean set(String key, Object value, long time) {
try {
if (time > 0) {
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
} else {
set(key, value);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 递增
*
* @param key 键
* @param delta 要增加几(大于0)
*/
public long incr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递增因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, delta);
}
/**
* 递减
*
* @param key 键
* @param delta 要减少几(小于0)
*/
public long decr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递减因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, -delta);
}
// ================================Map=================================
/**
* HashGet
*
* @param key 键 不能为null
* @param item 项 不能为null
* @return 值
*/
public Object hget(String key, String item) {
return redisTemplate.opsForHash().get(key, item);
}
/**
* 获取hashKey对应的所有键值
*
* @param key 键
* @return 对应的多个键值
*/
public Map<Object, Object> hmget(String key) {
return redisTemplate.opsForHash().entries(key);
}
/**
* HashSet
*
* @param key 键
* @param map 对应多个键值
* @return true 成功 false 失败
*/
public boolean hmset(String key, Map<String, Object> map) {
try {
redisTemplate.opsForHash().putAll(key, map);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* HashSet 并设置时间
*
* @param key 键
* @param map 对应多个键值
* @param time 时间(秒)
* @return true成功 false失败
*/
public boolean hmset(String key, Map<String, Object> map, long time) {
try {
redisTemplate.opsForHash().putAll(key, map);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 向一张hash表中放入数据,如果不存在将创建
*
* @param key 键
* @param item 项
* @param value 值
* @return true 成功 false失败
*/
public boolean hset(String key, String item, Object value) {
try {
redisTemplate.opsForHash().put(key, item, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 向一张hash表中放入数据,如果不存在将创建
*
* @param key 键
* @param item 项
* @param value 值
* @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
* @return true 成功 false失败
*/
public boolean hset(String key, String item, Object value, long time) {
try {
redisTemplate.opsForHash().put(key, item, value);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 删除hash表中的值
*
* @param key 键 不能为null
* @param item 项 可以使多个 不能为null
*/
public void hdel(String key, Object... item) {
redisTemplate.opsForHash().delete(key, item);
}
/**
* 判断hash表中是否有该项的值
*
* @param key 键 不能为null
* @param item 项 不能为null
* @return true 存在 false不存在
*/
public boolean hHasKey(String key, String item) {
return redisTemplate.opsForHash().hasKey(key, item);
}
/**
* hash递增 如果不存在,就会创建一个 并把新增后的值返回
*
* @param key 键
* @param item 项
* @param by 要增加几(大于0)
*/
public void hincr(String key, String item, double by) {
redisTemplate.opsForHash().increment(key, item, by);
}
/**
* hash递减
*
* @param key 键
* @param item 项
* @param by 要减少记(小于0)
*/
public double hdecr(String key, String item, double by) {
return redisTemplate.opsForHash().increment(key, item, -by);
}
// ============================set=============================
/**
* 根据key获取Set中的所有值
*
* @param key 键
*/
public Set<Object> sGet(String key) {
try {
return redisTemplate.opsForSet().members(key);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 根据value从一个set中查询,是否存在
*
* @param key 键
* @param value 值
* @return true 存在 false不存在
*/
public boolean sHasKey(String key, Object value) {
try {
return redisTemplate.opsForSet().isMember(key, value);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将数据放入set缓存
*
* @param key 键
* @param values 值 可以是多个
* @return 成功个数
*/
public long sSet(String key, Object... values) {
try {
return redisTemplate.opsForSet().add(key, values);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 将set数据放入缓存
*
* @param key 键
* @param time 时间(秒)
* @param values 值 可以是多个
* @return 成功个数
*/
public long sSetAndTime(String key, long time, Object... values) {
try {
long count = redisTemplate.opsForSet().add(key, values);
if (time > 0) {
expire(key, time);
}
return count;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 获取set缓存的长度
*
* @param key 键
*/
public long sGetSetSize(String key) {
try {
return redisTemplate.opsForSet().size(key);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 移除值为value的
*
* @param key 键
* @param values 值 可以是多个
* @return 移除的个数
*/
public long setRemove(String key, Object... values) {
try {
return redisTemplate.opsForSet().remove(key, values);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
// ===============================list=================================
/**
* 获取list缓存的内容
*
* @param key 键
* @param start 开始
* @param end 结束 0 到 -1代表所有值
*/
public List<Object> lGet(String key, long start, long end) {
try {
return redisTemplate.opsForList().range(key, start, end);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 获取list缓存的长度
*
* @param key 键
*/
public long lGetListSize(String key) {
try {
return redisTemplate.opsForList().size(key);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 通过索引 获取list中的值
*
* @param key 键
* @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
*/
public Object lGetIndex(String key, long index) {
try {
return redisTemplate.opsForList().index(key, index);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
*/
public boolean lSet(String key, Object value) {
try {
redisTemplate.opsForList().rightPush(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
* @param time 时间(秒)
*/
public boolean lSet(String key, Object value, long time) {
try {
redisTemplate.opsForList().rightPush(key, value);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
*/
public boolean lSet(String key, List<Object> value) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
* @param time 时间(秒)
*/
public boolean lSet(String key, List<Object> value, long time) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根据索引修改list中的某条数据
*
* @param key 键
* @param index 索引
* @param value 值
*/
public boolean lUpdateIndex(String key, long index, Object value) {
try {
redisTemplate.opsForList().set(key, index, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 移除N个值为value
*
* @param key 键
* @param count 移除多少个
* @param value 值
* @return 移除的个数
*/
public long lRemove(String key, long count, Object value) {
try {
return redisTemplate.opsForList().remove(key, count, value);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 获取指定前缀的一系列key
* 使用scan命令代替keys, Redis是单线程处理,keys命令在KEY数量较多时,
* 操作效率极低【时间复杂度为O(N)】,该命令一旦执行会严重阻塞线上其它命令的正常请求
* @param keyPrefix key统一的前缀
*/
private Set<String> keys(String keyPrefix) {
String realKey = keyPrefix + "*";
try {
return redisTemplate.execute((RedisCallback<Set<String>>) connection -> {
Set<String> binaryKeys = new HashSet<>();
Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match(realKey).count(Integer.MAX_VALUE).build());
while (cursor.hasNext()) {
binaryKeys.add(new String(cursor.next()));
}
return binaryKeys;
});
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}
/**
* 删除指定前缀的一系列key
* @param keyPrefix key统一的前缀
*/
public void removeAll(String keyPrefix) {
try {
Set<String> keys = keys(keyPrefix);
if (!CollectionUtils.isEmpty(keys)) {
redisTemplate.delete(keys);
}
} catch (Throwable e) {
e.printStackTrace();
}
}
}
/**
*
* (c) Copyright Ascensio System SIA 2023
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.zzsn.knowbase.util.file;
import com.zzsn.knowbase.constant.Constants;
import com.zzsn.knowbase.enums.DocumentType;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@Component
@Qualifier("default")
public class DefaultFileUtility implements FileUtility {
@Value("${filesize-max}")
private String filesizeMax;
@Value("${files.docservice.viewed-docs}")
private String docserviceViewedDocs;
@Value("${files.docservice.edited-docs}")
private String docserviceEditedDocs;
@Value("${files.docservice.convert-docs}")
private String docserviceConvertDocs;
@Value("${files.docservice.fillforms-docs}")
private String docserviceFillDocs;
// document extensions
private List<String> extsDocument = Arrays.asList(
".doc", ".docx", ".docm",
".dot", ".dotx", ".dotm",
".odt", ".fodt", ".ott", ".rtf", ".txt",
".html", ".htm", ".mht", ".xml",
".pdf", ".djvu", ".fb2", ".epub", ".xps", ".oform");
// spreadsheet extensions
private List<String> extsSpreadsheet = Arrays.asList(
".xls", ".xlsx", ".xlsm", ".xlsb",
".xlt", ".xltx", ".xltm",
".ods", ".fods", ".ots", ".csv");
// presentation extensions
private List<String> extsPresentation = Arrays.asList(
".pps", ".ppsx", ".ppsm",
".ppt", ".pptx", ".pptm",
".pot", ".potx", ".potm",
".odp", ".fodp", ".otp");
// get the document type
public DocumentType getDocumentType(final String fileName) {
String ext = getFileExtension(fileName).toLowerCase(); // get file extension from its name
// word type for document extensions
if (extsDocument.contains(ext)) {
return DocumentType.word;
}
// cell type for spreadsheet extensions
if (extsSpreadsheet.contains(ext)) {
return DocumentType.cell;
}
// slide type for presentation extensions
if (extsPresentation.contains(ext)) {
return DocumentType.slide;
}
// default file type is word
return DocumentType.word;
}
// get file name from its URL
public String getFileName(final String url) {
if (url == null) {
return "";
}
// get file name from the last part of URL
String fileName = url.substring(url.lastIndexOf('/') + 1);
fileName = fileName.split("\\?")[0];
return fileName;
}
// get file name without extension
public String getFileNameWithoutExtension(final String url) {
String fileName = getFileName(url);
if (fileName == null) {
return null;
}
String fileNameWithoutExt = fileName.substring(0, fileName.lastIndexOf('.'));
return fileNameWithoutExt;
}
// get file extension from URL
public String getFileExtension(final String url) {
String fileName = getFileName(url);
if (fileName == null) {
return null;
}
String fileExt = fileName.substring(fileName.lastIndexOf("."));
return fileExt.toLowerCase();
}
// get an editor internal extension
public String getInternalExtension(final DocumentType type) {
// .docx for word file type
if (type.equals(DocumentType.word)) {
return ".docx";
}
// .xlsx for cell file type
if (type.equals(DocumentType.cell)) {
return ".xlsx";
}
// .pptx for slide file type
if (type.equals(DocumentType.slide)) {
return ".pptx";
}
// the default file type is .docx
return ".docx";
}
public List<String> getFillExts() {
return Arrays.asList(docserviceFillDocs.split("\\|"));
}
// get file extensions that can be viewed
public List<String> getViewedExts() {
return Arrays.asList(docserviceViewedDocs.split("\\|"));
}
// get file extensions that can be edited
public List<String> getEditedExts() {
return Arrays.asList(docserviceEditedDocs.split("\\|"));
}
// get file extensions that can be converted
public List<String> getConvertExts() {
return Arrays.asList(docserviceConvertDocs.split("\\|"));
}
// get all the supported file extensions
public List<String> getFileExts() {
List<String> res = new ArrayList<>();
res.addAll(getViewedExts());
res.addAll(getEditedExts());
res.addAll(getConvertExts());
res.addAll(getFillExts());
return res;
}
// generate the file path from file directory and name
public Path generateFilepath(final String directory, final String fullFileName) {
String fileName = getFileNameWithoutExtension(fullFileName); // get file name without extension
String fileExtension = getFileExtension(fullFileName); // get file extension
Path path = Paths.get(directory + fullFileName); // get the path to the files with the specified name
for (int i = 1; Files.exists(path); i++) { // run through all the files with the specified name
// get a name of each file without extension and add an index to it
fileName = getFileNameWithoutExtension(fullFileName) + "(" + i + ")";
// create a new path for this file with the correct name and extension
path = Paths.get(directory + fileName + fileExtension);
}
path = Paths.get(directory + fileName + fileExtension);
return path;
}
// get maximum file size
public long getMaxFileSize() {
long size = Long.parseLong(filesizeMax);
return size > 0 ? size : Constants.MAX_FILE_SIZE;
}
}
/**
*
* (c) Copyright Ascensio System SIA 2023
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.zzsn.knowbase.util.file;
import com.zzsn.knowbase.enums.DocumentType;
import java.nio.file.Path;
import java.util.List;
// specify the file utility functions
public interface FileUtility {
DocumentType getDocumentType(String fileName); // get the document type
String getFileName(String url); // get file name from its URL
String getFileNameWithoutExtension(String url); // get file name without extension
String getFileExtension(String url); // get file extension from URL
String getInternalExtension(DocumentType type); // get an editor internal extension
List<String> getFileExts(); // get all the supported file extensions
List<String> getFillExts(); // get file extensions that can be filled
List<String> getViewedExts(); // get file extensions that can be viewed
List<String> getEditedExts(); // get file extensions that can be edited
List<String> getConvertExts(); // get file extensions that can be converted
Path generateFilepath(String directory, String fullFileName); /* generate the file path
from file directory and name */
long getMaxFileSize(); // get maximum file size
}
......@@ -17,7 +17,6 @@ import lombok.NoArgsConstructor;
@Data
public class KnowledgeParam {
private String id;
private String title;
/**
* 来源
*/
......@@ -25,7 +24,7 @@ public class KnowledgeParam {
/**
* 作者
*/
private Integer author;
private String author;
/**
* 发布时间
*/
......@@ -49,10 +48,34 @@ public class KnowledgeParam {
/**
* 类型
*/
private String type;
private String types;
/**
* 发布开始时间
*/
private String startTime;
/**
* 发布结束时间
*/
private String endTime;
private String content;
/**
* 搜索信息
*/
private String searchInfo;
/**
* 范围 1标题 2正文
*/
private Integer searchScope;
/**
* 精确搜索
*/
private String searchAccuracy;
/**
* 审核开始时间
*/
private String verifyStartTime;
/**
* 审核结束时间
*/
private String verifyEndTime;
}
package com.zzsn.knowbase.vo;
import com.zzsn.knowbase.entity.Knowledge;
import lombok.Builder;
import lombok.Data;
/**
......@@ -10,6 +10,16 @@ import lombok.Data;
* @date 2024/1/4
*/
@Data
public class KnowledgeVO extends Knowledge {
@Builder
public class KnowledgeVO {
private String content;
private String id;
private String verifyTime;
private String publishDate;
private String type;
private String verifierName;
private Integer score;
private Integer verifyStatus;
}
......@@ -2,6 +2,10 @@ server:
port: 9088
spring:
servlet:
multipart:
max-request-size: 1024MB
max-file-size: 100MB
datasource:
url: jdbc:mysql://114.116.44.11:3306/knowledge?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&AllowPublicKeyRetrieval=True
username: ciglobal
......@@ -18,8 +22,6 @@ spring:
brokers: 114.115.159.144:9092
zkNodes: 114.115.159.144:2181
requiredAcks: 1
redis:
database: 0
host: 114.115.236.206
......@@ -39,9 +41,23 @@ mybatis-plus:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
python:
IntelligentQaUrl: http://116.63.179.212:7862/platform/chat
intelligentQaUrl: http://116.63.179.212:7862/platform/chat
searchUrl: http://114.115.172.99:10013/platform/search
deleteUrl: http://114.115.172.99:10013/platform/delete
know:
thirdpartyurl:
checkuserurl: http://127.0.0.1:9988/sys/checkToken
getusersurl: http://127.0.0.1:9988/sys/user/thirdparty
files:
storage: E:/aaa/
docservice:
fillforms-docs: .docx|.oform
viewed-docs: .djvu|.oxps|.pdf|.xps
edited-docs: .csv|.docm|.docx|.docxf|.dotm|.dotx|.epub|.fb2|.html|.odp|.ods|.odt|.otp|.ots|.ott|.potm|.potx|.ppsm|.ppsx|.pptm|.pptx|.rtf|.txt|.xlsm|.xlsx|.xltm|.xltx
convert-docs: .doc|.dot|.dps|.dpt|.epub|.et|.ett|.fb2|.fodp|.fods|.fodt|.htm|.html|.mht|.mhtml|.odp|.ods|.odt|.otp|.ots|.ott|.pot|.pps|.ppt|.rtf|.stw|.sxc|.sxi|.sxw|.wps|.wpt|.xls|.xlsb|.xlt|.xml
timeout: 120000
history:
postfix: -hist
filesize-max: 5242880
package com.zzsn.knowbase;
import com.zzsn.knowbase.constant.Constants;
import com.zzsn.knowbase.service.ILocalFileService;
import com.zzsn.knowbase.util.CodeGenerateUtil;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;
import java.io.File;
import java.io.IOException;
@SpringBootTest
class KnowBaseApplicationTests {
@Autowired
private CodeGenerateUtil codeGenerateUtil;
@Autowired
private ILocalFileService localFileService;
@Test
void contextLoads() {
void contextLoads() throws IOException {
ResponseEntity<Resource> re = localFileService.download("abc.docx", "E:/aaa/abc.docx");
File file = re.getBody().getFile();
System.out.println(re);
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论