java尚硅谷 项目三《开发团队调度项目》最细致流程、总结
目录
1.目标
2.项目细节
2.1功能
2.2主界面显示
2.3功能展示
2.3.1团队列表
2.3.2添加团队成员
2.3.3删除团队成员
2.3.4退出
3.项目包和类的说明,软件设计结构
4.各个类的实现
4.1.domain包下的类
Equipment接口及其子类设计要求
4.1.1interface Equipment
4.1.2.Class PC
4.1.3.Class NoteBook
4.1.4.Class Pinter
Employee 类及其子类设计要求
4.1.5.Class Employee
4.1.6.Class Programmer
4.1.7.Class Designer
4.1.8.Class Architect
4.2service包下的类
4.2.1.Calss Data(项目自带的数据类)
4.2.2.Class Status
NameListService类的设计
4.2.3.Class NameListService
4.2.4.Class TeamException
TeamService类的设计
4.2.5.Class TeamService
4.3包view下的类实现
项目提供的TSUtility类
4.3.1.Class TSUtility
Teamview类的设计
4.3.2.Class TeamView
1.目标
- 模拟实现一个基于文本界面的《开发团队调度软件》
- 熟悉Java面向对象的高级特性,进一步掌握编程技巧和调试技巧
- 主要涉及以下知识点:
- 类的继承性和多态性
- 向下转型、instacnceof关键字使用
- 对象的值传递、接口
- static和final修饰符
- 特殊类的使用:包装类、抽象类、内部类
- 异常处理,自定义异常类
2.项目细节
2.1功能
- 该软件实现以下功能:
- 软件启动时,根据给定的数据创建公司部分成员列表(数组)
- 根据菜单提示,基于现有的公司成员,组建一个开发团队以开发一个新的项目
- 组建过程包括将成员插入到团队中,或从团队中删除某成员,还可以列出团队中现有成员的列表
- 开发团队成员包括架构师、设计师和程序员
2.2主界面显示
根据项目提供数据生成员工信息表。
2.3功能展示
2.3.1团队列表
刚开始团队没有人的状态!
添加成员之后!
2.3.2添加团队成员
添加成功时!
添加失败时:
失败信息包含以下几种:
- 成员已满,无法添加
- 该成员不是开发人员,无法添加
- 该员工已在本开发团队中
- 该员工已是某团队成员
- 该员正在休假,无法添加
- 团队中至多只能有一名架构师
- 团队中至多只能有两名设计师
- 团队中至多只能有三名程序员
失败原因需要使用自定义异常来提示!
2.3.3删除团队成员
当队伍中有此成员时:
当队伍中不含此成员时:
2.3.4退出
3.项目包和类的说明,软件设计结构
4.各个类的实现
4.1.domain包下的类
Equipment接口及其子类设计要求
4.1.1interface Equipment
package com.zyd.team.domain;public interface Equipment {public abstract String getDescription();}
4.1.2.Class PC
package com.zyd.team.domain;public class PC implements Equipment{private String model; //机器型号private String display;//显示器名称public PC() {super();}public PC(String model, String display) {this.model = model;this.display = display;}public String getDescription() {return model + "(" + display + ")";}public String getDisplay() {return display;}public void setDisplay(String display) {this.display = display;}public void setModel(String model) {this.model = model;}public String getModel() {return this.model;}}
4.1.3.Class NoteBook
package com.zyd.team.domain;public class NoteBook implements Equipment{private String model;//机器型号private double price;//机器价格public NoteBook() {super();}public NoteBook(String model, double price) {this.model = model;this.price = price;}public String getDescription() {return model + "(" + price + ")";}public String getModel() {return model;}public void setModel(String model) {this.model = model;}public double getPrince() {return price;}public void setPrince(double price) {this.price = price;}}
4.1.4.Class Pinter
package com.zyd.team.domain;public class Printer implements Equipment{private String name;//机器名字private String type;//机器类型public Printer() {super();}public Printer(String name, String type) {this.name = name;this.type = type;}public String getDescription(){return name + "(" + type + ")";}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getType() {return type;}public void setType(String type) {this.type = type;}
}
Employee 类及其子类设计要求
4.1.5.Class Employee
package com.zyd.team.domain;public class Employee {private int id;private String name;private int age;private double salary;public Employee() {super();}public Employee(int id, String name, int age, double salary) {super();this.id = id;this.name = name;this.age = age;this.salary = salary;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}public String getDetails() {return id + "\t" + name + "\t" + age + "\t" + salary + "\t";}public String toString() {return getDetails();}}
4.1.6.Class Programmer
说明:定义类Programmer、Designer、Architect时需要用到service包下的Status类。
package com.zyd.team.domain;import com.zyd.team.service.Status;//import static com.zyd.team.service.Status.FREE;
public class Programmer extends Employee{private int memberId;
// private Status status = FREE; 这种赋值需要上面导入别的包下的静态常量private Status status = Status.FREE;
// private Status status = new Status("FREE");status构造器私有化了。private Equipment equipment;public Programmer(int id, String name, int age, double salary, Equipment equipment) {super(id, name, age, salary);this.equipment = equipment;}public int getMemberId() {return memberId;}public void setMemberId(int memberId) {this.memberId = memberId;}public Status getStatus() {return status;}public void setStatus(Status status) {this.status = status;}public Equipment getEquipment() {return equipment;}public void setEquipment(Equipment equipment) {this.equipment = equipment;}public String getDetailsForTeam() {return this.memberId + "/" +super.toString() + "\t程序员";}public String toString() {return super.toString() + "\t程序员\t" + status.getNAME() + "\t\t\t\t\t" + equipment.getDescription();}}
4.1.7.Class Designer
package com.zyd.team.domain;public class Designer extends Programmer{private double bonus;public Designer(int id, String name, int age, double salary, double bonus, Equipment equipment) {super(id, name, age, salary, equipment);this.bonus = bonus;}public double getBonus() {return bonus;}public void setBonus(double bonus) {this.bonus = bonus;}public String getDetailsForTeam() {return super.getMemberId() + "/" + super.getDetails() + "\t设计师\t" + getBonus();}public String toString() {return super.getDetails() + "\t设计师\t" + getStatus().getNAME() + "\t" + bonus + "\t\t\t\t" + getEquipment().getDescription(); }}
4.1.8.Class Architect
package com.zyd.team.domain;public class Architect extends Designer{private int stock;public Architect(int id, String name, int age, double salary, double bonus, int stock, Equipment equipment) {super(id, name, age, salary, bonus, equipment);this.stock = stock;}public int getStock() {return stock;}public void setStock(int stock) {this.stock = stock;}public String getDetailsForTeam() {return super.getMemberId() + "/" + super.getDetails() + "\t架构师\t" + getBonus() + "\t\t" + stock;}public String toString() {return super.getDetails() + "\t架构师\t" + getStatus().getNAME() + "\t" + getBonus() + "\t\t" + stock + "\t\t" + getEquipment().getDescription();}
}
4.2service包下的类
4.2.1.Calss Data(项目自带的数据类)
package com.zyd.team.service;import org.junit.Test;public class Data {public static final int EMPLOYEE = 10;public static final int PROGRAMMER = 11;public static final int DESIGNER = 12;public static final int ARCHITECT = 13;public static final int PC = 21;public static final int NOTEBOOK = 22;public static final int PRINTER = 23;//Employee : 10, id, name, age, salary//Programmer: 11, id, name, age, salary//Designer : 12, id, name, age, salary, bonus//Architect : 13, id, name, age, salary, bonus, stockpublic static final String[][] EMPLOYEES = {{"10", "1", "马云 ", "22", "3000"},{"13", "2", "马化腾", "32", "18000", "15000", "2000"},{"11", "3", "李彦宏", "23", "7000"},{"11", "4", "刘强东", "24", "7300"},{"12", "5", "雷军 ", "28", "10000", "5000"},{"11", "6", "任志强", "22", "6800"},{"12", "7", "柳传志", "29", "10800","5200"},{"13", "8", "杨元庆", "30", "19800", "15000", "2500"},{"12", "9", "史玉柱", "26", "9800", "5500"},{"11", "10", "丁磊 ", "21", "6600"},{"11", "11", "张朝阳", "25", "7100"},{"12", "12", "杨致远", "27", "9600", "4800"}};
// @Test
// public void textdata() {
// System.out.print(EMPLOYEES[1][1]);
// }//如下的EQUIPMENTS数组与上面的EMPLOYEES数组元素一一对应//PC :21, model, display//NoteBook:22, model, price//Printer :23, name, type public static final String[][] EQUIPMENTS = {{},{"22", "联想T4", "6000"},{"21", "戴尔", "NEC17寸"},{"21", "戴尔", "三星 17寸"},{"23", "佳能 2900", "激光"},{"21", "华硕", "三星 17寸"},{"21", "华硕", "三星 17寸"},{"23", "爱普生20K", "针式"},{"22", "惠普m6", "5800"},{"21", "戴尔", "NEC 17寸"},{"21", "华硕","三星 17寸"},{"22", "惠普m6", "5800"}};
}
4.2.2.Class Status
package com.zyd.team.service;/*** @Description 枚举类Status是项目service包下自定义的类,在类内声明三个Status类型的对象属性,* 分别表示成员的状态:① FREE-空闲;② BUSY-已加入开发团队;③ VACATION-正在休假* @author Zyd* @version * @date 2022年11月6日下午4:52:38*/public class Status {//私有常量属性,表示成员的状态private final String NAME;//枚举类,该类只能有三个对象,因此需要将构造器私有化private Status(String NAME) {this.NAME = NAME;}//声明三个对象属性:全局常量(public static final)public static final Status FREE = new Status("FREE");public static final Status BUSY = new Status("BUSY");public static final Status VACATION = new Status("VACATION");//提供NAME属性的get方法,供该类的对象属性调用public String getNAME() {return NAME;}//也可以直接重写toString方法,//直接System.out.println(),自动执行重写后的toString方法,返回对象的属性NAMEpublic String toString() {return NAME;}
}
NameListService类的设计
4.2.3.Class NameListService
package com.zyd.team.service;import com.zyd.team.domain.Employee;import com.zyd.team.domain.*;
//import com.zyd.team.domain.PC;import static com.zyd.team.service.Data.*;import org.junit.Test;public class NameListService {public static void main(String[] args) {}private Employee[] employees;public NameListService() {employees = new Employee[EMPLOYEES.length];for(int i = 0; i < EMPLOYEES.length; i++) {int id = Integer.parseInt(EMPLOYEES[i][1]);String name = EMPLOYEES[i][2];int age = Integer.parseInt(EMPLOYEES[i][1]);double salary = Double.parseDouble(EMPLOYEES[i][4]);Equipment equipment;double bonus;int stock;if(Integer.parseInt(EMPLOYEES[i][0]) == 10) {employees[i] = new Employee(id, name, age, salary);}else if(EMPLOYEES[i][0].equals("11")) {equipment = creatEquipment(i);employees[i] = new Programmer(id, name, age, salary,equipment);}else if(EMPLOYEES[i][0].equals("12")) {equipment = creatEquipment(i);bonus = Double.parseDouble(EMPLOYEES[i][5]);employees[i] = new Designer(id, name, age, salary, bonus, equipment);}else if(EMPLOYEES[i][0].equals("13")) {equipment = creatEquipment(i);bonus = Double.parseDouble(EMPLOYEES[i][5]);stock = Integer.parseInt(EMPLOYEES[i][5]);employees[i] = new Architect(id, name, age, salary, bonus, stock, equipment); }}}private Equipment creatEquipment(int index) {int type = Integer.parseInt(EQUIPMENTS[index][0]);switch(type) {case PC:return new PC(EQUIPMENTS[index][1], EQUIPMENTS[index][2]);
// break;有return了就不需要break;case 22:return new NoteBook(EQUIPMENTS[index][1],Double.parseDouble(EQUIPMENTS[index][2]));case 23:return new Printer(EQUIPMENTS[index][1], EQUIPMENTS[index][2]);default:return null;}}public Employee[] getAllEployees() {return employees;}public Employee getEmployee(int id) throws TeamException{for(int i = 0; i < employees.length; i++) {if(employees[i].getId() == id) {return employees[i];}}throw new TeamException("找不到该员工!");}
// @Test
// public void testser() {
// NameListService n = new NameListService();
// System.out.print(n.getAllEployees()[1]);
// }
}
4.2.4.Class TeamException
package com.zyd.team.service;/*** @ClassName TeamException* @Description 自定义异常类* @author Zyd* @version* @date 2022年11月6日下午8:40:39*///1.自定义的异常类需要继承Java现有的异常类,一般为:RuntimeException 或 Exception
public class TeamException extends Exception {//2.提供全局常量(static final):serialVersionUIDstatic final long serialVersionUID = -703745766939L;//3.提供重载的构造器public TeamException() {}public TeamException(String message) {super(message);}
}
TeamService类的设计
4.2.5.Class TeamService
package com.zyd.team.service;import com.zyd.team.domain.*;public class TeamService {private int counter = 1;private static final int MAX_MEMBER = 5;private Programmer[] team = new Programmer[MAX_MEMBER];private int total = 0;public TeamService() {super();}public TeamService(int counter, Programmer[] team, int total) {super();this.counter = counter;this.team = team;this.total = total;}public Programmer[] getTeam() {Programmer[] currentTeam = new Programmer[total];for(int i = 0; i < total; i++) {currentTeam[i] = team[i];}return currentTeam;}public void setTeam(Programmer[] team) {this.team = team;}public int getCounter() {return counter;}public int getTotal() {return total;}public void addMember(Employee e) throws TeamException{if(total >= MAX_MEMBER) {throw new TeamException("人员已满!"); }if(!(e instanceof Programmer)) {throw new TeamException("该人员不是开发人员,无法添加!");}if(isExist(e)) {throw new TeamException("该成员已在队伍中!");}Programmer p = (Programmer)e;if(p.getStatus().getNAME().equals("BUSY")) {throw new TeamException("该成员已是某队成员!");}if(p.getStatus().getNAME().equals("VACATION")) {throw new TeamException("该成员正在度假!");}int pnum = 0, dnum = 0, anum = 0;for(int i = 0; i < total; i++) {if(team[i] instanceof Architect) {anum++;continue;}if(team[i] instanceof Designer) {dnum++;continue;}if(team[i] instanceof Programmer) {pnum++;continue;}}
// for(int i = 0; i < total; i++) {
// if(team[i] instanceof Architect) {
// anum++;
// }
// else if(team[i] instanceof Designer) {
// dnum++;
// }
// else if(team[i] instanceof Programmer) {
// pnum++;
// }
// }if(e instanceof Architect) {if(anum >= 1) {throw new TeamException("架构师已满1人!!");}}else if(e instanceof Designer) {if(dnum >= 2) {throw new TeamException("设计师已满2人!");}}else if(e instanceof Programmer) {if(pnum >= 3) {throw new TeamException("程序员已满3人!");}}team[total++] = p;p.setStatus(Status.BUSY);p.setMemberId(counter++);}public boolean isExist(Employee e) {for(int i = 0; i < total; i++) {if(team[i].getId() == e.getId()) {return true;}}return false;}public void removeMember(int memberId) throws TeamException{for(int i = 0; i < total; i++) {if(team[i].getMemberId() == memberId) {team[i].setStatus(Status.FREE);for(int j = i; j < total - 1; j++) {team[j] = team[j+1];}total--;team[total] = null;return;}}throw new TeamException("该成员不在队伍中!");//上面匹配不到对应memberid的成员就抛出异常。}
}
4.3包view下的类实现
项目提供的TSUtility类
4.3.1.Class TSUtility
package com.zyd.team.view;import java.util.*;
/*** @Description项目中提供了TSUtility.java类,可用来方便地实现键盘访问。* @author Zyd* @version* @date 2022年11月6日下午3:58:41*/
public class TSUtility {private static Scanner scanner = new Scanner(System.in);
/*** @Description 该方法读取键盘,如果用户键入’1’-’4’中的任意字符,则方法返回。返回值为用户键入字符。* @author Zyd* @version* @date 2022年11月6日下午3:59:12* @return*/public static char readMenuSelection() {char c;for (; ; ) {String str = readKeyBoard(1, false);c = str.charAt(0);if (c != '1' && c != '2' &&c != '3' && c != '4') {System.out.print("选择错误,请重新输入:");} else break;}return c;}
/*** @Description 该方法提示并等待,直到用户按回车键后返回。* @author Zyd* @version* @date 2022年11月6日下午3:59:25*/public static void readReturn() {System.out.print("按回车键继续...");readKeyBoard(100, true);}
/*** @Description 该方法从键盘读取一个长度不超过2位的整数,并将其作为方法的返回值。* @author Zyd* @version* @date 2022年11月6日下午3:59:38* @return*/public static int readInt() {int n;for (; ; ) {String str = readKeyBoard(2, false);try {n = Integer.parseInt(str);break;} catch (NumberFormatException e) {System.out.print("数字输入错误,请重新输入:");}}return n;}
/*** @Description 从键盘读取‘Y’或’N’,并将其作为方法的返回值。* @author Zyd* @version* @date 2022年11月6日下午3:59:51* @return*/public static char readConfirmSelection() {char c;for (; ; ) {String str = readKeyBoard(1, false).toUpperCase();c = str.charAt(0);if (c == 'Y' || c == 'N') {break;} else {System.out.print("选择错误,请重新输入:");}}return c;}private static String readKeyBoard(int limit, boolean blankReturn) {String line = "";while (scanner.hasNextLine()) {line = scanner.nextLine();if (line.length() == 0) {if (blankReturn) return line;else continue;}if (line.length() < 1 || line.length() > limit) {System.out.print("输入长度(不大于" + limit + ")错误,请重新输入:");continue;}break;}return line;}
}
Teamview类的设计
4.3.2.Class TeamView
package com.zyd.team.view;import com.zyd.team.domain.Employee;
import com.zyd.team.domain.Programmer;
import com.zyd.team.service.*;public class TeamView {private NameListService listSvc = new NameListService();private TeamService teamSvc = new TeamService();public void enterMainMenu() {boolean loopFlag = true;char menu = 0;while(loopFlag) {if(menu != '1' ) {listAllEmployees();}System.out.print("1-团队列表 2-添加团队成员 3-删除团队成员 4-退出 请选择(1-4):");menu = TSUtility.readMenuSelection();switch(menu) {case '1'://switch中的的条件要与case中的类型一致,此时都为字符,所以要加‘’getTeam();break;case '2':addMember();break;case '3':deleteMember();break;case '4':System.out.print("是否确认退出(Y/N):");char isExit = TSUtility.readConfirmSelection();if(isExit == 'Y' || isExit == 'y') {
// loopFlag = false; System.out.print("成功退出软件!");return ;//return就直接退出方法。}}}}private void listAllEmployees() {System.out.println("----------------------- 开发团队调度软件 -------------------------------\n");Employee[] employees = listSvc.getAllEployees();if(employees.length == 0 || employees == null) {System.out.println("公司没有任何员工信息!");}else {System.out.println("ID\t姓名\t年龄\t工资\t\t职位\t状态\t奖金\t\t股票\t\t领用设备");for(int i = 0; i < employees.length; i++) {System.out.println(employees[i]);}}System.out.println("---------------------------------------------------------------------");}private void getTeam() {System.out.println("-------------------------- 团队成员列表 -------------------------------\n");Programmer[] team = teamSvc.getTeam();if(team.length == 0 || team == null) {System.out.println("团队没有任何员工信息!");}else {System.out.println("TID/ID\t姓名\t年龄\t工资\t\t职位\t奖金\t\t股票");for(int i = 0; i < team.length; i++) {System.out.println(team[i].getDetailsForTeam());}}System.out.println("-----------------------------------------------------");}private void addMember() {System.out.println("---------------------添加成员---------------------");System.out.print("请输入要添加的员工ID:");int id = TSUtility.readInt();try {Employee e = listSvc.getEmployee(id);teamSvc.addMember(e);System.out.println("添加成功!");}catch(TeamException e) {System.out.println("添加失败,原因:" + e.getMessage());}TSUtility.readReturn();}private void deleteMember() {System.out.println("---------------------删除成员---------------------");System.out.print("请输入要删除员工的TID:");int tid = TSUtility.readInt();System.out.print("确认是否删除(Y/N):");char yn = TSUtility.readConfirmSelection();if(yn == 'n') {return;}else {try {teamSvc.removeMember(tid);System.out.println("删除成功!");}catch(TeamException e) {System.out.println("删除失败,原因:" + e.getMessage());}}TSUtility.readReturn();}public static void main(String args[]) {TeamView teamview = new TeamView();teamview.enterMainMenu();}
}
java尚硅谷 项目三《开发团队调度项目》最细致流程、总结相关推荐
- Java基础学习:尚硅谷项目三 开发团队调度软件
Java基础学习:尚硅谷项目三 开发团队调度软件 一.软件功能与结构设计 1. 软件功能 该软件实现以下功能: 软件启动时,根据给定的数据创建公司部分成员列表(数组) 根据菜单提示,基于现有的公司成员 ...
- 学习java第四天,自己做的尚硅谷项目三开发人员调度系统,代码很丑陋,等后面有时间再优化一下。
1.定义公司成员作为父类 package tEAM;public class Person {private String ID;private String age;private String w ...
- Java学习笔记项目三:开发团队调度软件(尚硅谷)
JAVA学习笔记开发团队调度软件 ①创建基础组件 Equipment 接口 package august.domain;/*** 设备领取** @author : Crazy_August* @Dat ...
- Java尚硅谷核心知识
Java尚硅谷核心知识 一.Java基础部分 1.1 Java语言的主要特性 1.2 Java程序运行机制及运行过程 1.2.1Java两种核心机制 1.3Java语言的环境搭建 1.3.1 为什么要 ...
- 【Java7】练习:选角色,挑苹果,员工类,换心脏,斗地主,发工资,客户信息管理软件,开发团队调度系统
文章目录 1.玩家选择角色:return new 2.人工挑苹果:只一个接口CompareAble 3.员工类接口:implements Comparator 4. 医生帮换心脏:Organ类doWo ...
- 尚硅谷h5前端开发视频
尚硅谷h5前端开发视频 尚硅谷h5前端开发视频 尚硅谷h5前端开发视频 下载地址:百度网盘
- 尚硅谷大数据开发Day02
这个博客是学习尚硅谷大数据课程所作的笔记,课程原地址可以访问https://www.bilibili.com/video/BV1Qp4y1n7EN?p=7&spm_id_from=pageDr ...
- 尚硅谷Spring注解开发学习笔记
文章目录 前言 1.课程安排 1.1.容器 1.2.扩展原理 1.3.Web 2.配置文件开发 2.1.导入Spring-context依赖包 2.2.编写Spring配置文件 2.3.编写Perso ...
- (尚硅谷)JavaWeb新版教程09-QQZone项目总结
目录 1.日期和字符串之间的转化 1.1 JDK 8 之前的 Date 日期的格式转换 1.2 JDK 8之后 LocalDateTime 新日期的格式转换 1.3 Thymeleaf 中将 Date ...
最新文章
- 手写识别python_Python徒手实现识别手写数字—图像识别算法(K最近邻)
- 查看dev下设备名的含义
- 全球首个自适应机械臂:精准抗干扰,斯坦福华人团队打造
- linux 0x00,linux 学习笔记0x00
- 抓包工具 - Fiddler(详细介绍)
- PostgreSQL函数如何返回数据集
- ABAP RTTC动态编程在SAP gateway中的应用
- java定向输出程序日志(输出到txt文件中)
- public class c中_Spring中@Import的各种用法以及ImportAware接口
- Nginx二级域名及多Server反向代理配置
- Merry Christmas
- ios抓包软件Thor限时折扣6元中,手慢无
- Navicat Premium 12.1.21 最新版激活工具及方法
- 小程序服务器装rsshub,用RSSHub制作自己的RSS订阅源
- html如何调用flash插件,htmlflash播放器插件如何播放 网页播放器flash插件怎么解决...
- Python:WIN10解决matplotlib画图中显示中文宋体英文TimesNewRoman问题
- 精读Tree Energy Loss: Towards Sparsely Annotated Semantic Segmentation
- iterm2新技能-用不同的颜色创建新标签
- [目录]-博客笔记导读目录(全部)
- 适合程序员的 5 款 Linux 发行版
热门文章
- 灵魂画师,Android绘制流程——Android高级UI
- 论文中文翻译——kAFL Hardware-Assisted Feedback Fuzzing for OS Kernels
- iOS 程序猿们要知道的一些 HTTPS 的事情...
- 过滤器:保安过滤器的技术参数及特点解读
- 虚拟服务器 没效果,服务器虚拟内存设置了没效果
- 【大学生期末大作业】HTML+CSS — 诗词网页
- VMware 虚拟机中安装windows server 2019(图文教程详解)
- 联想小新pro14和thinkbook14+哪个好
- Java的setRecord怎么用,Data set record formats数据集记录根式
- 基于内容自适应的视频超分辨率算法-SRVC