前言:
時隔多日,我們學習完java的面向對象階段,畢竟需要付諸實踐,這個小項目就 作為我們第一個java面向對象解決的項目,接下來就讓我們一起進入項目的世界吧
一、項目需求
• 模擬實現一個基于文本界面的 《 項目開發團隊分配管理軟件 》
• 熟悉 Java 面向對象的高級特性,進一步掌握編程技巧和調試技巧
•主要涉及以下知識點:
Ø 類的繼承性和多態性
Ø 對象的值傳遞、接口
Ø static 和 final 修飾符
Ø 特殊類的使用:包裝類、抽象類、內部類
Ø 異常處理
Ø Java 基本語法和流程控制
Ø 數組, ArrayList 集合
二、功能實現
Ø 軟件啟動時,首先進入登錄界面進行注冊和登錄功能。
Ø 當登陸成功后,進入菜單,首先就可以對開發人員賬戶和密碼進行修改。
Ø 然后可以對開發人員進行增刪改操作
Ø 人員添加成功后,根據菜單提示,基于現有的 公司成員 ,組建一個 開發團隊 以開發一個新的項目。
Ø 組建過程包括將成員插入到團隊中,或從團隊中刪除某成員,還可以列出團隊中現有成員的列表,開發團隊成員包括架構師、設計師和程序員。
Ø 團隊組建成功,則可以進入項目模塊,添加項目,分配開發團隊進行開發。
整個項目UML類圖。制作不標準,見諒。
系統流程
三、具體模塊的實現
1.實現登陸模塊。
思路:要實現登陸模塊,我們首先應該想到,我們平常登陸賬號都是輸入賬號,密碼,匹配你之前注冊的賬號密碼即可登陸成功, 怎么做到我們輸入的賬號密碼和我們提前注冊的賬號密碼匹配呢,這里我們就要想到,我們輸入的賬號密碼都是字符串類型,既然是字符串,我們就可以使用String類的equals方法進行匹配,匹配成功,則登陸成功。
那么,在我們的項目當中,登陸之前我們是肯定要匹配他是否存在于我們的注冊賬號之中,如果存在,直接登陸, 如果不存在,我們應該讓用戶先注冊,當然,也可以加一個隨機數組成的驗證碼來進一步強化我們的登陸模塊。
實例代碼
package com.Team.loginAndRegister; /** * @author WangWei * @version 1.0 */ public class LoadingAndRegister { public String user; public String password; public LoadingAndRegister() { } public LoadingAndRegister(String user,String password) { this.user = user; this.password = password; } public void setUser(String user) { this.user = user; } public String getUser() { return user; } public void setPassword(String password) { this.password = password; } public String getPassword() { return password; } } package com.Team.loginAndRegister; import java.util.Scanner; import java.util.ArrayList; /** * @author WangWei * @version 1.0 */ public class LoadingAndRegisterTest { /** * - ArrayList<LoadingAndRegister> a 儲存賬號密碼的集合 * - LoadingAndRegister lr 賬號密碼類的對象 */ Scanner sc = new Scanner(System.in); private ArrayList<LoadingAndRegister> a = new ArrayList<LoadingAndRegister>(); private LoadingAndRegister lr = new LoadingAndRegister(); /** * 注冊方法 * @throws InterruptedException */ public void loginAccount() throws InterruptedException { TSUtility.loadSpecialEffects(); System.out.println("開始注冊:"); System.out.println("請輸入你的注冊賬戶名稱:"); String loginUserName = TSUtility.readKeyBoard(6, false); lr.setUser(loginUserName); System.out.println("請輸入你的登陸密碼:"); String loginPassword = TSUtility.readKeyBoard(8, false); lr.setPassword(loginPassword); a.add(lr); System.out.println("注冊成功,請登陸!"); } /** * 登陸方法 * @throws InterruptedException */ public void loading() throws InterruptedException { Scanner sc = new Scanner(System.in); boolean flag = true; int count = 5; while (flag) { System.out.println("********************"); System.out.println("*** <登錄界面> ***"); System.out.println("*** (: ***"); System.out.println("********************"); System.out.println("請輸入你的登陸賬戶名稱:"); String userName = sc.next(); System.out.println("請輸入你的登陸密碼:"); String password = sc.next(); //未注冊 if (lr.getUser() == null || lr.getPassword() == null) { System.out.println("未檢測到您的賬號,請先注冊!"); loginAccount(); } else if (userName.equals(lr.getUser()) && password.equals(lr.getPassword())) { System.out.println("登陸成功!歡迎您:" + lr.getUser()); flag = false; } else { if (count == 1) { System.out.println("你的賬戶已被鎖定,已強制退出!"); System.exit(0); } else { count--; System.out.println("登陸失敗!用戶名或密碼不匹配,你還有" + (count) + "次機會! 請重新登陸:"); } } } } /** * 修改用戶信息方法 * @throws InterruptedException */ public void updateAccount() throws InterruptedException { boolean flag = true; while (flag) { System.out.println("=====請選擇功能====="); System.out.println("1、修改密碼"); System.out.println("2、修改用戶名"); System.out.println("3、修改用戶名和密碼"); System.out.println("4、不修改,退出"); System.out.println("==================="); System.out.print("請選擇:"); char c = TSUtility.readMenuSelection(); TSUtility.loadSpecialEffects(); switch (c) { case "1": System.out.println("請輸入原密碼:"); String oldPassword = sc.next(); if (lr.getPassword().equals(oldPassword)) { System.out.println("密碼正確,請輸入你的新密碼:"); String newPassword = sc.next(); lr.setPassword(newPassword); System.out.println("設置成功,請記住新密碼!"); break; } else { System.out.println("密碼錯誤,請重新選擇!"); } break; case "2": System.out.println("請輸入原密碼:"); String oldPassword1 = sc.next(); if (lr.getPassword().equals(oldPassword1)) { System.out.println("密碼正確,請輸入你的新用戶名:"); String newUserName = sc.next(); lr.setPassword(newUserName); System.out.println("設置成功!"); } else { System.out.println("密碼錯誤,請重新選擇!"); } break; case "3": System.out.println("請輸入原密碼:"); String oldPassword2 = sc.next(); if (lr.getPassword().equals(oldPassword2)) { System.out.println("密碼正確,請輸入你的新用戶名:"); String newUserName = sc.next(); lr.setPassword(newUserName); System.out.println("請輸入你的新密碼:"); String newPassword = sc.next(); lr.setPassword(newPassword); System.out.println("設置成功!"); } else { System.out.println("密碼錯誤,請重新選擇!"); } break; case "4": System.out.println("退出中"); TSUtility.loadSpecialEffects(); System.out.println("退出成功"); flag = false; break; default: System.out.println("輸入錯誤,請重新輸入!"); break; } } } }
當我們注冊完畢后,就要進入系統,進行我們的幾個操作。
1.完成開發人員的增刪改查。
2.完成將開發人員添加到開發團隊的操作,刪除,修改操作。
3.完成項目模塊, 將項目交給開發團隊進行開發的操作。以及項目的曾刪改查。
那么完成開發人員的增刪改查,根據我們的UML類圖設計來看,我們至少要完成九個類和一個接口的編寫。
通過將employee類,programmer類,designer類,architect類,這四個類是存在繼承關系的,目的是為了繼承父類的屬性。另有三個類,PC,notebook,printer,他們都實現了一個接口,equipment。這幾個類完成之后,我們就著手編寫NameListService類,這個類的功能主要是完成對我們的開發人員進行增刪改查的任務。
NamlistService類里面要注意的問題主要是開發人員的ID問題,要想開發人員的ID隨著我們的增加或者刪除而增加或者刪除,那么我們可以定義一個全局變量,去控制ID的變化。通過增加一個開發人員,我們設置他的ID自增,那么我們刪除的時候,從他刪除那個位置就開始,因為我們使用的集合來存儲開發人員,他的前一個元素被刪除之后,那么他的后一個元素就應該到被刪除的那個元素的位置,在集合當中的下標就會向前移動。我們要做的就是將該元素的ID相應的減一,那么就會用到循環去找到該下標對應的元素,然后去設置他的ID。示例代碼如下
boolean flag = false; for (int i = 0; i < employees.size(); i++) { if (id == employees.get(i).getId()) { System.out.println( "員工:"+ employees.get(i).getName() + "刪除成功!"); employees.remove(i); for (i = id; i <= employees.size(); i++) { //這個代碼表示,將我們第i個對象從集合中刪除之后,我們后一個元素的ID就應該相應的減一。 employees.get(i - 1).setId(employees.get(i - 1).getId() - 1); }
這個就需要結合集合的下標進行理解,大家可以自行畫一個圖輔助理解。
做完這個我們就需要做開發團隊的模塊,開發團隊模塊里面需要注意的就是數據互通的問題。
當我們做到這個部分的時候,進行測試時會發現一個問題,我們無法將我們之前namelist類里面修改過的數據拿過來用,一是因為我們重新創建對象的原因,導致數據發生變化,那么怎么去杜絕此類情況發生呢?有兩種解決方案:
一:我們可以把我們需要使用到NameListService類里面的數據的方法的參數改成NameListService類的對象,這樣就不會導致我們去創建對象導致數據發生改變。
實例:
public ArrayList<ArrayList<Programmer>> getManyTeam(NameListService nls) throws TeamException {
二:我們可以將NameListService類中的存放開發人員的集合改為靜態修飾,那么他的數據就可以共享,當我們這么做了之后,會發現我們測試時他將我們代碼塊中的內容打印了一遍,又將我們修改好的集合中的內容打印了一遍,這樣就不符合我們的要求,這是因為,類加載的時候,會默認打印一遍代碼塊的內容,那么我們可以對代碼塊的內容進行一個判斷,判斷我們存放開發人員的集合是否為空,如果為空,才打印代碼塊的內容,如果不為空,就打印集合內容。
實例:
{ /* if (employees.isEmpty()) { }*/ 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)); }
項目模塊需要注意的就是項目的添加問題,需要去做個判斷,不能比如項目中沒有團隊,而你卻添加了。
四、總結
完成這個開發項目,對于新手來說,確實有難度,但是只要去花時間,還是能夠完成的。
接下來我分享一下我在這個項目中的所得以及經驗。
首先,拿到這個項目之前應該先熟悉流程,理清楚他的邏輯,厘清各個模塊之間的關系,再去完成各個模塊的內容,因為我們用到的是面向對象的知識,那我們更應該好好地理清各個類之間的關系,繼承,實現等等。
完成每一個模塊,一定要做好測試,把能找出來的bug盡量找出來,不然等到最后做主控模塊來找bug能讓你抓狂。
完成這個項目之后,你會對面向對象的知識加一步認知,并且越來越熟悉面向對象的各種特性。以及我們之前學過的各種小知識的查漏補缺。
以上便是我對這個項目的理解。歡迎大家討論,不足之處,還請見諒,代碼如下:
鏈接:https://pan.baidu.com/s/1SRiTPgvxSC-ytUDfX00k5w
提取碼:8bfk
到此這篇關于Java練手小項目實現一個項目管理系統的文章就介紹到這了,更多相關Java 項目管理系統內容請搜索云海天教程以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持云海天教程!
原文鏈接:https://blog.csdn.net/ww166955/article/details/120536535