思维导图:
思路:刚拿到这个项目时,没想那么多,就想着由简到难,先把一些容易简单的,可以马上写出来的先写了,后面关乎逻辑性较强的问题再一步步理清。总体思路是创建三个包——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方法就不会出现清空。