zoukankan      html  css  js  c++  java
  • 结对第二次作业——某次疫情统计可视化的实现

    这个作业属于哪个课程 2019学年02学期单红老师软件工程实践
    这个作业要求在哪里 结对第二次作业
    这个作业的目标 开发Web端疫情统计
    作业正文 https://www.cnblogs.com/ginphy/p/12506091.html
    其他参考文献 CSDN相关博客、构建之法

    GitHub仓库地址

    结对任务疫情统计
    代码规范

    成品展示

    可以点击左上方数据进行统计

    点击查看关于界面

    点击查看表格数据页

    点击省份进入该省柱状图

    点击区域统计进入柱状图界面

    柱状图变折线图

    区域统计选择省份切换

    下载可视化地图数据

    下载区域统计趋势图

    选择日期查看近期情况

    结对讨论过程

    刚拿到题目的时候,我们确定了分工,为了尽快完成,我们采用全前端的方式,彭负责数据部分,袁负责页面搭建。

    设计实现过程

    代码说明

    首页展示数据

    通过JavaScript的DOM获取选择的日期,通过日期数据在接受的json数据中寻找需要的数据,并显示,因为是按照json的读取格式,所以如果添加上后端,只要读取的数据是json所对应的数据规约模式都可以很快进行配置。

    <script>
        let select = document.getElementById("selectDate")
        let currentDate = select.options[select.selectedIndex].text;
        let obj = eval(dataJson);
        chart();
        okay.addEventListener("click",function (e){
            e.preventDefault();
            let form = document.getElementById("selectDate")
            currentDate = form.options[form.selectedIndex].text;
            chart();
        });
        function chart(){
            let num1 = document.getElementById("totalIP");
            let num2 = document.getElementById("currentSP");
            let num3 = document.getElementById("totalCure");
            let num4 = document.getElementById("totalDeath");
            num1.textContent = obj[currentDate]["全国"].current[0];
            num2.textContent = obj[currentDate]["全国"].current[2];
            num3.textContent = obj[currentDate]["全国"].current[3];
            num4.textContent = obj[currentDate]["全国"].current[4];
    <script>
    

    区域数据的加载

    利用了HTML自带的query string,获取请求访问的省份,通过参数访问“数据库”中的数据,当然也是通过js文件假扮的数据库。

    <script>
        var qs = (function(a) {
            if (a == "") return {};
            var b = {};
            for (var i = 0; i < a.length; ++i)
            {
                var p=a[i].split('=');
                if (p.length != 2) continue;
                b[p[0]] = decodeURIComponent(p[1].replace(/+/g, " "));
            }
            return b;
        })(window.location.search.substr(1).split('&'));
    
        function setSelectChecked(selectId, checkValue){  
            var select = document.getElementById(selectId);  
            for (var i = 0; i < select.options.length; i++){
                if (select.options[i].value == checkValue){  
                    select.options[i].selected = true;  
                    break;  
                }  
            }  
        }
    
        let obj = eval(dataJson);
        let pName = qs["province"];
        setSelectChecked("provinceName",pName);
    
        let okay = document.getElementById("okay");
        okay.addEventListener("click",function (e){
            e.preventDefault();
            let form = document.getElementById("provinceName")
            let selected = form.options[form.selectedIndex].text;
            location.search = "?province=" + selected;
        });
    
    </script>
    

    数据存储

    因为是纯前端的项目,所以一切数据来源于一个虚拟数据,一个js文件中有一个json格式的变量,通过访问这个变量模拟从服务器接收到的json格式的数据。

    let dataJson = {
        "2020-03-07":{
            "全国":{
                current:[81005,1324,261,63104,2700],
                add:[25,-1786,13,451,18],
                //累计确诊、现有确诊、疑似确诊、累计治愈、累计死亡
            },
            "北京":{
                current:[318,5,15,308,6],
                add:[0,-5,-4,1,0],
                //累计确诊、疑似、现有确诊、累计治愈、累计死亡
            },
            "天津":{
                current:[130,8,15,94,6],
                add:[1,-4,0,1,0],
            },
            "上海":{
                current:[510,10,15,478,6],
                add:[10,-2,10,1,0],
            },
            "重庆":{
                current:[40,4,15,308,6],
                add:[5,4,2,1,0],
            },
            "河北":{
                current:[401,10,15,344,6],
                add:[2,-1,2,1,0],
            },
            //........
        }
    }
    

    责任链模式-MyHandler

    责任链模式可以很方便地拓展需求,一个类的修改不会影响另外一个类,利用Handler虚拟类,衍生出所有处理各类情况的类,确保可以处理每一种情况的文本,同时也减少了程序的耦合性,方便阅读。

    class DataManager{
        public static List<int[]> solveData(List<String>data){
            List<int[]> result = new LinkedList<int[]>();
            ListInit(result);
            System.out.println("建立责任链");
            AddipHandler addip = new AddipHandler(result);
            AddSpHandler addSp = new AddSpHandler(result);
            ChangeHandler change = new ChangeHandler(result);
            CureHandler cure = new CureHandler(result);
            DeathHandler death = new DeathHandler(result);
            ExcludeHandler exclude = new ExcludeHandler(result);
            SwapIpHandler swapIp = new SwapIpHandler(result);
            SwapSpHandler swapSp = new SwapSpHandler(result);
            addip.nextHandler = addSp;
            addSp.nextHandler = change;
            change.nextHandler = cure;
            cure.nextHandler = death;
            death.nextHandler = exclude;
            exclude.nextHandler = swapIp;
            swapIp.nextHandler = swapSp;
            swapSp.nextHandler = null;
            System.out.println("建立责任链完成,开始处理文本");
            Iterator<String> it = data.iterator();
            while(it.hasNext()) {
                String s = it.next();
                addip.handleRequest(s);
            }
            System.out.println("---文本处理完成");
            return result;
        }
        //......
    }
    

    阅读体会

    结对过程中我们会接触到很多我们之前可能不常用的软件或者语言,包括能力想法方面的差异,我们如何在队伍中寻找到平衡点,是非常重要的,当然,我们每个人既然有分工就要相信队友的能力,遵守代码规范、清楚标记注释方便复审者的查阅,遵守约定的好处就是可以避免很多不必要的繁文缛节,减少团队工作错误的发生。两人合作可以互相激励、互相配合、互相学习同时也能互相交流,良好的团队合作可以取得更高的产出投入比。
    因为两人合作的过程会经历很多阶段,萌芽、磨合、规范、创造、解体。在这些过程中,我们可以寻找到合适的方式和方法,让我们更快地找到团队合作的最优解。

    结对总结与队友评价

    【对Ginphy的评价&总结】

    本来我打算自学python然后马上投入到爬取数据的工作中,后面发现学习python其实需要的时间也比较多,后面打算利用js直接模拟一个虚拟数据库出来,毕竟前端获取后端的数据也是一段字符串,所以我就在这个字符串上面做了一些文章,以前对于JavaScript不是特别熟悉,但是结对作业的时候就有时间去学习,因为页面的搭建是队友的工作,而我们俩互相配合,的确完成了基础功能,也算是不虚此行。
    队友评价:基本都是语音交流,所以有什么问题都能尽快解决,学习能力强,能够灵活运用新接触的知识,结对编程可能不仅仅是考验两个人的代码能力,更是考验学习能力和沟通能力,我觉得这方面队友做的很棒。

    【对pc浩的评价&总结】

    这次结对作业我担任的是前端部分,一开始看见作业要求里说要学这学那的感觉一头雾水无从下手。然后问了别人都说先学echart然后就去找了echart的简书教程。捣鼓了半天发现原来只要安装一个Js文件然后再在html里面修改option就好了啊...但是要做到美观果然还是有很大的困难,尤其是想要做到和原型中一样的排版设计就更困难了...最后还是选择了使用其他的排版设计,前端真的很需要审美和对工具的熟练运用。不然很难实现自己想要的效果啊。两个人使用github感觉体会不是很深刻,相比较同时期的团队实践来说的话。
    队友评价:很可靠的队友,经常有啥问题我们就直接打QQ电话交流,包括这次本来是直接设置成github里的contributer然后我没注意自己fork了一个库这类插曲,后来都在我们一通通语音电话里解决了。然后经常互相抱怨作业好难,不过还是合作愉快啦!

      希望以后的生活一日三餐,一年四季。

  • 相关阅读:
    Note/Solution 转置原理 & 多点求值
    Note/Solution 「洛谷 P5158」「模板」多项式快速插值
    Solution 「CTS 2019」「洛谷 P5404」氪金手游
    Solution 「CEOI 2017」「洛谷 P4654」Mousetrap
    Solution Set Border Theory
    Solution Set Stirling 数相关杂题
    Solution 「CEOI 2006」「洛谷 P5974」ANTENNA
    Solution 「ZJOI 2013」「洛谷 P3337」防守战线
    Solution 「CF 923E」Perpetual Subtraction
    KVM虚拟化
  • 原文地址:https://www.cnblogs.com/ginphy/p/12506091.html
Copyright © 2011-2022 走看看