结对第二次作业——某次疫情统计可视化的实现

这个作业属于哪个课程 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\r\n" + "nowip,\r\n" + "province\r\n" + "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!一起继续加油呀!
posted @ 2020-03-16 22:43  某糕  阅读(312)  评论(1编辑  收藏  举报