结对第二次作业

这个作业属于哪个课程 <班级的链接>
这个作业要求在哪里 作业要求的链接
结对学号 221801103 221801125
这个作业的目标 对已爬取的论文列表进行操作
分析已爬取到的论文信息,提取top10个热门领域或热门研究方向
其他参考文献

git仓库链接,代码规范链接,项目展示链接

git仓库链接

代码规范

项目展示

PSP表格

  • 221801103
Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
计划
• 估计这个任务需要多少时间 10 5
开发
• 需求分析 (包括学习新技术) 15 20
• 生成设计文档 20 40
• 设计复审 5 5
• 代码规范 (为目前的开发制定合适的规范) 5 3
• 具体设计 20 120
• 具体编码 2100 2520
• 代码复审 60 240
• 测试(自我测试,修改代码,提交修改) 120 320
报告
• 测试报告 20 20
• 计算工作量 10 10
• 事后总结, 并提出过程改进计划 5 5
合计 2390 3308
  • 221801125
Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
计划
• 估计这个任务需要多少时间 10 5
开发
• 需求分析 (包括学习新技术) 15 20
• 生成设计文档 20 40
• 设计复审 5 5
• 代码规范 (为目前的开发制定合适的规范) 5 3
• 具体设计 20 120
• 具体编码 1800 2230
• 代码复审 30 20
• 测试(自我测试,修改代码,提交修改) 60 240
报告
• 测试报告 10 5
• 计算工作量 20 5
• 事后总结, 并提出过程改进计划 5 5
合计 2000 2698

成品展示

项目展示

  • 未登录

未登录

  • 登录注册

登录

注册

  • 首页词云

首页词云

  • 统计

统计

  • 模糊搜索

模糊搜索

  • 个人设置

个人设置

*数据库增加,收藏

收藏

  • 数据库删除,取消收藏

数据库删除

*分页功能

分页

结对讨论过程描述

讨论图片

  1. 接口文档
    • 根据原型设计接口文档
//第一版接口文档
1.登录注册
   注册
	前端:账号密码string数组
	          [ username,password ]
	后端:int类型
	          0,账号已存在,
                          1,注册成功
	          2,注册失败
   登录
	前端:{"userName":"","password":""}
	          [ username,password ]
	后端:false(账号密码不匹配)
	         (账号密码匹配)
	          所有的个人信息,json
	{
		"type" : false
		"name":  "",
		"address": "",
		"company":"",
		"info":""
	}
2.首页
	前端:
	后端:[ 前十名关键字的string数组 ]
3.最热统计
	前端:
	后端:json数据      
	{
	"hottest" : [热门领域string数组],
	"cvpr" : [cvpr的前5月排行int数组],
	"iccv" : [iccv的前5月排行int数组],
	"eccv" : [eccv的前5月排行int数组],
	}
4.我的收藏
	前端:{"userName" :""}
	后端:json
	(论文图片, 标题,作者,关键字,摘要)
	{
	  "img" : ""
	  "title" : "",
	  "author" : "",
	  "keyword" : "",
	  "info"  : ""
	}
5.论文列表
	前端:json文件 
	{
	"type":(int类型)
		0  (关键字)
		1(论文标题)
		2  ( 所有论文 )
	"str": "string类型传递过来的数据"
	}
	后端:所有符合搜索的json
	标题,作者,关键字,摘要
	{
	  "title" : "",
	  "author" : "",
	  "keyword" : "",
	  "info"  : ""
	}
6.我的设置
	(修改的时候才会提交)
	前端:json
	{
	  "username" : ""
	  "name" : ""
	  "address" : ""
	  "company" : ""
	  "info" : ""
	}
	后端:
	{
	"type":true,false
	}
7.论文详情页
	前端:{"title" :""}
	后端:返回论文json信息
	标题,作者,关键字,内容
	{
	  "title" : "",
	  "author" : "",
	  "keyword" : "",
	  "content" : ""
	}
	
	         
  1. 前后端分离开发
    • 前端在git创建yabi分支对应开发
    • 后端在git创建hanxiaotao分支对应开发
    • 前端按照原型进行页面开发
    • 后端进行接口文档,进行相对应操作
  2. 后端接口测试
    • postman进行测试
  3. 前后端对接
    • 前端运用MVC模型中M,与后端进行对接

github commit 记录

记录

设计实现过程

实现过程

  • 用户登录后点击全部论文,即可获得全部论文
    • 前端向后端发送ajax请求,后端通过请求进行查询对应页码操作
  • 收藏界面以及论文列表界面的收藏按钮,点击后可以收藏
    • 前端向后端发送ajax请求,后端通过请求进行增删语句

功能结构图

结构

代码说明

  • 前端代码

    • 定义全局内容,避免后续更改代码内内容

    • //user内容参考
      var USER_INFO = 
          {
              "name" : localStorage.getItem("name")==null? "":localStorage.getItem("name"),
              // "userID" : localStorage.getItem("userName")==null? "":localStorage.getItem("userName"),
          }
      
      var DATA_NEEDED_TO_BE_CHANGED = false
      
      var HOTTEST_TOP10 = []
      
      var HOTTEST_THREE = {}
      
      var ALL_PAGE_LIST = []
      
      var LIKE_LIST = []
      
      
      
    • //ajax路径配置
      
      const BASE_URL = "http://192.168.0.114:8080/PaperSearching_war_exploded/"
      
      
      const GLOBAL_BLUR_SEARCH_ALL_PAPER_AND_COUNT = BASE_URL+"PaperListServlet"
      const GLOBAL_BUL_DELETE_MY_COLLECT = BASE_URL+"DeleteMyCollectSevlet"
      const GLOBAL_BLUR_UPDATE = BASE_URL+"UpdateMyCollectServlet"
      
      
      const AJAX_URL = {    
          "allPaper" : GLOBAL_BLUR_SEARCH_ALL_PAPER_AND_COUNT,  //获取所有论文
          "allPaperCount" : GLOBAL_BLUR_SEARCH_ALL_PAPER_AND_COUNT, //获取论文页数
          "allPaperDelete" : GLOBAL_BUL_DELETE_MY_COLLECT,  //论文取消收藏
          "allPaperAdd" : GLOBAL_BLUR_UPDATE, //论文添加收藏
          ...
      }
      
    • 使用jquery面向对象开发,将dom绑定以及事件分离

    •   function Page(){}
        $.extend(Page.prototype,{
          init:function(){
            this.bindEvents()
      	  ...
          },
          bindEvents:function(){
            var logOut = $(".slide-down li:eq(1)")
            logOut.click(this.logOutFunc)
          },
          logOutFunc:function(){
          }
        })
        var page = new Page()
        page.init()
      
    • ajax异步请求数据,动态展示页面

      $.ajax({
              url: AJAX_URL.myPaperCount,
              type: "post",
              data: JSON.stringify({
                type: 0,
                account: USER_INFO.userID,
                methods: "getPages",
              }),
              contentType: "application/json",
              success: (data) => {
                  },
                  error: () => {
                    alert("网络不好,什么都看不到");
                  },
                });
              },
            });
      
            $("#reg_wait").css("display", "inline-block");//等待页面
      
  • 后端代码

    • servlet

    •        response.setHeader("Access-Control-Allow-Origin", "*");
              /* 允许跨域的请求方法GET, POST, HEAD 等 */
              response.setHeader("Access-Control-Allow-Methods", "*");
              /* 重新预检验跨域的缓存时间 (s) */
              response.setHeader("Access-Control-Max-Age", "4200");
              /* 允许跨域的请求头 */
              response.setHeader("Access-Control-Allow-Headers", "*");
              /* 是否携带cookie */
              response.setHeader("Access-Control-Allow-Credentials", "true");
              requestJson=JSONObject.fromObject(
                      RequestToJson.getRequestPostStr(request));
      
              if(requestJson.getString("methods").equals("getPages"))
              {
      
                  showPapers.clear();
      
                  String account=requestJson.getString("account");
      
                  List<Paper> papers=paperserviceimpl.GetMyCollect(account);
      
                  for (int i=0;i<papers.size();i++)
                  {
                      JSONObject jsonObject=new JSONObject();
                      jsonObject.put("title",papers.get(i).getTitle());
                      String[] authorList=papers.get(i).getAuthors().split("//");
                      jsonObject.put("author",authorList);
                      String[] keywordList=papers.get(i).getKeywords().split("//");
                      jsonObject.put("keyword",keywordList);
                      jsonObject.put("abstract",papers.get(i).getTheabstract());
                      jsonObject.put("link",papers.get(i).getPaperlink());
                      jsonObject.put("iscollect",paperserviceimpl.IsCollected(account,papers.get(i).getTitle()));
                      showPapers.add(jsonObject);
                  }
                  System.out.println(showPapers.size());
                  response.getWriter().print(showPapers.size());
              }
      
              if(requestJson.getString("methods").equals("getCollectList"))
              {
                  int index=requestJson.getInt("page");
                  if(index*8<=showPapers.size())
                  {
                      response.getWriter().print(showPapers.subList((index - 1) * 8, index * 8));
                  }
                  else
                  {
                      response.getWriter().print(showPapers.subList((index - 1) * 8, (index - 1) * 8+showPapers.size()%8));
                  }
              }
      
    • mysql

    • public HashMap<String,Integer> GetHottestKeywords()
          {
              HashMap<String,Integer> hashMap=new HashMap<>();
              try
              {
                  Connection connection = Jdbcutils.GetConnection();
                  PreparedStatement preparedStatement = connection.prepareStatement(
                          "select * from keyword order by total desc limit 0,10");
      
                  ResultSet resultSet=preparedStatement.executeQuery();
                  while(resultSet.next())
                  {
                      hashMap.put(resultSet.getString("keyword"), resultSet.getInt("total"));
                  }
                  Jdbcutils.CloseConnection(preparedStatement,connection);
              }
              catch (Exception e)
              {
                  e.printStackTrace();
              }
              return hashMap;
          }
      
    • json解析

    •                    BufferedReader bufferedReader = new BufferedReader(new FileReader(files[k]));
      
                          String paperString="";
                          String temp1;
                          while((temp1 = bufferedReader.readLine())!=null)
                          {
                              paperString+=temp1 ;
                          }
      
                          JSONObject jsonObject = JSONObject.fromObject(paperString.substring(0, paperString.length() - 1));
      
                          /*isbn = JSONObject.fromObject(
                                  jsonObject.getJSONArray("isbn").get(0)).getString("value");*/
      
                          isbn=jsonObject.getString("articleNumber");
                          title = jsonObject.getString("title");
      
                          JSONArray authorArray = jsonObject.getJSONArray("authors");
                          for (int i = 0; i < authorArray.size(); i++)
                          {
      
                              authors += JSONObject.fromObject(
                                      jsonObject.getJSONArray("authors").get(i)).getString("name") + "//";
                          }
      
      
      
                          if (jsonObject.containsKey("keywords"))
                          {
                              JSONArray jsonArray = jsonObject.getJSONArray("keywords");
      
                              JSONObject temp = JSONObject.fromObject(jsonArray.get(0));
                              String kwd = temp.getString("kwd");
                              JSONArray jsonArray1 = JSONArray.fromObject(kwd);
                              Object[] objects = jsonArray1.toArray();
                              for (Object keyword : objects)
                              {
                                  keywords += keyword + "//";
                              }
      
                              addKeywordsCount(keywords);
                          }
      
                          if (jsonObject.containsKey("abstract")) {
                              theabstract = jsonObject.getString("abstract");
                          }
                          else
                          {
                              theabstract="";
                          }
      
                          publishDate = jsonObject.getString("chronOrPublicationDate");
                          String datestr;
                          if(getMonth(publishDate).equals("00"))
                          {
                              datestr = publishDate.substring(publishDate.length() - 4, publishDate.length())
                                      + "-"
                                      + "01"//getMonth(publishDate)
                                      + "-01";
                          }
                          else
                          {
                              datestr = publishDate.substring(publishDate.length() - 4, publishDate.length())
                                      + "-"
                                      + getMonth(publishDate)
                                      + "-01";
                          }
                          SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                          Date utilDate = sdf.parse(datestr);
                          java.sql.Date date=new java.sql.Date(utilDate.getTime());
      
                          conference = theConference;
                          paperlink=jsonObject.getString("doiLink");
      

心路历程和收获

  • 前端开发

    • 本来以为这一次的作业比较简单,所以决定使用原生h5,css3,jq开发,但是开发到中期的时候就意识到组件没办法共享的问题,太多冗余的代码,路径太难寻找,每一个页面对于不同路径的函数渲染也不同
    • 收获
      • 巩固了ajax异步请求,当data没被指定时,传递过的数据是formData,导致后端接受json数据的问题
      • 对路径的再次认识,通过向头部添加?,&改变url,从而获取路径数据
  • 后端开发

    • 这次作业相对来说比较困难,想得太简单了,就想着用原生jsp+servlet来做就ok。做到一半之后就后悔了但是也没有办法,只能迎着头皮做下去。在以后的项目开发中会去学习相关框架并选择框架去完成。但其实也算是巩固了基础知识了吧,会为以后的学习提供助力。
    • 收获
      • 巩固java web 、数据库 和Json 相关知识,为以后java框架学习打好了基础。
      • 第一次完成完整的前后端web项目,获得了前后端合作的相关经验,如局域网对接,PostMan对接数据测试等
      • 对web端http有了更深一步的认识。

评价结对队友

  • yabi
    每一天都过得很充实,感觉自己的计划真的被塞得满满的,挺开心的,很期待下一次合作

  • 做事认真,比较负责,遇到不懂上网去查询相关的资料让我们一起去学习,去弄懂。对时间的把握比我好,在我懒时,会督促我把进度提上来,起到了监督的作用。在结对编程的过程中,认真交流态度好到问题和bug时会一起分析解决。是一个可靠的小伙伴。

posted @ 2021-03-31 18:31  丫比是丫比  阅读(169)  评论(16编辑  收藏  举报