学生成绩管理系统

1.团队课程设计博客链接

https://www.cnblogs.com/GoodNanmu/p/17042700.html

2.项目简介

本次课设所书写的是学生成绩管理系统,实现了用户的登录注册,验证码的实现,以及对学生成绩信息的增添(添加某个学生,通过列添加成绩),删除,修改,查询(基于学号),模糊查询(基于姓名),排序并且可以运用poi包导出数据至Excel,也可以画出每个学生成绩的柱形图,使学生成绩信息更加可观。最后生成10万个数据(以80为正态分布的数据)用于测试。
image

3.个人负责模块或任务说明

主要完成部分包括:实现了用户的登录注册,验证码的实现,以及对学生成绩数据的删除,修改,查询(基于学号),模糊查询(基于姓名),排序,运用poi包导出数据至Excel,画出每个学生成绩的柱形图,以及最后对代码的整合和分包工作。

4.git提交记录

image

5.负责功能详解

仅展示关键代码和运行结果

登录

在文本框内输入账号和密码,将密码转化为md5形式,然后将账号和转换后的密码,与数据库中的数据比较,在两方都在同一行的状况下则登录成功:反之,则失败。
涉及第三方jar包:用于md5加密
image

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;  
    }  

运行展示:
image

注册

在确保账户名不重复的情况下,可以进行注册。

	// 注册用户
	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();
		}
	}

运行展示:
image

学生信息查找

public ResultSet queryExecute(String sql, String[] paras) {
		return new StudentDaoImpl().queryExecute(sql, paras);
	}

运行:
学号查找:
image
姓名模糊查找:
image

信息删除与修改:

	// 增删改学生
	public boolean cudExecute(String sql, String[] paras) {
		return new StudentDaoImpl().cudExecute(sql, paras);
	}

运行展示:
image

生成成绩报表(排序,导出Excel文件)

先进行排序,将排序后的数据存入到excel中
涉及第三方jar包:
image

//写入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();
		}
	}

运行展示:
image
image

生成柱状图

选中某行,将数据传入生成柱状图的函数,生成反应该生学习情况的柱状图
涉及第三方jar包:
image

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);
	}

运行展示:
image

课程设计感想

1) 首先不得不提到,本次课设中引用大量的第三方jar包。首先提到poi包的使用,特别需要注意的是HSSF:是操作Excel97-2003版本,扩展名为.xls,XSSF:是操作Excel2007版本开始,扩展名为.xlsx,此处因为没有注意,吃了大亏,故书写代码前一定要深入了解第三方jar包如何使用。
2) 还是jar包的问题,两个第三方jar包可能发生冲突进而导致程序无法运行,此处也需要特别注意。
3) 对代码进行分包,刚刚开始真的十分头疼的问题,从刚刚开始的一长串代码中,将gui部分,实现业务部分,工具类部分等抽离出来,虽然刚刚开始的十分痛苦,但是经过分包,各层的逻辑也就更加清晰,减少了代码的冗余,对代码整体的把握也有了更加深入的理解。
4) 想做出既要美观又实用的GUI其实并不容易,需要不断提高审美,并且从用户的角度思考,才可以将交互部分越做越好。
总的来说收获满满,读万卷书不如行万里路,读万行代码不如写万行代码。

posted @ 2023-01-11 00:06  GoodNanmu  阅读(108)  评论(0编辑  收藏  举报