项目目标
本次小实践的目标是实现一个简单的《项目开发团队分配管理系统》。
主要涉及的知识点有:
1、类的继承与多态
2、方法的参数传递、接口的实现
3、异常的抛出与处理
4、java的基本语法及执行流程控制
5、数组和ArrayList集合在数据存储中的使用
效果演示
项目效果演示
需求说明(功能描述)
1、项目启动时首先进入的是用户登录界面,提醒用户进行登录,同时实现账号注册功能。
2、登录成功后,进入系统主菜单,要实现的主要功能有:
(1)用户信息修改
(2)开发人员管理
(3)开发团队管理
(4)开发团队管理
(5)退出系统
用户登录后可以根据自己的需求选择相应的功能模块,系统根据用户交实现不同的功能。
功能结构
项目结构
view模块:
主控制模块,主要负责菜单的显示以及用户交互,处理用户操作。
service模块:
实体对象的管理管理操作类,实体对象包含员工类Employee以及其子类(程序员、设计师等)。
NameListService和TeamService类分别用于管理公司员工以及开发团队的成员对象。
domain模块:
这里放的是程序中用到的所有java实体类,包含员工类及其子类,以及各种实体类。每一个类中都封装了实体的属性及其访问方法和构造函数,供外部使用,可以根据需求增加内容。
项目实现
1、用户登录注册模块与用户信息修改
//给定属性:登录用户和密码
private String userName = "a";
private String password = "1"; //这里初始值都为空,为了方便项目测试可以设置为简单值
public void regist() throws InterruptedException {
System.out.println("开始注册:");
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的注册账户名称:");
String userName = TSUtility.readKeyBoard(4, false);
this.userName = userName;
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("********************🐱");
System.out.println("*** <登录界面> ***");
System.out.println("*** (-。-) ***🐱");
System.out.println("********************🐱");
System.out.println("请输入你的登录账户名称:");
String userName = TSUtility.readKeyBoard(4, false); //TSUtility为工具类,封装了诸多获取输入的方法以供调用
System.out.println("请输入你的登录密码:");
String password = TSUtility.readKeyBoard(8, false);
//未注册
if (this.userName.length() == 0 || this.password.length() == 0) {
System.out.println("未检测到您的账号,请您先注册!");
regist();
}
//已注册
//正常登录
else if (this.userName.equals(userName) && this.password.equals(password)) {
System.out.println("登陆成功!欢迎您:" + userName);
flag = false;
} else {
if (count <= 0) {
System.out.println("登录次数不足!退出!");
return;
} else {
count--;
System.out.println("登录失败!用户名或密码不匹配!");
System.out.println("登录次数还剩" + count + "次,请重新输入:");
}
}
}
}
//修改功能
public void update() throws InterruptedException {
boolean flag = true;
while (flag) {
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(不修改,退出)");
Scanner sc = new Scanner(System.in);
String options = sc.next();
if (options.equals("1")) {
System.out.println("请输入你的修改的账户名称:");
String userName = TSUtility.readKeyBoard(4, false);
this.userName = userName;
System.out.println("修改成功!");
} else if (options.equals("2")) {
System.out.println("请输入你的修改密码:");
String password = TSUtility.readKeyBoard(8, false);
this.password = password;
System.out.println("修改成功!");
} else if (options.equals("3")) {
System.out.println("请输入你的修改的账户名称:");
String userName = TSUtility.readKeyBoard(4, false);
this.userName = userName;
System.out.println("请输入你的修改密码:");
String password = TSUtility.readKeyBoard(8, false);
this.password = password;
System.out.println("修改成功!");
}
else if (options.equals("4")) {
System.out.println("退出中...");
flag = false;
}
else {
System.out.println("输入错误!请输入“1”或者“2”或者“3”或者“4”:");
}
}
}
2、开发人员管理
类的设计
功能操作在NameListService中完成。
实现员工的添加、修改、删除(id更新)以及查看。
3、开发团队调度管理
包含以下功能
其中,团队成员管理可以实现团队成员的查看添加删除等功能
TeamView类
/*
开发团队调度管理模块
*/
public class TeamView {
private NameListService listSvc = new NameListService();
private TeamService TeamSvc = new TeamService();
TeamService t; //团队服务操作对象
// 团队管理主界面及控制方法
public void TeamControl() {
boolean teamFlag1 = true;
char teamChoose1 = 0;
do {
System.out.print(ANSI_RESET + ANSI_YELLOW); //格式化输出 字体颜色
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("⬇ 请选择:(1-5) ");
teamChoose1 = TSUtility.readMenuSelectionPro();
switch (teamChoose1) {
case '1':
TeamSvc.teamList(); //查看团队
// this.enterMainMenu();
break;
case '2':
TeamSvc.teamAdd();
break;
case '3':
TeamSvc.teamDelete();
break;
case '4':
this.enterMainMenu(); //进入团队成员管理
break;
case '5':
System.out.print("确认是否退出(Y/N):");
char yn = TSUtility.readConfirmSelection();
if (yn == 'Y') {
teamFlag1 = false;
}
break;
default:
System.out.println("输入有误!请重新输入!");
break;
}
} while (teamFlag1);
}
/*
团队成员管理主界面显示及控制方法
*/
public void enterMainMenu() {
if (TeamSvc.teams.size() == 0){ //无团队无法进行成员管理
System.out.println("当前没有团队信息,请先添加团队!");
return;
}
TeamSvc.teamList();
System.out.println("请输入你要进行操作的团队id:");
int id = -1;
do{
id = TSUtility.readTeamId();
if (id > TeamSvc.teams.size()){
System.out.println("输入id大于当前团队数,请重新输入:");
}else{
break;
}
}while(true);
int index = id-1;
t = TeamSvc.teamServices.get(index); //获取团队对象的操作对象
boolean teamFlag2 = true;
char teamChoose2 = 0;
do {
System.out.print(ANSI_RESET + ANSI_YELLOW);
System.out.println("🔣 ~团队成员管理主菜单~ 🔣");
System.out.println("🐕 1. <查看团队成员> *");
System.out.println("🐖 2. <添加团队成员> *");
System.out.println("🐱 3. <删除团队成员> *");
System.out.println("🐂 4. <退出> *");
System.out.println("⬇ 请选择:(1-4) ");
teamChoose2 = TSUtility.readMenuSelection();
switch (teamChoose2) {
case '1':
this.getTeam();
break;
case '2':
this.addMember();
break;
case '3':
deleteMember();
break;
case '4':
System.out.print("确认是否退出(Y/N):");
char yn = TSUtility.readConfirmSelection();
if (yn == 'Y') {
teamFlag2 = false;
}
break;
default:
System.out.println("输入有误!请重新输入!");
break;
}
}while (teamFlag2);
}
// 以表格形式列出公司所有成员
private void listAllEmployees() throws InterruptedException {
listSvc.showEmployee();
}
// 显示团队成员列表操作
public void getTeam() {
System.out.println("🐕-------------<团队成员列表>-------------🐕");
try {
Programmer[] team = t.getTeam(); //获取团队成员数组
if (team.length == 0) {
System.out.println("暂无团队成员,请先添加!");
} else {
System.out.println("TID/ID\t 姓名\t年龄\t 工资\t 职位\t 状态\t 奖金\t 股票\t 领用设备");
for (Programmer teamNum : team) { //遍历输出
System.out.println(teamNum.getMemberId() + "/" + teamNum);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 实现添加成员操作
private void addMember() {
try {
listAllEmployees(); //显示员工列表
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("请输入要添加的员工id:");
int id = TSUtility.readInt();
try {
Employee addEl = listSvc.getEmployee(id); //获取id对象
t.addMember(addEl);
System.out.println("添加成功!");
} catch (TeamException e) {
System.out.println(e.getMessage() + "\n");
}
}
// 实现删除成员操作
private void deleteMember() {
try {
Programmer[] team = t.getTeam(); //获取团队成员数组
if (team.length==0){
System.out.println("暂无团队成员,请先添加!");
return;
}
System.out.println("TID/ID\t 姓名\t年龄\t 工资\t 职位\t 状态\t 奖金\t 股票\t 领用设备");
for (Programmer teamNum : team) { //遍历输出
System.out.println(teamNum.getMemberId() + "/" + teamNum);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("请输入需要删除的团队成员id:");
int i = TSUtility.readInt();
try {
t.removeMember(i);
System.out.println("删除成功!");
} catch (TeamException e) {
e.printStackTrace();
}
}
}
TeamService类
public class TeamService {
//用于自动生成团队成员的member
private static int counter = 1;
//团队人数上限
private final int MAX_MEMBER = 5;
//保存当前团队成员
private Programmer[] team = new Programmer[MAX_MEMBER];
//团队实际人数
private int total = 0;
/*
团队管理添加内容
*/
private static int teamCounter = 1; //团队id
private static int teamTotal = 0; //实际团队数
public static ArrayList<Team> teams = new ArrayList<Team>(); //团队集合
public static ArrayList<TeamService> teamServices = new ArrayList<TeamService>(); //团队服务对象集合
public int getTotal() {
return total;
}
/*
查看团队列表方法
*/
public static void teamList() {
System.out.println("🐕-------------<团队列表>-------------🐕");
if (teamTotal == 0) {
System.out.println("暂无团队,请先添加团队!");
} else {
System.out.println("当前团队数:" + teamServices.size());
for (int i = 0; i < teamTotal; i++) {
System.out.println(teams.get(i).toString() +
",团队成员:" + teamServices.get(i).total + "/5" + ",开发项目:" + teams.get(i).getJobProject());
if (teamServices.get(i).total != 0) {
System.out.println("ID\t 姓名\t年龄\t 工资\t 职位\t 状态\t 奖金\t 股票\t 领用设备");
for (Programmer p : teamServices.get(i).team) {
if ((p != null))
System.out.println(p.toString());
else break;
}
}
}
}
}
/*
添加团队方法
*/
public void teamAdd() {
if (teamTotal >= 5) {
System.out.println("当前团队已经达到上限5个,不可再添加!");
return; //结束方法调用
}
String teamName = "";
w1:
while (true) {
teamName = TSUtility.readTeamName(6);
if (teamTotal > 0) {
for (int i = 0; i < teamTotal; i++) {
if (teams.get(i).getTeamName().equals(teamName)) {
System.out.println("团队名已存在,请重新输入");
break;
}
if (i == teamTotal - 1) {
break w1;
}
}
} else {
break;
}
}
Team t = new Team(teamCounter, teamName);
teams.add(t);//添加元素到arraylist集合
TeamService ts = new TeamService(); //给每一个团队建一个teemService对象
teamServices.add(ts);
teamCounter++;
teamTotal++;
System.out.println("团队添加成功!");
}
/*
删除团队方法 删除ArrayList中指定下标的元素
*/
public void teamDelete() {
if (teamTotal == 0) {
System.out.println("当前无团队,无法进行删除操作!");
} else {
System.out.println("请输入要删除的团队id:");
int id = TSUtility.readTeamId() - 1;
//删除团队时 先将团队成员状态设为true
int l = teamServices.get(id).total; //获取实际团队人数
Programmer[] team1 = teamServices.get(id).team; //数组中含null
if (l != 0) {
System.out.println("删除团队成员信息如下:");
System.out.println("ID\t 姓名\t年龄\t 工资\t 职位\t 状态\t 奖金\t 股票\t 领用设备");
for (Programmer p : team1) {
if (p != null) {
p.setStatus(true);
System.out.println(p.toString());
} else {
break;
}
}
}
//删除团队时,将正在被此团队开发的项目开发状态 置false,开发团队名称置null
Team teamDelete = teams.get(id);
String delTeamName = teamDelete.getTeamName(); //获取删除的团队名
ArrayList<Project> allPro = ProjectService.getAllPro(); //获取所有项目
if (allPro.size() != 0) {
System.out.println("当前项目数 = " + allPro.size());
for (int i = 0; i < allPro.size(); i++) {
Project project = allPro.get(i);
String pName = project.getTeamName(); //获取项目开发团队名称
if (delTeamName.equals(pName)) {
project.setTeamName(null);
project.setStatus(false);
}
}
}
teams.remove(id);
teamServices.remove(id); //删除对应的服务对象
for (int i = 0; i < teamTotal - 1; i++) { //重新对团队进行编号
int j = teams.get(i).getTeamId();
if (j > id) {
teams.get(i).setTeamId(j - 1);
}
}
teamTotal--;
teamCounter--;
// counter = counter-l; //队内编号
System.out.println("团队删除成功!");
}
}
// -------------------------------------------------------------------------------
public TeamService() {
}
//返回team中所有程序员构成的数组
public Programmer[] getTeam() {
Programmer[] team = new Programmer[total];
for (int i = 0; i < total; i++) {
team[i] = this.team[i];
}
return team;
}
//初始化当前团队成员数组
public void clearTeam() { //置空团队成员
team = new Programmer[MAX_MEMBER];
counter = 1;
total = 0;
this.team = team;
}
//增加团队成员
public void addMember(Employee e) throws TeamException {
if (total >= MAX_MEMBER) {
throw new TeamException("添加失败,原因:成员已满,无法添加");
}
if (!(e instanceof Programmer)) {
throw new TeamException("添加失败,原因:该成员不是开发人员,无法添加");
}
Programmer p = (Programmer) e;
if (isExist(p)) {
throw new TeamException("添加失败,原因:该员工已在本团队中");
}
if (!p.getStatus()) {
throw new TeamException("添加失败,原因:该员工已是某团队成员");
}
int numOfArch = 0, numOfDsgn = 0, numOfPrg = 0;
for (int i = 0; i < total; i++) {
if (team[i] instanceof Architect) {
numOfArch++;
} else if (team[i] instanceof Designer) {
numOfDsgn++;
} else if (team[i] instanceof Programmer) {
numOfPrg++;
}
}
if (p instanceof Architect) {
if (numOfArch >= 1) {
throw new TeamException("团队中至多只能有一名架构师");
}
} else if (p instanceof Designer) {
if (numOfDsgn >= 2) {
throw new TeamException("团队中至多只能有两名设计师");
}
} else if (p instanceof Programmer) {
if (numOfPrg >= 3) {
throw new TeamException("团队中至多只能有三名程序员");
}
}
//添加到数组
p.setStatus(false);
p.setMemberId(counter++);
team[total++] = p;
}
//判断成员是否已在团队
public boolean isExist(Programmer p) {
for (int i = 0; i < total; i++) {
if (team[i].getId() == p.getId()) return true;
}
return false;
}
//删除指定memberId的程序员(团队内操作)
public void removeMember(int memberId) throws TeamException {
int n = 0;
//找到指定memberId的员工,并删除
for (; n < total; n++) {
if (team[n].getMemberId() == memberId) {
team[n].setStatus(true);
for (int i = 0; i < total; i++) { //团队内id递补
int memberId1 = team[i].getMemberId();
if (memberId1 > memberId) {
team[i].setMemberId(memberId1 - 1);
}
}
break;
}
}
//如果遍历一遍,都找不到,则报异常
if (n == total)
throw new TeamException("找不到该成员,无法删除");
//后面的元素覆盖前面的元素
for (int i = n + 1; i < total; i++) {
team[i - 1] = team[i];
}
team[--total] = null;
}
}
4、开发项目管理
实现开发项目添加、删除、查看以及分配给开发团队(包含指定/随机分配)。
项目添加
项目查看
项目分配开发团队 (随机分配)
ProjectService类
public class ProjectService {
private static ArrayList<Project> pro = new ArrayList<>(); //存放项目的集合
private int count = 1; //项目编号
private TeamView TV = new TeamView();
//添加项目检测功能 项目是否重复
public boolean checkProject(Project p) {
boolean result = false;
ArrayList<Project> allPro = getAllPro();
for (Project project : allPro) {
if (project.getProjectName().equals(p.getProjectName())) {
System.out.println("项目已存在,请不要重复添加同一项目!");
result = true;
}
}
return result;
}
//添加项目
public void addProject() throws InterruptedException {
System.out.println("项目参考:--------------------------------------------------");
System.out.println("1.小米官网:开发完成类似于小米官网的web项目.");
System.out.println("2.公益在线商城:猫宁Morning公益商城是中国公益性在线电子商城.");
System.out.println("3.博客系统:Java博客系统,让每一个有故事的人更好的表达想法!");
System.out.println("4.在线协作文档编辑系统:一个很常用的功能,适合小组内的文档编辑。");
System.out.println("------------------------------------------------------------");
// TSUtility.readReturn(); //回车键继续
System.out.println("请输入你想添加的项目名:(项目编号) ");
char c = TSUtility.readMenuSelection();
switch (c) {
case '1':
Project p1 = new Project();
p1.setProId(count++);
p1.setProjectName("小米官网");
p1.setDesName("开发完成类似于小米官网的web项目.");
if (checkProject(p1) == false) {
pro.add(p1);
// TSUtility.loadSpecialEffects(); //进度加载条
System.out.println("已添加项目:" + p1.getProjectName());
}
break;
case '2':
Project p2 = new Project();
p2.setProId(count++);
p2.setProjectName("公益在线商城");
p2.setDesName("猫宁Morning公益商城是中国公益性在线电子商城.");
if (checkProject(p2) == false) {
pro.add(p2);
// TSUtility.loadSpecialEffects(); //进度加载条
System.out.println("已添加项目:" + p2.getProjectName());
}
break;
case '3':
Project p3 = new Project();
p3.setProId(count++);
p3.setProjectName("博客系统");
p3.setDesName("Java博客系统,让每一个有故事的人更好的表达想法!");
if (checkProject(p3) == false) {
pro.add(p3);
// TSUtility.loadSpecialEffects(); //进度加载条
System.out.println("已添加项目:" + p3.getProjectName());
}
break;
case '4':
Project p4 = new Project();
p4.setProId(count++);
p4.setProjectName("在线协作文档编辑系统");
p4.setDesName("一个很常用的功能,适合小组内的文档编辑。");
if (checkProject(p4) == false) {
pro.add(p4);
// TSUtility.loadSpecialEffects(); //进度加载条
System.out.println("已添加项目:" + p4.getProjectName());
}
break;
default:
System.out.println("项目不存在");
break;
}
}
//给项目分配团队(指定分配)
public void dealingPro(int id, int id2) {
Project project = pro.get(id); //获取当前待分配项目
Team team = teams.get(id2); //获取分配团队名称
project.setTeamName(team.getTeamName());
Programmer[] p = teamServices.get(id2).getTeam(); //获取开发团队
project.setTeam(p);
project.setStatus(true);
pro.set(id, project); //修改项目集合ArrayList中对应索引项目的值
System.out.println("分配成功!项目指定给了团队<" + team.getTeamName() + ">开发");
//设置当前分配的开发团队正在开发此项目
team.setJobProject(project.getProjectName());
// System.out.println("该开发团队成员如下:");
// for (Programmer p1 :p){
// System.out.println(p1.getName());
// }
}
//给项目分配团队(随机分配)
public void dealingPro(int id) { //传入待分配项目id
Project project = pro.get(id); //获取当前待分配项目
Random r = new Random();
int id2 = r.nextInt(teamServices.size());
Team team = teams.get(id2); //获取分配团队名称
int n = -1;
do {
n = TeamService.teamServices.get(id2).getTotal();
System.out.println("当前分配团队人数:" + n);
if (n == 0) {
System.out.println("Id为" + (id2 + 1) + "的团队没有开发成员,请先添加开人员!");
TV.enterMainMenu();
} else {
break;
}
} while (true);
project.setTeamName(team.getTeamName());
Programmer[] p = teamServices.get(id2).getTeam(); //获取开发团队
project.setTeam(p); //将开发团队存储到项目信息中
project.setStatus(true);
pro.set(id, project); //修改项目集合ArrayList中对应索引项目的值
System.out.println("分配成功!项目随机分配给了团队<" + team.getTeamName() + ">开发");
//设置当前分配的开发团队正在开发此项目
team.setJobProject(project.getProjectName());
//随机获取项目
// Random r = new Random();
// int proNum = r.nextInt(pro.size()); //获取不大于项目数的随机数proNum
// Project project = this.pro.get(proNum); //随机获取一个项目
}
//查看目前项目情况
public void showPro() throws InterruptedException {
// TSUtility.loadSpecialEffects();
System.out.println("🐕-------------<项目列表>-------------🐕");
if (pro.size() == 0) {
System.out.println("暂无项目,请先添加项目!");
} else {
for (int i = 0; i < pro.size(); i++) {
System.out.println(pro.get(i));
if (pro.get(i).getStatus() == true) {
System.out.println("项目<" + pro.get(i).getProjectName() + ">------>正在被团队<" + pro.get(i).getTeamName() + ">开发");
} else {
System.out.println("项目<" + pro.get(i).getProjectName() + ">------>未开发");
}
}
}
}
//删除选择的项目
public void delPro(int id) {
String projectTeamName = pro.get(id).getTeamName(); //获取即将删除的项目开发团队名称
if (projectTeamName != null) { //项目开发团队不为null时进入
//遍历团队,将在开发此即将删除项目的团队 的开发项目置null
for (Team team : teams) {
if (team.getTeamName().equals(projectTeamName)) { //找到正在开发此项目的团队
team.setJobProject(null); //将开发项目设置为null
}
}
}
boolean flag = false;
for (int i = 0; i < pro.size(); i++) {
if (pro.get(i).getProId() == id) {
pro.remove(i);
for (i = id; i <= pro.size(); i++) {
pro.get(i - 1).setProId(pro.get(i - 1).getProId() - 1);
}
flag = true;
}
}
if (flag) {
System.out.println("删除成功!");
count--;
} else {
try {
throw new TeamException("该项目不存在");
} catch (TeamException e) {
e.printStackTrace();
}
}
}
//得到所有项目数据集合
public static ArrayList<Project> getAllPro() {
return pro;
}
}
IndexView主界面类
public class IndexView {
/**
* 颜色特效
*/
public static final String ANSI_RESET = "\u001B[0m";
public static final String ANSI_GREEN = "\u001B[32m";
public static final String ANSI_YELLOW = "\u001B[33m";
public static final String ANSI_PURPLE = "\u001B[35m";
public static final String ANSI_BLUE = "\u001B[34m";
public static final String ANSI_CYAN = "\u001B[36m";
private LoginView loginVi = new LoginView();
private NameListService nameListSer = new NameListService();
private TeamView teamVi = new TeamView();
private ProjectService projectSer = new ProjectService();
private ArrayList<Team> manyTeam = null;
public void menu() throws InterruptedException {
boolean loopFlag = true;
char key = 0;
System.out.println(ANSI_PURPLE);
System.out.println("🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣");
System.out.println("🔣 🔣");
System.out.println("🔣 欢迎来到项目开发团队分配管理软件 🔣");
System.out.println("🔣 🔣");
System.out.println("🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣🔣");
System.out.println(" 🐕");
System.out.println(" 🐕");
System.out.println(" 🐕");
System.out.println(" 🐕");
System.out.println(" 🐕");
System.out.println("🐕-----------<请您先进行登录>-------------🐕");
TSUtility.readReturn();
try {
loginVi.login();
} catch (InterruptedException e) {
e.printStackTrace();
}
do {
System.out.println(ANSI_RESET + ANSI_CYAN);
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("⬇ 请选择:(1-5) ");
System.out.print(ANSI_RESET);
key = TSUtility.readMenuSelectionPro();
switch (key) {
case '1':
try {
loginVi.update();
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
case '2':
try {
nameListSer.showEmployee();
} catch (InterruptedException e) {
e.printStackTrace();
}
boolean loopFlagSec = true;
char keySec = 0;
do {
System.out.print(ANSI_RESET + ANSI_YELLOW);
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("⬇ 请选择:(1-5) ");
keySec = TSUtility.readMenuSelectionPro();
switch (keySec) {
case '1':
try {
nameListSer.addEmployee();
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
case '2':
try {
nameListSer.showEmployee();
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
case '3':
System.out.println("请输入需要修改的员工id:");
int i = TSUtility.readInt();
try {
nameListSer.modifyEmployee(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
case '4':
System.out.println("请输入需要删除的员工id:");
int j = TSUtility.readInt();
nameListSer.delEmployee(j);
break;
case '5':
System.out.print("确认是否退出(Y/N):");
char yn = TSUtility.readConfirmSelection();
if (yn == 'Y') {
loopFlagSec = false;
}
break;
default:
System.out.println("输入有误!请重新输入!");
break;
}
} while (loopFlagSec);
break;
case '3': //开发团队调度管理
teamVi.TeamControl();
break;
// manyTeam = teamVi.getManyTeam();
// teamVi.enterMainMenu();
case '4': //开发项目管理
boolean loopFlagThr = true;
char keyThr = 0;
do {
System.out.print(ANSI_RESET + ANSI_GREEN);
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("⬇ 请选择:(1-5) ");
System.out.print(ANSI_RESET + ANSI_YELLOW);
keyThr = TSUtility.readMenuSelectionPro();
switch (keyThr) {
case '1':
try {
projectSer.addProject();
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
case '2':
if (projectSer.getAllPro().size() == 0){
System.out.println("当前无项目,请先添加项目!");
break;
}
manyTeam = TeamService.teams; //获取团队集合
if (manyTeam.size() == 0) {
System.out.println("当前无开发团队,请先添加团队!");
teamVi.TeamControl();
}
TeamService.teamList(); //展示团队列表
projectSer.showPro(); //展示项目列表
distribution(); //调用分配方法
break;
case '3':
try {
projectSer.showPro();
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
case '4':
ArrayList<Project> p = projectSer.getAllPro();
if (p.size() == 0) {
System.out.println("暂无项目,无法进行项目删除操作!");
} else {
System.out.println("请输入需要删除的项目id:");
int j = TSUtility.readInt();
projectSer.delPro(j);
}
break;
case '5':
System.out.print("确认是否退出(Y/N):");
char yn = TSUtility.readConfirmSelection();
if (yn == 'Y') {
loopFlagThr = false;
}
break;
default:
System.out.println("输入有误!请重新输入!");
break;
}
} while (loopFlagThr);
break;
case '5':
System.out.print("确认是否退出(Y/N):");
char yn = TSUtility.readConfirmSelection();
if (yn == 'Y') {
loopFlag = false;
}
break;
default:
break;
}
} while (loopFlag);
}
// 分配方式选择方法,指定/随机
public void distribution() {
System.out.println("请选择分配方式:(A.指定团队开发 B.随机分配团队开发 T.进入团队管理)");
char choose = TSUtility.readDistributionChoose();
//进入团队管理)
if (choose == 'T'){
teamVi.TeamControl();
return;
}
//项目分配
System.out.println("请输入要分配给团队开发的项目id:");
int id = -1;
do {
id = TSUtility.readInt();
if (id > ProjectService.getAllPro().size()){
System.out.println("输入id大于现有项目数,请重新输入:");
}
else{
id =id-1; //赋值为地址索引
break;
}
}while (true);
//A.指定团队开发
if (choose == 'A') {
System.out.println("请输入要分配的团队id");
int id2 = -1;
do {
id2 = TSUtility.readInt();
if (id2 > TeamService.teams.size()){
System.out.println("输入id大于现有团队数,请重新输入:");
}
else{
id2 =id2-1; //赋值为地址索引
break;
}
}while (true);
int n = -1;
do {
n = TeamService.teamServices.get(id2).getTotal();
System.out.println("当前分配团队人数:"+n);
if (n == 0) {
System.out.println("Id为"+(id2+1)+"的团队没有开发成员,请先添加开人员!");
teamVi.enterMainMenu();
}
else{
break;
}
}while(true);
//调用带参分配方法 给项目指定团队开发
projectSer.dealingPro(id, id2);
}
//B.随机分配团队开发
if (choose == 'B') {
//调用无参分配方法 给指定项目 随机分配团队开发
projectSer.dealingPro(id);
}
}
public static void main(String[] args) throws InterruptedException {
new IndexView().menu();
}
}
TSUtility工具类
/*
工具类
*/
public class TSUtility {
private static Scanner scanner = new Scanner(System.in);
public static char readDistributionChoose() {
char c;
for (; ; ) {
String str = readKeyBoard(1, false).toUpperCase();
c = str.charAt(0);
if (c == 'A' || c == 'B'|| c == 'T') {
break;
} else {
System.out.print("选择错误,请重新输入:");
}
}
return c;
}
//添加团队 获取团队名称
public static String readTeamName(int limit) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入团队名:");
String name = "";
for (; ; ) {
name = sc.next();
if (name.length() > limit) {
System.out.println("团队名长度不能大于+" + limit + ",请重新输入:");
} else {
break;
}
}
return name;
}
//获取进行操作的团队id
public static int readTeamId() {
// System.out.println("请输入要删除的团队id:");
int teamId;
for (; ; ) {
String str = readKeyBoard(1, false);
try {
teamId = Integer.parseInt(str);
break;
} catch (NumberFormatException e) {
System.out.print("数字输入错误,请重新输入:");
}
}
return teamId;
}
public static char readMenuSelection() { //获取菜单选择
char c;
for (; ; ) {
String str = readKeyBoard(1, false);
c = str.charAt(0);
if (c != '1' && c != '2' &&
c != '3' && c != '4') {
System.out.print("选择错误,请重新输入:");
} else break;
}
return c;
}
public static char readMenuSelectionPro() {
char c;
for (; ; ) {
String str = readKeyBoard(1, false);
c = str.charAt(0);
if (c != '1' && c != '2' &&
c != '3' && c != '4' && c != '5') {
System.out.print("选择错误,请重新输入:");
} else break;
}
return c;
}
public static void readReturn() {
System.out.print("按回车键继续...");
readKeyBoard(100, true);
}
public static int readInt() {
int n;
for (; ; ) {
String str = readKeyBoard(2, false);
try {
n = Integer.parseInt(str);
break;
} catch (NumberFormatException e) {
System.out.print("数字输入错误,请重新输入:");
}
}
return n;
}
public static int readStock() {
int n;
for (; ; ) {
String str = readKeyBoard(6, false);
try {
n = Integer.parseInt(str);
break;
} catch (NumberFormatException e) {
System.out.print("数字输入错误,请重新输入:");
}
}
return n;
}
public static Double readDouble() {
Double n;
for (; ; ) {
String str = readKeyBoard(6, false);
try {
n = Double.parseDouble(str);
break;
} catch (NumberFormatException e) {
System.out.print("数字输入错误,请重新输入:");
}
}
return n;
}
public static char readConfirmSelection() {
char c;
for (; ; ) {
String str = readKeyBoard(1, false).toUpperCase();
c = str.charAt(0);
if (c == 'Y' || c == 'N') {
break;
} else {
System.out.print("选择错误,请重新输入:");
}
}
return c;
}
public static String readString(int limit, String defaultValue) {
String str = readKeyBoard(limit, true);
return str.equals("") ? defaultValue : str;
}
public static String readKeyBoard(int limit, boolean blankReturn) {
String line = "";
while (scanner.hasNextLine()) {
line = scanner.nextLine();
if (line.length() == 0) {
if (blankReturn) return line;
else continue;
}
if (line.length() < 1 || line.length() > limit) {
System.out.print("输入长度(不大于" + limit + ")错误,请重新输入:");
continue;
}
break;
}
return line;
}
// 进度加载
public static void loadSpecialEffects() throws InterruptedException {
System.out.println("请稍等:");
for (int i1 = 1; i1 <= 100; i1++) {
System.out.print("加载中:" + i1 + "%");
Thread.sleep(new Random().nextInt(25) + 1);
if (i1 == 100) {
Thread.sleep(50);
}
System.out.print("\r");
}
}
}
项目优化
在测试项目时,还是发现会有一些bug存在,有逻辑上不合理的地方,也有代码漏洞。以下是发现的几点优化:
优化
(1)账号修改后登录
在账号修改完之后增加以下代码块,可选择用修改后的账号密码重新登录。
System.out.println("是否重新登录?(Y/N)");
char c = TSUtility.readConfirmSelection();
if (c == 'Y'){
login();
}
flag = false;
(2)初始化代码块修改为static代码块,ArrayList存储集合也要要跟着改为static
(3)增加判断方法,并在分配前先进行判断
//判断待分配项目是否已在开发
public static boolean projectIsRun(Project project){
if (project.getTeamName() != null){
System.out.println("当前项目正在被团队<"+project.getTeamName()+">开发,终止本次分配。");
return true;
}else{
return false;
}
}
//判断当前分配团队是否已有项目在开发
public static boolean teamJobProject(Team team){
if (team.getJobProject() != null){
return true;
}else{
return false;
}
}