项目开发团队分配管理软件

项目开发团队分配管理软件


前言

当一个公司要制作一个大项目,就需要通过人员来调度实现人员的分配管理,去创建团队来为公司做项目,这时,就需要这样一个软件来实现,这个项目是对去我们之前所学知识的一个总和,让我们把所学知识运用起来并熟练掌握,需要用到面向对象的封装、继承、多态,以及数组和结合,还要熟悉使用接口和异常。在做的过程中也是bug不断,不过都解决了,下面就来看一下代码和过程吧。
  
在这里插入图片描述

一、项目需求

1、目标

(1)模拟实现一个基于文本界面的《项目开发团队分配管理软件》。
(2)涉及到的知识:

① 面向对象的继承、封装、多态。
②对象的值传递和接口。
③static和final修饰符。
④特殊类的使用:包装类、抽象类、内部类。
⑤异常处理。
⑥Java基本语法和流程控制。
⑦数组、Arraylist集合的基本。

2、逻辑思路

把项目分成了四个模块,通过图来分析。
系统功能结构:

系统流程
在这里插入图片描述

实现的功能:

用户注册和登录:

当软件开启时,就会进入注册和登录界面,要先进行注册,再进行登录,可以用数组或集合来完成。

登录成功后就会进入修改界面,把开发人员的账户和密码进行修改。

开发人员管理:

一个团队里面是需要对人员进行增删改查操作,这个是类似于我们之前所学的学生管理系统。

开发团队调度管理:

当人员添加成功后就需要把人员组成一个团队,团队里就会有成员的添加和删除,进行相应的人员配比,还可以列出成员的列表,团队里的成员就包括:程序员、设计师、架构师。

开发项目管理:

进入开发项目管理时,还没有项目,需要添加项目,团队可以随机分配项目,查看团队的开发情况。

软件设计结构
在这里插入图片描述
分成三个包:domain(实体类),serive(逻辑操作类),view(界面显示类)。

  • com.team.view为主控模块,负责菜单的显示和处理用户操作。
  • com.team.service 模块为实体对象(Employee及其子类如程序员等)的管理模块
  • NameListService和TeamService类分别用各自的数组来管理公司员工和开发团队成员对象
  • ProjectService是对项目的操作对象类
  • domain模块为Employee及其子类等JavaBean类所在的包

二、具体实现

1.用户登录和注册模块

定义一个loginView类
实现注册方法:
如果没有账户需要注册。
如果有账户就直接登录。

实现登录功能:
判断用户输入的值是否正确
如果正确则进入软件菜单
如果错误则重新输入,限制输入次数为5次,超过5次就会重新启动软件。

实现修改用户密码功能:
可以实现对用户、密码,或者两者都可以修改。
LoginView类:

package com.team.view;


import java.util.Scanner;
//注册登录界面
public class LoginView {
    private String accountName = "";
    private String password = "";

    //注册
    public void register() throws InterruptedException {
        TSUtility.loadSpecialEffects();
        System.out.println("开始注册");
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您的注册账号:");
        String accountName = TSUtility.readKeyBoard(4, false);
        this.accountName = accountName;
        System.out.println("请输入您的注册密码:");
        String password = TSUtility.readKeyBoard(8, false);
        this.password = password;
        System.out.println("注册成功,请登录");
    }

    //登录
    public void login() throws InterruptedException {
        //登录次数
        int count = 5;
        boolean flag = true;
        while (flag) {
            System.out.println("**********************\uD83D\uDC31");
            System.out.println("***     登录界面    ***");
            System.out.println("***      (:       ***\uD83D\uDC31");
            System.out.println("**********************\uD83D\uDC31");
            System.out.println("请输入您的登录账号:");
            String accountName = TSUtility.readKeyBoard(4, false);
            System.out.println("请输入您的登录密码:");
            String password = TSUtility.readKeyBoard(8, false);
            //分两种情况,已注册和未注册
            if (this.accountName.length() == 0 || this.password.length() == 0) {
                System.out.println("未检测到您的账号,请先注册:");
                register();
            } else if (this.accountName.equals(accountName) && this.password.equals(password)) {
                TSUtility.loadSpecialEffects();
                System.out.println("登录成功,欢迎您:" + accountName);
                flag = false;
            } else {
                if (count <= 0) {
                    System.out.println("登录次数不足,退出!");
                    return;
                } else {
                    count--;
                    System.out.println("登录失败,用户密码不匹配");
                    System.out.println("登录次数还剩" + count + "次,请重新登录");
                }
            }
        }
    }

   //修改
    public void modify() throws InterruptedException {
        boolean flag=true;
        while(flag) {
            System.out.println("**********************\uD83D\uDC31");
            System.out.println("***     修改界面    ***");
            System.out.println("***      (:       ***\uD83D\uDC31");
            System.out.println("**********************\uD83D\uDC31");

            System.out.println("请输入您要修改的类型:");
            System.out.println("1(修改用户名)");
            System.out.println("2(修改密码)");
            System.out.println("3(修改用户名和密码)");
            System.out.println("4(不修改,退出)");
            Scanner sc =new Scanner(System.in);
            String choose = sc.next();
            if(choose.equals("1")){
                System.out.println("请输入您修改的账户名称:");
                String accountName= TSUtility.readKeyBoard(4,false);
                this.accountName=accountName;
                System.out.println("修改成功");
            }else if(choose.equals("2")){
                System.out.println("请输入您修改的密码:");
                String password=TSUtility.readKeyBoard(8,false);
                this.password=password;
                System.out.println("修改成功");
            }else if(choose.equals("3")){
                System.out.println("请输入您修改的账户名:");
                String accountName= TSUtility.readKeyBoard(4,false);
                this.accountName=accountName;
                System.out.println("请输入您修改的密码:");
                String password=TSUtility.readKeyBoard(8,false);
                this.password=password;
                System.out.println("修改成功");
            }else if(choose.equals("4")){
                System.out.println("退出中");
                TSUtility.loadSpecialEffects();
                flag=false;
            }else{
                System.out.println("输入错误,请重新输入”1“或者“2”或者“3”或者“4”:");
            }
        }
    }


}

2.开发人员管理模块

在domain包中完成对个实体类的创建

  • com.team.domain包中包含了所有实体类
    在这里插入图片描述
  • 其中程序员(Progarmmer)及其子类,均会领用某种电子设备(Equipment)。

** Equipment接口及其实现子类的设计**
在这里插入图片描述
说明:
model 表示机器的型号
display 表示显示器名称
type 表示机器的类型
根据需要提供各属性的get/set方法以及重载构造器
实现类实现接口的方法,返回各自属性的信息

Employee类及其子类的设计

说明:

memberId 用来记录成员加入开发团队后在团队中的ID
Status是项目中人员的状态,先赋值为true,当添加到团队时为false
equipment 表示该成员领用的设备
可根据需要为类提供各属性的get/set方法以及重载构造器
bonus 表示奖金
stock 表示公司奖励的股票数量
可根据需要为类提供各属性的get/set方法以及重载构造器

在IDEA中创建的domain包:
在这里插入图片描述
其中project类是后面所需要的项目实体类。

在NameListService类中完成功能操作

NameListService类的设计
在这里插入图片描述

说明:

  • getAllEmployees()方法:获取当前所有员工。
    返回:包含所有员工集合。

  • getEmployee(id:int)方法:获取指定ID的员工对象。
    参数:指定员工的ID。
    返回:指定员工对象。
    异常:找不到指定的员工。

在service子包下提供自定义异常类:TeamException。
另外,可根据需要自行添加其它方法或重载构造器。

添加数据:

 employees.add(new Employee(count, "马云", 22, 3000));
                    employees.add(new Architect(++count, "马化腾", 32, 18000, new NoteBook("联想T4", 6000), 60000, 5000));
                    employees.add(new Programmer(++count, "李彦宏", 23, 7000, new PC("戴尔", "NEC 17寸")));
                    employees.add(new Programmer(++count, "刘强东", 24, 7300, new PC("戴尔", "三星 17寸")));
                    employees.add(new Designer(++count, "雷军 ", 50, 10000, new Printer("激光", "佳能2900"), 5000));
                    employees.add(new Programmer(++count, "任志强", 30, 16800, new PC("华硕", "三星 17寸")));
                    employees.add(new Designer(++count, "柳传志", 45, 35500, new PC("华硕", "三星 17寸"), 8000));
                    employees.add(new Architect(++count, "杨元庆", 35, 6500, new Printer("针式", "爱普生20k"), 15500, 1200));
                    employees.add(new Designer(++count, "史玉柱", 27, 7800, new NoteBook("惠普m6", 5800), 1500));
                    employees.add(new Programmer(++count, "丁磊 ", 26, 6600, new PC("戴尔", "NEC17寸")));
                    employees.add(new Programmer(++count, "张朝阳 ", 35, 7100, new PC("华硕", "三星 17寸")));
                    employees.add(new Designer(++count, "杨致远", 38, 9600, new NoteBook("惠普m6", 5800), 3000));

他是通过new一个对象来储存的,在使用这个方法的时候,我们要重写toString方法,否则出现的是地址值。

删除数据:

 public void deleteEmployee(int id) {

        boolean flag = false;
        for (int i = 0;i<employees.size();i++) {
            if(employees.get(i).getId()==id) {
               employees.remove(i);
               for(i=id;i<=employees.size();i++){
                    employees.get(i-1).setId(employees.get(i-1).getId()-1);
               }
               flag=true;
            }
        }
       

当员工删除后,员工的序号也会跟着变动,往前移一个,循环遍历时就依次减1。

3.开发团队调度管理模块

TeamService类的设计
在这里插入图片描述

在这里插入图片描述
TeamView:

package com.team.view;

import com.team.domain.Employee;
import com.team.domain.Programmer;
import com.team.service.NameListService;
import com.team.service.TeamException;
import com.team.service.TeamService;

import java.util.ArrayList;

public class TeamView {
    private NameListService listSvc=new NameListService();
    private TeamService teamSvc=new TeamService();
    private ArrayList<Programmer[]> team=new ArrayList<>();
    //主界面显示及控制
    public void enterMainMenu (){
        Boolean loopFlag=true;
        char key=0;
        do{
            if(key!='1'){
                listAllEmployees();
            }
            System.out.println("1-团队列表 2-添加团队成员 3-删除团队成员 4-退出 请选择(1-4):");
            key=TSUtility.readMenuSelection();
            switch (key){
                case '1':
                    listTeam();
                    break;
                case '2':
                    addMember();
                    break;
                case '3':
                    deleteMember();
                    break;
                case '4':
                    System.out.println("确认是否推出(Y/N):");
                   char yn=TSUtility.readConfirmSelection();
                   if(yn== 'Y'){
                       team.add(teamSvc.getTeam());
                       teamSvc.clearTeam();
                       loopFlag=false;
                   }break;
                default:
                    break;
            }
        }while(loopFlag);
    }
    //显示所有员工成员
    private void listAllEmployees(){
        System.out.println("\n----------开发团队调度软件----------\n");

        ArrayList<Employee> emps=listSvc.getAllEmployees();
        if(emps.size()==0){
            System.out.println("没有客户记录");
        }else {
            System.out.println("ID\t姓名\t年龄\t工资\t职位\t状态\t奖金\t股票\t领用设备");
        }
        for(int i=0;i<emps.size();i++){
            System.out.println(""+emps.get(i));
        }
        System.out.println("-------------------------------------");
    }

    //显示开发团队成员列表
    private void listTeam(){
        System.out.println("----------团队成员列表----------");
       Programmer[] team=teamSvc.getTeam();
       if(team.length==0){
           System.out.println("开发团队目前没有成员");
       }else{
           System.out.println("TID/ID\t\t姓名\t\t年龄\t\t 工资\t\t 职位\t\t 奖金\t\t 股票");
       }
       for(int i=0;i<team.length;i++){
           System.out.println(""+team[i].getDetailsForTeam());
       }
        System.out.println("------------------------------");
    }

    //添加成员到团队
    private void addMember(){
        System.out.println("----------添加成员-----------");
        System.out.println("请输入要添加员工的ID:");
        int id=TSUtility.readInt();
        try{
            Employee e=listSvc.getEmployee(id);
            teamSvc.addMember(e);
            System.out.println("添加成功");
        }catch (TeamException e){
            System.out.println("添加失败,原因:"+e.getMessage());
        }
        //按回车键继续
        TSUtility.readReturn();
    }
    //从团队中删除指定的id成员
    private void deleteMember(){
        System.out.println("----------删除成员-----------");
        listTeam();
        if(teamSvc.getTeam().length!=0) {
            System.out.println("请输入您要删除的TID:");
            int TID = TSUtility.readInt();
            if(TID<1){
               try{
                   throw new TeamException("不存在该成员的TID");
               } catch (TeamException e){
                   System.out.println(e.getMessage());
               }
            }
            System.out.println("确认是否删除(Y/N):");
            char yn = TSUtility.readConfirmSelection();
            if (yn == 'N') {
                return;
            }
            try {
                teamSvc.removeMember(TID);
                System.out.println("删除成功");
            } catch (TeamException e) {
                System.out.println("删除失败,原因:" + e.getMessage());
            }
            //按回车键继续
            TSUtility.readReturn();
        }
    }
    //加入并得到更多的团队
    public ArrayList<Programmer[]> getManyTeam(){
        boolean flag=true;
        char key=0;
        do{
            System.out.println("※※※※※※※※※※");
            System.out.println("※  团队调度界面  ※");
            System.out.println("※※※※※※※※※※");
            System.out.println("1-添加团队 2-查看团队 3-删除团队 4-退出 请选择(1-4):");
            key=TSUtility.readMenuSelection();
            switch (key){
                case '1':
                    enterMainMenu();
                    break;
                case '2':
                    System.out.println("---------------团队列表---------------------");
                    for(Programmer[] team:team){
                        for(int i=0;i<team.length;i++){
                            System.out.println(team[i]);
                        }
                        System.out.println("----------------------------------------");
                    }
                    break;
                case '3':
                    if(team.size()==0){
                        try{
                            throw new TeamException("当前并无团队,请先添加团队");
                        }catch (TeamException e){
                            System.out.println(e.getMessage());
                        }
                    }
                    if(team.size()!=0) {
                        System.out.println("请输入想要删除第几个团队:");
                        int num = TSUtility.readInt();
                        if (num <= team.size()) {
                            System.out.println("确认是否删除团队(Y/N):");
                            char de = TSUtility.readConfirmSelection();
                            if (de == 'Y') {
                                team.remove(num - 1);
                            } else {
                                System.out.println("请考虑清楚");
                            }
                        } else {
                            System.out.println("没有该团队,请正常输入,目前只有团队" + team.size() + "个");
                        }
                    }
                    break;
                case '4':
                    System.out.println("确认是否退出(Y/N):");
                    char yn=TSUtility.readConfirmSelection();
                    if(yn=='Y'){
                     flag=false;
                    }
                    break;
                default:
                    break;

            }
        }while (flag);
        return team;
    }
}

4、开发项目管理模块

在这里插入图片描述
在这里插入图片描述
随机分配团队

 //项目分配团队开发
    public void dealingPro(Programmer[] team) {

        System.out.println("当前团队的人员:");
        for (int i = 0; i < team.length; i++) {
            System.out.println(team[i]);
        }
        System.out.println("请为当前团队创建一个团队名称:");
        String teamName = TSUtility.readKeyBoard(6, false);

        //随机分配项目
        Random r = new Random();
        int randomNum = r.nextInt(pro.size());
        Project project = this.pro.get(randomNum);

        project.setTeamName(teamName);
        project.setTeam(team);
        project.setStatus(true);

        pro.set(randomNum, project);
    }

项目的删除

 //删除选择的项目
    public void delPro(int id) {
        boolean flag = false;
        //判断项目是否被开发
        boolean s = true;
        for (int i = 0; i < pro.size(); i++) {
            if (pro.get(i).isStatus()) {
                if (pro.get(i).getProId() == id) {
                    s = true;
                } else {
                    pro.remove(i);
                    for (i = id; i <= pro.size(); i++) {
                        pro.get(i - 1).setProId(pro.get(i - 1).getProId() - 1);
                    }
                    flag = true;
                }
            }
        }
        if (s) {
            try {
                throw new TeamException("项目已经被开发,不能被删除");
            } catch (TeamException e) {
                System.out.println(e.getMessage());
            }
        } else {
            if (flag) {
                System.out.println("删除成功");
                count--;
            } else {
                try {
                    throw new TeamException("该项目不存在");
                } catch (TeamException e) {
                    System.out.println(e.getMessage());
                }
            }
        }
    }

主界面

IndexView类:

package com.team.view;

import com.team.domain.Programmer;
import com.team.service.NameListService;
import com.team.service.ProjectService;
import com.team.service.TeamException;


import java.util.ArrayList;

public class IndexView {
//主界面
    private static final LoginView loginView=new LoginView();
    private static final NameListService nameListService=new NameListService();
    private static final ProjectService projectService=new ProjectService();
    private static final TeamView teamView =new TeamView();
    private ArrayList<Programmer[]> manyTeam=null;

    public void menu() throws TeamException {
        boolean loopFlag=true;
        char key=0;
        System.out.println("-------------------------------");
        System.out.println("--                           --");
        System.out.println("-- 欢迎来到项目开发团队管理模块  --");
        System.out.println("--                           --");
        System.out.println("-------------------------------");
        System.out.println("--");
        System.out.println("--------<请您先进行登录>---------");
        TSUtility.readReturn();
        try{
            loginView.login();
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        do{
            System.out.println("-------------------------------");
            System.out.println("--                           --");
            System.out.println("           软件主菜单            ");
            System.out.println("--                           --");
            System.out.println("-------------------------------");
            System.out.println("1.<用户修改界面>");
            System.out.println("2.<开发人员管理>");
            System.out.println("3.<开发团队调度管理>");
            System.out.println("4.<开发项目管理>");
            System.out.println("5.<退出软件>");
            System.out.println("↓请选择:");
            key=TSUtility.readMenuSelectionPro();
            switch (key){
                case '1':
                    try{
                        loginView.modify();
                    }catch (InterruptedException e){
                        //e.printStackTrace();
                        System.out.println(e.getMessage());
                    }
                    break;
                case '2':
                    try{
                        nameListService.showEmployee();
                    }catch (InterruptedException e){
                        //e.printStackTrace();
                       System.out.println(e.getMessage());
                    }
                    boolean loopFlagSec=true;
                    char keySec=0;
                do{
                    System.out.println("--   ~开发人员管理主菜单~    --");
                    System.out.println("1.    <开发人员的添加>         ");
                    System.out.println("2.    <开发人员的查看>         ");
                    System.out.println("3.    <开发人员的修改>         ");
                    System.out.println("4.    <开发人员的删除>         ");
                    System.out.println("5.    <退出当前菜单>           ");
                    System.out.println("↓请选择:");
                    keySec=TSUtility.readMenuSelectionPro();
                    switch (keySec){
                        case '1':
                            nameListService.addEmployee();
                            break;
                        case '2':
                           try{
                               nameListService.showEmployee();
                           }catch (InterruptedException e){
                               //e.printStackTrace();
                               System.out.println(e.getMessage());
                           }
                           break;
                        case '3':
                            System.out.println("请输入需要修改的员工id:");
                            int i=TSUtility.readInt();
                            try{
                                nameListService.modifyEmployee(i);
                            }catch (InterruptedException e){
                                //e.printStackTrace();
                                System.out.println(e.getMessage());
                            }
                            break;
                        case '4':
                            System.out.println("请输入要删除的员工id:");
                            int j=TSUtility.readInt();
                            nameListService.deleteEmployee(j);
                            break;
                        case '5':
                            System.out.println("确认是否退出(Y/N):");
                            char yn=TSUtility.readConfirmSelection();
                            if(yn=='Y'){
                                loopFlagSec=false;
                            }
                            break;
                        default:
                            System.out.println("输入有误,请重新输入");
                            break;
                    }
                }while (loopFlagSec);
                break;
                case '3':
                    manyTeam=teamView.getManyTeam();
                    break;
                case '4':
                    boolean loopFlagThr=true;
                    char keyThr=0;
                    do{
                        System.out.println("--  ~开发项目管理人员菜单~  --");
                        System.out.println("1.   <项目的添加>           *");
                        System.out.println("2.   <项目分配开发团队>      *");
                        System.out.println("3.   <项目的查看>           *");
                        System.out.println("4.   <项目的删除>           *");
                        System.out.println("5.   <退出当前菜单>         *");
                        System.out.println("↓请选择:");
                        keyThr=TSUtility.readMenuSelectionPro();
                        switch (keyThr){
                            case '1':
                                try{
                                    projectService.addProject();
                                }catch (InterruptedException e){
                                   // e.printStackTrace();
                                    System.out.println(e.getMessage());
                                }
                                break;
                            case '2':
                                if(manyTeam==null) {
                                    System.out.println("没有团队");
                                }else {
                                    for (Programmer[] pro : manyTeam) {
                                        projectService.dealingPro(pro);
                                    }
                                }
                            break;

                            case '3':
                            try{
                                projectService.showPor();
                            }catch (InterruptedException e){
                                //e.printStackTrace();
                                System.out.println(e.getMessage());
                            }
                            break;
                            case '4':
                                System.out.println("请输入需要删除的项目id:");
                                int j=TSUtility.readInt();
                                projectService.delPro(j);
                                break;
                                case '5':
                                System.out.println("确认是否退出(Y/N):");
                                char yn=TSUtility.readConfirmSelection();
                                if(yn=='Y'){
                                    loopFlagThr=false;
                                }
                                break;
                            default:
                                System.out.println("输入有误,请重新输入");
                                break;
                        }
                    }while (loopFlagThr);
                    break;
                case '5':
                    System.out.println("确认是否退出(Y/N):");
                    char yn=TSUtility.readConfirmSelection();
                    if(yn=='Y'){
                        loopFlag=false;
                    }
                    break;
                default:
                    break;
            }
        }while(loopFlag);
    }

    public static void main(String[] args) throws TeamException {
        new IndexView().menu();
    }
}


遇到的Bug

1、在写异常时,可以重写异常信息,便于用户的可读性。

 try{
                                projectService.showPor();
                            }catch (InterruptedException e){
                                //e.printStackTrace();
                                System.out.println(e.getMessage());
                            }

2、添加团队数据后,让团队数据和开发人员互通起来,可以用static来共享,但static会出现两个表,所以通过判断empty()方法判断。

private  static ArrayList<Employee> employees = new ArrayList<>();

3、在团队列表显示ID时,发现有一个ID不见了。

4、添加项目时,已添加的项目不能重复添加,项目在开发中,是不能被删除的。

//删除选择的项目
    public void delPro(int id) {
        boolean flag = false;
        //判断项目是否被开发
        boolean s = true;
        for (int i = 0; i < pro.size(); i++) {
            if (pro.get(i).isStatus()) {
                if (pro.get(i).getProId() == id) {
                    s = true;
                } else {
                    pro.remove(i);
                    for (i = id; i <= pro.size(); i++) {
                        pro.get(i - 1).setProId(pro.get(i - 1).getProId() - 1);
                    }
                    flag = true;
                }
            }
        }
        if (s) {
            try {
                throw new TeamException("项目已经被开发,不能被删除");
            } catch (TeamException e) {
                System.out.println(e.getMessage());
            }
        } else {
            if (flag) {
                System.out.println("删除成功");
                count--;
            } else {
                try {
                    throw new TeamException("该项目不存在");
                } catch (TeamException e) {
                    System.out.println(e.getMessage());
                }
            }
        }
    }

这是我所遇到的一些问题,希望大家多多指教,如果需要完整代码,自行下载哦。
下载链接:
链接:https://pan.baidu.com/s/1B7LDGbe4ubq_ypf3k1ycqw
提取码:t5y5
在这里插入图片描述

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值