一、項目介紹
為了鞏固Java的學(xué)習(xí)寫了一個基于MVC設(shè)計模式的學(xué)生管理系統(tǒng)。
簡單介紹一下MVC設(shè)計模式:
1、M也就是Model 模型層(也叫數(shù)據(jù)層)主要是通過這個類來進行數(shù)據(jù)的操作。
2、V是Views 視圖層,主要就是來顯示頁面信息。
3、C是Controller控制器,主要是用來做流程調(diào)度。
開發(fā)工具:IDEA、MySQL-5.5、Navicat、mysql-connector-java-5.0.8
二、項目分析
1.目錄結(jié)構(gòu)
這些就是這個項目的結(jié)構(gòu)。

2.需求分析
首先進行登錄,如果沒有賬戶可以進行注冊。
學(xué)生處理:
實現(xiàn)對于學(xué)生信息的增刪改查。
每個用戶都有自己的權(quán)限比如超級管理員可以進行學(xué)生信息的增刪改查。
用戶處理:
超級管理員可以進行用戶信息的增刪改(這里的改是只可以修改用戶的權(quán)限)。
而普通用戶是不可以對用戶信息進行操作的。
以上介紹下面的圖很清晰的寫了出來。

三、數(shù)據(jù)庫建表
1.創(chuàng)建學(xué)生表
字段分別為學(xué)號、姓名、性別、年齡、成績、電話、班級。

這是一些測試數(shù)據(jù)以便進行系統(tǒng)的測試。

2.用戶表
建表的方式跟學(xué)生表的一樣我這里就不展示了。
用戶表的字段為用戶序號、用戶名、密碼、權(quán)限(0 - 超級管理員、1 - 普通管理員、2 - 普通用戶)。

四、項目介紹及效果圖
這是項目所用到的全部類。
1、controller這個包里存放了兩個類分別是學(xué)生調(diào)度器和用戶調(diào)度器,主要就是進行流程調(diào)度。
2、global這個包里存放的分別是JDBC工具類用來連接數(shù)據(jù)庫從庫里獲取到數(shù)據(jù),剩下的兩個就是自定義的學(xué)生類和用戶類。
3、model這個包里也就是模型層這兩個模型層的作用是分別來處理學(xué)生數(shù)據(jù)和用戶數(shù)據(jù)。
4、views這個包是視圖層主要是在這里面進行數(shù)據(jù)的展示還有一些提示信息。
5、StuManagerMain是啟動項,從這里開始運行程序。
6、最重要的一點就是最下面的那個.jar包,首先要將這個包導(dǎo)入才可以進行連接數(shù)據(jù)庫的操作,具體步驟這里我就不過多贅述,可以自行查找。

1.登錄界面(效果圖)
(1) 注冊
從這里可以選擇要操作的序號,沒有賬號可以選擇注冊

這里選擇注冊,在輸入用戶名的時候程序會判斷是否跟已存在的用戶重名,如果重名則需重新輸入
這里輸入密碼,接下來確認密碼,提示注冊成功將會自動登錄,這里默認權(quán)限為普通用戶

(2) 登錄
這里就是登錄成功之后展示的頁面,在這里要進行管理用戶或是學(xué)生的選擇。

2.權(quán)限說明(效果圖)
我在之前說到了權(quán)限的問題,這個賬號的權(quán)限是超級管理員,我來登錄一個普通用戶看看還能否選擇管理用戶。
很明顯在這里給出了提示說不能操作。

選擇管理學(xué)生信息這里也是提示普通用戶只能進行查看學(xué)生信息。

普通管理員可以進行進入管理用戶信息,但是只可以進行查找

普通管理員在管理學(xué)生信息時候只可以進行查找和增加的操作

3.管理用戶信息(效果圖)
我登錄超級管理員的賬號來進行接下來的操作,在用戶管理我沒有弄增加用戶信息,增加的操作是讓用戶在注冊那里進行
(1) 查詢用戶信息
選擇查找用戶信息,顯示出了查詢的二級菜單,這里可以根據(jù)id、姓名、權(quán)限進行查找

選擇根據(jù)姓名查找,輸入用戶名之后顯示出來了該用戶的信息

如果輸入的用戶名查詢不到也會給出提示說用戶信息不存在

(2) 修改用戶信息
選擇修改用戶信息,這里修改的信息只能是權(quán)限,其他的用戶信息是無法修改的
在選擇修改后會給出該用戶當前是什么權(quán)限,這里將root用戶的權(quán)限修改為普通用戶

可以看到成功將權(quán)限修改為普通用戶

(3) 刪除用戶信息
選擇刪除用戶信息彈出了刪除的二級菜單,可以選擇刪除全部或是指定用戶

這里選擇刪除指定用戶,輸入要刪除的用戶名之后會彈出該用戶的信息來確認是否刪除

4.管理學(xué)生信息(效果圖)
接下來進行學(xué)生信息的管理介紹
(1) 查找學(xué)生信息
選擇查找學(xué)生信息展示出來的是查找的二級菜單這里可以根據(jù)學(xué)號、姓名、性別等等來查找信息。

這里選擇按照年齡查詢,這里彈出了一個二級菜單可以按照精確年齡或是區(qū)間的方式來查找

選擇區(qū)間來查詢,查詢結(jié)果如下

(2) 增加學(xué)生信息
接下來進行添加學(xué)生信息,這里顯示添加成功

可以找到該學(xué)生信息

(3) 修改學(xué)生信息
修改時會將修改前的信息進行一個展示,顯示修改成功

可以看出信息修改成功

(4) 刪除學(xué)生信息
將要刪除的信息展示出來確認是否要刪除,提示刪除成功

確認刪除成功

五、項目思路及部分代碼
1.MVC設(shè)計模式介紹
最開始我提到的MVC設(shè)計模式,分為模型層、視圖層、調(diào)度器,這個程序的調(diào)用流程很簡單
拿登錄界面來說一上來從主方法來調(diào)用視圖層的展示頁面,并獲取用戶的操作數(shù)
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 {
? ? ? ? // 用戶調(diào)度器
UserController uc = new UserController();
? ? ? ? // 用戶模型層
UserModel um = new UserModel();
// 通過用戶頁面獲取用戶操作數(shù)
// 將操作數(shù)傳入總調(diào)度器并且返回一個用戶
User user = uc.loginAction(UserPage.welcome());
if(null != user){
UserPage.welcomeToBack(user.getUserName());
}else{
UserPage.failed("注冊或登錄失敗!~");
System.exit(-1);
}
while (true){
// 進行數(shù)據(jù)的刷新
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("用戶不存在,退出系統(tǒng)!~");
System.exit(-1);
}
}
}
}
/**
* 用戶操作界面 (登錄或注冊)
* 視圖層
* @return 用戶選擇的操作數(shù)
*/
public static int welcome() {
System.out.println("* *********************************** *");
System.out.println("* ************** 登錄頁面 ************ *");
System.out.println("* ************* 1 - 登錄 ************* *");
System.out.println("* ************* 2 - 注冊 ************* *");
System.out.println("* ************* 0 - 退出系統(tǒng) ******** *");
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;
}
將返回的這個操作數(shù)作為參數(shù)傳到登錄或注冊的調(diào)度器中,在這里用switch來進行程序調(diào)度
/**
* 用戶登錄或注冊的調(diào)度器
* 調(diào)度器
* @param num 用戶選擇的操作數(shù)
* @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;
}
這里我選擇了注冊,這個分支里調(diào)用了視圖層來獲取一個要注冊的用戶對象
/**
* 填寫注冊信息
* 視圖層
* @return 返回一個User對象
*/
public static User getRegUser() throws SQLException {
String username;
String password;
// 模擬 Ajax 做頁面無刷新的情況下的數(shù)據(jù)同步
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);
}
將這個用戶對象作為參數(shù)通過調(diào)度器傳到模型層來進行添加用戶信息的操作
/**
* 將用戶輸入的信息對象添加到數(shù)據(jù)庫中
* @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;
}
這樣一個完整的調(diào)度關(guān)系就完成了,是不是很簡單!可以按照這種調(diào)度關(guān)系去實現(xiàn)其他的一些操作
2.部分源代碼
(1) 學(xué)生類
package com.kxs.stu_manager.global;
/**
* @ClassName Student
* @Description: TODO 學(xué)生類
* @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; // 權(quán)限 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"; // 數(shù)據(jù)庫用戶名自行修改
private static String PASSWORD = "toor"; // 密碼自行修改
// 構(gòu)造方法私有化
private JdbcUtils(){
}
// 注冊驅(qū)動
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);
}
}
}
}
}
六、總結(jié)
以上就是我對這個學(xué)生信息管理系統(tǒng)的介紹,本文僅介紹了項目的效果展示及程序的一些設(shè)計思路,如果有錯誤歡迎大家指出,交流學(xué)習(xí)。
tips:如果大家覺得還不錯,麻煩小伙伴們來一波免費的三連哦?。?!??????文章來源:http://www.zghlxwxcb.cn/news/detail-479082.html
原文件我放在下方啦,有需要的小伙伴來個三連,拿去隨便用??????(不許白嫖哦?。?!??)文章來源地址http://www.zghlxwxcb.cn/news/detail-479082.html
鏈接: https://pan.baidu.com/s/1loGI45PmkAkBNsYypHN3Uw
提取碼:0624
到了這里,關(guān)于史上最詳細的JAVA學(xué)生信息管理系統(tǒng)(MySQL實現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!