精华内容
下载资源
问答
  • 文章目录前言一、学生管理系统最终目标二、功能实现分析1.账户库、注册账号与找回密码2.录入、更新信息成绩3.注销、修改密码4.其他功能三、具体实现四、源码总结欢迎使用Markdown编辑器新的改变功能快捷键合理的创建...

    前言

    实现简单的学生管理系统,适用于新手学习

    成果演示

    学生管理系统演示

    一. 学生管理系统有什么功能

    1. 能够创建账号,并分清哪些账号时管理员的,哪些是学生的
    2. 忘记密码时只需要输入账号即可查询密码,即"找回密码"功能
    3. 学生有自己的基本信息:①学号 ②姓名 ③电话 ④地址。这些信息只能由管理员添加、修改或删除,学生仅仅有查询及修改本人信息的权限,没有权限涉及其他学生信息。
    4. 学生还有成绩,具体为:①语文成绩 ②数学成绩 ③英语成绩。根据实际,学生同样只有查询自己成绩的权利
    5. 学生可以修改自己的密码;管理员可以修改任何人的密码
    6. 管理员可以注销学生账号,也可以查看当前所有账户的账号与密码

    二. 学生管理系统各主界面

    1. Mysql连接界面

    1. 要实现管理数据,首先需要令Eclipse连接上数据库,即JDBC技术。首先需要导入电脑中安装好的Mysql的jar包,具体往项目中添加jar包的方式如下
      在这里插入图片描述在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    2. 考虑到每个人设置的Mysql登录密码不一样,为了使学生管理系统在每个电脑都能够运行,我们在进入系统时候需要手动输入Mysql的账号与密码,界面图如下
      在这里插入图片描述

    3. 可以看到,只需要对"连接"按钮进行事件绑定即可,具体做法是令其监听两个输入框,当账号密码都正确时会得到一个连接Connection con,后续访问数据库都需要依靠这个连接;若账号密码与本地Mysql不匹配,则抛出异常,出现"账号密码错误"的提示框。具体的事件实现会在后边讲,这里主要说一下界面组成

    2. 学生管理系统登录界面

    1. 来到这个界面时,说明我们已经成功连接上数据库,此时作为一个学生管理系统,必定会有学生和管理员之分,两者的权限不同。因此我们需要一个符号来对登录者进行识别
    2. 我所选择的方式是按钮,当选择管理员身份时说明来访者是管理员,登录成功后进入管理员功能界面;选择学生身份时说明来访者是学生,登录成功后进入学生功能界面;未选择身份时不允许进入系统
    3. 另外在此界面还需要有注册账号忘记密码的按钮,这两个功能是比较常见的,也是必要的,因为登录有学生与管理员之分,所以注册也自然有学生和管理员之分。根据实际,只允许管理员注册账号,这是两者不同权限之一

    在这里插入图片描述

    3. 管理员功能界面

    1. 进入到这个界面时,说明我们已经用一个管理员账号登录成功了
    2. 根据设想,管理员的权限主要有以下几点:
      1. 查询当前所有的账号与密码
      2. 添加学生的基本信息
      3. 查询/修改学生信息
      4. 录入/查询/修改学生成绩
      5. 注销本人/学生账户
      6. 修改本人/学生密码
      7. 返回到学生管理系统登录界面
    3. 每次查询得到的信息我们需要将其显示出来,并且考虑到内容比较多,我们还希望显示的面板会有滚动条,根据这些设想,界面设计如下

    在这里插入图片描述

    4. 学生功能界面

    1. 进入到这个界面时,说明我们已经用一个学生账号登录成功了
    2. 根据设想,学生权限主要有以下几点:
      1. 更新/查询本人信息
      2. 查询本人成绩
      3. 修改本人密码
      4. 返回学生管理系统登录界面
    3. 同样,查询的内容需要显示区域,也需要加上滚动条,因此界面设置如下
      在这里插入图片描述

    三. Mysql表准备

    1.登录、账户库、注册账号、找回密码、修改密码等

    1. 我们先创建一个student_system数据库用来存放所有与学生管理系统相关的表内容(数据库以及表的创建语句会在后边给出)
    2. 所谓登录功能的原理很简单,即将输入的账号作为关键字去相应表中查询密码,若输入的密码与查询得到的密码一致,说明账号密码正确,可以进入下一步操作;否则账号密码错误,出现警示框,不操作
    3. 因此我们首先需要在Mysql建立两个表adminstu用来分别存放管理员的账号密码以及学生的账号密码,为了便于数据处理,我将所有的类型都设置为char,表结构如下
      在这里插入图片描述

    2.录入、更新信息/成绩

    • 同样,学生信息也需要一张information表来维护;而成绩则放在grade
    • 因为姓名可能会出现重复的,因此我们的主键选择学号,学号一定是唯一的。
    • 更新的原理也很简单:首先查询学号是否存在,若存在则选择更新哪些值,新的值是什么?接着执行更新操作即可。
    • 录入原理类似,不过录入只能录一次,而更新可以更新多次
    • 两张表结构如下

    在这里插入图片描述
    在这里插入图片描述

    3.注销、修改密码

    • 注销操作即抹除所有与当前学号相关的内容,因此注销学生账户时不能仅仅将账号密码表的数据删除,还需要将成绩、信息的记录一并删除。免得后面创建账户时出现混乱

    4. Mysql建表语句

    create 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\\学生管理系统\\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. 类的封装思想(万物皆为对象)

    1. 每一个界面对应一个Attribute对象,对象内封装了界面的所有组件,当需要对组件进行操作时(如获取文本框的值),只需要对Attribute内的对象进行操作即可,每个事件都拥有这个对象,因此操作起来会十分方便,同时代码量也大大减少
    2. 所有的事件都由相关类实现接口来完成,将图形化和功能实现分隔开,更加方便维护,代码也更加美观
    3. 一些经常需要使用的功能可以将其写成静态方法,封装在工具包tool中,如sql语句查询/更新需要频繁使用,因此可以将其写入工具包的工具类中

    2. 分层思想

    用不同的包放置不同功能的类,如mysql连接相关的类放入mysql_join包中;图形化相关的类放入gui包中;事件相关的类放入event包中;event包内与管理员功能相关的类放入admin_function包中……这样的好处之一是当发现BUG时能够很快定位到问题发生处,并进行修复与维护

    3. 我遇到的一些问题

    1. ==导出包运行时==显示"没有主清单属性"

    在这里插入图片描述

    1. 可以成功运行后,发现项目中的背景图片无法正常显示
    2. 可以成功运行也可以显示图片后,发现数据库无法连接

    解决方法

    1. 首先是数据库问题,无法接通是因为导出来的jar包运行时找不到mysql的jar包,因此数据库相关类就失效了,自然就连接不上数据库。我们解决的关键是让其能够认识mysql的jar包,因此我们需要将mysql的jar包一起封装进项目中导出,具体操作方法如下:

      1. 解压mysql的jar包
        在这里插入图片描述

      2. 将解压出来的com文件夹直接拖进Eclipse的项目中
        在这里插入图片描述

      3. 接着手动创建一个文件,命名如下
        在这里插入图片描述

      4. 文件内容如下
        在这里插入图片描述

    2. 接着是没有主属性清单的问题,这个问题的本质在于jar包运行时不知道那个类中有主函数,因此我们让他知道就行,依然是对MANIFEST.MF进行操作。我的主类为路径src下的stu_system包下的Start.java,所以我的主类全名为:stu_system.Start

    在这里插入图片描述

    1. 最后是图片显示问题,这个是图片路径问题,因为脱离了Exclipse环境后的JAR包在运行时只认识主类,所以我们的所有路径都应该围绕主类展开才能够被识别,Java中有提供获得当前类路径的方法:类名.class.getResource(字符串)

      如我的图片img包和主类Start.java处于同一级,因此对于img里装着的校门.jpg可以这样取得

      Start.class.getResource("img/校门.jpg")
      

    4. 源码

    1. Start.java(主函数)

    package stu_system;
    import java.awt.EventQueue;
    import org.junit.Test;
    import stu_system.gui.MysqlPanel;
    
    public class Start {
    
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					MysqlPanel frame = new MysqlPanel();
    					frame.EventAdd();
    					frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    }
    
    

    2. 图形化gui包

    1. AdminFunctionPanel.java(管理员功能界面)

    package stu_system.gui;
    
    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    import javax.swing.plaf.FontUIResource;
    
    import com.mysql.jdbc.Connection;
    
    import stu_system.Start;
    import stu_system.event.admin_function.AccountClick;
    import stu_system.event.admin_function.Attribute;
    import stu_system.event.admin_function.ButtonClickCarton;
    import stu_system.event.admin_function.DisposeClick;
    import stu_system.event.admin_function.InsertClick;
    import stu_system.event.admin_function.SearchClick;
    import stu_system.event.admin_function.UpdateGradeClick;
    import stu_system.event.admin_function.UpdateInfoClick;
    import stu_system.event.admin_function.UpdatePasswordClick;
    
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import java.awt.Font;
    import java.awt.Image;
    import java.awt.TextArea;
    import java.awt.event.ActionListener;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.awt.event.ActionEvent;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.UIManager;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import java.awt.Color;
    import java.awt.SystemColor;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    
    public class AdminFunctionPanel {
    	private JPanel contentPane = new JPanel();
    	private JFrame jf = new JFrame(); // 当前框架
    	private JTextArea showArea = new JTextArea(); // 显示区域
    	private JLabel Menu = new JLabel("\u663E\u793A\uFF1A"); // 菜单条目
    	private JButton newStuButton = new JButton("\u65B0\u589E\u5B66\u751F"); // 新增学生按钮
    	private JButton searchInfoButton = new JButton("\u67E5\u8BE2\u4FE1\u606F"); // 查询信息按钮
    	private JButton insertGradeButton = new JButton("\u5F55\u5165\u6210\u7EE9"); // 插入成绩按钮
    	private JButton searchGradeButton = new JButton("\u67E5\u8BE2\u6210\u7EE9"); // 查询成绩按钮
    	private JButton updatePasswordButton = new JButton("\u4FEE\u6539\u5BC6\u7801"); // 修改密码按钮
    	private JButton disposeAccountButton = new JButton("\u6CE8\u9500\u8D26\u6237"); // 注销账户按钮
    	private JButton updateInfoButton = new JButton("\u4FEE\u6539\u4FE1\u606F"); // 修改信息按钮
    	private JButton returnButton = new JButton("\u8FD4\u56DE"); // 返回上一界面按钮
    	private JButton accountSetButton = new JButton("\u8D26\u53F7\u5E93"); // 查看所有账户按钮
    	private JButton updateGradeButton = new JButton("\u4FEE\u6539\u6210\u7EE9");
    
    	public AdminFunctionPanel(Connection con, String myNum) {
    		Attribute attr = new Attribute(con, contentPane, jf, showArea, Menu, newStuButton, searchInfoButton,
    				insertGradeButton, searchGradeButton, updatePasswordButton, disposeAccountButton, updateInfoButton,
    				returnButton, accountSetButton, updateGradeButton, myNum);
    		jf.setTitle("\u7BA1\u7406\u5458\u529F\u80FD\u754C\u9762");
    		jf.setResizable(false);
    		// 设置按钮字体大小
    		UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font("楷体", Font.BOLD, 25)));
    		// 设置文本字体大小
    		UIManager.put("OptionPane.messageFont", new FontUIResource(new Font("楷体", Font.BOLD, 30)));
    		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		jf.setBounds(100, 100, 1150, 695);
    		jf.setContentPane(contentPane);
    
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		contentPane.setLayout(null);
    		
    		JPanel panel = new JPanel();
    		panel.setOpaque(false);
    		panel.setBorder(null);
    		panel.setBounds(226, 89, 874, 490);
    		contentPane.add(panel);
    		panel.setLayout(null);
    
    		JScrollPane scrollPane = new JScrollPane();
    		scrollPane.setOpaque(false);
    		scrollPane.getViewport().setOpaque(false); // 滚动面板设置透明还需要多这一条
    		scrollPane.setBorder(null);
    		scrollPane.setBounds(0, 0, 874, 490);
    		panel.add(scrollPane); //面板放滚动面板
    
    		showArea.setLineWrap(true);
    		scrollPane.setViewportView(showArea);
    		showArea.setFont(new Font("楷体", Font.BOLD, 28));
    
    		Menu.setForeground(UIManager.getColor("Button.highlight"));
    		Menu.setFont(new Font("楷体", Font.BOLD, 28));
    		Menu.setBounds(253, 33, 847, 59);
    		contentPane.add(Menu);
    
    		showArea.setForeground(new Color(224, 255, 255));
    		showArea.setOpaque(false);
    		showArea.setEditable(false);
    
    		newStuButton.addMouseListener(new ButtonClickCarton(attr, 0));
    		newStuButton.addActionListener(new InsertClick(attr, 0));
    		newStuButton.setFont(new Font("楷体", Font.PLAIN, 28));
    		newStuButton.setBounds(29, 84, 182, 47);
    		contentPane.add(newStuButton);
    
    		searchInfoButton.addMouseListener(new ButtonClickCarton(attr, 1));
    		searchInfoButton.addActionListener(new SearchClick(attr, 1));
    		searchInfoButton.setFont(new Font("楷体", Font.PLAIN, 28));
    		searchInfoButton.setBounds(29, 146, 182, 47);
    		contentPane.add(searchInfoButton);
    
    		insertGradeButton.addMouseListener(new ButtonClickCarton(attr, 2));
    		insertGradeButton.addActionListener(new InsertClick(attr, 1));
    		insertGradeButton.setFont(new Font("楷体", Font.PLAIN, 28));
    		insertGradeButton.setBounds(29, 208, 182, 47);
    		contentPane.add(insertGradeButton);
    
    		searchGradeButton.addMouseListener(new ButtonClickCarton(attr, 3));
    		searchGradeButton.addActionListener(new SearchClick(attr, 0));
    		searchGradeButton.setFont(new Font("楷体", Font.PLAIN, 28));
    		searchGradeButton.setBounds(29, 270, 182, 47);
    		contentPane.add(searchGradeButton);
    
    		updatePasswordButton.addMouseListener(new ButtonClickCarton(attr, 4));
    		updatePasswordButton.addActionListener(new UpdatePasswordClick(attr));
    		updatePasswordButton.setFont(new Font("楷体", Font.PLAIN, 28));
    		updatePasswordButton.setBounds(29, 518, 182, 47);
    		contentPane.add(updatePasswordButton);
    
    		disposeAccountButton.addMouseListener(new ButtonClickCarton(attr, 5));
    		disposeAccountButton.addActionListener(new DisposeClick(attr));
    		disposeAccountButton.setFont(new Font("楷体", Font.PLAIN, 28));
    		disposeAccountButton.setBounds(29, 456, 182, 47);
    		contentPane.add(disposeAccountButton);
    
    		updateGradeButton.addMouseListener(new ButtonClickCarton(attr, 9));
    		updateGradeButton.addActionListener(new UpdateGradeClick(attr));
    		updateGradeButton.setFont(new Font("楷体", Font.PLAIN, 28));
    		updateGradeButton.setBounds(29, 332, 182, 47);
    		contentPane.add(updateGradeButton);
    
    		updateInfoButton.addMouseListener(new ButtonClickCarton(attr, 6));
    		updateInfoButton.addActionListener(new UpdateInfoClick(attr));
    		updateInfoButton.setFont(new Font("楷体", Font.PLAIN, 28));
    		updateInfoButton.setBounds(29, 394, 182, 47);
    		contentPane.add(updateInfoButton);
    		
    		accountSetButton.addMouseListener(new ButtonClickCarton(attr, 8));
    		accountSetButton.addActionListener(new AccountClick(attr));
    		accountSetButton.setFont(new Font("楷体", Font.PLAIN, 28));
    		accountSetButton.setBounds(29, 22, 182, 47);
    		contentPane.add(accountSetButton);
    
    		returnButton.addMouseListener(new ButtonClickCarton(attr, 7));
    		returnButton.addActionListener(new InsertClick(attr, 2));
    		returnButton.setFont(new Font("楷体", Font.PLAIN, 28));
    		returnButton.setBounds(29, 580, 182, 47);
    		contentPane.add(returnButton);
    		ImageIcon icon = new ImageIcon(Start.class.getResource("img/校门.jpg"));// 背景图
    		Image h = icon.getImage().getScaledInstance(jf.getWidth(), jf.getHeight(), icon.getImage().SCALE_DEFAULT);
    		icon = new ImageIcon(h); // 将设置好大小的图片重新分配图片图标对象
    		JLabel morning = new JLabel(icon);// 往一个标签中加入图片
    		morning.setBounds(0, 0, icon.getIconWidth(), icon.getIconHeight());// 设置标签位置大小为图片大小
    		jf.getLayeredPane().add(morning, Integer.valueOf(Integer.MIN_VALUE));// 标签添加到第二层面板
    
    		JPanel bg = (JPanel) jf.getContentPane();
    		bg.setOpaque(false); // 底层面板透明,处在最底层的图片才看得见
    
    		jf.setVisible(true);
    	}
    }
    
    

    2. InsertGradePanel.java(插入成绩界面)

    package stu_system.gui;
    
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    
    import com.mysql.jdbc.Connection;
    
    import stu_system.event.admin_function.grade_insert.Attribute;
    import stu_system.event.admin_function.grade_insert.InsertGradeClick;
    
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    
    import java.awt.Font;
    import javax.swing.JTextField;
    import java.awt.event.ActionListener;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.awt.event.ActionEvent;
    
    public class InsertGradePanel {
    	private JDialog jd = null;
    	private JTextField chineseField = new JTextField();
    	private JTextField mathField = new JTextField();
    	private JTextField englishField = new JTextField();
    	private JTextField nameField = new JTextField();
    	private JTextField numField = new JTextField();
    	private JButton affirmButton = new JButton("\u5F55\u5165");
    
    	public InsertGradePanel(JFrame jf, Connection con) {
    		jd = new JDialog(jf, true);
    		Attribute attr = new Attribute(con, jd, chineseField, mathField, englishField, nameField, numField,
    				affirmButton);
    		jd.setResizable(false);
    		jd.setTitle("\u6210\u7EE9\u5F55\u5165");
    		jd.setBounds(100, 100, 826, 706);
    		jd.getContentPane().setLayout(null);
    
    		chineseField.setFont(new Font("楷体", Font.PLAIN, 28));
    		chineseField.setBounds(354, 339, 122, 41);
    		jd.getContentPane().add(chineseField);
    		chineseField.setColumns(10);
    
    		mathField.setFont(new Font("楷体", Font.PLAIN, 28));
    		mathField.setColumns(10);
    		mathField.setBounds(354, 414, 122, 41);
    		jd.getContentPane().add(mathField);
    
    		englishField.setFont(new Font("楷体", Font.PLAIN, 28));
    		englishField.setColumns(10);
    		englishField.setBounds(354, 486, 122, 41);
    		jd.getContentPane().add(englishField);
    
    		affirmButton.addActionListener(new InsertGradeClick(attr));
    		affirmButton.setFont(new Font("楷体", Font.BOLD, 28));
    		affirmButton.setBounds(578, 303, 131, 113);
    		jd.getContentPane().add(affirmButton);
    
    		nameField.setFont(new Font("楷体", Font.PLAIN, 28));
    		nameField.setColumns(10);
    		nameField.setBounds(354, 265, 122, 41);
    		jd.getContentPane().add(nameField);
    
    		numField.setFont(new Font("楷体", Font.PLAIN, 28));
    		numField.setColumns(10);
    		numField.setBounds(354, 196, 122, 41);
    		jd.getContentPane().add(numField);
    
    		JLabel chineseGradeLabel = new JLabel("\u8BED\u6587\u6210\u7EE9\uFF1A");
    		chineseGradeLabel.setFont(new Font("楷体", Font.BOLD, 32));
    		chineseGradeLabel.setBounds(169, 322, 170, 71);
    		jd.getContentPane().add(chineseGradeLabel);
    
    		JLabel mathGradeLabel = new JLabel("\u6570\u5B66\u6210\u7EE9\uFF1A");
    		mathGradeLabel.setFont(new Font("楷体", Font.BOLD, 32));
    		mathGradeLabel.setBounds(169, 397, 170, 71);
    		jd.getContentPane().add(mathGradeLabel);
    
    		JLabel englishGradeLabel = new JLabel("\u82F1\u8BED\u6210\u7EE9\uFF1A");
    		englishGradeLabel.setFont(new Font("楷体", Font.BOLD, 32));
    		englishGradeLabel.setBounds(169, 469, 170, 71);
    		jd.getContentPane().add(englishGradeLabel);
    
    		JLabel TitleLabel = new JLabel("\u6210\u7EE9\u5F55\u5165");
    		TitleLabel.setFont(new Font("楷体", Font.BOLD | Font.ITALIC, 40));
    		TitleLabel.setBounds(327, 58, 195, 49);
    		jd.getContentPane().add(TitleLabel);
    
    		JLabel nameLabel = new JLabel("\u59D3\u540D\uFF1A");
    		nameLabel.setFont(new Font("楷体", Font.BOLD, 32));
    		nameLabel.setBounds(237, 248, 102, 71);
    		jd.getContentPane().add(nameLabel);
    
    		JLabel lastTwoNumLabel = new JLabel("\u5B66\u53F7\u540E\u4E24\u4F4D\uFF1A");
    		lastTwoNumLabel.setFont(new Font("楷体", Font.BOLD, 32));
    		lastTwoNumLabel.setBounds(135, 191, 215, 59);
    		jd.getContentPane().add(lastTwoNumLabel);
    
    		jd.setVisible(true);
    	}
    }
    

    3. InsertStuPanel.java(新增学生界面)

    package stu_system.gui;
    
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    import javax.swing.plaf.FontUIResource;
    
    import com.mysql.jdbc.Connection;
    
    import stu_system.event.admin_function.info_insert.Attribute;
    import stu_system.event.admin_function.info_insert.InsertStuClick;
    
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    
    import java.awt.Font;
    import javax.swing.JTextField;
    import javax.swing.UIManager;
    
    import java.awt.event.ActionListener;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.awt.event.ActionEvent;
    
    public class InsertStuPanel {
    	private JDialog jd = null;
    	private JTextField numField = new JTextField();
    	private JTextField nameField = new JTextField();
    	private JTextField teleField = new JTextField();
    	private JTextField addrField = new JTextField();
    	private JButton AffirmClick = new JButton("\u786E\u8BA4");
    	public InsertStuPanel(JFrame jf, Connection con) {
    		jd = new JDialog(jf, true);
    		Attribute attr = new Attribute(con, jd, numField, nameField, teleField, addrField);
    		// 设置按钮字体大小
    		UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font("楷体", Font.BOLD, 25)));
    		// 设置文本字体大小
    		UIManager.put("OptionPane.messageFont", new FontUIResource(new Font("楷体", Font.BOLD, 30)));
    
    		jd.setTitle("\u8F93\u5165\u57FA\u672C\u4FE1\u606F");
    		jd.setBounds(100, 100, 699, 590);
    		jd.getContentPane().setLayout(null);
    
    		JLabel numLabel = new JLabel("\u5B66\u53F7\uFF1A");
    		numLabel.setFont(new Font("楷体", Font.PLAIN, 28));
    		numLabel.setBounds(121, 93, 84, 39);
    		jd.getContentPane().add(numLabel);
    
    		JLabel nameLabel = new JLabel("\u59D3\u540D\uFF1A");
    		nameLabel.setFont(new Font("楷体", Font.PLAIN, 28));
    		nameLabel.setBounds(121, 169, 84, 39);
    		jd.getContentPane().add(nameLabel);
    
    		JLabel teleLabel = new JLabel("\u7535\u8BDD\uFF1A");
    		teleLabel.setFont(new Font("楷体", Font.PLAIN, 28));
    		teleLabel.setBounds(121, 245, 84, 39);
    		jd.getContentPane().add(teleLabel);
    
    		JLabel addrLabel = new JLabel("\u5730\u5740\uFF1A");
    		addrLabel.setFont(new Font("楷体", Font.PLAIN, 28));
    		addrLabel.setBounds(121, 324, 84, 39);
    		jd.getContentPane().add(addrLabel);
    
    		numField.setText("18140809032");
    		numField.setFont(new Font("楷体", Font.PLAIN, 24));
    		numField.setBounds(222, 96, 336, 36);
    		jd.getContentPane().add(numField);
    		numField.setColumns(10);
    
    		nameField.setFont(new Font("楷体", Font.PLAIN, 24));
    		nameField.setColumns(10);
    		nameField.setBounds(222, 169, 336, 36);
    		jd.getContentPane().add(nameField);
    
    		teleField.setFont(new Font("楷体", Font.PLAIN, 24));
    		teleField.setColumns(10);
    		teleField.setBounds(220, 245, 336, 36);
    		jd.getContentPane().add(teleField);
    
    		addrField.setFont(new Font("楷体", Font.PLAIN, 24));
    		addrField.setColumns(10);
    		addrField.setBounds(220, 324, 336, 36);
    		jd.getContentPane().add(addrField);
    
    		
    		AffirmClick.addActionListener(new InsertStuClick(attr));
    		AffirmClick.setFont(new Font("楷体", Font.PLAIN, 28));
    		AffirmClick.setBounds(303, 403, 141, 65);
    		jd.getContentPane().add(AffirmClick);
    		
    		jd.setResizable(false);
    		jd.setVisible(true);
    	}
    }
    

    4. LoginPanel.java(登录界面)

    package stu_system.gui;
    
    import java.awt.EventQueue;
    
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import javax.swing.JButton;
    import javax.swing.JDialog;
    
    import java.awt.event.ActionListener;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.awt.event.ActionEvent;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    
    import java.awt.Font;
    import java.awt.Image;
    
    import javax.swing.SwingConstants;
    import javax.swing.BorderFactory;
    import javax.swing.ImageIcon;
    import java.awt.Color;
    import javax.swing.UIManager;
    import javax.swing.plaf.FontUIResource;
    
    import stu_system.Start;
    import stu_system.event.login_panel.AdminClick;
    import stu_system.event.login_panel.Attribute;
    import stu_system.event.login_panel.FogetClick;
    import stu_system.event.login_panel.IdentityButtonCarton;
    import stu_system.event.login_panel.LoginClick;
    import stu_system.event.login_panel.ReIdentityClick;
    import stu_system.event.login_panel.RegisterClick;
    import stu_system.event.login_panel.StuClick;
    
    import java.sql.Connection;
    import java.awt.Toolkit;
    import javax.swing.JPanel;
    import javax.swing.JLayeredPane;
    import java.awt.event.FocusAdapter;
    import java.awt.event.FocusEvent;
    import java.awt.event.MouseMotionAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.awt.event.MouseAdapter;
    
    public class LoginPanel {
    
    	private JFrame frame = new JFrame();
    	private JTextField accountField = new JTextField();
    	private JTextField passwordField = new JTextField();
    	private JLabel attention = new JLabel("");
    	private JButton adminButton = new JButton("");
    	private JButton stuButton = new JButton("");
    	private JLabel adminName = new JLabel("\u7BA1\u7406\u5458");
    	private JLabel stuName = new JLabel("\u5B66\u751F");
    	private JButton identityButton = new JButton("\u91CD\u9009\u8EAB\u4EFD");
    	private JButton loginButton = new JButton("\u767B\u5F55");
    	private JButton forgetButton = new JButton("\u5FD8\u8BB0\u5BC6\u7801");
    	private JButton registerButton = new JButton("\u6CE8\u518C\u8D26\u53F7");
    
    	public LoginPanel(Connection con) {
    		Attribute attr = new Attribute(con, frame, accountField, passwordField, attention, adminButton, stuButton,
    				adminName, stuName,  identityButton, loginButton, forgetButton, registerButton);
    		// 设置按钮字体大小
    		UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font("楷体", Font.BOLD, 25)));
    		// 设置文本字体大小
    		UIManager.put("OptionPane.messageFont", new FontUIResource(new Font("楷体", Font.BOLD, 30)));
    		frame.setResizable(false);
    		frame.setTitle("\u767B\u5F55");
    		frame.setBounds(100, 100, 884, 666);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.getContentPane().setLayout(null);
    
    		JLabel lblNewLabel = new JLabel("\u8D26\u53F7\uFF1A");
    		lblNewLabel.setBackground(new Color(240, 255, 255));
    		lblNewLabel.setForeground(new Color(240, 255, 255));
    		lblNewLabel.setFont(new Font("楷体", Font.BOLD, 30));
    		lblNewLabel.setBounds(196, 134, 119, 32);
    		frame.getContentPane().add(lblNewLabel);
    
    		JLabel label = new JLabel("\u5BC6\u7801\uFF1A");
    		label.setBackground(new Color(240, 255, 255));
    		label.setForeground(new Color(240, 255, 255));
    		label.setFont(new Font("楷体", Font.BOLD, 30));
    		label.setBounds(196, 233, 106, 32);
    		frame.getContentPane().add(label);
    
    		JLabel label_1 = new JLabel("\u5B66\u751F\u7BA1\u7406\u7CFB\u7EDF");
    		label_1.setForeground(Color.WHITE);
    		label_1.setIcon(null);
    		label_1.setHorizontalAlignment(SwingConstants.CENTER);
    		label_1.setFont(new Font("楷体", Font.BOLD, 50));
    		label_1.setBounds(251, 15, 427, 91);
    		frame.getContentPane().add(label_1);
    
    		accountField.setFont(new Font("楷体", Font.PLAIN, 25));
    		accountField.setBounds(295, 135, 325, 34);
    		accountField.setColumns(10);
    		frame.getContentPane().add(accountField);
    
    		passwordField.setFont(new Font("楷体", Font.PLAIN, 25));
    		passwordField.setColumns(10);
    		passwordField.setBounds(295, 234, 325, 34);
    		frame.getContentPane().add(passwordField);
    
    		ImageIcon adminButtonImg = new ImageIcon(Start.class.getResource("img/Admin.png"));
    		adminButton.setBackground(new Color(255, 250, 205));
    		adminButton.setFont(new Font("宋体", Font.PLAIN, 10));
    		adminButton.addActionListener(new AdminClick(attr));
    		adminButton.setBounds(215, 421, 137, 110);
    		adminButton.addMouseListener(new IdentityButtonCarton(attr, true));
    		Image temp = adminButtonImg.getImage().getScaledInstance(adminButton.getWidth(), adminButton.getHeight(),
    				adminButtonImg.getImage().SCALE_DEFAULT);
    		adminButton.setIcon(new ImageIcon(temp));
    		adminButton.setContentAreaFilled(false); // 设置按钮透明
    		frame.getContentPane().add(adminButton);
    
    		adminName.setForeground(new Color(240, 255, 255));
    		adminName.setFont(new Font("楷体", Font.PLAIN, 28));
    		adminName.setHorizontalAlignment(SwingConstants.CENTER);
    		adminName.setBounds(240, 528, 89, 49);
    		frame.getContentPane().add(adminName);
    
    		stuButton.addActionListener(new StuClick(attr));
    		stuButton.setBounds(510, 410, 131, 110);
    		stuButton.addMouseListener(new IdentityButtonCarton(attr, false));
    		ImageIcon buttonImg2 = new ImageIcon(Start.class.getResource("img/Stu.png"));
    		Image temp2 = buttonImg2.getImage().getScaledInstance(stuButton.getWidth(), stuButton.getHeight(),
    				buttonImg2.getImage().SCALE_DEFAULT);
    		stuButton.setIcon(new ImageIcon(temp2));
    		stuButton.setContentAreaFilled(false);
    		frame.getContentPane().add(stuButton);
    		
    		stuName.setForeground(new Color(245, 245, 245));
    		stuName.setHorizontalAlignment(SwingConstants.CENTER);
    		stuName.setFont(new Font("楷体", Font.PLAIN, 28));
    		stuName.setBounds(531, 528, 89, 49);
    		frame.getContentPane().add(stuName);
    		
    		attention.setForeground(Color.WHITE);
    		attention.setBackground(Color.WHITE);
    		attention.setHorizontalAlignment(SwingConstants.CENTER);
    		attention.setFont(new Font("楷体", Font.PLAIN, 35));
    		attention.setBounds(117, 423, 719, 119);
    		frame.getContentPane().add(attention);
    
    		loginButton.setBackground(new Color(255, 255, 255));
    		loginButton.setForeground(Color.BLACK);
    		loginButton.setFont(new Font("楷体", Font.BOLD, 40));
    		loginButton.addActionListener(new LoginClick(attr));
    		loginButton.setBounds(361, 317, 148, 49);
    		frame.getContentPane().add(loginButton);
    
    		registerButton.setBackground(new Color(245, 245, 245));
    		registerButton.addActionListener(new RegisterClick(attr));
    		registerButton.setFont(new Font("楷体", Font.BOLD, 27));
    		registerButton.setBounds(672, 131, 148, 41);
    		frame.getContentPane().add(registerButton);
    
    		forgetButton.setBackground(new Color(245, 245, 245));
    		forgetButton.addActionListener(new FogetClick(attr));
    		forgetButton.setFont(new Font("楷体", Font.BOLD, 27));
    		forgetButton.setBounds(672, 233, 148, 41);
    		frame.getContentPane().add(forgetButton);
    
    		identityButton.setVisible(false);
    		identityButton.addActionListener(new ReIdentityClick(attr));
    		identityButton.setForeground(Color.BLACK);
    		identityButton.setFont(new Font("楷体", Font.BOLD, 32));
    		identityButton.setBounds(27, 559, 198, 49);
    		frame.getContentPane().add(identityButton);
    
    		ImageIcon icon = new ImageIcon(Start.class.getResource("img/清晨.jpg"));// 背景图
    		Image h = icon.getImage().getScaledInstance(frame.getWidth(), frame.getHeight(), icon.getImage().SCALE_DEFAULT);
    		icon = new ImageIcon(h);
    		JLabel morning = new JLabel(icon);// 往一个标签中加入图片
    		morning.setBounds(0, 0, icon.getIconWidth(), icon.getIconHeight());// 设置标签位置大小为图片大小
    		frame.getLayeredPane().add(morning, Integer.valueOf(Integer.MIN_VALUE));// 标签添加到第二层面板
    
    		JPanel bg = (JPanel) frame.getContentPane();
    		bg.setOpaque(false); // 底层面板透明,处在最底层的图片才看得见
    		frame.setVisible(true);
    	}
    }
    
    

    5. MysqlPanel.java(Mysql连接界面)

    package stu_system.gui;
    
    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    import javax.swing.plaf.FontUIResource;
    
    import stu_system.Start;
    import stu_system.event.mysql_join.Click;
    import stu_system.tool.Connect;
    
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    
    import java.awt.Font;
    import java.awt.Image;
    
    import javax.swing.SwingConstants;
    import javax.swing.UIManager;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JTextField;
    import javax.swing.JPasswordField;
    import java.awt.event.ActionListener;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.awt.event.ActionEvent;
    import java.awt.Color;
    
    public class MysqlPanel extends JFrame {
    	static Connection con = null; // 连接接口
    	private JPanel contentPane; //整个面板
    	private JTextField MysqlAccountField; //账号框
    	private JPasswordField passwordField; //密码框
    	private JButton ConnectButton; //连接按钮
    	private JPanel bg; // 背景面板
    
    	public MysqlPanel() {
    		setTitle("MYSQL\u63A5\u5165");
    		setResizable(false);
    		// 设置按钮字体大小
    		UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font("楷体", Font.BOLD, 25)));
    		// 设置文本字体大小
    		UIManager.put("OptionPane.messageFont", new FontUIResource(new Font("楷体", Font.BOLD, 30)));
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setBounds(100, 100, 824, 631);
    		contentPane = new JPanel();
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		setContentPane(contentPane);
    		contentPane.setLayout(null);
    
    		JLabel lblNewLabel = new JLabel("MYSQL\u6570\u636E\u5E93\u63A5\u5165");
    		lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
    		lblNewLabel.setVerticalAlignment(SwingConstants.CENTER);
    		lblNewLabel.setFont(new Font("楷体", Font.PLAIN, 49));
    		lblNewLabel.setBounds(213, 26, 433, 95);
    		contentPane.add(lblNewLabel);
    
    		JLabel lblNewLabel_1 = new JLabel("\u7528\u6237\u540D\uFF1A");
    		lblNewLabel_1.setForeground(new Color(240, 248, 255));
    		lblNewLabel_1.setBackground(new Color(245, 245, 245));
    		lblNewLabel_1.setHorizontalAlignment(SwingConstants.CENTER);
    		lblNewLabel_1.setFont(new Font("楷体", Font.BOLD, 32));
    		lblNewLabel_1.setBounds(134, 136, 152, 66);
    		contentPane.add(lblNewLabel_1);
    
    		JLabel label = new JLabel("\u5BC6\u7801\uFF1A");
    		label.setForeground(new Color(240, 248, 255));
    		label.setBackground(new Color(245, 245, 245));
    		label.setHorizontalAlignment(SwingConstants.CENTER);
    		label.setFont(new Font("楷体", Font.BOLD, 32));
    		label.setBounds(154, 230, 142, 45);
    		contentPane.add(label);
    
    		JLabel lb3 = new JLabel(
    				"\u767B\u5F55\u524D\u9700\u4FDD\u8BC1\u6709\u540D\u4E3Astudent_system\u7684\u6570\u636E\u5E93");
    		lb3.setHorizontalAlignment(SwingConstants.CENTER);
    		lb3.setFont(new Font("楷体", Font.BOLD, 30));
    		lb3.setBounds(43, 320, 760, 91);
    
    		contentPane.add(lb3);
    
    		ConnectButton = new JButton("\u8FDE\u63A5");
    		ConnectButton.setForeground(new Color(0, 0, 0));
    		ConnectButton.setBackground(new Color(255, 255, 255));
    
    		ConnectButton.setFont(new Font("楷体", Font.BOLD, 40));
    		ConnectButton.setBounds(341, 426, 163, 59);
    		contentPane.add(ConnectButton);
    
    		MysqlAccountField = new JTextField();
    		MysqlAccountField.setText("root");
    		MysqlAccountField.setFont(new Font("楷体", Font.PLAIN, 28));
    		MysqlAccountField.setBounds(275, 150, 339, 38);
    		contentPane.add(MysqlAccountField);
    		MysqlAccountField.setColumns(10);
    
    		passwordField = new JPasswordField();
    		passwordField.setEchoChar('*');
    		passwordField.setFont(new Font("楷体", Font.PLAIN, 28));
    		passwordField.setBounds(275, 239, 339, 38);
    		passwordField.setText("admin");
    		contentPane.add(passwordField);
    		
    		ImageIcon icon = new ImageIcon(Start.class.getResource("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());// 设置标签位置大小为图片大小
    		getLayeredPane().add(morning, Integer.valueOf(Integer.MIN_VALUE));// 标签添加到第二层面板
    		bg = (JPanel) getContentPane();
    		bg.setOpaque(false); // 底层面板透明,处在最底层的图片才看得见
    	}
    
    	public void EventAdd() {
    		ConnectButton.addActionListener(new Click(MysqlAccountField, passwordField, this)); //登录按钮事件
    	}
    }
    

    6. RegisterPanel.java(注册界面)

    package stu_system.gui;
    
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    
    import com.mysql.jdbc.Connection;
    
    import stu_system.event.login_panel.register.Attribute;
    import stu_system.event.login_panel.register.Register;
    
    import java.awt.event.ActionListener;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.awt.event.ActionEvent;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    
    import java.awt.Font;
    import javax.swing.JTextField;
    import javax.swing.UIManager;
    import javax.swing.plaf.FontUIResource;
    
    public class RegisterPanel {
    	private JDialog jd = null;
    	private JTextField num = new JTextField();
    	private JTextField password = new JTextField();
    	private JButton button = new JButton("\u6CE8\u518C");
    
    	public RegisterPanel(Connection con, JFrame jf, int flag) {
    		jd = new JDialog(jf, true);
    		Attribute attr = new Attribute(con, jd, num, password, button, flag);
    		// 设置按钮字体大小
    		UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font("楷体", Font.BOLD, 25)));
    		// 设置文本字体大小
    		UIManager.put("OptionPane.messageFont", new FontUIResource(new Font("楷体", Font.BOLD, 30)));
    		jd.setAlwaysOnTop(true);
    
    		if (flag == 0) {
    			jd.setTitle("管理员注册界面");
    		} else if (flag == 1) {
    			jd.setTitle("学生注册界面");
    		}
    
    		jd.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    		jd.setBounds(100, 100, 665, 450);
    		jd.getContentPane().setLayout(null);
    
    		JLabel label = new JLabel("\u65B0\u8D26\u53F7\uFF1A");
    		label.setFont(new Font("楷体", Font.PLAIN, 28));
    		label.setBounds(112, 92, 112, 48);
    		jd.getContentPane().add(label);
    
    		JLabel label_1 = new JLabel("\u65B0\u5BC6\u7801\uFF1A");
    		label_1.setFont(new Font("楷体", Font.PLAIN, 28));
    		label_1.setBounds(112, 180, 112, 48);
    		jd.getContentPane().add(label_1);
    
    		num.setText("18140809032");
    		num.setFont(new Font("楷体", Font.PLAIN, 24));
    		num.setBounds(223, 99, 343, 34);
    		jd.getContentPane().add(num);
    		num.setColumns(10);
    
    		password.setFont(new Font("楷体", Font.PLAIN, 24));
    		password.setColumns(10);
    		password.setBounds(223, 191, 343, 34);
    		jd.getContentPane().add(password);
    
    		button.addActionListener(new Register(attr));
    		button.setFont(new Font("楷体", Font.PLAIN, 30));
    		button.setBounds(280, 281, 182, 67);
    		jd.getContentPane().add(button);
    		jd.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    		jd.setVisible(true);
    	}
    
    }
    

    7. StuFunctionPanel.java(学生功能界面)

    package stu_system.gui;
    
    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    
    import com.mysql.jdbc.Connection;
    
    import stu_system.Start;
    import stu_system.event.stu_function.Attribute;
    import stu_system.event.stu_function.ButtonClickCarton;
    import stu_system.event.stu_function.ReturnClick;
    import stu_system.event.stu_function.SearchClick;
    import stu_system.event.stu_function.UpdateInfoClick;
    import stu_system.event.stu_function.UpdatePasswordClick;
    
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import java.awt.Font;
    import java.awt.Image;
    
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    
    import java.awt.Component;
    import java.awt.event.ActionListener;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.awt.event.ActionEvent;
    import javax.swing.JLabel;
    import java.awt.Color;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    
    public class StuFunctionPanel {
    
    	private JFrame jf = new JFrame();
    	private JTextArea showtArea = new JTextArea();
    	private JButton searchInfoButton = new JButton("\u67E5\u8BE2\u672C\u4EBA\u4FE1\u606F");
    	private JButton searchGradeButton = new JButton("\u67E5\u8BE2\u672C\u4EBA\u6210\u7EE9");
    	private JButton returnButton = new JButton("\u8FD4\u56DE");
    	private JButton updateInfoButton = new JButton("\u66F4\u65B0\u672C\u4EBA\u4FE1\u606F");
    	private JButton updatePasswordButton = new JButton("\u4FEE\u6539\u672C\u4EBA\u5BC6\u7801");
    
    	public StuFunctionPanel(String myNum, Connection con) {
    		Attribute attr = new Attribute(myNum, con, jf, showtArea, searchInfoButton, searchGradeButton, returnButton,
    				updateInfoButton, updatePasswordButton);
    		jf.setResizable(false);
    		jf.setTitle("\u5B66\u751F\u529F\u80FD\u754C\u9762");
    		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		jf.setBounds(100, 100, 1037, 693);
    		JPanel contentPane = new JPanel();
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		jf.setContentPane(contentPane);
    		contentPane.setLayout(null);
    
    		searchInfoButton.addMouseListener(new ButtonClickCarton(attr, 0));
    		searchInfoButton.addActionListener(new SearchClick(attr, 0));
    		searchInfoButton.setFont(new Font("楷体", Font.PLAIN, 28));
    		searchInfoButton.setBounds(53, 224, 219, 51);
    		contentPane.add(searchInfoButton);
    
    		searchGradeButton.addMouseListener(new ButtonClickCarton(attr, 1));
    		searchGradeButton.addActionListener(new SearchClick(attr, 1));
    		searchGradeButton.setFont(new Font("楷体", Font.PLAIN, 28));
    		searchGradeButton.setBounds(53, 305, 219, 51);
    		contentPane.add(searchGradeButton);
    
    		updatePasswordButton.addMouseListener(new ButtonClickCarton(attr, 2));
    		updatePasswordButton.addActionListener(new UpdatePasswordClick(attr));
    		updatePasswordButton.setFont(new Font("楷体", Font.PLAIN, 28));
    		updatePasswordButton.setBounds(53, 391, 219, 51);
    		contentPane.add(updatePasswordButton);
    
    		updateInfoButton.addMouseListener(new ButtonClickCarton(attr, 3));
    		updateInfoButton.addActionListener(new UpdateInfoClick(attr));
    		updateInfoButton.setFont(new Font("楷体", Font.PLAIN, 28));
    		updateInfoButton.setBounds(53, 135, 219, 51);
    		contentPane.add(updateInfoButton);
    
    		JPanel panel = new JPanel();
    		panel.setOpaque(false);
    		panel.setBorder(null);
    		showtArea.setEditable(false);
    		showtArea.setForeground(new Color(240, 248, 255));
    		showtArea.setOpaque(false);
    		panel.setBounds(325, 102, 652, 465);
    		contentPane.add(panel);
    		panel.setLayout(null);
    
    		JScrollPane scrollPane = new JScrollPane();
    		scrollPane.setOpaque(false);
    		scrollPane.setBorder(null);
    		scrollPane.getViewport().setOpaque(false);
    		scrollPane.setBounds(0, 0, 652, 465);
    		panel.add(scrollPane);
    		showtArea.setFont(new Font("楷体", Font.BOLD, 30));
    		scrollPane.setViewportView(showtArea);
    		showtArea.setLineWrap(true);
    
    		JLabel menu = new JLabel("\u663E\u793A\u4F4D\u7F6E\u2193");
    		menu.setForeground(new Color(255, 255, 255));
    		menu.setFont(new Font("楷体", Font.PLAIN, 35));
    		menu.setBounds(325, 48, 209, 51);
    		contentPane.add(menu);
    
    		ImageIcon icon = new ImageIcon(Start.class.getResource("img/美食节.jpg"));// 背景图
    		Image h = icon.getImage().getScaledInstance(jf.getWidth(), jf.getHeight(), icon.getImage().SCALE_DEFAULT);
    		icon = new ImageIcon(h); // 将设置好大小的图片重新分配图片图标对象
    		JLabel morning = new JLabel(icon);// 往一个标签中加入图片
    		morning.setBounds(0, 0, icon.getIconWidth(), icon.getIconHeight());// 设置标签位置大小为图片大小
    		jf.getLayeredPane().add(morning, Integer.valueOf(Integer.MIN_VALUE));// 标签添加到第二层面板
    
    		JPanel bg = (JPanel) jf.getContentPane();
    		bg.setOpaque(false); // 底层面板透明,处在最底层的图片才看得见
    		bg.add(panel);
    
    		returnButton.addMouseListener(new ButtonClickCarton(attr, 4));
    		returnButton.addActionListener(new ReturnClick(attr));
    		returnButton.setFont(new Font("楷体", Font.PLAIN, 28));
    		returnButton.setBounds(53, 477, 219, 51);
    		contentPane.add(returnButton);
    		jf.setVisible(true);
    	}
    
    }
    

    3. 事件event包

    1. 管理员功能admin_function包

    1. 成绩插入grade_insert包
    1. Attribute.java(成绩插入面板的属性集合)
    package stu_system.event.admin_function.grade_insert;
    
    import java.sql.Connection;
    
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JTextField;
    
    public class Attribute {
    	Connection con;
    	JDialog jd ;
    	JTextField chineseField;
    	JTextField mathField ;
    	JTextField englishField ;
    	JTextField nameField;
    	JTextField numField;
    	JButton affirmButton;
    	public Attribute(Connection con, JDialog jd, JTextField chineseField, JTextField mathField, JTextField englishField,
    			JTextField nameField, JTextField numField, JButton affirmButton) {
    		this.con = con;
    		this.jd = jd;
    		this.chineseField = chineseField;
    		this.mathField = mathField;
    		this.englishField = englishField;
    		this.nameField = nameField;
    		this.numField = numField;
    		this.affirmButton = affirmButton;
    	}
    	
    }
    
    2. InsertGradeClick.java(点击插入事件)
    package stu_system.event.admin_function.grade_insert;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    import javax.swing.JOptionPane;
    
    import stu_system.tool.SqlSearch;
    
    public class InsertGradeClick implements ActionListener {
    	Attribute attr;
    
    	public InsertGradeClick(Attribute attr) {
    		this.attr = attr;
    	}
    
    	public void actionPerformed(ActionEvent e) {
    		try {
    			String chinese_grade = attr.chineseField.getText();
    			String math_grade = attr.mathField.getText();
    			String english_grade = attr.englishField.getText();
    			if (!(chinese_grade.equals("") || math_grade.equals("") || english_grade.equals("")
    					|| attr.nameField.getText().equals("") || attr.numField.getText().equals(""))) {
    
    				String sql = "select num from stu where num=?";
    				String num = SqlSearch.dataByAnother(sql, attr.con, "18140809032" + attr.numField.getText());
    				if (num != null) {
    					sql = "select num from grade where num=?";
    					String temp = SqlSearch.dataByAnother(sql, attr.con, "18140809032" + attr.numField.getText());
    					if (temp == null) {
    						sql = "insert into grade values(?,?,?,?,?)";
    						boolean update = SqlSearch.Update(sql, attr.con, "18140809032" + attr.numField.getText(),
    								attr.nameField.getText(), chinese_grade, math_grade, english_grade);
    						if (update) {
    							JOptionPane.showMessageDialog(null, "学生信息添加成功!");
    							attr.jd.dispose();
    						} else {
    							JOptionPane.showMessageDialog(null, "学生信息添加失败!");
    						}
    					} else {
    						JOptionPane.showMessageDialog(null, "学生成绩已录过!");
    					}
    				} else {
    					JOptionPane.showMessageDialog(null, "无此学生!");
    				}
    			} else {
    				JOptionPane.showMessageDialog(null, "请将所有信息填上!");
    			}
    		} catch (Exception e2) {
    			JOptionPane.showMessageDialog(null, "学生信息添加失败!");
    		}
    	}
    
    }
    
    2. 学生信息插入info_insert包
    1. Attribute.java(学生信息插入面板属性)
    package stu_system.event.admin_function.info_insert;
    
    import java.sql.Connection;
    
    import javax.swing.JDialog;
    import javax.swing.JTextField;
    
    public class Attribute {
    	Connection con;
    	JDialog jd;
    	JTextField numField;
    	JTextField nameField;
    	JTextField teleField;
    	JTextField addrField;
    	public Attribute(Connection con, JDialog jd,JTextField numField, JTextField nameField, JTextField teleField,
    			JTextField addrField) {
    		this.con = con;
    		this.jd=jd;
    		this.numField = numField;
    		this.nameField = nameField;
    		this.teleField = teleField;
    		this.addrField = addrField;
    	}
    }
    
    2. InsertStuClick.java(点击插入学生信息事件)
    package stu_system.event.admin_function.info_insert;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.PreparedStatement;
    
    import javax.swing.JOptionPane;
    
    import stu_system.tool.SqlSearch;
    
    public class InsertStuClick implements ActionListener {
    	Attribute attr;
    
    	public InsertStuClick(Attribute attr) {
    		this.attr = attr;
    	}
    
    	public void actionPerformed(ActionEvent e) {
    		try {
    			if (!(attr.numField.getText().equals("") || attr.nameField.getText().equals("")
    					|| attr.teleField.getText().equals("") || attr.addrField.getText().equals(""))) {
    				String sql = "select num from stu where num=?";
    				String num = SqlSearch.dataByAnother(sql, attr.con, attr.numField.getText());
    				if (num!=null) {
    					sql = "select num from information where num=?";
    					String temp = SqlSearch.dataByAnother(sql, attr.con, num);
    					if (temp==null) {
    						sql = "insert into information values (?,?,?,?)";
    						boolean update = SqlSearch.Update(sql, attr.con, attr.numField.getText(), attr.nameField.getText(), attr.teleField.getText(),
    								attr.addrField.getText());
    						if(update) {
    							JOptionPane.showMessageDialog(null, "学生信息添加成功!");
    							attr.jd.dispose();
    						}else {
    							JOptionPane.showMessageDialog(null, "学生信息添加失败!");
    						}
    					} else {
    						JOptionPane.showMessageDialog(null, "学生信息已存在!");
    					}
    				} else {
    					JOptionPane.showMessageDialog(null, "无此学号学生!");
    				}
    
    			} else {
    				JOptionPane.showMessageDialog(null, "请将所有信息填上!");
    			}
    		} catch (Exception e2) {
    			// TODO: handle exception
    		}
    
    	}
    
    }
    
    3. Attribute.java(管理员功能面板属性)
    package stu_system.event.admin_function;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    
    import com.mysql.jdbc.Connection;
    
    public class Attribute {
    	Connection con;
    	JPanel contentPane;
    	JFrame jf; // 当前框架
    	JTextArea showArea; // 显示区域
    	JLabel Menu; // 菜单条目
    	JButton newStuButton; // 新增学生按钮
    	JButton searchInfoButton; // 查询信息按钮
    	JButton insertGradeButton; // 插入成绩按钮
    	JButton searchGradeButton; // 查询成绩按钮
    	JButton updatePasswordButton; // 修改密码按钮
    	JButton disposeAccountButton; // 注销账户按钮
    	JButton updateInfoButton; // 修改信息按钮
    	JButton returnButton; // 返回上一界面按钮
    	JButton accountSetButton; // 查看所有账户按钮
    	JButton updateGradeButton; //修改成绩按钮
    	String myNum; //当前账号
    
    	public Attribute(Connection con, JPanel contentPane, JFrame jf, JTextArea showArea, JLabel menu,
    			JButton newStuButton, JButton searchInfoButton, JButton insertGradeButton, JButton searchGradeButton,
    			JButton updatePasswordButton, JButton disposeAccountButton, JButton updateInfoButton, JButton returnButton,
    			JButton accountSetButton,JButton updateGradeButton,String myNum) {
    		super();
    		this.con = con;
    		this.contentPane = contentPane;
    		this.jf = jf;
    		this.showArea = showArea;
    		Menu = menu;
    		this.newStuButton = newStuButton;
    		this.searchInfoButton = searchInfoButton;
    		this.insertGradeButton = insertGradeButton;
    		this.searchGradeButton = searchGradeButton;
    		this.updatePasswordButton = updatePasswordButton;
    		this.disposeAccountButton = disposeAccountButton;
    		this.updateInfoButton = updateInfoButton;
    		this.returnButton = returnButton;
    		this.accountSetButton = accountSetButton;
    		this.updateGradeButton=updateGradeButton;
    		this.myNum=myNum;
    	}
    
    }
    
    4. AccountClick.java(账户库按钮事件)
    package stu_system.event.admin_function;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.List;
    
    import stu_system.tool.SqlSearch;
    
    public class AccountClick implements ActionListener {
    	Attribute attr;
    
    	public AccountClick(Attribute attr) {
    		this.attr = attr;
    	}
    
    	public void actionPerformed(ActionEvent arg0) {
    		try {
    			attr.showArea.setText("");
    			attr.Menu.setText("显示(依次为账号,密码)↓");
    			String sql = "select * from admin";
    			List<StringBuilder> result = SqlSearch.SelectAll(sql, attr.con);
    			if (result.size() == 0) {
    				attr.showArea.append("管理员账号库为空!\n");
    			} else {
    				for (StringBuilder builder : result) {
    					attr.showArea.append("管理员账号:\n");
    					attr.showArea.append(builder.toString() + "\n");
    				}
    			}
    			attr.showArea.append("\n");
    			sql = "select * from stu";
    			result = SqlSearch.SelectAll(sql, attr.con);
    			if (result.size() == 0) {
    				attr.showArea.append("学生账号库为空!\n");
    			} else {
    				for (StringBuilder builder : result) {
    					attr.showArea.append("学生账号:\n");
    					attr.showArea.append(builder.toString() + "\n");
    				}
    			}
    		} catch (Exception e) {
    			// TODO: handle exception
    		}
    	}
    
    }
    
    5. ButtonClickCarton.java(鼠标移动颜色变化事件)
    package stu_system.event.admin_function;
    
    import java.awt.Color;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    
    public class ButtonClickCarton implements MouseListener {
    	Attribute attr;
    	int flag;
    
    	public ButtonClickCarton(Attribute attr, int flag) {
    		this.attr = attr;
    		this.flag = flag;
    	}
    
    	@Override
    	public void mouseClicked(MouseEvent arg0) {
    		// TODO 自动生成的方法存根
    
    	}
    
    	@Override
    	public void mouseEntered(MouseEvent arg0) {
    		switch (flag) {
    		case 0:
    			attr.newStuButton.setForeground(Color.red);
    			break;
    		case 1:
    			attr.searchInfoButton.setForeground(Color.red);
    			break;
    		case 2:
    			attr.insertGradeButton.setForeground(Color.red);
    			break;
    		case 3:
    			attr.searchGradeButton.setForeground(Color.red);
    			break;
    		case 4:
    			attr.updatePasswordButton.setForeground(Color.red);
    			break;
    		case 5:
    			attr.disposeAccountButton.setForeground(Color.red);
    			break;
    		case 6:
    			attr.updateInfoButton.setForeground(Color.red);
    			break;
    		case 7:
    			attr.returnButton.setForeground(Color.red);
    			break;
    		case 8:
    			attr.accountSetButton.setForeground(Color.red);
    			break;
    		case 9:
    			attr.updateGradeButton.setForeground(Color.red);
    			break;
    		default:
    			break;
    		}
    
    	}
    
    	@Override
    	public void mouseExited(MouseEvent e) {
    		switch (flag) {
    		case 0:
    			attr.newStuButton.setForeground(Color.black);
    			break;
    		case 1:
    			attr.searchInfoButton.setForeground(Color.black);
    		case 2:
    			attr.insertGradeButton.setForeground(Color.black);
    			break;
    		case 3:
    			attr.searchGradeButton.setForeground(Color.black);
    			break;
    		case 4:
    			attr.updatePasswordButton.setForeground(Color.black);
    			break;
    		case 5:
    			attr.disposeAccountButton.setForeground(Color.black);
    			break;
    		case 6:
    			attr.updateInfoButton.setForeground(Color.black);
    			break;
    		case 7:
    			attr.returnButton.setForeground(Color.black);
    			break;
    		case 8:
    			attr.accountSetButton.setForeground(Color.black);
    			break;
    		case 9:
    			attr.updateGradeButton.setForeground(Color.black);
    			break;
    		default:
    			break;
    		}
    	}
    
    	@Override
    	public void mousePressed(MouseEvent arg0) {
    		// TODO 自动生成的方法存根
    
    	}
    
    	@Override
    	public void mouseReleased(MouseEvent arg0) {
    		// TODO 自动生成的方法存根
    
    	}
    
    }
    
    6. DisposeClick.java(注销按钮事件)
    package stu_system.event.admin_function;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.PreparedStatement;
    
    import javax.swing.JOptionPane;
    
    import stu_system.gui.LoginPanel;
    import stu_system.tool.SqlSearch;
    
    public class DisposeClick implements ActionListener{
    Attribute attr;
    	public DisposeClick(Attribute attr) {
    	this.attr = attr;
    }
    
    	public void actionPerformed(ActionEvent e) {
    		try {
    			Object[] options = { "本人", "指定学生" };
    			int i = JOptionPane.showOptionDialog(null, "注销本人账号还是学生账号?", "选择", JOptionPane.YES_NO_OPTION,
    					JOptionPane.QUESTION_MESSAGE, null, options, null);
    			if (i == 0) { // 注销本人账号
    				String sql = "delete from admin where num=?";
    				SqlSearch.Update(sql, attr.con, attr.myNum);
    				JOptionPane.showMessageDialog(attr.jf, "账户注销成功!");
    				new LoginPanel(attr.con);
    				attr.jf.dispose();
    			} else if (i == 1) {
    				String sql = "select num from stu where num=?";
    				String num = SqlSearch.dataByAnother(sql, attr.con, JOptionPane.showInputDialog("注销学生账号为:"));
    				if (num!=null) {
    					String sql2 = "delete from stu where num=?";
    					String sql3 = "delete from information where num=?";
    					String sql4 = "delete from math_grade where 学号=?";
    					String sql5 = "delete from english_grade where 学号=?";
    					String sql6 = "delete from chinese_grade where 学号=?";
    					boolean update = SqlSearch.batchUpdate(new String[] {sql2,sql3,sql4,sql5,sql6}, attr.con, num);
    					if(update) {
    						JOptionPane.showMessageDialog(attr.jf, "学生账户注销成功!");
    					}else {
    						JOptionPane.showMessageDialog(attr.jf, "学生账户注销失败!");
    					}
    				} else {
    					JOptionPane.showMessageDialog(attr.jf, "无此账号!");
    				}
    			}
    		} catch (Exception e2) {
    			// TODO: handle exception
    		}
    	}
    
    }
    
    7. InsertClick.java(新增学生事件/返回按钮事件)
    package stu_system.event.admin_function;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import stu_system.gui.InsertStuPanel;
    import stu_system.gui.LoginPanel;
    import stu_system.gui.InsertGradePanel;
    
    public class InsertClick implements ActionListener {
    	Attribute attr;
    	int flag; // 根据不同值在更新对象时打开不同窗口
    
    	public InsertClick(Attribute attr, int flag) {
    		this.attr = attr;
    		this.flag = flag;
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		switch (flag) {
    		case 0:
    			new InsertStuPanel(attr.jf, attr.con);
    			break;
    		case 1:
    			new InsertGradePanel(attr.jf, attr.con);
    			break;
    		case 2:
    			new LoginPanel(attr.con);
    			attr.jf.dispose();
    			break;
    		default:
    			break;
    		}
    
    	}
    
    }
    
    8. SearchClick.java(查询功能事件)
    package stu_system.event.admin_function;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.List;
    
    import javax.swing.JOptionPane;
    
    import stu_system.tool.SqlSearch;
    
    public class SearchClick implements ActionListener {
    	Attribute attr;
    	int flag;
    
    	public SearchClick(Attribute attr, int flag) {
    		this.attr = attr;
    		this.flag = flag;
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		Object[] options = { "所有人", "特定人" };
    		int i = JOptionPane.showOptionDialog(null, "查询所有人还是一个人?", "选择", JOptionPane.YES_NO_OPTION,
    				JOptionPane.QUESTION_MESSAGE, null, options, null);
    		attr.showArea.setText("");
    		String sql = null;
    		switch (flag) {
    		case 0:
    			attr.Menu.setText("显示(依次为学号、姓名,语文成绩,数学成绩,英语成绩)↓");
    			if (i == 0) {
    				sql = "select * from grade";
    			} else if (i == 1) {
    				sql = "select * from grade where num=?";
    			}
    			break;
    		case 1:
    			attr.Menu.setText("显示(依次为学号、姓名,电话,地址)↓");
    			if (i == 0) {
    				sql = "select * from information";
    			} else if (i == 1) {
    				sql = "select * from information where num=?";
    			}
    			break;
    		}
    		if (i == 0) {// 查询所有人
    			List<StringBuilder> list = SqlSearch.SelectAll(sql, attr.con);
    			if (list.size() == 0) {
    				JOptionPane.showMessageDialog(attr.jf, "当前无数据!");
    			} else {
    				for (StringBuilder builder : list) {
    					attr.showArea.append(builder.toString() + "\n");
    				}
    			}
    		} else if (i == 1) {
    			List<StringBuilder> list = SqlSearch.SelectAll(sql, attr.con, JOptionPane.showInputDialog("输入学号:")); // 查询得到的结果
    			if (list.size() == 0) {
    				JOptionPane.showMessageDialog(attr.jf, "查无此人!");
    			} else {
    				for (StringBuilder builder : list) {
    					attr.showArea.append(builder.toString() + "\n");
    				}
    			}
    		}
    
    	}
    
    }
    
    9. UpdateGradeClick.java(更新成绩事件)
    package stu_system.event.admin_function;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.PreparedStatement;
    
    import javax.swing.JOptionPane;
    
    import stu_system.tool.SqlSearch;
    
    public class UpdateGradeClick implements ActionListener {
    	Attribute attr;
    
    	public UpdateGradeClick(Attribute attr) {
    		this.attr = attr;
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		try {
    			String sql = "select num from grade where num=?";
    			String num = SqlSearch.dataByAnother(sql, attr.con, JOptionPane.showInputDialog("输入学号"));
    			if (num != null) {
    				Object[] options = { "语文", "数学", "英语" };
    				int i = JOptionPane.showOptionDialog(null, "修改哪科分数?", "选择", JOptionPane.YES_NO_OPTION,
    						JOptionPane.QUESTION_MESSAGE, null, options, null);
    				if (i != -1) {
    					String up = JOptionPane.showInputDialog("修改分数为:");
    					if (i == 0) {
    						sql = "update grade set chinese_grade=? where num=?";
    					} else if (i == 1) {
    						sql = "update grade set math_grade=?where num=?";
    					} else if (i == 2) {
    						sql = "update grade set english_grade=? where num=?";
    					}
    					boolean update = SqlSearch.Update(sql, attr.con, up, num);
    					if (update) {
    						JOptionPane.showMessageDialog(attr.jf, num + "【" + options[i] + "】成绩修改成功!");
    					} else {
    						JOptionPane.showMessageDialog(attr.jf, num + "【" + options[i] + "】成绩修改失败!");
    					}
    				}
    
    			} else {
    				JOptionPane.showMessageDialog(null, "查无此人!");
    			}
    		} catch (Exception e2) {
    			// TODO: handle exception
    		}
    	}
    
    }
    
    10. UpdateInfoClick.java(更新学生信息事件)
    package stu_system.event.admin_function;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JOptionPane;
    
    import stu_system.tool.SqlSearch;
    
    public class UpdateInfoClick implements ActionListener {
    	Attribute attr;
    
    	public UpdateInfoClick(Attribute attr) {
    		this.attr = attr;
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		String sql = "select num from information where num=?";
    		String num = SqlSearch.dataByAnother(sql, attr.con, JOptionPane.showInputDialog("输入学号")); // 学号
    		if (num != null) {
    			Object[] options = { "学号", "姓名", "电话", "地址" };
    			int i = JOptionPane.showOptionDialog(null, "修改哪项信息?", "选择", JOptionPane.YES_NO_OPTION,
    					JOptionPane.QUESTION_MESSAGE, null, options, null);
    			if (i != -1) {
    				String up = JOptionPane.showInputDialog("修改学号为" + num + "的【" + options[i] + "】为:");
    				boolean update = false;
    				if (i == 0) {
    					if (up.startsWith("18140809032") && up.length() == 13) {
    						String sql2 = "update chinese_grade set 学号=? where 学号=?";
    						String sql3 = "update math_grade set 学号=? where 学号=?";
    						String sql4 = "update english_grade set 学号=? where 学号=?";
    						String sql5 = "update information set num=? where num=?";
    						String sql6 = "update stu set num=? where num=?";
    						update = SqlSearch.batchUpdate(new String[] { sql2, sql3, sql4, sql5, sql6 }, attr.con, up,
    								num);
    					} else {
    						JOptionPane.showMessageDialog(null, "学号格式必须为:18140809032XX");
    						return;
    					}
    				} else if (i == 1) {
    					String sql2 = "update chinese_grade set 姓名=? where 学号=?";
    					String sql3 = "update math_grade set 姓名=? where 学号=?";
    					String sql4 = "update english_grade set 姓名=? where 学号=?";
    					String sql5 = "update information set name=? where num=?";
    					update = SqlSearch.batchUpdate(new String[] { sql2, sql3, sql4, sql5 }, attr.con, up, num);
    				} else {
    					String sql2 = null;
    					if (i == 2) {
    						sql2 = "update information set tele=? where num=?";
    					} else if (i == 3) {
    						sql2 = "update information set address=? where num=?";
    					}
    					update = SqlSearch.Update(sql2, attr.con, up, num);
    				}
    				if (update) {
    					JOptionPane.showMessageDialog(null, "学号为" + num + "的【" + options[i] + "】修改成功!");
    				} else {
    					JOptionPane.showMessageDialog(null, "学号为" + num + "的【" + options[i] + "】修改失败!");
    				}
    			}
    		} else {
    			JOptionPane.showMessageDialog(null, "无此人");
    		}
    
    	}
    
    }
    
    11. UpdatePasswordClick.java(修改密码事件)
    package stu_system.event.admin_function;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JOptionPane;
    
    import stu_system.gui.LoginPanel;
    import stu_system.tool.SqlSearch;
    
    public class UpdatePasswordClick implements ActionListener {
    	Attribute attr;
    
    	public UpdatePasswordClick(Attribute attr) {
    		this.attr = attr;
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		Object[] options = { "本人", "指定学生" };
    		int i = JOptionPane.showOptionDialog(null, "修改本人密码还是学生密码?", "选择", JOptionPane.YES_NO_OPTION,
    				JOptionPane.QUESTION_MESSAGE, null, options, null);
    		String sql = null;
    		if (i == 0) {// 修改本人密码
    			sql = "update admin set password=? where num=?";
    			String pw = JOptionPane.showInputDialog("新密码:");
    			boolean update = SqlSearch.Update(sql, attr.con, pw, attr.myNum);
    			if (update) {
    				JOptionPane.showMessageDialog(attr.jf, "密码修改成功!请重新登录");
    				new LoginPanel(attr.con);
    				attr.jf.dispose();
    			}else {
    				JOptionPane.showMessageDialog(attr.jf, "密码修改失败!");
    			}
    		}else if(i==1) {
    			sql = "select num from stu where num=?";
    			String ad = JOptionPane.showInputDialog("学生账号为:");
    			String result = SqlSearch.dataByAnother(sql, attr.con, ad); //学生账号若存在则不为null
    			if(result!=null) {
    				sql = "update stu set password=? where num=?";
    				String newPw = JOptionPane.showInputDialog("新密码为:"); //新密码
    				boolean update = SqlSearch.Update(sql, attr.con, newPw,ad);
    				if(update) {
    					JOptionPane.showMessageDialog(attr.jf, "学生密码修改成功!");
    				}else {
    					JOptionPane.showMessageDialog(attr.jf, "学生密码修改失败!");
    				}
    			}else {
    				JOptionPane.showMessageDialog(attr.jf, "无此学生账号!");
    			}
    		}
    
    	}
    
    }
    

    2. 登录面板login_panel包

    1. 注册register包
    1. Attribute.java(注册面板属性)
    package stu_system.event.login_panel.register;
    
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JTextField;
    
    import com.mysql.jdbc.Connection;
    
    public class Attribute {
    	int flag;
    	Connection con;
    	JDialog jd;
    	JTextField num;
    	JTextField password;
    	JButton button;
    	public Attribute(Connection con, JDialog jd, JTextField num, JTextField password, JButton button,int flag) {
    		this.con = con;
    		this.jd = jd;
    		this.num = num;
    		this.password = password;
    		this.button = button;
    		this.flag=flag;
    	}
    	
    }
    
    2. Register.java(注册账号事件)
    package stu_system.event.login_panel.register;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    import javax.swing.JOptionPane;
    
    import stu_system.tool.SqlSearch;
    
    public class Register implements ActionListener {
    	Attribute attr;
    
    	public Register(Attribute attr) {
    		this.attr = attr;
    	}
    
    	public void actionPerformed(ActionEvent e) {
    		String account = attr.num.getText();
    		String password = attr.password.getText();
    		if (account.startsWith("18140809032") && account.length() == 13) { // 账号必须以这个前缀开头
    			String sql = "select * from admin,stu where stu.num=? or admin.num=?";
    			String sql2 = null;
    			if (attr.flag == 0) {
    				sql2 = "insert into admin values (?,?)";
    			} else if (attr.flag == 1) {
    				sql2 = "insert into stu values (?,?)";
    			}
    			String num = SqlSearch.dataByAnother(sql, attr.con, account,account);
    			if (num == null) { // 说明账号先前没被注册
    				boolean update = SqlSearch.Update(sql2, attr.con, account, password);
    				if (update) {
    					if (attr.flag == 0) {
    						JOptionPane.showMessageDialog(null, "管理员账号注册成功!");
    					} else if (attr.flag == 1) {
    						JOptionPane.showMessageDialog(null, "学生账号注册成功!");
    					}
    					attr.jd.dispose();
    				} else {
    					if (attr.flag == 0) {
    						JOptionPane.showMessageDialog(null, "管理员账号注册失败!");
    					} else if (attr.flag == 1) {
    						JOptionPane.showMessageDialog(null, "学生账号注册失败!");
    					}
    				}
    			} else {
    				JOptionPane.showMessageDialog(null, "账号已被注册!");
    			}
    		} else {
    			JOptionPane.showMessageDialog(null, "账号格式需为:18140809032XX");
    		}
    	}
    
    }
    
    2. Attribute.java(登录面板属性)
    package stu_system.event.login_panel;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTextField;
    
    public class Attribute {
    	Connection con;
    	ResultSet rs = null; // 结果集接口
    	int flag = -1; // 是否选择身份的标志,-1为未选,1为管理员,2为学生
    	JFrame frame; 
    	JTextField accountField; 
    	JTextField passwordField; 
    	JLabel attention; 
    	JButton adminButton; 
    	JButton stuButton; 
    	JLabel adminName ; 
    	JLabel stuName; 
    	PreparedStatement ps; 
    	JButton identityButton; 
    	JButton loginButton ; 
    	 JButton forgetButton ;
    	 JButton registerButton ;
    
    	public Attribute() {
    		
    	}
    /**
     * 
     * @param con 						Sql连接
     * @param frame 					主体框架
     * @param accountField		账号栏
     * @param passwordField		密码栏
     * @param attention				当前选择身份情况说明
     * @param adminButton		管理员按钮
     * @param stuButton				学生按钮
     * @param adminName		管理员标签
     * @param stuName				学生标签
     * @param ps							Sql执行绑定工具
     * @param identityButton		重新选择身份按钮
     * @param loginButton			登录按钮
     * @param forgetButton		忘记密码
     * @param registerButton		注册账号
     */
    	public Attribute(Connection con, JFrame frame, JTextField accountField,
    			JTextField passwordField, JLabel attention, JButton adminButton, JButton stuButton, JLabel adminName,
    			JLabel stuName, JButton identityButton, JButton loginButton, JButton forgetButton,
    			JButton registerButton) {
    		this.con = con;
    		this.frame = frame;
    		this.accountField = accountField;
    		this.passwordField = passwordField;
    		this.attention = attention;
    		this.adminButton = adminButton;
    		this.stuButton = stuButton;
    		this.adminName = adminName;
    		this.stuName = stuName;
    		this.identityButton = identityButton;
    		this.loginButton = loginButton;
    		this.forgetButton = forgetButton;
    		this.registerButton = registerButton;
    	}
    
    	
    }
    
    3. AdminClick.java(管理员按钮事件)
    package stu_system.event.login_panel;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.PreparedStatement;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTextField;
    
    public class AdminClick implements ActionListener {
    	Attribute attr;
    
    	public AdminClick(Attribute attr) {
    		this.attr = attr;
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		try {
    			// if (JOptionPane.showInputDialog(frame, "输入暗号:").equals("皮蛋不是蛋")) {
    			attr.identityButton.setVisible(true);
    			attr.adminButton.setVisible(false);
    			attr.stuButton.setVisible(false);
    			attr.adminName.setVisible(false);
    			attr.stuName.setVisible(false);
    			attr.attention.setText("已选择管理员身份,请输入账号密码!");
    			attr.attention.setVisible(true);
    			attr.flag = 1;
    			// } else {
    			// JOptionPane.showMessageDialog(frame, "暗号错误!");
    			// }
    		} catch (Exception e1) {
    		}
    	}
    
    }
    
    4. FogetClick.java(忘记密码事件)
    package stu_system.event.login_panel;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.PreparedStatement;
    
    import javax.swing.JOptionPane;
    
    import stu_system.tool.SqlSearch;
    
    public class FogetClick implements ActionListener {
    	Attribute attr;
    
    	public FogetClick(Attribute attr) {
    		this.attr = attr;
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent arg0) {
    		try {
    			String result = null;
    			String sql = null;
    			if (attr.flag == -1) {
    				JOptionPane.showMessageDialog(attr.frame, "请先选择身份!");
    				return ;
    			} else if (attr.flag == 1) { // 是管理员
    				sql = "select password from admin where num=?";
    			} else {
    				sql = "select password from stu where num=?";
    			}
    			String s = JOptionPane.showInputDialog(attr.frame, "请输入账号:"); //根据sql查询密码
    			result = SqlSearch.dataByAnother(sql, attr.con, s);
    			if (result == null) {
    				JOptionPane.showMessageDialog(attr.frame, "无效账号!");
    			} else {
    				JOptionPane.showConfirmDialog(attr.frame, "密码为:" + result);
    			}
    		} catch (Exception e) {
    
    		}
    	}
    }
    
    5. IdentityButtonCarton.java(身份按钮动画事件)
    package stu_system.event.login_panel;
    
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    
    import javax.swing.BorderFactory;
    
    public class IdentityButtonCarton implements MouseListener {
    Attribute attr;
    boolean flag;  
    
    	public IdentityButtonCarton(Attribute attr,boolean flag) {
    	this.attr = attr;
    	this.flag=flag;
    }
    
    	@Override
    	public void mouseEntered(MouseEvent arg0) {
    		if(flag) {
    			attr.adminButton.setBorder(BorderFactory.createRaisedSoftBevelBorder());
    		}else {
    			attr.stuButton.setBorder(BorderFactory.createRaisedSoftBevelBorder());
    		}
    	}
    
    	@Override
    	public void mouseExited(MouseEvent e) {
    		if(flag) {
    			attr.adminButton.setBorder(BorderFactory.createLoweredSoftBevelBorder());
    		}else {
    			attr.stuButton.setBorder(BorderFactory.createLoweredSoftBevelBorder());
    		}
    		
    	}
    
    	@Override
    	public void mousePressed(MouseEvent e) {
    		if(flag) {
    			attr.adminButton.setBorder(BorderFactory.createLoweredSoftBevelBorder());
    		}else {
    			attr.stuButton.setBorder(BorderFactory.createLoweredSoftBevelBorder());
    		}
    	}
    
    	@Override
    	public void mouseClicked(MouseEvent e) {
    		// TODO 自动生成的方法存根
    		
    	}
    
    	@Override
    	public void mouseReleased(MouseEvent e) {
    		// TODO 自动生成的方法存根
    		
    	}
    
    }
    
    6. LoginClick.java(登录按钮事件)
    package stu_system.event.login_panel;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.PreparedStatement;
    
    import javax.swing.JOptionPane;
    
    import stu_system.gui.AdminFunctionPanel;
    import stu_system.gui.StuFunctionPanel;
    import stu_system.tool.SqlSearch;
    
    public class LoginClick implements ActionListener {
    	Attribute attr;
    
    	public LoginClick(Attribute attr) {
    		this.attr = attr;
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		try {
    			if (attr.flag == -1) {
    				JOptionPane.showMessageDialog(null, "请先选择身份!");
    				return;
    			}
    			String sql = null;
    			String sql2 = null;
    			String s = attr.accountField.getText();
    			String result = null;
    			if (attr.flag == 1) { // 管理员身份
    				sql = "select num from admin where num=?";
    			} else {
    				sql = "select num from stu where num=?";
    			}
    			result = SqlSearch.dataByAnother(sql, attr.con, s);
    			if (result == null) {
    				JOptionPane.showMessageDialog(attr.frame, "无效账号!");
    			} else {// 账号有效
    				if (attr.flag == 1) {// 管理员
    					sql2 = "select password from admin where num=?";
    				} else {
    					sql2 = "select password from stu where num=?";
    				}
    				result = SqlSearch.dataByAnother(sql2, attr.con, s);
    				if (!result.equals(attr.passwordField.getText())) {
    					JOptionPane.showMessageDialog(attr.frame, "密码错误!");
    				} else {
    					if (attr.flag == 1) {
    						new AdminFunctionPanel((com.mysql.jdbc.Connection) attr.con, attr.accountField.getText());
    					} else {
    						new StuFunctionPanel(attr.accountField.getText(), (com.mysql.jdbc.Connection) attr.con);
    					}
    					attr.frame.dispose();
    				}
    			}
    		} catch (Exception e1) {
    			// TODO: handle exception
    		}
    	}
    
    }
    
    7. RegisterClick.java(注册按钮事件)
    package stu_system.event.login_panel;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JOptionPane;
    
    import stu_system.gui.RegisterPanel;
    
    public class RegisterClick implements ActionListener {
    	Attribute attr;
    
    	public RegisterClick(Attribute attr) {
    		this.attr = attr;
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		if (attr.flag == -1) {
    			// 消息提示框
    			JOptionPane.showMessageDialog(null, "请先选择身份!");
    		} else if (attr.flag == 1) { // 管理员身份
    			Object[] options = { "管理员", "学生" };
    			int i = JOptionPane.showOptionDialog(null, "注册学生账号还是管理员账号?", "选择", JOptionPane.YES_NO_OPTION,
    					JOptionPane.QUESTION_MESSAGE, null, options, null);
    			if (i == 0) {
    				new RegisterPanel((com.mysql.jdbc.Connection) attr.con,attr.frame,0);
    			} else if (i == 1) {
    				new RegisterPanel((com.mysql.jdbc.Connection) attr.con,attr.frame,1);
    			}
    		} else {
    			// 消息提示框
    			JOptionPane.showMessageDialog(null, "学生没注册账号权限!");
    		}
    
    	}
    
    }
    
    8. ReIdentityClick.java(重选身份按钮事件)
    package stu_system.event.login_panel;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class ReIdentityClick implements ActionListener{
    	Attribute attr;
    
    	public ReIdentityClick(Attribute attr) {
    		this.attr = attr;
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		attr.identityButton.setVisible(false);
    		attr.adminButton.setVisible(true);
    		attr.stuButton.setVisible(true);
    		attr.adminName.setVisible(true);
    		attr.stuName.setVisible(true);
    		attr.attention.setVisible(false);
    		attr.flag = -1;
    	}
    	
    	
    }
    
    9. StuClick.java(学生按钮点击事件)
    package stu_system.event.login_panel;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class StuClick implements ActionListener{
    Attribute attr;
    
    	public StuClick(Attribute attr) {
    	this.attr = attr;
    }
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    			attr.identityButton.setVisible(true);
    			attr.adminButton.setVisible(false);
    			attr.stuButton.setVisible(false);
    			attr.adminName.setVisible(false);
    			attr.stuName.setVisible(false);
    			attr.attention.setText("已选择学生身份,请输入账号密码!");
    			attr.attention.setVisible(true);
    			attr.flag = 2;
    	}
    
    }
    

    3. mysql连接包mysql_join包

    1. Click.java(连接按钮事件)
    package stu_system.event.mysql_join;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.Connection;
    
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JPasswordField;
    import javax.swing.JTextField;
    
    import stu_system.gui.MysqlPanel;
    import stu_system.gui.LoginPanel;
    import stu_system.tool.Connect;
    
    public class Click implements ActionListener {
    	static Connection con = null; // 连接接口
    	private JTextField txtRoot;
    	private JPasswordField passwordField;
    	private MysqlPanel frame;
    
    	public Click(JTextField txtRoot, JPasswordField passwordField, MysqlPanel frame) {
    		this.txtRoot = txtRoot;
    		this.passwordField = passwordField;
    		this.frame = frame;
    	}
    
    	public void actionPerformed(ActionEvent e) {
    		String account = txtRoot.getText(); // Mysql用户名
    		String password = passwordField.getPassword().toString(); // Mysql密码
    		if (account.equals("") || password.equals("")) {
    			JOptionPane.showMessageDialog(null, "请填写所有信息!");
    		} else {
    			con = new Connect().prepartion("student_system", account,passwordField.getPassword()); // 数据库连接
    			if (con != null) {
    				new LoginPanel(con);
    				frame.dispose();
    			}
    		}
    	}
    
    }
    

    4. 学生功能事件stu_function包

    1. Attribute.java(学生功能面板属性)
    package stu_system.event.stu_function;
    
    import java.sql.Connection;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JTextArea;
    
    public class Attribute {
    	String myNum;
    	Connection con;
    	JFrame jf  ;
    	JTextArea showArea ;
    	JButton searchInfoButton ;
    	JButton searchGradeButton ;
    	JButton returnButton ;
    	JButton updateInfoButton ;
    	JButton updatePasswordButton;
    	public Attribute(String myNum, Connection con, JFrame jf, JTextArea showtArea, JButton searchInfoButton,
    			JButton searchGradeButton, JButton returnButton, JButton updateInfoButton, JButton updatePasswordButton) {
    		this.myNum = myNum;
    		this.con = con;
    		this.jf = jf;
    		this.showArea = showtArea;
    		this.searchInfoButton = searchInfoButton;
    		this.searchGradeButton = searchGradeButton;
    		this.returnButton = returnButton;
    		this.updateInfoButton = updateInfoButton;
    		this.updatePasswordButton = updatePasswordButton;
    	}
    	
    }
    
    2. ButtonClickCarton.java(按钮变色事件)
    package stu_system.event.stu_function;
    
    import java.awt.Color;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    
    public class ButtonClickCarton implements MouseListener {
    	Attribute attr;
    	int flag;
    
    	public ButtonClickCarton(Attribute attr, int flag) {
    		this.attr = attr;
    		this.flag = flag;
    	}
    
    	@Override
    	public void mouseClicked(MouseEvent arg0) {
    		// TODO 自动生成的方法存根
    
    	}
    
    	@Override
    	public void mouseEntered(MouseEvent arg0) {
    		switch (flag) {
    		case 0:
    			attr.searchInfoButton.setForeground(Color.red);
    			break;
    		case 1:
    			attr.searchGradeButton.setForeground(Color.red);
    			break;
    		case 2:
    			attr.updatePasswordButton.setForeground(Color.red);
    			break;
    		case 3:
    			attr.updateInfoButton.setForeground(Color.red);
    			break;
    		case 4:
    			attr.returnButton.setForeground(Color.red);
    		default:
    			break;
    		}
    
    	}
    
    	@Override
    	public void mouseExited(MouseEvent e) {
    		switch (flag) {
    		case 0:
    			attr.searchInfoButton.setForeground(Color.black);
    			break;
    		case 1:
    			attr.searchGradeButton.setForeground(Color.black);
    		case 2:
    			attr.updatePasswordButton.setForeground(Color.black);
    			break;
    		case 3:
    			attr.updateInfoButton.setForeground(Color.black);
    			break;
    		case 4:
    			attr.returnButton.setForeground(Color.black);
    		default:
    			break;
    		}
    	}
    
    	@Override
    	public void mousePressed(MouseEvent arg0) {
    		// TODO 自动生成的方法存根
    
    	}
    
    	@Override
    	public void mouseReleased(MouseEvent arg0) {
    		// TODO 自动生成的方法存根
    
    	}
    
    }
    
    3. ReturnClick.java(返回按钮事件)
    package stu_system.event.stu_function;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import stu_system.gui.LoginPanel;
    
    public class ReturnClick implements ActionListener{
    Attribute attr;
    
    	public ReturnClick(Attribute attr) {
    	this.attr = attr;
    }
    
    	@Override
    	public void actionPerformed(ActionEvent arg0) {
    		new LoginPanel(attr.con);
    		attr.jf.dispose();
    	}
    
    }
    
    4. SearchClick.java(查询信息事件)
    package stu_system.event.stu_function;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.List;
    
    import javax.swing.JOptionPane;
    
    import stu_system.tool.SqlSearch;
    
    public class SearchClick implements ActionListener {
    	Attribute attr;
    	int flag;
    
    	public SearchClick(Attribute attr, int flag) {
    		this.attr = attr;
    		this.flag = flag;
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		attr.showArea.setText("");
    		String sql = null;
    		switch (flag) {
    		case 0:
    			sql = "select * from information where num=?";
    			break;
    		case 1:
    			sql = "select chinese_grade,math_grade,english_grade from grade where num=?";
    			break;
    		default:
    			break;
    		}
    		List<StringBuilder> list = SqlSearch.SelectAll(sql, attr.con, attr.myNum); // 查询得到的结果
    		if (list.size() == 0) {
    			JOptionPane.showMessageDialog(attr.jf, "查无此人!");
    		} else {
    			String[] set = null;
    			switch (flag) {
    			case 0:
    				set = new String[] { "学号:", "姓名:", "电话:", "地址:" };
    				break;
    			case 1:
    				set = new String[] { "语文成绩:", "数学成绩:", "英语成绩:" };
    				break;
    			default:
    				break;
    			}
    			int index = 0;
    			for (StringBuilder builder : list) { // 一行数据,我们要将每一列都单独拿出来
    				String[] split = builder.toString().split("\t");
    				for (String str : split) {
    					attr.showArea.append("\n" + set[index++] + str + "\n");
    				}
    			}
    		}
    	}
    
    }
    
    5. UpdateInfoClick.java(更新信息事件)
    package stu_system.event.stu_function;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JOptionPane;
    
    import stu_system.tool.SqlSearch;
    
    public class UpdateInfoClick implements ActionListener {
    	Attribute attr;
    
    	public UpdateInfoClick(Attribute attr) {
    		this.attr = attr;
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		Object[] options = { "姓名", "电话", "地址" };
    		int i = JOptionPane.showOptionDialog(null, "修改哪项信息?", "选择", JOptionPane.YES_NO_OPTION,
    				JOptionPane.QUESTION_MESSAGE, null, options, null);
    		String up = JOptionPane.showInputDialog("修改【" + options[i] + "】为:");
    		boolean update = false;
    		if (i == 0) { // 名字
    			String sql2 = "update chinese_grade set 姓名=? where 学号=?";
    			String sql3 = "update math_grade set 姓名=? where 学号=?";
    			String sql4 = "update english_grade set 姓名=? where 学号=?";
    			String sql5 = "update information set name=? where num=?";
    			update = SqlSearch.batchUpdate(new String[] { sql2, sql3, sql4, sql5 }, attr.con, up, attr.myNum);
    		} else {
    			String sql = null;
    			if (i == 1) {
    				sql = "update information set tele=? where 学号=?";
    			} else if (i == 2) {
    				sql = "update information set address=? where 学号=?";
    			}
    			update = SqlSearch.Update(sql, attr.con, up, attr.myNum);
    		}
    		if (update) {
    			JOptionPane.showMessageDialog(attr.jf, "【" + options[i] + "】修改成功!");
    		} else {
    			JOptionPane.showMessageDialog(attr.jf, "【" + options[i] + "】修改失败!");
    		}
    
    	}
    
    }
    
    6. UpdatePasswordClick.java(更改本人密码事件)
    package stu_system.event.stu_function;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JOptionPane;
    
    import stu_system.gui.LoginPanel;
    import stu_system.tool.SqlSearch;
    
    public class UpdatePasswordClick implements ActionListener{
    Attribute attr;
    
    	public UpdatePasswordClick(Attribute attr) {
    	this.attr = attr;
    }
    
    	@Override
    	public void actionPerformed(ActionEvent arg0) {
    		String sql = "update stu set password=? where num=?";
    		String pw = JOptionPane.showInputDialog("新密码:");
    		boolean update = SqlSearch.Update(sql, attr.con, pw, attr.myNum);
    		if (update) {
    			JOptionPane.showMessageDialog(attr.jf, "密码修改成功!请重新登录");
    			new LoginPanel(attr.con);
    			attr.jf.dispose();
    		}else {
    			JOptionPane.showMessageDialog(attr.jf, "密码修改失败!");
    		}
    		
    	}
    
    }
    

    4. 工具tool包

    1. Connect.java(Mysql连接相关类)

    package stu_system.tool;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import javax.swing.JOptionPane;
    
    public class Connect {
    	Connection con=null;
    	// 数据库连接准备阶段
    	public Connection prepartion( String DataBase, String user, char[] pw) {
    		String password=new String(pw);
    		// 将数据库与JAVA建立通路
    		try {
    			String URL = "jdbc:mysql://127.0.0.1:3306/" + DataBase + "?characterEncoding=UTF-8";
    			// 返回与给定字符串名称的类或接口相关联的类对象
    			Class.forName("com.mysql.jdbc.Driver");
    			// 数据库具体连接地址、用户名、密码
    			con = DriverManager.getConnection(URL, user, password);	
    		} catch (Exception e) {
                   JOptionPane.showMessageDialog(null, "账号密码错误!");
                   return null;
    		}
    		return con;
    	}
    }
    

    2. SqlSearch.java(sql语句操作相关类)

    package stu_system.tool;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
    
    import com.mysql.jdbc.ResultSetMetaData;
    
    public class SqlSearch {
    
    	public static void Bind(PreparedStatement ps, Object... objects) throws SQLException {
    		for (int i = 0; i < objects.length; i++) {
    			ps.setString(i + 1, (String) objects[i]);
    		}
    	}
    
    	// 更新操作
    	public static boolean Update(String sql, Connection con, String... newData) {
    		PreparedStatement ps = null;
    		try {
    			ps = con.prepareStatement(sql);
    			Bind(ps, newData); // 绑定SQL
    			ps.executeUpdate(); // 执行更新操作
    			return true;
    		} catch (SQLException e) {
    			// TODO 自动生成的 catch 块
    			e.printStackTrace();
    		} finally {
    			try {
    				if (ps != null) {
    					ps.close();
    				}
    			} catch (SQLException e) {
    				// TODO 自动生成的 catch 块
    				e.printStackTrace();
    			}
    		}
    		return false;
    	}
    
    	public static boolean batchUpdate(String[] sql, Connection con, String... newData) {
    		PreparedStatement ps = null;
    		try {
    			con.setAutoCommit(false); // 不让SQL自动提交,事务操作
    			for (int i = 0; i < sql.length; i++) {
    				ps = con.prepareStatement(sql[i]);
    				Bind(ps, newData);
    				ps.executeUpdate();
    			}
    			con.commit();
    			return true;
    		} catch (SQLException e) {
    			try {
    				con.rollback(); // 回滚到没有执行时候的状态
    			} catch (SQLException e1) {
    				// TODO 自动生成的 catch 块
    				e1.printStackTrace();
    			}
    			// TODO 自动生成的 catch 块
    			e.printStackTrace();
    		} finally {
    			try {
    				if (ps != null) {
    					ps.close();
    				}
    				con.setAutoCommit(true); // 改回自动提交
    			} catch (Exception e2) {
    				// TODO: handle exception
    			}
    		}
    		return false;
    	}
    
    	// 根据参数查询并返回第一个数据
    	public static String dataByAnother(String sql, Connection con, String...account) {
    		PreparedStatement ps = null; // 将sql与ps绑定
    		ResultSet rs = null;
    		try {
    			ps = con.prepareStatement(sql);
    			Bind(ps, account);
    			rs = ps.executeQuery();
    			if (rs.next()) {
    				return rs.getString(1); // 将查询到的结果返回
    			} else {
    				return null;
    			}
    		} catch (SQLException e) {
    			// TODO 自动生成的 catch 块
    			e.printStackTrace();
    		} finally {
    			try {
    				if (ps != null) {
    					ps.close();
    				}
    				if (rs != null) {
    					rs.close();
    				}
    			} catch (SQLException e) {
    				// TODO 自动生成的 catch 块
    				e.printStackTrace();
    			}
    		}
    		return null;
    	}
    
    	// 查询得到所有数据
    	public static List<StringBuilder> SelectAll(String sql, Connection con, String... account) {
    		PreparedStatement ps = null;
    		ResultSet rs = null;
    		try {
    			List<StringBuilder> list = new ArrayList<StringBuilder>();
    			ps = con.prepareStatement(sql);
    			if (account != null) {
    				Bind(ps, account);
    			}
    			rs = ps.executeQuery();
    			java.sql.ResultSetMetaData metaData = rs.getMetaData(); // 结果集工具类
    			int columnCount = metaData.getColumnCount(); // 列数
    			while (rs.next()) {
    				StringBuilder builder = new StringBuilder();
    				int index = 1;
    				while (index <= columnCount) {
    					builder.append(rs.getString(index) + "\t");
    					index++;
    				}
    				list.add(builder);
    			}
    			return list;
    		} catch (SQLException e) {
    
    			// TODO 自动生成的 catch 块
    			e.printStackTrace();
    		} finally {
    			try {
    				if (ps != null) {
    					ps.close();
    				}
    				if (rs != null) {
    					rs.close();
    				}
    			} catch (SQLException e) {
    				// TODO 自动生成的 catch 块
    				e.printStackTrace();
    			}
    		}
    		return null;
    	}
    }
    

    5. 各类在Exclipse的结构分层

    在这里插入图片描述

    六. 总结

    代码量较大,但是其中的逻辑其实不很难理解,只要愿意静下心来应该都是可以搞懂的,背景图部分各位自己找即可,我这里就不提供了。
    码字不易,如果有帮助请来个赞鼓励一下吧!


    展开全文
  • C语言实现学生成绩管理系统(小白也看得懂)

    千次阅读 多人点赞 2020-01-31 11:03:09
    C语言实现学生成绩管理系统(小白也看得懂) 程序需要实现的功能 C语言学生信息管理系统包括以下几个功能: 1、学生成绩的录入 2、学生成绩的浏览 3、学生成绩的查询 4、学生成绩的删除 5、学生成绩的排序(这是进阶...

    程序需要实现的功能

    C语言学生信息管理系统包括以下几个功能:
    1、学生成绩的录入
    2、学生成绩的浏览
    3、学生成绩的查询
    4、学生成绩的删除
    5、学生成绩的排序(这是进阶功能,实现起来也最复杂)
    6、学生成绩的分析

    程序设计的整体思路

    程序主要实现思路是依靠链表,数组,指针,结构体等相关知识,其中的核心是对链表的操作。
    ①:使用单链表作为程序核心,单链表的每个结点储存一个学生的基本信息
    ②:创建一个函数类 ;主要包含以下功能的函数:创建链表,创建结点,插入结点,打印链表,删除结点等
    ③:创建一个功能类;主要包含主菜单功能显示以实现用户自主选择功能,操作函数

    源代码

    主函数(main)

    为了使代码看起来更为简洁明了,我将实现链表功能的函数类放入student.h的头文件中,主函数中只留有main函数
    首先需要完成对功能菜单栏的设计,为此,我创建了一个menu函数,为了使界面看起来更美观,可以加入一些符号

    menu

    void menu(void)
    {
    	printf("\t\t||--------------------------------------------------------------------------------||\n");
    	printf("\t\t||                 ****************【学生管理系统】***************                ||\n");
    	printf("\t\t||--------------------------------------------------------------------------------||\n");
    	printf("\t\t||*                                 1.学生成绩录入                                ||\n");
    	printf("\t\t||*                                 2.学生成绩浏览                                ||\n");
    	printf("\t\t||*                                 3.学生成绩查询                                ||\n");
    	printf("\t\t||*                                 4.学生成绩删除                                ||\n");
    	printf("\t\t||*                                 5.学生成绩排序                               ||\n");
    	printf("\t\t||*                                 6.学生成绩分析                                ||\n");
    	printf("\t\t||*                                 0.退出程序                                    ||\n");
    	printf("\t\t||--------------------------------------------------------------------------------||\n");
    }
    

    main函数的构建则依赖于while的无限循环,用来让用户不断选择功能直到其按0退出
    while循环内再嵌套一个switch函数来判断用户输入的数字以跳转到相应的功能

    main

    int main(void)
    {
    	menu();
    	
    	while (1)
    	{
    		int choice;
    		printf("请选择功能菜单(0-6): ");
    		scanf("%d", &choice);
    		
    		switch (choice)
    		{
    			case 1:
    			{
    				printf("-----------------【学生成绩录入】----------------------\n");
    				break;
    			}
    			case 2:
    			{
    				printf("-----------------【学生成绩浏览】----------------------\n");
    				break;
    			}
    			case 3:
    			{
    				printf("-----------------【学生成绩查询】----------------------\n");
    				break;
    			}
    			case 4:
    			{
    				printf("-----------------【学生成绩删除】----------------------\n");
    				break;
    			}
    			case 5:
    			{
    				printf("-----------------【学生成绩排序】----------------------\n");
    				break;
    			}
    			case 6:
    			{
    				printf("-----------------【学生成绩分析】----------------------\n");
    				printf("该系统提供学生成绩方差来帮助分析学生成绩\n");
    				break;
    			}
    			default:
    			{
    				printf("谢谢使用^_^!\n");
    				system("pause");
    				exit(0);
    				break;
    			}
    			
    		}
    
    
    	}
    	return 0;
    }
    

    以上就是主函数的整体框架,接下来要做的就是编写函数类,再往主函数里填充。

    头文件( student.h)

    头文件里主要包含函数类

    创建链表:

    创建学生信息结构体:

    首先我们需要完成对链表的构建,为此我们先创建一个学生信息结构体来表示一个学生的姓名学号语文、英语、数学、物理四颗成绩

    struct grade     
    {
    	int Chinese;
    	int English;
    	int Math;
    	int physical;
    };
    
    struct student   //学生信息结构体
    {
    	char name[20];
    	int number;
    	struct grade grade;
    };
    

    接下来就是编写链表的有关函数了

    Creatlist(创建链表)

    struct Node   //单个链表结点
    {
    	struct student data;
    	struct student* next;
    };
    
    struct Node* Creatlist(void)     //创建链表
    {
    	struct Node* HeadNode = (struct Node*)malloc(sizeof(struct Node));   //创建一个头结点,头结点表示此链表
    	HeadNode->next = NULL;
    	return HeadNode;
    }
    

    CreatNode(创建结点)

    struct Node* CreatNode(struct student data)  //创建结点
    {
    	struct Node* NewNode = (struct Node*)malloc(sizeof(struct Node));
    	NewNode->data = data;     //数据域
    	NewNode->next = NULL;     //指针域
    	return NewNode;
    }
    

    InsertNode(插入结点)

    链表结点的插入方法有很多种,像头插法,尾插法等,为了简便,这里采用头插法

    void InsertNode(struct Node* HeadNode, struct student data)
    {
    	struct Node* NewNode = CreatNode(data);  //创建一个新结点来插入
    	NewNode->next = HeadNode->next;  //该结点的指针域指向头结点的下一个结点
    	HeadNode->next = NewNode;   //头结点的指针域指向该结点
    	return;
    }
    

    deleteNode(删除结点)

    可以依据多种根据来删除结点,这里我们指定学号来删除结点

    void deleteNode(struct Node* HeadNode, int num)  //删除结点(根据指定学号删除)
    {
    	struct Node* postNode = HeadNode->next;
    	struct Node* postNodebefore = HeadNode;
    	if (postNode == Null)
    		printf("系统暂无任何学生信息,无法进行删除\n");
    	else
    		while (postNode->data.number != num)
    		{
    			postNodebefore = postNode;
    			postNode = postNode->next;
    			if (postNode == Null)
    			{
    				printf("系统中无该学生信息,无法进行删除\n");
    				return;
    			}
    		}
    	postNodebefore->next = postNode->next;
    	free(postNode);
    }
    

    printList(打印链表)

    void printList(struct Node* HeadNode) //打印链表
    {
    	struct Node* pMove;
    	pMove = HeadNode->next;
    
    	if (pMove == NULL)
    		printf("无学生信息\n");
    	else
    	{
    		printf("学号\t姓名\t语文\t英语\t数学\t物理\n");
    		while (pMove != NULL)
    		{
    			printf("%d %s %d %d %d %d", pMove->data.number, pMove->data.name, pMove->data.grade.Chinese, pMove->data.grade.English, pMove->data.grade.Math, pMove->data.grade.physical);
    			pMove = pMove->next;
    		}
    		printf("\n");
    	}
    

    seachNode(查询结点)

    void searchNode(struct Node* HeadNode, int number)  //根据学生学号来查询学生成绩
    {
    	struct Node* pMove = HeadNode->next;
    	if (pMove == NULL)
    		printf("无学生信息\n");
    	else
    	{
    		while (pMove != NULL)
    		{
    			if (number == pMove->data.number)
    			{
    				printf("学号\t姓名\t语文\t英语\t数学\t物理\n");
    				printf("%d %s %d %d %d %d", pMove->data.number, pMove->data.name, pMove->data.grade.Chinese, pMove->data.grade.English, pMove->data.grade.Math, pMove->data.grade.physical);
    				break;
    			}
    			pMove = pMove->next;
    		}
    		printf("\n");
    	}
    }
    

    由此,链表类函数已经全部构建完毕,函数的作用使一个个功能独立封装,在调用时直接引用函数即可,可是程序变得简单易读,也是写程序变得更有条理。

    接下来,就是与主函数的整合了

    整体整合

    主函数

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include"student.h"
    
    
    //主函数
    int main (void)
    {
    	menu();//打印界面
    
    	//声明变量
    	struct student newstudent;
    	int choice , month;
    	struct Node*List=Creatlist();
    
    	while (1) 
    	{
    		printf("请选择功能菜单(0-6):");
    		scanf("%d", &choice);
    	
    		switch (choice) 
    		{
    			case 1:
    			{
    				printf("-----------------【学生成绩录入】----------------------\n");
    				printf("请输入学生的学号和姓名:\n");
    				fflush(stdin);//字符串输入之前清空缓冲区
    				scanf("%d%s", &newstudent.number, newstudent.name);
    
    				printf("请输入学生的成绩(语文/英语/数学/物理):");
    				scanf("%d%d%d%d", &newstudent.grade.Chinese, &newstudent.grade.English, &newstudent.grade.Math, &newstudent.grade.physical);
    				
    				InsertNode(List, newstudent);  //数据存入结点中
    
    			}break;
    			
    			case 2:
    			{
    				printf("-----------------【学生成绩浏览】----------------------\n");
    
    				printList(List);
    
    			}break;
    		
    			case 3:
    			{
    				printf("-----------------【学生成绩查询】----------------------\n");
    			
    				int search_number;
    				printf("请输入您想要查询的学号:");
    				scanf("%d", &search_number);
    
    				searchNode(List, search_number);//根据学号打印出学生成绩
    			
    			}break;
    		
    			case 4:
    			{
    				system("CLS");
    				printf("-----------------【学生成绩删除】----------------------\n");
    				int delete_number;
    
    				printf("请输入要删除学生的学号:");
    				scanf("%d", &delete_number);
    
    				deleteNode(List,delete_number);//根据学生学号删除
    
    				printf("%d号学生已删除\n",delete_number);
    
    			}break;
    		
    			case 5:
    			{
    				system("CLS");
    				printf("-----------------【学生成绩排序】----------------------\n");
    			}break;
    
    			
    			case 0:
    			{
    				system("CLS");
    				printf("谢谢使用^_^!\n");
    				system("pause");
    				exit(0);
    
    			}break;
    		
    			default:
    			{
    				system("CLS");
    				printf("选择错误,请重新输入0.0\n");
    			}break;
    		}
    	}
    
    	system("pause");
    	return 0;
    }
    

    头文件 <student.h>:

    #include<stdio.h>
    #include<stdlib.h>
    
    //功能菜单
    void menu(void)
    {
    	printf("\t\t||--------------------------------------------------------------------------------||\n");
    	printf("\t\t||                 ****************【学生管理系统】***************                ||\n");
    	printf("\t\t||--------------------------------------------------------------------------------||\n");
    	printf("\t\t||*                                 1.学生成绩录入                                ||\n");
    	printf("\t\t||*                                 2.学生成绩浏览                                ||\n");
    	printf("\t\t||*                                 3.学生成绩查询                                ||\n");
    	printf("\t\t||*                                 4.学生成绩删除                                ||\n");
    	printf("\t\t||*                                 5.学生成绩排序                               ||\n");
    	printf("\t\t||*                                 0.退出程序                                    ||\n");
    	printf("\t\t||--------------------------------------------------------------------------------||\n");
    }
    
    struct grade
    {
    	int Chinese;
    	int English;
    	int Math;
    	int physical;
    };
    
    struct student   //学生信息结构体
    {
    	char name[20];
    	int number;
    	struct grade grade;
    };
    
    struct Node   //单个链表结点
    {
    	struct student data;
    	struct student* next;
    };
    
    struct Node* Creatlist(void)     //创建链表
    {
    	struct Node* HeadNode = (struct Node*)malloc(sizeof(struct Node));   //创建一个头结点,头结点表示此链表
    	HeadNode->next = NULL;
    	return HeadNode;
    }
    
    struct Node* CreatNode(struct student data)  //创建结点
    {
    	struct Node* NewNode = (struct Node*)malloc(sizeof(struct Node));
    	NewNode->data = data;     //数据域
    	NewNode->next = NULL;     //指针域
    	return NewNode;
    }
    
    void InsertNode(struct Node* HeadNode, struct student data)
    {
    	struct Node* NewNode = CreatNode(data);  //创建一个新结点来插入
    	NewNode->next = HeadNode->next;  //该结点的指针域指向头结点的下一个结点
    	HeadNode->next = NewNode;   //头结点的指针域指向该结点
    	return;
    }
    
    void deleteNode(struct Node* HeadNode, int num)  //删除结点(根据指定学号删除)
    {
    	struct Node* postNode = HeadNode->next;
    	struct Node* postNodebefore = HeadNode;
    	if (postNode == Null)
    		printf("系统暂无任何学生信息,无法进行删除\n");
    	else
    		while (postNode->data.number != num)
    		{
    			postNodebefore = postNode;
    			postNode = postNode->next;
    			if (postNode == Null)
    			{
    				printf("系统中无该学生信息,无法进行删除\n");
    				return;
    			}
    		}
    	postNodebefore->next = postNode->next;
    	free(postNode);
    }
    
    void printList(struct Node* HeadNode) //打印链表
    {
    	struct Node* pMove;
    	pMove = HeadNode->next;
    
    	if (pMove == NULL)
    		printf("无学生信息\n");
    	else
    	{
    		printf("学号\t姓名\t语文\t英语\t数学\t物理\n");
    		while (pMove != NULL)
    		{
    			printf("%d %s %d %d %d %d", pMove->data.number, pMove->data.name, pMove->data.grade.Chinese, pMove->data.grade.English, pMove->data.grade.Math, pMove->data.grade.physical);
    			pMove = pMove->next;
    		}
    		printf("\n");
    	}
    }
    
    void searchNode(struct Node* HeadNode, int number)  //根据学生学号来查询学生成绩
    {
    	struct Node* pMove = HeadNode->next;
    	if (pMove == NULL)
    		printf("无学生信息\n");
    	else
    	{
    		while (pMove != NULL)
    		{
    			if (number == pMove->data.number)
    			{
    				printf("学号\t姓名\t语文\t英语\t数学\t物理\n");
    				printf("%d %s %d %d %d %d", pMove->data.number, pMove->data.name, pMove->data.grade.Chinese, pMove->data.grade.English, pMove->data.grade.Math, pMove->data.grade.physical);
    				break;
    			}
    			pMove = pMove->next;
    		}
    		printf("\n");
    	}
    }
    

    !!!注:排序函数的构建由于所学有限,可以将录入的学生成绩储存在一个数组中,对数组中元素进行排序是很简单的

    总结

    项目的构建最先需要设想好程序应当实现的功能在进行编写,把需要多次调用的功能用函数封装起来,使程序更简单,主函数和头文件的分类也更方便他人阅读。

    成绩管理系统使较为简单的一个项目,比较适合大一新生上手锻炼实践,需要对链表,指针有足够的熟悉。

    展开全文
  • 要摧毁一个学生简单,像知乎上说的那样教孩子就行。 1,让他做感兴趣的事,人生的道路不止一条。 因为人类总会选择更容易的生活路径, 所以当他根据兴趣选择成长到18岁时, 他会成功的积累一系列所有人都...
    混沌椰子王 实话伤人专八水平。请拉黑,别逼逼。
    展开全文
  • Pycharm Professional长期免费使用方法学生党) 众所周知,充钱才能使你得更强,在Pycharm这个IDE上也是如此。Pycharm Professional相较于免费的社区版的Pycharm多了许多强大的功能,然鹅,它需要充钱。而你是否...

    Pycharm Professional长期免费使用方法(学生党)

    众所周知,充钱才能使你变得更强,在Pycharm这个IDE上也是如此。Pycharm Professional相较于免费的社区版的Pycharm多了许多强大的功能,然鹅,它需要充钱。而你是否还在苦逼地用着社区版的Pycharm?你是否还因为Pycharm Professional免费30天期限而苦恼?这里我来分享一个Pycharm Professional长期免费的使用方法。

    如果你是一个学生党,并且拥有一个属于自己的校园邮箱——恭喜你,你可以长期免费使用(白嫖 )Pycharm Professional!

    具体操作的步骤可以看这个链接里(JetBrains官网,写的很详尽了):学生授权申请方式

    白嫖它不香吗?

    展开全文
  • 玫瑰大学(约克,谢菲尔德,利兹)为生物科学博士学位的一年级学生提供的培训计划。 概述 所有生物学发现的基础都是数据! 通过实验设计,建模或模拟生成可靠的生物现象度量,然后分析和传达结果的能力对于生物...
  • Java编写学生管理系统

    千次阅读 多人点赞 2019-07-16 18:54:54
    在这篇文章中,只是简单的处理了一些学生的信息,由于是一只小白没有什么高端操作,求大佬指教,在这个学生系统中主要执行了一下功能。 1. 查看所有学生 2. 查看某个学生 3.增加学生信息 4.删除学生信息 5...
  • IT学生学习指南

    万次阅读 多人点赞 2020-03-13 15:50:02
    本文主要为了计算机相关专业的学生而写。内容是从本博主的工作经验和教学经验当中总结出来的一些干货,涵盖了从大一到大四期间学生所遇到的常见问题,包括如何找到满意的工作、如何选择适合自己的工作岗位、如何制定...
  • jsp+sql的学生选课系统过程

    千次阅读 2019-05-19 17:44:50
    选此课题初衷是毕竟自己作为一个学生来说最为贴近的就是学生选课系统,平常都是作为一个用户来使用这个系统,没有什么深入的了解其中的实现原理,所以抱着试一试的看法希望自己可以独立开发出一个简单美观的小项目来...
  • 作为一名大学生,如何在B站上快乐的学习?

    万次阅读 多人点赞 2020-01-18 20:32:11
    B站是个宝,谁谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕...
  • 有些话看着很有道理,但真的对照到自己身上,就会发现,没什么卵,甚至有一些看似正确的话,本身也经不起推敲,要么是自相矛盾,要么只是对简单道理的复杂包装。 有一位号称“腾讯神级产品经理”和“中关村第一...
  •  即便不午休,大脑也有办法走出精力衰退的低谷,这里就要提到一个神经学概念——“默认模式神经网络”,也就是人在放空状态下的大脑活动。日本东北大学的研究人员利用核磁共振成像测量了63名志愿者在放空状态下的脑...
  • IT学生解惑真经

    千次阅读 2013-07-02 09:52:52
    IT 学生解惑真经非生而知之者,孰能无惑?惑而不从师,其为惑也,终不解矣。--------韩愈《师说》在校的 IT学生有几百万都在为如何如何学习才能找到工作、融入社会而迷惑我们需要的不是灵丹妙药而是一本让你少走几年...
  • 当不变和可的行为在方法的子类中实现混合一起的时候,不变的行为会  在子类中出现。我们通过模板方法模式把这些行为搬移到单一的地方,这样就可以帮助子类摆脱重复的不变的行为的纠缠。   定义:定
  • 论如何退出学生端······

    万次阅读 2018-06-30 19:16:10
    学生端是广大学生们心中的一个巨大的负担,于是让我来详细地指导大家退出学生端。以下分四大点论述,分别从教师端的限制,学生端的使用者对学生端的了解度,其他方法,以及教师端全屏控制来论述。...
  • Python小白的数据库入门

    万次阅读 多人点赞 2019-06-28 16:49:32
    当返回的结果可能为多条数据时,通常使用fetchall()方法,该方法会返回一个结果列表,遍历这个列表就可得到多条结果。如第一个例子中的用法: result = cursor.fetchall() #遍历所有结果,并打印 for row in result:...
  • 提高学生学习《计算机网络》的兴趣!...1 5 0 1 ) 5 0摘要:计算机网络是理论性很强的课程,本文从注重师生情感交流,营造活跃课堂气氛,传统教学方法、养学生自主学习,改培来激发学生的学习兴趣。关键词:兴趣情...
  • 跨专业考研学生的三个问题

    千次阅读 2016-06-24 09:09:25
     我是一名准备升入大四的学生,目前在一所普通的化工院校就读,学的是高分子材料专业。大学期间挂了好多门课,基本和化学有关的专业课都有补考重修的记录。本人确是学渣无疑,不过绩点尚不至于低到不能毕业的地步,...
  • 东大学生必读手册

    千次阅读 2007-05-21 10:25:00
    号外:发现一篇东大宝典《东北大学学生必读手册》!读来正是大快人心,佩服写这个宝典的东大校友了,这比东大官方版的学生必读手册通俗易懂、总结全面,建议以此替换掉官方版的必读手册.......下面是全文摘录东北...
  • 随着电脑的普及与使用,现在的管理也提升了一个档次,渐渐实现了无纸化办公,即从原来的人工记录管理模式转变为电脑一体化管理。高校是科研的阵地,后勤的宿舍管理也应该一改传统的人工管理,更加信息化,时代化,...
  • 白盒测试---基本路径覆盖法

    万次阅读 多人点赞 2019-04-29 16:45:59
     ...白盒测试的测试方法有代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、Z路径覆盖、程序变异。  其中运用最为...
  • 软件工程专业学生的自我反思

    千次阅读 2020-12-18 22:55:14
    我现在是一名大三的学生,有时候还是会处在一种很迷茫的状态,这种状态体现在:自己会不自觉的打开王者荣耀,打开BiliBili刷视频,熬夜看剧,慢慢地陷入一个漩涡,越陷越深...... 你是否经常对自己的行为感到怀疑...
  • 基于jsp(java)高校学生考勤管理系统设计与实现

    万次阅读 多人点赞 2019-04-18 23:06:56
    获取项目源文件,学习交流联系Q:1415736481,可指导毕设,课设 本系统主要针对目前高校学生在线请假以及学生上课出勤管理而设计的...本高校学生考勤管理系统JSP+SQL Server 2000开发,开发过程中运用了页面模块化...
  • 一个三本学生的面试之旅

    千次阅读 2017-11-19 22:21:01
    首先先自我介绍一下,我是一个来自三本院校的学生,大学的专业是计算机科学与技术,也就是你们口里面经常调侃的”三本狗” 和 “码农”。今年大四,我也面临着找实习单位的难题。仔细数一数,我也面试了6家,但只...
  • 第八课 下定决心,不达目的誓不罢休 ☆ 很多事情看起来很困难,可是当你下定决心以后,它们就得非常简单。 ☆ 成功永远取决于你要不要,而不是能不能。 第九课 立即行动 ☆ 即使不成熟的尝试,也胜过胎死腹中的...
  • 我喜欢各种各样的证明。...人们很难想到这样一些完全找不到突破口...准确地说,有些命题多数人认为“怎么可能能够证明”却了一些技巧使得证明得非常简单。我看了五色定理的证明,定理宣称若要对地图进行染色使得相邻区
  • (注:上次来信见http://blog.csdn.net/sxhelijian/article/details/7760011) 如邮件主题所述,我是一个即将大四的学生。我学的专业是数学与应用数学,在大二上学期的时候,系里曾经开过《C++ 程序设计》这门课,...
  • 职场中典型的学生思维有哪些?

    千次阅读 2018-08-22 06:50:00
    ... 我所知道的,职场中典型的学生思维有三个:总以为一个问题应该有标准答案消费者心态对待工作总想要专门的学习时间展开说下。◇一、总以为一个问题应该有标准答案比如晋升这件事,很...
  • 适合学生的面膜

    千次阅读 2010-05-10 09:08:00
    做法也简单,只需将上述材料都混合调匀后涂到脸上等十五分钟凉清水洗净。  老化肌肤适用  糖比盐要温和,不会对皮肤太刺激。如果死皮在皮肤表面堆积,不清洗干净容易造成皮肤暗沉。下面这个面膜可以帮助...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,185
精华内容 9,274
关键字:

学生用简单的方法变白