项目——学生信息管理系统2

目录

用户类型,我们创建一个枚举类

在 org.xingyun.model 包下创建 UserType 枚举类

快速生成 get set 方法

修改代码,下拉框的内容,用我们的枚举类型

给登录按钮绑定事件

我们在 org.xingyun.utils 包下创建一个工具类

Eclipse 智能提示

可以运行测试下

根据不同的身份进行不同的判断

导入我们的SQL脚本,把表建出来

在org.xingyun.utils包下创建一个工具类

创建 Admin 实体类

在 org.xingyun.dao 包下创建 AdminDao 编写登录操作

回到 LoginFrm.java 编写管理员登录逻辑

主界面的制作

添加 JMenuBar

在JMenuBar里面添加 JMenu

在JMenu 下面添加 两个 JMenuItem

添加学生管理的 JMenu

添加班级管理的JMenu

添加帮助的Jemun

关于我们的功能实现

给关于我们按钮添加事件

管理员登录成功跳转页面

修改 MainFrm 提供两个成员变量,注意提供成静态的,以后其他页面要用,直接调用

修改登录页面代码,登录成功后跳转到主页面

可以运行测试一下

修改密码的实现

给修改密码按钮,绑定事件

修改密码的页面制作

在 org.xingyun.view 包下 创建 EditPwdFrm 注意创建成 JInternalFrame

添加面板的关闭,最小化,最大化按钮

页面的制作,参照登录页面的制作

bug 处理,如果点击 关闭按钮不起作用,注释一行代码

注释掉 EditPwdFrm 的main方法

回到 MainFrm.java 点击修改密码,打开修改密码页面

先修改一下MainFrm.java 的布局 添加一个JDesktopPane 拖拽过来后点击居中位置

把 JDesktopPane 提升为成员变量

打开修改密码页面

可以运行测试下

在修改密码页面,取一下用户名

给确认修改按钮添加事件

编写确认修改的方法

编写 AdminDao 提供 修改的方法

退出系统

给退出系统按钮添加事件


用户类型,我们创建一个枚举类

在 org.xingyun.model 包下创建 UserType 枚举类

​
package org.xingyun.model;
​
public enum UserType {ADMIN("管理员",0),TEACHER("教师",1),STUDENT("学生",2);private String name;private int index;private UserType(String name,int index){this.name = name;this.index = index;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getIndex() {return index;}public void setIndex(int index) {this.index = index;}@Overridepublic String toString(){return this.name;}
}
​

快速生成 get set 方法

修改代码,下拉框的内容,用我们的枚举类型

userTypeComboBox.setModel(new DefaultComboBoxModel(new UserType[] {UserType.ADMIN, UserType.TEACHER, UserType.STUDENT}));

给登录按钮绑定事件

//给登录按钮,绑定事件loginButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {//抽取个方法,把事件对象传递过去userLogin(e);}});

// 给登录按钮,绑定事件loginButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {// 抽取个方法,把事件对象传递过去userLogin(e);}});

// 点击登录按钮进行处理protected void userLogin(ActionEvent e) {// 获取用户输入的用户名和密码,以及登录类型 按快捷键 ctrl+1 会补全返回值String username = usernameTextField.getText().toString().trim();String password = passwordTextField.getText().toString().trim();//获取用户的下拉选择UserType selectedItem = (UserType)userTypeComboBox.getSelectedItem();//判断用户名和密码是否为空,这里的 StringUtil 是我们自己编写的一个工具类if(StringUtil.isEmpty(username)){//弹出一个提示框进行提示JOptionPane.showMessageDialog(this, "用户名不能为空!");return; //注意return掉}if(StringUtil.isEmpty(password)){JOptionPane.showMessageDialog(this, "密码不能为空!");return; //注意return掉}
​}
​

我们在 org.xingyun.utils 包下创建一个工具类

public class StringUtil {public static boolean isEmpty(String str){if("".equals(str)|| str == null){return true;}return false;}
}
​

Eclipse 智能提示

依次点击Window --> Perferences(选项设置) --> Java --> Editor(编辑) --> Content Assist(内容辅助/代码提示)

==注意:按快捷键 ctrl+1 会补全返回值==

==ctrl+shift+F 格式化代码==

可以运行测试下

根据不同的身份进行不同的判断

// 点击登录按钮进行处理protected void userLogin(ActionEvent e) {// 获取用户输入的用户名和密码,以及登录类型 按快捷键 ctrl+1 会补全返回值String username = usernameTextField.getText().toString().trim();String password = passwordTextField.getText().toString().trim();// 获取用户的下拉选择UserType selectedItem = (UserType) userTypeComboBox.getSelectedItem();// 判断用户名和密码是否为空if (StringUtil.isEmpty(username)) {// 弹出一个提示框进行提示JOptionPane.showMessageDialog(this, "用户名不能为空!");return; // 注意return掉}if (StringUtil.isEmpty(password)) {JOptionPane.showMessageDialog(this, "密码不能为空!");return; // 注意return掉}// 根据不同的身份进行不同的登录操作if ("管理员".equals(selectedItem.getName())) {
​} else if ("教师".equals(selectedItem.getName())) {
​} else {
​}
​}

导入我们的SQL脚本,把表建出来

从我们的资料中导入SQL脚本即可

在org.xingyun.utils包下创建一个工具类

package org.xingyun.utils;
​
import java.sql.*;
​
public class JDBCUtils{
​private static String url;private static String username;private static String password;
​private JDBCUtils() {}
​static {try {//这些连接数据库的基本参数,写在代码里写死了,不好。//要配合配置文件,把这些参数写到配置文件里,代码里面读取配置文件中的内容Class.forName("com.mysql.jdbc.Driver");url = "jdbc:mysql://localhost:3306/db_student";username = "root";password = "123456";} catch (ClassNotFoundException e) {e.printStackTrace();}}
​//获取连接对象public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url, username, password);}
​//释放资源public static void close(Connection conn, Statement statement, ResultSet resultSet) throws SQLException {if (conn != null) {conn.close();}if (statement != null) {statement.close();}if (resultSet != null) {resultSet.close();}}
​
​public static void close(Connection conn, Statement statement) throws SQLException {if (conn != null) {conn.close();}if (statement != null) {statement.close();}}
}
​

创建 Admin 实体类

public class Admin {private int id;private String name;private String password;private String createDate;//get set 方法自己补上
}   

在 org.xingyun.dao 包下创建 AdminDao 编写登录操作

package org.xingyun.dao;
​
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
​
import org.xingyun.model.Admin;
import org.xingyun.utils.JDBCUtils;
​
public class AdminDao {
​/*** 管理员登陆* @throws SQLException */public Admin login(Admin admin) throws SQLException {//获取连接对象Connection con = JDBCUtils.getConnection();String sql = "select * from s_admin where name=? and password=?";Admin adminRst = null;try {PreparedStatement prst = con.prepareStatement(sql);// 把sql语句传给数据库操作对象prst.setString(1, admin.getName());prst.setString(2, admin.getPassword());ResultSet executeQuery = prst.executeQuery();if (executeQuery.next()) {adminRst = new Admin();adminRst.setId(executeQuery.getInt("id"));adminRst.setName(executeQuery.getString("name"));adminRst.setPassword(executeQuery.getString("password"));adminRst.setCreateDate(executeQuery.getString("createDate"));}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return adminRst;}
}
​

回到 LoginFrm.java 编写管理员登录逻辑

// 点击登录按钮进行处理protected void userLogin(ActionEvent e) {// 获取用户输入的用户名和密码,以及登录类型 按快捷键 ctrl+1 会补全返回值String username = usernameTextField.getText().toString().trim();String password = passwordTextField.getText().toString().trim();// 获取用户的下拉选择UserType selectedItem = (UserType) userTypeComboBox.getSelectedItem();// 判断用户名和密码是否为空if (StringUtil.isEmpty(username)) {// 弹出一个提示框进行提示JOptionPane.showMessageDialog(this, "用户名不能为空!");return; // 注意return掉}if (StringUtil.isEmpty(password)) {JOptionPane.showMessageDialog(this, "密码不能为空!");return; // 注意return掉}// 根据不同的身份进行不同的登录操作Admin admin = null;if ("管理员".equals(selectedItem.getName())) {//创建DaoAdminDao adminDao = new AdminDao();//创建管理员对象Admin adminTmp = new Admin();adminTmp.setName(username);adminTmp.setPassword(password);//调用登录方法admin = adminDao.login(adminTmp);//如果登录失败if(admin == null){JOptionPane.showMessageDialog(this, "用户名或密码错误!");return;}//登录成功,弹出给提示JOptionPane.showMessageDialog(this, "欢迎【"+selectedItem.getName()+"】:"+admin.getName()+"登录本系统!");this.dispose();//关闭登录框//创建主页面new MainFrm(selectedItem, admin).setVisible(true);
​} else if ("教师".equals(selectedItem.getName())) {
​} else {
​}
​}

主界面的制作

在 org.xingyun.view 包下创建 MainFrm

添加 JMenuBar

在JMenuBar里面添加 JMenu

在JMenu 下面添加 两个 JMenuItem

图标自己设置一下

添加学生管理的 JMenu

添加班级管理的JMenu

添加帮助的Jemun

关于我们的功能实现

给关于我们按钮添加事件

//点击关于我们的按键menuItem_6.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {//抽取一个方法,把事件对象传过去aboutMe(e);}});
//关于我们protected void aboutMe(ActionEvent e) {// TODO Auto-generated method stub// TODO Auto-generated method stubString info = "【西安星云科技教育】出品\n";info += "网址:http://www.xingyun.org \n";info += "认真做IT教育,不辜负每一位莘莘学子!";String[] buttons = {"迫不及待去看看!","心情不好以后再说!"};//返回的是 buttons 两个按钮的索引int ret = JOptionPane.showOptionDialog(this, info, "关于我们", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.DEFAULT_OPTION, new ImageIcon(LoginFrm.class.getResource("/images/学生.png")), buttons, null);if(ret == 0){//采用Java 调用系统浏览器打开制定try {URI uri = new URI("http://www.baidu.com");Desktop.getDesktop().browse(uri);//Runtime.getRuntime().exec("explorer http://www.163.com"); //这个也能打开浏览器} catch (Exception e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}else{JOptionPane.showMessageDialog(this, "你真是狠心,坏淫!");}}

管理员登录成功跳转页面

修改 MainFrm 提供两个成员变量,注意提供成静态的,以后其他页面要用,直接调用

public static UserType userType; public static Object userObject;

代码如下: ==注意:注释掉main方法,可以屏蔽直接运行打开,修改构造方法,为增加的两个成员变量赋值==

public class MainFrm extends JFrame {
​private JPanel contentPane;//用户类型public static UserType userType;// 用户对象public static Object userObject;
​/*** Launch the application.*///注释掉main方法,不要直接运行打开
/*  public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {MainFrm frame = new MainFrm();frame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}
*//*** Create the frame.*/public MainFrm(UserType userType,Object userObject) {//给成员变量赋值this.userType = userType;this.userObject = userObject;setTitle("学生信息系统主界面");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 1082, 663);//.....其他代码略}   

修改登录页面代码,登录成功后跳转到主页面

// 点击登录按钮进行处理protected void userLogin(ActionEvent e) throws SQLException {// 获取用户输入的用户名和密码,以及登录类型 按快捷键 ctrl+1 会补全返回值String username = usernameTextField.getText().toString().trim();String password = passwordTextField.getText().toString().trim();// 获取用户的下拉选择UserType selectedItem = (UserType) userTypeComboBox.getSelectedItem();// 判断用户名和密码是否为空if (StringUtil.isEmpty(username)) {// 弹出一个提示框进行提示JOptionPane.showMessageDialog(this, "用户名不能为空!");return; // 注意return掉}if (StringUtil.isEmpty(password)) {JOptionPane.showMessageDialog(this, "密码不能为空!");return; // 注意return掉}// 根据不同的身份进行不同的登录操作Admin admin = null;if ("管理员".equals(selectedItem.getName())) {//创建DaoAdminDao adminDao = new AdminDao();//创建管理员对象Admin adminTmp = new Admin();adminTmp.setName(username);adminTmp.setPassword(password);//调用登录方法admin = adminDao.login(adminTmp);//如果登录失败if(admin == null){JOptionPane.showMessageDialog(this, "用户名或密码错误!");return;}//登录成功,弹出给提示JOptionPane.showMessageDialog(this, "欢迎【"+selectedItem.getName()+"】:"+admin.getName()+"登录本系统!");this.dispose();//关闭登录框//创建主页面new MainFrm(selectedItem, admin).setVisible(true);
​} else if ("教师".equals(selectedItem.getName())) {
​} else {
​}
​}
​

可以运行测试一下

修改密码的实现

给修改密码按钮,绑定事件

//点击修改密码的事件处理menuItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {//抽取一个方法,把事件对象传过去updatePassword(e);}});
    //修改密码protected void updatePassword(ActionEvent e) {//打开一个修改密码的页面}

修改密码的页面制作

在 org.xingyun.view 包下 创建 EditPwdFrm 注意创建成 JInternalFrame

添加面板的关闭,最小化,最大化按钮

页面的制作,参照登录页面的制作

bug 处理,如果点击 关闭按钮不起作用,注释一行代码

//setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

你可以修改一下几个组件的名称

private JTextField cureentUser; 当前用户 ​ private JTextField oldPwdTextField; 旧密码 ​ private JTextField newPwdTextField; 新密码 ​ private JTextField okNewPwdTextField; 确认新密码

JButton ok_updatePwdButton 确认修改按钮

注释掉 EditPwdFrm 的main方法

代码如下: ==注意:注释掉main方法,可以屏蔽直接运行打开==

可以加一行代码,设置窗口居中 //设置窗口位置居中打开 setLocation(null);

public class EditPwdFrm extends JFrame {
​private JPanel contentPane;private JTextField cureentUser;private JTextField oldPwdTextField;private JTextField newPwdTextField;private JTextField okNewPwdTextField;​/*** Launch the application. 注释掉main方法*//*public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {EditPwdFrm frame = new EditPwdFrm();frame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}
*//*** Create the frame.*/public EditPwdFrm() {setTitle("修改密码");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 566, 410);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));setContentPane(contentPane);//设置窗口位置居中打开setLocation(null);// .... 其他代码略}   

回到 MainFrm.java 点击修改密码,打开修改密码页面

先修改一下MainFrm.java 的布局 添加一个JDesktopPane 拖拽过来后点击居中位置

把 JDesktopPane 提升为成员变量

public class MainFrm extends JFrame {
​private JPanel contentPane;//用户类型public static UserType userType;// 用户对象public static Object userObject;private JDesktopPane desktopPane;public MainFrm(UserType userType,Object userObject) {//给成员变量赋值this.userType = userType;this.userObject = userObject;//......其余代码略//把他提升为成员变量desktopPane = new JDesktopPane();contentPane.add(desktopPane, BorderLayout.CENTER);}
​}

打开修改密码页面

​
//打开修改密码面板protected void updatePassword(ActionEvent e) {// 打开一个修改密码的页面// TODO Auto-generated method stubEditPwdFrm editPasswordFrm = new EditPwdFrm();editPasswordFrm.setVisible(true);// 添加子面板desktopPane.add(editPasswordFrm);}
​

可以运行测试下

在修改密码页面,取一下用户名

//根据不同的身份在,修改密码页面展示用户名if("管理员".equals(MainFrm.userType.getName())){Admin admin = (Admin)MainFrm.userObject;cureentUser.setText("【系统管理员】" + admin.getName());}

测试一下

给确认修改按钮添加事件

//确认修改按钮的点击事件ok_updatePwdButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {//抽取一个方法submitEdit(e);}});

编写确认修改的方法

//确认修改protected void submitEdit(ActionEvent e) {//获取输入框的输入内容String oldPassword = oldPwdTextField.getText().toString().trim();String newPassword = newPwdTextField.getText().toString().trim();String conformPassword = okNewPwdTextField.getText().toString().trim();if (StringUtil.isEmpty(oldPassword)) {JOptionPane.showMessageDialog(this, "请填写旧密码!");return;}if (StringUtil.isEmpty(newPassword)) {JOptionPane.showMessageDialog(this, "请填写新密码!");return;}if (StringUtil.isEmpty(conformPassword)) {JOptionPane.showMessageDialog(this, "请确认新密码!");return;}if (!newPassword.equals(conformPassword)) {JOptionPane.showMessageDialog(this, "两次密码输入不一致!");return;}if ("管理员".equals(MainFrm.userType.getName())) {AdminDao adminDao = new AdminDao();Admin adminTmp = new Admin();Admin admin = (Admin) MainFrm.userObject;adminTmp.setName(admin.getName());adminTmp.setId(admin.getId());adminTmp.setPassword(oldPassword);try {//调用修改密码的方法JOptionPane.showMessageDialog(this,adminDao.editPassword(adminTmp, newPassword));} catch (HeadlessException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}return;}
​}
​
}

编写 AdminDao 提供 修改的方法

public class AdminDao {//登录方法略...public String editPassword(Admin admin, String newPassword) throws SQLException {//获取连接对象Connection con = JDBCUtils.getConnection();String sql = "select * from s_admin where id=? and password=?";PreparedStatement prst = null;int id = 0;try {prst = con.prepareStatement(sql);prst.setInt(1, admin.getId());prst.setString(2, admin.getPassword());ResultSet executeQuery = prst.executeQuery();if (!executeQuery.next()) {String retString = "旧密码错误!";return retString;}id = executeQuery.getInt("id");} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} // 把sql语句传给数据库操作对象String retString = "修改失败";String sqlString = "update s_admin set password = ? where id = ?";try {prst = con.prepareStatement(sqlString);prst.setString(1, newPassword);prst.setInt(2, id);int rst = prst.executeUpdate();if (rst > 0) {retString = "密码修改成功!";}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();} // 把sql语句传给数据库操作对象return retString;}
}
​

退出系统

给退出系统按钮添加事件

    //退出系统按钮事件menuItem_1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if(JOptionPane.showConfirmDialog(MainFrm.this, "确定退出么?") == JOptionPane.OK_OPTION){System.exit(0);}}});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/1292.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四年之约不负等待,耕升 GeForce RTX 4060 踏雪+DLSS 3实现百帧玩光追

昨日,耕升正式发布了GeForce RTX 40系列的最新成员耕升 GeForce RTX 4060 追风。作为NVIDIA密切合作的核心AIC合作伙伴耕升,也将在今日为玩家带来了更多耕升GeForce RTX 40系列成员——耕升 GeForce RTX 4060 踏雪。作为耕升 GeForce RTX 4060系列中的双…

Axure教程—上传文件

本文介绍用Axure制作文件上传效果 预览 预览地址:https://6q4of2.axshare.com 功能 1、点击”文件上传“按钮,显示上传的文件 2、点击”删除“图片,显示提示”是否要删除“,点击”是“,删除数据,点击”否…

基于Java人力资源管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

树形控件父节点不选中,只能选中子节点,如何实现?

rTree 树形控件一级菜单没有复选框,子菜单有复选框,如何实现?_阿 尭的博客-CSDN博客 接上一篇博客,继续深入功能,如何只选中叶子节点而不选中父节点。 1.在节点被点击时的回调,node-click中,返…

什么是域控服务器?域控服务器功能?部署域控需要考虑因素?域控组策略功能?

一、什么是域控制服务器? 域控制器(Domain Controller)是在Windows Server操作系统上运行的一个服务角色,它用于管理和控制一个或多个计算机的安全策略、用户身份验证和授权等任务。域控制器通常是用于企业网络中的主要身份验证和…

「C/C++」C++类与类的关系(UML类图+代码说明)

✨博客主页:何曾参静谧的博客 📌文章专栏:「C/C」C/C学习 相关术语 🎯依赖关系(Dependency):表示一个类的实现需要另一个类的协助,虚线箭头,箭头指向被依赖的类。 &#…

简要介绍 | 基于Diffusion model的图像生成和重建

注1:本文系“简要介绍”系列之一,仅从概念上对基于Diffusion model的图像生成和重建进行非常简要的介绍,不适合用于深入和详细的了解。 基于Diffusion model的图像生成和重建 What are Stable Diffusion Models and Why are they a Step Forw…

泰坦尼克号幸存者预测

本文所有的代码及数据均存放与https://github.com/MADMAX110/Titanic 泰坦尼克号幸存者预测挑战赛是一个非常受欢迎的机器学习实践项目。这是 Kaggle.com 上最受欢迎的比赛之一。 数据中有3个文件:train.csv,test.csv,和gender_submit .csv。 train.csv包…

小研究 - Java 指针分析综述(三)

近年来静态程序分析已成为保障软件可靠性、安全性和高效性的关键技术之一. 指针分析作为基 础程序分析技术为静态程序分析提供关于程序的一系列基础信息,例如程序任意变量的指向关系、变量 间的别名关系、程序调用图、堆对象的可达性等. 介绍了 Java 指针分析的重要…

【Docker】LXC所实现的隔离性、Linux Namespace等讲解

前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 📕作者简介:热…

volume 、namespace

顺带说一下 volume 和 namespace ,咱们就开始分享一下 service 是什么 volume 是什么 还记得 docker 的 volume 吗,是一个数据卷 在 K8S 中,volume 是 pod 中能够被多个容器访问的共享目录 ,实际上和 docker 是一样的 volume 是…

JMeter分布式压测,启动执行机器报错: Port already in use: 1099

Problem creating registry: java.rmi.server.ExportException: Port already in use: 1099; nested exception is: java.net.BindException: Address already in use (Bind failed) 当压测量大的时候我们有时候会失败,然后再接着压测,这样就容易造成端口…