結對第二次作業


這個作業屬於哪個課程 <班級的鏈接>
這個作業要求在哪里 作業要求的鏈接
結對學號 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時會一起分析解決。是一個可靠的小伙伴。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM