黑马信息教育管理系统
一、项目分布
Controller:
客服层:1.用于接收用户传递过来的数据信息
2.用于将接收到的数据传递给业务员进行数据逻辑操作
3.将业务员处理的逻辑结果展示给用户
Service:
业务员层:1.用于接收客服层传递过来的数据
2.用于调用仓管层进行数据交互
3.将仓管反馈回来的数据传递给客服层
Dao:
仓管层:1.用于接收业务层传递过来的指令
2.对所管理的数据库进行增删改查等数据处理
3.将处理后的数据反馈给业务层
Domain:
封装类:储存所做业务中所需要的类,并对其进行封装
Entry:
引擎类:用于程序主方法的操作
二、项目逻辑图

三、项目部署

四、项目展示界面
1.一级菜单展示
2.二级菜单展示
3.添加菜单展示
3.1添加成功菜单展示
3.2添加失败菜单展示

4.删除菜单展示
4.1删除成功菜单展示!
4.2删除失败菜单展示
5.修改菜单展示

6.查看菜单展示
五、代码展示
1.一级菜单代码展示:
/*
整个系统的程序启动入口 -- 启动引擎
*/
public class StudentManagerEntry {
private static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
while (true) {
// 展示系统一级功能菜单
System.out.println("-------------欢迎来到黑马信息管理系统-------------");
System.out.println("1. 学生管理");
System.out.println("2. 老师管理");
System.out.println("3. 退出");
//接收用户录入的选项
String option = sc.next();
//switch小括号中本质就是要一个值,值的类型支持: byte,short,int,char,jdk1.5开始支持枚举,jdk1.7开始支持String
//根据用户录入的选项来进行功能的路由
switch (option) {
case "1":
//创建一个学生客服对象, 并调用学生对象中的start方法进行启动二级菜单
StudentController con = new StudentController();
con.start();
break;
case "2":
System.out.println("进入老师管理系统...");
break;
case "3":
System.out.println("感谢您的使用,欢迎下次光临!");
System.exit(0);
break;
default:
System.out.println("录入有误,请检查后重试!");
break;
}
}
}
}
2.二级菜单代码展示:
public void start() {
while (true) {
System.out.println("-------------欢迎来到黑马学生管理系统-------------");
System.out.println("1. 添加学生");
System.out.println("2. 删除学生");
System.out.println("3. 修改学生");
System.out.println("4. 查看学生");
System.out.println("5. 退出");
String option = sc.next();
switch (option) {
case "1":
addStudent(1);//添加学生
break;
case "2":
deleteStudent();//删除学生
break;
case "3":
updateStudent(2);//修改学生
break;
case "4":
findAllStudent();//查看学生
break;
case "5":
return;//返回上一级
}
}
}
3.Student类封装
public class Student {
private String id;
private String name;
private String age;
private String birthday;
public Student(String id, String name, String age, String birthday) {
this.id = id;
this.name = name;
this.age = age;
this.birthday = birthday;
}
public Student() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
}
4.添加方法
—controller层
4.1 addStudent()方法
//客服的添加功能
private void addStudent(int flag) {
//1. 拿到添加的学生信息 -- 键盘录入
System.out.println("请输入学号:");
String id = inputStudentId(false,flag);
//2. 调用方法,封装学生对象, 指挥业务员进行添加业务
Student stu = getStudentInfo(id);
boolean res = service.addStudent(stu);
//3. 根据业务员返回的结果来给出对应的用户提示
System.out.println(res ? "添加成功!" : "添加失败!");
}
4.2inputStudentId()方法
/*
封装一个方法: 专门完成键盘录入一个id,并校验该id是否可用, 最终会返回一个可用的id
boolean exists:
未来方法被调用时,如果exists被赋值为true: 表示调用者期望得到一个系统中存在的id
未来方法被调用时,如果exists被赋值为false: 表示调用者期望得到一个系统中不存在的id
int flag:
未来方法被调用时要区分是添加方法调用的还是修改方法调用的,两个方法输出的提示语句不一样
*/
private String inputStudentId(boolean exists,int flag){
String id;
while (true) {
id = sc.next();
// 指挥service校验当前学号是否可用
boolean flag = service.isExists(id);
if (flag == exists) {
break;
} else {
if(flag == 1){
System.out.println("当前学号不可用,请重新录入");//添加时如果输入的id存在会提示
}else{
System.out.println("当前学号不存在,请重新录入");//修改时如果输入的id不存在会提示
}
}
}
return id;
}
4.3getStudenInfo方法
//封装一个方法: 用来键盘录入学生信息,封装学生对象并返回
private Student getStudentInfo(String id){
System.out.println("请输入姓名:");
String name = sc.next();
System.out.println("请输入生日【格式要求:xxxx-xx-xx】:");
String birthday = sc.next();
//2. 将录入的数据封装成一个学生对象,指挥业务员进行添加学生业务处理
return new Student(id, name, age, birthday);
}
—Service层代码
4.4isExists()方法
//业务员中的校验学号是否存在功能
public boolean isExists(String id) {
return dao.isExists(id);
}
4.5addStudent()方法
//业务员中的添加功能
public boolean addStudent(Student stu) {
// 指挥库管添加学生
return dao.addStudent(stu);
}
—Dao层
4.6isExists()方法
//库管校验学号是否存在功能
public boolean isExists(String id) {
//调用根据学号查索引方法
int index = getIndex(id);
/*
index != -1 : 只有当index的值不为-1时结果为true--- 存在
index != -1 : 只有当index的值为-1时结果为false----不存在
*/
return index != -1;
}
4.7getIndex()方法
/*
封装一个方法: 专门用来根据学号找索引
找到了: 返回正常的索引
找不到: 返回 -1
*/
private int getIndex(String id) {
//1. 假设要查找的学号不存在
int index = -1;
for (int i = 0; i < stus.length; i++) {
Student stu = stus[i];
// 只有当前学生对象不为null并且当前学生的学号和要删除的学生学号一致时,认为: 要删除的学员存在
if (stu != null && stu.getId().equals(id)) {
//修改标记: 将当前学生对象stu的索引记录下来
index = i;
break;
}
}
return index;
}
4.8addStudent()方法
//库管添加功能
public boolean addStudent(Student stu) {
//1. 创建一个数据仓库 -- 使用数组实现
//标记位: 假设都存满了
int index = -1;
//遍历数组容器
for (int i = 0; i < stus.length; i++) {
if (stus[i] == null) {
// 只要有一个位置为null,那么就说明假设不成立
// 此时记录下当前为null的这个位置的索引
index = i;
break;
}
}
//根据index的值来决定本次添加能否成功
if (index == -1) {
return false; //满了,存不了了
} else {
//有位置,先把当前要添加的学生存入该位置
stus[index] = stu; // 添加学生
return true;
}
}
5.删除方法
—Controller层
5.1deleteStudent()方法
//客服的删除功能
private void deleteStudent() {
//1. 拿到要删除的学生学号
System.out.println("请输入要删除的学生学号:");
String delId = sc.next();
//2. 指挥业务员进行删除业务操作
boolean res = service.deleteStudent(delId);
//3. 根据res的值来给出对应的提示
if (res) {
System.out.println("删除成功!");
} else {
System.out.println("删除失败: 请检查学号是否存在!");
}
}
—Service层
5.2deleteStudent()方法
//客服的删除功能
private void deleteStudent() {
//1. 拿到要删除的学生学号
System.out.println("请输入要删除的学生学号:");
String delId = sc.next();
//2. 指挥业务员进行删除业务操作
boolean res = service.deleteStudent(delId);
//3. 根据res的值来给出对应的提示
if (res) {
System.out.println("删除成功!");
} else {
System.out.println("删除失败: 请检查学号是否存在!");
}
}
—Dao层
5.3deleteStudent()方法
//库管删除功能
public boolean deleteStudent(String delId) {
//1. 根据要删除的学号,查找对应学生在数组中的索引位置
//调用根据学号查索引方法
int index = getIndex(delId);//方法调用
// 根据index的值来进行确认删除
if (index == -1) {
//说明当前学号不存在,则无法删除
return false;
} else {
//2. 将该索引位置置为null
stus[index] = null;
return true;
}
}
6.查找方法
—Controller层
6.1findStudent()方法
//客服的查看功能
private void findAllStudent() {
//1. 指挥业务员进行查看业务
Student[] allStudents = service.findAllStudent();
/*
可能存在的两种情况:
1. 有数据: Student[] allStudents = {stu,stu,null,null,null}
2. 没有数据: Student[] allStudents = {null,null,null,null,null} --> 期望业务 员处理成: Student[] allStudents = null
*/
//2. 展示业务员返回的数据
if (allStudents == null) {
System.out.println("系统暂无数据,请添加后重试!");
} else {
//有数据就展示数据
System.out.println("学号\t\t姓名\t年龄\t生日");
for (int i = 0; i < allStudents.length; i++) {
Student stu = allStudents[i];
if (stu != null) {
System.out.println(stu.getId() + "\t" + stu.getName() + "\t" + stu.getAge() + "\t\t" + stu.getBirthday());
}
}
}
—Service层
6.2findAllStudent()方法
//业务员中的查看功能
public Student[] findAllStudent() {
// 指挥库管拿到所有学生信息
Student[] allStudents = dao.findAllStudents();
/*
可能存在的两种情况:
1. 有数据: Student[] allStudents = {stu,stu,null,null,null}
2. 没有数据: Student[] allStudents = {null,null,null,null,null} --> 期望业务员处理成: Student[] allStudents = null
*/
// 假设系统中没有数据 -- boolean flag = false;
boolean flag = false;
for (int i = 0; i < allStudents.length; i++) {
if (allStudents[i] != null) {
//只要有一个索引位置不为null,说明系统中有数据,这时候要修改标记
flag = true;
break;
}
}
if (flag) {
//有数据,返回正常数组
return allStudents;
} else {
return null;
}
}
—Dao层
6.3findAllStudent()方法
//库管查看功能
public Student[] findAllStudents() {
return stus;
}
7.修改方法
—Controller层
7.1updateStudent()方法
//客服的修改功能
private void updateStudent() {
//1. 指挥业务员进行查看业务
Student[] allStudents = service.findAllStudent();
//判断系统是否有数据
if (allStudents == null) {
System.out.println("系统暂无数据,请添加后重试!");
} else {
//1. 输入要修改的学生学号
System.out.println("请输入要修改的学生学号:");
String updateId = inputStudentId(true);
//调用方法,封装学生对象
Student newStu = getStudentInfo(updateId);
service.updateStudent(updateId, newStu);
//4. 给出提示信息
System.out.println("修改成功!");
}
}
—Service层
7.2updateStudent()方法
//业务员中的修改功能
public void updateStudent(String updateId, Student newStu) {
//指挥dao进行修改操作
dao.updateStudent(updateId, newStu);
}
—Dao层
7.3updateStudent()方法
//库管修改功能
public void updateStudent(String updateId, Student newStu) {
//1. 根据学号找到对应的学生在容器中的索引位置
//调用根据学号查索引方法
int index = getIndex(updateId);
//2. 将该索引位置置为新的学生对象,从而达到修改效果
stus[index] = newStu;
}
六、注意
在此项目中我们用的数据存储是数组,但是如果简单的定义会使得数组被无限的被重新定义,造成的结果就是我们的系统永远无法存满,所以我们引出了static这个关键字去定义数组,使得在整个系统中只会使用一次。
// 局部变量: 跟着方法走,方法执行一次,局部变量就创建一次!
// 成员变量: 跟着对象走, 每创建一个当前类的对象,成员变量就跟着初始化一次!
private static Student[] stus = new Student[5];
版权声明:本文为qq_35778360原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。