一、团队介绍
名字
负责任务
界面层GUI和登录功能的实现
业务逻辑层基本功能的实现
随机生成十万学生数据信息和学生成绩的可视化分析(柱状图)
(可点击姓名进入个人博客)
二、系统功能
1. 登录界面实现验证码验证
2. 添加学生信息:姓名、学号、性别、出生年月日。(学号自动生成,学号唯一)
3. 删除学生信息
4. 同一科目下批量录入学生成绩
5. 根据学号查找学生成绩,可生成成绩分析柱状图
6. 根据学生姓名查找成绩,支持模糊查找
7. 显示所有学生的所有成绩,降序生成成绩报表
8. 测试: 随机生成十万个学生数据信息(学号、姓名不重复每科的成绩以八十分为中心形成正态分布),以检验系统的健壮性
三、项目Git地址
四、Gitee提交截图
黄家雯
许慎
吴绍杰
(该组员的文件大多在qq等平台与其他组员交流)
五、系统三层架构逻辑关系图
六、包规划
dao:
gui:
main:
model:
七、数据库
students表:
users表:
八、运行截图
登录界面:
登录成功后的操作界面:
添加学生信息:
根据学号删除学生信息,也可以一键删除所有学生信息:
录入学生成绩:分不同科目,通过对列表分数栏的值进行更改后,点击保存导入
根据学号查询成绩:
成绩分析:
根据姓名查找学生,实现模糊查找:
修改学生成绩:
显示所有学生成绩:
七、关键代码
将学生信息传入数据库
public boolean writeStudent(Student student) {
String sql = "insert into students(stuno,name,gender,birthdata) values(?,?,?,?) ";
int result = -1;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
try(Connection conn = JdbcUtil.getConnection();
PreparedStatement pstat = conn.prepareStatement(sql);) {
pstat.setInt(1, student.getNumber());
pstat.setString(2, student.getName());
pstat.setString(3, student.getGender());
String dateStr = student.getBirthday();
Date date = sdf.parse(dateStr);
java.sql.Date sd;
sd = new java.sql.Date(date.getTime());
pstat.setDate(4,sd);
result = pstat.executeUpdate();
}catch (SQLException sqle) {
sqle.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
return result>0?true:false;
}
实现模糊查找
public List getStudentsByName(String name) {
String sql = "select * from students where name like '%"+name+"%';";
List studentList = new ArrayList<>();
try(Connection conn = JdbcUtil.getConnection();
Statement state = conn.createStatement();) {
ResultSet rs = state.executeQuery(sql);
while(rs.next()){
int stuId = rs.getInt("stuno");
String stuName = rs.getString("name");
double math = rs.getDouble("math");
double java = rs.getDouble("java");
double pe = rs.getDouble("PE");
Student stu = new Student(stuId, stuName,math,java,pe);
studentList.add(stu);
}
}catch (SQLException sqle) {
sqle.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
return studentList;
}
导出生成学生成绩文本文件
public void studentTable(List studentList) throws FileNotFoundException {
double classMath = 0;
double classJava = 0;
double classPe = 0;
double classAverage = 0;
for (Student e : studentList) {
classMath += e.getMath();
classJava += e.getJava();
classPe += e.getPe();
}
classMath = classMath/studentList.size();
classJava = classJava/studentList.size();
classPe = classPe/studentList.size();
classAverage = (classMath + classJava + classPe)/3;
DecimalFormat df =new DecimalFormat("#0.00");
BufferedWriter out;
try {
out = new BufferedWriter(new FileWriter("成绩表.txt"));
out.write("\t姓名\t 学号\t\t数学\t Java\t 体育\t 总分\t 平均分\n\n");
out.write("\t班级均分:\t\t"+df.format(classJava)+"\t "+df.format(classMath)+"\t "+df.format(classPe)+"\t "+df.format(classAverage)+"\n\n");
for (Student e : studentList) {
out.write("\t"+e.getName()+"\t "+e.getNumber()+"\t"+df.format(e.getMath())+"\t "+df.format(e.getJava())+"\t "+df.format(e.getPe())+"\t "+df.format(e.getGrade())+"\t "+df.format(e.getAverage())+"\n");
out.flush();
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
学生成绩柱状图可视化
public static void getChart(String name, double score1, String subject1,double score2, String subject2,double score3, String subject3) {
try {
DefaultCategoryDataset ds = new DefaultCategoryDataset();
ds.setValue(score1,subject1,subject1);
ds.setValue(score2,subject2,subject2);
ds.setValue(score3,subject3,subject3);
Font font = new Font("宋体", Font.BOLD, 20);
JFreeChart chart = ChartFactory.createBarChart3D(name+"同学的各科成绩", "科目", "成绩(分)", ds, PlotOrientation.VERTICAL, true, true, true);
chart.getTitle().setFont(font);
font = new Font("宋体", Font.BOLD, 15);
chart.getLegend().setItemFont(font);
CategoryPlot plot = (CategoryPlot) chart.getPlot();
plot.getDomainAxis().setLabelFont(font);
plot.getDomainAxis().setTickLabelFont(font);
plot.getRangeAxis().setLabelFont(font);
plot.getRangeAxis().setUpperBound(100);
plot.getRangeAxis().setLowerBound(0);
plot.setForegroundAlpha(1.0f);
chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
ChartUtilities.saveChartAsJPEG(new File(name+"的成绩柱形图.jpg"), chart, 1440, 920);
ImageIcon icon=new ImageIcon();
Image image=Toolkit.getDefaultToolkit().getImage(name+"的成绩柱形图.jpg");
JFrame frame = new JFrame();
frame.setSize(700, 500);
icon.setImage(image);
JButton button = new JButton();
button.setIcon(icon);
frame.getContentPane().add(button);
frame.setIconImage(Toolkit.getDefaultToolkit().getImage("img/jmu.png"));
frame.setTitle("学生成绩管理系统");
frame.setSize(1500, 1000);
frame.setLocation((int)(Toolkit.getDefaultToolkit().getScreenSize().getWidth()-1500)/2,
(int)(Toolkit.getDefaultToolkit().getScreenSize().getHeight()-1000)/2);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
随机生成十万个学生信息成绩
/**随机生成十万个学生信息成绩*/
public static void getRandomList() throws IOException {
Set ID=new HashSet();
ID=getRandomID(2019000000,100000,2020000000);
Iterator iterator = ID.iterator();
String Name;
int Score;
File outputFile = new File("output.txt");
outputFile.createNewFile();
BufferedWriter out = new BufferedWriter(new FileWriter(outputFile));
for (int i = 0; i < 100000; i++) {
Score = getRandomScore();
Name = getRandomName();
out.write("\t"+Name+"\t\t"+iterator.next()+"\t"+Score+"\n");
out.flush();
}
out.close();
JOptionPane.showMessageDialog(null, "学生信息生成成功\n文件位于"+outputFile.getAbsolutePath());
}
八、尚待改进的功能及想法
未能使用poi技术实现生成exm报表,待后续时间充裕,会学习此技术,完善该功能
部分界面布局有待优化
对大量数据进行操作时,系统的运行速率是有待提高的,后续会进行算法优化
在系统编写的过程中,并没有充分的用好gitee代码托管平台