一、项目介绍
为了巩固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