实践项目1:项目开发团队分配管理软件

 

思维导图:

 

 

 思路:刚拿到这个项目时,没想那么多,就想着由简到难,先把一些容易简单的,可以马上写出来的先写了,后面关乎逻辑性较强的问题再一步步理清。总体思路是创建三个包——domain包(放8个实体类和一个接口)、service包(放对员工的操作类、对团队操作的类、对项目操作的类,再加上一个异常类和工具类)、view包(是主菜单和其子菜单的视图包)。

1、我首先写的是loginView类,这是注册登录的界面,最为独立的类,也比较简单,主要就是接收两个变量(用户名和密码),再判断是否与注册时的用户名和密码相同。再写一个修改方法即可。

代码如下:

public class LoginView {
    //定义成员变量:登录用户与密码
    private String userName = "";
    private String password = "";

    //注册功能
    public void regist() {

        System.out.println("开始注册");
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入你的注册账号名称:");
        String userName = TSUtility.readKeyBoard(4,false);
        this.userName = userName;
        System.out.print("请输入你的注册密码:");
        String password = TSUtility.readKeyBoard(16,false);
        this.password = password;
        System.out.println("注册成功!请登录!");


    }

    //登录功能
    public void login() throws InterruptedException {
        int count = 5;
        boolean flag = true;
        while(flag){
            System.out.println("********************🐱");
            System.out.println("***   <登录界面>   ***");
            System.out.println("***     (:      ***🐱");
            System.out.println("********************🐱");

            System.out.print("请输入你的登录账户名称:");
            String userName = TSUtility.readKeyBoard(4, false);

            System.out.print("请输入你的登录密码:");
            String password = TSUtility.readKeyBoard(16, false);

            //未注册
            if(this.userName.length() == 0 || this.password.length() == 0){
                System.out.println("未检测到您的帐号,请先注册!");
                regist();
            }
            //已注册
            // 正常登录
            else if(this.userName.equals(userName) && this.password.equals(password)){
                TSUtility.loadSpecialEffects();
                System.out.println("登录成功!欢迎您:" + userName);
                flag = false;
            }else{
                if(count <= 1){
                    System.out.println("你已错误5次,即将退出程序...");
                    System.out.println("退出成功!");
                    System.exit(1);
                }else {
                    count--;
                    System.out.println("登录失败!用户名或密码错误!");
                    System.out.println("登录次数还剩" + count + "次");
                    System.out.println("请重新输入:");//flag = true;
                }
            }
        }
    }

    //修改用户信息功能
    public void update(){
        Scanner sc = new Scanner(System.in);
        boolean flag = true;
        while (flag){
            System.out.println("********************🐱");
            System.out.println("***   <修改界面>   ***");
            System.out.println("***     (:      ***🐱");
            System.out.println("********************🐱");

            System.out.println("请输入你需要修改的类型:");
            System.out.println("1(修改用户名)\n2(修改密码)\n3(修改用户名和密码)\n4(不修改,退出)");
            char option = TSUtility.readMenuSelection();
            switch (option){
                case '1':
                    System.out.println("请输入新的用户名:");
                    this.userName = TSUtility.readKeyBoard(4,false);
                    System.out.println("修改成功!");
                    break;
                case '2':
                    System.out.println("请输入新的密码:");
                    this.password = TSUtility.readKeyBoard(16,false);
                    System.out.println("修改成功!");
                    break;
                case '3':
                    System.out.println("请输入新的用户名:");
                    this.userName = TSUtility.readKeyBoard(4,false);
                    System.out.println("请输入新的密码:");
                    this.password = TSUtility.readKeyBoard(16,false);
                    System.out.println("修改成功!");
                    break;
                case '4':
                    System.out.println("退出成功!");
                    return;//结束方法
            }

        }

    }
}

2、其次写一个接口和八个实体类:这个也很简单,根据它需要的属性与行为,写出它的成员变量和成员方法,其构造器和get/set方法根据需要来写即可(建议写上)。

实体类之间的关系:

Employee类代码如下,其余实体类类似:

package com.team.domain;
/*
    雇员
 */
public class Employee {
    private int id;
    private String name;
    private int age;
    private double salary;

    public Employee() {
    }

    public Employee(int id, String name, int age, double salary) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public String getDetails(){
        return id + "\t" + name + "\t" + age + "\t" + salary;
    }

    @Override
    public String toString() {
        return id + "\t" + name + "\t" + age + "\t" + salary;
    }
}

 接口:

package com.team.domain;
/*
    接口
 */
public interface Equipment {
    String getDescription();
}

 

3、接着是根据视频展现写出各个视图界面,可以先写个大概的展示效果框架再去补实具体的实现。然后根据需要实现的功能去写service包里的类(基本上都是增删改查的操作),再在view里调用。当然在操作时又要考虑许多情况,比如给项目分配开发团队时,要考虑到当前有没有项目需要开发、有没有空闲的开发团队等。

如PrectView类如下:

package com.team.view;

import com.team.domain.Architect;
import com.team.domain.Designer;
import com.team.domain.Programmer;
import com.team.domain.Project;
import com.team.service.ProjectService;
import com.team.service.TSUtility;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ProjectView {

    private ProjectService proSvc = new ProjectService();
//    private TeamService teamService = new TeamService();
    private ArrayList<Programmer[]> allTeam = IndexView.getTeamView().getTeamServiceAllTeam();
    private ArrayList<Integer> assignedTeam = new ArrayList<>();//保存已分配的团队编号
    private ArrayList<String> teamNames = new ArrayList<>();//存储所有团队的名称
    ArrayList<Project> projectList = proSvc.getPro();//获取项目
    //开发项目管理主菜单
    public void projectManageMenu() throws InterruptedException {
        while (true){
            System.out.println("            ~开发项目管理主菜单~     ");
            System.out.println("  1.         <项目的添加>");
            System.out.println("  2.         <项目分配开发团队>      ");
            System.out.println("  3.         <项目的查看>");
            System.out.println("  4.         <项目的删除>");
            System.out.println(" 请选择:");
            Scanner sc = new Scanner(System.in);
            char s = TSUtility.readMenuSelection();
            switch(s){
                case '1':
                   addProView();
                   break;
                case '2':
                    dealingProView();
                    break;
                case '3':
                    showProView();
                    break;
                case '4':
                    delProView();
                    break;
                case '5':
                    System.out.print("确认是否退出(Y/N):");
                    char c = TSUtility.readConfirmSelection();
                    if(c == 'Y') {
                        return;//退出该方法
                    }
                    break;
            }
        }
    }

    //项目添加界面
    private void addProView() throws InterruptedException {
        System.out.println("项目参考:---------------------------------------------");
        System.out.println("1.小米官网:开发完成类似于小米官网的web项目。\n" +
                "2.公益在线商城:猫宁Morning公益商城是中国公益性在线电子商城。\n" +
                "3.博客系统:Java博客系统,让每一个有故事的人更好的表达想法!\n" +
                "4.在线协作文档编辑系统:一个很常用的功能,适合小组内的文档编辑。");
        System.out.println("-------------------------------------------------------");
        TSUtility.readReturn();
        proSvc.addProject();

    }

    //项目分配开发团队界面
    private void dealingProView(){
        if(proSvc.getPro().size() == 0) {
            System.out.println("没有项目,请先添加项目!");
            return;
        }
        if(!proSvc.isNotDeveloped()){
            System.out.println("没有未被开发的项目,请先添加项目!");
            return;
        }
        if(allTeam.size() == assignedTeam.size()){
            System.out.println("没有可分配的空闲团队,请先添加团队!");
            return;
        }
        for(int i = 0; i<allTeam.size(); i++){

            if(assignedTeam.contains(i)){//判断i团队是否已被安排
                continue;
            }
            System.out.println("当前团队有人员:");
            for(Programmer p : allTeam.get(i)){
                if(p instanceof Architect){
                    Architect a = (Architect) p;
                    System.out.println(a + "\t架构师\t" + a.getStatus() + "\t" + a.getBonus() + "\t" + a.getStock() + "\t" + a.getEquipment().getDescription());
                }else if(p instanceof Designer){
                    Designer d = (Designer) p;
                    System.out.println(d + "\t设计师\t" + d.getStatus() + "\t" + d.getBonus() + "\t\t\t" + d.getEquipment().getDescription());
                }else{
                    System.out.println(p + "\t程序员\t" + p.getStatus() + "\t\t\t\t\t" + p.getEquipment().getDescription());
                }
            }
            System.out.println("请为当前团队创建一个团队名称:");
            String name = TSUtility.readKeyBoard(10,false);
            teamNames.add(name);
           
        }
        while(true){
            Random r = new Random();
            int index = r.nextInt(allTeam.size());
            if(assignedTeam.contains(index)){
                continue;
            }
            //随机分配团队
            if(proSvc.dealingPro(allTeam.get(index),teamNames.get(index))){
                assignedTeam.add(index);
            }else{
                return;
            }
            if(assignedTeam.size() == allTeam.size()){
                return;
            }
        }

    }


    //项目查看界面
    private void showProView() throws InterruptedException {
        TSUtility.loadSpecialEffects();
        if(projectList.size() == 0){
            System.out.println("当前还没有项目,请先添加!");
            return;
        }
        for(Project p : projectList){
            if(p.isStatus()){
                System.out.println("项目【" + p.getProjectName() + "】---->正在被团队【" + p.getTeamName()+"】开发中!");
            }else {
                System.out.println(p.toString());
                System.out.println("项目【" + p.getProjectName() + "】---->未被开发!");
            }
        }
    }

    //项目删除界面
    private void delProView() throws InterruptedException {
        TSUtility.loadSpecialEffects();
        for(Project p : projectList){
            System.out.println(p);
        }
        System.out.print("请输入需要删除的项目号=");
        int proId = TSUtility.readInt();
        if(proId < 1 || proId > projectList.size()){
            System.out.println("你输入的项目号有误,删除失败!");
            return;
        }
        if(projectList.get(proId-1).isStatus()){
            System.out.println("该项目正在开发中,删除失败!");
            return;
        }
        proSvc.delPro(proId);
        System.out.println("删除成功!");
    }
}

ProjectService类:

package com.team.service;

import com.team.domain.Programmer;
import com.team.domain.Project;

import java.util.ArrayList;

public class ProjectService {
    private ArrayList<Project> pro = new ArrayList<>();//存放项目
    private int count = 1;//添加项目的标号


    //添加新项目的方法
    public void addProject() throws InterruptedException {
        System.out.print("请输入要添加的项目名称:");
        String proName = TSUtility.readKeyBoard(15, false);
        if(pro.size() > 0){
            for (int i = 0; i < pro.size(); i++) {
                if (pro.get(i).getProjectName().equals(proName)) {
                    System.out.println("该项目已存在!");
                    break;
                }
            }
        }
        System.out.print("请输入项目描述:");
        String desName = TSUtility.readKeyBoard(30, false);

        Project project = new Project(count, proName, desName, null, null, false);
        pro.add(project);
        TSUtility.loadSpecialEffects();
        System.out.println("已添加项目:" + project.getProjectName());
        count++;

    }

    //给项目分配团队
    public boolean dealingPro(Programmer[] team,String teamName){
        for(Project p:pro){
            if(!p.isStatus()) {//false:未被开发;true:已被开发
                p.setTeam(team);//分配团队
                p.setTeamName(teamName);
                p.setStatus(true);
                return true;
            }
        }
        return false;
    }

    //获取所有项目
    public ArrayList<Project> getPro() {
        return pro;
    }

    //删除项目
    public void delPro(int proId){
        pro.remove(proId - 1);
        //往后的项目ID等于原ID减一
        for(int i = proId; i<pro.size(); i++){
            pro.get(i - 1).setProId(pro.get(i-1).getProId()-1);
        }
        count--;
    }

    //判断是否有未被开发的项目(true有,false无)
    public boolean isNotDeveloped(){
        for(Project p:pro){
            if(!p.isStatus()){
                return true;
            }
        }
        return false;
    }
}

团队和人员的管理也类似,到这里项目就差不多完成了,其间我遇到了一个很重要的问题——传参问题!我前面明明已经对团队进行了操作(添加了团队)但在ProjectView里用到allTeam时,它却是空的集合!!!

这是我自己按照往常惯例写的,但却忽略了用new创建一个对象时,它会对其类进行重新加载! 

private TeamService teamService = new TeamService();
private ArrayList<Programmer[]> allTeam = teamService.getAllTeam();

 我同学帮忙改的:

//private TeamService teamService = new TeamService();
private ArrayList<Programmer[]> allTeam = IndexView.getTeamView().getTeamServiceAllTeam();

他在IndexView类中写了一个静态的TeamView型的getTeam View()方法,并在TeamView 类里写了一个getTeamServiceAllTeam()方法,返回的是所有团队,这样团队会随着IndexView的加载而加载,而且没用上new方法就不会出现清空。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值