这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2020
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2020/homework/11277
这个作业的目标 熟悉前端的开发流程,熟悉HTML、CSS、JAVASCRIPT语言以及部分框架
学号 031802420刘任世麒 031802424史金易

一、PSP表格

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

二、设计思路

在进行本次作业的网络页面设计进行之前,首先去学习了一下网页开发的有关知识,比如HTML,JavaScript之类的,然后有看了一下作业的要求,明确了主要的任务是进行树的生成和输出,然后接着,就去查了一下有关的知识,以及一些网络上的代码,有点晕。之后有看了一下其他同学写的博客,然后知道了split函数,和循环生成树的算法,然后就又去看了一下原来来的代码,大概就得到了这样的一个思路:
1,用split把输入的字符串分分割为字符串数组,并且返回此数组
2,在把数组的每一元素当成一个结点
3,通过循环来进行树的生成,如果结点是空的则生成空结点不输出反之,如果不是空的,则作为树的结点生成

三、代码和运行结果展示

(1)对输入的数据进行处理

for (const lab of labs) {
        const lines = lab.trim().split('\n')//用split函数对输入的字符串分割成字符数组
        const mentorRegex = /导师:(.+)/
        const mentor = lines[0].match(mentorRegex)[1]//用match找出导师所在的字符串
        const labData = {
            id: mentor,
            children: []
        }//生成导师的头节点的子节点
        const tmp = {}
        for (let line of lines) {
            line = line.trim()
            if (line.includes('导师')) {
                continue//如果含有“导师”的关键字,则继续
            }//生成导师的头节点
            const kv = line.split(':')
            const key = kv[0]
            const students = kv[1].split('、')
            for (let i in students) {
                students[i] = {
                    id: students[i]
                }
            }
            const year = key.match(/[0-9]+/)[0]//找出含有数字的字符元素
            const type = key.split('级')[1]//加上“级”,生成年级的结点
            if (tmp[year] === undefined) {
                tmp[year] = {}
            }//如果字符元素为空,则生成空结点
            tmp[year][type] = students
        }
        for (const key of Object.keys(tmp)) {
            const yearStds = tmp[key]
            console.log(yearStds)//使用console.log把年级数字
            const types = ['本科生', '硕士生', '博士生']
            const yearChildren = []
            types.forEach(type => {
                console.log(yearStds[type])//把“级”关键字输出
                console.log(type)//把学位输出
                if (yearStds[type] !== undefined) {
                    console.log(1)
                    yearChildren.push({
                        id: type,
                        children: yearStds[type]
                    })//形成学位的子节点
                }
            })
            console.log(yearChildren)//输出学位的子节点,名字
            const yearData = {
                id: key,
                children: yearChildren
            }
            labData.children.push(yearData)
        }
        data.push(labData)
        console.log(labData)//输出起始结点,导师名字
    }

(2)树形结构的实现
这个代码主要是对树的形状做出一定的描述

const generateGraph = (container, data) => {
    var graph = new G6.TreeGraph({
        container: container,
        width: 800,
        height: 500,
        pixelRatio: 2,
        modes: {
            default: [{
                type: "collapse-expand",
                onChange: function onChange(item, collapsed) {
                    var data = item.get("model").data;
                    data.collapsed = collapsed;
                    return true;
                }
            }
            ]
        },
        defaultNode: {
            size: 16,
            anchorPoints: [
                [0, 0.5],
                [1, 0.5]
            ],
            style: {
                fill: "#ff408c",
                stroke: "#d90909"
            }
        },
        defaultEdge: {
            shape: "cubic-horizontal",
            style: {
                stroke: "#babfa3"
            }
        },
        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: "#ff408c",
                stroke: "#d90909"
            },
            label: node.id,
            labelCfg: {
                position: node.children && node.children.length > 0 ? "left" : "right"
            }
        };
    });

    graph.data(data);
    graph.render();
    graph.fitView();

(3)页面设计部分

::-webkit-scrollbar {
            display: none;
        }
        html,
        body {
            overflow: scroll;
            margin: 0;
            background-image: url("img/timg1.jpg");
        }
        textarea {
            display:block;
            margin-left:auto;
            margin-right:auto;
        }
        button {
            display:block;
            margin-left:auto;
            margin-right:auto;
        }
        #input{
            width: 600px;
            min-height: 200px;
            background-color: aquamarine;
        }
        h1 {
            text-align: center;
            color: blueviolet;
        }

运行展示截图

目录说明与使用方法

  • 点击github上的“Clone or download”按钮后,将上述文件打包下载,解压后即可使用,需保证上述所有文件在同一个文件夹下。
  • 使用时直接用Chrome打开师门树.html文件即可,输入格式按照作业要求即可。
  • 在出现的文本框输入数据,点击生成师门树按钮,将会在下方生成一棵以导师为根节点的树,然后点击刷新按钮可以刷新页面重新输入。
posted on 2020-10-12 13:41  WuHuPilot  阅读(192)  评论(1编辑  收藏  举报