本次工作總結
- 完成部分線上編譯後端功能
- 實作時間排序最新的五個文章後端接口
- 實作知識圖譜的後端接口實作
相關業務實作
線上編譯
業務實作
主要負責接受前端傳過來的想要編譯的檔案。
- 檔案必須以.risc為字尾,這個前端也會檢查
- 可以同時接受多個檔案
- 多次接受檔案必須保證檔案名不重複
主要業務代碼實作:
@Controller
public class FileUploadController {
/**
* @Description: 檔案上傳接口
* @Author: lmh
* @Date: 2022/3/17 15:14
*/
//測試用html
@RequestMapping("/uploadfile")
public String uploadfile(){
return "uploadfile";
}
//POST請求接口為/upload
@PostMapping(value = "/upload",produces = "application/json;charset=utf-8")
@ResponseBody
public Result upload(@RequestParam("uploadFile") MultipartFile[] multipartFiles, HttpServletRequest request){
for (MultipartFile file:multipartFiles){
String fileName = file.getOriginalFilename();
String fileType = fileName.substring(fileName.lastIndexOf("."));
if(!".riscv".equalsIgnoreCase(fileType) && !".riscv".equalsIgnoreCase(fileType)){
return Result.failupload(500,fileName+"類型有誤,請上傳riscv類型檔案!",fileName);
}
}
//設定目前日期
String uploaddate= new SimpleDateFormat("yyyy-MM-dd").format(new Date());
//設定檔案上傳儲存檔案路徑:這裡我放到本地了
String savepath = "D:/workspace/uploadFile";
//建立檔案夾,當檔案夾不存在時,建立檔案夾
File folder = new File(savepath);
if(!folder.isDirectory()){
folder.mkdir();
}
//建立一個listmap的傳回參數
List<Map<String,Object>> listmap =new ArrayList<>();
//建立一個循環分别接收多檔案,也可以直接上傳一個檔案
for(MultipartFile file:multipartFiles){
//重命名上傳的檔案,為避免重複,我們使用UUID對檔案分别進行命名
String oldname=file.getOriginalFilename();
//随機建立檔案名,這裡可以根據使用者資訊修改新的檔案名
String newname= UUID.randomUUID().toString().replace("-","")
+oldname.substring(oldname.lastIndexOf("."));
//建立每一個檔案上傳的傳回參數
Map<String,Object> map=new HashMap<>();
//檔案儲存操作
try {
//将檔案寫道指定位置
file.transferTo(new File(folder,newname));
//這裡是傳回給前端的資料中儲存檔案儲存的位置,友善下一步“運作”指令的進行
String filepath=savepath+"/"+newname;
//寫入傳回參數
map.put("oldname",oldname);
map.put("newname",newname);
map.put("filepath",filepath);
map.put("result","成功!");
listmap.add(map);
}catch (IOException ex){
//操作失敗報錯并寫入傳回參數
ex.printStackTrace();
map.put("oldname",oldname);
map.put("newname",newname);
map.put("filepath","");
map.put("result","失敗!");
}
}
//将執行結果傳回(老樣子,使用Result形式傳回)
return Result.success(listmap);
}
}
注釋比較清晰
傳回時間排序前五的文章
業務實作
Controller層:
這裡使用的PaperVo實體類主要是為了資料傳輸的大小,僅将id、title、url傳給前端。
/**
* @Description: 按時間排序的前5(暫定)文章
* @Author: lmh
* @Date: 2022/3/26 10:05
*/
@PostMapping("/newpapers")
// @LogAnnotation(module = "最新文章排名",operation = "傳回最新的5(暫定)條文章")
public Result newpapers(){
List<PaperVo> papers = paperService.listNewPapers();
return Result.success(papers);
}
Service層
/**
* @Description: 最新的5個文章
* @Author: lmh
* @Date: 2022/3/26 10:10
*/
@Override
public List<PaperVo> listNewPapers() {
return paperMapper.listNewPapers();
}
資料庫查詢語句:
<select id="listNewPapers" resultType="com.sanelysong.riscv.vo.PaperVo">
SELECT id,title,url
FROM t_paper
ORDER BY date DESC LIMIT 5
</select>
測試效果
使用Postman進行測試
知識圖譜功能後端
實體類設計
知識圖譜的主要資料包括節點Entity、關系Role,資料設計如下;
Entity:
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_entity")
public class Entity implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private String name;
private String label;
}
Role:
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_role")
public class Role implements Serializable {
private static final long serialVersionUID=1L;
private Integer id;
private String startId;
private String endId;
private String type;
}
RoleVo
/**
* @Description: (起點Entity,終點Entity,關系)
* @Author: lmh
* @Date: 2022/3/25 14:35
*/
@Data
public class RoleVo {
private String source;
private String target;
private RelationVo relation;
}
前端所需資料:
包括節點list和關系list。
節點清單資料示例:
關系清單資料示例:
業務實作
Controller層
/**
* @Description: LogAnnotation注解可以用于排查查詢效率,有些瑕疵,但不影響使用
* @Author: lmh
* @Date: 2022/3/25 23:14
*/
@PostMapping("/allmaps")
// @LogAnnotation(module = "allmaps接口",operation = "傳回知識圖譜所需資料")
public Result allmaps(){
//以map結構傳回給前端
MapsVo mapsVo = new MapsVo();
List<Entity> entityList = iEntityService.list();
List<RoleVo> roleVos = iRoleService.findAllRolesVo();
mapsVo.setEntitys(entityList);
mapsVo.setRoles(roleVos);
return Result.success(mapsVo);
}
部分核心Service方法
/**
* @Description: 後端查詢知識圖譜所需要的資料并傳回給前端
* @Author: lmh
* @Date: 2022/3/25 22:44
*/
@Override
public List<RoleVo> findAllRolesVo() {
List<RoleVo> roleVos = new ArrayList<>();
QueryWrapper<Role> queryWrapper = new QueryWrapper<>();
QueryWrapper<Entity> queryWrapper1 = new QueryWrapper<>();
//直接全查詢出來,比挨個查更有效率
List<Role> roles = roleMapper.selectList(queryWrapper);
List<Entity> entities = entityMapper.selectList(queryWrapper1);
//傳回一個Map,以key-value形式對list進行周遊追加
Map<String,Entity> entity_s = new HashMap<>();
for (int i = 0,size = entities.size();i<size;i++){
entity_s.put(entities.get(i).getId(),entities.get(i));
}
for (Role r:roles) {
//周遊追加
Entity entity_start = entity_s.get(r.getStartId());
Entity entity_end = entity_s.get(r.getEndId());
RoleVo roleVo = new RoleVo();
roleVo.setSource(entity_start.getId());
roleVo.setTarget(entity_end.getId());
RelationVo relationVo = new RelationVo();
relationVo.setId(r.getId().toString());
relationVo.setName(r.getType());
roleVo.setRelation(relationVo);
roleVos.add(roleVo);
}
return roleVos;
}
測試效果
使用Postman進行測試