项目地址 GitHub:
FrankOu2001/grade_manager: Java课程设计作业 (github.com)
博客地址 Blog:
Student Grade Manager: 学生成绩管理系统 - Frank_Ou - 博客园 (cnblogs.com)
作者 Authors:
- 计科20-3 王俊越
- 计科20-2 李振宇
功能要求 Requirement of functions:
-
添加学生功能:姓名、学号、性别、出生年月日。(注意:学号自动生成,学号必须唯一)
-
添加学生成绩功能:假设每个人都选修了数学、Java与体育。但输入成绩的时候,一般是给所有学生输入某一门课程的成绩。
-
根据学生学号查找学生成绩,并在界面上显示姓名、学号和成绩,学号不存在的给出提示信息
-
根据学生姓名(支持模糊匹配)查找学生成绩,并在界面上显示姓名、学号和成绩,如果有多个相同姓名学生存在,一起显示出来,姓名不存在的给出提示信息
-
生成学生学习情况报表:报表包含学号、姓名、各科目成绩及对应的该科目班级平均值,总成绩以及班级总成绩平均值。最后以总成绩平均值降序在图形界面输出,并可将该排序结果按照输出至"成绩表.txt"文件或者excel文件(输出到Excel文件为特别加分项,可以使用POI技术)。
-
支持分别对所有学生各科成绩画出柱状分布图(可选)。
-
支持对学生信息的修改与删除(要在文件或数据库中有所体现),不能修改学号。
-
测试:支持随机生成10万个学生及其姓名、学号、成绩放入文本文件,以进行测试。(学号不能相同,每颗的成绩以80分为中心成正态分本)(重要加分项)
-
支持用户登录、验证操作
界面:GUI
运行环境 Runtime Environment:
OpenJDK11 + MySQL8.0.25 + Windows10
第三方库 Library
- JFreeChart:JFreeChart is a free 100% Java chart library that makes it easy for developers to display professional quality charts in their applications.
- Apache POI - the Java API for Microsoft Documents:The Apache POI Project's mission is to create and maintain Java APIs for manipulating various file formats based upon the Office Open XML standards (OOXML) and Microsoft's OLE 2 Compound Document format (OLE2).
应用对象场景 Who to use
本软件面向仅限教师才能对成绩信息进行管理的应用场景,例如小学和中学这类教学场景
部署方法 How to use
-
MySQL
建表:src/util/sql
目录下的createDB.sql
存储了数据库建立信息,执行脚本即可完成数据库的设置src/util/sql
目录下的BaseDB.java
包含了链接的信息,您可根据本地的配置来做出相应的更改
-
对于
Java
部分: 你可以通过Ant
部署或通过IntelliJ IDEA
来构建 -
对于
Cpp
部分: 编译所需的文件都在src/lib
文件夹中,本项目自带构建好的程序,在Clang/LLVM
在Windows10 amd64
环境下构建
项目功能架 Function Architectural Patterns
UML
程序运行截图 Screenshot
登录界面 LoginWindow
注册界面 RegisterWindow
主界面 MainWindow
主界面关闭提示 Tips when closing the MainWindow
信息成绩管理 GrandeManager
信息成绩管理—编辑学生信息
信息成绩管理—导出窗口
综合成绩分析 GrandeAnalyzer
综合成绩分析—个人成绩比例
综合成绩分析—个人成绩分析
综合成绩分析—信息导出窗口
综合成绩分析—导出的Excel Export Data into Excel
测试数据生成 Generate the Random Data
关键部分代码 Code Preview
数据库DAO(BaseDB.java)
/**
* @author 王俊越
*/
public interface BaseDB {
DBTools DB = DBTools.getDBTools();
/**
* @throws SQLException
*/
void closeAll() throws SQLException;
}
随机数据生成(Generator.cpp)
#include "header.h"
int class_number, target_number;
int main(int argc, char * argv[]) {
double x, y;
stringstream stream;
stream << argv[1];
stream >> target_number;
random_device r1{}, r2{}, r3{};
mt19937 g1{r1()}, g2{r2()}, g3{r3()};
switch(target_number) {
case 200: {
x = 70, y = 6;
} break;
case 500: {
x = 70, y = 7;
} break;
case 2000: {
x = 70, y = 15;
} break;
case 5000: {
x = 68, y = 17;
} break;
case 20000: {
x = 50, y = 25.67;
} break;
case 50000: {
x = 55, y = 27;
} break;
case 200000: {
x = 52, y = 27.3;
} break;
case 500000: {
x = 48, y = 28;
} break;
default:
x = 44, y = 28.6;
}
class_number = target_number / 50;
normal_distribution<> d{x, y};
for (int i = 0; i < target_number; ) {
int a = round(d(g1)), b = round(d(g2)), c = round(d(g3));
if(a >= 0 && b >= 0 && c >= 0 && a <= 100 && b <= 100 && c <= 100) {
i++;
const char * class_name = get_class_name();
printf("INSERT INTO `---` (name, sexual, birthday, classid, math, java, pe, sumscore) ");
printf("value('%s', '%s', '%s', '%s', %d, %d, %d, %d)
",
get_name(), get_sex(), get_data(), class_name, a, b, c, a + b + c);
}
}
return 0;
}
inline const char* get_sex() {
random_device r{};
mt19937 g{r()};
uniform_real_distribution<> dis(0, SEX_SIZE);
unsigned int t = dis(g);
return Sex[t];
}
inline const char* get_name() {
random_device r{};
mt19937 g{r()};
uniform_real_distribution<> dis(0, NAME_SIZE);
unsigned int t = dis(g);
return Name[t];
}
inline const char* get_data() {
random_device r{};
mt19937 g{r()};
uniform_real_distribution<> dis(0, DATA_SIZE);
unsigned int t = dis(g);
return Data[t];
}
inline const char* get_class_name() {
random_device r{};
mt19937 g{r()};
uniform_real_distribution<> dis(0, class_number);
int t = dis(g);
t = (t % class_number + class_number) % class_number;
return Class_name[t];
}
阿里巴巴代码规范检查 Code Check
说明:JFreeChart中的3D图形方法都标记为弃用,因为该项目的作者又写了专门绘制3D图形的项目(收费),所以把该包里的3D图形绘制的方法给弃用了
项目总结、反思、计划
- 总结:
- 使用的时候写了学习了很多
Java Swing
的组件和知识,同时也巩固了自己的所学 - 学习了
MySQL
数据库的使用,深入理解SQL命令的组合使用和面对不同应用场景下的选择 - 对于面向对象有了更深的理解,体会到了面向对象这一哲学的优势和魅力
- 巩固了以前所学的
git
知识 - 实现了模块化的设计,对于一些设计模式也有更深的理解和认识
- 采用了多线程的方式,提高了程序的响应速度
- 反思:
- 缺少前端知识的学习,
Java Swing
不是很好的前端选择 - 项目初期所编写的文件内容体系较乱,耦合度太高,需要重建项目解耦
- SQL命令的高级用法不太熟练
- 编写时没采用阿里巴巴的代码规范,用了自己习惯的
LLVM
的代码规范 - POI面对大数据的导出速度太慢,需要优化或耿冠当初方式
- 不太熟悉
JNI
技术,放弃了用Java调用C++程序的方案
- 计划:
- 准备学习
JavaScript
、JavaFX
和其他前端技术 - 重构项目,重新设计
- 将C++部分用
JNI
包装 - 添加日志文件
感谢 Thanks:
- 感谢我的队友振宇,qwq
- 感谢我的老朋友longjunyu2 (MC-Long) ,对我的项目进行了测试和修复了一些Bug
- 感谢我的女朋友zzh对我一直的陪伴和支持