目录
项目资源: 提取码:6fh1
一、项目环境
IDEA集成环境
二、系统功能介绍
登录界面
- 可以选择以不同的用户身份(学生、老师、管理员)登录系统
- 可以进行账号的注册(学生/老师)
整个系统分为三个子系统:学生、老师、管理员。
1.学生子系统
(1)学生个人主页
- 显示学生的基本信息
- 可以点击修改个人基本信息
- 点击进入选课中心
(2)学生修改个人信息
学生可以修改个人密码信息。
(3)学生选课中心
- 可以查看该学生选修的全部课程和对应的成绩
- 可以查看全部课程的信息,点击课程可以选修该门课程
2.老师子系统
(1)老师个人主页
- 显示老师个人基本信息
- 可以点击修改个人基本信息
- 可以点击进入老师选课中心
(2)老师修改个人密码
(3)老师选课中心
- 可以看到该老师教授的全部课程信息
- 点击某个课程可以查看选修该老师教授的该课程的所有学生信息
选修该老师教授的某课程的学生信息界面
点击学生成绩框可以修改改名学生该课程的成绩
3.管理员子系统
(1)管理员个人界面
- 可以点击修改管理员密码
- 可以点击进入学生管理系统
- 可以点击进入教师管理系统
- 可以点击进入课程管理系统
(2)管理员修改个人密码
(3)管理员学生管理系统
- 可以查看全部学生信息
- 可以对学生信息进行删除操作
- 点击学生信息可以查看学生的全部选课,并对选课进行删除操作
(4)管理员老师信息管理系统
- 可以查看所有老师信息
- 可以对老师信息进行删除操作
(5)管理员课程信息管理系统
- 可以查看所有课程的基本信息
- 可以对课程信息进行删除操作
三、项目结构介绍
该项目使用的典型的三层架构:数据层+逻辑层+视图层
四、系统数据库设计
1.需求分析
2.概念结构设计
(1)学生管理子系统:
在进入页面之前需要进行登录,在学生在学号和密码正确的情况下进入系统。
学生可以修改个人的密码,查询选修课程、学习成绩,还可以查询、选择课程。
各实体之间的关系:
学生和课程:多对多
学生和老师:多对多
学生和专业:多对一
(2)老师管理子系统:
老师在工号和密码对应的情况下进入系统。
老师可以查询老师的个人信息和修改个人密码,可以查询授课课程信息,可以查询选修课程的学生,可以对学生的成绩进行录入、修改和查询。
- 修改个人的密码
- 查询授课课程
- 查询选修课程的学生信息
- 对学生的成绩进行录入、修改和查询
老师和课程:多对多
老师和专业:多对一
(3)管理员子系统:
在进入页面之前需要进行登录,在管理员账号和密码正确的情况下进入系统。
管理员可以修改个人的密码,管理学生信息、管理老师信息、管理课程信息。
(1)管理学生信息:查询、修改全部学生信息,查询、修改学生选课信息
(2)管理老师信息:查询、修改全部老师信息
(3)管理课程信息:查询、修改全部课程信息
E-R图
关系模式:
学生(学号,姓名,性别,专业号,密码)
专业(专业号,专业名)
老师(教工号 ,姓名,性别,专业号,密码)
选课(学号,课程号,教工号,成绩)
课程(课程号,课程名,学分)
3.物理结构设计
4.其他设计(使用触发器)
①Student表删除的before触发器:
在删除学生信息之前,先删除选课信息中该学生的所有选课信息。
②Student表插入的after触发器
在插入学生前先检查学生的学号是否为12位,不满足则拒绝插入。
③teacher表的插入after触发器
在插入老师前先检查老师的教工号是否为4位,不满足则拒绝插入。
④teacher表的删除before触发器
在删除老师信息之前先删除课程表中该老师教授的课程信息。
⑤course的删除before触发器
在删除课程信息之前先删除sc选课信息表中该课程的全部选课信息。
5.mysql数据库的连接
public class AppConstants {
// jdbc
public static final String JDBC_URL = "jdbc:mysql://localhost:3306/student?" +
"useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
public static final String JDBC_USERNAME = "root";
public static final String JDBC_PASSWORD = "123";
public static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
}
public class DBUtil {
private static DBUtil db;
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
/**
* 不允许外部创造DBUtil类对象
*/
private DBUtil() {
conn = getConn();//连接数据库
}
/**
* 单例模式获取DBUtil类的实例
* @return DBUtil类实例
*/
public static DBUtil getDBUtil() {
if (db == null) {
db = new DBUtil();
}
return db;
}
/**
* 私有的获取数据库连接对象方法
* @return
*/
private Connection getConn() {
try {
if (conn == null || conn.isClosed()) {
Class.forName(AppConstants.JDBC_DRIVER);
conn = DriverManager.getConnection(AppConstants.JDBC_URL, AppConstants.JDBC_USERNAME, AppConstants.JDBC_PASSWORD);
}
} catch (ClassNotFoundException e) {
System.out.println("jdbc driver is not found.");
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
……
}
五、项目心得
这次项目总体来说工作量比较大,主要是三个子系统的功能实现需要大量的界面操作,界面之间的切换和监听器使用比较多。
在后期实现界面操作修改数据库的时候,还需要不断回到数据层为各个DAO类添加新的方法,界面之间要正确地传递数据。
遇到的一个卡的比较久的问题是同一个界面通过点击导航栏显示不同的表,比如学生课程中心里面,“我的课程”和“全部课程”两个选项分别对应不同的数据表,两个表有不同的点击事件。一开始是点击导航栏以后,remove掉表格组件,生成新的表格组件,然后add到界面,但是这有一个问题,就是之前为表格组件添加的监听器将随之失效。解决办法:点击导航栏以后只修改table组件对应的DefaultTableModel,然后调用revalidate()方法使得修改生效。
关于为什么要添加revalidate: