Java练手小项目实现一个项目管理系统

目录
  • 前言:
  • 一、项目需求
  • 二、功能实现
  • 三、具体模块的实现
  • 四、总结

前言:

时隔多日,我们学习完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) + "次机会!\n请重新登陆:");
                }
            }
        }
    }

    /**
     * 修改用户信息方法
     * @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 项目管理系统内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java实现简易外卖订餐系统

    用java实现简易外卖订餐系统,供大家参考,具体内容如下 一.使用技术 javaSE 二.实现功能 外卖订餐系统 具体要求如下: 使用选择结构,循环结构,数组的知识实现一个外卖订餐系统 三.运行效果图 1.订餐功能 2.查看餐袋 3.签收订单 4.删除订单 5.点赞 6.退出 代码实现 public class Order { public static void main(String[] args) { int zero = 1; int x = 0;//订单数组下标 String[] na

  • JAVA实战项目实现客户选购系统详细流程

    客户选购信息系统功能需求: 1)输入多个客户购买商品信息.包括客户名称,年龄,购买的商品,每种商品的单价和数量. 2)输出多个客户购买商品的信息.包括客户名字,年龄,购买商品,每种商品的单价和数量,总的消费金额. 方法:1)定义一个多个客户信息处理的类 CustomerGoodsAdmin .包括: 属性: Customer [ ]customers 方法: void show () //用户交互界面 void inputCustomerlnfo () / /客户采购信息输入 Void prin

  • Java实现学生管理系统详解

    目录 总结 学生管理系统(Java版) 前言:这个是大二做的课设(还是学生管理系统-),理论上虽然是4个人一组一起做的,但是,注意这个"但是",还是我一个人承担了所有-代码和文档基本都是我一个人写的,当初直接肝得吐血,这也是为啥后面的 Web 版部分功能没有完成的原因. 项目介绍 项目分为一个JavaSwing写的GUI桌面应用和一个半成品的Web应用,下图是项目的整体功能结构展示 JavaSwing JavaSwing这里使用的是 MyBatis + Spring 的框架组合,后面发

  • Java开发实例之图书管理系统的实现

    目录 一.项目分布 二.代码展示 1.SQL语句 2.Book类 3.User类 4.用户分为两种 4.1NormalUser类 4.2Admin类 5.DBUtil类 6.BookDao类 7.UserDao类 8.operations包 8.1AddOperation类:增加书籍 8.2BorrowOperation类:借阅书籍 8.3DeleteOperation类:删除书籍 8.4DisplayOperation类:查看书籍列表 8.5ExitOperation类:退出系统 8.6Fin

  • JAVA实战练习之图书管理系统实现流程

    目录 前言 项目说明: 项目功能如下: 项目分析: (-)用户管理模块 (二)基本信息维护模块 读者管理模块 前言 长期以来,人们使用传统的人工方式管理图书馆的日常业务,其操作流程比较烦琐.在借书时,读者首先将要借的书和借阅证交给工作人员,然后工作人员将每本书的信息卡片和读者的借阅证放在一个小格栏里,最后在借阅证和每本书贴的借阅条上填写借阅信息.在还书时,读者首先将要还的书交给工作人员,工作人员根据图书信息找到相应的书卡和借阅证,并填好相应的还书信息.太过于繁琐了!所以,我们需求设计一个图书管理

  • Java练手小项目实现一个项目管理系统

    目录 前言: 一.项目需求 二.功能实现 三.具体模块的实现 四.总结 前言: 时隔多日,我们学习完java的面向对象阶段,毕竟需要付诸实践,这个小项目就 作为我们第一个java面向对象解决的项目,接下来就让我们一起进入项目的世界吧 一.项目需求 • 模拟实现一个基于文本界面的 < 项目开发团队分配管理软件 > • 熟悉 Java 面向对象的高级特性,进一步掌握编程技巧和调试技巧 •主要涉及以下知识点: Ø 类的继承性和多态性 Ø 对象的值传递.接口 Ø static 和 final 修饰符

  • Java超详细教你写一个学籍管理系统案例

    目录 前言 一.学籍管理系统功能介绍 1.介绍 2.学籍管理系统的主要功能图示 3.代码编写的思路 二.定义学生类 1.学生类名称: 2.包含的成员变量 3.构造方法 4.成员方法 5.代码示例 三.主界面的代码编写 1.思路 2.代码示例 四.系统功能方法的实现 1.添加学生信息的代码编写 1.1 思路 1.2 添加学生信息的方法说明图 1.3 代码示例 2.查看学生信息的代码编写 2.1 思路 2.2 查看学生信息的方法说明图 2.3 代码示例 3.删除学生信息的代码编写 3.1 思路 3.

  • Java 实战练手项目之医院预约挂号系统的实现流程

    一.项目简述 功能: 用户分为患者,医生,管理员,患者可进行注册选择医生 挂号,选择日期,选择号源,医生可进行接诊,管理员可 对用户,医生信息的维护等等功能. 二.项目运行 环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe (IntelliJ IDEA,Eclispe,MyEclispe,Sts 都支持) 项目技术: Jdbc+ Servlert + Jsp + css + JavaScript + JQuery + Ajax + Fileupload等等.

  • Java 实战练手项目之酒店管理系统的实现流程

    一.项目简述 功能包括(管理员和用户角色): 酒店预订,酒店管理,员工管理,入住原理,订单管理, 楼层管理,退房管理,营业额报表等等. 二.项目运行 环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe (IntelliJ IDEA,Eclispe,MyEclispe,Sts 都支持) 项目技术: JSP +Spring + SpringMVC + MyBatis + html+ css + JavaScript + JQuery + Ajax + layui+

  • Java 实战练手项目之校园超市管理系统的实现流程

    前端模板框架为Bootstrap,系统分为前台和后台.后台主要为管理员角色,功能有:商品类型管理.商品管理.订单管理.会员管理.管理员管理等.前台用户功能有:登录.注册.查看商品.加入购物车.付款.查看订单.个人中心等.该系统总共9张表 运行环境:windows/linux.jdk1.8.mysql5.x.maven3.5\3.6.tomcat7.0 前端商品控制器: /** * <p> * 前端控制器 * </p> */ @RestController @RequestMappi

  • Java 实战练手项目之医院预约挂号系统的实现流程

    一.项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持). 项目技术: Spring + SpringBoot+ mybatis + Maven + Vue 等等组成,B/S模式 + Maven管理等等. 后端管理员控制层: /** * 后端管理员控制层 */ @Controller @RequestMapping("/api&q

  • 新手易懂的Java客户管理小项目

    目录 成果展示 功能一:添加客户 功能二:修改客户 功能三:客户删除 功能四:展示客户列表 思路分析 代码部分 1.数据存储部分: 2.函数功能部分: 3.可视化界面部分: 项目总结 每日一语:花开蝶自来!!! 前言:随着我把狂神的Java的基础篇看完,我觉得我应该是把Java的基础应该没什么问题了,所以我决定找一个小项目写写,所以我就看了尚硅谷的基础小项目,不看不知道,一看吓一跳,我发现我虽然看完了基础的部分,但是我自己用起来还是有很多不足的地方,好在我请教了一些大佬们帮我解决这些问题,在这里

  • 详解50行代码,Node爬虫练手项目

    First 项目地址:Crawler-for-Github-Trending 项目中基本每一句代码都写有注释(因为就这么几行

  • 详解Java从后台重定向(redirect)到另一个项目的方法

    (1)通过ModelAndView跳转 @RequestMapping("alipayforward") public ModelAndView alipayforward(HttpServletRequest req, HttpServletResponse resp) throws Exception { String contNo =req.getParameter("contNo"); logger.info("访问/downloadRequest

  • 浅谈java项目与javaweb项目导入jar包的区别

    现在的项目基本上都是java web项目,所以导入jar包会出现问题,主要介绍一下java项目与javaweb项目的区别: java项目: 在classLoader加载jar和class的时候,是分开加载的,一般jar导入分两种: 1.在web-inf下的lib中直接引入 2.在user library上引入 无论以上哪种引入,jar包都能加载并且运行,classLoader会智能加载(本地JRE运行) javaweb项目: 不是通过本地的JRE运行的,而是部署到web服务器(比如tomcat,

随机推荐