




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、. . . . 课程设计I报告题 目:电子系统设计专 业 软件工程 学 生 姓 名 * 班 级 学 号 * 指 导 教 师 * 指 导 单 位 计算机学院软件工程系 30 / 321、课题名称电子系统设计2、课题容设计一个电子系统,包括客户端和服务器端的设计、处理过程建模和具体功能的实现等。1、 系统分析电子()是因特网上使用得最多的和最受用户欢迎的一种应用。电子把发送到 ISP 的服务器,并放在其中的收信人中,收信人可随时上网到 ISP 的服务器进行读取。电子不仅使用方便,而且还具有传递迅速和费用低廉的优点。现在电子不仅可传送文字信息,而且还可附上声音和图像。本系统分析中给出了电子服务器和电
2、子客户端的简介,同时给出了本次试验中客户端的主要功能和总体框图。服务器按照提供的服务类型,可以分为发送服务器(简称发送服务器)和接收服务器(简称接收服务器)。发送服务器使用发送协议,现在常用的是SMTP,所以通常发送服务器也称为SMTP服务器;接收服务器使用接收协议,常用的有POP3协议和IMAP协议,所以通常接收服务器也称为POP3服务器或IMAP服务器。SMTP(Simple Mail Transfer Protocol),即简单传输协议,是Internet传送E-mail的基本协议,也是TCP/IP协议组的成员。SMTP协议解决系统如何通过一条链路,把从一台机器传送到另一台机器上的问题。
3、SMTP协议的特点是具有良好的可伸缩性,这也是它成功的关键。它既适用于广域网,也适用于局域网。SMTP协议由于非常简单,使得它得到了广泛的运用,在Internet上能够发送的服务器几乎都支持SMTP协议。POP3(Post Office Protocol 3),即邮局协议第3版,是 Internet接收的基本协议,也是TCP/IP协议组的成员。RFC1939描述了POP3协议,网址为“./rfc/rfc1939.txt”。POP3既允许接收服务器向用户发送,也可以接收来自SMTP服务器的。客户端软件会与POP3服务器交互,下载由POP3服务器接收到的。基于POP3协议的系统能提
4、供快速、经济和方便的接收服务,深受用户的青睐。IMAP(Internet Message Access Protocol),即互联网消息访问协议,是一种功能比POP3更强大的新的接收协议。目前最新的IMAP协议版本为IMAP4,RFC2060描述了IMAP4,网址为“./rfc/rfc2060.txt”。IMAP4与POP3协议一样提供了方便的下载服务,允许用户在脱机状态下阅读已经下载到本地硬盘的。但IMAP4的功能远远不只这些,它还具有以下功能: 摘要浏览的功能。选择性下载附件的功能。鼓励用户把一直存储在服务器上。允许用户把远程服务器上的作为信息存储工具。MIME(Multi
5、purpose Internet Mail Extensions,多用途Internet扩充标准)不是传输协议,而是对格式所作的规。RFC2045、RFC2046和RFC2047对MIME作了描述。MIME是对RFC822的扩充,RFC822规定了容只包括采用ASCII编码的纯文本的的格式,而MIME允许在中包含附件。整个电子系统的工作过程与一些涉与到的协议如下图所示:电子系统包含:电子服务器端和电子客户端。SUN公司制定了JavaMail API,它封装了按照各种通信协议,如IMAP、POP3和SMTP,与服务器通信的细节,为Java应用程序提供了收发电子的公共接口,参见下图:JavaMai
6、l API主要位于javax.mail包和ernet中,下图为其中主要类的类框图。1. javax.mail.Session类:表示会话,是JavaMail API的最高层入口类。2javax.mail.Store类:表示接收服务器上的注册用户的存储空间,通过Store类的getFolder()方法,可以访问用户的特定夹。 3. javax.mail.Folder类:代表夹。4. javax.mail.Message类:代表电子。5. javax.mail.Address类:代表地址。6. javax.mail.Transport类:根据指定的发送协议(通常是 SM
7、TP),通过指定的发送服务器来发送。电子服务器的最简模型如下图:电子服务器的结构一般如下图所示:电子服务器还能在本机和客户端进行连接使用(即主机上的SMTP服务器还可能与其他SMTP服务器会话以发送)如下图:按照MIME规,电子包括头和正文两部分。头中包括日期、发送者地址、接收者地址和主题等信息。正文部分可以包括普通文本容,还可以包括一个或多个附件。javax.mail.Message抽象类表示,它的具体子类为javax.mail.MimeMessage类,它提供了读取和设置中各个部分的getXXX()和setXXX()方法:setSubject(String subject)方法设置的主题。
8、setHeader(String name, String value)方法设置头部的某一项。setContent(Object o, String type)方法设置的正文。javax.mail.Address抽象类表示地址,它的最常用的子类是javax.mail.InternetAddress类。InternetAddress类表示Internet网上通用的地址,形式为adminmydomain.,或者“Admin<adminmydomain.>”。电子客户端是安装在个人电脑上面的一种软件,用于和电子服务器端的连接。基本上所有的客户端一般都有以下四个基本功能:· a.
9、通过POP3收取用户各种的。由于考虑到POPular服务器地址的不同,但又可以接收不同地址的,所以增加了这个功能。 b.在线阅读,这个功能是电子系统必备的功能。 · c.接收保存,用户可以再阅读之后,将其保存起来,在需要的时候再次阅读。 · d.在线处理,如果收到一些垃圾或者不是很重要的,那么用户可以将它们放到垃圾箱或者然后在去垃圾箱中将它彻底删除,这是最好的办法。这个时候就要引入在线处理功能,这个功能能够删除。 · e.发送附件。有时候太长,或者是表格、Word文档,一正文方式发送不太方便,这样可以引用一个附件功能。与那个这些表格或Word文档以附件的形式上传,
10、让后发送。在扩充一下,提供可以发送多个的功能。(本功能为扩展功能,本系统并未实现)。· f.接收附件,相对于发送附件而言,接收附件的功能必不可少。不然不能阅读的容。同样,应该扩充可以接受多个附件的功能。· g.SMTP验证,当前大部分的SMTP服务器,在用户发送的时候,都需要进行用户名和密码的验证。· h.文件夹管理,该功能提供了用户可以再除了了有收件箱等必须得文件夹时,可以根据自己的需要创建新的文件夹用于更好大的管理自己收到的,还可以重命名和删除用户自己创建的文件夹。· i.回复,该功能是电子系统必备的功能· 下面列出了本系统的总体功能:
11、183;总之,由上面的电子服务器和客户端的分析可知该电子系统收发的整个过程和图示如下:(1) 发信人调用用户代理来编辑要发送的。用户代理用 SMTP 把传送给发送端服务器。(2) 发送端服务器将放入缓存队列中,等待发送。(3) 运行在发送端服务器的 SMTP 客户进程,发现在缓存中有待发送的,就向运行在接收端服务器的 SMTP 服务器进程发起 TCP 连接的建立。(4) TCP 连接建立后,SMTP 客户进程开始向远程的 SMTP 服务器进程发送。当所有的待发送发完了,SMTP 就关闭所建立的 TCP 连接。(5) 运行在接收端服务器中的 SMTP 服务器进程收到后,将放入收信人的用户中,等待
12、收信人在方便时进行读取。收信人在打算收信时,调用用户代理,使用 POP3(或 IMAP)协议将自己的从接收端服务器的用户中的取回(如果中有来信的话)。2、 系统设计本系统基于JavaMial API采用B/S设计结构。使用Apache Tomcat做为WEB服务器和JSP Servlet的容器。JDK中并不包含JavaMail API。为了开发JavaMail应用程序,需要从SUN公司的下载JavaMail API与其实现的类库,该类库由两个JAR文件组成: mail.jar和activation.jar。JavaMail应用程序在初始化过程中需要执行如下步骤。步骤(1)设置JavaMail属
13、性: Properties props = new Properties();props.put("tocol", "smtp");props.put("tocol", "imap");props.put("mail.smtp.class", ".sun.mail.smtp.SMTPTransport");props.put("mail.imap.class", ".sun.mail
14、.imap.IMAPStore");props.put("mail.smtp.host", hostname); 以上代码设置了如下JavaMail属性:tocol:指定发送协议。tocol:指定接收协议。mail.smtp.class:指定支持SMTP协议的Transport具体类,允许由第三方提供。mail.imap.class:指定支持IMAP协议的Store具体类,允许由第三方提供。mail.smtp.host:指定采用SMTP协议的发送服务器的IP地址或主机名步骤(2)调用javax.mai
15、l.Session类的静态方法Session.getDefaultInstance()获得Session实例,该方法根据已经配置的JavaMail属性来创建Session实例:Session mailsession = Session.getDefaultInstance(props);步骤(3)调用Session的getStore(String protocol)方法来获得Store对象,参数protocol指定接收协议:Store store = mailsession.getStore("imap");步骤(1)把mail.imap.class属性设为com.sun.
16、mail.imap.IMAPStore,因此以上getStore()方法返回com.sun.mail.imap.IMAPStore类的实例。步骤(4)调用Store对象的connect()方法连接到接收服务器。调用connect()方法时,应该指定接收服务器的主机名或IP地址、用户名和口令。 store.connect(hostname,username, password);获得了Store对象后,就可以通过它来访问服务器上的特定用户了。通常会对用户执行以下操作。操作(1)创建并发送:/创建msg = new MimeMessage(mailsession);InternetAddress
17、toAddrs =InternetAddress.parse("adminmydomain.", false);/设置接收者 msg.setRecipients(Message.RecipientType.TO, toAddrs);/设置的主题msg.setSubject("hello");/设置的发送者msg.setFrom(new InternetAddress("adminmydomain.");/设置的正文msg.setText("How are you");/发送Transport.send(msg);T
18、ransport的静态方法send(Message)负责发送服务器,发送协议由tocol属性指定,发送服务器由mail.smtp.host属性指定。操作(2)打开inbox夹收取:/获得名为“inbox”的夹Folder folder=store.getFolder("inbox");/打开夹folder.open(Folder.READ_ONLY);/获得夹中的数目System.out.println("You have "+folder.getMessageCount()+" messages in in
19、box.");/获得夹中的未读数目System.out.println("You have "+folder.getUnreadMessageCount()+" unread messages in inbox.");在IMAP协议中,inbox夹是用户的保留夹,用户不允许删除该夹,服务器把所有接收到的新都存在该夹中。操作(3)从夹中读取:/从夹中读取第一封Message msg=folder.getMessage(1);System.out.println("-the first message in inbox-");/
20、获得的发送者、主题和正文System.out.println("From:"+msg.getFrom()0);System.out.println("Subject:"+msg.getSubject();System.out.println("Text:"+msg.getText();系统设计中,给出了本次试验的UML建模和系统各个模块的划分。一、UML建模1. 本系统的用例图:图中User是本系统的总用户,Sender和Receiver分别为发送者和接收者是从User中泛化出来的。Upload accessory表示为上传附件用例;
21、Sending mail表示为发送用例;Longin表示为登录用例;Receiving mail表示为接收用例;Saving mail表示为保存用例;Saving accessory表示为保存附件用例;Folder表示为管理文件夹用例;Create new folder表示为创建新的文件夹用例;Rename folder表示为重命名创建的文件夹用例;Delete folder表示为删除创建的文件夹;Deleting mail表示为删除用户收到的用例。2. 本系统的时序图和对应的协作图:(1) 用户发送的时序图:从上图中可以看出,首先用户得登录系统,在登录系统时还可以选择登入服务器。用户正常登录
22、系统后,系统会将用户的ID保存在session变量中,并传递给发送和回复模块。用户打开发送界面就可以发送了。界面提示输入相关信息,按提示输入收件人地址、主题和容等信息后,单击“发送”按钮就可以发送了。有时候需要发送附件,单击“添加附件”命令选择需要添加的文件就可以了。最后提示发送成功。(2) 用户接收的时序图:从上图中可以看出,用户首先还是先登录系统,然后系统将所有提交用户的ID保存到session变量中,并传递给接收模板。该界面列出了所有的,用户可以打开某个阅读。有时候是以附件的形式发送的,这样用户在接收是就需要先下载附件,然后保存。(3) 用户发送的协作图:这是与上面用户发送的时序图对应的
23、协作图。(4) 用户接收的协作图:这是与上面用户接收的时序图对应的协作图。3. 本系统的总体分析模型(类图):该类图中包含了两个类:PMessage和MailUserData。其中PMessage类对Message类的重新封装,提供更方便的读取信息的方法。例如,在Message类中读取地址的方法,如getTo()方法返回Address类型,如果要把它显示到网页上,必须把Address数组转化为对应的字符串。PMessage的构造方法PMessage对Message数据重新封装。JSP网页调用PMessage的getTo方法可以直接获得字符串类型的地址。MailUserData类用来存放用户的相
24、关信息,还有对文件夹操作的一些方法的定义,还有管理的一些操作的定义,例如:发送,删除等。4. 本系统的活动图: a.用户接收的活动图,在接收是可以分两种方式,一种是文本形式,另一种是附件形式。接收后,用户可以并列做3件事,即保存、删除和将放入垃圾箱。至此,用户接收的活动完成。b.用户发送的活动图,在发送的活动中,还是一样,用户首先必须登录系统,这样,以后的操作才可以进行。发送的主要活动就是发送一个,它以两种形式发送的。c.用户管理文件夹的活动图,用户可以根据自己的需要新建文件夹、重新命名创建的文件夹和删除创建的文件夹。5. 本系统的组件图:二、系统模块的划分按照本系统的总体功能划分,可以将这个
25、电子系统分成5大模块,首先是登录模块,作为验证需要;其次是接收和附件模块,该模块负责的接收,有的是以附件形式接收的,再次是发送和回复模块,该模块负责该对方发送,有的还是以附件形式发送的;接着是处理模块,该模块负责的阅读、保存和删除等操作;然后是文件夹的管理,该操作负责文件夹的新建、重命名和删除等操作。下面累出了本系统的模块体系,如图:1 登录模块登录模块主要有login.jsp完成,其中包括下图中的几部分。(1) 选择登录服务器,本系统采用了MerakMailSErvler公司提供的Mail服务器使用版本。(2) 选择指定地址和密码。在本系统中有所提供的Mail服务器创建了2个账户进行登录。必
26、须选用正确的地址和密码才可以登录,不然会报错。登录模块的图示:2.接收和附件模块接收和附件模块主要由showmessage.jsp文件完成,包括下图中的几个部分。(1) 接收。一个系统最基本的功能就是能够接受对方发送的。(2) 保存附件。如果对方是以附件的形式发送给用户,那么用户在接收时,必须先下载,将其保存到本地机之后,才能阅读。接收和附件模块的图示:3.发送和回复模块 发送和回复模块主要由compose.jsp文件完成,包括图中的几个部分。(1) 编写新。该部分也是电子系统中最基本的功能。(2) 上传附件。在编写时,容可以以附件的形式发送,这样就需要先将附件上传到服务器,然后在发送给对方。
27、 发送和回复模块的图示:4.处理模块处理模块主要由listonefoldr.jsp文件完成,包括图中的几个部分。(1) 显示列表。在登录后的首页中就以分页显示的形式列出了所有的,便于管理。(2) 删除选中。在选中删除的后,可以单击该命令删除。(3) 显示错误信息。在出现一些登录错误,删除错误,下载错误是,将显示不同的错误信息提示用户。处理模块的图示:5.文件夹管理模块文件夹管理模块主要是由listallfolders.jsp文件完成,包括图中的几个部分。(1) 创建新的文件夹。用户可以根据自己的需要创建新的文件夹,便于管理用户的。(2) 重命名文件夹。用户可以重新命名自己创建的文件夹。(3)
28、删除文件夹。用户可以删除自己创建的文件夹。文件夹管理模块的图示:3、 系统实现1 服务器的安装和配置1.在做本次系统之前,必须配置JSP的服务器和电子的服务器。(1)JSP的服务器,主要使用的是Tomcat,同时在安装Tomcat服务器之前,必需已经安装了SUN公司的JDK,在安装Tomcat的时候主要是注意电脑环境变量的更改。安装完成后,只要在浏览器中输入localhost:8080/看是否能打开Tomcat的网页,如果能,则表示安装成功,8080端口是Tomcat的默认端口,如果电脑上有服务已经把端口占用了,可以把占用该端口的服务关掉,如果该服务关不掉或者比较重要,可以再Tomcat的安装
29、目录中找到server.xml文件,将其中port="8080"改成没有被占用的端口号。(2)电子服务器的配置:在本系统中我们采用了MerakMailServler公司的Mail服务器,安装完成后,在配置中输入本次实验所需要的域名和用户等信息。然后保存,配置完成。2 客户端的实现给出本系统中包含的两个类:由于代码比较多,所以这里只给出了核心代码。首先要加入一个中文字符串处理函数用于是能发送中文:public String codeToString(String str)/处理中文字符串的函数 String s=str; try byte tempB=s.getBytes(&
30、quot;ISO-8859-1"); s=new String(tempB); return s; catch(Exception e) return s; 1. PMessage类重新封装了Message类。(1) 重新封装Message类获得的时间、主题、大小、容还有地址等; public PMessage(Message msg)throws Exception if(msg!=null) SimpleDateFormat df = new SimpleDateFormat("yy.MM.dd 'at' HH:mm:ss "); trydat
31、e=df.format(msg.getSentDate()!=null) ? msg.getSentDate() : msg.getReceivedDate(); catch(Exception e)date=new Date().toString(); subject=msg.getSubject(); size=msg.getSize(); Object content="" try content=msg.getContent(); catch(Exception e) if(msg.isMimeType("text/plain") &&a
32、mp; content!=null) text=(String)content; from=assembleAddress(msg.getFrom(); to=assembleAddress(msg.getRecipients(Message.RecipientType.TO); cc=assembleAddress(msg.getRecipients(Message.RecipientType.CC); bcc=assembleAddress(msg.getRecipients(Message.RecipientType.BCC); (2)构造函数PMessage(String to,Str
33、ing cc,String bcc,String subj,String text);public PMessage(String to,String cc,String bcc,String subj,String text) to.replace('',','); cc.replace('',','); bcc.replace('',','); this.to=to; this.cc=cc; this.bcc=bcc; this.subject=subj; this.text=text; (3)
34、将Address数组转化为对应的字符串,用于在页面上显示;private String assembleAddress(Address addr) if(addr=null)return "" String addrString="" boolean tf = true; for (int i = 0; i < addr.length; i+) addrString=addrString+(tf) ? " " : ", ") + getDisplayAddress(addri); tf = false; re
35、turn addrString; (4)返回一个适合msg头的字符串。 private String getDisplayAddress(Address a) String pers = null; String addr = null; if (a instanceof InternetAddress && (pers = (InternetAddress)a).getPersonal() != null) addr = pers + " "+"<"+(InternetAddress)a).getAddress()+&qu
36、ot;>" else addr = a.toString(); return addr; ;2.MailUserData类 (1)删除用户自己创建的夹,但不允许删除Web应用指定的系统夹;public void doDeleteFolder(String foldername )throws Exception /can't delete reserved folder if(foldername.equalsIgnoreCase("inbox")| foldername.equalsIgnoreCase("trash")
37、| foldername.equalsIgnoreCase("draft")| foldername.equalsIgnoreCase("sendbox") throw new Exception("Cann't delete reserved folder"); Folder folder=store.getFolder(foldername); if(!folder.exists()throw new Exception("This folder does not exists"); if(folder
38、.isOpen()folder.close(true); folder.delete(true); (2)修改用户自己创建的夹的名字,但不允许修改Web应用指定的系统夹得名字; public void doRenameFolder(String fromname,String toname)throws Exception if(toname=null | toname.equals("") throw new Exception("You do not input new folder name when renaming folder"); /can
39、't rename reserved folder if(fromname.equalsIgnoreCase("inbox")| fromname.equalsIgnoreCase("trash")| fromname.equalsIgnoreCase("draft")| fromname.equalsIgnoreCase("sendbox")| toname.equalsIgnoreCase("inbox")| toname.equalsIgnoreCase("trash&q
40、uot;)| toname.equalsIgnoreCase("draft")| toname.equalsIgnoreCase("sendbox") throw new Exception("Cann't rename reserved folder"); Folder folderFrom=store.getFolder(fromname); Folder folderTo=store.getFolder(toname); if(!folderFrom.exists()throw new Exception("T
41、his folder does not exists"); if(folderFrom.isOpen()folderFrom.close(true);folderFrom.renameTo(folderTo); (3) 创建用户自己的夹; public void doCreateFolder(String foldername)throws Exception if(foldername=null | foldername.equals("") throw new Exception("You do not input new folder name w
42、hen creating folder"); Folder folder=store.getFolder(foldername); if(folder.exists()throw new Exception("This folder already exists"); folder.create(Folder.HOLDS_MESSAGES); (4) 把添加到参数指定的夹中; public void doAppendMessage(Message msg, Folder f)throws Exception Message m=new Message1; m0=m
43、sg; f.appendMessages(m); (5) 根据参数指定的信息,如标题,收发地址和容,来构建Message对象; public Message doAssembleMessage(String to,String cc,String bcc,String subj,String text)throws Exception Message msg = new MimeMessage(session); InternetAddress toAddrs = null, ccAddrs = null, bccAddrs=null; if (to != null) toAddrs = In
44、ternetAddress.parse(to, false); msg.setRecipients(Message.RecipientType.TO, toAddrs); else throw new MessagingException("No "To" address specified"); if (cc != null) ccAddrs = InternetAddress.parse(cc, false); msg.setRecipients(Message.RecipientType.CC, ccAddrs); if (bcc != null)
45、 bccAddrs = InternetAddress.parse(bcc, false); msg.setRecipients(Message.RecipientType.BCC, bccAddrs); if (subj != null) msg.setSubject(subj); msg.setFrom(new InternetAddress(urlName.getUsername() + "" + urlName.getHost(); if (text != null) msg.setText(text); return msg; (6) 如果该在Trash夹中,就永
46、久删除该,否则把这封移到Trash夹中; public void doDeleteMessage(int arrayOpt,Folder f)throws Exception for(int i=0;i<arrayOpt.length;i+) if(arrayOpti=0)continue; Message msg=f.getMessage(i+1); if(!f.getName().equals("Trash") Message m=new Message1; m0=msg; Folder Trash=store.getFolder("Trash"); f.copyMessages(m,Trash); msg.setFlag(Flags.Flag.DELETED, true); else msg.setFlag(Flags.Flag.DELETED, true); f.expunge(); (7) 从用户当前夹中,把用户当前访问的移到参数指定的中; public void doMoveM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房产继承财产分割及分配方案协议
- 2025年综合类-内分泌相关专业知识-结核病历年真题摘选带答案(5卷单选题百道集合)
- 2025年综合类-住院医师中医公共科目-住院医师中医公共科目-临床病理科住院医师-心血管系统历年真题摘选带答案(5卷单选题百道集合)
- 2025年综合类-临床执业医师实践技能-心血管系统历年真题摘选带答案(5卷单选100题合辑)
- 学院辅修专业管理办法
- 天元集团资金管理办法
- 大件货物船舶管理办法
- 对分公司人员管理办法
- 安全奖励资金管理办法
- 2025年综合类-中医临床三基(医院管理)-医院感染与传染病管理历年真题摘选带答案(5套单选100题合辑)
- 部门保密培训课件
- 福建省南平市2024-2025学年八年级下学期期末考试数学试卷(含答案)
- 工厂绩效计件方案(3篇)
- 慢性阻塞性肺疾病急性加重(AECOPD)
- 尿路感染多重耐药诊疗与管理
- 2025年湖南省中考历史试卷真题(含答案)
- 2025-2030中国微创仪器行业市场发展趋势与前景展望战略研究报告
- 数学 2024-2025学年人教版七年级数学下册期末+试卷
- 校长三四五级职级考试试题及答案
- 高中英语必背3500单词表完整版
- T/CNFAGS 16-2024绿色甲醇分级标准(试行)
评论
0/150
提交评论