Github地址:https://github.com/MokouTyan/131700101-031702425javascript
學號 | 暱稱 | 主要負責內容 | 博客地址 |
---|---|---|---|
131700101 | 莫多 | 代碼編輯、文字內容 | http://www.javashuo.com/article/p-mvnifywi-by.html |
031702425 | 永銘 | UI設計、概括總結 | http://www.javashuo.com/article/p-ficdbtgb-w.html |
Personal Software Process Stages | 預估耗時 | 實際耗時 | |
---|---|---|---|
Planning | 計劃 | 0 | 0 |
Development | 開發 | 60 | 500 |
Analysis | 需求分析 (學習新技術) | 600 | 1200 |
Design Spec | 生成設計文檔 | 0 | 0 |
Design Review | 設計複審 | 60 | 60 |
Coding Standard | 代碼規範 | 60 | 60 |
Design | 具體設計 | 60 | 60 |
Coding | 具體編碼 | 180 | 600 |
Code Review | 代碼複審 | 180 | 180 |
Test | 測試 | 180 | 180 |
Reporting | 報告 | 60 | 120 |
Test Repor | 測試報告 | 60 | 120 |
Size Measurement | 計算工做量 | 0 | 0 |
Postmortem | 過後總結 | 180 | 180 |
Process Improvement Plan | 提出過程改進計劃 | 60 | 60 |
Estimate | 這個任務須要多少時間 | 1740 | 3320 |
其實我以爲這個表格歧義挺多的,「開發」,「具體編碼」,「代碼複審」、「具體設計」、「代碼規範」這三個感受就是同義詞css
這個表格我以爲能夠壓縮一下的,對填寫者感受很是不友好html
經過分析題目總結出如下幾個難點前端
莫多:會HTML5與CSS的基礎語法,但對JS徹底沒有接觸過
永銘:會HTML5的基礎語法。對於CSS和JS徹底沒有接觸過vue
關於第四五難點,在大量進行搜索引擎的查找後,html5
最後肯定使用D3.JS——數據可視化的JSON來解決本次的問題。java
在通過週末一天的學習後,才認識到想要在這麼短的時間去掌握這個插件太過消耗時間,node
想要零基礎在這十天完成這個項目絕非易事!jquery
最後只好百度去查找是否有前人有思考過這個問題,git
通過大量的查找與篩選,最後找到一例是可讓咱們滿意的。
生成樹的動態效果是讓咱們滿意的,可是生成這棵樹的數據並不是是咱們想要的而且是固定的,
不是根據輸入要求而進行改變的,咱們還要學着如何將其修改數據
在閱讀前人的代碼後,不只對D3.JS有了更深入的認識,
而且對JS的語法以及JSON的組成有了新的瞭解,花的時間雖長但收穫良多~
關於第一點難題,「如何獲取在文本框輸入的文本內容」
這一點挺好解決的,咱們使用了jquery.js來解決這個問題
將輸入的文本都保存在一個變量中
咱們在搜索問題的解決方案的時候,前期容易大量的漫無目的搜索,
由於這部分JS的只是對咱們來講徹底就是新的知識,困難的是要用什麼關鍵詞去搜索問題,
而且還要參考不少別人的代碼,去完善本身的代碼,這個過程是很是痛苦的!
因此咱們在完成第二個問題的時候就吃了不少的苦頭,
由於生成樹的過程是用到它本地自帶的數據格式的,
由於咱們只能從樣式上更改樹,因此在數據上沒法按照咱們所想的數據格式去導入這棵樹
數據的結構相似於JSON,可是咱們都並不知道這是JSON的格式,
因而就用{}、[]、數組這樣的關鍵詞查找,能得知這是JSON格式也是純屬偶然。
最後在找到的資料中找到最適合咱們的方法是JS函數中的spilt()來解決這個問題,
還有如何將得到到的數據放入到咱們的數據中,最後使用的是push()的方法將獲得的對方逐一放入數組中
這就產生了新的問題了,那就是遇到同名的數據,如何將同名的數據合併,
那就首先要遍歷全部數據中的對象,對象中的數組,數組中的對象,
這部分的知識是我一直找不到的,由於不知道用什麼關鍵詞去查找
因此咱們先將數據中先抽離出第一層的數據,
那就是「本科生」、「碩士生」、「博士生」,即「導師——學位——年級——姓名」,
這樣的樹形結構會比「導師——年級——學位——姓名」這樣的結構清晰得多
因此咱們將三個學位的名字標爲sign一、二、3,由於JS中沒有布爾值,
同時咱們也不會如何遍歷數據獲得數據是否已經在數據中有同名的存在,
因此在if中咱們用三個標誌位來表明三個學位是否已經存在
若是標誌位爲真,那麼就創建一個大的學位數組放入導師對象中,再將年級以及學生對象逐一放入學位數組中,
若是標誌位爲假,就將年級以及學生對象放入已經存在的學位數組中,解決了產生多個學位數組的冗餘數據。
最後思考的是「如何生成多棵樹在同一頁面展現」,這個讓咱們思考了好久,
即要先對數據進行處理後獲得另外一棵樹的內容,在頁面中產生新的DIV部分來展現
起初是想用jquery.js來產生新的塊,塊中產生新的樹,
可是由於找不到相關的資料只能草草做罷,這即是咱們十天來所盡的最大努力了
JS以及不少的前端知識咱們還只是初入茅廬,此次的結對訓練讓咱們熟悉了不少JS的語法,
以及讓咱們掌握了F12控制檯的使用,雖然過程很辛苦,可是學到這麼多的內容仍是挺開心的
參考學習的代碼會放在下面的連接中,這裏展現的是咱們本身寫的代碼內容
首先就是在body上加入
<div id="textbody" style="position: fixed;top: 10px;right: 10px;z-index: 9999;padding:5px;"> <textarea placeholder="在這裏寫入以下內容: 導師:張三 2016級博士生:天1、王2、吳五 2015級碩士生:李4、王5、許六 2016級碩士生:劉1、李2、李三 2017級本科生:劉6、琪7、司四 ... 而後點擊「生成學術家族樹」按鈕 可經過鼠標拖動、滾輪進行縮放展現 ↓快按下這個按鈕試試吧(`・ω・´)!!↓" required></textarea> <div><button id='begin' style="width:500px;">生成學術家族樹</button></div> </div> <div style="position: fixed;right: 10px;bottom:10px;z-index: 9999;padding:5px;text-shadow:2px 2px 0px #fff;font-size: 24pt;">Made by     莫多、 永銘<br>Last upload 2019.10.18</div>
定義要調用的函數,以Begin爲標誌
在下方script中加入,運用了一點兒的jquery
$("#begin").click(function() { let text = document.getElementsByTagName('textarea')[0].value let line1 = text.split(/[(\r\n)\r\n]+/) // 根據回車分割 if (line1.length == 1) { line1 = ['導師:張三', '2016級博士生:天1、王2、吳五', '2015級碩士生:李4、王5、許六', '2016級碩士生:劉1、李2、李三', '2017級本科生:劉6、琪7、司四'] } let teacher = line1[0].split(':') let sign1 = 1 let sign2 = 1 let sign3 = 1 let teacherObj = { name: '', children: [] } // {老師:{本科生:{2017:學生}}} let studentObjList = [] // {2017:學生} let gradeObjList = [] // {本科生:{2017:學生}} let boshishengObjList = [] let benkeshengObjList = [] let shuoshishengObjList = [] ////// for (let i = 1; i < line1.length; i++) { let student = line1[i].split(':') //獲得學生的名單 let degree = student[0].split('級')[1] let grade = student[0].split('級')[0] let students = student[1].split('、') // 封裝,將學生包含到年級裏 studentObjList = [] //// for (let i = 0; i < students.length; i++) { let obj = {} obj.name = students[i] studentObjList.push(obj) } //// gradeObjList = [] gradeObjList.name = grade + '級' gradeObjList.children = studentObjList //teacherObj.children.push(gradeObjList) // 插入其餘年級及屆數 if (degree === '博士生') { if (sign1) { boshishengObjList = [] boshishengObjList.name = '博士生' boshishengObjList.children = gradeObjList boshishengObjList.children.push(gradeObjList) teacherObj.children.push(boshishengObjList) sign1 = 0 } else { boshishengObjList.children.push(gradeObjList) } } else if (degree === '本科生') { if (sign2) { benkeshengObjList = [] benkeshengObjList.name = '本科生' benkeshengObjList.children = gradeObjList benkeshengObjList.children.push(gradeObjList) teacherObj.children.push(benkeshengObjList) sign2 = 0 } else { benkeshengObjList.children.push(gradeObjList) } } else if (degree === '碩士生') { if (sign3) { shuoshishengObjList = [] shuoshishengObjList.name = '碩士生' shuoshishengObjList.children = gradeObjList shuoshishengObjList.children.push(gradeObjList) teacherObj.children.push(shuoshishengObjList) sign3 = 0; } else { shuoshishengObjList.children.push(gradeObjList) } } } ////// teacherObj.name = teacher[1] console.log(line1) treeData = [] //把數據置爲空 treeData.push(teacherObj) //放入數據 root = treeData[0] update(root) //調用D3.JS });
這部份內容是用來處理數據用的
console.log()語法是方便在控制檯查看的
<style> .node { cursor: pointer } .node circle { fill: #357cae; stroke: #4682b4; stroke-width: 3px } .node circle:hover { transform: scale(1.1) } .node rect { transition: all .5s; fill: #2990ca; stroke: #4682b4; stroke-width: 1.5px } .node rect:hover { transform: scale(1.1) } .node text { font: 20px sans-serif } .node text:hover { font-weight: 700; transform: scale(1.05) } .link { fill: none; stroke: #ccc; stroke-width: 4px } .link:hover { transition: all .5s; stroke: #4d4d4d } body { display: block; margin: 8px; background-image: url(src/background.jpg); background-position: bottom 0; background-size: cover; background-repeat: no-repeat; background-attachment: fixed; -webkit-background-size: cover; -o-background-size: cover; -moz-background-size: cover; -ms-background-size: cover } html { overflow-x: hidden; overflow-y: hidden } </style>
咱們在js、css、fonts、src的文件夾中放入了全部資源
下載資源後,打開index.html文件便可使用
要保證其餘文件夾也在其中,都是引用本地相對路徑的文件
咱們使用的是Chrome瀏覽器的F12工具臺進行測試
在這裏推薦看一下教程:http://www.javashuo.com/article/p-tvcungud-w.html
在代碼中使用console.log()的命令檢查數據分割的正確性
由於在測試的前期咱們沒法得知到底指令對不對
有了這個工具後咱們確實加速了不少的進度
這是本次實驗最大收穫的一部分,掌握了Chrome控制檯的使用
咱們的最大缺點就是沒法生成多棵樹,由於咱們能力實在有限
其次就是同名問題的存在,沒法獲得最高學歷
咱們的語法還有一個致命的缺陷就是分兩次輸入相同年級的人沒法合併在一塊兒
測試的數據太多的話會致使每一個地方很擠
因此咱們用了zoom的函數進行縮放方便於查看
這是咱們的缺點,正常的輸入測試是沒什麼問題
這部份內容請看本頁面的「解題思路、設計實現」
嘗試過vue.js與d3.js的結合,以及嘗試jquery的結合
產生新的塊,在新的塊中生成新的學術家族樹
vue.js與d3.js的結合,但最後以失敗了結
與jquery的結合,可是結合並非很緊密,jquery只起到了調用做用
瞭解了很是多的關於js的內容,使咱們的知識層面再也不僅限於html5與CSS
Chrome控制檯的具體操做
之前我老是會比較輕視前端的工做,認爲那是設計感比較強的人、代碼能力較弱的人去完成的
由於我以前接觸的前端語言比較多的是HTML5和CSS,用的都是標記語言而不是一些富有邏輯性的代碼
可是通過本次結對做業後,我對前端的學習有了新的認識,前端的學習一樣須要大量的學習!
從這一次的結對做業中,我感覺到了自學方法、途徑以及效率的重要性
本身以往沒有遇到過須要咱們在這麼短的時間內自學這麼多的東西的狀況
因此在這一次的自學過程當中,不少方面是不及格的,是絕對不達標的
對於我來講,這一次的做業絕對是不成功的,本身沒有在此次做業中幫上太多的忙
莫多比較不擅長表達本身的想法,要思考好久,不擅長溝通,但都能試着提出解決方案和意見
永銘在各方面的基礎都比較弱,在自學階段須要付出的努力和時間要比別人更多,雖然可以堅持下去,可是效率不高,每每會把任務壓到最後時刻再進行