java课程设计成绩管理_Java课程设计 - 学生成绩管理系统(团队博客)

一、团队介绍

名字

负责任务

界面层GUI和登录功能的实现

业务逻辑层基本功能的实现

随机生成十万学生数据信息和学生成绩的可视化分析(柱状图)

(可点击姓名进入个人博客)

二、系统功能

1. 登录界面实现验证码验证

2. 添加学生信息:姓名、学号、性别、出生年月日。(学号自动生成,学号唯一)

3. 删除学生信息

4. 同一科目下批量录入学生成绩

5. 根据学号查找学生成绩,可生成成绩分析柱状图

6. 根据学生姓名查找成绩,支持模糊查找

7. 显示所有学生的所有成绩,降序生成成绩报表

8. 测试: 随机生成十万个学生数据信息(学号、姓名不重复每科的成绩以八十分为中心形成正态分布),以检验系统的健壮性

三、项目Git地址

四、Gitee提交截图

黄家雯

843fe3ce082293f11f83973061cf401c.png

d62a060c7446dc85621a1ef4591fbdd4.png

72f52c238eaa44c59fdd87adff7a6910.png

许慎

a509cc4b4503463b6c41c743005fe171.png

39498a9375dd8a4a917dd9621d03dc90.png

b80b06bd23eb53d955d7d11b57964657.png

吴绍杰

(该组员的文件大多在qq等平台与其他组员交流)

ca35a62718c709046ab744e2f534504b.png

五、系统三层架构逻辑关系图

1e340407fbab1bc0bd023b9eda98b056.png

六、包规划

dao:

d0b6e583ad000fef59e0002277ed8109.png

gui:

e379c1651b5c865ad799b7c4369d5a17.png

main:

e45fe5d18a6f5a05010cd7a15105efe4.png

model:

9f5b4b8c108aefc545447b6546129635.png

2a0a1599c9284f2456e9e62194c2eaa4.png

七、数据库

b9a48328d201dda197b4ffc80c8fe0c9.png

students表:

eab40e135a622298f77734977bdb1e75.png

users表:

4f6b983ea67c9b2026102804d4c4f7a1.png

八、运行截图

登录界面:

58188c04045ea67d279606efd01e6d83.png

5fc0de17894fa9a9c06f29c2c07284c7.png

登录成功后的操作界面:

9f9ad78e9dd16633113dcff94214bd8f.png

添加学生信息:

b878352bee2ae4cc4adb9d342665ee9f.png

根据学号删除学生信息,也可以一键删除所有学生信息:

b3ef4228b571a6944de200b8b16e6fae.png

录入学生成绩:分不同科目,通过对列表分数栏的值进行更改后,点击保存导入

d4ca1f8213bb29426ae24f812958c575.png

根据学号查询成绩:

4506ced6251d5691ea4f8c0f462093e2.png

b568b22bbbc3d4c5bb8b3b15f947d3c5.png

成绩分析:

335df005e46d6603fc1028b0271517f0.png

根据姓名查找学生,实现模糊查找:

fb147c9b8a68523fad4e0f0436b0d576.png

修改学生成绩:

2326f6f1b90461762c9c160bf7596b8e.png

显示所有学生成绩:

9714780a7655cc965050262380869d06.png

七、关键代码

将学生信息传入数据库

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代码托管平台

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值