资源描述
JAVA课程设计报告(2)
36
2020年4月19日
文档仅供参考
《JAVA程序设计》
课程设计报告
设计题目: 学生信息管理系统
学院名称: 信息工程学院
专业班级: 13计本1
姓 名:
学 号:
目录
一 需求分析。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3
二 概要设计。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3
三 详细设计。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3
3.1 数据库设计。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3
3.2 模块及窗体设计。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3
3.2.1 数据库模块设计。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3
3.2.2 用户登录识别模块。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。5
3.2.3用户信息管理模块。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。6
(1) 密码修改。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。6
(2)用户信息添加和删除。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。8
3.2.4 学生息管理模块。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。10
(1)添加信息。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。10
(2)信息查看。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。11
(3)信息修改。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。12
(4)删除信息。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。14
3.2.5 系统管理模块。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。15
3.2.6 主窗体菜单设计。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。15
四 软件测试。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。15
五 总结。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。15
参考资料:.......................................................17
一 需求分析
本系统的主要目的就是实现学生信息管理,使学生信息管理工作更加容易,从而提高工作效率,降低管理成本.
系统中需要对拥护身份进行管理,采取登陆进入系统的形式.
二 概要设计
/************************************************************************
概要设计阶段主要是粗略描述整个软件的框架,并从业务的角度描述软件的模块、工作流程等。项目的成功取决于设计的好坏,而概要设计则是整个设计的关键部分。概要设计的主要任务是将用户的需求划分为不同的功能,然后将这些功能细分成模块,并给模块一些规则约束,以达到各个模块之间能够相互交流的目的。概要设计关乎到系统的整体架构,因此想做好一个概要设计,不但仅要熟悉用户的业务流程,还要具备相当丰富的设计经验。
2.1 概要设计的原则
概要设计是根据系统分析的需求和工作环境的情况对整个软件的总体结构进行大致的设计。概要设计要坚持以下几个原则。
(1)细分原则:软件系统都是由很多不同的模块组成,当设计一套软件时,要先将所有的功能分解。解决复杂问题的方法是将其分解成几个小问题,一个个来解决。
(2)提高代码重用性:在面向对象设计中,首先考虑的就是代码的重用,一个好的设计,将来在升级换代时不需要太大的改动,节省了人力物力。
(3)从上而下层层分析:概要设计要从整体出发,逐个剖析软件的功能,从上而下,先分析系统总的功能,然后一步步细分,直到最小的功能模块。
(4)一致性原则:概要设计要求所有功能模块在定义时使用统一的规范。
(5)提高独立性,减少耦合:各个模块与模块之间尽量减少关联,否则修改一个地方就会引起其它多处的变动,不符合面向对象的原则。一般情况下,对类封装后,只允许对类进行扩展,而不能修改,而封装的类必须具有单一职责,既理论情况下不允许两个类共同完成一个功能。
(6)模块的大小要尽量适中:不是结构算法越复杂的模块越好,模块的大小要根据实际工作目标和其它类的耦合紧密程度来决定。经验表明,一个模块的规模不应过大,模块的总行数应控制在10~100行的范围内,最好为30~60行,这样理解和阅读都较方便。过长的模块往往是分解不充分的表现,会增加阅读理解的难度;但小规模太多也会使模块之间联系变得复杂,增大系统在模块调用时传递信息所花费的开销。
由于概要设计是整个设计的重中之重,牵一发而动全身,因此要努力做一个好的概要设计,才能在今后软件开发过程中不再重复。现在软件行业流行模式化驱动设计,将一些市场上比较成功的模式拿来用在自己的设计中。
2.2 将用户需求模块化
根据概要设计的原则来分析一下本项目的用户需求,并最终转化成用程序语言描述的模块。什么样的需求才是一个模块?模块应该具备如下3个特征。
(1)输入和输出:模块必须能被调用而且正确的返回调用,而且调用都是相对一个对象而言,这是模块独立性的一个体现。
(2)处理功能:模块必须能够对调用的输入数据进行灵活的处理,并为输出准备好处理结果。
(3)程序代码:用来实现模块功能的源代码。
3.3 确定系统最终模块
概要设计中最重要的就是确定此项目包括哪些模块。根据上两节讲述的设计原则和模块特征,将用户需求转化为下面的模块。
**************************************************************************/
2.1 UML用例图
1 用户登录信息管理
2 用户信息管理
3学生信息管理
4系统管理
系统首页
用户
登陆
信息
管理
用户信息管理
学生信息管理
经过
身份
请求
添加
删除
用户
修改
密码
添加
查看
修改
删除
系统管理
重新
登陆
退出登陆
2.2 模块设计
1 数据库设计模块
2 用户登录识别模块
3 用户信息管理模块
4 学生信息管理模块
5 系统管理模块
三 详细设计
3.1 数据库设计
数据库名称:student
表名:user, stud
表user:存放登陆用户的用户名和密码
表stud:存放学生基本信息
学生表(stus)
字段名
类型
备注
stusID
Varchar(30)
学生id
stuName
Nvarchar(50)
Not null
stuSex
Nchar(1)
性别
'男' 或者'女'
stuAge
int
年龄
>0
stuDept
Nvarchar(30)
所在系
……
3.2 模块及窗体设计
3.2.1 数据库模块设计
将数据库的连接包装在一个database类中,以便其它模块能够轻松调用,避免每次重写数据库连接代码。
下表是她的基本属性
文件名
成员变量
成员方法
database.java
public static Connection cn;
public static Statement st; public static ResultSet rs;
public static boolean joinDB()
public static boolean executeSQL(String sqlString)
public static boolean query(String sqlString)
代码如下:
import java.sql.*;//引入包
public class database {
public static Connection cn; //定义一个连接对象
public static Statement st;//定义一个SQL语句对象
public static ResultSet rs;//定义一个数据集
public static boolean joinDB() {//用来判断是否连接成功
boolean joinFlag;
try {
joinFlag = true;
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//经过调用java.lang中的Class类的forName方法来实现JDBC—ODBC桥接器
cn = DriverManager.getConnection("jdbc:odbc:student","sa","");创立一个连接对象
cn.setCatalog("student");//加载数据库
System.out.println("数据库连接成功");
st = cn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
//返回一个可滚动的结果集,数据库变化时结果集跟着变化 ;不能用结果集更新数据库中的表
return joinFlag;
} catch (SQLException sqlEx) {
System.out.println(sqlEx.getMessage());
joinFlag = false;
return joinFlag;
} catch (ClassNotFoundException notfoundEX) {
System.out.println(notfoundEX.getMessage());
joinFlag = false;
return joinFlag;
}
}
public static boolean executeSQL(String sqlString) {
boolean executeFlag;
try {
st.execute(sqlString);
executeFlag = true;
} catch (Exception e) {
executeFlag = false;
System.out.println("sql exception:" + e.getMessage());
}
return executeFlag;
}
public static boolean query(String sqlString) {
try {
rs = null;
rs = st.executeQuery(sqlString);
} catch (Exception Ex) {
System.out.println("sql exception:" + Ex);
return false;
}
return true;
}
}
3.2.2 用户登录识别模块
代码封装在类Land里,所用到的信息保存在表user里
下表是她的基本属性
文件名
控件
成员方法
Land.java
JLabel:labelname=newJLabel("用户名")
labelmima=new JLabel("密码")
Jbutton: btenter=new JButton("确定");
btcancel=new JButton("清空");
private void Judge(String sqlString)
判断用户名和密码是否正确的成员方法代码:
private void Judge(String sqlString) {
if (database.joinDB()) { //如果数据库连接成功
if (database.query(sqlString)) //如果SQL语句执行成功
try{
if(database.rs.isBeforeFirst()) {//如果指向记录集的在第一条记录的前面
System.out.println("密码正确");
jf.setVisible(false);//窗体不可见
.close();//关闭数据库连接
new Main();//主窗体
}
else {
System.out.println("错误");
new JOptionPane().showMessageDialog(null,"用户名或密码错误!","",JOptionPane.ERROR_MESSAGE);
}
}catch(Exception ex) {
System.out.println(ex.getMessage());
}
}
else{
System.out.println("连接数据库不成功!!!");
}
}
按钮“确定”的监听事件代码:
public void actionPerformed (ActionEvent e){
if(textname.getText().equals("")){
new JOptionPane().showMessageDialog(null,"用户名不能为空!");
}
else if(textmima.getText().equals("")){
new JOptionPane().showMessageDialog(null,"密码不能为空!");
}
else{
String sql="select * from user where user_id = '" + textname.getText() + "' and password = '" + textmima.getText()+ "'";
System.out.println(sql);
Judge(sql);//调用成员方法,判断是否用户名和密码正确
}}
3.2.3 用户信息管理模块
(1) 密码修改
用户名将自动从表user里检索出来,供用户选择
以下是它的基本属性
文件名
控件名称
xgmima.java
Jlabel: lbe2、lbe3、lbe4、lbe5
jTextField: tf
JpasswordField:pas1、pas2、pas3
Jbutton: b1=new JButton("提交");
b2=new JButton("退出");
将所有用用户名读出来
database.joinDB();//连接数据库
String sql="select * from user";
try{
if(database.query(sql)){
while(database.rs.next()){//依次将用户名读出
String name=database.rs.getString("user_id");
tf.addItem(name);
}
}
}
catch(Exception e){}
确定“按钮”的监听事件代码:
b1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String name="" + tf.getSelectedItem();
System.out.println(name);
String sql="select * from user where user_id='"+ name +"'";
System.out.println(sql);
try{
if(database.query(sql)){
database.rs.next();
String ps1=pas1.getText();
String password=database.rs.getString("Password");
if(ps1.equals(password)){
if(pas2.getText().equals(pas3.getText())){
String supdate="update user set password='"+ pas3.getText()+"' where user_id='"+ name +"'";
database.executeSQL(supdate);
new JOptionPane().showMessageDialog(null,"密码更改成功!");
}
else{
new JOptionPane().showMessageDialog(null,"两次密码不同!");
}
}
else{
new JOptionPane().showMessageDialog(null,"旧密码不正确!");
}
}
}
catch(Exception el){
System.out.println(el);
}
}
});
(2)用户信息添加和删除
上半部分用来添加用户,下半部分用来删除用户
基本属性如下
文件名
控件名
AddDeleteUser.java
private JButton butACancel,butDCancel,butDelete,butOk;
private JComboBox cbUserName;
private JLabel jLabel1,jLabel2,jLabel3,jLabel4,jLabel5;
private JPasswordField pas1,pas2,pas3;
private JTextField txtname;
//将所有用用户名读出来
database.joinDB();
String sql="select * from user";
try{
if(database.query(sql)){
while(database.rs.next()){//记录集若有记录则经过循环将数据依次读出
String name=database.rs.getString("user_id");
cbUserName.addItem(name);
}
}
}
catch(Exception e){}
//为添加按钮加事件-----------------------------------------
butOk.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(txtname.getText().equals("")){ //判断是否为空
new JOptionPane().showMessageDialog(null,"用户名不能为空!");
}
else if(pas1.getText().equals("")){
new JOptionPane().showMessageDialog(null,"密码不能为空!");
}
else if(pas1.getText().equals(pas2.getText())){
String sql="insert into user values('"+ txtname.getText() +"','"+ pas1.getText() +"')";
try{
if(database.executeSQL(sql)){//若SQL执行成功
new JOptionPane().showMessageDialog(null,"添加成功!");
cbUserName.addItem(txtname.getText());
}
}
catch(Exception ea){}
}
}
});
删除按钮监听事件代码
butDelete.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String name="" + cbUserName.getSelectedItem();//得到用户名
String sql="select * from user where user_id='"+ name +"'";
try{
if(database.query(sql)){
database.rs.next();
String pas=pas3.getText();
String password=database.rs.getString("Password");
System.out.println(password);
if(pas.equals(password)){//比较密码是否与记录集里对应一致
String sdelete="delete from user where user_id='"+ name +"'";
if(database.executeSQL(sdelete)){
new JOptionPane().showMessageDialog(null,"删除成功!");
pas3.setText("");
cbUserName.removeAllItems();//将删除的条目从JcomboBox中删除
String sql1="select * from user";
if(database.query(sql1)){
while(database.rs.next()){//更新JcomboBox条目
String name1=database.rs.getString("user_id");
cbUserName.addItem(name1);
} }
} }
else{
new JOptionPane().showMessageDialog(null,"密码不正确!");
} }
}
catch(Exception el){
System.out.println(el);
} }
});
3.2.4 学生信息管理模块
(1)添加信息
该添加是按照先添加学生信息,添加学生信息中的“添加“按钮代码:
butOk.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(jtf1.getText().equals("")){
new JOptionPane().showMessageDialog(null,"学号不能为空");
}
else if(jtf2.getText().equals("")){
new JOptionPane().showMessageDialog(null,"姓名不能为空");
}
else if(jtf3.getText().equals("")){
new JOptionPane().showMessageDialog(null,"性别不能为空");
}
else {
String sql="insert into stud values('"+ jtf1.getText() +"','"+ jtf2.getText() +"','"+ jtf3.getText() +"','"+ jtf4.getText()+"','"+ jtf5.getText()+"','"+ jtf6.getText()+"','"+ jtf7.getText()+"')";
try{
if(database.executeSQL(sql)){
new JOptionPane().showMessageDialog(null,"添加成功!");
}
}
catch(Exception ea){}
}
}
});
(2)信息查看
分为查看学生基本信息和查看学生成绩信息,因为代码和窗体大致相识,进取其一讲述
下面是她的属性
文件名称
控件名称
viewstud.java
JtextArea:te=new JTextArea();
代码为:
class viewstud extends JInternalFrame
{ viewstud()
{super("查看学生基本信息");//窗体显示得名称
Container con=getContentPane();//创立JinternalFrame的容器对象
con.setLayout(new BorderLayout());//设定窗体布局
JTextArea te=new JTextArea();
JScrollPane croll=new JScrollPane(te); //加载垂直水平滚动条
con.add(croll,BorderLayout.CENTER);
database.joinDB(); //连接数据库
String sql="SELECT * FROM stud";
try{ if(database.query(sql)){
while(database.rs.next())
{
te.append("学号: "+database.rs.getString(1)+" ");
te.append("姓名: "+database.rs.getString(2)+" ");
te.append("性别: "+database.rs.getString(3)+" ");
te.append("年龄: "+database.rs.getString(4)+" ");
te.append("政治面貌:"+database.rs.getString(5)+" ");
te.append("系别: "+database.rs.getString(6)+" ");
te.append("班级: "+database.rs.getString(7)+" ");
te.append("\n");
}
}
}
catch(SQLException ex)
{ System.out.println(ex);}
this.setClosable(true);//关闭窗口可用
setVisible(true);//窗体可见
setBounds(20,70,600,350);
}
}
(3)信息修改
信息修改分为学生基本信息修改,学生成绩信息修改,由于原理相似就以修改学生基本信息作为例子进行介绍
下面是她的属性信息
文件名称
控件名称
xiugai.java
private JButton butCancel,butOk,butShow;
private JLabel jLabel1,jLabel2,jLabel3,jLabel4,jLabel5,jLabel6,jLabel7;
private JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6,jtf7;
显示信息按钮的监听事件代码如下:
database.joinDB();
butShow.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(jtf1.getText().equals("")){
new JOptionPane().showMessageDialog(null,"请输入学号");
}
else {
String sql="select * from grade where 学号=" + "'" +jtf1.getText() +"'";
try{
if(database.query(sql)){//此处用了个database.executeSQL(sql)提示resultset 关闭
if(!database.rs.first())
{
JOptionPane.showMessageDialog(null,"没有该学生信息...");
} //下面是用来显示其它文本框里的内容
else { database.rs.first();
jtf2.setText(d
展开阅读全文