软件工程 [https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1]
作业要求 [https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10619]
作业目标 结对完成在网页页面呈现树形结构形式的师门树
作业正文 [https://www.cnblogs.com/wufang/p/12719382.html]
其他参考文献 [https://www.cnblogs.com/xiaowenshu/p/10450848.html]

我的github项目链接:https://github.com/filter33/20177640-20177585

结对信息

姓名 学号 博客地址
王颖 20177640 https://home.cnblogs.com/u/serendipity5/
陈沛 20177585 https://home.cnblogs.com/u/wufang/

具体分工

  • 王颖:代码实现,输入数据处理,单元测试
  • 陈沛:资料查找,博客撰写

PSP表格

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

解题思路描述与设计实现说明

解题思路:
  • 在文本框中输入数据,将数据放入数组中放入数组
  • 将数组中的数组进行分割
  • 在div块中动态生成无序列表
  • 设置css格式
  • 使用G6框架生成有动画的树形图
设计实现:

从表单读取数据(html):

<div id="input">
      <textarea id="intext" rows="20" cols="40" wrap="hard"></textarea>
     <button id="btn">点击生成家族树</button>
 </div>

btn连接到html中id=:btn"的按钮,发生“单击"(onclick)事件时,text读入并赋值为id为intext

的多行文本框中字符串:

 const btn = document.getElementById('btn');
      btn.onclick = () => {
           var text = document.getElementById('intext').value;

框架所需的数据结构:

 function point(the_id) {   //点对象的构造函数
                this.id = the_id;
                this.children = [];
           }

输入数据变为指定生成树的数据格式:

           var text = document.getElementById('intext').value;
       
           function point(the_id) {   //点对象的构造函数
                this.id = the_id;
                this.children = [];
           }
           var i = 0;
           var heighpoint = 0;//新画布的高度位置
           var j = 0;//作为在后面遍历数组用变量;
           var k = 0;//作为在输出遍历数组用变量;
           var teacher = /^导师:(.+)$/;//用于查找老师的正则表达式
           var grade = /^(.+):(.+)$/;//用于查找年级和学位的正则表达式
           var studentstr = "";//学生的字符串(后用)
           var data = [];//存储数据,之后转成JSON传送至绘图api
           var blocks = text.split("\n\n");//第一次拆分,拆分出大块
           for (j = 0; j < blocks.length; j++) {
                var lines = blocks[j].split('\n');//按行划分
                data.push(new point(teacher.exec(lines[0])[1]));//创建并返回一个老师节点压入data内(第0行)
                for (i = 1; i < lines.length; i++) {
                     if (lines[i] === "") {
                          break;
                     }
                     var p = new point(grade.exec(lines[i])[1]);
                     data[j].children.push(p);//创建并返回一个学历节点压入老师节点内
                     studentstr = grade.exec(lines[i])[2];//划分出学生字符串
                     var students = studentstr.split('、');
                     for (var student of students) {
                          var stu = new point(student);
                          data[j].children[i - 1].children.push(stu);//将学生节点压入学历节点内
                     }
                }
           }

生成家族树函数:

           function h(data) {
                var graph = new G6.TreeGraph({
                     container: 'mountNode',
                     width: window.innerWidth / 2,//设置画布宽度为1/2屏幕
                     height: window.innerHeight / 2,//设置画布高度为1/2屏幕
                     pixelRatio: 2,
                     modes: {
                          default: [{
                               type: 'collapse-expand',
                               onChange: function onChange(item, collapsed) {
                                    var data = item.get('model').data;
                                    data.collapsed = collapsed;
                                    return true;
                               }
                          }, 'drag-canvas', 'zoom-canvas']
                     },
                     defaultNode: {
                          size: 16,
                          anchorPoints: [[0, 0.5], [1, 0.5]],
                          style: {
                               fill: '#40a9ff',
                               stroke: '#096dd9'
                          }
                     },
                     defaultEdge: {
                          shape: 'cubic-horizontal',
                          style: {
                               stroke: '#A3B1BF'
                          }
                     },
                     layout: {
                          type: 'compactBox',
                          direction: 'LR',
                          getId: function getId(d) {
                               return d.id;
                          },
                          getHeight: function getHeight() {
                               return 16;
                          },
                          getWidth: function getWidth() {
                               return 16;
                          },
                          getVGap: function getVGap() {
                               return 10;
                          },
                          getHGap: function getHGap() {
                               return 100;
                          }
                     }
                });
                graph.node(function (node) {
                     return {
                          size: 26,
                          style: {
                               fill: '#40a9ff',
                               stroke: '#096dd9'
                          },
                          label: node.id,
                          labelCfg: {
                               position: node.children && node.children.length > 0 ? 'left' : 'right'  
                          }
                     };
                });
                graph.data(data);
                graph.render();
                graph.fitView();
           };

指定生成树是数据格式传入函数:

   for (k = 0; k < blocks.length; k++) {
                h(data[k]);//给它的函数命了个名为h,data为我们储存规格化后数据的数组
           }
      }

流程图:

实现结果如图:

生成一棵家族树:

输入两组数据,生成两颗家族树:

在博客中给出目录说明和使用说明

目录和使用说明:

就一个ftree.html(包括html+css+JavaScript)和图片h.jpg(GitHub中图片传了好久都传不上去放弃了,反正图片不是重点)

在GitHub中点击Clone or download—— Download ZIP ,然后直接打开ftree.html

输入:

学术家族树以文本形式输入在网页上的文本框,点击生成家族树;考虑学术家族树的文本格式是这样的:

导师:张三
2016级博士生:天一、王二、吴五
2015级硕士生:李四、王五、许六
2016级硕士生:刘一、李二、李三
2017级本科生:刘六、琪七、司四

其中,"导师:","级博士生:","级硕士生:","级本科生:"和"、"当做关键词处理;若有多组输入,中间空一行。每次输入新数据请刷新页面重新输入

两组输入:

导师:张三
2016级博士生:天一、王二、吴五
2015级硕士生:李四、王五、许六
2016级硕士生:刘一、李二、李三
2017级本科生:刘六、琪七、司四

导师:张三
2016级博士生:天一、王二、吴五
2015级硕士生:李四、王五、许六
2016级硕士生:刘一、李二、李三
2017级本科生:刘六、琪七、司四

输出:

树的节点鼠标点击是可以收缩的,树的大小也可以用鼠标改变;鼠标也可以移动树的位置。

单元测试

[www.mamicode.com/info-detail-2651365.html]

单元测试过程:把eclipse的浏览器设置为Google Chrome,运行代码,然后单击网页右键选择检查,就会出来以下页面

根据学习链接在sources里面选择要测试的函数断点,然后在左边文本框内输入数据,点击生成家族树,还可以在Performance和Memory中查看代码的profiles等。

  • 展示出项目部分单元测试代码,并说明测试的函数

测试的function point(the_id)和function h(data)

贴出Github的代码签入记录

遇到的代码模块异常或结对困难及解决方法

  • 问题描述:
    1、对于题目的理解
    解决方法:多查资料,看看别人写的,题目懂了才能开始写。

    2、代码问题
    解决方法:基础太差没办法,只能借鉴网上的代码(虽然但是也有问题),然后自己尽自己能力慢慢修改

    3、文本框不能在背景图里面
    解决方法:百度后用的
    body background="h.jpg"
    style=" background-repeat:no-repeat ;
    background-size:100% 100%;
    background-attachment: fixed;" 形式成功解决

    4、输入格式出现问题,无法正产生家族树。
    解决方法:百度,询问同学。

    5、单元测试
    解决方法:一开始看别人用的mocha就百度mocha的教程,安装了一下午的Note.js(虽然文件很小但是在官网下载真的要命,最后没办法还是找的其他网站),但是都安装好后,我实在是看不懂它的操作步骤,不知该怎么用它正确的进行单元测试,然后又寻找其他的方法,选择了用 Google Chrome,最后的结果不知道是不是正确的,但我真的尽力了。

评价你的队友

  • 值得学习的地方:积极主动认真,能及时给出方向,加以引导。
  • 需要改进的地方:是我们都需要改进的方面,基础知识的学习不太够。
 posted on 2020-04-17 13:36  无妨·  阅读(174)  评论(0编辑  收藏  举报