前言
实现简单的学生管理系统,适用于新手学习
成果演示
学生管理系统演示
一. 学生管理系统有什么功能
- 能够创建账号,并分清哪些账号时管理员的,哪些是学生的
- 忘记密码时只需要输入账号即可查询密码,即"找回密码"功能
- 学生有自己的基本信息:①学号 ②姓名 ③电话 ④地址。
这些信息只能由管理员添加、修改或删除,学生仅仅有查询及修改本人信息的权限,没有权限涉及其他学生信息。 - 学生还有成绩,具体为:①语文成绩 ②数学成绩 ③英语成绩。
根据实际,学生同样只有查询自己成绩的权利 - 学生可以修改自己的密码;管理员可以修改任何人的密码
- 管理员可以注销学生账号,也可以查看当前所有账户的账号与密码
二. 学生管理系统各主界面
1. Mysql连接界面
-
要实现管理数据,首先需要令
Eclipse
连接上数据库,即JDBC
技术。首先需要导入电脑中安装好的Mysql
的jar
包,具体往项目中添加jar
包的方式如下
mysql5.0.8驱动jar包百度云地址如下:
链接:https://pan.baidu.com/s/1lJ10aWDgItb-WwNaXE3uGg
提取码:0ztm
mysql8.0.28驱动jar包百度云地址如下:👈【如果本地mysql版本高于8就安这个】
链接:https://pan.baidu.com/s/1Ti7qPSW7NCFa2A_hoqRenQ
提取码:34m9
-
考虑到每个人设置的
Mysql
登录密码不一样,为了使学生管理系统在每个电脑都能够运行,我们在进入系统时候需要手动输入Mysql
的账号与密码,界面图如下
-
可以看到,只需要对"连接"按钮进行事件绑定即可,具体做法是令其监听两个输入框,当账号密码都正确时会得到一个连接
Connection con
,后续访问数据库都需要依靠这个连接;若账号密码与本地Mysql不匹配,则抛出异常,出现"账号密码错误"
的提示框。具体的事件实现会在后边讲,这里主要说一下界面组成
2. 学生管理系统登录界面
- 来到这个界面时,说明我们已经成功连接上数据库,此时作为一个学生管理系统,必定会有学生和管理员之分,两者的权限不同。因此我们需要一个符号来对登录者进行识别
- 我所选择的方式是按钮,当选择管理员身份时说明来访者是管理员,登录成功后进入管理员功能界面;选择学生身份时说明来访者是学生,登录成功后进入学生功能界面;未选择身份时不允许进入系统
- 另外在此界面还需要有
注册账号
与忘记密码
的按钮,这两个功能是比较常见的,也是必要的,因为登录有学生与管理员之分,所以注册也自然有学生和管理员之分。根据实际,只允许管理员注册账号,这是两者不同权限之一
3. 管理员功能界面
- 进入到这个界面时,说明我们已经用一个管理员账号登录成功了
- 根据设想,管理员的权限主要有以下几点:
- 查询当前所有的账号与密码
- 添加学生的基本信息
- 查询/修改学生信息
- 录入/查询/修改学生成绩
- 注销本人/学生账户
- 修改本人/学生密码
- 返回到学生管理系统登录界面
- 每次查询得到的信息我们需要将其显示出来,并且考虑到内容比较多,我们还希望显示的面板会有滚动条,根据这些设想,界面设计如下
4. 学生功能界面
- 进入到这个界面时,说明我们已经用一个学生账号登录成功了
- 根据设想,学生权限主要有以下几点:
- 更新/查询本人信息
- 查询本人成绩
- 修改本人密码
- 返回学生管理系统登录界面
- 同样,查询的内容需要显示区域,也需要加上滚动条,因此界面设置如下
三. Mysql表准备
1.登录、账户库、注册账号、找回密码、修改密码等
- 我们先创建一个
student_system
数据库用来存放所有与学生管理系统相关的表内容(数据库以及表的创建语句会在后边给出)
- 所谓登录功能的原理很简单,即将输入的账号作为关键字去相应表中查询密码,若输入的密码与查询得到的密码一致,说明账号密码正确,可以进入下一步操作;否则账号密码错误,出现警示框,不操作。
- 因此我们首先需要在
Mysql
建立两个表admin
和stu
用来分别存放管理员的账号密码以及学生的账号密码,为了便于数据处理,我将所有的类型都设置为char
,表结构如下
2.录入、更新信息/成绩
- 同样,学生信息也需要一张
information
表来维护;而成绩则放在grade
表 - 因为姓名可能会出现重复的,因此我们的主键选择学号,学号一定是唯一的。
- 更新的原理也很简单:首先查询学号是否存在,若存在则选择更新哪些值,新的值是什么?接着执行更新操作即可。
- 录入原理类似,不过录入只能录一次,而更新可以更新多次
- 两张表结构如下
3.注销、修改密码
- 注销操作即抹除所有与当前学号相关的内容,因此注销学生账户时不能仅仅将账号密码表的数据删除,还需要将成绩、信息的记录一并删除。免得后面创建账户时出现混乱
4. Mysql建表语句
create database student_system;
use database student_system;
set names gbk;
create table admin(
num char(15) primary key not null,
password char(20) not null
)engine myisam charset utf8;
create table stu(
num char(15) primary key not null,
password char(20) not null
)engine myisam charset utf8;
create table information(
num char(15) primary key not null,
name char(20) not null,
tele char(20) not null,
address char(30) not null
)engine myisam charset utf8;
create table grade(
num char(15) primary key not null,
name char(10) not null,
chinese_grade char(10) not null default -1,
math_grade char(10) not null default -1,
english_grade char(10) not null default -1
)engine myisam charset utf8;
四. 图形化设计
-
Java
的图形化可以在Eclipse
中安装WindowsBuilder
插件进行操作,效率会高很多,我本人也是最近才发现了这个宝贝东西,先前纯手写太痛苦了,不知道怎么操作的可看下面这个↓。
eclipse安装WindowBuilder插件最新教程及问题解决方法 -
在实现过程中为了使界面更加美观,可以添加在
JFrame
上添加图片背景,也可以根据需要对按钮添加背景,我在放图片的时候发现大小不好调整且不知道怎么放到底层,不过通过看大佬文章最终还是解决了。
为了让各位少走弯路,我将主要代码贴进来,自己琢磨一下,如果还有不清楚的地方可以再去看看大佬们写的关于添加背景图片的文章。
//背景图
ImageIcon icon=new ImageIcon("src\\stu_system\\img\\校门.jpg");
//设置图片大小
Image h = icon.getImage().getScaledInstance(组件名称.getWidth(), 组件名称.getHeight(),
icon.getImage().SCALE_DEFAULT);
//将设置好大小的图片重新分配图片图标对象
icon=new ImageIcon(h);
//往一个标签中加入图片
JLabel morning = new JLabel(icon);
//设置标签位置大小为图片大小
morning.setBounds(0, 0, icon.getIconWidth(),icon.getIconHeight());
//标签添加到第二层面板
(jframe.)getLayeredPane().add(morning, Integer.valueOf(Integer.MIN_VALUE));
//后边要加什么东西到背景中只需要加入这个底层面板中即可
JPanel bg=(JPanel) getContentPane();
//底层面板透明,处在最底层的图片才看得见
bg.setOpaque(false);
- 另外在设置图片按钮的时候,为了使按钮更加美观,还需要准备好透明图片,这方面可以在
Photoshop
里实现,百度上很多讲解,实现后按钮界面如下↓
五. 代码设计(含源码)
1. 类的封装思想(万物皆为对象)
- 每一个界面对应一个
Attribute
对象,对象内封装了界面的所有组件,当需要对组件进行操作时(如获取文本框的值),只需要对Attribute
内的对象进行操作即可,每个事件都拥有这个对象,因此操作起来会十分方便,同时代码量也大大减少 - 所有的事件都由相关类实现接口来完成,将图形化和功能实现分隔开,更加方便维护,代码也更加美观
- 一些经常需要使用的功能可以将其写成静态方法,封装在工具包
tool
中,如sql语句查询/更新
需要频繁使用,因此可以将其写入工具包的工具类中
2. 分层思想
用不同的包放置不同功能的类,如mysql连接相关的类放入
mysql_join
包中;图形化相关的类放入gui
包中;事件相关的类放入event
包中;event
包内与管理员功能相关的类放入admin_function
包中……这样的好处之一是当发现BUG时能够很快定位到问题发生处,并进行修复与维护
3. 我遇到的一些问题
- 导出包运行时显示"没有主清单属性"
- 可以成功运行后,发现项目中的背景图片无法正常显示
- 可以成功运行也可以显示图片后,发现数据库无法连接
解决方法
-
首先是数据库问题,无法接通是因为导出来的
jar
包运行时找不到mysql
的jar
包,因此数据库相关类就失效了,自然就连接不上数据库。我们解决的关键是让其能够认识mysql的jar包
,因此我们需要将mysql的jar
包一起封装进项目中导出,具体操作方法如下:-
解压
mysql
的jar
包
-
将解压出来的
com
文件夹直接拖进Eclipse
的项目中
-
接着手动创建一个文件,命名如下
-
文件内容如下
-
-
接着是没有主属性清单的问题,这个问题的本质在于
jar
包运行时不知道那个类中有主函数,因此我们让他知道就行,依然是对MANIFEST.MF
进行操作。我的主类为路径src下的stu_system包下的Start.java
,所以我的主类全名为:stu_system.Start
-
最后是图片显示问题,这个是图片路径问题,因为脱离了
Exclipse
环境后的JAR
包在运行时只认识主类,所以我们的所有路径都应该围绕主类展开才能够被识别,Java
中有提供获得当前类路径的方法:类名.class.getResource(字符串)
如我的图片
img包
和主类Start.java
处于同一级,因此对于img
里装着的校门.jpg
可以这样取得Start.class.getResource("img/校门.jpg")
4. 各类在Exclipse的结构分层
【相关资料后台滴滴】