【2019.10.17】十天Web前端程序員體驗(軟件工程實踐第五次作業)


結對信息、具體分工

Github地址:https://github.com/MokouTyan/131700101-031702425

學號 昵稱 主要負責內容 博客地址
131700101 莫多 代碼編輯、文字內容 https://www.cnblogs.com/mokou/p/11695109.html
031702425 永銘 UI設計、歸納總結 https://www.cnblogs.com/yumesinyo/p/11701527.html

PSP表格

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

其實我覺得這個表格歧義挺多的,“開發”,“具體編碼”,“代碼復審”、“具體設計”、“代碼規范”這三個感覺就是同義詞

這個表格我覺得可以壓縮一下的,對填寫者感覺非常不友好

解題思路、設計實現

主頁面展示:

難點分析:

通過分析題目總結出以下幾個難點

  1. 如何得到文本輸入框的內容
  2. 如何處理輸入的文本數據
  3. 如何將數據生成學術家族樹
  4. 如何將樹形結構轉化為動態
  5. 如何生成多棵樹在同一頁面展示

組員基礎能力:

莫多:會HTML5與CSS的基礎語法,但對JS完全沒有接觸過
永銘:會HTML5的基礎語法。對於CSS和JS完全沒有接觸過

“生成學術家族樹”:

關於第四五難點,在大量進行搜索引擎的查找后,

最后確定使用D3.JS——數據可視化的JSON來解決本次的問題。

在經過周末一天的學習后,才認識到想要在這么短的時間去掌握這個插件太過消耗時間,

想要零基礎在這十天完成這個項目絕非易事!

最后只好百度去查找是否有前人有思考過這個問題,

經過大量的查找與篩選,最后找到一例是可以讓我們滿意的。

生成樹的動態效果是讓我們滿意的,但是生成這棵樹的數據並非是我們想要的並且是固定的,

不是根據輸入要求而進行改變的,我們還要學着如何將其修改數據

在閱讀前人的代碼后,不僅對D3.JS有了更深刻的認識,

並且對JS的語法以及JSON的組成有了新的了解,花的時間雖長但收獲良多~

“得到文本輸入”:

關於第一點難題,“如何獲取在文本框輸入的文本內容”

這一點挺好解決的,我們使用了jquery.js來解決這個問題

將輸入的文本都保存在一個變量中

“處理輸入的文本”:

我們在搜索問題的解決方案的時候,前期容易大量的漫無目的搜索,

因為這部分JS的只是對我們來說完全就是新的知識,困難的是要用什么關鍵詞去搜索問題,

並且還要參考很多別人的代碼,去完善自己的代碼,這個過程是非常痛苦的!

所以我們在完成第二個問題的時候就吃了很多的苦頭,

因為生成樹的過程是用到它本地自帶的數據格式的,

因為我們只能從樣式上更改樹,所以在數據上無法按照我們所想的數據格式去導入這棵樹

數據的結構類似於JSON,但是我們都並不知道這是JSON的格式,

於是就用{}、[]、數組這樣的關鍵詞查找,能得知這是JSON格式也是純屬偶然。

最后在找到的資料中找到最適合我們的方法是JS函數中的spilt()來解決這個問題,

還有如何將獲得到的數據放入到我們的數據中,最后使用的是push()的方法將得到的對方逐一放入數組中

這就產生了新的問題了,那就是遇到同名的數據,如何將同名的數據合並,

那就首先要遍歷所有數據中的對象,對象中的數組,數組中的對象,

這部分的知識是我一直找不到的,因為不知道用什么關鍵詞去查找

所以我們先將數據中先抽離出第一層的數據,

那就是“本科生”、“碩士生”、“博士生”,即“導師——學位——年級——姓名”,

這樣的樹形結構會比“導師——年級——學位——姓名”這樣的結構清晰得多

所以我們將三個學位的名字標為sign1、2、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級博士生:天一、王二、吳五
2015級碩士生:李四、王五、許六
2016級碩士生:劉一、李二、李三
2017級本科生:劉六、琪七、司四
...

然后點擊“生成學術家族樹”按鈕
可通過鼠標拖動、滾輪進行縮放展示

↓快按下這個按鈕試試吧(`・ω・´)!!↓" 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&nbsp&nbsp&nbsp&nbsp&nbsp莫多、&nbsp永銘<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級博士生:天一、王二、吳五', '2015級碩士生:李四、王五、許六', '2016級碩士生:劉一、李二、李三', '2017級本科生:劉六、琪七、司四']
	}
	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工具台進行測試

在這里推薦看一下教程:https://www.cnblogs.com/xiaowenshu/p/10450848.html

測試代碼:

在代碼中使用console.log()的命令檢查數據分割的正確性

因為在測試的前期我們無法得知到底指令對不對

有了這個工具后我們確實加速了很多的進度

這是本次實驗最大收獲的一部分,掌握了Chrome控制台的使用

測試思路:

我們的最大缺點就是無法生成多棵樹,因為我們能力實在有限

其次就是同名問題的存在,無法得到最高學歷

我們的語法還有一個致命的缺陷就是分兩次輸入相同年級的人無法合並在一起

測試的數據太多的話會導致每個地方很擠

所以我們用了zoom的函數進行縮放方便於查看

這是我們的缺點,正常的輸入測試是沒什么問題

異常或結對困難及解決方法

問題描述:

這部分內容請看本頁面的“解題思路、設計實現”

做過哪些嘗試:

嘗試過vue.js與d3.js的結合,以及嘗試jquery的結合

產生新的塊,在新的塊中生成新的學術家族樹

是否解決:

vue.js與d3.js的結合,但最后以失敗告終

與jquery的結合,但是結合並不是很緊密,jquery只起到了調用作用

有何收獲:

了解了非常多的關於js的內容,使我們的知識層面不再僅限於html5與CSS

Chrome控制台的具體操作

結對感受、隊友評價

莫多的體驗:

以前我總是會比較輕視前端的工作,認為那是設計感比較強的人、代碼能力較弱的人去完成的

因為我之前接觸的前端語言比較多的是HTML5和CSS,用的都是標記語言而不是一些富有邏輯性的代碼

但是經過本次結對作業后,我對前端的學習有了新的認識,前端的學習同樣需要大量的學習!

永銘的體驗:

從這一次的結對作業中,我感受到了自學方法、途徑以及效率的重要性

自己以往沒有遇到過需要我們在這么短的時間內自學這么多的東西的情況

所以在這一次的自學過程中,很多方面是不及格的,是絕對不達標的

對於我來說,這一次的作業絕對是不成功的,自己沒有在這次作業中幫上太多的忙

需要改進的地方:

莫多比較不擅長表達自己的想法,要思考很久,不擅長溝通,但都能試着提出解決方案和意見

永銘在各方面的基礎都比較弱,在自學階段需要付出的努力和時間要比別人更多,雖然能夠堅持下去,但是效率不高,往往會把任務壓到最后時刻再進行

參考鏈接

標題 網址
Chrome——F12 谷歌開發者工具詳解 https://www.cnblogs.com/xiaowenshu/p/10450848.html
D3 gallery https://github.com/d3/d3/wiki/Gallery
D3 wiki https://github.com/d3/d3/wiki
D3.js樹圖(Tree)展開和折疊 https://blog.csdn.net/qq_26562641/article/details/77480767
D3.js之樹形折疊樹 https://www.cnblogs.com/wanyong-wy/p/7603123.html
JavaScript中split()方法詳解 https://blog.csdn.net/wxl1555/article/details/63871739
JavaScript push() 方法詳解 http://www.fly63.com/article/detial/1187
html的標簽點擊觸發js函數的3種方法 https://blog.csdn.net/zymx14/article/details/62424377
如何在項目中使用D3.js https://blog.csdn.net/qq_34414916/article/details/80026180
如何快速查找一個值是否存在,不存在再push()! https://bbs.csdn.net/topics/200077079
D3.js選擇元素和綁定數據 https://blog.csdn.net/qq_34414916/article/details/80026813
查詢json字段,返回包含指定屬性的json數據 https://bbs.csdn.net/topics/392406430
D3.js做一個簡單的圖表 https://blog.csdn.net/qq_34414916/article/details/80029352
js遞歸遍歷樹形json數據 https://blog.csdn.net/axIsMyName/article/details/100202043
D3.js交互式操作 https://blog.csdn.net/qq_34414916/article/details/80035695
JS獲取頁面窗口大小解讀 https://blog.csdn.net/dearbaba_8520/article/details/82585749
D3.js中各種精美的圖形 https://blog.csdn.net/qq_34414916/article/details/80035926
js窗口尺寸獲取常用屬性 https://blog.csdn.net/csdnxcn/article/details/77886499
D3.js的v5版本入門教程 https://blog.csdn.net/qq_34414916/article/details/80026029
js常用JSON數據操作 https://www.cnblogs.com/19show/p/7910824.html
D3力導向圖 https://blog.csdn.net/qq_34414916/article/details/80036679
js中=區別 https://www.cnblogs.com/nelson-hu/p/7922731.html
jQuery 教程 | 菜鳥教程 https://www.runoob.com/jquery/jquery-tutorial.html
js數組對象push前怎么判斷是否存在該元素 https://segmentfault.com/q/1010000019985464
Json數組刪除 https://www.cnblogs.com/thiaoqueen/p/7170061.html
js中創建和調用json https://blog.csdn.net/Hel1o_world/article/details/82227099
html5加js實現本地文件讀取和寫入並獲取本地文件路徑 https://blog.csdn.net/qq_36547601/article/details/79675948
js實現以最簡單的方式將數組元素添加到對象中的方法 https://www.jb51.net/article/130997.htm
js中[]、{}、()區別 https://blog.csdn.net/qq_20069429/article/details/83267887
js 創建數組方法以及區別 https://www.cnblogs.com/mengfangui/p/9518105.html
JS-JS創建數組的三種方法 https://www.cnblogs.com/superlizhao/p/8426915.html
全局 CSS 樣式 · Bootstrap v3 中文文檔 https://v3.bootcss.com/css/
遠不止這些,列出部分供大家參考


免責聲明!

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



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