2020软工第四次结对编程作业

2020软工第四次结对编程作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2020/
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2020/homework/11277
这个作业的目标 利用html+css+js实现校园师生树
学号 151803103-171809006
GitHub项目地址
https://github.com/BGL245/151803103-171809006

结对同学博客链接:
https://www.cnblogs.com/count001/p/13799891.html

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 20 20
Estimate 估计这个任务需要多少时间 10 10
Development 开发 300 360
Analysis 需求分析 (包括学习新技术)
Design Spec 生成设计文档 60 60
Design Review 设计复审
Coding Standard 代码规范 (为目前的开发制定合适的规范)
Design 具体设计 30 40
Coding 具体编码 300 300
Code Review 代码复审 20 30
Test 测试(自我测试,修改代码,提交修改) 60 70
Reporting 报告 30 40
Test Report 测试报告
Size Measurement 计算工作量
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 30 30
合计 860 960

结对人员和分工

151803103 张雨晗(css和html设计,美化页面)

171809006 白耿龙(js核心代码实现)

共同完成:实现思路,单元测试

解题思路与设计说明

看完作业,html!css!JavaScript!什么都不会!学了两三天,发现一周学完是不可能的,只能边实现边学习,边csdn边cnblogs,边百度边谷歌。然后发现大家都是用d3库来实现树的生成显示,便继续漫长的学习与套用之路。

主要思路

1、js实现核心思想,包括树的构建,结点的传递。

2、html和css负责实现页面的布局和美化。

3、首先定义树的结点信息,包括name,parent,children信息。

4、初始化函数用来构建生成树的动画,定义树的全局属性(参考了js的生成树代码),新建画布,包括结点的颜色大小,结点之间的link,结点展开和收拢。设置在展开和收拢时的动画等。使用到了d3库

数据流图

核心代码

构建函数:对文本进行分析,根据换行符\n和冒号:将信息分割,加入不同的结点数组,再细分导师和学生,读取“导师”和学生的信息,以及学生掌握的技能或工作经历

		count = 0;//儿子节点编号
                all_flag = 0;//全局变量,判断是否独立
                count_tree[j] = 0;
                skills_data = model_data[j].split("\n\n");//空一行 技能或经历
                sclice_data = skills_data[0].split("\n"); //不空行 人员信息
                for (var i = 0; i < sclice_data.length; i++ ) {
                    var head_tmp = "";
                    var body_tmp = "";
                    var hb = sclice_data[i].split(":"); //从冒号分割一层字符串
                    head_tmp = hb[0];
                    body_tmp = hb[1];
                     //处理冒号前的部分
                    if (head_tmp == "导师") {
                        var tutor = {
                             "name": body_tmp,
                             "parent": "null",
                             "children": [{}]
                        }
                        treeData[j] = tutor; //将导师嵌入节点
                     } else {
                         var children = {
                             "name": head_tmp,
                             "parent": "null",
                             "children": [{}]
                         }
                        treeData[j].children[count] = children; //将年级及职业嵌入节点
                        //处理冒号后的部分
                        var bodies = body_tmp.split("、");
                        for (var k = 0; k < bodies.length; k++ ) {
                            var sign=0;
                            for(var l=1; l < skills_data.length; l++ ){ 
                                var shead_tmp = "";
                                var sbody_tmp = "";
                                var hs = skills_data[l].split(":"); //从冒号分割一层字符串
                                shead_tmp = hs[0];
                                sbody_tmp = hs[1];
                                //判断是否有技能或经历信息
                                if(shead_tmp == bodies[k]){
                                    sign=1;
                                    var children = {
                                        "name": bodies[k],
                                        "parent": "null",
                                        "children": [{}]
                                    }
                                    treeData[j].children[count].children[k] = children; //将姓名嵌入节点
                                    var sbodies = sbody_tmp.split("、");
                                    for(var m = 0; m < sbodies.length; ++m){
                                        var children = {    
                                            "name": sbodies[m],
                                            "parent": "null",
                                            //"children":[{}]
                                        }
                                        treeData[j].children[count].children[k].children[m] = children;
                                    } 
                                    break;
                                }
                            }
                            if(sign==0){
                                var children = {
                                    "name": bodies[k],
                                    "parent": "null",
                                    //"children": [{}]
                                }
                                treeData[j].children[count].children[k] = children; //将姓名嵌入节点
                              }
                            }
                        count++; //第二子节点编号加一,生成下一个第二子节点
                    }
                }
				var tree_tmp = treeData[j];
                var name_tmp = treeData[j].name;
                for (num_tmp = 0; num_tmp < j; num_tmp++) {
                    check(treeData[num_tmp], name_tmp, tree_tmp);
                    if (all_flag == 1){
                        count_tree[j] = 1;
                        break;
                    }
                }

其中Check()为检查函数,遍历之前所有树的所有子节点,查找是否有导师的学生也是导师的情况,若有此种情况则此树重构,最后判断是否为关联树,若为关联树,就新加入当前的结点,最后生成一棵完整的树

            function check(old_tree, find_name, new_tree) {
            var length_now = getJsonLength(old_tree.children);
            for (var l = 0; l < length_now; l++) {
                if (old_tree.children[l].name == find_name) { //第l个子节点的名字是否与要查找的相同
                    all_flag = 1;
                    old_tree.children[l] = new_tree; //将该json树添加到儿子节点作为关联
                } else {
                    check(old_tree.children[l], find_name, new_tree);
                }
            }

其中getJsonLength()函数为获取树的长度,检查时可便利所有节点

	function getJsonLength(jsonData) {
            var jsonLength = 0;
            for (var item in jsonData) {
                jsonLength++;
            }
            return jsonLength;
        }

附加特点设计与展示

1.单组输入显示

2.多组无关联输入显示

3.多组关联输入显示

4、加入了一些美化程序,利用JS生成树时,可以点击人名生成更多的结点,也可以点击这些结点收回信息,使用node下的相关库函数实现。

目录说明和使用说明

目录说明

tree目录下
style.css主要实现动画界面功能
tree.js主要实现树的创建,判断,生成功能
tree.html主要实现页面显示

使用说明

clone仓库到本地,解压 tree.zip,解压后用chrome打开 tree.html, 在文本框中输入家族树文本,点击提交即可生成相应家族树

文本格式

学术家族树以文本形式输入,web页面需要提供一个文本框;考虑学术家族树的文本格式是这样的:

导师:张三

2016级博士生:天一、王二、吴五

2015级硕士生:李四、王五、许六

2016级硕士生:刘一、李二、李三

2017级本科生:刘六、琪七、司四

刘六:JAVA、数学建模

李二:字节跳动、京东云

导师:赵四

2015级博士生:...

……

其中,"导师:","级博士生:","级硕士生:","级本科生:"和"、"当做关键词处理;

若有多组输入,中间空两行

每组上半部分是人员信息,不空行

下半部分是技能树或所在公司历程,空一行

一定要严格按照输入格式输入,不然生成不了树! ! !

单元测试

选用了mocha作为测试工具,先下载node进行相关安装配置,然后在命令行输入nmp install -g mocha 安装mocha 就可以开始单元测试具体的代码编写可参考作业中给出的http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html

之前个人编程作业也有单元测试,但是没能实现,这次简单的学习了一下,首先对整个CreateTree()函数进行测试,一直报错,发现时因为在单元测试中输入的是json,但是CreateTree()输入的是文本,然后解析成json。改了之后还是实现不了,我也不知道为什么。接着对check()函数进攻,还是实现不了,终究单元测试还是不爱我,哭了哭了。没时间了,明天满课,单元测试下次见

Github签入截图

代码困难和解决

1对文本的解析不正确,导致树一直实现不出来

通过不断alert()来进行修改,最后得到了想要的结果,从其中更加了解了如何解析文本,以及对json更加熟悉。

2check函数中返回值的编写错误,导致生成与输入数目不同的树

也是通过不断alert()来找信息,最后选择不返回值,直接用全局变量来实现。

3.单元测试还是不会弄

未解决,希望有时间还是可以做

评价队友

1.队友学习能力强,很快就学会了相关内容并实现
2.都是前端小白,还有东西需要学习

posted @ 2020-10-11 23:18  白_white  阅读(120)  评论(0编辑  收藏  举报