项目结构框架
项目大概组成框架如下↘️:
本次项目是在学习了面向对象应用的基础上完成的,所有主要涉及到了以下知识点📃:
- 类的继承性和多态性
- 对象的值传递、接口
- static和final修饰符
- 特殊类的使用:包装类、抽象类、内部类
- 异常处理
- java基本语法和流程控制
- 数组,ArraList集合
系统流程及实现功能图
系统整体流程图如下👇👇👇
1. 软件启动时,首先进入登录界面进行注册和登录功能
2. 当登录成功后,进入菜单,可以对开发人员和密码进行修改
3. 对开发人员进行增加、删除、修改操作
4. 人员添加成功后,根据菜单提示,基于现有的公司成员,组建开发团队
5. 组建过程包括将成员插入到团队中,或从团队中删除某成员,还可以列出团队中现有成员的列表,开发团队成员包括架构师、设计师和程序员。
6. 团队组建成功,则可以进入项目模块,添加项目,分配开发团队进行开发
软件的构成
软件主要由view主控模块、service实体对象的管理模块及用于存放其他子类的domain模块构成
各个模块中包和类的创建分配如↘️图所示:
注册登录模块
📁先定义一个LoginView类可实现以下功能:
1️⃣实现注册方法
如果没有账户则需要注册 ,如果有账号则直接进行登录
2️⃣实现登录功能
判断用户输入的值是否正确,如果正确则进入软件菜单,如果错误则重新输入,限制次数只有5次,超过次数则程序停止,重新启动
用户登录页面,调用enroll注册账户和login登录方法:
public void menuLV() throws InterruptedException {
System.out.println(" ");
System.out.println("————————用户登录页面————————");
System.out.println(" ");
System.out.println(" 1、注册账户 ");
System.out.println(" 2、登 录 ");
System.out.println(" ");
System.out.println(" 请选择你要执行的操作: ");
char line = TSUtility.readMenuSelection1();
switch (line) {
case '1':
enroll();
break;
case '2':
login();
break;
}
}
注册账户程序👇:
public void enroll() throws InterruptedException {
Scanner sc = new Scanner(System.in);
System.out.println("请输入注册账户名:");
String account = TSUtility.readKeyBoard(4, false);
this.account = account;
System.out.println("请输入注册密码:");
String password = TSUtility.readKeyBoard(5, false);
this.password = password;
TSUtility.loadSpecialEffects();
System.out.println("注册成功!");
menuLV();
}
登录程序👇:
public void login() throws InterruptedException {
int frequency = 5;//剩余次数
boolean flag = true;
while (flag) {
System.out.println("请输入您的账户名:");
String account = TSUtility.readKeyBoard(4, false);
System.out.println("请输入登录密码:");
String password = TSUtility.readKeyBoard(6, false);
if (this.password.length() == 0 && this.account.length() == 0) {
System.out.println("账户不存在,请先注册");
menuLV();
break;
} else if (this.password.equals(password) && this.account.equals(account)) {
TSUtility.loadSpecialEffects();
System.out.println("登录成功!");
flag = false;
} else if (frequency <= 0) {
System.out.println("今日登录次数已达上限!");
System.exit(1);
} else {
frequency--;
System.out.println("登录失败账户名或密码不匹配!");
System.out.println("您还有:" + (frequency + 1) + "次机会,请重新输入:");
}
}
}
注册登录完成后进入主菜单:
————————————主菜单—————————————
1、用户信息修改
2、开发人员管理
3、开发团队管理
4、开发项目管理
5、退出系统
请选择你要执行的操作:
选择用户信息修改选项可实现以下操作功能:
——————————修改页面——————————
请选择您需要修改的内容:
1、 用户名修改
2、登录密码修改
3、用户名和密码修改
4、退出!
请选择你要执行的操作:
开发人员管理模块
这个模块是在NameListService类中完成功能操作的,在创建NameListService类之前要先完成实体类的创建,主要包含以下实体类:
各个实体类之间的继承关系图⬇️:
各个实体类的设计
Equipment接口和实现子类的设计
说明🔈:
model 表示机器的型号
display 表示显示器名称
type 表示机器的类型
根据需要提供各属性的get/set方法以及重载构造器
实现类实现接口的方法,返回各自属性的信息
Employee类及其子类的设计
说明🔈:
memberId 用来记录成员加入开发团队后在团队中的ID
Status是项目中人员的状态,先赋值为true,当添加到团队时为false
equipment 表示该成员领用的设备
bonus 表示奖金
stock 表示公司奖励的股票数量
可根据需要为类提供各属性的get/set方法以及重载构造器
NameListService类的设计
getAllEmployees()方法:获取当前所有员工,返回包含所有员工的集合
public ArrayList<Employee> getAllEmployees() {
return employees;
}
getEmployee(int id),得到指定id的员工,没有则抛出自定义的异常。
public Employee getEmployee(int id) throws TeamException {
for (int i = 0; i < employees.size(); i++) {
if (employees.get(i).getId() == id) {
return employees.get(i);
}
}
throw new TeamException("该员工不存在");
}
NameListService类主要实现:
员工的添加(根据职业添加(无,程序员,设计师,架构师))
员工的修改(至少修改员工的姓名,年龄,工资)
员工的删除(注意员工id需要动态显示,也就是删除后,员工id需要更新)
员工的查看 (显示所有数据)
————————————开发人员管理模块——————————
1、开发人员的添加
2、开发人员的修改
3、开发人员的查看
4、开发人员的删除
5、退 出(Y/N)
请选择你要执行的操作:
还需在原有的基础上添加以下方法
在service子包下提供自定义异常类TeamException
public class TeamException extends Throwable {
public TeamException() {
}
public TeamException(String message) {
super(message);
}
}
开发团队调度管理模块
TeamView类的设计:
说明🔈:
listSvc和teamSvc属性:供类中的方法使用
enterMainMenu ()方法:主界面显示及控制方法。
以下方法仅供enterMainMenu()方法调用:
listAllEmployees ()方法:以表格形式列出公司所有成员
getTeam()方法:显示团队成员列表操作
addMember ()方法:实现添加成员操作
deleteMember ()方法:实现删除成员操作
TeamService类的设计:
getTeam()方法返回当前团队的所有对象,包含所有成员对象的数组,数组大小与成员人数一致
public Programmer[] getTeam() {
Programmer[] team = new Programmer[total];
for (int i = 0; i < total; i++) {
team[i] = this.team[i];
}
return team;
}
addMember(e: Employee)方法:向团队中添加成员
参数:待添加成员的对象
异常:添加失败, TeamException中包含了失败原因
//向团队中添加成员
public void addMember(Employee e) throws TeamException {
if (total >= MAX_MEMBER) {
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 numOfArch = 0, numOfDsgn = 0, numOfPrg = 0;
for (int i = 0; i < total; i++) {
if (team[i] instanceof Architect) {
numOfArch++;
} else if (team[i] instanceof Designer) {
numOfDsgn++;
} else if (team[i] instanceof Programmer) {
numOfPrg++;
}
}
if (p instanceof Architect) {
if (numOfArch >= 1) {
throw new TeamException("团队中至多只能有一名架构师");
}
} else if (p instanceof Designer) {
if (numOfDsgn >= 2) {
throw new TeamException("团队中至多只能有两名设计师");
}
} else if (p instanceof Programmer) {
if (numOfPrg >= 3) {
throw new TeamException("团队中至多只能有三名程序员");
}
}
//添加到数组
p.setStatus(false);
p.setMemberld(counter++);
team[total++] = p;
}
removeMember(memberId: int)方法:从团队中删除成员
参数:待删除成员的memberId
异常:找不到指定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);
break;
}
}
//如果遍历一遍,都找不到,则报异常
if (n == total)
throw new TeamException("找不到该成员,无法删除");
//后面的元素覆盖前面的元素
for (int i = n + 1; i < total; i++) {
team[i - 1] = team[i];
}
team[--total] = null;
}
这个模块主要实现以下操作:
————————————————————————开发团队调度管理——————————————————————————
1-添加团队
2-查看团队
3-删除团队
4-退 出
请选择你需要执行的操作:
1
-------------------------------开发团队调度软件--------------------------------
ID 姓名 年龄 工资 职位 状态 奖金 股票 领用设备
1 小张 25 5000.0
2 富贵 30 5500.0 程序员 true 华硕(三星 17寸)
3 小陈 45 4500.0 设计师 true 2000.0 惠普m6(5800.0)
4 小唐 50 7000.0 架构师 true 2000.0 5000 戴尔(三星 17寸)
5 老王 36 12000.0 设计师 true 2000.0 华硕(三星 17寸)
6 招财 34 14000.0 程序员 true 激光(5800.0)
7 钱多多 27 15300.0 设计师 true 1000.0 联想(4000)
8 翠花 30 5500.0 程序员 true 华硕(三星 17寸)
9 小赵 50 7000.0 架构师 true 2000.0 5000 戴尔(三星 17寸)
-------------------------------------------------------------------------------
——————————————————————————————————————————————————————————
1-添加团队成员
2-团队成员列表
3-删除团队成员
4-退出当前页面
请选择你需要执行的操作:
创建团队需要抛出的自定义异常:
成员已满,无法添加
该成员不是开发人员,无法添加
该员工已在本开发团队中
该员工已是某团队成员
团队中至多只能有一名架构师(以下判断可借用instanceof进行判断)
团队中至多只能有两名设计师
团队中至多只能有三名程序员
开发项目管理模块
在domain包中创建一个Project实体类:
在service包中创建项目操作类ProjectService:
软件主页面调用各模块
在view包中编写项目程序运行主界面类lindexView,并调用前面四个模块对应的方法,并完成调试,部分代码如下:
public class indexView {
LoginView loginView = new LoginView();
NameListService nameListService = new NameListService();
ProjectService projectService = new ProjectService();
TeamView teamView = new TeamView();
private ArrayList<Programmer[]> manyTeam = null;//存储开发团队,初始值为空
public static void main(String[] args) throws Exception, TeamException {
new indexView().screen();
}
boolean flag = true;
public void screen() throws Exception, TeamException {
System.out.println("********************************************");
System.out.println(" ");
System.out.println(" ");
System.out.println("————————————项目开发团队分配管理软件———————————— ");
System.out.println(" ");
System.out.println(" ");
System.out.println("********************************************");
TSUtility.readReturn();
loginView.menuLV();//注册登录页面
do {
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(" ");
System.out.println(" 请选择你要执行的操作: ");
char c = TSUtility.readMenuSelectionPro();
switch (c) {
case '1':
loginView.revise();//用户信息修改
break;
case '2':
nameListService.exploitationNS();//开发人员管理
break;
case '3':
manyTeam = teamView.getManyTeam();//开发团队调度管理,将创建的团队存入集合
break;
case '4':
projectPS();//开发项目管理
break;
case '5':
System.out.println("确认是否退出(Y/N):");
char d = TSUtility.readConfirmSelection();
if (d == 'Y') {
loginView.menuLV();//退出
} else if (d == 'N') {
break;
}
}
} while (flag);
}