项目大纲
- 项目介绍
- 【项目前提】
- 【项目说明】
- 【项目结构】
- 【项目需求】
- 【项目设计框架】
- 系统功能设计
- 用户登录和注册
- 开发人员管理
- 开发团队调度管理
- 开发项目管理
- 各系统功能合并
- 合并过程
- 注意事项
- 心得体会
项目介绍
【项目前提】
掌握java基本语法
熟悉使用流程控制
了解Arraylist集合的基本
理解面向对象思想
熟练 封装,继承,多态
熟悉使用接口,异常
【项目说明】
1、本实践项目是一个项目开发团队分配管理系统,可以对开发人员和开发团队进行统一管理,并且可以给一个项目分配一个团队进行开发。团队组建过程包括将成员插入到团队中,或从团队中删除某成员,还可以列出团队中现有成员的列表开发团队成员包括架构师、设计师和程序员。最后,需要完成每一个项目都能有一个开发团队在进行开发即可。
2、本实践项目有四个模块:用户注册和登录模块,开发人员管理模块,开发团队调度管理模块,开发项目管理模块。
【项目结构】
【项目需求】
软件启动时,首先进入登录界面进行注册和登录功能。
当登陆成功后,进入菜单,首先就可以对开发人员账户和密码进行修改。 然后可以对开发人员进行增删改操作
人员添加成功后,根据菜单提示,基于现有的公司成员,组建一个开发团队以开发一个新的项目。
组建过程包括将成员插入到团队中,或从团队中删除某成员,还可以列出团队中现有成员的列表,开发团队成员包括架构师、设计师和程序员。
团队组建成功,则可以进入项目模块,添加项目,分配开发团队进行开发.
【项目设计框架】
1、创建一个MainMenu类,用于编写各个系统的访问界面,在这个类中,调用各个系统的功能类。
代码如下:
public class MainMenu {
//主菜单界面
public void mainInterface(){}
//登录和注册界面
public void loginInterface(){}
//开发人员管理界面
public void developerManage(){}
//开发团队人员管理界面
public void developerteamManagement(){}
//团队管理界面
public void teamManagement(){}
//项目管理界面
public void projectManagement(){}
public static void main(String[] args){}
}
2、创建一个operate包,将 MainMenu类 和 各个系统的功能类 都放入其中。
3、创建一个tool_class包,用于存放异常类(自定义的异常)和一个工具类(该工具类用于从替代键盘输入)
设计好大致的框架,后面我们要做的就是将每一个系统的功能设计出来,然后统一进行合并的衔接。
--------------------------------------------------------------------------------完美分割线-------------------------------------------------------------------------------------
系统功能设计
-------------------小小分割线------------------------
用户登录和注册
用户需要在登录界面进行登录进入到系统中去,这里的用户指的是管理人员。考虑到用户是否有账号这一情况,需要设计注册功能;还有用户要修改密码,也需要设计用户修改功能。
1、创建一个登录界面。
因为登录时的情况分为有账号和无账号两种情况,所以用if语句进行判断,然后为了键盘输入一次后能再进行选择,在外面又嵌套一个while循环。
后面为了在MainMenu中调用,进行用户信息修改,这里将返回值设定为一个用户信息类的集合。
注意:register 方法 和 login 方法后面会提到
代码如下:
//登录界面
public static ArrayList<ManagementInfor> loginInterface() {
ArrayList<ManagementInfor> al = new ArrayList<>();
System.out.println("---------用户登录界面---------");
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请问您是否已有账号? (请输入有或无)");
String s = sc.nextLine();
if (s.equals("无")) {
System.out.println("------------------");
System.out.println("您已进入账号注册系统");
register(al);
System.out.println("注册成功");
System.out.println("------------------");
} else if (s.equals("有")) {
System.out.println("------------------");
System.out.println("您已进入账号登录系统");
login(al);
System.out.println("登录成功");
System.out.println("------------------");
break;
} else {
System.out.println("输入错误,请重新输入");
}
}
return al;
}
2、创建一个用户信息类ManagementInfor
登录的管理员只需要一个ID和密码,所以在用户信息类中只需要有两个成员变量ID和card,然后写上set/get方法,还有该类的有参和无参构造。
代码如下:
public class ManagementInfor {
private String ID;
private String card;
public ManagementInfor() {
}
public ManagementInfor(String ID, String card) {
this.ID = ID;
this.card = card;
}
public String getCard() {
return card;
}
public void setCard(String card) {
this.card = card;
}
public String getID() {
return ID;
}
public void setID(String ID) {
this.ID = ID;
}
}
3、创建三个功能的方法
( 1 )注册方法 register():
此时我们是没有账号的,用户信息集合中也是没有对象的,所以先创建一个用户信息类的对象来存储即将注册的用户信息。
代码如下:
ManagementInfor mf = new ManagementInfor();
从键盘录入信息后,将录入的信息传递到用户信息表中,然后将该对象传入集合中。
代码如下:
mf.setID(s1);
mf.setCard(s2);
al.add(mf);
( 2 )登录方法 login():
首先要从键盘录入用户信息。创建一个boolean类型的变量flag,初始值为false,用于判断用户是否存在。
然后在集合进行for循环,看是否有账户信息与键盘录入一致的对象,如果有,令flag为true。
if (id.equals(s1) && card.equals(s2)) {
flag = true;
break;
} else {
flag = false;
}
最后对flag进行判断,如果为true就登录成功,如果为false就重新输入,为了能够重新输入,需从键盘输入开始到判断flag,将整个过程用while循环包起来。
(详细代码见链接)
( 3 )修改方法 insert():
首先键盘录入需要修改的用户的ID。创建一个boolean类型的变量flag,初始值为false,用于判断用户是否存在。
然后在集合中进行for循环,查询是否有这个ID,如果有就令flag=true。
for (int i = 0; i < al.size(); i++) {
String name = al.get(i).getID();
if (name.equals(id)) {
flag = true;
break;
}
}
然后对flag进行判断,如果为true就可以重新录入新的用户信息,如果为false就会退出报错并退出修改,要想再修改需重新进入。
-------------------小小分割线------------------------
开发人员管理
创建一个NameListService类完成开发人员管理模块,并创建一个成员变量:
ArrayList<Employee> employees=new ArrayList<>();
1、创建各个类的实体类
Employee(雇员)—>Programmer (程序员)—>Designer(设计师)
—>Architect(架构师)
Equipment(工具)—>PC(台式电脑) Equipment(工具)—>NoteBook(笔记本电脑)
Equipment(工具)—>Printer(打印机)
Employee(雇员)实现了Equipment(工具)接口
Equipment(工具)接口包含方法:String getDescription();
(详细代码请看链接)
2、创建实现功能的方法
做开发人员管理的功能设计,需要设计以下方法:
初始化:这里的初始化是提前录入一些数据,以便于后面进行测试。
查询:(显示所有数据)
直接用for循环将员工集合里的每一个对象的信息都打印出来
for (int i = 0; i < employees.size(); i++) {
System.out.println(employees.get(i));
}
添加信息:(根据职业添加(无,程序员,设计师,架构师))
因为这里有四个选项,故我使用了switch语句来进行循环;我们以程序员举例,通过键盘录入程序员的每条信息后,创建一个Programmer对象,使用Programmer类的有参构造方法赋值,程序员的工具是Equipment的子类PC,又创建一个PC对象,并使用有参构造方法赋值。然后将该Programmer 对象添加到员工集合中。
代码如下:
case 2:
System.out.print("请输入当前雇员的姓名:");
String name2=TSUtility.readKeyBoard(4,false);
System.out.print("请输入当前雇员的年龄:");
int age2=TSUtility.readInt();
System.out.print("请输入当前雇员的工资:");
double salary2=TSUtility.readDouble();
System.out.println("请为当前雇员配一台好的台式电脑");
System.out.print("请输入台式电脑的机器型号:");
String model2=TSUtility.readKeyBoard(10,false);
System.out.print("请输入台式电脑的显示器名称:");
String display2=TSUtility.readKeyBoard(10,false);
PC pc=new PC(model2,display2);
Programmer programmer=new Programmer(++count,name2,age2,salary2,pc);
employees.add(programmer);
System.out.println("人员添加成功!");
TSUtility.readReturn();
break;
删除信息:(注意员工id需要动态显示,也就是删除后,员工id需要更新)
删除的思路是一样的,先键盘输入要删除的员工id,然后用for循环查看该员工是否存在
如果存在则删除成功,如果不存在则抛出异常。
代码如下:
if (flag){
System.out.println("删除成功");
}else {
throw new TeamException("该员工不存在");
}
修改信息:(至少修改员工的姓名,年龄,工资)
先键盘输入要修改的员工id,再利用for循环寻找该员工是否存在
若存在,就键盘录入要修改的信息;若不存在,就抛出异常。
我这里设计的是如果抛出了异常,那么就重新返回到键盘输入id那里,故要从键盘输入id到判断结尾处添加一个while循环。
获取指定的某个成员的信息:获取指定ID的员工对象。
通过形参传入要获取的员工对象的ID,然后用for循环查询该员工是否存在。
如果存在,打印该员工的信息并返回;如果不存在,则抛出异常。
(详细代码请看链接)
-------------------小小分割线------------------------
开发团队调度管理
每个开发团队都需要管理其中的人员,所以我们需要创建一个用来管理开发团队里的人员的类TeamServer。
(1)首先,我们要先创建一些成员变量。
int counter=1; //为静态变量,用来为开发团队新增成员自动生成团队中的唯一ID
final int MAX_MEMBER=5; //表示开发团队最大成员数
int total=0; //记录团队成员的实际人数
Programmer[] team=new Programmer[MAX_MEMBER]; //用来保存当前团队中的各成员对象
(2)然后创建了一个初始化Programmmer数组的方法,还有返回数组成员的方法,因为后面会对团队进行添加、删除和查询,所以这两个方法是必须创建的。
//返回team中所有程序员构成的数组
public Programmer[] getTeam(){}
//初始化当前团队成员数组
public void clearTeam()
(3)创建查询方法,用一个for循环将数组中的数据都打印出来,注意此时人员的id有两个,一个是开发人员系统里的id,一个是开发团队人员系统里的memberId(我写的时候写错了,把i写成了l,因为后面引用太多,不方便修改),故打印的时候要将两个都打印出来。
for (int i = 0; i < total; i++) {
System.out.println(team[i].getMemberld()+"\\"+team[i]);
}
(4)创建添加方法,直接键盘输入要添加的员工id,然后直接调用开发人员管理系统的员工集合。在添加时,有以下的一些规定:
成员已满,无法添加
该成员不是开发人员,无法添加
该员工已在本开发团队中 该员工已是某团队成员
团队中至多只能有一名架构师(以下判断可借用instanceof进行判断)
团队中至多只能有两名设计师 团队中至多只能有三名程序员
出现以上的情况就要抛出异常。
(5)创建删除方法
首先键盘输入要删除的成员的团队id(memberId)。
然后利用for循环找到指定memberId的员工,并删除。
如果遍历一遍,都找不到,则报异常。
然后又用for循环,使后面的元素覆盖前面的元素
for (int i = n + 1; i < total; i++) {
team[i].setMemberld(i);
team[i - 1] = team[i];
}
team[--total] = null;
2、在MainMenu中创建团队管理界面的方法
-------------------小小分割线------------------------
开发项目管理
1、创建项目类Project
创建以下成员变量,并写出set/get方法,还有类的有参和无参构造。
int prold; //项目号
String projectName; //项目名称
String desName; //项目介绍
Programmer[] team; //开发团队
String teamName; //开发团队名称
boolean status=false; //开发状态 status=false(true为开发中,false为未开发中))
2、创建实现功能的方法
(1)项目的添加
键盘输入项目的名称和介绍。
然后创建一个新的项目,并传入数据。
Project p=new Project();
p.setProld(count++);
p.setProjectName(projectName);
p.setDesName(desName);
再将该对象添加到项目的集合pro中
(2)项目分配团队
分配团队、分配项目,然后给分配好的团队取名
(注意:在分配团队和项目的时候,都要查询团队和项目是否存在,如果不存在,都需要抛出异常)
然后创建项目对象,将数据传入进去,注意要把Project中的status状态改为true,表示该项目已被开发。
(3)查看项目当前状态
用for循环将项目里的对象的信息都打印出来
for (int i = 0; i < pro.size(); i++) {
System.out.println(pro.get(i));
}
(4)项目的删除
首先键盘输入要删除的项目编号,并查询是否存在,若不存在要抛出异常。
如果项目存在,又查看该项目的status。如果为true(开发状态)就不能删除,因为开发状态中的项目是不能够删除的,这时就要抛出异常并退出;如果为false(未开发状态)便可用remove方法将该项目删除。
if (flag){
if (pro.get(temp).isStatus()){
throw new TeamException("该项目正在被开发中,无法删除");
}else {
pro.remove(temp);
System.out.println("删除成功");
count--;
}
(详细代码请看链接)
-------------------小小分割线------------------------
--------------------------------------------------------------------------------完美分割线-------------------------------------------------------------------------------------
各系统功能合并
合并过程
用户登录和注册系统 LoginServer
开发人员管理系统 NameListServer
开发团队管理系统 TeamServer
项目管理系统 ProjectServer
在MainMenu类中,创建以上类对应的方法,并调用类的成员方法,完成各个系统的功能。
创建各个功能类的对象,还有需要使用到的集合对象,代码如下:
private ArrayList<ManagementInfor> al=loginInterface();
private ArrayList<Programmer[]> team_sum = new ArrayList<>();
private ArrayList<Employee> employees=new ArrayList<>();
TeamServer teamServer=new TeamServer();
NameListService nls=new NameListService();
ProjectService pjs=new ProjectService();
然后创建一个主菜单界面方法mainInterface,将各个系统对应的方法在其中调用。
最后在main方法中创建一个MainMenu的对象,调用mainInterface方法。
-------------------小小分割线------------------------
注意事项
(1)在打印信息时,可以打印出想要的信息,这需要到实体类中重写toString方法,而打印时可以不用调用toString方法。
(2)凡是删除、修改或者查询都需要查看该对象是否存在。
(3)抛出异常后,统一在调用界面的方法里进行try/catch处理,否则会报错并直接退出
--------------------------------------------------------------------------------完美分割线-------------------------------------------------------------------------------------
心得体会
写完这个管理系统,又经过老师的验收后,发现自己有很多的细节并没有做到,要是给客户看,肯定会很不满意。
自己在构建大体结构上还是很有心得的,只是在以后的项目实践中要注意一些小细节,这些细节都是以后的客户可能很看重的。
学无止境 |