Java練手小項(xiàng)目實(shí)現(xiàn)一個(gè)項(xiàng)目管理系統(tǒng)
前言:
時(shí)隔多日,我們學(xué)習(xí)完java的面向?qū)ο箅A段,畢竟需要付諸實(shí)踐,這個(gè)小項(xiàng)目就 作為我們第一個(gè)java面向?qū)ο蠼鉀Q的項(xiàng)目,接下來(lái)就讓我們一起進(jìn)入項(xiàng)目的世界吧
一、項(xiàng)目需求
• 模擬實(shí)現(xiàn)一個(gè)基于文本界面的 《 項(xiàng)目開發(fā)團(tuán)隊(duì)分配管理軟件 》
• 熟悉 Java 面向?qū)ο蟮母呒?jí)特性,進(jìn)一步掌握編程技巧和調(diào)試技巧
•主要涉及以下知識(shí)點(diǎn):
Ø 類的繼承性和多態(tài)性
Ø 對(duì)象的值傳遞、接口
Ø static 和 final 修飾符
Ø 特殊類的使用:包裝類、抽象類、內(nèi)部類
Ø 異常處理
Ø Java 基本語(yǔ)法和流程控制
Ø 數(shù)組, ArrayList 集合
二、功能實(shí)現(xiàn)
Ø 軟件啟動(dòng)時(shí),首先進(jìn)入登錄界面進(jìn)行注冊(cè)和登錄功能。
Ø 當(dāng)?shù)顷懗晒螅M(jìn)入菜單,首先就可以對(duì)開發(fā)人員賬戶和密碼進(jìn)行修改。
Ø 然后可以對(duì)開發(fā)人員進(jìn)行增刪改操作
Ø 人員添加成功后,根據(jù)菜單提示,基于現(xiàn)有的 公司成員 ,組建一個(gè) 開發(fā)團(tuán)隊(duì) 以開發(fā)一個(gè)新的項(xiàng)目。
Ø 組建過程包括將成員插入到團(tuán)隊(duì)中,或從團(tuán)隊(duì)中刪除某成員,還可以列出團(tuán)隊(duì)中現(xiàn)有成員的列表,開發(fā)團(tuán)隊(duì)成員包括架構(gòu)師、設(shè)計(jì)師和程序員。
Ø 團(tuán)隊(duì)組建成功,則可以進(jìn)入項(xiàng)目模塊,添加項(xiàng)目,分配開發(fā)團(tuán)隊(duì)進(jìn)行開發(fā)。
整個(gè)項(xiàng)目UML類圖。制作不標(biāo)準(zhǔn),見諒。
系統(tǒng)流程
三、具體模塊的實(shí)現(xiàn)
1.實(shí)現(xiàn)登陸模塊。
思路:要實(shí)現(xiàn)登陸模塊,我們首先應(yīng)該想到,我們平常登陸賬號(hào)都是輸入賬號(hào),密碼,匹配你之前注冊(cè)的賬號(hào)密碼即可登陸成功, 怎么做到我們輸入的賬號(hào)密碼和我們提前注冊(cè)的賬號(hào)密碼匹配呢,這里我們就要想到,我們輸入的賬號(hào)密碼都是字符串類型,既然是字符串,我們就可以使用String類的equals方法進(jìn)行匹配,匹配成功,則登陸成功。
那么,在我們的項(xiàng)目當(dāng)中,登陸之前我們是肯定要匹配他是否存在于我們的注冊(cè)賬號(hào)之中,如果存在,直接登陸, 如果不存在,我們應(yīng)該讓用戶先注冊(cè),當(dāng)然,也可以加一個(gè)隨機(jī)數(shù)組成的驗(yàn)證碼來(lái)進(jìn)一步強(qiáng)化我們的登陸模塊。
實(shí)例代碼
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 儲(chǔ)存賬號(hào)密碼的集合 * - LoadingAndRegister lr 賬號(hào)密碼類的對(duì)象 */ Scanner sc = new Scanner(System.in); private ArrayList<LoadingAndRegister> a = new ArrayList<LoadingAndRegister>(); private LoadingAndRegister lr = new LoadingAndRegister(); /** * 注冊(cè)方法 * @throws InterruptedException */ public void loginAccount() throws InterruptedException { TSUtility.loadSpecialEffects(); System.out.println("開始注冊(cè):"); System.out.println("請(qǐng)輸入你的注冊(cè)賬戶名稱:"); String loginUserName = TSUtility.readKeyBoard(6, false); lr.setUser(loginUserName); System.out.println("請(qǐng)輸入你的登陸密碼:"); String loginPassword = TSUtility.readKeyBoard(8, false); lr.setPassword(loginPassword); a.add(lr); System.out.println("注冊(cè)成功,請(qǐng)登陸!"); } /** * 登陸方法 * @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("請(qǐng)輸入你的登陸賬戶名稱:"); String userName = sc.next(); System.out.println("請(qǐng)輸入你的登陸密碼:"); String password = sc.next(); //未注冊(cè) if (lr.getUser() == null || lr.getPassword() == null) { System.out.println("未檢測(cè)到您的賬號(hào),請(qǐng)先注冊(cè)!"); 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("你的賬戶已被鎖定,已強(qiáng)制退出!"); System.exit(0); } else { count--; System.out.println("登陸失??!用戶名或密碼不匹配,你還有" + (count) + "次機(jī)會(huì)!\n請(qǐng)重新登陸:"); } } } } /** * 修改用戶信息方法 * @throws InterruptedException */ public void updateAccount() throws InterruptedException { boolean flag = true; while (flag) { System.out.println("=====請(qǐng)選擇功能====="); System.out.println("1、修改密碼"); System.out.println("2、修改用戶名"); System.out.println("3、修改用戶名和密碼"); System.out.println("4、不修改,退出"); System.out.println("==================="); System.out.print("請(qǐng)選擇:"); char c = TSUtility.readMenuSelection(); TSUtility.loadSpecialEffects(); switch (c) { case '1': System.out.println("請(qǐng)輸入原密碼:"); String oldPassword = sc.next(); if (lr.getPassword().equals(oldPassword)) { System.out.println("密碼正確,請(qǐng)輸入你的新密碼:"); String newPassword = sc.next(); lr.setPassword(newPassword); System.out.println("設(shè)置成功,請(qǐng)記住新密碼!"); break; } else { System.out.println("密碼錯(cuò)誤,請(qǐng)重新選擇!"); } break; case '2': System.out.println("請(qǐng)輸入原密碼:"); String oldPassword1 = sc.next(); if (lr.getPassword().equals(oldPassword1)) { System.out.println("密碼正確,請(qǐng)輸入你的新用戶名:"); String newUserName = sc.next(); lr.setPassword(newUserName); System.out.println("設(shè)置成功!"); } else { System.out.println("密碼錯(cuò)誤,請(qǐng)重新選擇!"); } break; case '3': System.out.println("請(qǐng)輸入原密碼:"); String oldPassword2 = sc.next(); if (lr.getPassword().equals(oldPassword2)) { System.out.println("密碼正確,請(qǐng)輸入你的新用戶名:"); String newUserName = sc.next(); lr.setPassword(newUserName); System.out.println("請(qǐng)輸入你的新密碼:"); String newPassword = sc.next(); lr.setPassword(newPassword); System.out.println("設(shè)置成功!"); } else { System.out.println("密碼錯(cuò)誤,請(qǐng)重新選擇!"); } break; case '4': System.out.println("退出中"); TSUtility.loadSpecialEffects(); System.out.println("退出成功"); flag = false; break; default: System.out.println("輸入錯(cuò)誤,請(qǐng)重新輸入!"); break; } } } }
當(dāng)我們注冊(cè)完畢后,就要進(jìn)入系統(tǒng),進(jìn)行我們的幾個(gè)操作。
1.完成開發(fā)人員的增刪改查。
2.完成將開發(fā)人員添加到開發(fā)團(tuán)隊(duì)的操作,刪除,修改操作。
3.完成項(xiàng)目模塊, 將項(xiàng)目交給開發(fā)團(tuán)隊(duì)進(jìn)行開發(fā)的操作。以及項(xiàng)目的曾刪改查。
那么完成開發(fā)人員的增刪改查,根據(jù)我們的UML類圖設(shè)計(jì)來(lái)看,我們至少要完成九個(gè)類和一個(gè)接口的編寫。
通過將employee類,programmer類,designer類,architect類,這四個(gè)類是存在繼承關(guān)系的,目的是為了繼承父類的屬性。另有三個(gè)類,PC,notebook,printer,他們都實(shí)現(xiàn)了一個(gè)接口,equipment。這幾個(gè)類完成之后,我們就著手編寫NameListService類,這個(gè)類的功能主要是完成對(duì)我們的開發(fā)人員進(jìn)行增刪改查的任務(wù)。
NamlistService類里面要注意的問題主要是開發(fā)人員的ID問題,要想開發(fā)人員的ID隨著我們的增加或者刪除而增加或者刪除,那么我們可以定義一個(gè)全局變量,去控制ID的變化。通過增加一個(gè)開發(fā)人員,我們?cè)O(shè)置他的ID自增,那么我們刪除的時(shí)候,從他刪除那個(gè)位置就開始,因?yàn)槲覀兪褂玫募蟻?lái)存儲(chǔ)開發(fā)人員,他的前一個(gè)元素被刪除之后,那么他的后一個(gè)元素就應(yīng)該到被刪除的那個(gè)元素的位置,在集合當(dāng)中的下標(biāo)就會(huì)向前移動(dòng)。我們要做的就是將該元素的ID相應(yīng)的減一,那么就會(huì)用到循環(huán)去找到該下標(biāo)對(duì)應(yīng)的元素,然后去設(shè)置他的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++) { //這個(gè)代碼表示,將我們第i個(gè)對(duì)象從集合中刪除之后,我們后一個(gè)元素的ID就應(yīng)該相應(yīng)的減一。 employees.get(i - 1).setId(employees.get(i - 1).getId() - 1); }
這個(gè)就需要結(jié)合集合的下標(biāo)進(jìn)行理解,大家可以自行畫一個(gè)圖輔助理解。
做完這個(gè)我們就需要做開發(fā)團(tuán)隊(duì)的模塊,開發(fā)團(tuán)隊(duì)模塊里面需要注意的就是數(shù)據(jù)互通的問題。
當(dāng)我們做到這個(gè)部分的時(shí)候,進(jìn)行測(cè)試時(shí)會(huì)發(fā)現(xiàn)一個(gè)問題,我們無(wú)法將我們之前namelist類里面修改過的數(shù)據(jù)拿過來(lái)用,一是因?yàn)槲覀冎匦聞?chuàng)建對(duì)象的原因,導(dǎo)致數(shù)據(jù)發(fā)生變化,那么怎么去杜絕此類情況發(fā)生呢?有兩種解決方案:
一:我們可以把我們需要使用到NameListService類里面的數(shù)據(jù)的方法的參數(shù)改成NameListService類的對(duì)象,這樣就不會(huì)導(dǎo)致我們?nèi)?chuàng)建對(duì)象導(dǎo)致數(shù)據(jù)發(fā)生改變。
實(shí)例:
public ArrayList<ArrayList<Programmer>> getManyTeam(NameListService nls) throws TeamException {
二:我們可以將NameListService類中的存放開發(fā)人員的集合改為靜態(tài)修飾,那么他的數(shù)據(jù)就可以共享,當(dāng)我們這么做了之后,會(huì)發(fā)現(xiàn)我們測(cè)試時(shí)他將我們代碼塊中的內(nèi)容打印了一遍,又將我們修改好的集合中的內(nèi)容打印了一遍,這樣就不符合我們的要求,這是因?yàn)?,類加載的時(shí)候,會(huì)默認(rèn)打印一遍代碼塊的內(nèi)容,那么我們可以對(duì)代碼塊的內(nèi)容進(jìn)行一個(gè)判斷,判斷我們存放開發(fā)人員的集合是否為空,如果為空,才打印代碼塊的內(nèi)容,如果不為空,就打印集合內(nèi)容。
實(shí)例:
{ /* if (employees.isEmpty()) { }*/ employees.add(new Employee(count, "馬云 ", 22, 3000)); employees.add(new Architect(++count, "馬化騰", 32, 18000, new NoteBook("聯(lián)想T4", 6000), 60000, 5000)); employees.add(new Programmer(++count, "李彥宏", 23, 7000, new PC("戴爾", "NEC 17寸"))); employees.add(new Programmer(++count, "劉強(qiáng)東", 24, 7300, new PC("戴爾", "三星 17寸"))); employees.add(new Designer(++count, "雷軍 ", 50, 10000, new Printer("激光", "佳能2900"), 5000)); employees.add(new Programmer(++count, "任志強(qiáng)", 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, "張朝陽(yáng) ", 35, 7100, new PC("華碩", "三星 17寸"))); employees.add(new Designer(++count, "楊致遠(yuǎn)", 38, 9600, new NoteBook("惠普m6", 5800), 3000)); }
項(xiàng)目模塊需要注意的就是項(xiàng)目的添加問題,需要去做個(gè)判斷,不能比如項(xiàng)目中沒有團(tuán)隊(duì),而你卻添加了。
四、總結(jié)
完成這個(gè)開發(fā)項(xiàng)目,對(duì)于新手來(lái)說,確實(shí)有難度,但是只要去花時(shí)間,還是能夠完成的。
接下來(lái)我分享一下我在這個(gè)項(xiàng)目中的所得以及經(jīng)驗(yàn)。
首先,拿到這個(gè)項(xiàng)目之前應(yīng)該先熟悉流程,理清楚他的邏輯,厘清各個(gè)模塊之間的關(guān)系,再去完成各個(gè)模塊的內(nèi)容,因?yàn)槲覀冇玫降氖敲嫦驅(qū)ο蟮闹R(shí),那我們更應(yīng)該好好地理清各個(gè)類之間的關(guān)系,繼承,實(shí)現(xiàn)等等。
完成每一個(gè)模塊,一定要做好測(cè)試,把能找出來(lái)的bug盡量找出來(lái),不然等到最后做主控模塊來(lái)找bug能讓你抓狂。
完成這個(gè)項(xiàng)目之后,你會(huì)對(duì)面向?qū)ο蟮闹R(shí)加一步認(rèn)知,并且越來(lái)越熟悉面向?qū)ο蟮母鞣N特性。以及我們之前學(xué)過的各種小知識(shí)的查漏補(bǔ)缺。
以上便是我對(duì)這個(gè)項(xiàng)目的理解。歡迎大家討論,不足之處,還請(qǐng)見諒,代碼如下:
鏈接:https://pan.baidu.com/s/1SRiTPgvxSC-ytUDfX00k5w
提取碼:8bfk
到此這篇關(guān)于Java練手小項(xiàng)目實(shí)現(xiàn)一個(gè)項(xiàng)目管理系統(tǒng)的文章就介紹到這了,更多相關(guān)Java 項(xiàng)目管理系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java 實(shí)戰(zhàn)項(xiàng)目之疫情防控管理系統(tǒng)詳解
- Java 實(shí)現(xiàn)完整功能的學(xué)生管理系統(tǒng)實(shí)例
- Java實(shí)現(xiàn)通訊錄管理系統(tǒng)項(xiàng)目
- JAVA實(shí)現(xiàn)圖書管理系統(tǒng)項(xiàng)目
- java基于jdbc實(shí)現(xiàn)簡(jiǎn)單學(xué)生管理系統(tǒng)
- JAVA實(shí)戰(zhàn)練習(xí)之圖書管理系統(tǒng)實(shí)現(xiàn)流程
- Java 實(shí)戰(zhàn)項(xiàng)目之疫情人員流動(dòng)管理系統(tǒng)詳解
相關(guān)文章
Java 實(shí)現(xiàn)倒計(jì)時(shí)功能(由秒計(jì)算天、小時(shí)、分鐘、秒)
最近做項(xiàng)目遇到這樣的需求,天、小時(shí)、分鐘、秒的數(shù)值都是隔開的,服務(wù)器端只返回一個(gè)時(shí)間戳長(zhǎng)度,怎么實(shí)現(xiàn)這樣的功能呢?下面小編給大家?guī)?lái)了Java 實(shí)現(xiàn)倒計(jì)時(shí)功能的方案,需要的朋友參考下吧2018-01-01減少代碼開發(fā)工作的Java庫(kù)lombok及注解的使用學(xué)習(xí)
不久前發(fā)現(xiàn)有一個(gè)java第三方庫(kù)可以在一定程度上幫助我們從體力勞動(dòng)中解救出來(lái),它就是lombok。它提供了一些簡(jiǎn)單的注解,并以此來(lái)消除java中臃腫的模版代碼。本文對(duì)于一些常用到的注解做了一個(gè)簡(jiǎn)要的記錄,希望有更多的人enjoy it2022-07-07Java中三種零拷貝的實(shí)現(xiàn)示例以及對(duì)比詳解
這篇文章主要介紹了Java中三種零拷貝的實(shí)現(xiàn)示例以及對(duì)比詳解,本文主要是介紹幾種零拷貝的實(shí)現(xiàn)示例,以及與最傳統(tǒng)的做一個(gè)對(duì)比,看看在效率上到底有多大的提升,需要的朋友可以參考下2023-12-12Java使用dom4j實(shí)現(xiàn)對(duì)xml簡(jiǎn)單的增刪改查操作示例
這篇文章主要介紹了Java使用dom4j實(shí)現(xiàn)對(duì)xml簡(jiǎn)單的增刪改查操作,結(jié)合實(shí)例形式詳細(xì)分析了Java使用dom4j實(shí)現(xiàn)對(duì)xml簡(jiǎn)單的增刪改查基本操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2020-05-05Java編程基于快速排序的三個(gè)算法題實(shí)例代碼
這篇文章主要介紹了Java編程基于快速排序的三個(gè)算法題實(shí)例代碼,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01