学生成绩管理系统
可实现功能
学生管理系统
- 查询学生信息:姓名、学号、性别、出生年月日。(学号自动生成且唯一)
- 查询学生成绩:每个人都有数学、Java与体育与选修课
- 查询学生课程
- 进行公选课选课
教师管理系统
- 添删改学生功能
- 查找学生(姓名查找(支持模糊查找),学号查找,班级查找,科目查找)
- 进行学生成绩分析(柱状图(显示学生在各个分数范围的人数)与饼状图(显示学生及格与不及格的比例))
- 进行学生成绩导出(poi)
一、 团队成员与任务分配
姓名 | 任务分配 |
---|---|
马艺芳 | DAO模式实现,数据库建立与连接,逻辑代码编写,代码整合,学生教师部分功能实现。 |
梁乐国 | POI技术应用(导出学生成绩并生成excel表格),学生部分功能实现。 |
谢国庆 | 图形界面设计,部分教师功能。 |
梁志湖 | 学生成绩图形分析实现(柱形图,饼状图),团队博客编写,项目所需要的图片绘制与寻找 |
团队成员课程设计博客链接:
二、 项目git地址:
欢迎大家访问学生管理系统的码云
三、 项目git提交记录截图
四、 项目功能架构图与主要功能流程图
项目功能架构图
主要功能流程图
五、 项目运行截图
1.用户登录界面:
2.教师系统界面
3.按照班级查找
4.柱状图和饼状图
5.导出成绩
6.学生信息界面
7.学生选课
六、 项目关键代码
生成柱状图
public BarChartPanel(int x1, int x2, int x3, int x4, int x5, String name) {
// TODO 自动生成的构造函数存根
//CategoryDataset dataset = getDataSet();
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(x1,name,"0~60");
dataset.addValue(x2, name, "61~70");
dataset.addValue(x3, name, "71~80");
dataset.addValue(x4, name, "81~90");
dataset.addValue(x5, name, "91~100");
JFreeChart chart = ChartFactory.createBarChart3D(
"成绩柱形图", // 图表标题
"科目", // 目录轴的显示标签
"人数", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
false, // 是否生成工具
false // 是否生成URL链接
);
//从这里开始
CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象
// plot.getRenderer().setSeriesPaint(50, new Color(10,10,10)) ;
BarRenderer3D customBarRenderer = (BarRenderer3D) plot.getRenderer();
customBarRenderer.setSeriesPaint(0, Color.decode("#7979FF")); // 给series1 Bar
CategoryAxis domainAxis=plot.getDomainAxis(); //水平底部列表
domainAxis.setLabelFont(new Font("黑体",Font.BOLD,14)); //水平底部标题
domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12)); //垂直标题
ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状
rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15));
chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 15));
chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体
//到这里结束,虽然代码有点多,但只为一个目的,解决汉字乱码问题
frame1 = new ChartPanel(chart,true); } //这里也可以用chartFrame,可以直接生成一个独立的Frame
poi导出表格
public void ExportBycoursePOI(List<Student> student) throws IOException {
HSSFWorkbook wb = new HSSFWorkbook();
HSSFCellStyle cellStyle = wb.createCellStyle();
HSSFSheet sheet = wb.createSheet("学生成绩");
HSSFRow row = sheet.createRow(0);
HSSFCell cell = row.createCell(0);
HSSFDataFormat format = wb.createDataFormat();
cellStyle.setDataFormat(format.getFormat("@"));
cell.setCellValue("学号");
cell.setCellStyle(cellStyle);
row.createCell(1).setCellValue("姓名");
row.createCell(2).setCellValue("班级");
row.createCell(3).setCellValue("科目");
row.createCell(4).setCellValue("成绩");
for (int i = 0; i < student.size(); i++) {
//创建list.size()行数据
row = sheet.createRow(i + 1);
//把值一一写进单元格里
//设置第一列为自动递增的序号
row.createCell(0).setCellValue(student.get(i).getStudentID());
row.createCell(1).setCellValue(student.get(i).getName());
row.createCell(2).setCellValue(student.get(i).getClasses());
row.createCell(3).setCellValue(student.get(i).getSublist().get(0).getName());
row.createCell(4).setCellValue(student.get(i).getSublist().get(0).getScore());
}
try {
FileOutputStream output = new FileOutputStream("E:\\JAKARTA.xls");
wb.write(output);
output.flush();
JOptionPane.showMessageDialog(null, "导出成功!");
System.out.println("成功创建excel文件");
} catch (Exception e) {
e.printStackTrace();
}
}
通过关键字实现模糊查找
public List<Student> searchByname(String stuname) {
List<Student> stulist = new ArrayList<>();
PreparedStatement pstat = null;
ResultSet rs = null;
//数据库模糊匹配的sql语法
String sql = "select * from student where name like'%"+stuname+"%'" ;
try (Connection conn = JDBCUtil.getConnection()) {
pstat = conn.prepareStatement(sql);
rs = pstat.executeQuery(sql);
//创建ResultSetMetaData
//获得ResultSet对象rs
ResultSetMetaData data = rs.getMetaData();
//调用方法得到表的列数
int colum = rs.getMetaData().getColumnCount();
String[] columnamestr = new String[colum];
//获得表头,以实现图形界面动态建表
for(int i = 7;i <= colum;i++) {
columnamestr[i-1] = data.getColumnName(i);
System.out.println(data.getColumnName(i));
}
//获取数据库数据
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String classes = rs.getString("class");
String gender = rs.getString("gender");
String birthdate = rs.getString("birthdate");
System.out.println(id+" "+name+" "+classes+" "+gender+" "+birthdate);
double[] source = new double[colum];
for(int j = 6;j < colum;j++) {
source[j] = rs.getDouble(columnamestr[j]);
System.out.println(source[j]);
}
//将课程信息包装成Subject类型
List<Subject> subject = new ArrayList<>();
for(int k = 6;k<colum;k++) {
Subject s = new Subject(columnamestr[k],new Teacher(""));
s.setScore(source[k]);
subject.add(s);
}
//将所得数据包装成Student类型,
Student student = new Student(id,name,classes,gender,birthdate);
//加入课程信息
student.setSublist(subject);
//加入List
stulist.add(student);
}
} catch (SQLException sqle) {
sqle.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return stulist;
}
七、项目代码扫描结果及改正
一,没有添加创建者信息
改正
二,不能在代码尾部添加注释
改正(应在代码上方)
八、UML类图
九、尚待改进或者新的想法
- 尝试过网络功能,但目前还是未能实现,后面会争取再去尝试一下。
- 由于时间问题,多线程(多个账户同时登陆)与学生抢课功能还未能实现
- 代码结构进一步改善