项目开发团队分配管理软件
前言
当一个公司要制作一个大项目,就需要通过人员来调度实现人员的分配管理,去创建团队来为公司做项目,这时,就需要这样一个软件来实现,这个项目是对去我们之前所学知识的一个总和,让我们把所学知识运用起来并熟练掌握,需要用到面向对象的封装、继承、多态,以及数组和结合,还要熟悉使用接口和异常。在做的过程中也是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类的设计
说明:
在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();
}
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){
System.out.println(e.getMessage());
}
break;
case '2':
try{
nameListService.showEmployee();
}catch (InterruptedException e){
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){
System.out.println(e.getMessage());
}
break;
case '3':
System.out.println("请输入需要修改的员工id:");
int i=TSUtility.readInt();
try{
nameListService.modifyEmployee(i);
}catch (InterruptedException e){
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){
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){
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){
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
|