目录
1. 项目需求:
2. 项目的结构图(mvc):
3.部分效果展示:
4. 项目的整体思路:
4.1 实体类及数据存储
4.2 界面类
4.3 服务类
5.项目代码及部分解释:
5.1 代码结构图:编辑
5.2 服务类核心代码:
6. 项目总结:
6.1 此项目主要涉及以下知识点:
6.2 遇到的问题及解决方案:
1. 项目需求:
1.软件启动时,首先进入登录界面进行注册和登录功能。
2.当登陆成功后,进入菜单,首先就可以对开发人员账户和密码进行修改。
3.然后可以对开发人员进行增删改操作
4.人员添加成功后,根据菜单提示,基于现有的公司成员,组建一个开发团队以开发一个新的项目。
5.组建过程包括将成员插入到团队中,或从团队中删除某成员,还可以列出团队中现有成员的列表,开发团队成员包括架构师、设计师和程序员。
6.团队组建成功,则可以进入项目模块,添加项目,分配开发团队进行开发。
2. 项目的结构图(mvc):
3.部分效果展示:
4. 项目的整体思路:
4.1 实体类及数据存储
项目中的开发成员是分为几个类别,普通员工、程序员、设计师和架构师。所以先要给这个几个开发成员创建好他们各自的类。他们共有的属性都是有名字、年龄、,然后对于非普通员工的成员是要为他们每个人分配设备的,设备又分为打印机、笔记本、电脑。所以我们又要定义三个设备的类。
数据存储则是分别为开发人员管理、团队管理、项目管理创建一个ArrayList集合,用来存储类的实体对象。
4.2 界面类
首先,我创建了一个用户登录的界面(LoginView),这个界面是进入主程序的唯一入口,验证用户登录成功,才会进入主程序的主页面(IndexView)。进入IndexView后,会有对应的选项,每个选项里都还嵌套了一个界面,而这几个页面都将其封装为几个类。
4.3 服务类
对于不同的界面页面分为不同的服务类,用于获取对用户的各种输入以及对程序的运行逻辑的制定和控制。
还有一个异常类。对某些获取异常进行抛出。
5.项目代码及部分解释:
5.1 代码结构图:
5.2 服务类核心代码:
package com.team.project1.service;
import com.team.project1.domain.*;
import com.team.project1.view.TSUtility;import java.util.ArrayList;public class EmployeeListService {//用来装员工的数据集合private ArrayList<Employee> employees = new ArrayList<>();//添加员工的idprivate int count = 1;//初始化默认值{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));}//得到所有员工数据集合public ArrayList<Employee> getAllEmployees() {return employees;}//得到当前员工//根据员工id返回此人的全部信息,没有找到则抛出自定义异常public Employee getEmployee(int id) throws EmployeeException {for (int i = 0; i < employees.size(); i++) {if (employees.get(i).getId() == id) {return employees.get(i);}}throw new EmployeeException("该员工不存在");}//员工的增加public void addEmployee() throws InterruptedException {System.out.println("--------------------------------");System.out.print("1(无职位) ");System.out.print("2(程序员) ");System.out.print("3(设计师) ");System.out.println("4(架构师)");System.out.println("请输入需要添加的雇员的职位:");String c = String.valueOf(TSUtility.readMenuSelection());if (c.equals("1")) {//无职位 new Employee(count++,"马云 ",22,3000)System.out.println("当前雇员职位分配为:无");System.out.println("--------------------------------");System.out.println("请输入当前雇员的姓名:");String name = TSUtility.readKeyBoard(4, false);System.out.println("请输入当前雇员的年龄:");int age = TSUtility.readInt();System.out.println("请输入当前雇员的工资:");Double salary = TSUtility.readDouble();Employee employee = new Employee(++count, name, age, salary);employees.add(employee);System.out.println("人员添加成功!");System.out.println("--------------------------------");TSUtility.readReturn();System.out.println();} else if (c.equals("2")) {//程序员 new Programmer(count++,"张朝阳 ",35,7100,new PC("华硕","三星 17寸"))System.out.println("当前雇员职位分配为:程序员");System.out.println("--------------------------------");System.out.println("请输入当前雇员的姓名:");String name = TSUtility.readKeyBoard(4, false);System.out.println("请输入当前雇员的年龄:");int age = TSUtility.readInt();System.out.println("请输入当前雇员的工资:");Double salary = TSUtility.readDouble();System.out.println("请为当前程序员配一台好的台式电脑:");PC pc = new PC().addPC();Programmer programmer = new Programmer(++count, name, age, salary, pc);employees.add(programmer);System.out.println("人员添加成功!");System.out.println("--------------------------------");TSUtility.readReturn();System.out.println();} else if (c.equals("3")) {//设计师 new Designer(count++,"史玉柱",27,7800,new NoteBook("惠普m6",5800),1500)System.out.println("当前雇员职位分配为:设计师");System.out.println("--------------------------------");System.out.println("请输入当前雇员的姓名:");String name = TSUtility.readKeyBoard(4, false);System.out.println("请输入当前雇员的年龄:");int age = TSUtility.readInt();System.out.println("请输入当前雇员的工资:");Double salary = TSUtility.readDouble();System.out.println("请为当前设计师配一台好的笔记本电脑:");NoteBook noteBook = new NoteBook().addNoteBook();System.out.println("请输入当前设计师的奖金:");Double bonus = TSUtility.readDouble();Designer designer = new Designer(++count, name, age, salary, noteBook, bonus);employees.add(designer);System.out.println("人员添加成功!");System.out.println("--------------------------------");TSUtility.readReturn();System.out.println();} else {//架构师 new Architect(count++,"杨元庆",35,6500,new Printer("针式","爱普生20k"),15500,1200)System.out.println("当前雇员职位分配为:架构师");System.out.println("--------------------------------");System.out.println("请输入当前雇员的姓名:");String name = TSUtility.readKeyBoard(4, false);System.out.println("请输入当前雇员的年龄:");int age = TSUtility.readInt();System.out.println("请输入当前雇员的工资:");Double salary = TSUtility.readDouble();System.out.println("请为当前架构师配一台好的打印设备:");Printer printer = new Printer().addPrinter();System.out.println("请输入当前架构师的奖金:");Double bonus = TSUtility.readDouble();System.out.println("请输入当前架构师的股票:");Integer stock = TSUtility.readstock();Architect architect = new Architect(++count, name, age, salary, printer, bonus, stock);employees.add(architect);System.out.println("人员添加成功!");System.out.println("--------------------------------");TSUtility.readReturn();System.out.println();}}//员工的删除public void delEmployee(int id) {boolean flag = false;for (int i = 0; i < employees.size(); i++) {if (employees.get(i).getId() == id) {employees.remove(i);for (i = id; i <= employees.size(); i++) {employees.get(i - 1).setId(employees.get(i - 1).getId() - 1);}flag = true;}}if (flag) {System.out.println("删除成功!");count--;System.out.println();} else {try {throw new EmployeeException("该员工不存在");} catch (EmployeeException e) {e.printStackTrace();}}}//员工的查看public void showEmployee() throws InterruptedException {System.out.println(" ----------------开发人员信息展示---------------- ");System.out.println("ID\t 姓名\t年龄\t 工资\t 职位\t 状态\t 奖金\t 股票\t 领用设备");for (int i = 0; i < employees.size(); i++) {System.out.println(" " + employees.get(i));System.out.println();}}//员工的修改 (目前只修改姓名,年龄,工资即可)public void modifyEmployee(int id) throws InterruptedException {boolean flag = false;for (int i = 0; i < employees.size(); i++) {Employee emp = employees.get(i);if (employees.get(i).getId() == id) {System.out.print("姓名(" + emp.getName() + "):");String name = TSUtility.readString(4, emp.getName());System.out.print("年龄(" + emp.getAge() + "):");int age = Integer.parseInt(TSUtility.readString(2,emp.getAge()+""));System.out.print("工资(" + emp.getSalary() + "):");double salary =Double.parseDouble(TSUtility.readString(10, emp.getSalary()+""));emp.setName(name);emp.setAge(age);emp.setSalary(salary);employees.set(i,emp);flag = true;}}if (flag) {System.out.println("修改成功!");System.out.println();} else {try {throw new EmployeeException("该员工不存在");} catch (EmployeeException e) {e.printStackTrace();System.out.println();}}}
}
5.2.2TeamListservice 类:
package com.team.project1.service;import com.team.project1.domain.*;
import com.team.project1.view.TSUtility;import java.util.ArrayList;import static com.team.project1.view.IndexView.ANSI_RESET;
import static com.team.project1.view.IndexView.ANSI_YELLOW;public class TeamListService {//用于自动生成团队Idprivate static int countId = 0;//团队人数int teamCount = 0;//团队是否满员boolean isFull = false;//创建集合存储每一个团队对象static ArrayList<Team> teams = new ArrayList<>();//每个团队人数最大值private final int MAX_MEMBER = 5;//用于自动生成团队成员的memberIdprivate int counter = 0;//创建Team对象Team team;//得到employ对象public EmployeeListService employeeList = new EmployeeListService();//查看团队列表public void showTeam() throws InterruptedException {if (teams.size() == 0) {System.out.println(" 还没有创建开发团队 ");System.out.print("是否创建?(Y/N)");char yn = TSUtility.readConfirmSelection();if (yn == 'Y') {addTeam();System.out.println();} else return;} else {System.out.println("----------------团队列表展示---------------- ");System.out.println("团队ID\t 团队名\t 当前人数\t 是否满员");for (int i = 0; i < teams.size(); i++) {System.out.println(" " + teams.get(i).getTeamId() + "\t " + teams.get(i).getTeamName() + " \t " + teams.get(i).getTeamSum() + "\t\t " + teams.get(i).isFull());System.out.println();}setTeam();}}//增加团队public void addTeam() throws InterruptedException {System.out.println("-------------创建团队-------------");System.out.println("请输入团队名称:");String teamName = TSUtility.readKeyBoard(8, false);Programmer[] program = new Programmer[0];//存放开发人员的数组定义为空数组team = new Team(++countId, teamName, teamCount, isFull, program);teams.add(team);System.out.println("团队创建成功!");System.out.println("--------------------------------");System.out.println();}//删除团队public void delTeam(int id) {boolean teamFlag = false;for (int i = 0; i < teams.size(); i++) {if (teams.get(i).getTeamId() == id) {teams.remove(i);for (i = id; i <= teams.size(); i++) {teams.get(i - 1).setTeamId(teams.get(i - 1).getTeamId() - 1);}teamFlag = true;}}if (teamFlag) {System.out.println("删除成功!");countId--;System.out.println();} else {try {throw new TeamException("该团队不存在");} catch (TeamException e) {e.printStackTrace();}}}//团队内部成员管理public void setTeam() {System.out.print("是否对团队进行管理?(Y/N)");char isTrue = TSUtility.readConfirmSelection();if (isTrue == 'Y') {System.out.println("请输入你要管理的团队ID");int ID = TSUtility.readInt();for (int i = 0; i < teams.size(); i++) {if (teams.get(i).getTeamId() == ID) {TeamMemberMenu(ID - 1);clearTeam();//每次退出管理内部人员菜单后初始化变量,避免另一个对象调用时变量不是初始值}}} else {System.out.println();return;}}//团队内部管理菜单public void TeamMemberMenu(int ID) {boolean loopFlagTeam = true;char keyTeam = 0;do {System.out.print(ANSI_RESET);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(ANSI_YELLOW);keyTeam = TSUtility.readMenuSelection();switch (keyTeam) {case '1': //查看团队列表try {showTeamMembers(ID);} catch (InterruptedException e) {e.printStackTrace();}break; //添加团队成员case '2':System.out.println("请输入需要添加的员工id:");int id = TSUtility.readInt();try {addProgrammerMember(employeeList.getEmployee(id), ID);} catch (TeamException e) {System.out.println(e);}break;case '3': //删除团队成员System.out.println("请输入需要删除的员工id:");int j = TSUtility.readInt();try {removeMember(j, ID);} catch (TeamException e) {System.out.println(e);}System.out.println("--------------------------------");break;case '4': //退出System.out.print("确认是否退出(Y/N):");char yn = TSUtility.readConfirmSelection();if (yn == 'Y') {loopFlagTeam = false;}break;default:System.out.println("输入有误!请重新输入!");break;}} while (loopFlagTeam);}//查看指定团队成员public void showTeamMembers(int ID) throws InterruptedException {if (teams.get(ID).getTeamMember().length == 0) {System.out.println(" 该开发团队还没有成员 ");System.out.println();} else {System.out.println("----------------开发团队成员列表---------------- ");System.out.println("ID\t 姓名\t年龄\t 工资\t 职位\t 状态\t 奖金\t 股票\t 领用设备");for (int j = 0; j < teams.get(ID).getTeamMember().length; j++) {if (teams.get(ID).getTeamMember()[j] != null) {System.out.println(teams.get(ID).getTeamMember()[j]);System.out.println();}}}}//为该团队添加成员public void addProgrammerMember(Employee employee, int ID) throws TeamException {if (teams.get(ID).getTeamSum() >= MAX_MEMBER) {teams.get(ID).setFull(true);throw new TeamException("成员已满,无法添加");}if (!(employee instanceof Programmer)) {throw new TeamException("该成员不是开发人员,无法添加");}//向下转型Programmer programmer = (Programmer) employee;if (isExist(programmer, ID)) {throw new TeamException("该员工已在本团队中");}if (!programmer.getStatus()) {throw new TeamException("该员工已是某团队成员");}int numOfArch = 0, numOfDsgn = 0, numOfPrg = 0;for (int i = 0; i < teams.get(ID).getTeamMember().length; i++) {if (teams.get(ID).getTeamMember()[i] instanceof Architect) { //架构师数量numOfArch++;} else if (teams.get(ID).getTeamMember()[i] instanceof Designer) { //设计师数量numOfDsgn++;} else if (teams.get(ID).getTeamMember()[i] instanceof Programmer) { //程序员数量numOfPrg++;}}if (programmer instanceof Architect) {if (numOfArch >= 1) {throw new TeamException("团队中至多只能有一名架构师");}} else if (programmer instanceof Designer) {if (numOfDsgn >= 2) {throw new TeamException("团队中至多只能有两名设计师");}} else if (programmer instanceof Programmer) {if (numOfPrg >= 3) {throw new TeamException("团队中至多只能有三名程序员");}}//添加到数组programmer.setId(++counter);programmer.setStatus(false);teams.get(ID).setTeamMember(addArr(teams.get(ID).getTeamMember()));//每次添加新开发成员之前对数组扩一次容teams.get(ID).getTeamMember()[teamCount++] = programmer;teams.get(ID).setTeamSum(teamCount);System.out.println("添加该成员进入团队成功");System.out.println();}/*定义一个方法声明一个新数组,新数组的行数在原数组的前提下+1,如果之前的数组里有数据,则把数据赋值给新数组*/public static Programmer[] addArr( Programmer[] programmer){Programmer[] programmer2 = new Programmer[programmer.length+1];if (programmer.length != 0){for (int i = 0; i < programmer.length; i++) {programmer2[i] = programmer[i];}}return programmer2;}//判断团队中是否已经有该成员private boolean isExist(Programmer programmer, int ID) {for (int i = 0; i < teams.get(ID).getTeamMember().length; i++) {if (teams.get(ID).getTeamMember()[i] != null) {if (teams.get(ID).getTeamMember()[i].getId() == programmer.getId()) return true;}}return false;}//删除该团队中指定memberId的程序员public void removeMember(int memberId, int ID) throws TeamException {int n = 0;//找到指定memberId的员工,并删除for (; n < teams.get(ID).getTeamMember().length; n++) {if (teams.get(ID).getTeamMember()[n].getMemberId() == memberId) {teams.get(ID).getTeamMember()[n].setStatus(true);break;}}//如果遍历一遍,都找不到,则报异常if (n == teamCount)throw new TeamException("找不到该成员,无法删除");//后面的元素覆盖前面的元素for (int i = n + 1; i < teamCount; i++) {if (teams.get(ID).getTeamMember()[i] != null) {teams.get(ID).getTeamMember()[i - 1] = teams.get(ID).getTeamMember()[i];teams.get(ID).getTeamMember()[i - 1].setMemberId(i);}}teams.get(ID).getTeamMember()[--teamCount] = null;System.out.println("该成员从团队中删除成功");}//初始化当前团队成员数组public void clearTeam() {teamCount = 0;counter = 0;}}
5.2.3 projectListservice 类:
package com.team.project1.service;import com.team.project1.domain.*;
import com.team.project1.view.TSUtility;import java.util.ArrayList;
import java.util.Random;import static com.team.project1.service.TeamListService.teams;public class ProjectListService {private ArrayList<Project> project = new ArrayList<>();private int count = 1;//查看目前项目情况public void showPro() throws InterruptedException {if (project.size() == 0) {System.out.println(" 还没有创建项目 ");System.out.print("是否创建?(Y/N)");char yn = TSUtility.readConfirmSelection();if (yn == 'Y') {addProject();System.out.println();} else return;} else {System.out.println("----------------项目列表展示---------------- ");System.out.println("项目ID\t 项目名\t 开发团队\t 开发状态\t\t \t 项目描述");for (int i = 0; i < project.size(); i++) {System.out.println(" " + project.get(i).getProId() + "\t " + project.get(i).getProName()+ " \t " + project.get(i).getProTeamName() + "\t\t" + project.get(i).isStatus() + "\t " + project.get(i).getDesName());}System.out.println();}}//添加项目public void addProject() throws InterruptedException {System.out.println();System.out.println("项目参考:--------------------------------------------------");System.out.println("1.小米pc端官网:开发完成类似于小米官网的web项目.");System.out.println("2.公益在线商城:猫宁Morning公益商城是中国公益性在线电子商城.");System.out.println("3.编程博客系统:Java博客系统,让每一个有故事的人更好的表达想法!");System.out.println("4.文档编辑系统:一个很常用的功能,适合小组内的文档编辑。");System.out.println("------------------------------------------------------------");System.out.println("请输入你想添加的参考项目:(1-4) ");char c = TSUtility.readMenuSelection();switch (c) {case '1':Project p1 = new Project();p1.setProId(count++);p1.setProName("小米pc端官网");p1.setDesName("开发完成类似于小米官网的web项目.");project.add(p1);System.out.println("已添加项目:" + p1.getProName());System.out.println();break;case '2':Project p2 = new Project();p2.setProId(count++);p2.setProName("公益在线商城");p2.setDesName("猫宁Morning公益商城是中国公益性在线电子商城.");project.add(p2);System.out.println("已添加项目:" + p2.getProName());System.out.println();break;case '3':Project p3 = new Project();p3.setProId(count++);p3.setProName("编程博客系统");p3.setDesName("Java博客系统,让每一个有故事的人更好的表达想法!");project.add(p3);System.out.println("已添加项目:" + p3.getProName());System.out.println();break;case '4':Project p4 = new Project();p4.setProId(count++);p4.setProName("文档编辑系统");p4.setDesName("一个很常用的功能,适合小组内的文档编辑。");project.add(p4);System.out.println("已添加项目:" + p4.getProName());System.out.println();break;default:System.out.println("项目不存在");System.out.println();break;}}public ArrayList<Integer> teamId = new ArrayList<>();//用来接受每次循环得到的随机数//给项目分配团队public void randomPro() {System.out.println(" 当前共有团队:");System.out.println("-------------------------------------");System.out.println("团队ID\t 团队名\t 当前人数\t 是否满员");for (int i = 0; i < teams.size(); i++) {System.out.println(" " + teams.get(i).getTeamId() + "\t " + teams.get(i).getTeamName() + " \t " + teams.get(i).getTeamSum() + "\t\t " + teams.get(i).isFull());}System.out.println("-------------------------------------");System.out.println();//随机分配项目boolean isSame = false;Random random = new Random();table1: for (int i = 0; i < project.size(); i++) {int randomTeam = random.nextInt(project.size());//每次随机得到一个在项目总数范围内的随机整数for (int j = 0; j < teamId.size(); j++) {if (teamId.get(j).equals(randomTeam)) { //若果此次随机得到的随机数有与之前的一样,则重新循环执行本次isSame = true;if (isSame) {i--;continue table1;}}}teamId.add(randomTeam);//每次遍历把生成的随机数存入集合,避免后面再生成相同的随机数,出现一个项目分配给多个团队的情况//将随机得到的团队成员和团队名名赋值给项目,并更改开发状态project.get(i).setProTeamName(teams.get(randomTeam).getTeamName());project.get(i).setStatus(true);project.get(i).setProTeam(teams.get(randomTeam).getTeamMember());//输出随机分配结果System.out.println("第" + project.get(i).getProId() + "个项目" + ": " + "/" + project.get(i).getProName() + "/ " + "随机分配给 " + "第" +teams.get(randomTeam).getTeamId() + "团队:" + "/"+ teams.get(randomTeam).getTeamName() + "/ " + " 团队进行开发");}System.out.println();}//删除选择的项目public void delPro(int id) {boolean flag = false;for (int i = 0; i < project.size(); i++) {if (project.get(i).getProId() == id) {project.remove(i);for (i = id; i <= project.size(); i++) {project.get(i - 1).setProId(project.get(i - 1).getProId() - 1);}flag = true;}}if (flag) {System.out.println("删除成功!");count--;} else {try {throw new TeamException("该项目不存在");} catch (TeamException e) {e.printStackTrace();}}}//得到所有项目数据集合public ArrayList<Project> getAllPro() {return project;}
}
6. 项目总结:
6.1. 此项目主要涉及以下知识点:
类的继承和多态
对象的值传递、接口;
static和final修饰符;
异常处理;
Java基本语法和流程控制;
数组,ArrayList集合。
6.2遇到的问题及解决方案:
问题:在多个不同的类里需要对某一个类里的对象的数据进行增删改查时,不能又new一个对象来调用属性、方法,这样操作的根本不是同一个对象,数据会丢失。
解决:正确的方法是进行对象的传递,即通过调用方法,在需要用到该对象的方法里,定义形参接收这个对象。