2020软件工程第五次作业

这个作业属于那个课程 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1
这个作业的要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10619
目标 结对编程实现家族树
作业正文 如下‘
参考文献 CSDN 博客园 百度

GitHob地址:https://github.com/guxing111/20157626-20177680

结对成员:张浩 20177680

                  颜悠 20157626

分工:张浩负责代码编写,归纳总结

           颜悠负责UI设计,素材收集

psp表格

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

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

1)代码组织与内部实现设计

利用jQuery EasyUI 插件实现基础菜单树,构建输入文本信息的文本框,以及点击即生成树的按钮,对文本信息进行切割生成各节点。

2)代码的关键与关键实现部分流程

 

 

  for (var i = 0; i < arrstr.length;) {
                var j;
                for (j = i; j < arrstr.length; j++) {
                    if (arrstr[j] == "") {
                        break;
                    }
                }
                var item = arrstr[i].split(':');
                var tp = item[1];
                next[tp] = [];
                level[tp] = item[0];
                // console.log(tp);
                vi.push(tp);
                for (var l = i + 1; l < j; l++) {
                    for (var val of x) {
                        //console.log(val);
                        if (arrstr[l].indexOf(val) != -1) {
                            var item1 = arrstr[l].split(':');
                            var z = item1[0] + tp;
                            // console.log(z);
                            next[tp].push(z);
                            level[z] = val;
                            next[z] = [];
                            f[z] = 1;
                            vi.push(z);
                            break;
                        }
                    }
 
                    var s = item1[1].split('、');
                    for (var val of s) {
                        console.log(val);
 
                        next[z].push(val);
                        f[val] = 1;
                        level[val] = item1[0];
                        vi.push(val);
 
 
 
                    }
                }
                i = j + 1;
 
            }
            for (var val of vi) {
 
                if (f[val] == null) {
                    // console.log(val);
                    var root = dfs(val, -1);
                    //console.log(root);
                }
            }
            function dfs(u, fa) {
                var ss;
                ss = {};
                ss.name = u;
                ss.children = [];
                var v = next[u];
                if (v == null) {
                    return ss;
                }
                for (var i = 0; i < v.length; i++) {
                    ss.children.push(dfs(v[i], u));
                }
                if (u.indexOf(fa) != -1) {
                    var t = u.substring(0, u.indexOf(fa));
                    ss.name = t;
                }
                return ss;
            }
            var svg;
            d3.selectAll("svg").remove();
            var margin = { top: 50, right: 20, bottom: 20, left: 20 },
                width = 2300 - margin.right - margin.left,
                height = 2300 - margin.top - margin.bottom;
            s
 
 
            var i = 0,
                duration = 750;//过渡延迟时间
 
 
            var tree = d3.layout.tree()//创建一个树布局
                .size([height, width]);
 
            var diagonal = d3.svg.diagonal()
                .projection(function (d) { return [d.x, d.y]; });//创建新的斜线生成器
 
 
            // Setup zoom and pan
            var zoom = d3.behavior.zoom()
                .scaleExtent([.1, 1])
                .on('zoom', function () {
                    svg.attr("transform", "translate(" + d3.event.translate + ") scale(" + d3.event.scale + ")");
                });
 
            //声明与定义画布属性
            svg = d3.select("body").append("svg")
                .attr("width", width + margin.right + margin.left)
                .attr("height", height + margin.top + margin.bottom)
                .call(zoom)
                .append("g")
                .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
 
 
            //treeData为上边定义的节点属性
            root.x0 = height / 2;
            root.y0 = 0;
 
            update(root);
 
            d3.select(self.frameElement).style("height", "1600px");
 
            function update(source) {
 
                // Compute the new tree layout.计算新树图的布局
                var nodes = tree.nodes(root).reverse(),
                    links = tree.links(nodes);
 
                // Normalize for fixed-depth.设置y坐标点,每层占250px
                nodes.forEach(function (d) { d.y = d.depth * 250; });
 
                // Update the nodes…每个node对应一个group
                var node = svg.selectAll("g.node")
                    .data(nodes, function (d) { return d.id || (d.id = ++i); });//data():绑定一个数组到选择集上,数组的各项值分别与选择集的各元素绑定
 
                // Enter any new nodes at the parent's previous position.新增节点数据集,设置位置
                var nodeEnter = node.enter().append("g")  //在 svg 中添加一个g,g是 svg 中的一个属性,是 group 的意思,它表示一组什么东西,如一组 lines , rects ,circles 其实坐标轴就是由这些东西构成的。
                    .attr("class", "node") //attr设置html属性,style设置css属性
                    .attr("transform", function (d) { return "translate(" + source.y0 + "," + source.x0 + ")"; })
                    .on("click", click);
 
                //添加连接点---此处设置的是圆圈过渡时候的效果(颜色)
                // nodeEnter.append("circle")
                //   .attr("r", 1e-6)
                //   .style("fill", function(d) { return d._children ? "lightsteelblue" : "#357CAE"; });//d 代表数据,也就是与某元素绑定的数据。
                nodeEnter.append("rect")
                    .attr("x", -20)
                    .attr("y", -15)       //结点位置
                    .attr("width", 50)      //矩形宽高
                    .attr("height", 50)
                    .attr("rx", 10)
                    .attr("fill", function (d) {
                        //创建人物图片
                        var defs = svg.append("defs").attr("id", "imgdefs")
 
                        var catpattern = defs.append("pattern")
                            .attr("id", "pat")
                            .attr("height", 1)
                            .attr("width", 1)
                            .attr("patternContentUnits", "objectBoundingBox")
 
                        catpattern.append("image")
                            .attr("width", "1.4")
                            .attr("height", "1")
                            .attr("xlink:href", "http://img.mp.sohu.com/upload/20170612/817b54ced4694d61b7fc1b0111c75450_th.png")
 
                        return "url(#pat)";
 
                    })

 

 nodeEnter.append("text")
                    .attr("x", function (d) { return d.children || d._children ? 13 : 13; })
                    .attr("dy", "50")
                    .attr("text-anchor", "middle")
                    .text(function (d) { return d.name; })
                    .style("fill", "#2dbb8a")
                    .style("fill-opacity", 1);
                // Transition nodes to their new position.将节点过渡到一个新的位置-----主要是针对节点过渡过程中的过渡效果
                //node就是保留的数据集,为原来数据的图形添加过渡动画。首先是整个组的位置
                var nodeUpdate = node.transition()  //开始一个动画过渡
                    .duration(duration)  //过渡延迟时间,此处主要设置的是圆圈节点随斜线的过渡延迟
                    .attr("transform", function (d) { return "translate(" + d.x + "," + d.y + ")"; });//YES
 
 
                // Transition exiting nodes to the parent's new position.过渡现有的节点到父母的新位置。
                //最后处理消失的数据,添加消失动画
                var nodeExit = node.exit().transition()
                    .duration(duration)
                    .attr("transform", function (d) { return "translate(" + source.x + "," + source.y + ")"; })//YES
                    .remove();
 
                // Update the links…线操作相关
 
                //再处理连线集合
                var link = svg.selectAll("path.link")
                    .data(links, function (d) { return d.target.id; });
 
 
                // Enter any new links at the parent's previous position.
                //添加新的连线
                link.enter().insert("path", "g")
                    .attr("class", "link")
                    .attr("d", function (d) {
                        var o = { y: source.x0, x: source.y0 };//YES
                        return diagonal({ source: o, target: o });  //diagonal - 生成一个二维贝塞尔连接器, 用于节点连接图.
                    })
                    .attr('marker-end', 'url(#arrow)');
 
                // Transition links to their new position.将斜线过渡到新的位置
                //保留的连线添加过渡动画
                link.transition()
                    .duration(duration)
                    .attr("d", diagonal);
 
                // Transition exiting nodes to the parent's new position.过渡现有的斜线到父母的新位置。
                //消失的连线添加过渡动画
                link.exit().transition()
                    .duration(duration)
                    .attr("d", function (d) {
                        var o = { x: source.x, y: source.y };//NO
                        return diagonal({ source: o, target: o });
                    })
                    .remove();
 
                // Stash the old positions for transition.将旧的斜线过渡效果隐藏
                nodes.forEach(function (d) {
                    d.x0 = d.y;
                    d.y0 = d.x;
                });
            }

 

附加特点设计与展示

1.设计的创意独到之处

    设计了文本框填写信息界面的文字引导

2.实现思路

    在信息输入部分代码加入文字引导

结果展示:

 

 

遇到的问题

问题描述:js语言不熟悉,导致很多语法错误和逻辑错误;文本框和按钮格式别扭

解决方法:百度&知乎&B站&问同学

                  主要是查看各大官网以及学习网站(例如:W3school  jQuery官网等)

是否已解决:已解决

收获:学会了一些html+css+js语言的正确操作

 

 评价你的队友

值得学习的地方
因为一开始和队友都毫无头绪,就选择分头行动,一起熬夜,差一点点就做出两种版本的树啦哈哈,感谢队友的任劳任怨!
需改进的地方

对于编程还要学很多东西。

 

你可能感兴趣的:(2020软件工程第五次作业)