這個作業屬於哪個課程 | <班級的鏈接> |
---|---|
這個作業要求在哪里 | 作業要求的鏈接 |
結對學號 | 221801103 221801125 |
這個作業的目標 | 對已爬取的論文列表進行操作 分析已爬取到的論文信息,提取top10個熱門領域或熱門研究方向 |
其他參考文獻 |
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.登錄注冊
注冊
前端:賬號密碼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" : ""
}
- 前后端分離開發
- 前端在git創建yabi分支對應開發
- 后端在git創建hanxiaotao分支對應開發
- 前端按照原型進行頁面開發
- 后端進行接口文檔,進行相對應操作
- 后端接口測試
- postman進行測試
- 前后端對接
- 前端運用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時會一起分析解決。是一個可靠的小伙伴。