学生成绩管理系统
1.团队课程设计博客链接
https://www.cnblogs.com/GoodNanmu/p/17042700.html
2.项目简介
本次课设所书写的是学生成绩管理系统,实现了用户的登录注册,验证码的实现,以及对学生成绩信息的增添(添加某个学生,通过列添加成绩),删除,修改,查询(基于学号),模糊查询(基于姓名),排序并且可以运用poi包导出数据至Excel,也可以画出每个学生成绩的柱形图,使学生成绩信息更加可观。最后生成10万个数据(以80为正态分布的数据)用于测试。
3.个人负责模块或任务说明
主要完成部分包括:实现了用户的登录注册,验证码的实现,以及对学生成绩数据的删除,修改,查询(基于学号),模糊查询(基于姓名),排序,运用poi包导出数据至Excel,画出每个学生成绩的柱形图,以及最后对代码的整合和分包工作。
4.git提交记录
5.负责功能详解
仅展示关键代码和运行结果
登录
在文本框内输入账号和密码,将密码转化为md5形式,然后将账号和转换后的密码,与数据库中的数据比较,在两方都在同一行的状况下则登录成功:反之,则失败。
涉及第三方jar包:用于md5加密
public boolean login(String username, String password) {
// TODO Auto-generated method stub
boolean flag = false;
con = JDBCUtil.getConnection();
String sql = "select *from user where username=? and password=?";
try {
psmt = con.prepareStatement(sql);
psmt.setString(1, username);
psmt.setString(2, password);
ResultSet rs = null;
rs = psmt.executeQuery();
if (rs.next()) {
try {
// new LoginFrame();
flag = true;
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} else {
JOptionPane pane = new JOptionPane("用户或密码错误");
JDialog dialog = pane.createDialog("警告");
dialog.show();
flag = false;
}
} catch (HeadlessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return flag;
}
生成验证码
设置四位的验证码,大小写敏感
// 设置验证码文字的长度
public void setCodeLength(int codeLength) {
if(codeLength < 4) {
this.codeLength = 4;
} else {
this.codeLength = codeLength;
}
}
public String getCode() {
return code;
}
/*
产生随机的颜色
*/
public Color getRandColor(int min, int max) {
if (min > 255)
min = 255;
if (max > 255)
max = 255;
int red = random.nextInt(max - min) + min;
int green = random.nextInt(max - min) + min;
int blue = random.nextInt(max - min) + min;
return new Color(red, green, blue);
}
/*
设置验证码具体的字母是什么
*/
protected String generateCode() {
char[] codes = new char[this.codeLength];
for (int i = 0, len = codes.length; i < len; i++) {
if (random.nextBoolean()) {
codes[i] = (char) (random.nextInt(26) + 65);
} else {
codes[i] = (char) (random.nextInt(26) + 97);
}
}
this.code = new String(codes);
return this.code;
}
运行展示:
注册
在确保账户名不重复的情况下,可以进行注册。
// 注册用户
public void sign(String username, String password, String tel, String sex, String sdept) {
try {
con = JDBCUtil.getConnection();
String sql = "insert into user values(?,?,?,?,?)";
psmt = con.prepareStatement(sql);
psmt.setString(1, username);
psmt.setString(2, password);
psmt.setString(3, tel);
psmt.setString(4, sex);
psmt.setString(5, sdept);
psmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
}
运行展示:
学生信息查找
public ResultSet queryExecute(String sql, String[] paras) {
return new StudentDaoImpl().queryExecute(sql, paras);
}
运行:
学号查找:
姓名模糊查找:
信息删除与修改:
// 增删改学生
public boolean cudExecute(String sql, String[] paras) {
return new StudentDaoImpl().cudExecute(sql, paras);
}
运行展示:
生成成绩报表(排序,导出Excel文件)
先进行排序,将排序后的数据存入到excel中
涉及第三方jar包:
//写入excel
public void write(List<Student> studentList, String path) {
XSSFWorkbook xs = new XSSFWorkbook();
XSSFSheet sheet = xs.createSheet("学生成绩情况");
sheet.setColumnWidth(0, 12 * 256);
sheet.setColumnWidth(8, 14 * 256);
sheet.setColumnWidth(10, 13 * 256);
sheet.setColumnWidth(12, 12 * 256);
sheet.setColumnWidth(14, 13 * 256);
XSSFRow row = sheet.createRow(0);
row.createCell(0).setCellValue("学号");
row.createCell(1).setCellValue("姓名");
row.createCell(2).setCellValue("数学成绩");
row.createCell(3).setCellValue("java成绩");
row.createCell(4).setCellValue("体育成绩");
row.createCell(5).setCellValue("平均分");
row.createCell(6).setCellValue("总成绩");
ManageService manageservice = new ManageService();
String strsql = "select avg(stuMath) from stu";
ResultSet rs = manageservice.queryExecute(strsql, null);
double value = -1;
try {
if (rs.next())
value = rs.getDouble(1);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
row.createCell(8).setCellValue("math班级均分:");
row.createCell(9).setCellValue(value + "");
strsql = "select avg(stujava) from stu";
rs = manageservice.queryExecute(strsql, null);
try {
if (rs.next())
value = rs.getDouble(1);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
row.createCell(10).setCellValue("java班级均分:");
row.createCell(11).setCellValue(value + "");
strsql = "select avg(stuPE) from stu";
rs = manageservice.queryExecute(strsql, null);
try {
if (rs.next())
value = rs.getDouble(1);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
row.createCell(12).setCellValue("PE班级均分:");
row.createCell(13).setCellValue(value + "");
strsql = "select avg(stuCount) from stu";
rs = manageservice.queryExecute(strsql, null);
try {
if (rs.next())
value = rs.getDouble(1);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
row.createCell(14).setCellValue("总成绩均分:");
row.createCell(15).setCellValue(value + "");
for (int i = 0; i < studentList.size(); i++) {
XSSFRow row1 = sheet.createRow(i + 1);
row1.createCell(0).setCellValue(studentList.get(i).getStuId() + "");
row1.createCell(1).setCellValue(studentList.get(i).getStuNam());
row1.createCell(2).setCellValue(studentList.get(i).getStuMath());
row1.createCell(3).setCellValue(studentList.get(i).getStuJava());
row1.createCell(4).setCellValue(studentList.get(i).getStuPE());
row1.createCell(5).setCellValue(studentList.get(i).getStuAvg());
row1.createCell(6).setCellValue(studentList.get(i).getStuCount());
}
FileOutputStream out = null;
try {
out = new FileOutputStream(path);
xs.write(out);
out.flush();
out.close();
xs.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
运行展示:
生成柱状图
选中某行,将数据传入生成柱状图的函数,生成反应该生学习情况的柱状图
涉及第三方jar包:
public BarChart(String name, double math, double java, double PE) {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(math, "数学", "数学");
dataset.addValue(java, "java", "java");
dataset.addValue(PE, "体育", "体育");
JFreeChart chart = ChartFactory.createBarChart3D(name + "的成绩柱状图", "考试科目", "成绩", dataset,
PlotOrientation.VERTICAL, true, false, false);
CategoryPlot plot = chart.getCategoryPlot();
plot.setBackgroundPaint(Color.white);
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setLabelFont(new Font("黑体", Font.BOLD, 20));
domainAxis.setTickLabelFont(new Font("宋体", Font.BOLD, 20));
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(new Font("黑体", Font.BOLD, 20));
chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 20));
chart.getTitle().setFont(new Font("宋体", Font.BOLD, 20));
BarRenderer renderer = (BarRenderer) plot.getRenderer();
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setBaseItemLabelFont(new Font("黑体", Font.PLAIN, 20));
renderer.setBaseItemLabelsVisible(true);
renderer.setPositiveItemLabelPosition(
new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
renderer.setItemLabelAnchorOffset(10D);
framel = new ChartPanel(chart, true);
ChartFrame frame = new ChartFrame("学生成绩情况", chart);
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
运行展示:
课程设计感想
1) 首先不得不提到,本次课设中引用大量的第三方jar包。首先提到poi包的使用,特别需要注意的是HSSF:是操作Excel97-2003版本,扩展名为.xls,XSSF:是操作Excel2007版本开始,扩展名为.xlsx,此处因为没有注意,吃了大亏,故书写代码前一定要深入了解第三方jar包如何使用。
2) 还是jar包的问题,两个第三方jar包可能发生冲突进而导致程序无法运行,此处也需要特别注意。
3) 对代码进行分包,刚刚开始真的十分头疼的问题,从刚刚开始的一长串代码中,将gui部分,实现业务部分,工具类部分等抽离出来,虽然刚刚开始的十分痛苦,但是经过分包,各层的逻辑也就更加清晰,减少了代码的冗余,对代码整体的把握也有了更加深入的理解。
4) 想做出既要美观又实用的GUI其实并不容易,需要不断提高审美,并且从用户的角度思考,才可以将交互部分越做越好。
总的来说收获满满,读万卷书不如行万里路,读万行代码不如写万行代码。