【面向对象应用~.~】——项目开发团队分配管理软件



项目详细代码,提取码: hwrk

项目介绍

【项目前提】

掌握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处理,否则会报错并直接退出

--------------------------------------------------------------------------------完美分割线-------------------------------------------------------------------------------------

心得体会

写完这个管理系统,又经过老师的验收后,发现自己有很多的细节并没有做到,要是给客户看,肯定会很不满意。
自己在构建大体结构上还是很有心得的,只是在以后的项目实践中要注意一些小细节,这些细节都是以后的客户可能很看重的。

学无止境
  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值