史上最详细的JAVA学生信息管理系统(MySQL实现)

news2024/9/30 23:35:03

一、项目介绍

为了巩固Java的学习写了一个基于MVC设计模式的学生管理系统。

简单介绍一下MVC设计模式:

1、M也就是Model 模型层(也叫数据层)主要是通过这个类来进行数据的操作。

2、V是Views 视图层,主要就是来显示页面信息。

3、C是Controller控制器,主要是用来做流程调度。

开发工具:IDEA、MySQL-5.5、Navicat、mysql-connector-java-5.0.8

二、项目分析

1.目录结构

这些就是这个项目的结构。

2.需求分析

首先进行登录,如果没有账户可以进行注册。

学生处理:

实现对于学生信息的增删改查。

每个用户都有自己的权限比如超级管理员可以进行学生信息的增删改查。

用户处理:

超级管理员可以进行用户信息的增删改(这里的改是只可以修改用户的权限)。

而普通用户是不可以对用户信息进行操作的。

以上介绍下面的图很清晰的写了出来。

三、数据库建表

1.创建学生表

字段分别为学号、姓名、性别、年龄、成绩、电话、班级。

这是一些测试数据以便进行系统的测试。

2.用户表

建表的方式跟学生表的一样我这里就不展示了。

用户表的字段为用户序号、用户名、密码、权限(0 - 超级管理员、1 - 普通管理员、2 - 普通用户)。

四、项目介绍及效果图

这是项目所用到的全部类。

1、controller这个包里存放了两个类分别是学生调度器和用户调度器,主要就是进行流程调度。

2、global这个包里存放的分别是JDBC工具类用来连接数据库从库里获取到数据,剩下的两个就是自定义的学生类和用户类。

3、model这个包里也就是模型层这两个模型层的作用是分别来处理学生数据和用户数据。

4、views这个包是视图层主要是在这里面进行数据的展示还有一些提示信息。

5、StuManagerMain是启动项,从这里开始运行程序。

6、最重要的一点就是最下面的那个.jar包,首先要将这个包导入才可以进行连接数据库的操作,具体步骤这里我就不过多赘述,可以自行查找。

1.登录界面(效果图)

(1) 注册

从这里可以选择要操作的序号,没有账号可以选择注册

这里选择注册,在输入用户名的时候程序会判断是否跟已存在的用户重名,如果重名则需重新输入

这里输入密码,接下来确认密码,提示注册成功将会自动登录,这里默认权限为普通用户

(2) 登录

这里就是登录成功之后展示的页面,在这里要进行管理用户或是学生的选择。

2.权限说明(效果图)

我在之前说到了权限的问题,这个账号的权限是超级管理员,我来登录一个普通用户看看还能否选择管理用户。

很明显在这里给出了提示说不能操作。

选择管理学生信息这里也是提示普通用户只能进行查看学生信息。

普通管理员可以进行进入管理用户信息,但是只可以进行查找

普通管理员在管理学生信息时候只可以进行查找和增加的操作

3.管理用户信息(效果图)

我登录超级管理员的账号来进行接下来的操作,在用户管理我没有弄增加用户信息,增加的操作是让用户在注册那里进行

(1) 查询用户信息

选择查找用户信息,显示出了查询的二级菜单,这里可以根据id、姓名、权限进行查找

选择根据姓名查找,输入用户名之后显示出来了该用户的信息

如果输入的用户名查询不到也会给出提示说用户信息不存在

(2) 修改用户信息

选择修改用户信息,这里修改的信息只能是权限,其他的用户信息是无法修改的

在选择修改后会给出该用户当前是什么权限,这里将root用户的权限修改为普通用户

可以看到成功将权限修改为普通用户

(3) 删除用户信息

选择删除用户信息弹出了删除的二级菜单,可以选择删除全部或是指定用户

这里选择删除指定用户,输入要删除的用户名之后会弹出该用户的信息来确认是否删除

4.管理学生信息(效果图)

接下来进行学生信息的管理介绍

(1) 查找学生信息

选择查找学生信息展示出来的是查找的二级菜单这里可以根据学号、姓名、性别等等来查找信息。

这里选择按照年龄查询,这里弹出了一个二级菜单可以按照精确年龄或是区间的方式来查找

选择区间来查询,查询结果如下

(2) 增加学生信息

接下来进行添加学生信息,这里显示添加成功

可以找到该学生信息

(3) 修改学生信息

修改时会将修改前的信息进行一个展示,显示修改成功

可以看出信息修改成功

(4) 删除学生信息

将要删除的信息展示出来确认是否要删除,提示删除成功

确认删除成功

五、项目思路及部分代码

1.MVC设计模式介绍

最开始我提到的MVC设计模式,分为模型层、视图层、调度器,这个程序的调用流程很简单

拿登录界面来说一上来从主方法来调用视图层的展示页面,并获取用户的操作数

package com.kxs.stu_manager;

import com.kxs.stu_manager.controller.UserController;
import com.kxs.stu_manager.global.User;
import com.kxs.stu_manager.model.UserModel;
import com.kxs.stu_manager.views.StuPage;
import com.kxs.stu_manager.views.UserPage;

import java.sql.SQLException;
import java.util.ArrayList;

/**
 * @ClassName StuManagerMain
 * @Description: TODO 主方法类
 * @Author: 2119475835@qq.com
 * @Date: 2023/1/9
 */
public class StuManagerMain {
    public static void main(String[] args) throws SQLException {
        // 用户调度器
        UserController uc = new UserController();
        // 用户模型层
        UserModel um = new UserModel();
        // 通过用户页面获取用户操作数
        // 将操作数传入总调度器并且返回一个用户
        User user = uc.loginAction(UserPage.welcome());
        if(null != user){
            UserPage.welcomeToBack(user.getUserName());
        }else{
            UserPage.failed("注册或登录失败!~");
            System.exit(-1);
        }

        while (true){
            // 进行数据的刷新
            try{
                ArrayList<User> userList = um.getUserInfoByName(user.getUserName());
                uc.userOrStuAction(UserPage.superManagerPage(userList.get(0).getCompetence()),
                                                            userList.get(0).getCompetence());
            }catch (Exception e){
                StuPage.failed("用户不存在,退出系统!~");
                System.exit(-1);
            }
        }

    }
}
/**
     * 用户操作界面 (登录或注册)
     * 视图层
     * @return 用户选择的操作数
     */
    public static int welcome() {
        System.out.println("* *********************************** *");
        System.out.println("* ************** 登录页面 ************ *");
        System.out.println("* ************* 1 - 登录 ************* *");
        System.out.println("* ************* 2 - 注册 ************* *");
        System.out.println("* ************* 0 - 退出系统  ******** *");
        System.out.println("* *********************************** *");
        int num;
        Scanner sc = new Scanner(System.in);
        do {
            System.out.print("请输入正确的选项:");
            num = sc.nextInt();
        } while (num < 0 || num > 2);
        return num;
    }

将返回的这个操作数作为参数传到登录或注册的调度器中,在这里用switch来进行程序调度

/**
     * 用户登录或注册的调度器
     * 调度器
     * @param num 用户选择的操作数
     * @return 返回注册或登录的用户
     */
    public User loginAction(int num) throws SQLException {
        User user = null;
        switch (num) {
            case 1: // 登录
                user = um.doLogin(UserPage.getLoginUser());
                if (null == user) {
                    UserPage.failed("登陆失败!~");
                }
                break;
            case 2: // 注册
                user = um.doReg(UserPage.getRegUser());
                if (null == user) {
                    UserPage.failed("注册失败!~");
                }
                break;
            case 0: // 退出
                UserPage.bye();
                System.exit(-1);
                break;
        }
        return user;
    }

这里我选择了注册,这个分支里调用了视图层来获取一个要注册的用户对象

/**
     * 填写注册信息
     * 视图层
     * @return 返回一个User对象
     */
    public static User getRegUser() throws SQLException {
        String username;
        String password;
        // 模拟 Ajax 做页面无刷新的情况下的数据同步
        do {
            System.out.print("请输入可用的用户名:");
            username = new Scanner(System.in).nextLine();
        } while (um.getUserByName(username) != null);

        do {
            System.out.print("请输入密码:");
            password = new Scanner(System.in).nextLine();
            System.out.print("请确认密码:");
        } while (!password.equals(new Scanner(System.in).nextLine()));

        return new User(username, password);
    }

将这个用户对象作为参数通过调度器传到模型层来进行添加用户信息的操作

/**
     * 将用户输入的信息对象添加到数据库中
     * @param regUser 用户注册的信息
     * @return 成功 - 返回一个全部信息的对象 失败 - 返回null
     */
    public User doReg(User regUser) throws SQLException {
        User user = null;

        conn = JdbcUtils.getConnection();
        String sql = "insert into `user`(`userName`, `password`) value (?,?)";
        pst = conn.prepareStatement(sql);

        pst.setString(1, regUser.getUserName());
        pst.setString(2, regUser.getPassword());

        int rows = pst.executeUpdate();
        if(rows > 0){
            UserPage.success("注册成功!~");
            user = getUserByName(regUser.getUserName());
        }

        JdbcUtils.free(rs, pst, conn);
        return user;
    }

这样一个完整的调度关系就完成了,是不是很简单!可以按照这种调度关系去实现其他的一些操作

2.部分源代码

(1) 学生类

package com.kxs.stu_manager.global;

/**
 * @ClassName Student
 * @Description: TODO 学生类
 * @Author: 2119475835@qq.com
 * @Date: 2023/1/9
 */
public class Student {
    private int id;
    private String name;
    private String sex;
    private int age;
    private float score;
    private String tel;
    private String classid;

    public Student() {
    }

    public Student(int id, String name, String sex, int age, float score, String tel, String classid) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.score = score;
        this.tel = tel;
        this.classid = classid;
    }

    public Student(String name, String sex, int age, float score, String tel, String classid) {
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.score = score;
        this.tel = tel;
        this.classid = classid;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        if(sex.equals("0") || sex.equals("1") || sex.equals("2")){
            this.sex = sex;
        }else{
            System.out.println("性别非法!~");
        }
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age > 0 && age < 100){
            this.age = age;
        }else {
            System.out.println("年龄非法!~");
        }
    }

    public float getScore() {
        return score;
    }

    public void setScore(float score) {
        if(score >= 0 && score <= 100){
            this.score = score;
            System.out.println("成绩非法!~");
        }
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public String getClassid() {
        return classid;
    }

    public void setClassid(String classid) {
        this.classid = classid;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                ", score=" + score +
                ", tel='" + tel + '\'' +
                ", classid='" + classid + '\'' +
                '}';
    }
}

(2) 用户类

package com.kxs.stu_manager.global;

/**
 * @ClassName User
 * @Description: TODO 用户类
 * @Author: 2119475835@qq.com
 * @Date: 2023/1/9
 */
public class User {
    private int id; // id
    private String userName; // 用户名
    private String password; // 密码
    private String competence; // 权限 0:超级管理员 1:普通管理员 2:普通用户
    /**
     * 0:超级管理员   增删改查
     * 1:普通管理员   增查
     * 2:普通用户     查
     */
    public User() {
    }

    public User(int id, String userName, String competence) {
        this.id = id;
        this.userName = userName;
        this.competence = competence;
    }

    public User(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }

    public User(int id, String userName, String password, String competence) {
        this.id = id;
        this.userName = userName;
        this.password = password;
        this.competence = competence;
    }

    public User(String userName, String password, String competence) {
        this.userName = userName;
        this.password = password;
        this.competence = competence;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getCompetence() {
        return competence;
    }

    public void setCompetence(String competence) {
        this.competence = competence;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                ", competence='" + competence + '\'' +
                '}';
    }
}

(3) JDBC工具类

package com.kxs.stu_manager.global;

import java.sql.*;

/**
 * @ClassName JdbcUtils
 * @Description: TODO JDBC的工具类
 * @Author: 2119475835@qq.com
 * @Date: 2023/1/9
 */
public class JdbcUtils {
    private static String URL = "jdbc:mysql://localhost:3306/kxs_data"; // 库名自行修改
    private static String USER = "root"; // 数据库用户名自行修改
    private static String PASSWORD = "toor"; // 密码自行修改

    // 构造方法私有化
    private JdbcUtils(){
    }

    // 注册驱动
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    // 建立连接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }

    // 释放资源
    public static void free(ResultSet rs, Statement st, Connection conn){
        try {
            if(null != rs){
                rs.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally{
            try {
                if(null != st){
                    st.close();
                }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }finally {
                try {
                    if(null != conn){
                        conn.close();
                    }
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

}

六、总结

以上就是我对这个学生信息管理系统的介绍,本文仅介绍了项目的效果展示及程序的一些设计思路,如果有错误欢迎大家指出,交流学习。

tips:如果大家觉得还不错,麻烦小伙伴们来一波免费的三连哦!!!👍👍👍

原文件我放在下方啦,有需要的小伙伴来个三连,拿去随便用👇👇👇(不许白嫖哦!!!😉

链接: https://pan.baidu.com/s/1loGI45PmkAkBNsYypHN3Uw
提取码:0624

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KubeSphere平台使用

KubeSphere官网地址&#xff1a;https://kubesphere.io/zh/ KubeKey一键部署K8S集群&#xff1a;https://kubesphere.io/zh/docs/v3.4/installing-on-linux/introduction/multioverview/ 一台master node&#xff08;初始化主节点&#xff09;、两台 work node&#xff08; joi…

品牌价格维护的具体方法

品牌销售渠道的混乱&#xff0c;一般体现在产品价格&#xff0c;价格是产品价值的直接表现&#xff0c;当价格混乱&#xff0c;消费者会不认可品牌价值&#xff0c;品牌因为自身渠道问题&#xff0c;导致消费者的流失&#xff0c;是非常得不偿失的&#xff0c;同时&#xff0c;…

(每日持续更新)jdk api之FileReader基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

c++学习笔记-STL案例-机房预约系统4-管理员模块

前言 衔接上一篇“c学习笔记-STL案例-机房预约系统3-登录模块”&#xff0c;本文主要设计管理员模块&#xff0c;从管理员登录和注销、添加账号、显示账号、查看机房、清空预约五个功能进行分析和实现。 目录 7 管理员模块 7.1 管理员登录和注销 7.1.1 构造函数 ​编辑7.1.2…

双线逆变器之低压转高压DC-DC拓扑结构

这是一个升压的过程&#xff0c;电池电压48V经过变压器等一系列的元器件最后升压到400V 如何让变压器形成正负电压&#xff1f; 通过让Q6Q7开通&#xff0c;Q6Q8关闭形成上下- 通过让Q6Q7关闭&#xff0c;Q6Q8开通形成上-下 前面四个管子和变压器的作用就是类似一个方波发生…

【linux进程间通信(一)】匿名管道和命名管道

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 进程间通信 1. 前言2. 进程间…

解决Windows下VSCode控制台乱码问题

我们在Windows使用VSCode编写C/C程序时&#xff0c;如果代码中的中文字符串使用的是UTF8编码&#xff0c;且代码内没有设置控制台的输出编码&#xff0c;或者编译时没有指定运行时编码&#xff08;GCC可以在编译时使用-fexec-charsetGBK来指定运行时的字符串编码&#xff1b;cl…

停车场车辆统计 - 华为OD统一考试

OD统一考试 (C卷) 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 特定大小的停车场&#xff0c;数组cars[]表示&#xff0c;其中1表示有车&#xff0c;0表示没车。 车辆大小不一&#xff0c;小车占一个车位&#xff08;长度1&#xff09;&#xff0c;…

IntelliJ IDEA 中输出乱码解决

最近tomcat突然在控制台输出乱码&#xff0c;各种乱码问题&#xff0c;查阅大量的资料&#xff0c;最终得以解决. IDEA控制台输出乱码 问题一&#xff1a;idea中tomcat控制台输出乱码 运行本地的tomcat\bin\start.bat文件页面显示正常 在idea中显示乱码 解决&#xff1a; 根…

计算机网络-ACL实验

一、NAT实验配置 NAT实验配置 通过基本ACL匹配VLAN 10网段&#xff0c;然后在出口设备NAT转换只要匹配到VLAN10地址则进行转换。 核心交换机 # 配置VLAN和默认路由&#xff0c;配置Trunk和Access接口 interface Vlanif10ip address 192.168.10.254 255.255.255.0 # interface V…

JVM-透彻理解字节码以及指令

一、字节码与指令概述 package ch13_bytecode;public class HelloWorld {public static void main(String[] args) {System.out.println("hello world");} }生成字节码&#xff1a; cafe babe 0000 0031 0022 0a00 0600 1409 0015 0016 0800 170a 0018 0019 0700 1a…

AI嵌入式K210项目(14)-TF卡读取

文章目录 前言一、TF卡介绍二、K210的SPI接口实验过程总结 前言 本章介绍一些读取TF卡的方法&#xff0c;本章内容和前面的项目非常类似&#xff0c;都是采用了SPI接口AI嵌入式K210项目&#xff08;11&#xff09;-SPI Flash读写 一、TF卡介绍 TF有4个数据传输端&#xff0c…

多标签节点分类

Multi-Label Node Classification on Graph-Structured Data,TMLR’23 Code 学习笔记 图结构数据的多标签分类 节点表示或嵌入方法 通常会生成查找表&#xff0c;以便将相似的节点嵌入的更近。学习到的表示用作各种下游预测模块的输入特征。 表现突出的方法是基于随机游走(ran…

开发日记3(java面向对象)

&#xff08;一&#xff09;java面向对象 1、面向过程和面向对象 很久很久以前&#xff0c;系统学习过C语言&#xff0c;但也只是学过&#xff0c;没有产生过除了考试以外的其他价值。后来工作中很多伙伴都在使用java&#xff0c;虽然当时自己不写java&#xff0c;但很久之前…

Linux CentOS stream9 nmcli

nmcli命令是redhat7或者centos7之后的命令&#xff0c;该命令可以完成网卡上所有的配置工作&#xff0c;并且可以写入配置文件&#xff0c;永久生效。 一、前期准备 在讨论、学习与训练nmcli命令前&#xff0c;必须明确几点&#xff1a; 1.开启NetworkManager 使用nmcli命令…

数据结构--串

本文为复习的草稿笔记&#xff0c;&#xff0c;&#xff0c;有点乱 1. 串的基本概念和基本操作 串是由零个或多个字符组成的有限序列 2. 串的存储结构 3.串的应用 模式匹配 BF算法&#xff08;简单匹配算法 穷举法 算法思路&#xff1a;从子串的每一个字符开始依次与主串…

百度云网盘下载速度如何提升到正常速度

引入问题 我们在下载代码学习资料的时候大多数都是百度云网盘&#xff0c;但是限速&#xff01;下载的十分的慢&#xff0c;有什么办法能让我们不开通会员就能享受正常速度呢&#xff1f; 当然有&#xff01; 解决百度云网盘下载速度过慢&#xff0c;提高到正常速度 点击右…

SpringBoot + 自定义注解 + AOP 打造通用开关

前言 最近在工作中迁移代码的时候发现了以前自己写的一个通用开关实现&#xff0c;发现挺不错&#xff0c;特地拿出来分享给大家。 为了有良好的演示效果&#xff0c;我特地重新建了一个项目&#xff0c;把核心代码提炼出来加上了更多注释说明&#xff0c;希望xdm喜欢。 案例 …

编译FFmpeg4.3.1 、x264并移植到Android

1、前言 FFmpeg 既是一款音视频编解码工具&#xff0c;同时也是一组音视频编解码开发套件。 2、准备工作 系统&#xff1a;LinuxNDK&#xff1a;android-ndk-r21b-linux-x86_64.zipFFmpeg&#xff1a;ffmpeg-snapshot.tar.bz2x264&#xff1a;x264 3、下载NDK 在linux环境中…

触摸按键控制LED灯

目录 1.理论 2.代码 2.1 touch_ctrl_led.v 2.2 tb_touch_ctrl_led 1.理论 以上的波形图的touch_flag是采用组合逻辑的方式产生的。 以上的touch_flag是采用时序逻辑产生的&#xff0c;时序逻辑会延迟一拍。 以上是上升沿和下降沿的组合逻辑和时序逻辑实现&#xff0c;逻辑或…