orange897

导航

第二次结对作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2020
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2020/homework/11277
这个作业的目标 混子的修罗场 大佬的伊甸园
学号 021800527 施颖辉 031801125 黄雨晨

相关链接及分工

GitHub仓库地址:https://github.com/oorangeH/021800527-031801125
本次作业博客链接:https://www.cnblogs.com/yhgg/p/13796063.html
测试网页链接:http://47.106.36.178/
syh:
博客链接:https://www.cnblogs.com/yhgg/
hyc:
博客链接:https://home.cnblogs.com/u/orangeyc

分工:
syh:代码编写,算法逻辑设计,代码测试
hyc:资料寻找,页面设计,编写博客

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

解题思路描述

关键代码

$('#two').click(function(){      //清空原本文本框的值
    });
    $("button").click(getvalue);
    function getvalue(){
        var skill = Array();
        var treedata=Array();
        var i,j,k,l=0;
        var str=$("#input").val();  //获取输入
        var arrstr=Array();
        arrstr=str.split("\n");//数据分行
        for(i=0;i<arrstr.length;i++)
        {
            for(j=i+1;j<arrstr.length;j++)
            {
                if(arrstr[j]==''&&arrstr[j-1]=='')
                {

                    break;
                }

            }  //此时i~j-1为一组数据
            var doctor=[],master=[],bachelor=[]; //存放学生数据
            for(k=i;k<j;k++)
            {
                if(arrstr[k]=='')
                continue;
                var d=0,m=0,b=0;
                var item=arrstr[k].split(':');
                if(!(arrstr[k].includes("博士生")||arrstr[k].includes("硕士生")||arrstr[k].includes("本科生")||arrstr[k].includes("导师")))
                {
                    for(var z = 1;z<item.length;z++)
                        skill[item[0]]=item[z];
                }
                else{
                if(k==i)
                {
                    treedata.push({"name":"",
                                    "children":[
                                        {"name":"博士生",
                                        "children":[]},
                                        {"name":"硕士生","children":[]},
                                        {"name":"本科生","children":[]}]
                    });
                }
                if(item[0].includes("导师")){
                    treedata[l]["name"]=item[1];
                }
                else if(arrstr[k].includes("博士生")){

                    for(d=0;d<doctor.length;d++){
                        if(arrstr[k].slice(0,5)==doctor[d]["name"]){
                            var student=item[1];
                            var students=item[1].split("、");//存放每个学生姓名
                            for(var x=0;x<students.length;x++){
                                var studentName=students[x];
                                student={"name":studentName,"children":[]};
                                doctor[d]["children"].push(student);
                            }
                            break;
                        }
                    }
                    if(d==doctor.length){
                        var student={"name":arrstr[k].slice(0,5),"children":[]};
                        doctor.push(student);
                        // if(item[1]!=null)
                        student=item[1].split("、");

                        for(var x=0;x<student.length;x++){
                            var s={"name":student[x],"children":[]};
                            doctor[d]["children"].push(s);
                        }
                    }
                }
                else if(item[0].includes("硕士生")){
                    for(d=0;d<master.length;d++){
                        if(arrstr[k].slice(0,5)==master[d]["name"]){
                            var student=item[1];
                            var students=item[1].split("、");//存放每个学生姓名
                            for(var x=0;x<students.length;x++){
                                var studentName=students[x];
                                student={"name":studentName,"children":[]};
                                master[d]["children"].push(student);
                            }
                            break;
                        }
                    }
                    if(d==master.length){
                        var student={"name":arrstr[k].slice(0,5),"children":[]};
                        master.push(student);
                        student=item[1].split("、");
                        for(var x=0;x<student.length;x++){
                            var s={"name":student[x],"children":[]};
                            master[d]["children"].push(s);
                        }
                    }
                }
                else{
                    for(d=0;d<bachelor.length;d++){
                        if(arrstr[k].slice(0,5)==bachelor[d]["name"]){
                            var student=item[1];
                            var students=item[1].split("、");//存放每个学生姓名
                            for(var x=0;x<students.length;x++){
                                var studentName=students[x];
                                student={"name":studentName,"children":[]};
                                bachelor[d]["children"].push(student);
                            }
                            break;
                        }
                    }
                    if(d==bachelor.length){
                        var student={"name":arrstr[k].slice(0,5),"children":[]};
                        bachelor.push(student);
                        student=item[1].split("、");
                        for(var x=0;x<student.length;x++){
                            var s={"name":student[x],"children":[]};
                            bachelor[d]["children"].push(s);
                        }
                    }
                }


            }
        }
            treedata[l]["children"][0]["children"]=doctor;
            treedata[l]["children"][1]["children"]=master;
            treedata[l]["children"][2]["children"]=bachelor;


            l=l+1;
            i=j;
        }

        for(i=0;i<treedata.length;i++)
        {
            var data=[];
            data[0]=treedata[i];
            var x=i.toString();
            if(document.getElementById(x)!=null)
                continue;
            $("body").append("<div id='x' style=\"width:100px0;height:900px;background:red\"></div>");
            $("#x").attr('id',x);
            data[0]=treedata[i];
            drawTree(data,x,skill);
        }
    }

附加特点展示

最新版本中调整了背景图片,使用户视觉观感体验得到了极大地提升

采用flex以及block布局的结合,无论用户打开窗口的大小是多少,都能得到窗口居中以及背景满屏的优质体验

提供了文本框复写功能,当用户想生成新的树时,可以轻松添加。在下方会生成新版本的树

目录说明及使用说明

这是一个简单的纯前端项目,可以不采用框架直接采用原生的JS即可
故目录清晰简单,在主界面Index下有同级的CCS文件以及JS,jQuery文件

目录说明

点击index即可食用,无需其他run等操作

使用说明

1、请使用谷歌浏览器并输入关键词"导师:","级博士生:","级硕士生:","级本科生:"和"、",其中同一位导师的多个同级学生之间用顿号隔开,顿号冒号均仅支持中文字符
2、当输入多个不同的导师所带的学生信息时,需要在上一个导师所带学生的技能树或经历后空两行,再输入下一个导师的相关信息。
3、点击"生成"按钮后,需要滑动下拉到下面的页面查看所生成的学术家族树,一个页面显示一位导师的学术家族树,当同时输入多个用例时,将生成多个对应的页面。
4、点击树的根节点后,将在页面上方弹出提示框,显示已输入的该学生所具备的技能和相关经历。点击提示框右下方的"OK"后,才可继续缩放其它节点;点击树的非根节点后,点击提示框右下方的"OK",即可将其所有子节点收起。
5、支持导师和学生的英文名输入,支持只有导师姓名没有学生信息的情况,不支持仅输入学生信息没有输入导师姓名的情况。


测试样例:

输入

导师:张三
2016级博士生:天一、王二、吴五
2015级硕士生:李四、王五、许六
2016级硕士生:刘一、李二、李三
2017级本科生:刘六、琪七、司四
//空一行
刘六:JAVA、数学建模
//空一行
李二:字节跳动、京东云

输出

单元测试

单元测试采用与队友提出的特殊树进行测试

1、示例代码生成√

2、空节点测试√

3、节点伸缩放大测试√

4、多棵树并存测试√

5、两棵树关联测试√

6、单节点修改测试×

Github签入记录截图

遇到的问题及解决办法

遇到的问题和困难开头已经给出,大部分错误出现在逻辑部分。逻辑部分的错误难以发现,所以请求用户测试。目前发现的问题基本全部解决,增功能完善,但是删除和改由于html不能实时刷新的限制以及echarts本身生成后不能主动删除,只能通过隐藏来消除,但是生成的节点还是存在,容易造成html页面代码的紊乱,实在是下下之选,所以下面所存在的不足还没有解决,解决方法应该是设置一个数组,将每次的输入都存入,然后一一比对,不同才生成,而不是先生成再修改。

存在的不足

当生成完学术家族树后,在输入框中改变已生成的某棵树中某位导师或学生的信息时,无法更新结果。即多次连续使用生成功能时,只能生成新输入的信息的家族树,无法覆盖旧的已生成的家族树。

评价队友

syh:
我的中国好队友总是能很快发现题目的核心,找到解题的办法,很强很自信很淡定(至少在我看来超级nice),P.s.是一个不秃头的熬夜冠军。 ——hyc
hyc:
我的中国好队友总是能很快找到我所需要的资料,共同讨论找到解题的办法,有很强的的学习念头和学习能力,P.s.是一个不秃头的熬夜冠军。 ——syh

posted on 2020-10-12 00:53  orange897  阅读(109)  评论(0编辑  收藏  举报