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

    这个作业属于哪个课程 2020春|S班 (福州大学)
    这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/2020SPRINGS/homework/10460
    这个作业的目标 1.采用web技术来实现上一次作业原型中的功能
    2.来自大公司的代码规范
    3.结对使用github
    作业正文 https://www.cnblogs.com/GaogaoBlog/p/12503929.html
    其他参考文献

    目录

    一.GitHub仓库

    InfectStatisticWeb

    二、代码规范

    [博客 Gao_JAVA编程规约]

    三、成果展示

    ![](https://img2020.cnblogs.com/blog/1934203/202003/1934203-20200316225850897-532487591.png) ![](https://img2020.cnblogs.com/blog/1934203/202003/1934203-20200316225927147-1746754855.png)



    四、讨论过程

    隔着千山万水的两个人用QQ努力交流ing

    这是讨论的结果↓ 包括本次作业的流程 需求分析 实现方式 及分工
    这次原型的实现主要是基于JSP技术,由Html、JavaScript、Java构成,页面的显示由前端负责,数据处理由数据端连接本地的数据库实现。

    五、设计

    这个是关于数据结构的一些设计
    静态数据是日志文件,通过MYSQL数据库来管理,由BaseDao封装所有对数据的查询,返回需要的对象,由前台实现数据的显示

    六、代码说明

    1.文件的管理LogFiles类

    public class LogFiles {
        String lastDate;
        TreeSet<File> files;
    
        public LogFiles(String path) {
            File logFile = new File(path);
            File[] temp = logFile.listFiles();
            files = new TreeSet<File>(new Comparator<File>() {
                @Override
                // 文件按日期排序 重写匿名内部类Comparator的compare()
                public int compare(File f0, File f1) {
                    String name0 = f0.getName();
                    String name1 = f1.getName();
                    // 按年份月份日期依次比较时间前后
                    if (Integer.parseInt(name0.substring(0, 4)) < Integer.parseInt(name1.substring(0, 4))) {
                        return -1;
                    }
                    if (Integer.parseInt(name0.substring(0, 4)) > Integer.parseInt(name1.substring(0, 4))) {
                        return 1;
                    }
                    if (Integer.parseInt(name0.substring(5, 7)) < Integer.parseInt(name1.substring(5, 7))) {
                        return -1;
                    }
                    if (Integer.parseInt(name0.substring(5, 7)) > Integer.parseInt(name1.substring(5, 7))) {
                        return 1;
                    }
                    if (Integer.parseInt(name0.substring(8, 10)) < Integer.parseInt(name1.substring(8, 10))) {
                        return -1;
                    }
                    if (Integer.parseInt(name0.substring(8, 10)) > Integer.parseInt(name1.substring(8, 10))) {
                        return 1;
                    }
                    return 0;
                }
    
            });
            for (int i = 0; i < temp.length; ++i) {
                files.add(temp[i]);
            }
    
            lastDate = files.last().getName().substring(0, 10);
        }
    }
    
    

    2.统计某个日志文件的数据

        public static void statisFile(File f, Statistic sta) {
            //读每个日志前 今日新增清0
            for(String keytemp:sta.data.keySet()) {
                (sta.data.get(keytemp))[4]=0;
            }
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f), "UTF-8"));
                String line;
                while ((line = br.readLine()) != null) {
                    // 忽略'/'开头的行
                    if (line.startsWith("/")) {
                        continue;
                    }
                    LogFiles.statisLine(line, sta);
                }
                br.close();
                
                // 各省数据统计到全国
                int[] all = { 0,0, 0, 0, 0 };
                for (String keytemp : sta.data.keySet()) {
                    int[] valuetemp = sta.data.get(keytemp);
                    for (int i = 0; i < 5; ++i) {
                        all[i] += valuetemp[i];
                    }
                }
                sta.data.put("全国", all);
                
            } catch (Exception e) {
                System.err.println(e);
            }
        }
    

    3.实现按顺序处理日志

        // 比较两个YYYY-MM-DD日期字符串 若date0大于等于date1 则返回true
        static boolean dateCompare(String date0, String date1) {
            // 按年份月份日期依次比较时间前后
            if (Integer.parseInt(date0.substring(0, 4)) < Integer.parseInt(date0.substring(0, 4))) {
                return false;
            }
            if (Integer.parseInt(date0.substring(0, 4)) > Integer.parseInt(date1.substring(0, 4))) {
                return true;
            }
            if (Integer.parseInt(date0.substring(5, 7)) < Integer.parseInt(date1.substring(5, 7))) {
                return false;
            }
            if (Integer.parseInt(date0.substring(5, 7)) > Integer.parseInt(date1.substring(5, 7))) {
                return true;
            }
            if (Integer.parseInt(date0.substring(8, 10)) < Integer.parseInt(date1.substring(8, 10))) {
                return false;
            }
            if (Integer.parseInt(date0.substring(8, 10)) > Integer.parseInt(date1.substring(8, 10))) {
                return true;
            }
            return true;
        }
    

    4.BaseDao的数据部分

    public class BaseDao {
        // 数据库连接
        private static final String URL = "jdbc:mysql://localhost:3306/infectprovince";
        // 驱动
        private static final String DRIVER = "com.mysql.jdbc.Driver";
        // 用户名
        private static final String USRE = "root";
        // 用户密码
        private static final String PWD = "ggsqsjzcmd";
    
        private static final String[] PROVINCESORT_STRINGS = { "全国", "安徽", "北京", "重庆", "福建", "甘肃", "广东", "广西", "贵州", "海南",
            "河北", "河南", "黑龙江", "湖北", "湖南", "江西", "吉林", "江苏", "辽宁", "内蒙古", "宁夏", "青海", "山西", "山东", "陕西", "上海", "四川", "天津",
            "西藏", "新疆", "云南", "浙江" };
    
        /**
         * @throws Exception 获取数据库连接
         */
        Connection conn = null;
        String sql = null;
        Statement s = null;
        ResultSet rs = null;
    }
    

    5.根据日志,在数据库中建表 若存在则直接返回

    public void createTables(String path) throws Exception {
    
            // 数据读取
            LogFiles logs = new LogFiles(path);
            Statistic sta = new Statistic();
            String tableName;
    
            // 建省份表
            createProvinceTables();
    
            for (File f : logs.files) {
                tableName = f.getName().substring(0, 10);
                LogFiles.statisFile(f, sta);
                if (existDateTable(tableName)) {
                    continue;
                }
                createDateTable(tableName, sta);
                updateProvinceTables(tableName, sta);
            }
            return;
        }
    

    6.查询数据库 并返回JSON的格式的字符串

        public String searchNowipByProvince(String date) throws Exception {
    
            getConnection();
            sql = "SELECT
    " + "nowip,
    " + "province
    " + "FROM `" + date + "`";
            rs = s.executeQuery(sql);
            Map<String, Integer> map = new HashMap<String, Integer>();
    
            rs.beforeFirst();
            while (rs.next()) {
                String province = rs.getString("province");
                Integer nowip = rs.getInt("nowip");
                map.put(province, nowip);
            }
            closeConnection();
            map.remove("全国");
            String result = BaseDao.intMaptoJson(map);
            return result;
        }
    
        static String intMaptoJson(Map<String, Integer> map) {
            String result = "[";
            String stmp;
            for (String key : map.keySet()) {
                stmp = "{ name: '" + key + "',value: " + map.get(key).toString() + "}";
                result = result + stmp + ",";
            }
            result = result.substring(0, result.length() - 1);
            result += "]";
            return result;
        }
    

    7.查询数据库 并返回ProvinceByDate存放数据

        public ProvinceByDate searchProvinceByDate(String province) throws Exception {
            String stmp = province.replace(""", "");
    
            ProvinceByDate pbd = new ProvinceByDate(stmp);
    
            getConnection();
            sql = "SELECT * FROM `" + stmp + "`";
            rs = s.executeQuery(sql);
    
            rs.beforeFirst();
            while (rs.next()) {
                String date = rs.getString("date");
                int[] tmp = { 0, 0, 0, 0, 0 };
                tmp[0] = rs.getInt("allip");
                tmp[1] = rs.getInt("nowip");
                tmp[2] = rs.getInt("sp");
                tmp[3] = rs.getInt("cure");
                tmp[4] = rs.getInt("dead");
                pbd.add(date, tmp);
            }
    
            closeConnection();
            return pbd;
        }
    

    七、总结和收获

    - [ ] 心路历程和收获 221701306:又又又一次艰难的作业,两个ddl选手生死时速ing。比起上一次来说,这次分工做的好很多,但是由于两个人都没有学过框架,艰难地搭了环境之后摇摇晃晃地开始作业。这次做的是数据处理的part,emm,感觉自己还是有很多不足,也收获了很多叭。感觉自己对框架还要再熟悉一点才行(一个学习路线图写了前端的憨憨如是说),作业之后会再花一点时间学习JSP框架的。觉得这次作业最大的困难的结对过程中没法面对面交流,沟通中障碍还是很多的,幻想了一下邹欣老师说的两台电脑并排编程,留下了羡慕的泪水。立一个flag:远离ddl。 221701409:继上次的原型后,这次迎来了实现。一开始没有什么思路,先分工了各自要做的部分,然后就和队友前后端各自进行中。花了两个晚上搭了jsp的环境,经历了eclipse在线崩溃,家里的wifi网络极不稳重到甚至断掉,热点和wifi切来切去的崩溃后,搭上了。然后新学了echarts,但是对于数据处理并不太会操作,就一直问小伙伴寻求帮助,同时还要想办法和队友把数据连接上。www有时候是真的毫无头绪,多亏小伙伴一直给我指点迷津,才能一步步坚持下去,队友也超给力,根据我需要的数据写jsp,后期还要调试,都在一起努力。过程很难,头大,很惆怅,觉得自己好菜,遇到很多不懂的,一直在想办法解决。但是也收获了很多,对于html和css还有js的使用比以前更熟练,新学会了charts,可以用来制作各种图表。对github的使用也更加了解和熟练了…虽然每次作业的过程都艰难而又惆怅,但是都有所收获,继续加油呀!~(⁎⁍̴̛ᴗ⁍̴̛⁎) - [ ] 评价队友 221701306:小姐妹下次一起加油哇。 221701409:队友很棒~平时都是一起玩儿,没有一起合作做过作业。这两次一起合作写了作业,发现队友后端编码能力很棒。哈哈哈哈哈哈哈不愧是我的小姐妹 超棒der!一起继续加油呀!
  • 相关阅读:
    [ZT]The 10 best crossplatform applications
    [Today Words] 20090602
    [转] 各种豆浆的做法(搭配美图) 超赞!!不得不看哦~
    .NET Framework Tools
    格式化XML:输出有缩进效果的XML字符串
    The Open Source Definition
    【ZT】新东方10天背5500词汇经典讲座
    《代码大全2》阅读笔记16 Chapter 13 Unusual Data Types
    【ZT】C#语法之fixed 语句
    【MSDN】PDB 文件(C#、J# 和 Visual Basic)
  • 原文地址:https://www.cnblogs.com/GaogaoBlog/p/12503929.html
Copyright © 2011-2022 走看看