结对第二次作业——某次疫情统计可视化的实现
这个作业属于哪个课程 | 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;
}