提交 45522ebd 作者: ZhangJingKun

素材管理期刊论文模块代码

上级
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.5/apache-maven-3.9.5-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zzsn</groupId>
<artifactId>know-base</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>know-base</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--mybatis plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<!-- json-->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.25</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<!-- hutool工具类-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.8</version>
</dependency>
<!-- jsoup html解析 -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>
<!-- AutoPoi Excel工具类-->
<dependency>
<groupId>org.jeecgframework</groupId>
<artifactId>autopoi-web</artifactId>
<version>1.2.5</version>
<exclusions>
<exclusion>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- httpclient-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
</dependency>
<!-- redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!-- 华为obs-->
<!-- https://mvnrepository.com/artifact/com.huaweicloud/esdk-obs-java-bundle -->
<dependency>
<groupId>com.huaweicloud</groupId>
<artifactId>esdk-obs-java-bundle</artifactId>
<version>3.22.12</version>
</dependency>
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.1-RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
package com.zzsn.knowbase;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class KnowBaseApplication {
public static void main(String[] args) {
SpringApplication.run(KnowBaseApplication.class, args);
}
}
package com.zzsn.knowbase.constant;
import java.util.Arrays;
import java.util.List;
/**
* Description:
* Author: EDY
* Date: 2023/10/9
*/
public enum DirEnum {
QYYearReport("QYYearReport/","企业年报","1"),
QYQuarterReport("QYQuarterReport/","企业季报","2"),
QYMonthReport("QYMonthReport/","企业月报","3"),
QYResearchReport("QYResearchReport/","企业研报","4"),
HYResearchReport("HYResearchReport/","行业研报","5"),
SubjectAtt("SubjectAtt/","专题上的附件","6"),
PolicyDocuments("PolicyDocuments/","政策文件附件","7"),
QYNotice("QYNotice/","企业公告","8"),
GZNotice3("GZNotice-3/","股转公告 新三版","9"),
GPSH3("GPSH-3/","挂牌审核 新三版","10"),
ZLJGCS3("ZLJGCS-3/","自律监管措施 新三版","11"),
WXH3("WXH-3/","问询函 新三版","12"),
JLCF3("JLCF-3/","纪律处分 新三版","13"),
MXYL("MXYL/","模型语料","14"),
SubjectUp("SubjectUp/","专题上传","15"),
KLBImage("KLBImage/","克虏宝企业log图片","16"),
REPORT("report/","生成的报告","17"),
REPORT_TEMPLATE("report/template/","生成的报告模板","18"),
SCIENCE_FILE("report/reportScience/","智能写作_期刊/论文/图书/研报","19"),
;
public static List<DirEnum> getAll(){
DirEnum[] values = DirEnum.values();
return Arrays.asList(values);
}
public static DirEnum getByPath(String path) {
for (DirEnum enumValue : DirEnum.values()) {
if (enumValue.getPath().equals(path)) {
return enumValue;
}
}
throw new IllegalArgumentException("No enum constant with value: " + path);
}
public static DirEnum getByDes(String des) {
for (DirEnum enumValue : DirEnum.values()) {
if (enumValue.getDes().equals(des)) {
return enumValue;
}
}
throw new IllegalArgumentException("No enum constant with value: " + des);
}
public static DirEnum getByType(String type) {
for (DirEnum enumValue : DirEnum.values()) {
if (enumValue.getType().equals(type)) {
return enumValue;
}
}
throw new IllegalArgumentException("No enum constant with value: " + type);
}
/**路径名称*/
private final String path;
/**路径描述*/
private final String des;
/**路径描述*/
private final String type;
public String getType() {
return type;
}
public String getPath() {
return path;
}
public String getDes() {
return des;
}
DirEnum(String path, String des , String type) {
this.path = path;
this.des = des;
this.type = type;
}
}
package com.zzsn.knowbase.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* 期刊论文/图书基本信息表
*
*/
@Data
@TableName("ai_report_science_file")
public class AiReportScienceFile implements Serializable {
/**
* 主键id
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
/**
* 资料内容
*/
@TableField("content")
private String content;
/**
* 资料内容格式(text/html/url/img)
*/
@TableField("content_type")
private String contentType;
/**
* 资料标题
*/
@TableField("title")
private String title;
/**
* 资料标题
*/
@TableField("key_words")
private String keyWords;
/**
* 年份
*/
@TableField("year")
private String year;
/**
* 作者
*/
@TableField("author")
private String author;
/**
* 来源
*/
@TableField("origin")
private String origin;
/**
* 发布时间
*/
@TableField("publish_date")
private String publishDate;
/**
* 资料类型(0:期刊、1:博士论文 2:硕士论文、3:图书)
*/
@TableField("data_type")
private Integer dataType;
/**
* 源文件地址
*/
@TableField("zip_file_url")
private String zipFileUrl;
/**
* 状态(0:未审核、1:审核不通过 2:审核通过)
*/
@TableField("status")
private Integer status;
/**
* 审核人
*/
@TableField("audit_by")
private String auditBy;
/**
* 审核时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField("audit_time")
private Date auditTime;
/**
* 创建人
*/
@TableField("create_by")
private String createBy;
/**
* 创建时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField("create_time")
private Date createTime;
/**
* 更新人
*/
@TableField("update_by")
private String updateBy;
/**
* 更新时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField("update_time")
private Date updateTime;
/**
* 是否删除(0否 1是)
*/
@TableField("deleted")
private String deleted;
/**
* 文件路径
*/
private String filePathObs;
/**
* 封面路径
*/
private String coverObs;
/**
* 预览路径
*/
private String previewObs;
/**
* 校验人
*/
@TableField("check_by")
private String checkBy;
/**
* 校验时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField("check_time")
private Date checkTime;
}
package com.zzsn.knowbase.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* 期刊论文/图书-拆分内容结构表
*
*/
@Data
@TableName("ai_report_science_file_material")
public class AiReportScienceFileMaterial implements Serializable {
/**
* 主键id
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
/**
* 资料id
*/
@TableField("file_id")
private String fileId;
/**
* 资料内容
*/
@TableField("content")
private String content;
/**
* 内容类型(science:文章 chaper:章节 chaperContent:章节内容 paragraph:段落 paragraphContent:段落内容
*/
@TableField("content_type")
private String contentType;
/**
* 层级
*/
@TableField("level")
private String level;
/**
* 父级id
*/
@TableField("parent")
private String parent;
/**
* 排序
*/
@TableField("sort")
private Integer sort;
/**
* 创建人
*/
@TableField("create_by")
private String createBy;
/**
* 创建时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField("create_time")
private Date createTime;
/**
* 更新人
*/
@TableField("update_by")
private String updateBy;
/**
* 更新时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField("update_time")
private Date updateTime;
/**
* 是否删除(0否 1是)
*/
@TableField("deleted")
private String deleted;
}
package com.zzsn.knowbase.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zzsn.knowbase.entity.AiReportScienceFile;
import org.apache.ibatis.annotations.Mapper;
/**
* @Version: V1.0
*/
@Mapper
public interface AiReportScienceFileMapper extends BaseMapper<AiReportScienceFile> {
}
package com.zzsn.knowbase.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zzsn.knowbase.entity.AiReportScienceFileMaterial;
import org.apache.ibatis.annotations.Mapper;
/**
* @Version: V1.0
*/
@Mapper
public interface AiReportScienceFileMaterialMapper extends BaseMapper<AiReportScienceFileMaterial> {
}
package com.zzsn.knowbase.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zzsn.knowbase.entity.AiReportScienceFileMaterial;
/**
* @Version: V1.0
*/
public interface IAiReportScienceFileMaterialService extends IService<AiReportScienceFileMaterial> {
public void splitScienceFileMaterial(String html, String fileId);
}
package com.zzsn.knowbase.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zzsn.knowbase.entity.AiReportScienceFile;
import com.zzsn.knowbase.vo.AiReportScienceFileVo;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
/**
* @Version: V1.0
*/
public interface IAiReportScienceFileService extends IService<AiReportScienceFile> {
public Boolean uploadAiMaterial(AiReportScienceFile aiReportScienceFile, HttpServletRequest request) throws Exception;
IPage<AiReportScienceFile> queryPageList(AiReportScienceFileVo aiReportScienceFileVo, Integer pageNo, Integer pageSize, String column, String order);
IPage<Map<String, Object>> suggestContent(String text, String type, Integer pageNo, Integer pageSize);
Map<String,Object> getContextByTextId(String textId);
void deleteDataByFileId(String id);
List<String> getAuditPersonList();
}
package com.zzsn.knowbase.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zzsn.knowbase.entity.AiReportScienceFile;
import com.zzsn.knowbase.entity.AiReportScienceFileMaterial;
import com.zzsn.knowbase.mapper.AiReportScienceFileMaterialMapper;
import com.zzsn.knowbase.service.IAiReportScienceFileMaterialService;
import com.zzsn.knowbase.service.IAiReportScienceFileService;
import com.zzsn.knowbase.util.ReportUtil;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* @Version: V1.0
*/
@Service
public class AiReportScienceFileMaterialServiceImpl extends ServiceImpl<AiReportScienceFileMaterialMapper, AiReportScienceFileMaterial> implements IAiReportScienceFileMaterialService {
@Autowired
private IAiReportScienceFileMaterialService aiReportScienceFileMaterialService;
@Autowired
private IAiReportScienceFileService aiReportScienceFileService;
// @Resource
// private StreamBridge streamBridge;
public void splitScienceFileMaterial(String html,String fileId){
QueryWrapper query1 = new QueryWrapper();
query1.eq("file_id",fileId);
aiReportScienceFileMaterialService.remove(query1);
List<AiReportScienceFileMaterial> list = new ArrayList<>();
AiReportScienceFile scienceFile = aiReportScienceFileService.getById(fileId);
// 使用Jsoup解析HTML字符串
// 解析HTML字符串
Document doc = Jsoup.parse(html);
// 提取所有的p标签、img标签和table标签
Elements elements = doc.select("p:not(:has(img)),p > img,img,table,h1,h2,h3,h4,h5,h6,h7,h8,h9");
Iterator<Element> iterator = elements.iterator();
List<String> contentList = new ArrayList<>();
while(iterator.hasNext()) {
Element element = iterator.next();
contentList.add(element.toString());
}
/*
获取所有段落层级数据
*/
List<Map<String, Object>> li = ReportUtil.getList(contentList);
List<AiReportScienceFileMaterial> listMaterial = new ArrayList<>();
for (Map<String, Object> str : li) {
AiReportScienceFileMaterial aiReportScienceFileMaterial = new AiReportScienceFileMaterial();
aiReportScienceFileMaterial.setParent(str.get("parent").toString());
aiReportScienceFileMaterial.setContentType(str.get("contentType").toString());
aiReportScienceFileMaterial.setFileId(fileId);
aiReportScienceFileMaterial.setContent(str.get("text").toString());
aiReportScienceFileMaterial.setLevel(String.valueOf(str.get("level")));
aiReportScienceFileMaterial.setSort((Integer) str.get("sort"));
aiReportScienceFileMaterial.setDeleted("0");
listMaterial.add(aiReportScienceFileMaterial);
}
aiReportScienceFileMaterialService.saveBatch(listMaterial);
QueryWrapper query = new QueryWrapper();
query.eq("file_id",fileId);
query.eq("deleted","0");
query.ne("content_type","img");
query.ne("content_type","table");
List<AiReportScienceFileMaterial> listAiReportScienceFileMaterial = aiReportScienceFileMaterialService.list(query);
//ReportUtil.sendKafka(listAiReportScienceFileMaterial,fileId,scienceFile.getDataType(),scienceFile.getOrigin(),"2");//审核通过
//TODO 发送kafka
}
}
package com.zzsn.knowbase.util;
import java.text.SimpleDateFormat;
import java.util.*;
public class DateUtil {
static SimpleDateFormat format;
public static String dateToString(Date date) {
format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return format.format(date);
}
public static String getStringDate(Date date){
String format = "yyyy-MM-dd";
return DateUtil.format(date, format);
}
public static String format(Date d, String format)
{
if (d == null)
return "";
SimpleDateFormat myFormatter = new SimpleDateFormat(format);
myFormatter.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
return myFormatter.format(d);
}
/**
* 获取每天的开始时间 00:00:00:00
*
* @param date
* @return
*/
public static Date getStartTime(Date date) {
Calendar dateStart = Calendar.getInstance();
dateStart.setTime(date);
dateStart.set(Calendar.HOUR_OF_DAY, 0);
dateStart.set(Calendar.MINUTE, 0);
dateStart.set(Calendar.SECOND, 0);
return dateStart.getTime();
}
/**
* 获取每天的结束时间 23:59:59:999
*
* @param date
* @return
*/
public static Date getEndTime(Date date) {
Calendar dateEnd = Calendar.getInstance();
dateEnd.setTime(date);
dateEnd.set(Calendar.HOUR_OF_DAY, 23);
dateEnd.set(Calendar.MINUTE, 59);
dateEnd.set(Calendar.SECOND, 59);
return dateEnd.getTime();
}
/**
* 获取当前年份
* @return
*/
public static String getSysYear() {
Calendar date = Calendar.getInstance();
return String.valueOf(date.get(Calendar.YEAR));
}
/**
* 获取当前时间所在日
*/
public static Integer getDay(String dateStr) {
Calendar instance = Calendar.getInstance();
Date date = stringToDate(dateStr, "yyyy-MM-dd");
instance.setTime(date);
return instance.get(Calendar.DAY_OF_MONTH);
}
/**
* 获取前一小时的时间
* @param date 时间
*/
public static Date beforeOneHour(Date date){
Calendar instance = Calendar.getInstance();
instance.setTime(date);
instance.add(Calendar.HOUR_OF_DAY,-1);
return instance.getTime();
}
public static Date stringToDate(String date,String formatStr) {
Date parse = null;
format = new SimpleDateFormat(formatStr);
try {
parse = format.parse(date);
} catch (Exception e) {
e.printStackTrace();
}
return parse;
}
public static List<String> betweenDate(String startDate,String endDate) {
List<String> dateList = new ArrayList<>();
String formatStr = "yyyy-MM-dd";
try {
Date dayOne = stringToDate(startDate, formatStr);
Date dayTwo = stringToDate(endDate, formatStr);
Calendar calendar = Calendar.getInstance();
calendar.setTime(dayOne);
dateList.add(startDate);
while (dayTwo.after(calendar.getTime())) {
calendar.add(Calendar.DAY_OF_MONTH,1);
dateList.add(format(calendar.getTime(),formatStr));
}
} catch (Exception e) {
e.printStackTrace();
}
return dateList;
}
/**
* 获取天前凌晨时间
* @param number 几天前
*/
public static Date getSomeDayBegin(int number) {
// 获取当前的日期和时间
Calendar calendar = Calendar.getInstance();
// 将当前的日期和时间减去一天
calendar.add(Calendar.DAY_OF_MONTH, -number);
// 将时间部分设置为凌晨时间
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
// 获取昨天凌晨时间
return new Date(String.valueOf(calendar.getTime()));
}
}
package com.zzsn.knowbase.util;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* 在线程的run方法中使用注解@autoware注入的bean,会报空指针异常,原因是因为线程中为了线程安全,防注入。
* 获取bean实例的工具类组件
*/
@Component
public class GetBeanUtil implements ApplicationContextAware {
//Spring应用上下文环境
private static ApplicationContext applicationContext;
/**
* 实现ApplicationContextAware接口的回调方法,设置上下文环境
*/
public void setApplicationContext(ApplicationContext context) {
GetBeanUtil.applicationContext = context;
}
/**
* 获取对象 这里重写了bean方法,起主要作用
*/
public static Object getBean(String name) {
return applicationContext.getBean(name);
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
}
package com.zzsn.knowbase.util;
import java.security.MessageDigest;
public class MD5Util {
private static String byteArrayToHexString(byte[] b) {
StringBuilder resultSb = new StringBuilder();
for (byte value : b) {
resultSb.append(byteToHexString(value));
}
return resultSb.toString();
}
private static String byteToHexString(byte b) {
int n = b;
if (n < 0) {
n += 256;
}
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
public static String MD5Encode(String origin, String charsetName) {
String resultString = null;
try {
resultString = origin;
MessageDigest md = MessageDigest.getInstance("MD5");
if (charsetName == null || "".equals(charsetName)) {
resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
} else {
resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetName)));
}
} catch (Exception e) {
e.printStackTrace();
}
return resultString;
}
private static final String[] hexDigits = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
}
package com.zzsn.knowbase.util;
import com.github.tobato.fastdfs.proto.storage.DownloadByteArray;
import com.obs.services.ObsClient;
import com.obs.services.model.*;
//import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
* Description: obs桶文件操作
* Author: EDY
* Date: 2023/10/9
*/
@Component
public class ObsUtil {
@Autowired
ObsClient obsClient;
/**桶名称*/
private String bucketName = "zzsn";
/**判断桶是否存在*/
public Boolean existsBucket(String bucket){
return obsClient.headBucket(bucket);
}
public Boolean existsBucket(){
return obsClient.headBucket(bucketName);
}
/**
* 创建文件夹本质上来说是创建了一个大小为0且对象名以“/”结尾的对象。
* 多级文件夹创建最后一级即可,比如src1/src2/src3/,创建src1/src2/src3/即可,无需创建src1/、src1/src2/。
* keySuffixWithSlash为文件夹名称,以 / 结尾
* */
public boolean mkdir(String keySuffixWithSlash){
PutObjectResult putObjectResult = obsClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
if (putObjectResult.getStatusCode()==200) {
return true;
}else {
return false;
}
}
/**查询桶内文件夹下所有文件
* folderPrefix 为文件夹名称,以 / 结尾
* */
public List<ObsObject> getPathFileList(String folderPrefix){
List<ObsObject> res = new ArrayList<>();
ListObjectsRequest request = new ListObjectsRequest(bucketName);
request.setPrefix(folderPrefix);
ObjectListing result = obsClient.listObjects(request);
for (ObsObject obsObject : result.getObjects()) {
res.add(obsObject);
}
return res;
}
/**
* 获取文件夹下的文件数量
* */
public Integer getCount (String folderPrefix){
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
listObjectsRequest.setPrefix(folderPrefix);
listObjectsRequest.setMaxKeys(1000);
int fileCount = 0;
ObjectListing objectListing;
do {
objectListing = obsClient.listObjects(listObjectsRequest);
List<S3Object> objectSummaries = objectListing.getObjectSummaries();
fileCount += objectSummaries.size();
String nextMarker = objectListing.getNextMarker();
listObjectsRequest.setMarker(nextMarker);
} while (objectListing.isTruncated());
return fileCount;
}
/**删除桶内文件
* objectKey为文件路径,起始为桶内某文件夹,或者直接为桶内文件
* */
public boolean delFile (String objectKey){
DeleteObjectResult deleteObjectResult = obsClient.deleteObject(bucketName, objectKey);
if (deleteObjectResult.getStatusCode()==200) {
return true;
}else {
return false;
}
}
/**文件上传
* objectKey为文件路径
* */
public PutObjectResult uploadFile(String objectKey,byte[] bytes){
PutObjectResult putObjectResult = obsClient.putObject(bucketName, objectKey, new ByteArrayInputStream(bytes));
return putObjectResult;
}
/**文件上传
* objectKey为文件路径
* */
public PutObjectResult uploadFile(String objectKey ,InputStream inputStream){
PutObjectResult putObjectResult = obsClient.putObject(bucketName, objectKey, inputStream);
return putObjectResult;
}
/**
* 获取文件流
*
* */
public InputStream getObjectStream(String objectKey){
ObsObject obsObject = obsClient.getObject(bucketName, objectKey);
return obsObject.getObjectContent();
}
/**
* 获取文件流
*
* */
public byte[] getObjectByte(String objectKey){
ObsObject obsObject = obsClient.getObject(bucketName, objectKey);
// 获取文件的输入流
InputStream objectContent = obsObject.getObjectContent();
// 将输入流转换为byte[]
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int bytesRead;
while (true) {
try {
if (!((bytesRead = objectContent.read(buffer)) != -1)) {
break;
}
} catch (IOException e) {
throw new RuntimeException(e);
}
byteArrayOutputStream.write(buffer, 0, bytesRead);
}
byte[] fileBytes = byteArrayOutputStream.toByteArray();
return fileBytes;
}
/*
* 文件预览
* @param fileName
*/
public boolean previewImg(HttpServletRequest request, HttpServletResponse response) throws IOException {
String filePath = request.getParameter("attachmentPath");
String group = request.getParameter("group");
if (StringUtils.isBlank(filePath)) {
return false;
}
DownloadByteArray downloadByteArray = new DownloadByteArray();
byte[] content = getObjectByte(filePath);
if (content == null || content.length == 0) {
return false;
}
response.addHeader("Pragma", "No-cache");
response.addHeader("Cache-Control", "no-store,No-cache");
response.setCharacterEncoding("UTF-8");
// response.setContentType("application/json;charset=utf-8");
String s = filePath.split("/")[filePath.split("/").length - 1];
String mimeType = request.getServletContext().getMimeType(s);
System.out.println("文件类型为" + mimeType);
response.setContentType(request.getServletContext().getMimeType(s) + ";charset=utf-8");
OutputStream out = response.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(out);
try {
bos.write(content, 0, content.length);
bos.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bos != null) {
bos.close();
}
if (out != null) {
out.close();
}
}
return true;
}
}
package com.zzsn.knowbase.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
public class AiReportScienceFileVo {
/**
* 主键id
*/
private String id;
/**
* 资料内容
*/
private String content;
/**
* 资料内容格式(text/html/url/img)
*/
private String contentType;
/**
* 资料标题
*/
private String title;
/**
* 资料标题
*/
private String keyWords;
/**
* 年份
*/
private String year;
/**
* 作者
*/
private String author;
/**
* 来源
*/
private String origin;
/**
* 发布时间
*/
private String publishDate;
/**
* 资料类型(0:期刊、1:博士论文 2:硕士论文、3:图书)
*/
private Integer dataType;
/**
* 源文件地址
*/
private String zipFileUrl;
/**
* 状态(0:未审核、1:审核不通过 2:审核通过)
*/
private Integer status;
/**
* 审核人
*/
private String auditBy;
/**
* 审核时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date auditTime;
/**
* 创建人
*/
private String createBy;
/**
* 创建时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新人
*/
private String updateBy;
/**
* 更新时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 是否删除(0否 1是)
*/
private String deleted;
/**
* 文件路径
*/
private String filePathObs;
/**
* 封面路径
*/
private String coverObs;
/**
* 预览路径
*/
private String previewObs;
/**
* 搜索关键词
*/
private String searchWords;
/**
* 搜索字段类型 title:标题;content:内容
*/
private String searchType;
private String auditTimeStart;
private String auditTimeEnd;
private String pubStartTime;
private String pubEndTime;
}
package com.zzsn.knowbase.vo;
import lombok.Data;
import java.util.List;
@Data
public class DocEntity {
public String name;
public String content;
public List<DocEntity> section;
public String parentId;
public String id;
}
package com.zzsn.knowbase.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.zzsn.knowbase.constant.CommonConstant;
import lombok.Data;
import java.io.Serializable;
/**
* 接口返回数据格式
* @author scott
* @email jeecgos@163.com
* @date 2019年1月19日
*/
@Data
public class Result<T> implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 成功标志
*/
private boolean success = true;
/**
* 返回处理消息
*/
private String message = "操作成功!";
/**
* 返回代码
*/
private Integer code = 0;
/**
* 返回数据对象 data
*/
private T result;
/**
* 时间戳
*/
private long timestamp = System.currentTimeMillis();
/**
* python接口返回
*/
private String handleMsg;
/**
* python接口返回状态
*/
private boolean isHandleSuccess;
/**
* python接口返回状态
*/
private String logs;
/**
* 返回数据对象 data
*/
private T resultData;
public Result() {
}
public Result<T> success(String message) {
this.message = message;
this.code = CommonConstant.SC_OK_200;
this.success = true;
return this;
}
@Deprecated
public static Result<Object> ok() {
Result<Object> r = new Result<Object>();
r.setSuccess(true);
r.setCode(CommonConstant.SC_OK_200);
r.setMessage("成功");
return r;
}
@Deprecated
public static Result<Object> ok(String msg) {
Result<Object> r = new Result<Object>();
r.setSuccess(true);
r.setCode(CommonConstant.SC_OK_200);
r.setMessage(msg);
return r;
}
@Deprecated
public static Result<Object> ok(Object data) {
Result<Object> r = new Result<Object>();
r.setSuccess(true);
r.setCode(CommonConstant.SC_OK_200);
r.setResult(data);
return r;
}
public static<T> Result<T> OK() {
Result<T> r = new Result<T>();
r.setSuccess(true);
r.setCode(CommonConstant.SC_OK_200);
r.setMessage("成功");
return r;
}
public static<T> Result<T> OK(T data) {
Result<T> r = new Result<T>();
r.setSuccess(true);
r.setCode(CommonConstant.SC_OK_200);
r.setResult(data);
return r;
}
public static<T> Result<T> OK(String msg, T data) {
Result<T> r = new Result<T>();
r.setSuccess(true);
r.setCode(CommonConstant.SC_OK_200);
r.setMessage(msg);
r.setResult(data);
return r;
}
public static Result<Object> error(String msg) {
return error(CommonConstant.SC_INTERNAL_SERVER_ERROR_500, msg);
}
public static Result<Object> error(int code, String msg) {
Result<Object> r = new Result<Object>();
r.setCode(code);
r.setMessage(msg);
r.setSuccess(false);
return r;
}
public Result<T> error500(String message) {
this.message = message;
this.code = CommonConstant.SC_INTERNAL_SERVER_ERROR_500;
this.success = false;
return this;
}
/**
* 无权限访问返回结果
*/
public static Result<Object> noauth(String msg) {
return error(CommonConstant.SC_JEECG_NO_AUTHZ, msg);
}
@JsonIgnore
private String onlTable;
}
\ No newline at end of file
server:
port: 9088
spring:
datasource:
url: jdbc:mysql://localhost:3306/know?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&AllowPublicKeyRetrieval=True
username: root
password: root
redis:
database: 0
host: localhost
lettuce:
pool:
max-active: 8 #最大连接数据库连接数,设 0 为没有限制
max-idle: 8 #最大等待连接中的数量,设 0 为没有限制
max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
min-idle: 0 #最小等待连接中的数量,设 0 为没有限制
shutdown-timeout: 100ms
port: 6379
mybatis-plus:
mapper-locations: classpath*:com/zzsn/knowbase/mapper/xml/*Mapper.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
\ No newline at end of file
-- clb_project.ai_report_science_file definition
CREATE TABLE `ai_report_science_file` (
`id` varchar(36) NOT NULL COMMENT '主键',
`content` mediumtext COMMENT '文档内容',
`content_type` varchar(50) DEFAULT NULL COMMENT '资料内容格式(text/pdf/word)',
`file_path_obs` varchar(500) DEFAULT NULL COMMENT '文件地址',
`title` varchar(500) DEFAULT NULL COMMENT '文档标题',
`year` int(11) DEFAULT NULL COMMENT '所属年份',
`author` varchar(256) DEFAULT NULL COMMENT '作者',
`origin` varchar(255) DEFAULT NULL COMMENT '来源',
`publish_date` varchar(100) DEFAULT NULL COMMENT '发布时间',
`data_type` int(11) DEFAULT NULL COMMENT '资料类型(0:期刊、1:论文2:图书 3:研报)',
`zip_file_url` varchar(500) DEFAULT NULL COMMENT '资料压缩包文件地址',
`degree_awarding_unit` varchar(255) DEFAULT NULL COMMENT '学位授予单位',
`degree_awarding_time` varchar(255) DEFAULT NULL COMMENT '学位授予时间',
`status` tinyint(4) DEFAULT NULL COMMENT '状态(0:未审核、1:审核不通过 2:审核通过)',
`audit_by` varchar(100) DEFAULT NULL COMMENT '审核人',
`audit_time` datetime DEFAULT NULL COMMENT '审核时间',
`create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '创建人',
`create_time` datetime DEFAULT NULL COMMENT '创建日期',
`update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '更新人',
`update_time` datetime DEFAULT NULL COMMENT '更新日期',
`deleted` varchar(10) DEFAULT NULL COMMENT '是否删除(0否 1是)',
`cover_obs` varchar(500) DEFAULT NULL COMMENT '封面路径',
`preview_obs` varchar(500) DEFAULT NULL COMMENT '预览路径',
`key_words` varchar(255) DEFAULT NULL COMMENT '关键词',
`check_by` varchar(100) DEFAULT NULL COMMENT '校验人',
`check_time` datetime DEFAULT NULL COMMENT '校验时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `index_title` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='基本信息表';
-- clb_project.ai_report_science_file_material definition
CREATE TABLE `ai_report_science_file_material` (
`id` varchar(36) NOT NULL COMMENT '主键',
`file_id` varchar(36) DEFAULT NULL COMMENT '文档id',
`content` mediumtext COMMENT '层级内容',
`content_type` varchar(50) DEFAULT NULL COMMENT '内容类型(chaper:章节标题 chaperContent:章节内容 paragraph:段落 标题 paragraphContent:段落内容)',
`level` varchar(50) DEFAULT NULL COMMENT '层级',
`parent` varchar(50) DEFAULT NULL COMMENT '父级id',
`sort` int(11) DEFAULT NULL COMMENT '排序',
`create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '创建人',
`create_time` datetime DEFAULT NULL COMMENT '创建日期',
`update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '更新人',
`update_time` datetime DEFAULT NULL COMMENT '更新日期',
`deleted` varchar(10) DEFAULT NULL COMMENT '是否删除(0否 1是)',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_parent` (`parent`),
KEY `idx_fileId_sort` (`file_id`,`sort`,`content_type`),
KEY `idx_parent_fileId_sort` (`parent`,`file_id`,`sort`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='拆分结构内容表';
\ No newline at end of file
package com.zzsn.knowbase;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class KnowBaseApplicationTests {
@Test
void contextLoads() {
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论