Compare commits

...

2 Commits
master ... pdf

Author SHA1 Message Date
pan dce9531a8a 更新推荐算法 4 years ago
pan bb9508c389 修改数据结构 4 years ago
  1. 53
      doc/db_table.md
  2. 106
      src/main/java/com/bupt/note/Controller/FileController.java
  3. 79
      src/main/java/com/bupt/note/Controller/NoteController.java
  4. 166
      src/main/java/com/bupt/note/Controller/PaperController.java
  5. 43
      src/main/java/com/bupt/note/Model/File.java
  6. 36
      src/main/java/com/bupt/note/Model/Paper.java
  7. 31
      src/main/java/com/bupt/note/Model/PaperNote.java
  8. 28
      src/main/java/com/bupt/note/Model/Similarity.java
  9. 39
      src/main/java/com/bupt/note/Model/SimilarityId.java
  10. 32
      src/main/java/com/bupt/note/Model/Word.java
  11. 8
      src/main/java/com/bupt/note/Repository/FileRepository.java
  12. 7
      src/main/java/com/bupt/note/Repository/PaperRepository.java
  13. 9
      src/main/java/com/bupt/note/Repository/RatingRepository.java
  14. 10
      src/main/java/com/bupt/note/Repository/SimilarityRepository.java
  15. 10
      src/main/java/com/bupt/note/dto/QueryPaper.java
  16. 1
      src/main/java/com/bupt/note/dto/UploadPaper.java
  17. 29
      src/main/java/com/bupt/note/service/FileService.java
  18. 10
      src/main/resources/application.yaml
  19. 5
      src/test/java/com/bupt/note/MyTest.java
  20. 21
      src/test/java/com/bupt/note/NoteApplicationTests.java

@ -6,25 +6,6 @@
| user_name | varchar | not null | 用户名 |
| password | varchar | not null | 密码 |
# 论文文件表 sys_file
| 列名 | 数据类型 | 约束条件 | 含义 |
| ---- | -------- | -------- | ---- |
| id | bigint | primary key; identity | 文件id |
| file_path | varchar | not null | 文件路径 |
| url_path | varchar | not null | 访问路径 |
# 论文笔记表 sys_paper_note
| 列名 | 数据类型 | 约束条件 | 含义 |
| ---- | -------- | -------- | ---- |
| id | bigint | primary key; identity | 文件id |
| paper_id | bigint | not null | 论文id |
| file_id | bigint | not null | 原文件id |
| file_path | varchar | not null | 文件路径 |
| url_path | varchar | not null | 访问路径 |
| user_name | varchar | not null | 修改用户 |
# 论文 sys_paper
| 列名 | 数据类型 | 约束条件 | 含义 |
@ -36,11 +17,12 @@
| profession | varchar | not null | 学科专业 |
| school | varchar | not null | 学校 |
| year | int | not null | 学位年度 |
| summary | varchar | not null | 摘要 |
| summary | longtext | not null | 摘要 |
| tag | varchar | not null | 论文标签 |
| file_id | bigint | not null | 正文文件id |
| user_name | varchar | not null | 上传用户 |
| create_time | Long | not null | 上传时间戳 |
| html_content | longblob | not null | 论文html内容 |
| pdf_content | longblob | not null | 论文pdf内容 |
| txt_content | longblob | not null | 论文pdf内容 |
| create_time | Long | not null | 创建时间戳 |
# 论文评价 sys_paper_rating
| 列名 | 数据类型 | 约束条件 | 含义 |
@ -52,6 +34,15 @@
| paper_id | bigint | not null | 论文id |
| user_name | varchar | not null | 评价用户 |
# html笔记内容表 sys_paper_note
| 列名 | 数据类型 | 约束条件 | 含义 |
| ---- | -------- | -------- | ---- |
| id | bigint | primary key; identity | 文件id |
| paper_id | bigint | not null | 论文id |
| user_name | varchar | not null | 修改用户 |
| html_content | longblob | not null | html代码 |
# 笔记 sys_note
| 列名 | 数据类型 | 约束条件 | 含义 |
@ -60,6 +51,7 @@
| note_title | varchar | not null | 笔记标题 |
| note_content | varchar | not null | 笔记内容 |
| paper_id | bigint | not null | 论文id |
| paper_note_id | bigint | not null | html笔记id |
| user_name | varchar | not null | 笔记用户 |
# 收藏 sys_collect
@ -69,4 +61,17 @@
| id | bigint | primary key; identity | 收藏id |
| paper_id | bigint | not null | 收藏论文id |
| user_name | varchar | not null | 收藏用户 |
| create_time | Long | not null | 收藏时间戳 |
| create_time | Long | not null | 收藏时间戳 |
# 词库 sys_word
| 列名 | 数据类型 | 约束条件 | 含义 |
| ---- | -------- | -------- | ---- |
| word | varchar | primary key;binary; not null | 词语 |
| flag | varchar | not null | 词性 |
# 相似度 sys_similarity
| 列名 | 数据类型 | 约束条件 | 含义 |
| ---- | -------- | -------- | ---- |
| source_paper | bigint | primary key; not null | 论文id |
| target_paper | bigint | primary key; not null | 论文id |
| similarity | double | not null | 相似度 |

@ -1,106 +0,0 @@
package com.bupt.note.Controller;
import com.bupt.note.Model.PaperNote;
import com.bupt.note.Repository.FileRepository;
import com.bupt.note.Repository.PaperNoteRepository;
import com.bupt.note.ResponseData.ResponseData;
import com.bupt.note.ResponseData.ResponseDataUtil;
import com.bupt.note.dto.FileForm;
import com.bupt.note.dto.QueryContent;
import com.bupt.note.service.FileService;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
/**
* 论文文本管理接口
*/
@RestController
@RequestMapping(value = "/v1/api/file")
public class FileController {
private static Logger logger = LoggerFactory.getLogger(FileController.class);
@Autowired
private FileRepository fileRepository;
@Autowired
private PaperNoteRepository paperNoteRepository;
@Autowired
private FileService fileService;
//上传论文文本
@PostMapping("upload")
public ResponseData upload(FileForm fileForm) {
MultipartFile file = fileForm.getFile();
if (file != null && MediaType.TEXT_PLAIN_VALUE.equals(file.getContentType())) {
try {
File txtFile = fileService.newFile();
logger.debug("论文保存到" + txtFile.getAbsolutePath());
file.transferTo(txtFile);
com.bupt.note.Model.File f = new com.bupt.note.Model.File();
f.setFilePath(txtFile.getAbsolutePath());
f.setUrlPath("/txt/" + txtFile.getName());
fileRepository.save(f);
return ResponseDataUtil.buildSuccess(f.getId());
} catch (IOException e) {
logger.error(String.valueOf(e));
e.printStackTrace();
return ResponseDataUtil.buildError();
}
} else {
logger.error("上传论文表单校验失败");
return ResponseDataUtil.buildError();
}
}
@GetMapping("find")
public ResponseData get(QueryContent queryContent,@CookieValue("user") String username) throws IOException {
if (paperNoteRepository.existsByPaperIdAndUserName(queryContent.getPaperId(),username)) {
PaperNote paperNote=paperNoteRepository.findByPaperIdAndUserName(queryContent.getPaperId(),username);
return ResponseDataUtil.buildSuccess(FileUtils.readFileToString(new File(paperNote.getFilePath()), StandardCharsets.UTF_8));
}else if(fileRepository.existsById(queryContent.getFileId())){
com.bupt.note.Model.File file=fileRepository.getOne(queryContent.getFileId());
return ResponseDataUtil.buildSuccess(FileUtils.readFileToString(new File(file.getFilePath()), StandardCharsets.UTF_8));
} else{
logger.error(String.format("论文文件id=%d不存在", queryContent.getFileId()));
return ResponseDataUtil.buildError();
}
}
/**
* 删除论文文本文件
*
* @param id 文件id
* @return
*/
@DeleteMapping("remove/{id}")
public ResponseData remove(@PathVariable Long id) {
if (fileRepository.existsById(id)) {
com.bupt.note.Model.File txtFile = fileRepository.getOne(id);
File f = new File(txtFile.getFilePath());
if (f.exists() && f.delete()) {
fileRepository.deleteById(id);
return ResponseDataUtil.buildSuccess();
} else {
logger.error(String.format("删除论文id=%d失败",id));
return ResponseDataUtil.buildError();
}
} else {
logger.error(String.format("论文id=%d不存在",id));
return ResponseDataUtil.buildError();
}
}
}

@ -11,7 +11,6 @@ import com.bupt.note.ResponseData.ResponseDataUtil;
import com.bupt.note.dto.DeleteNote;
import com.bupt.note.dto.NoteForm;
import com.bupt.note.dto.Page;
import com.bupt.note.service.FileService;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -19,11 +18,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.persistence.criteria.Predicate;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@ -41,10 +35,7 @@ public class NoteController {
@Autowired
private PaperRepository paperRepository;
@Autowired
private FileService fileService;
private Logger logger = LoggerFactory.getLogger(NoteController.class);
private final Logger logger = LoggerFactory.getLogger(NoteController.class);
/**
* 添加笔记
@ -62,42 +53,17 @@ public class NoteController {
note.setUserName(username);
noteRepository.save(note);
if (noteRepository.existsById(note.getNoteId())) {
Writer wr = null;
try {
PaperNote paperNote;
File f;
if (paperNoteRepository.existsByPaperIdAndUserName(noteForm.getPaperId(), username)) {
paperNote = paperNoteRepository.findByPaperIdAndUserName(note.getPaperId(), username);
f = new File(paperNote.getFilePath());
} else {
f = fileService.newFile();
paperNote = new PaperNote();
paperNote.setFileId(noteForm.getFileId());
paperNote.setPaperId(noteForm.getPaperId());
paperNote.setFilePath(f.getAbsolutePath());
paperNote.setUrlPath("/txt/" + f.getName());
paperNote.setUserName(username);
paperNoteRepository.save(paperNote);
}
wr = new FileWriter(f, StandardCharsets.UTF_8);
wr.write(noteForm.getContent());
return ResponseDataUtil.buildSuccess(note);
} catch (IOException e) {
e.printStackTrace();
logger.error(String.valueOf(e));
} finally {
if (wr != null) {
try {
wr.close();
} catch (IOException e) {
e.printStackTrace();
logger.error(String.valueOf(e));
}
}
PaperNote paperNote;
if (paperNoteRepository.existsByPaperIdAndUserName(noteForm.getPaperId(), username)) {
paperNote = paperNoteRepository.findByPaperIdAndUserName(note.getPaperId(), username);
} else {
paperNote = new PaperNote();
paperNote.setPaperId(noteForm.getPaperId());
paperNote.setUserName(username);
}
logger.error(String.format("更新论文id=%d失败", noteForm.getPaperId()));
return ResponseDataUtil.buildError();
paperNote.setTxtContent(noteForm.getContent());
paperNoteRepository.save(paperNote);
return ResponseDataUtil.buildSuccess(note);
} else {
logger.error("保存笔记失败");
return ResponseDataUtil.buildError();
@ -158,26 +124,9 @@ public class NoteController {
paperNoteRepository.existsByPaperIdAndUserName(deleteNote.getPaperId(),username)){
noteRepository.deleteById(deleteNote.getNoteId());
PaperNote paperNote = paperNoteRepository.findByPaperIdAndUserName(deleteNote.getPaperId(), username);
File f = new File(paperNote.getFilePath());
Writer wr = null;
try {
wr = new FileWriter(f);
wr.write(deleteNote.getContent());
return ResponseDataUtil.buildSuccess();
} catch (IOException e) {
e.printStackTrace();
logger.error(String.valueOf(e));
} finally {
if (wr != null) {
try {
wr.close();
} catch (IOException e) {
e.printStackTrace();
logger.error(String.valueOf(e));
}
}
}
logger.error("删除笔记失败");
paperNote.setTxtContent(deleteNote.getContent());
paperNoteRepository.save(paperNote);
return ResponseDataUtil.buildSuccess();
}else{
logger.error("删除笔记表单校验失败");
}

@ -1,27 +1,29 @@
package com.bupt.note.Controller;
import com.bupt.note.Model.Paper;
import com.bupt.note.Model.Rating;
import com.bupt.note.Repository.CollectRepository;
import com.bupt.note.Repository.PaperRepository;
import com.bupt.note.Repository.RatingRepository;
import com.bupt.note.Model.*;
import com.bupt.note.Repository.*;
import com.bupt.note.ResponseData.ResponseData;
import com.bupt.note.ResponseData.ResponseDataUtil;
import com.bupt.note.dto.Page;
import com.bupt.note.dto.QueryPaper;
import com.bupt.note.dto.RatingForm;
import com.bupt.note.dto.UploadPaper;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.query.criteria.internal.OrderImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import javax.persistence.criteria.Order;
import javax.persistence.criteria.Predicate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 论文管理接口
@ -30,7 +32,7 @@ import java.util.List;
@RequestMapping(value = "/v1/api/paper")
public class PaperController {
private Logger logger= LoggerFactory.getLogger(PaperController.class);
private Logger logger = LoggerFactory.getLogger(PaperController.class);
@Autowired
private PaperRepository paperRepository;
@ -41,63 +43,70 @@ public class PaperController {
@Autowired
private CollectRepository collectRepository;
@Autowired
private PaperNoteRepository paperNoteRepository;
@Autowired
private SimilarityRepository similarityRepository;
@Value("${score}")
private Integer score;
@PostMapping("upload")
public ResponseData upload(@RequestBody UploadPaper uploadPaper, @CookieValue("user") String username) {
if (uploadPaper.getFileId() != null && uploadPaper.getYear() != null && StringUtils.isNoneEmpty(uploadPaper.getTitle(),uploadPaper.getType(),
uploadPaper.getAuthor(), uploadPaper.getProfession(), uploadPaper.getSchool(), uploadPaper.getSummary(),uploadPaper.getTag())){
public ResponseData upload(@RequestBody UploadPaper uploadPaper, @CookieValue("user") String username) {
if (uploadPaper.getFileId() != null && uploadPaper.getYear() != null && StringUtils.isNoneEmpty(uploadPaper.getTitle(), uploadPaper.getType(),
uploadPaper.getAuthor(), uploadPaper.getProfession(), uploadPaper.getSchool(), uploadPaper.getSummary(), uploadPaper.getTag())) {
Paper paper = uploadPaper.toPaper();
paper.setUserName(username);
paperRepository.save(paper);
if(paperRepository.existsById(paper.getId())){
if (paperRepository.existsById(paper.getId())) {
return ResponseDataUtil.buildSuccess();
}else{
} else {
logger.error("论文上传失败");
return ResponseDataUtil.buildError();
}
}else{
} else {
logger.error("论文表单校验失败");
return ResponseDataUtil.buildError();
}
}
@GetMapping("list")
public ResponseData list(QueryPaper queryPaper,@CookieValue("user") String username){
public ResponseData list(QueryPaper queryPaper, @CookieValue("user") String username) {
try {
Page<Paper> list=new Page<>();
list.setTotal(paperRepository.count());
List<Paper> papers = paperRepository.findAll((root, criteriaQuery, criteriaBuilder) -> {
Page<Paper> papers = paperRepository.findAll((root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
if(StringUtils.isNotEmpty(queryPaper.getTitle())){
predicates.add(criteriaBuilder.like(root.get("title"),"%"+queryPaper.getTitle()+"%"));
if (StringUtils.isNotEmpty(queryPaper.getTitle())) {
predicates.add(criteriaBuilder.like(root.get("title"), "%" + queryPaper.getTitle() + "%"));
}
if(StringUtils.isNotEmpty(queryPaper.getAuthor())){
predicates.add(criteriaBuilder.like(root.get("author"),"%"+queryPaper.getAuthor()+"%"));
if (StringUtils.isNotEmpty(queryPaper.getAuthor())) {
predicates.add(criteriaBuilder.like(root.get("author"), "%" + queryPaper.getAuthor() + "%"));
}
if(StringUtils.isNotEmpty(queryPaper.getTag())){
predicates.add(criteriaBuilder.like(root.get("tag"),"%"+queryPaper.getTag()+"%"));
if (StringUtils.isNotEmpty(queryPaper.getTag())) {
predicates.add(criteriaBuilder.like(root.get("tag"), "%" + queryPaper.getTag() + "%"));
}
if(StringUtils.isNotEmpty(queryPaper.getProfession())){
predicates.add(criteriaBuilder.like(root.get("profession"),"%"+queryPaper.getTag()+"%"));
if (StringUtils.isNotEmpty(queryPaper.getProfession())) {
predicates.add(criteriaBuilder.like(root.get("profession"), "%" + queryPaper.getTag() + "%"));
}
if(queryPaper.getStartYear()!=null&&queryPaper.getEndYear()==null){
predicates.add(criteriaBuilder.ge(root.get("year"),queryPaper.getStartYear()));
}else if(queryPaper.getStartYear()==null&&queryPaper.getEndYear()!=null){
predicates.add(criteriaBuilder.le(root.get("year"),queryPaper.getEndYear()));
}else if(queryPaper.getStartYear()!=null&&queryPaper.getEndYear()!=null){
predicates.add(criteriaBuilder.between(root.get("year"),queryPaper.getStartYear(),queryPaper.getEndYear()));
if (queryPaper.getStartYear() != null && queryPaper.getEndYear() == null) {
predicates.add(criteriaBuilder.ge(root.get("year"), queryPaper.getStartYear()));
} else if (queryPaper.getStartYear() == null && queryPaper.getEndYear() != null) {
predicates.add(criteriaBuilder.le(root.get("year"), queryPaper.getEndYear()));
} else if (queryPaper.getStartYear() != null && queryPaper.getEndYear() != null) {
predicates.add(criteriaBuilder.between(root.get("year"), queryPaper.getStartYear(), queryPaper.getEndYear()));
}
if(queryPaper.getOwn()){
predicates.add(criteriaBuilder.equal(root.get("userName"),username));
if (queryPaper.getOwn()) {
predicates.add(criteriaBuilder.equal(root.get("userName"), username));
}
Order order=new OrderImpl(root.get("createTime"),false);
return criteriaQuery.where(predicates.toArray(new Predicate[0])).orderBy(order).getRestriction();
});
return criteriaQuery.where(predicates.toArray(new Predicate[0])).getRestriction();
}, PageRequest.of(queryPaper.getPage() - 1, 10, Sort.Direction.DESC, "createTime"));
papers.forEach(paper -> {
paper.setHasCollect(collectRepository.existsByPaperIdAndUserName(paper.getId(),username));
paper.setHtmlContent(null);
paper.setPdfContent(null);
paper.setTxtContent(null);
paper.setHasCollect(collectRepository.existsByPaperIdAndUserName(paper.getId(), username));
});
list.setData(papers);
return ResponseDataUtil.buildSuccess(list);
return ResponseDataUtil.buildSuccess(papers);
} catch (Exception e) {
e.printStackTrace();
logger.error(String.valueOf(e));
@ -108,40 +117,87 @@ public class PaperController {
/**
* 论文推荐
*
* @return
*/
@GetMapping("recommend")
public ResponseData recommend(){
List<Paper> papers=paperRepository.recommend();
return ResponseDataUtil.buildSuccess(papers);
public ResponseData recommend(@CookieValue("user") String userName) {
// 查询已收藏论文
List<Long> collectIds = collectRepository.findByUserName(userName).stream().map(Collect::getPaperId).collect(Collectors.toList());
//查询喜欢论文
List<Long> likeIds = ratingRepository.findLike(score);
List<Long> ids = Stream.of(collectIds, likeIds).flatMap(Collection::stream).distinct().collect(Collectors.toList());
logger.info(String.format("找到论文id数%d", ids.size()));
if (ids.size() > 0) {
Page<Similarity> similarities = similarityRepository.findAll((root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
predicates.add(criteriaBuilder.or(criteriaBuilder.and(root.get("id").get("sourcePaper").in(ids),
criteriaBuilder.not(root.get("id").get("targetPaper").in(ids))),
criteriaBuilder.and(root.get("id").get("targetPaper").in(ids),
criteriaBuilder.not(root.get("id").get("sourcePaper").in(ids)))));
return criteriaQuery.where(predicates.toArray(new Predicate[0])).getRestriction();
}, PageRequest.of(0, 10, Sort.Direction.DESC, "similarity"));
logger.info(String.format("找到论文数%d", similarities.getTotalElements()));
List<Long> paperIds=similarities.stream().map(similarity -> {
if (ids.contains(similarity.getId().getSourcePaper())) {
return similarity.getId().getTargetPaper();
} else {
return similarity.getId().getSourcePaper();
}
}).collect(Collectors.toList());
List<Paper> papers = paperRepository.recommendWithSim(paperIds);
papers.forEach(paper -> {
paper.setTxtContent(null);
paper.setPdfContent(null);
paper.setHtmlContent(null);
});
return ResponseDataUtil.buildSuccess(papers);
} else {
return ResponseDataUtil.buildSuccess("暂无推荐数据");
}
}
@PostMapping("rating")
public ResponseData rating(@RequestBody RatingForm ratingForm,@CookieValue("user") String userName) {
if(ratingForm.getPaperId()!=null&&ratingForm.getScore1()!=null&&ratingForm.getScore2()!=null&&ratingForm.getScore3()!=null){
Rating rating=ratingForm.toRating();
public ResponseData rating(@RequestBody RatingForm ratingForm, @CookieValue("user") String userName) {
if (ratingForm.getPaperId() != null && ratingForm.getScore1() != null && ratingForm.getScore2() != null && ratingForm.getScore3() != null) {
Rating rating = ratingForm.toRating();
rating.setUserName(userName);
ratingRepository.save(rating);
if(ratingRepository.existsById(rating.getId())){
if (ratingRepository.existsById(rating.getId())) {
return ResponseDataUtil.buildSuccess(rating);
}else{
} else {
logger.warn("论文保存失败");
return ResponseDataUtil.buildSuccess();
}
}else{
} else {
logger.error("论文表单校验失败");
return ResponseDataUtil.buildError();
}
}
@GetMapping("findRating")
public ResponseData findRating(Long paperId,@CookieValue("user") String userName){
if(paperId!=null&&StringUtils.isNotEmpty(userName)){
Rating rating=ratingRepository.findByPaperIdAndUserName(paperId,userName);
public ResponseData findRating(Long paperId, @CookieValue("user") String userName) {
if (paperId != null && StringUtils.isNotEmpty(userName)) {
Rating rating = ratingRepository.findByPaperIdAndUserName(paperId, userName);
return ResponseDataUtil.buildSuccess(rating);
}else{
} else {
logger.error("论文评价表单校验失败");
return ResponseDataUtil.buildError();
}
}
@GetMapping(value = "content/{id}", produces = MediaType.TEXT_PLAIN_VALUE)
public String findContent(@PathVariable("id") Long paperId, @CookieValue("user") String userName) {
if (paperNoteRepository.existsByPaperIdAndUserName(paperId, userName)) {
PaperNote paperNote = paperNoteRepository.findByPaperIdAndUserName(paperId, userName);
return paperNote.getTxtContent();
} else {
Paper paper = paperRepository.getOne(paperId);
return paper.getTxtContent();
}
}
}

@ -1,43 +0,0 @@
package com.bupt.note.Model;
import javax.persistence.*;
/**
* 论文文本实体
*/
@Entity
@Table(name = "sys_file")
public class File {
private Long Id;
private String filePath;
private String urlPath;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
return Id;
}
public void setId(Long id) {
Id = id;
}
@Column(nullable = false)
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
@Column(nullable = false)
public String getUrlPath() {
return urlPath;
}
public void setUrlPath(String urlPath) {
this.urlPath = urlPath;
}
}

@ -18,8 +18,9 @@ public class Paper {
private Integer year;
private String summary;
private String tag;
private Long fileId;
private String userName;
private byte[] pdfContent;
private byte[] htmlContent;
private String txtContent;
private Long createTime;
private boolean hasCollect;
private Long collectTime;
@ -88,7 +89,8 @@ public class Paper {
this.year = year;
}
@Column(nullable = false,length = 512)
@Lob
@Column(nullable = false)
public String getSummary() {
return summary;
}
@ -106,22 +108,34 @@ public class Paper {
this.tag = tag;
}
@Lob
@Column(nullable = false)
public byte[] getPdfContent() {
return pdfContent;
}
public void setPdfContent(byte[] content) {
this.pdfContent = content;
}
@Lob
@Column(nullable = false)
public Long getFileId() {
return fileId;
public byte[] getHtmlContent() {
return htmlContent;
}
public void setFileId(Long fileId) {
this.fileId = fileId;
public void setHtmlContent(byte[] htmlContent) {
this.htmlContent = htmlContent;
}
@Lob
@Column(nullable = false)
public String getUserName() {
return userName;
public String getTxtContent() {
return txtContent;
}
public void setUserName(String userName) {
this.userName = userName;
public void setTxtContent(String txtContent) {
this.txtContent = txtContent;
}
@Column(nullable = false)

@ -6,10 +6,8 @@ import javax.persistence.*;
@Table(name = "sys_paper_note")
public class PaperNote {
private Long id;
private Long fileId;
private Long paperId;
private String filePath;
private String urlPath;
private String txtContent;
private String userName;
@Id
@ -22,31 +20,14 @@ public class PaperNote {
this.id = id;
}
@Lob
@Column(nullable = false)
public Long getFileId() {
return fileId;
public String getTxtContent() {
return txtContent;
}
public void setFileId(Long fileId) {
this.fileId = fileId;
}
@Column(nullable = false)
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
@Column(nullable = false)
public String getUrlPath() {
return urlPath;
}
public void setUrlPath(String urlPath) {
this.urlPath = urlPath;
public void setTxtContent(String txtContent) {
this.txtContent = txtContent;
}
@Column(nullable = false)

@ -0,0 +1,28 @@
package com.bupt.note.Model;
import javax.persistence.*;
@Entity
@Table(name = "sys_similarity")
public class Similarity {
private SimilarityId id;
private Double similarity;
@EmbeddedId
public SimilarityId getId() {
return id;
}
public void setId(SimilarityId id) {
this.id = id;
}
@Column(nullable = false)
public Double getSimilarity() {
return similarity;
}
public void setSimilarity(Double similarity) {
this.similarity = similarity;
}
}

@ -0,0 +1,39 @@
package com.bupt.note.Model;
import java.io.Serializable;
import java.util.Objects;
public class SimilarityId implements Serializable {
private Long sourcePaper;
private Long targetPaper;
public Long getSourcePaper() {
return sourcePaper;
}
public void setSourcePaper(Long sourcePaper) {
this.sourcePaper = sourcePaper;
}
public Long getTargetPaper() {
return targetPaper;
}
public void setTargetPaper(Long targetPaper) {
this.targetPaper = targetPaper;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SimilarityId that = (SimilarityId) o;
return Objects.equals(sourcePaper, that.sourcePaper) &&
Objects.equals(targetPaper, that.targetPaper);
}
@Override
public int hashCode() {
return Objects.hash(sourcePaper, targetPaper);
}
}

@ -0,0 +1,32 @@
package com.bupt.note.Model;
import javax.persistence.*;
/**
* 词库
*/
@Entity
@Table(name = "sys_word")
public class Word {
private String word;
private String flag;
@Id
@Column(columnDefinition = "varchar(255) binary")
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
@Column(nullable = false)
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag;
}
}

@ -1,8 +0,0 @@
package com.bupt.note.Repository;
import com.bupt.note.Model.File;
import org.springframework.data.jpa.repository.JpaRepository;
public interface FileRepository extends JpaRepository<File, Long> {
}

@ -4,10 +4,12 @@ import com.bupt.note.Model.Paper;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface PaperRepository extends JpaRepository<Paper, Long>, JpaSpecificationExecutor<Paper> {
@Query(value = "select *\n" +
"from sys_paper\n" +
"where id in (select a.id\n" +
@ -18,5 +20,8 @@ public interface PaperRepository extends JpaRepository<Paper, Long>, JpaSpecific
" group by p.id\n" +
" order by score desc\n" +
" limit 10) a)",nativeQuery = true)
List<Paper> recommend();
List<Paper> recommendWithScore();
@Query(value = "select * from sys_paper where id in (:ids) order by FIELD(`id`,:ids)",nativeQuery = true)
List<Paper> recommendWithSim(@Param("ids") List<Long> ids);
}

@ -2,7 +2,14 @@ package com.bupt.note.Repository;
import com.bupt.note.Model.Rating;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
public interface RatingRepository extends JpaRepository<Rating, Long> {
import java.util.List;
public interface RatingRepository extends JpaRepository<Rating, Long>, JpaSpecificationExecutor<Rating> {
Rating findByPaperIdAndUserName(Long paperId, String userName);
@Query(value = "select id from sys_paper_rating where score1+score2+score3>?1",nativeQuery = true)
List<Long> findLike(int score);
}

@ -0,0 +1,10 @@
package com.bupt.note.Repository;
import com.bupt.note.Model.Similarity;
import com.bupt.note.Model.SimilarityId;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
public interface SimilarityRepository extends JpaRepository<Similarity, SimilarityId>, JpaSpecificationExecutor<Similarity> {
}

@ -13,6 +13,8 @@ public class QueryPaper {
private Integer endYear;
private Boolean own=false;
private Integer page;
public String getTitle() {
return title;
}
@ -76,4 +78,12 @@ public class QueryPaper {
public void setOwn(Boolean own) {
this.own = own;
}
public Integer getPage() {
return page;
}
public void setPage(Integer page) {
this.page = page;
}
}

@ -95,7 +95,6 @@ public class UploadPaper {
paper.setYear(this.year);
paper.setSummary(this.summary);
paper.setTag(this.tag);
paper.setFileId(this.fileId);
paper.setCreateTime(System.currentTimeMillis());
return paper;
}

@ -6,7 +6,8 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.ResourceUtils;
import java.io.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.UUID;
@ -15,31 +16,19 @@ import java.util.UUID;
public class FileService {
@Value("${spring.resources.static-locations}")
private String txtPath;
private String filePath;
private Logger logger = LoggerFactory.getLogger(FileService.class);
private final Logger logger = LoggerFactory.getLogger(FileService.class);
public File newFile() throws FileNotFoundException {
File txtDir = new File(URLDecoder.decode(ResourceUtils.getURL("classpath:").getPath(), StandardCharsets.UTF_8) + txtPath.replace("classpath:/", ""));
public File newFile(String filename) throws FileNotFoundException {
File txtDir = new File(URLDecoder.decode(ResourceUtils.getURL("classpath:").getPath(), StandardCharsets.UTF_8) + filePath.replace("classpath:/", ""));
if (!txtDir.exists() && txtDir.mkdirs()) {
logger.info("成功初始化上传论文目录:" + txtDir.getAbsolutePath());
}
return new File(txtDir, UUID.randomUUID() + ".txt");
return new File(txtDir, filename );
}
public String getContent(String path) {
StringBuilder sb=new StringBuilder();
try (BufferedReader reader = new BufferedReader(new FileReader(path, StandardCharsets.UTF_8))) {
String tempString;
while ((tempString = reader.readLine()) != null) {
sb.append(tempString);
}
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
logger.error(String.valueOf(e));
}
return "";
public File newFile() throws FileNotFoundException {
return newFile(UUID.randomUUID() + ".txt");
}
}

@ -1,3 +1,4 @@
#ba
spring:
datasource:
url: jdbc:mysql://localhost:3306/note?serverTimezone=UTC&characterEncoding=utf-8
@ -9,8 +10,9 @@ spring:
show-sql: true
#静态资源目录
mvc:
static-path-pattern: /txt/**
static-path-pattern: /file/**
resources:
static-locations: classpath:/resources/static/txt
file:
upload-dir: note_file/
static-locations: classpath:/resources/static/file
#喜好评价分
score: 7

@ -4,7 +4,8 @@ import org.junit.jupiter.api.Test;
public class MyTest {
@Test
public void test1(){
System.out.println(String.format("%d=%d",1,1L));
public void test1() {
System.out.println(String.format("%d=%d", 1, 1L));
}
}

@ -2,6 +2,8 @@ package com.bupt.note;
import com.bupt.note.Model.Paper;
import com.bupt.note.Repository.PaperRepository;
import com.bupt.note.Repository.RatingRepository;
import com.bupt.note.Repository.SimilarityRepository;
import com.bupt.note.service.FileService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@ -15,7 +17,7 @@ import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@SpringBootTest
@ -32,6 +34,12 @@ class NoteApplicationTests {
@Autowired
private PaperRepository paperRepository;
@Autowired
private RatingRepository ratingRepository;
@Autowired
private SimilarityRepository similarityRepository;
@BeforeEach
public void setUp() {
mvc = MockMvcBuilders.webAppContextSetup(context).build();
@ -46,15 +54,10 @@ class NoteApplicationTests {
mvc.perform(builder).andDo(MockMvcResultHandlers.print());
}
@Test
public void testRead() throws IOException {
String a= fileService.getContent("E:\\JetBrains\\IdeaProjects\\back-end code\\target\\classes\\resources\\static\\txt\\1aee7062-58a7-46e0-ba4d-84a9a14f4205.txt");
}
@Test
public void testPaper(){
List<Paper> papers=paperRepository.recommend();
System.out.println(papers.size());
List<Paper> ids= paperRepository.recommendWithSim(new ArrayList<>(){{
add(5L);
}});
}
}

Loading…
Cancel
Save