项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE |
这个作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/12416880.html |
我的课程学习目标 | 项目的开发,用github实现项目的托管 |
这个作业在哪些方面帮助我实现学习目标 | Excel连接sql server,Java连接sql server |
项目Github的仓库链接地址 | https://github.com/banmianzhuang02 |
任务一
疫情每日上报子系统使用体验
最初疫情每日上报子系统设计内容不够完善,填写信息时也存在每日都需要填写一遍个人信息。不过,后期这个问题解决了。不过近期填报时出现提交不了的情况,时间未超过提交时间,但是现实提交异常。
任务二
总结详细阅读《构建之法》第1-2章、结合第2章2.3节所述PSP流程,开发一款你自己心目中的西北师范大学学生疫情每日填报系统。你可在以下两类开发要求选择一种完成项目开发任务
我选择第一类项目开发
第一类开发要求:
有一个数据文件,保存了100天 2000 个教职工/学生的所有防疫信息,请设计一个命令行程序, 支持查询某人在某一天的疫情情况, 查询某种数据的周/月的疫情统计情况,并用柱状图显示统计结果。
第二类开发要求:
1. 系统可采集学生疫情有效信息;
2. 系统支持用户在线使用;
3. 每日只可填报一次,提交后无法修改,每日十点疫情信息填报截止;
4. 各学院指定负责人登录系统,可查看本学院学生填报的汇总数据,可点击查看学生联系方式、班主任联系方式,学院负责人核实本院所有学生数据后,将数据提交给学校防控办;
5. 学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有学生填报汇总数据清单,通过【导出】可获取疫情数据的EXCEL文件。
项目开发背景
2019年12月末,中国武汉发生新型冠状病毒(2019-nCoV) 感染的肺炎疫情,为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施: 2020年1 月23 日10时起对武汉“封城”,全国 31个省市也相继实施了严格的防控措施;全国各省市向武汉和湖北派遣医疗队参与救治工作;在全国范围内调配口罩、防护服、药品等急需的医疗资源支援武汉;指导和督促全国范围内拥有医疗物资生产资质的企业尽快恢复生产能力;定向拨付专项财政资金用于疾病防控;从其他省份调集物资保障武汉市民日常生活。
值得一提的是,中国互联网企业在此次疫情防控中发挥了社会治理方面的重要作用。以腾讯为例,围绕应对疫情管控需求开发了十一款产品。其中疫情在线问诊功能,对于减少发热病人之间的相互交叉感染具有重要的作用,患者在家通过互联网向在线医生问诊,减少了病毒传播或感染的风险;谣言粉碎对于公众采取理性态度看待疫情的发展具有重要意义。滴滴出行还在武汉专门组建车队,服务于医护人员的通勤,这在实施交通管制的武汉具有重要作用。此外,还有新型肺炎确诊患者同行程查询工具,用户只需要输入自己所乘坐交通工具的时间和班次,就可以确认是否与被确诊感染者同行,提前做好自我隔离和就诊工作。在疫情防控中,中国互联网企业不仅发展壮大,在承担社会责任方面也越来越成熟。
为有效配合防控机构有关疫情信息的采集、统计与排查,我校开发了教职工/学生疫情上报系统,该系统由教职工疫情每日上报、学生疫情每日上报、二级部门疫情每日汇总表、疫情防控填报统计四个子系统组成。实现对我校各类人员基本情况、所在区域及活动轨迹及健康状况的信息收集。师生通过我校企业微信服务大厅访问该系统进行远程信息填报。
需求分析
截至 2020 年 1 月 30 日,距离 2019年12月武汉发生疫情至今已 1 月有余,武汉 1 月 23 日隔离至今已8 天,据世界卫生组织报告,截至 1 月 31 日,虽然全球(除中国外)发现新型冠状病毒 2019-nCoV 感染病例的国家数目前为 18个,各国累计确诊病例为 82 例,但主要为散发病例,未出现死亡病例和社区传播。
中国正以最快的速度建造3座应急性传染病专科医院,其中黄冈“小汤山”医院——大别山区域医疗中心已于元月 28 日投入使用,可容纳 1000 张病床;武汉目前在建的火神山医院为 3.4 万平方米,1000 张病床,雷神山医院 7.5万平方米,1500 张病床,从开工到交付均在 10 天内,将分别于2月3日和5日投入使用。
--引自《中国抗击新型冠状病毒:进展和影响》
在此情况下,疫情信息的统计、查询、数据的图形显示迫在眉睫,我们迫切需要快捷又方便的统计疫情数据并查询疫情信息的简易项目软件或是系统,对疫情信息做进一步的监控和进展观察与预测。
功能设计
基本功能:
<1>、用excel录入数据。
<2>、sql导入excel统计表格。
<3>、java连接sql。
<4>、java实现数据查询
<5>、java实现柱状图
<6>、退出程序
设计实现
测试运行
Excel中数据
Excel中数据导入sql server
数据库信息查询
java连接数据库
粘贴自己觉得比较独特的或满意的代码片段,用博客园代码控件来显示
package helloeclipse;
import java.sql.*;
class HelloWorld {
public static void main(String [] args)
{
String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver";
String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=information"; // studentmanager为数据库名
String userName="sa"; // 登录账户名
String userPwd="19980909"; // 密码
try
{
Class.forName(driverName);
Connection dbConn=DriverManager.getConnection(dbURL,userName,userPwd);
System.out.println("连接数据库成功");
}
catch(Exception e)
{
e.printStackTrace();
System.out.print("连接失败");
}
}
}
实验过程中,多次导入生成柱状图、饼状图等图形的包,未能导进去。所以后续的实验操作还未做完,但是没有jar包程序显示很多错误。
总结
实验过程中,问题主要出现在软件的下载上面,起初电脑上面没有sql server和office以及java的eclipse软件,由于最近要开发项目,没有办法的情况下开始下载各个软件,由于前期时间把握不好,下载的软件版本不对,加上又多下载了一些其他的软件,像MySQL、Microsoft Visual studio 2019等等软件,以为时间足够多,没有引起重视,最后安装生成柱状图的jar包的导入又多次出错,但是之前导入的链接数据库的jar没有问题,多次尝试都没有改不出来,无奈只能暂且作罢。
展示PSP
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 10 | 10 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 360 | 240 |
Development | 开发 | 360 | 480 |
Analysis | 需求分析 (包括学习新技术) | 90 | 90 |
Design Spec | 生成设计文档 | 60 | 60 |
Design Review | 设计复审 (和同事审核设计文档) | 90 | 120 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 360 | 120 |
Design | 具体设计 | 120 | 100 |
Coding | 具体编码 | 500 | 60 |
Code Review | 代码复审 | 60 | 10 |
Test | 测试(自我测试,修改代码,提交修改 | 60 | |
Reporting | 报告 | 60 | 60 |
Test Report | 测试报告 | 30 | 20 |
Size Measurement | 计算工作量 | 10 | 20 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 10 | 10 |
代码规范说明
代码规范(由于用的是Java,这里只提供java的代码规范说明)
<1>、命名规范:对于临时变量,可以采用短变量名提高效率,对于成员变量,尽量从变量名上体现其含义。
<2>、文件样式规范:主要关注正确的注释填写。
<3>、代码编写格式:这个可以通过一些工具来实现。比如jalopy。
<4>、程序编写规范:出于减容以及提速的考虑,具体编程中的一些小技巧和注意点,需要注意的是,规则本身会有冲突的地方,熊掌和鱼,根据系统需求决定取舍。
命名规范
a、一般不要用package,浪费。
b、Class 的命名 (Class 的名字必须由大写字母开头而其它字母都小写的单词组成) ;Class 变量的命名 (变量的名字必须用一个小写字母开头。后面的单词用大写字母开头)。
c、Static Final 变量的命名 (Static Final 变量的名字应该都大写,并且指出完整含义。)
d、参数的命名 (参数的名字必须和变量的命名规范一致)。
e、数组的命名 (数组应该总是用下面的方式来命名)。
f、byte[] buffer; 而不是byte buffer[];
g、方法的参数(使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字)。
h、Java 文件样式(所有的 Java(*.java) 文件都必须遵守如下的样式规则 )
版权信息
版权信息必须在 java 文件的开头,比如:
/** * Copyright ® 2000 XXX Co. Ltd. * All right reserved. */
其它不需要出现在 javadoc 的信息也可以包含在这。
Package/Imports
package 行要在 import 行之前,import 中标准的包名要在本地的包名之前,而且按照字母顺序排列。如果 import 行中包含了同一个包中的不同子目录,则应该用 * 来处理。
类的注释,一般是用来解释类的
/** * A class representing a set of packet and byte counters * It is observable to allow it to be watched, but only * reports changes when the current set is complete */
类定义,包含了在不同的行的 extends 和 implements
public class CounterSet extends Observable implements Cloneable
类的成员变量
public 的成员变量必须生成文文件(JavaDoc)。proceted、private和 package 定义的成员变量如果名字含义明确的话,可以没有注释。
存取方法
类变量的存取的方法,它只是简单的用来将类的变量赋值获取值的话,可以简单的写在一行上。
构造函数
它应该用递增的方式写(比如:参数多的写在后面)。
访问类型 ("public", "private" 等.) 和 任何 "static", "final" 或 "synchronized" 应该在一行中,并且方法和参数另写一行,这样可以使方法和参数更易读。
类方法
代码应该用 unix 的格式,而不是 windows 的(比如:回车变成回车+换行)
必须用 javadoc 来为类生成文档。不仅因为它是标准,这也是被各种 java 编译器都认可的方法。
缩进应该是每行4个空格. 不要在源文件中保存Tab字符. 在使用不同的源代码管理工具时Tab字符将因为用户设置的不同而扩展为不同的宽度。
如果你使用 UltrEdit 作为你的 Java 源代码编辑器的话,你可以通过如下操作来禁止保存Tab字符, 方法是通过 UltrEdit中先设定 Tab 使用的长度室4个空格,然后用 Format|Tabs to Spaces 菜单将 Tab 转换为空格。
页宽应该设置为80字符. 源代码一般不会超过这个宽度, 并导致无法完整显示, 但这一设置也可以灵活调整. 在任何情况下, 超长的语句应该在一个逗号或者一个操作符后折行. 一条语句折行后, 应该比原来的语句再缩进2个字符。
{} 中的语句应该单独作为一行。
如果 } 语句应该缩进到与其相对应的 { 那一行相对齐的位置。
左括号和后一个字符之间不应该出现空格, 同样, 右括号和前一个字符之间也不应该出现空格。
不要在语句中使用无意义的括号, 括号只应该为达到某种目的而出现在源代码中。
程序编写规范
a、 new 关键字,如果要用,尽量在loading阶段,此时系统内存较多空闲的时候。不要用new string(“aaaa”)。
b、 对流对象的使用,一定要保证在任何情况下都能关闭,如,在finally{}中关闭。
c、 调用getClass()方法时,尽可能利用现存的static的对象实例,而不是新建一个对象实例再调用。
d、 用System.arraycopy ()拷贝数组,而不是用for循环拷贝。
e、 对于非常量的字符串,用stringbuffer而不是string。
f、 对常量字符串,用string而不是stringbuffer。
g、 对于简单if else优化。
h、 尽量不要在for循环()内调用方法。同样,将vector.size()变为 array.length,同样的处理方法。EXAMPLE 。
i、 要在循环{}内声明新的变量名:EXAMPLE。
j、 Final的成员变量最好加上static。
k、 对于字符串中单个字符的比较,用 'charAt()' 而不是 'startsWith()' 。
l、 stringbuffer最好指定初始容量。
m、 对于字符串相加,其中的单个字符用’’而不用””。
n、 "try/catch/finally" 块要放在循环体外面。
o、 尽量用栈变量而不是实例变量和类变量,可以提高速度。
p、 用移位代替2的幂次方的乘除。
q、 不要用引入匿名类代替接口的实现。
r、 不要直接声明并初始化大的数组。
s、 不要返回对象实例,而要返回一个索引。
t、 对大数组的初始化,最好检查OutOfMemoryError的异常。
后期修改程序
jar包导入
jar包目录
部分代码展示
import java.awt.Font;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.ApplicationFrame;
public class JFreeChartTest2 extends ApplicationFrame
{
public JFreeChartTest2(String title,int num1,int num2,int num3,int num4,int num5)
{
super(title);
this.setContentPane(createPanel(num1,num2,num3,num4,num5)); //构造函数中自动创建Java的panel面板
}
public static CategoryDataset createDataset(int num1,int num2,int num3,int num4,int num5) {//创建柱状图数据集
DefaultCategoryDataset dataset=new DefaultCategoryDataset();
dataset.setValue(num1,"密切接触","密切接触");
dataset.setValue(num2,"在武汉","在武汉");
dataset.setValue(num3,"在湖北","在湖北");
dataset.setValue(num4,"疑似","疑似");
dataset.setValue(num5,"确诊","确诊");
return dataset;
}
public static JFreeChart createChart(CategoryDataset dataset) //用数据集创建一个图表
{
JFreeChart chart=ChartFactory.createBarChart("hi", "人员分布",
"人员数量", dataset, PlotOrientation.VERTICAL, true, true, false); //创建一个JFreeChart
chart.setTitle(new TextTitle("疫情状况",new Font("宋体",Font.BOLD+Font.ITALIC,20)));//可以重新设置标题,替换“hi”标题
CategoryPlot plot=(CategoryPlot)chart.getPlot();//获得图标中间部分,即plot
CategoryAxis categoryAxis=plot.getDomainAxis();//获得横坐标
categoryAxis.setLabelFont(new Font("微软雅黑",Font.BOLD,12));//设置横坐标字体
return chart;
}
public static JPanel createPanel(int num1,int num2,int num3,int num4,int num5)
{
JFreeChart chart =createChart(createDataset(num1,num2,num3,num4,num5));
return new ChartPanel(chart); //将chart对象放入Panel面板中去,ChartPanel类已继承Jpanel
}
public static void picture(int num1,int num2,int num3,int num4,int num5)
{
JFreeChartTest2 chart=new JFreeChartTest2("疫情柱状图",num1,num2,num3,num4,num5);
chart.pack();//以合适的大小显示
chart.setVisible(true);
}
}
操作截图
生成柱状图
总结
这次项目开发从起初的没有丝毫的头绪,到后期的实践过程中思路渐渐明朗。我得出的结论是不管有没有明确的思路和具体的方向,都应该动手试一试,时常说要“知行合一”,“知行合一”是单有知则不足以服人,单有行无知即无方向。即知与行是合一的,知与行需要相伴而行,这样或许才是最佳的学习方式。也许你思路不是很清晰,但是在一步步的动手实践中,或许会发现问题,一步步的改正,从中学到一些经验,快捷的方法就是从他人的学习中找经验,但好的学习是自己思考。
知道最后实验结果出来,自己动手学到了很多。这里再不做详细的解释。之前程序没有出来是jar包未导进去,滞留了一天之后,打开电脑,动手尝试了MySQL的jar包,终于又导进去了,所以程序最终运行了出来,代码上传到了github代码托管平台了(最初使用sql server存的数据,但后期改正时导入了sql的jar包,所以直接用java连接了sql,最后编辑程序运行程序)。