欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java練手小項(xiàng)目實(shí)現(xiàn)一個(gè)項(xiàng)目管理系統(tǒng)

 更新時(shí)間:2021年10月21日 15:00:08   作者:空山新雨后~  
讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)項(xiàng)目管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平

前言:

時(shí)隔多日,我們學(xué)習(xí)完java的面向?qū)ο箅A段,畢竟需要付諸實(shí)踐,這個(gè)小項(xiàng)目就 作為我們第一個(gè)java面向?qū)ο蠼鉀Q的項(xiàng)目,接下來(lái)就讓我們一起進(jìn)入項(xiàng)目的世界吧

我來(lái)了

一、項(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java 實(shí)現(xiàn)倒計(jì)時(shí)功能(由秒計(jì)算天、小時(shí)、分鐘、秒)

    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ā)工作的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 it
    2022-07-07
  • Java中三種零拷貝的實(shí)現(xiàn)示例以及對(duì)比詳解

    Java中三種零拷貝的實(shí)現(xiàn)示例以及對(duì)比詳解

    這篇文章主要介紹了Java中三種零拷貝的實(shí)現(xiàn)示例以及對(duì)比詳解,本文主要是介紹幾種零拷貝的實(shí)現(xiàn)示例,以及與最傳統(tǒng)的做一個(gè)對(duì)比,看看在效率上到底有多大的提升,需要的朋友可以參考下
    2023-12-12
  • Java使用dom4j實(shí)現(xiàn)對(duì)xml簡(jiǎn)單的增刪改查操作示例

    Java使用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-05
  • Java設(shè)計(jì)模式之中介模式

    Java設(shè)計(jì)模式之中介模式

    這篇文章主要介紹了Java設(shè)計(jì)模式之中介模式,中介模式(Mediator?Pattern),屬于行為型設(shè)計(jì)模式,目的是把系統(tǒng)中對(duì)象之間的調(diào)用關(guān)系從一對(duì)多轉(zhuǎn)變成一對(duì)一的調(diào)用關(guān)系,以此來(lái)降低多個(gè)對(duì)象和類之間的通信復(fù)雜性,需要的朋友可以參考下
    2023-12-12
  • 使用HTTPclient保持長(zhǎng)連接

    使用HTTPclient保持長(zhǎng)連接

    這篇文章主要介紹了使用HTTPclient保持長(zhǎng)連接,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • JedisPool資源池優(yōu)化方法

    JedisPool資源池優(yōu)化方法

    這篇文章主要介紹了JedisPool資源池優(yōu)化方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2018-03-03
  • Java編程基于快速排序的三個(gè)算法題實(shí)例代碼

    Java編程基于快速排序的三個(gè)算法題實(shí)例代碼

    這篇文章主要介紹了Java編程基于快速排序的三個(gè)算法題實(shí)例代碼,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 簡(jiǎn)單聊聊Java程序中的換行符

    簡(jiǎn)單聊聊Java程序中的換行符

    Java程序中的換行符一般使用“\n”表示,它是一個(gè)轉(zhuǎn)義字符,表示換行符。根據(jù)操作系統(tǒng)的不同,換行符的實(shí)際表示可能不同,本文就來(lái)簡(jiǎn)單聊聊他們的區(qū)別與使用吧
    2023-03-03
  • Java 字符終端上獲取輸入三種的方式分享

    Java 字符終端上獲取輸入三種的方式分享

    這篇文章主要介紹了Java 字符終端上獲取輸入三種的方式,有需要的朋友可以參考一下
    2013-11-11

最新評(píng)論