实践项目一 项目开发团队分配管理
目錄
整體結構圖:
整體功能實現分析:
該項目的需求:
需求分析:
登錄注冊:
對開發人員進行的操作:
團隊的組建:
項目模塊:
用戶注冊登錄模塊:
代碼展示:
開發人員管理模塊:
數據的添加:
數據的返回:?
代碼展示:
開發團隊調度模塊:
團隊的創建:
?多個團隊的創建和保存:
代碼展示:
開發項目管理模塊:
代碼展示:
主界面:
代碼展示:
整體結構圖:
?實現流程圖:
整體功能實現分析:
從兩張圖可以看出:完成整個項目,總共需要完成四個小模塊,而每一個模塊都有自己的功能。通過兩圖可以看出,完成該項目大致的思路都是完成各自模塊的增、刪、改、查。這幾個功能,相信大家都不陌生。難點在于:該項目需要把各個模塊相聯系起來,雖然第一感覺也不算太難,但真正開始聯系的時候可能會出現很多問題,比如博主就遇到了:模塊之間的數據銜接有問題:?每次跨模塊調用數據時,數據有差異,就很頭疼。其實問題在于:每次調用不同類,實例化對象的時候沒有注意其內存地址的改變。總之,完成該項目各個模塊之間的銜接,一定要注意每個實現功能服務類要返回數據,不然后面調用起來會很麻煩;一定要注意,實例化對象時地址的改變(如果需要多次調用同一個功能類中的數據,盡量只實例化一次,其他的把實例化的對象以參數的形式傳遞即可)。下面是博主對該項目的實現思路和理解:
該項目的需求:
需求分析:
登錄注冊:
可以看到:進入到界面有登錄和注冊的功能,可以用 判斷語句來判斷:賬號的有無,密碼是否正確,來確認是否進行注冊的功能。
? ? ? ? ? ? ? ?
?成功登錄后,實現對賬號和密碼的修改,可以直接把賬號和密碼重新賦值即可。
對開發人員進行的操作:
我們可以建一個對開發人員管理的功能服務類,以便于后面直接調用。在存儲員工時,我們可以建立相關員工的類,不同的員工有他自己特有的屬性,員工之間也有相同的共性,所以,很顯然,我們可以通過繼承來實現幾個員工類之間的關系。
對開發人員的數據我們可以建立一個集合用于存儲。
?在該類里面寫出增刪改查的功能:
?完成該模塊的功能后,注意一定要返回數據,不然后面調用的時候很麻煩。
團隊的組建:
完成對于開發人員的操作后,就考慮怎么組建團隊了:
首先,我們得獲取模塊二中開發人員的數據,然后通過他們的員工號,選擇員工,并將其存到一個集合或者數組里,這樣我們便得到了一個團隊。注意,此時,我們任然要返回團隊值,以便于下一個模塊調用。除此之外,添加刪改的功能。
項目模塊:
我們可以先將其創建一個項目類,用來設定其特有的成員變量:
?然后再創建一個項目的功能實現類,用于實現相對應的功能。可以用集合存儲添加項目的數據。
這樣就可以在后面直接通過集合調用項目的數據。
?最后,再將添加的項目用隨機的方式分配給團隊。實現分配的功能,就是說,我們可以集合里的set方法,改變集合里項目的信息,比如項目號1 上的數據,改為團隊的相關的信息,然后項目的狀態改為true,就表示該項目已經被分配。
?
到這里,該項目大致的功能就已經實現了。
接下來我們一起來看看,該項目各個模塊之間的難點和易錯點:
創建需要用到的各種類,接口以及異常:
通過分析,我們大致可以知道我們需要8個包含屬性的實體類,3個邏輯功能實現類,3個界面展示類,一個異常類,一個接口類。所以,我們可以建三個包,來區分并打包相關的類。
View包下,放了界面展示的類;Service包里,放了邏輯功能的類;Domain包,放了Employee及其子類等JavaBean類。
用戶注冊登錄模塊:
該模塊沒有太多的知識點和難點,相信大家都可比較輕松愉快地完成:
主要就用到了while 循環的一個嵌套,實現用戶登錄失敗繼續登錄,以及登錄失敗后有相應的次數限制的提示。
?????????????????
代碼展示:
package view;import java.util.Scanner;public class LoginView {private String userName="";private String password="";//登錄功能public void login() throws InterruptedException{Scanner sc = new Scanner(System.in);int n=5;//設定可失誤密碼次數boolean flog=true;while (flog){System.out.println("********************🐱");System.out.println("*** <登錄界面> ***");System.out.println("*** (: ***🐱");System.out.println("********************🐱");System.out.println("請輸入您的登錄用戶:");String userName = TSUtility.readKeyBoard(4, false);System.out.println("請輸入您的密碼:");String password = TSUtility.readKeyBoard(8, false);if (this.userName.length()==0||this.password.length()==0){System.out.println("未檢測到您的賬號,請先注冊!");register();}//已經注冊,成功登錄else if (this.userName.equals(userName)&&this.password.equals(password)){System.out.println("登錄成功,歡迎您:"+userName);flog=false;}//登錄失敗else {System.out.println("登錄失敗!請檢查您的用戶名或者密碼!");n--;System.out.println("登錄還剩:"+n+"次,請重新輸入。。。");}}}//修改功能public void update() throws InterruptedException{System.out.println("********************🐱");System.out.println("*** <修改界面> ***");System.out.println("*** (: ***🐱");System.out.println("********************🐱");boolean f=true;while (f){Scanner sc = new Scanner(System.in);//修改驗證System.out.println("請輸入您的舊登錄用戶:");String userName=sc.nextLine();System.out.println("請輸入您的舊密碼:");String password=sc.nextLine();boolean flog=true;if (this.userName.equals(userName)&&this.password.equals(password)){System.out.println("登錄成功,歡迎您:"+userName);while (flog){System.out.println("請輸入你需要修改的類型:");System.out.println("1(修改用戶名)");System.out.println("2(修改密碼名)");System.out.println("3(修改用戶名和密碼名)");System.out.println("4(不修改,退出)");int num=sc.nextInt();if (num==1){//賬號System.out.print("請輸入 您將要修改("+this.userName+")的新名稱:");this.userName= TSUtility.readKeyBoard(4, false);System.out.println("修改成功!");}else if (num==2){//密碼System.out.print("請輸入 您將要修改("+this.password+")的新密碼:");this.password= TSUtility.readKeyBoard(8, false);System.out.println("修改成功!");}else if (num==3){//賬號和密碼System.out.print("請輸入 您將要修改("+this.userName+")的新名稱:");this.userName= TSUtility.readKeyBoard(4, false);System.out.println("修改成功!");System.out.print("請輸入 您將要修改("+this.password+")的新密碼:");this.password= TSUtility.readKeyBoard(8, false);System.out.println("修改成功!");}else if(num==4){System.out.println("正在退出,請稍后....");flog=false;} else {System.out.println("輸入錯誤!請輸入“1”或者“2”或者“3”或者“4”:");}}f=false;}else{System.out.println("用戶或密碼不正確,請檢查后重新輸入。。。");}}}//注冊功能public void register(){System.out.println("~~~~~~~~~~~注冊~~~~~~~~~~");Scanner sc = new Scanner(System.in);System.out.println("請輸入賬號:");this.userName=sc.nextLine();System.out.println("請輸入密碼:");this.password=sc.nextLine();System.out.println("注冊成功");}}開發人員管理模塊:
該模塊主要的難點在于:我們需要先存儲不同員工的數據,每個類型的員工我們需要建立相應的類,然后通過繼承來將幾個類之間聯系起來。建立每個類時,我們需要想清楚該類有哪些屬性,哪個屬性是可以繼承的,哪個屬性是自己獨有的。博主這里是通過集合來存儲的數據:
數據的添加:
值得注意的是,這里存儲時,是通過new 對象,將數據 以對象的帶參構造器傳入的數據。用該方法傳遞數據,需要在該類里重寫toString方法,不然的話,得到的只是該對象的地址,數據并沒有成功地傳入。
數據的刪除:? ?我們在刪除數據時,需要將員工的號碼也前移一位,這樣得到的數據看著才更順暢。我們可以通過循環遍歷刪除過后的數據,使得他們的號碼依次減一:
數據的返回:?
完成基本的功能之后,最重要的是我們需要將的到的數據作為返回值返回,以便于下一個模塊對其的調用。這里博主寫了 開發人員數據的返回,以及得到某一個員工數據的返回。
????????????????????????
這兩個返回方法,在添加團隊成員時,可以用到。
代碼展示:
package service;import com.sun.deploy.net.MessageHeader; import domain.*; import view.TSUtility;import java.util.ArrayList;/*** @author 劉哲銘* @description 項目開發團隊分配管理軟件*/ public class NameListService {//用來裝員工的數據集合private ArrayList<Employee> array=new ArrayList<>();//添加員工的IDprivate int count=1;//初始化默認值//構造代碼塊{array.add(new Employee(count, "馬云 ", 3000));array.add(new Architect(++count, "馬化騰", 18000, new NoteBook("聯想T4", 6000), 60000, 5000));array.add(new Programmer(++count, "李彥宏", 7000, new PC("戴爾", "NEC 17寸")));array.add(new Programmer(++count, "劉強東", 7300, new PC("戴爾", "三星 17寸")));array.add(new Designer(++count, "雷軍 ", 10000, new Printer("激光", "佳能2900"), 5000));array.add(new Programmer(++count, "任志強", 16800, new PC("華碩", "三星 17寸")));array.add(new Designer(++count, "柳傳志", 35500, new PC("華碩", "三星 17寸"), 8000));array.add(new Architect(++count, "楊元慶", 6500, new Printer("針式", "愛普生20k"), 15500, 1200));array.add(new Designer(++count, "史玉柱", 7800, new NoteBook("惠普m6", 5800), 1500));array.add(new Programmer(++count, "丁磊 ", 6600, new PC("戴爾", "NEC17寸")));array.add(new Programmer(++count, "張朝陽 ", 7100, new PC("華碩", "三星 17寸")));array.add(new Designer(++count, "楊致遠", 9600, new NoteBook("惠普m6", 5800), 3000));}//得到所有員工數據集合public ArrayList<Employee> getAllEmployees() {return array;}//得到當前員工public Employee getEmployee(int id) throws TeamException {for (int i = 0; i < array.size(); i++) {if (array.get(i).getId() == id) {return array.get(i);}}throw new TeamException("該員工不存在");}//員工的增加public void addEmployee() throws InterruptedException {System.out.println("請輸入需要添加的雇員的職位:");System.out.println("1(無職位)");System.out.println("2(程序員)");System.out.println("3(設計師)");System.out.println("4(架構師)");String c = String.valueOf(TSUtility.readMenuSelection());if (c.equals("1")) {//無職位 new Employee(count++,"馬云 ",22,3000)System.out.println("`當前雇員職位分配為:無`");System.out.println("請輸入當前雇員的姓名:");String name = TSUtility.readKeyBoard(4, false);System.out.println("請輸入當前雇員的工資:");Double salary = TSUtility.readDouble();Employee employee = new Employee(++count, name, salary);array.add(employee);System.out.println("人員添加成功!");TSUtility.readReturn();} else if (c.equals("2")) {System.out.println("`當前雇員職位分配為:程序員`");System.out.println("請輸入當前雇員的姓名:");String name = TSUtility.readKeyBoard(4, false);System.out.println("請輸入當前雇員的工資:");Double salary = TSUtility.readDouble();System.out.println("請為當前程序員配一臺好的臺式電腦:");PC pc = new PC().addPC();Programmer programmer = new Programmer(++count, name,salary, pc);array.add(programmer);System.out.println("人員添加成功!");TSUtility.readReturn();} else if (c.equals("3")) {System.out.println("`當前雇員職位分配為:設計師`");System.out.println("請輸入當前雇員的姓名:");String name = TSUtility.readKeyBoard(4, false);System.out.println("請輸入當前雇員的工資:");Double salary = TSUtility.readDouble();System.out.println("請為當前設計師配一臺好的筆記本電腦:");NoteBook noteBook = new NoteBook().addNoteBook();System.out.println("請輸入當前設計師的獎金:");Double bonus = TSUtility.readDouble();Designer designer = new Designer(++count, name, salary, noteBook, bonus);array.add(designer);System.out.println("人員添加成功!");TSUtility.readReturn();} else {System.out.println("`當前雇員職位分配為:架構師`");System.out.println("請輸入當前雇員的姓名:");String name = TSUtility.readKeyBoard(4, false);System.out.println("請輸入當前雇員的工資:");Double salary = TSUtility.readDouble();System.out.println("請為當前架構師配一臺好的打印設備:");Printer printer = new Printer().addPrinter();System.out.println("請輸入當前架構師的獎金:");Double bonus = TSUtility.readDouble();System.out.println("請輸入當前架構師的股票:");Integer stock = TSUtility.readstock();Architect architect = new Architect(++count, name, salary, printer, bonus, stock);array.add(architect);System.out.println("人員添加成功!");TSUtility.readReturn();}}//員工的刪除public void delEmployee(int id) throws InterruptedException {boolean flag = false;for (int i = 0; i < array.size(); i++) {if (array.get(i).getId() == id) {//列如:控制臺想要刪除3號(id==3),此時的i==2(get()從零開始),array.remove(i);//刪除了3號的數據,此時i==2;后面的數據已經前移,但編號沒變,就如get(2)==4號位的數據。 // for (i = id-1; i <array.size(); i++) {//把id==3賦值給i;i==3; 就表示從4號開始遍歷,目的是后面的編號依次減1; // array.get(i ).setId(array.get(i ).getId() - 1);//get從0開始,所以i需要-1; // }for (i = id; i <=array.size(); i++) {//把id==3賦值給i;i==3; 就表示從4號開始遍歷,目的是后面的編號依次減1;array.get(i-1).setId(array.get(i-1).getId() - 1);//get從0開始,所以i需要-1;}flag = true;}}if (flag) {System.out.println("刪除成功!");count--;} else {try {throw new TeamException("該員工不存在");} catch (TeamException e) {e.printStackTrace();}}}//員工的查看public void showEmployee() throws InterruptedException { // TSUtility.loadSpecialEffects();System.out.println("ID\t姓名\t\t工資\t\t職位\t\t狀態\t\t獎金\t\t股票\t\t領用設備");for (int i = 0; i < array.size(); i++) {System.out.println(" " + array.get(i));}}//員工的修改 (目前只修改姓名,工資即可)public void modifyEmployee(int id) throws InterruptedException {boolean flag = false;for (int i = 0; i < array.size(); i++) {Employee emp = array.get(i);if (array.get(i).getId() == id) {System.out.print("姓名(" + emp.getName() + "):");String name = TSUtility.readString(4, emp.getName());System.out.print("工資(" + emp.getSalary() + "):");double salary =Double.parseDouble(TSUtility.readString(10, emp.getSalary()+""));emp.setName(name);emp.setSalary(salary);array.set(i,emp);flag = true;}}if (flag) {System.out.println("修改成功!");} else {try {throw new TeamException("該員工不存在");} catch (TeamException e) {e.printStackTrace();}}}}開發團隊調度模塊:
該模塊的主要難點在于:把最后的主界面和開發人員管理模塊相聯系起來,這就要注意參數的傳遞要準確。?就比如,博主在添加團隊成員,調用開發人員的模塊時發現,在主界面對開發人員實現的增刪改查后的數據,在團隊模塊里找不到了!得到的只是開發人員模塊里初始化的數據。這個問題,博主改了好久,想起都頭疼!問題在于:在團隊模塊調用數據時,new 了新對象,在主界面也new 了新對象,也就是說:主界面進行的增刪改查后的數據,只保存到了主界面,而團隊模塊只是重新調用了開發團隊的數據! 最后,博主才把主界面的對象做為參數 傳到了 團隊模塊,才完善了該功能。
團隊的創建:
我們可以先調用增刪改查后,開發人員的數據,得到想要存到團隊里的員工ID,添加到創建的數組中。在添加團隊成員時,按照添加團隊成員的要求,設置判斷語句限制添加成員的類別和數量。
多個團隊的創建和保存:
在創建團隊時,我們可以在第一個團隊創建后,在退出這里,把團隊的數據保存到一個新建的集合里,然后初始化團隊的數據,以便于下一個團隊可以像第一個團隊那樣重新添加團隊成員。
代碼展示:
TeamService
package service;import domain.Architect; import domain.Designer; import domain.Employee; import domain.Programmer;/*** @author 劉哲銘* @description 項目開發團隊分配管理軟件*/ public class TeamService {//用于自動生成團隊成員的memberIdprivate static int counter = 1;//團隊人數上限private final int MAX_MEMBER = 5;//保存當前團隊成員private Programmer[] team = new Programmer[MAX_MEMBER];//以類名作為數組,可以設置成員變量//團隊實際人數private int total = 0;//先構建一個無參的構造器public TeamService() {}//返回team中所有程序員構成的數組public Programmer[] getTeam(){//用于把團隊存到一個 數組中,以便于調用該方法,可以得到team中所有程序員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];//初始化時,每次重新調用該方法,team 都得到一個新的數組counter=1;total=0; // this.team=team;}//增加團隊成員public void addMember(Employee e) throws TeamException {if (total>=MAX_MEMBER){//當total==5時,團隊里已經添加了5個(total++是先添加再++)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 numOfA=0,numOfDe=0,numOfPro=0;for (int i = 0; i < total; i++) {//先檢查數組team里 相應員工的數量if (team[i] instanceof Architect){numOfA++;}else if (team[i] instanceof Designer){numOfDe++;}else if (team[i] instanceof Programmer){numOfPro++;}}if (p instanceof Architect){if (numOfA>=1){//因為num是從0開始,所以等于1就相當于有了兩名throw new TeamException("團隊中至多只能有一名架構師");}}else if (p instanceof Designer){if (numOfDe>=2){throw new TeamException("團隊中至多只能有兩名設計師");}}else if (p instanceof Programmer){if (numOfPro>=3){throw new TeamException("團隊中至多只能有三名程序員");}}//添加到數組 注意!!!! 需要把team數組 放到判斷 拋出異常之后,不然會先添加數據,再執行異常(異常只起到了提示作用,沒有防止數據繼續添加到團隊中)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);//將其轉態改為true,表示該成員被從團隊移除break;}for (n = memberId; n < total; n++) {//序號依次減一補齊team[n].setMemberId(team[n].getMemberId()-1);}}//如果遍歷一遍,都找不到,則報異常if (n == total)throw new TeamException("找不到該成員,無法刪除");//后面的元素覆蓋前面的元素for (int i = n + 1; i < total; i++) {team[i - 1] = team[i];}team[--total] = null;}}TeamView:
package view;import domain.Employee; import domain.Programmer; import service.NameListService; import service.TeamException; import service.TeamService;import java.util.ArrayList;/*** @author 劉哲銘* @description 項目開發團隊分配管理軟件*/ public class TeamView {private NameListService lis =new NameListService();private TeamService teamSvc = new TeamService();private ArrayList<Programmer[]> team = new ArrayList<>();private static IndexView I=new IndexView();//主菜單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();System.out.println();switch (key) {case '1':listTeam();break;case '2':addMember();break;case '3':deleteMember();break;case '4':System.out.print("確認是否退出(Y/N):");char yn = TSUtility.readConfirmSelection();if (yn == 'Y') {if (teamSvc.getTeam().length == 0){loopFlag = false;}else {team.add(teamSvc.getTeam());//獲取存入team中所有程序員構成的數組,每調用一次,就在集合team里存入了一個團隊teamSvc.clearTeam();//每次退出都會初始化當前團隊的成員數組 teamSvc,以便于下一次加入新的團隊loopFlag = false;}}break;default:break;}} while (loopFlag);}//分別調用了增刪改查功能//顯示所有的員工成員public void listAllEmployees(){System.out.println("~~~~~~~~~~~~~~歡迎來到團隊調度軟件~~~~~~~~~~~~~~~");ArrayList<Employee> emps = lis.getAllEmployees();if (emps.size() == 0){System.out.println("沒有客戶記錄");}else {System.out.println("ID\t姓名\t\t工資\t\t職位\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("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");}//顯示開發團隊成員列表public void listTeam(){System.out.println("~~~~~~~~~~~~~~~~團隊成員列表~~~~~~~~~~~~~~~~");Programmer[] team=teamSvc.getTeam();//獲取team中所有程序員構成的數組if (team.length == 0){System.out.println("開發團隊目前沒有成員!");}else {System.out.println("TID/ID\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.print("請輸入要添加的員工ID:");int id = TSUtility.readInt();try {Employee e = lis.getEmployee(id);teamSvc.addMember(e);//添加成員到團隊System.out.println("添加成功");} catch (TeamException e) {System.out.println("添加失敗,原因:" + e.getMessage());}// 按回車鍵繼續...TSUtility.readReturn();}// 從團隊中刪除指定id的成員private void deleteMember() {System.out.println("---------------------刪除成員---------------------");System.out.print("請輸入要刪除員工的TID:");int id = TSUtility.readInt();System.out.print("確認是否刪除(Y/N):");char yn = TSUtility.readConfirmSelection();if (yn == 'N')return;try {teamSvc.removeMember(id);//改變員工的狀態,表示將其移除團隊System.out.println("刪除成功");} catch (TeamException e) {System.out.println("刪除失敗,原因:" + e.getMessage());}// 按回車鍵繼續...TSUtility.readReturn();}// 加入并得到更多的團隊public ArrayList<Programmer[]> getManyTeam(NameListService nameListSer) {boolean flag = true;char key = 0;lis=nameListSer;//將傳入的對象,賦值給lis ,使得lis可以用到參數對象里的 數據do {System.out.println("※※※※※※※※※※※");System.out.println("※ 團隊調度界面 ※");System.out.println("※※※※※※※※※※※");System.out.print("1-添加團隊 2-查看團隊 3-刪除團隊 4-退出 請選擇(1-4):");key = TSUtility.readMenuSelection();System.out.println();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]);}/*for (int i = 0; i < team.length; i++) {System.out.println(team[i]);}*/System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");}break;case '3':System.out.println("請輸入想要刪除第幾個團隊");int num = TSUtility.readInt();if (num<=team.size()){System.out.print("確認是否刪除(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.print("確認是否退出(Y/N):");char yn = TSUtility.readConfirmSelection();if (yn == 'Y') {flag = false;}break;default:break;}} while (flag);return team;}//調用了主菜單的功能}開發項目管理模塊:
該模塊需要實現的功能主要就是把添加進來的項目,隨機分配給團隊。需要注意的是,在分配時,我們要根據項目的狀態這個屬性來判斷該項目是否被開發,以便于后面執行分配時,避免重復分配,以及項目沒有確保分配到團隊中。這里,博主用了一個while循環判斷:
?在處理異常時,我們可以重寫異常輸出的信息,以便于代碼更好的可讀性。
代碼展示:
package service;import domain.Programmer; import domain.Project; import view.TSUtility;import java.util.ArrayList; import java.util.Random;/*** @author 劉哲銘* @description 項目開發團隊分配管理軟件* 項目參考:* 1.小米官網:開發完成類似于小米官網的web項目* 2.公益在線商城:貓寧Morning公益商城是中國公益性在線電子商城,以商城B2C模式運營的公益在線商城。* 3.博客系統:Java博客系統,讓每一個有故事的人更好的表達想法!使用了輕量級 mvc 框架Blade開發,默認主題使用了漂亮的pinghsu。* 4.在線協作文檔編輯系統:多人在線協作文檔編輯器是一個很常用的功能,適合小組內的文檔編輯。*/public class ProjectService {//建立用于存放項目管理的集合private ArrayList<Project> pro=new ArrayList<>();//使用引用數據類型,輸入pro可以按照Project 里的toString格式輸出private int count=1;//添加項目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("其他:退出!");System.out.println("------------------------------------------------------------");TSUtility.readReturn();System.out.println("請輸入你想添加的項目名: ");char c = TSUtility.readMenuSelection();switch (c){case '1':Project p1=new Project();//創建一個項目對象p1.setProId(count++);//設定項目的編號,每次執行,編號加一p1.setProName("小米官網");//項目名稱p1.setDesName("開發完成類似于小米官網的web項目");//項目內容名稱pro.add(p1);//添加到集項目合里TSUtility.loadSpecialEffects();System.out.println("已添加項目:"+p1.getProName());break;case '2':Project p2=new Project();//創建一個項目對象p2.setProId(count++);//設定項目的編號,每次執行,編號加一p2.setProName("公益在線商城");//項目名稱p2.setDesName("貓寧Morning公益商城是中國公益性在線電子商城.");//項目內容名稱pro.add(p2);//添加到集項目合里TSUtility.loadSpecialEffects();System.out.println("已添加項目:"+p2.getProName());break;case '3':Project p3=new Project();//創建一個項目對象p3.setProId(count++);//設定項目的編號,每次執行,編號加一p3.setProName("博客系統");//項目名稱p3.setDesName("Java博客系統,讓每一個有故事的人更好的表達想法!");//項目內容名稱pro.add(p3);//添加到集項目合里TSUtility.loadSpecialEffects();System.out.println("已添加項目:"+p3.getProName());break;case '4':Project p4=new Project();//創建一個項目對象p4.setProId(count++);//設定項目的編號,每次執行,編號加一p4.setProName("在線協作文檔編輯系統");//項目名稱p4.setDesName("一個很常用的功能,適合小組內的文檔編輯。");//項目內容名稱pro.add(p4);//添加到集項目合里TSUtility.loadSpecialEffects();System.out.println("已添加項目:"+p4.getProName());break;default:break;}}//給項目分配團隊public void dealingPro(Programmer[] team) throws NullPointerException{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 n=r.nextInt(pro.size());//實例化項目類Project p=new Project();p=this.pro.get(n);//集合取出隨機的項目給pwhile (p.getStatus()){//使用一個while循環 ,判斷, 如果該隨機得到的項目已被開發,就會重新隨機讀取n,直到得到的項目為未開發 才會退出循環n=r.nextInt(pro.size());//該項目已被開發,重新獲取隨機數p=this.pro.get(n);//集合重新取出隨機的項目}p.setTeamName(teamName);//設置當前(傳參進來的)團隊名字p.setTeam(team);//把當前(傳參進來的)團隊存到 p中的數組 Teamp.setStatus(true);//改變項目的狀態pro.set(n,p);//改變集合 第n 位置上的數據 為 p,也就是表示 n位置上的項目 被當前(傳參進來的)團隊開發System.out.println("~~~~~~~~~分配成功~~~~~~~~~~");}//查看目前項目情況public void showPro() throws InterruptedException{TSUtility.loadSpecialEffects();if (pro.size() == 0){try {throw new TeamException("還沒有項目,請先添加!");}catch (TeamException e){e.printStackTrace();}}else {for (int i = 0; i < pro.size(); i++) {System.out.println(pro.get(i));//輸出pro ,按照前面的toString格式輸出}}}//刪除選擇的項目public void delPro(int id) throws TeamException{boolean flog=false;boolean t=false;//用來判斷項目是否被開發for (int i = 0; i < pro.size(); i++) { // if (!pro.get(i).getStatus()){//if pro.get(i).getStatus() == false;if (pro.get(i).getProId() == id){if (pro.get(i).getStatus()){//if pro.get(i).getStatus() == true;t=true;//項目已被開發}else {pro.remove(i);//刪除pro i位置 上的數據for ( i = id; i < pro.size(); i++) {pro.get(i-1).setProId(pro.get(i-1).getProId()-1);}flog=true;}}} // }if (t){try {throw new TeamException("項目已被開發,不能被刪除!");}catch (TeamException e){ // e.printStackTrace();System.out.println(e.getMessage());}}else {if (flog){System.out.println("刪除成功!");count--;}else {try {throw new TeamException("該項目不存在!");}catch (TeamException e){ // e.printStackTrace();System.out.println(e.getMessage());}}}}//得到所有項目數據集合public ArrayList<Project> getAllPro() {return pro;}}?到這里,該項目大致的功能就完成了,最后只需要添加一個主界面,把所有的模塊調用起來就完成了!
主界面:
代碼展示:
package view;import domain.Employee; import domain.Programmer; import service.NameListService; import service.ProjectService; import service.TeamException;import java.util.ArrayList;/*** @author 劉哲銘* @description 項目開發團隊分配管理軟件*/ public class IndexView {private LoginView loginVi = new LoginView();//登錄界面private NameListService nameListSer = new NameListService();private TeamView teamVi = new TeamView();private ProjectService projectSer = new ProjectService();private ArrayList<Programmer[]> manyTeam=null;//主菜單public void menu() {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("🐕");System.out.println("🐕");System.out.println("🐕-----------<請您先進行登錄>-------------🐕");TSUtility.readReturn();try {loginVi.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 {loginVi.update();//執行修改功能}catch (InterruptedException e){e.printStackTrace();//System.out.println(e.getMessage());}break;case '2':try {nameListSer.showEmployee();}catch (InterruptedException e){e.printStackTrace();}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':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();try {nameListSer.delEmployee(j);} catch (InterruptedException e) {e.printStackTrace();}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':manyTeam = teamVi.getManyTeam(nameListSer); //把對象作為參數 傳入到 將要使用該對象里的數據的方法中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 {projectSer.addProject();}catch (InterruptedException e){e.printStackTrace();}break;case '2':try {for (Programmer[] pro : manyTeam) {projectSer.dealingPro(pro);}/*for (int i = 0; i < manyTeam.size(); i++) {Programmer[] pro=manyTeam.get(i);projectSer.dealingPro(pro);}*/}catch (NullPointerException e){System.out.println("目前還沒有開發團隊,請先創建一個團隊!");}break;case '3':try {projectSer.showPro();}catch (InterruptedException e){e.printStackTrace();}break;case '4':System.out.println("請輸入需要刪除的項目id:");int j = TSUtility.readInt();try {projectSer.delPro(j);}catch (TeamException e){e.printStackTrace();}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 static void main(String[] args) {new IndexView().menu();} }該項目主要的難點在于:讓每個模塊相互銜接,以及各個模塊之間數據的參數傳遞要準確,還有就是在創建集合或者數組保存數據時,注意集合或者數組的初始化,保下一次數據的存儲不會受到影響。該項目是博主寫的第一個較大的項目,寫了好久,中間遇到了很多的問題,也修改了很久。有時候遇到的問題也相當頭疼,幸好在老師的幫助下,把問題解決掉以后,瞬間豁然開朗的那種感覺,還是挺不錯的。在遇到難以解決的問題,或者自己已經花了很多時間都沒有解決掉問題時,別頭鐵(一股腦地自己改,可能會越改越麻煩!),多和同學、老師交流請教,雖然大家的思路可能會不一樣,但 ~ 也許正是那么小小的一個提示 ~ 大師,我悟了!
英雄點個贊吧? 一鍵三連呀~~
總結
以上是生活随笔為你收集整理的实践项目一 项目开发团队分配管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 水晶高跟鞋(测试版)
- 下一篇: 爬了 48048 条评论,解读 9.3