实践项目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
    评论
### 回答1: 软件项目管理是指对软件项目进行规划、组织、执行和控制的过程。在软件开发过程中,管理项目的成功与否直接影响项目的质量、进度和成本。下面将从项目计划、项目执行和项目控制三个方面进行介绍。 首先,在项目计划阶段,需要制定详细的项目计划,包括项目目标、工作分解结构(WBS)、进度计划、质量计划、风险管理计划等。项目团队需要明确项目范围和需求,并合理安排资源,确定项目的时间、成本和质量目标。在项目计划中还应制定风险管理策略,识别和评估可能的风险,并制定应对措施,以确保项目顺利推进。 其次,在项目执行阶段,需要根据项目计划的安排,组织团队成员进行具体的开发工作。项目经理需要协调团队成员之间的合作,及时解决困难和冲突,确保项目按时交付。同时,项目管理软件的使用也可以提高团队的效率和协作能力。在项目执行过程中,还需要定期汇报项目进展情况,及时调整计划,以适应项目的变化。 最后,在项目控制阶段,需要对项目的执行进行监控和控制,确保项目进度和质量符合预期。项目经理需要根据项目计划制定的指标进行监测,及时发现和解决问题,以保证项目的成功实施。同时,应对项目变更进行管理,避免因变更而引起的问题。项目控制的目标是使项目达到预定的目标,并满足客户的需求。 综上所述,软件项目管理是一项复杂而重要的工作。通过合理的项目计划、有效的项目执行和严格的项目控制,可以提高项目的成功率,确保项目按时交付、符合质量要求,并实现预期的商业价值。 ### 回答2: 软件项目管理是指在一定时间范围内,按照特定的目标、范围、预算和资源,组织和协调各种活动,并进行监督和控制,以实现软件项目的目标和交付可接受的成果。软件项目管理大作业主要是针对软件项目管理的实践进行深入研究和实践。 在软件项目管理大作业中,首先需要确定合适的软件项目管理方法和工具。常用的管理方法包括敏捷开发、瀑布模型、迭代开发等,而管理工具可以是项目管理软件、版本控制工具、需求管理工具等。根据具体项目的需求和特点,选择合适的方法和工具,并进行详细的规划和预测。 其次,在软件项目管理大作业中,需进行项目团队组建和角色分配。根据项目的规模和需求,确定项目经理、开发人员、测试人员、需求分析人员等团队成员,并明确各自的职责和工作内容。此外,还要建立有效的团队协作机制,加强团队沟通和合作能力,并划定项目成员之间的权限和责任。 另外,在软件项目管理大作业中,需要制定项目执行计划和时间表。通过项目执行计划,明确项目的里程碑、工作进度和交付时间,并根据情况进行合理的人力资源调配和进度控制。同时,要建立有效的风险管理和问题解决机制,及时应对项目中出现的问题和挑战。 最后,软件项目管理大作业中,要进行项目的监督和控制。通过制定合理的项目监控措施和指标,对项目的实施情况进行评估和监测,并及时采取相应的措施进行调整和改进。同时,还要进行项目的风险评估和质量管理,确保项目的顺利进行和达到预期的结果。 总而言之,软件项目管理大作业要求全面综合地运用软件项目管理的理论和方法,进行实践和研究,以提高软件项目管理的能力和水平,确保项目的成功完成。 ### 回答3: project软件项目管理大作业是一个综合性的课程项目,旨在提供学生在软件项目管理方面的实践经验和技能培养。这个大作业通常包括以下几个主要方面。 首先,项目选题。在开始大作业之前,我们需要选择一个软件项目作为研究对象。这个项目可以是一个真实的商业项目,也可以是一个虚拟的项目。通过选择合适的项目,我们可以更好地理解软件项目管理中的挑战和技术。 其次,项目计划。在项目选题确定后,我们需要进行项目计划。这包括确定项目的目标、范围、时间表和资源需求等。同时,我们还需要制定相应的风险管理计划和沟通计划,确保项目能够有效地进行并达到预期的目标。 接下来,项目执行。在项目执行阶段,我们需要按照项目计划执行各项工作任务。这可能涉及软件开发、测试、质量控制等方面的工作。同时,我们还需要对项目进展进行监控和评估,及时调整和处理可能出现的问题与风险。 最后,项目总结和报告。在项目完成后,我们需要进行总结和报告,总结项目的成果和经验,并对项目管理过程进行评估与反思。这有助于我们从项目中吸取经验教训,提高自身的软件项目管理能力。 通过完成project软件项目管理大作业,我们能够更好地理解并应用软件项目管理的理论和方法,提高团队协作和沟通的能力,同时也培养了我们的问题解决和决策能力。这对于我们未来从事软件项目管理工作或相关领域的发展都具有重要意义。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值