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


前言

对人员的管理,登录,注册,还有对人员的增删改查等操作。


一、需求

1.功能结构

在这里插入图片描述

2.流程

在这里插入图片描述

3.每个部分的需求

(1)用户注册和登录模块

A.定义一个LoginView类 实现注册方法:如果没有账户则需要注册,如果有账号则直接进行登录
B.实现登录功能:判断用户输入的值是否正确,如果正确则进入软件菜单,如果错误则重新输入,限制次数只有5次,超过次数则程序停止,重新启动
C.实现修改用户密码功能,可以实现对用户名,密码,或者两者都可以进行修改即可。

(2)开发人员管理模块

A.Employee父类,Programmer继承Employee,Designer继承Programmer,Architect继承Designer
B.Employee 包含属性<<interface>>Equipment;包含方法:String getDescription();PC(台式电脑)、NoteBook(笔记本电脑)、Printer(打印机)是他的实现类
C.Employee(雇员)、Programmer(程序员)、Designer(设计师)、Architect(架构师)  
在NameListService类中完成功能操作:
实现员工的添加(根据职业添加(无,程序员,设计师,架构师))
实现员工的修改(至少修改员工的姓名,年龄,工资)
实现员工的删除(注意员工id需要动态显示,也就是删除后,员工id需要更新)
实现员工的查看 (显示所有数据)

(3)开发团队调度管理模块

(4)开发项目管理模块

二、遇到的bug

1.团队信息互通

 这个问题实际就是需要数据进行共享。假如我们在employees前不加static,就表示他不是共享的,在之后的代码中,当我们需要用到employees时,就会只是我们初始化的12个值。
@Override
private static ArrayList<Employee> employees=new ArrayList<>();
int count=1;
    {
    
    //判断是否为空,如果不为空,则为添加之后的值
        if(employees.isEmpty()){
    
    
        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("戴尔", "NEC 17寸")));
        employees.add(new Programmer(++count, "张朝阳 ", 35, 7100, new PC("华硕", "三星 17寸")));
        employees.add(new Designer(++count, "杨致远", 38, 9600,new NoteBook("惠普m6", 5800),3000 ));
    }
}

2.删除动态ID

当我们在删除上述模块中的值时,因为前面有个ID,这个ID是动态变化的,删除了中间的,后面的要补齐之前的。
public void delete(){
    
    
        System.out.println("请输入你要删除员工的ID:");
        int id = TSUtility.readInt();
        boolean b=false;
        for (int i=0;i<employees.size();i++){
    
    
            if (employees.get(i).getId()==id){
    
    
                b = employees.remove(employees.get(i));
                //循环将我们要删除值后面的数补齐
                for (i = id; i <= employees.size(); i++) {
    
    
                //employees.get(i - 1).getId() - 1获取后面值的ID
                //get(i-1)是因为循环是从0开始,而ID是从1开始
                    employees.get(i - 1).setId(employees.get(i - 1).getId() - 1);
                }
            }
        }
        if(b==true){
    
    
            count--;
            System.out.println("删除成功!");
        }else {
    
    
            System.out.println("删除失败!");
        }


    }

3.异常打印

异常打印:e.printStackTrace();这种写法就会导致报错时,是红色;但是我们写出的程序最后是给用户使用;用户看到报红,就会以为程序有错。但只是想提示用户这个只是输入错误!我们就会用到 System.out.println(e.getMessage());
public void a(){
    
    
        try {
    
    
            loginView.login();
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
            //System.out.println(e.getMessage());
        }

4.删除团队前判断是否为空。

有时用户不知道是否有团队就会实施这一步,我们需要给出提示。
System.out.println("请输入想要删除第几个团队");
                    int num = TSUtility.readInt();
                    if(team.isEmpty()){
    
    
                        System.out.println("还未添加团队!请先添加团队!");
                    }else{
    
    
                        if (num<=team.size())
                        {
    
    
                            System.out.print("确认是否删除(Y/N):");
                            char de = TSUtility.readConfirmSelection();
                            if (de == 'Y') {
    
    
                                team.remove(num-1);
                            }else
                            {
    
    
                                System.out.println("请考虑清楚!");
                            }
                        }else {
    
    
                            System.out.println("没有该团队,请正常输入!"+"目前团队只有"+team.size()+"个");
                        }
                    }

5.重写toString

还有做这一步时,需要我们输出值,我们很容易理解的是直接employees.get(i),就会导致是输出我们不易读,因此需要我们将toString()重写。这里也容易忘记。
 public void check(){
    
    
        System.out.println("ID\t"+"姓名\t\t"+"年龄\t"+"工资\t\t"+"职位\t\t"+"状态\t\t"+"奖金\t\t\t"+"股票\t\t"+"领用设备");
        for (int i= 0;i<employees.size();i++){
    
    
            System.out.println(employees.get(i));
        }
    }
// Employee类
@Override
    public String toString() {
    
    
        return id + "\t" + name + "\t" + age + "\t" + salary ;}
//Programmer类
@Override
    public String toString() {
    
    
        return  getId()+"\t"+getName() + "\t"+getAge()+"\t"+getSalary()+"\t"+"程序员"+"\t"+status+"\t\t\t\t\t\t" + equipment ;
    }
//Designer
@Override
    public String toString() {
    
    
        return getId()+"\t"+getName() + "\t"+getAge()+"\t"+getSalary()+"\t"+"设计师"+"\t"+isStatus()+"\t"+bonus+"\t\t\t\t"+getEquipment();
    }
//Architect
@Override
    public String toString() {
    
    
        return getId()+"\t"+getName()+"\t"+getAge()+"\t"+getSalary()+"\t"+"架构师"+"\t"+isStatus()+"\t"+getBonus()+"\t\t"+stock+"\t"+getEquipment();
    }

6.删除成员

删除成员这段代码的思想就是,后面的要覆盖前面的内容。(当时把他用ArrayList直接删除,搞混了)
public void removeMember(int memberId ) throws TeamException{
    
    
        int i =0;
        for (;i<=team.length;i++){
    
    
            if (team[i].getMemberId()==memberId){
    
    
                team[i].setStatus(true);
                break;
            }
        }
       if (i == total)
           throw new TeamException("找不到该成员,无法删除");
       //后面的元素覆盖前面的元素
       for (int j = i + 1; j < total; j++) {
    
    
           team[j - 1] = team[j];
       }
       team[--total] = null;
   }

7.设置变量

还有注意在给账户和密码初始化的时候,如果写成第一行和第二行这种,运行过程中会报空指针异常。
//private String accountName;//注意
//private String password;
private String accountName="";//注意
private String password="";

8.注意

case '4': 后面的需要注意,详情写到下面代码中。
public void c() {
    
    
        listSvc.check();
        boolean flag = true;
        while (flag) {
    
    
            System.out.println("1-团队列表  2-添加团队成员  3-删除团队成员  4-退出  请选择(1-4):");
            char c1 = TSUtility.readMenuSelection();
            switch (c1) {
    
    
                case '1':
                    getTeam();
                    break;
                case '2':
                    addMember();
                    break;
                case '3':
                    deleteMember();
                    break;
                case '4':
                    System.out.println("确认是否退出(Y/N):");
                    char c = TSUtility.readConfirmSelection();
                    if (c == 'Y' || c == 'y') {
    
    
//我们添加团队了之后,如果不在退出后面将我们添加的团队添加到集合。这样会使我们下次再添加时,还是在原来的团队添加,起不到有多个团队的效果。而且一个团队也有人数限制。
                        team.add(teamSvc.getTeam());
            //初始化操作,是将上一个团队的值清空,也一步,也容易忽略
                        teamSvc.clearTeam();
                        flag = false;
                    } else {
    
    
                        break;
                    }
            }
        }
    }
//初始化当前团队成员数组
    public void clearTeam() {
    
    
        team = new Programmer[MAX_MEMBER];
        counter=1;
        total=0;
        this.team = team;
    }

总结

在写代码时,整个代码可能无从下手,但是我们可以一个模块一个模块的写,这样就容易很多。

Guess you like

Origin blog.csdn.net/m0_51064043/article/details/121235314