天天看點

Risc-v學習平台-項目實訓第四次總結-SDU

本次工作總結

  1. 完成部分線上編譯後端功能
  2. 實作時間排序最新的五個文章後端接口
  3. 實作知識圖譜的後端接口實作

相關業務實作

線上編譯

業務實作

主要負責接受前端傳過來的想要編譯的檔案。

  1. 檔案必須以.risc為字尾,這個前端也會檢查
  2. 可以同時接受多個檔案
  3. 多次接受檔案必須保證檔案名不重複

主要業務代碼實作:

@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進行測試

Risc-v學習平台-項目實訓第四次總結-SDU

知識圖譜功能後端

實體類設計

知識圖譜的主要資料包括節點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。

節點清單資料示例:

Risc-v學習平台-項目實訓第四次總結-SDU

關系清單資料示例:

Risc-v學習平台-項目實訓第四次總結-SDU

業務實作

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進行測試

Risc-v學習平台-項目實訓第四次總結-SDU

繼續閱讀