




已阅读5页,还剩38页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录一、课程设计目的2二、课程设计要求2三、课程设计步骤21.从URL读取网络资源22.从网页内容中获取URL链接23.编写深度优先遍历算法34.编写图形用户界面类Frame35.编写广度优先算法36.编写“以对象序列化的方式”保存其他网页算法47.打开网页48.编写将链接保存到数据库saveToDB()算法59.编写保存首页DeepRobot.saveIndex()算法510.将深度优先机器人DeepRobot和广度优先机器人BroadRobot都extends Thread511.更改保存其他网页, saveToDB(),DeepRobot.saveIndex()的时机512.设置访问超时613.更改BroadRobot的遍历方法614.完善图形用户界面8四、实验结果81.打开程序82.并发执行深度优先和广度优先机器人93.验证并发性104.保存首页105.将所有链接保存到数据库中116.保存其他访问过137.打开已保存了的其他访问过的网页138.测试工具条159.设置遍历层数1610.关于任燕的JAVA课设1711.帮助文档17五、课设心得19六、参考资料20七、附件:源代码211.Frame类212.DeepRobot类333.BroadRobot类394.DB类425.WebPageSet类44一、 课程设计目的熟练掌握Java面向对象程序设计,尤其能熟练应用线程、集合类框架、图形用户界面、I/O输入输出、网络通信、JDBC等内容二、 课程设计要求编写图形用户界面(含菜单和工具条),可并发控制两个机器人,分别按宽度优先和深度优先遍历校园网首页(3-10层),将首页保存为html文件将所有连接保存为access 数据库中,将其他访问的连接页面以对象序列化的方式保存到另一个文件,并能够读出显示在一个窗口中三、 课程设计步骤1. 从URL读取网络资源参照书P262例15.2利用输入流和URL对象访问并获取了校园网首页/cms内容。2. 从网页内容中获取URL链接网页中有大量内容,从中找出有效的链接网址并非易事,这一步花了我很长时间,用到了很多字符串处理的函数。如String.indexOf(String str)返回字符串str的位置,split(String regex)按某一正则表达式regex分割字符串,matches(String regex)判断字符串是否符合某一正则表达式regex等,最终获URL链接地址。*在void myRobots.DeepRobot.run()中/ 这是一个非常复杂的过程,从网页的内容中提取出链接网址while (input = in.readLine() != null) / 如果一行中有a href=字样(不分大小写)if (!(input.indexOf(a href=) 0& input.indexOf(A href=) 0& input.indexOf(a HREF=) 0 & input.indexOf(A HREF=) 0) / 将这行以a href=(不分大小写)为界劈成若干段,放在数组ss中String ss = input.split(a|A) (href|HREF)=);/ 取出数组的每一段放入ssi中for (int i = 0; i 0) / 截取ssi的子串,从http开始到结束放入字符串s中String s = ssi.substring(ssi.indexOf(http), ssi.indexOf();/ 消除s前后的空格s = s.trim();/ 如果s符合合法的网址URL的正则表达式if (s.matches(http:/(w-+.)+w-+(/w- ./?%&=*)?) *s为所要寻找的正确的URL链接地址3. 编写深度优先遍历算法开始使用递归来写深度优先算法,这样写起来代码很简单,而且执行也没什么问题。将访问过的网址放入DeepDone队列中,遍历网页,遇到URL链接地址递归访问,直到达到最后一层访问层,直接将URL链接放入DeepDone队列中。这样一直用了好久,直到后来 步骤13 below4. 编写图形用户界面类Frame从/docs/books/tutorial/uiswing/index.html中学习了大量的推行用户界面实例,如ToolBarDemoProject, TextAreaDemoProject, SimpleTableSelectionDemoProject, ScrollDemoProject, MenuDemoProject, ListDialogRunnerProject, ListDemoProject, LayeredPaneDemoProject, DialogDemoProject, ButtonDemoProject,其中有的采用了,也有的放弃了,最终是这些实例一点一点搭建起了我自己的图形用户界面,其中没有遇到很多困难,关键在于不停的学习新的组件,新的方法.5. 编写广度优先算法有了深度优先算法,广度优先算法的提取URL链接地址的问题就没有了,关键在于怎样一层层的遍历。我用了3个链表,DeepTodo,DeepUndo,DeepDone,取出DeepTodo链表中的一个地址,遍历得到所有的链接地址放入DeepUndo和DeepDone中,同样取出DeepTodo中的其他地址,直到DeepTodo为空,再将DeepUndo中的所有地址倒入DeepTodo中,重复以上工作,直到达到遍历层数。* BroadRobot.run()中/ 一层一层地遍历for (int m = 0; m SearchLayers; m+) / 刚开始时把遍历起始网址加入BroadUndo和BroadDone中if (m = 0) BroadUndo.addLast(SearchFrom);BroadDone.addLast(SearchFrom);/ 将BroadUndo的所有网址复制到BroadTodo中while (BroadUndo.size() != 0) BroadTodo.addLast(BroadUndo.getFirst();BroadUndo.removeFirst();/ 只要BroadTodo不为空,一直循环while (BroadTodo.size() != 0) / 获取BroadTodo的第一个元素到stString st = (String) BroadTodo.getFirst();/ 如果BroadDone中没有st,将st加入BroadDone尾if (!BroadDone.contains(st) BroadDone.addLast(st);/ 删除BroadTodo首BroadTodo.removeFirst();* 提取网页中链接地址的代码略,获取URL地址s BroadUndo.addLast(s); / 如果BroadDone中没有s,将s加入BroadDone尾 if (!BroadDone.contains(s) BroadDone.addLast(s); BroadUndo.clear();6. 编写“以对象序列化的方式”保存其他网页算法开始不懂什么是“以对象序列化的方式”,在网上查找的知,序列化就是书上I/O输入输出中讲的对象串行化。实现了Serializable的对象可以将对象以文件的方式写入硬盘中,并且可以从文件中读取对象,获取对象的域变量。参照课本P243例14.9。要保存所有已访问过的网页,我选择用HashMap来保存,他的key可以方便存储无重复的字符串网址,他的value可以放以Vector方式保存好的网页内容,这样就可以通过网址key来得到其网页内容value。*可序列化(串行化)的类WebPageSetpublic class WebPageSet implements Serializable / 成员变量wps,wps是一个HashMappublic HashMap wps = new HashMap();* DeepRobot.saveOtherPages()中,部分代码:webpages.wps.put(st, webpage);try /以序列化(串行化)方式保存的WebPageSet对象FileOutputStream fout = new FileOutputStream(path);ObjectOutputStream out = new ObjectOutputStream(fout);out.writeObject(webpages);out.close();return true; catch (Exception a) return false;7. 打开网页从硬盘读取以序列化方式存储了对象的文件,获取对象。参照课本P243例14.9。* Frame.createTabletextPane()中/ 打开以序列化(串行化)方式保存的WebPageSet对象FileInputStream fin = new FileInputStream(OTHERS);ObjectInputStream ino = new ObjectInputStream(fin);WebPageSet SerSetOpen = (WebPageSet) ino.readObject();/ 将WebPageSet对象的wps(HashMap)的key/value对映射成set集合Set map = SerSetOpen.wps.entrySet();/ 通过映射后的set集合对元素进行遍历,得到key和valuefor (Iterator i = map.iterator(); i.hasNext();) Map.Entry me = (Map.Entry) i.next();Object key = me.getKey();Vector web = (Vector) me.getValue();/ 如果key的值等于webpageList中的已选项,将value(网页内容)输出到ttoutput文本区中if (key.equals(webpageList.getSelectedValue() for (int n = 0; n web.size(); n+) ttoutput.append(String) web.get(n) + n);8. 编写将链接保存到数据库saveToDB()算法这部分按照书第16章JDBC一步步做下来,因为之前学过数据库原理和应用,所以感觉很简单。具体代码参见附录源代码的DB类。9. 编写保存首页DeepRobot.saveIndex()算法这部分开始用FileOutputStream.write(buffer)方法写入文档,但发现总是写不全,好多内容都漏掉了,后来改用字符流PrintWriter print(String s)来写,就写全了,不过不知道为什么。*DeepRobot.saveIndex()中的部分代码PrintWriter outs = new PrintWriter(new FileOutputStream(IndexPath);outs.print(input + rn);10. 将深度优先机器人DeepRobot和广度优先机器人BroadRobot都extends Thread在Frame中编写并发执行代码,可并发执行两个线程*在Frame.actionPerformed(ActionEvent e)中RDeep = new DeepRobot(SITE, LAYERS, INDEX);RBroad = new BroadRobot(SITE, LAYERS);/ 并发执行两个机器人RDeep.start();RBroad.start();/ 此线程暂停,等待RDeep完成后再执行try RDeep.join(); catch (Exception rd) / 此线程暂停,等待RBroad完成后再执行try RBroad.join(); catch (Exception rd) 11. 更改保存其他网页, saveToDB(),DeepRobot.saveIndex()的时机将保存其他网页算法,saveToDB(),DeepRobot.saveIndex()的算法都写入DeepRobot.run()中,并发执行两者机器人,但执行了很长时间程序也没有反应,最后抛出异常说“内存溢出”。是因为一下要执行太多的任务,深度优先的几层递归不说,就是保存网页,遍历了那么多的网页的内容都要放到内存中,内存必然要溢出。所以就更改了策略,并发执行的过程只做遍历,深度优先遍历算法中只将已访问过的网址存放在DeepRobot.Accessed链表中,需要保存其他网页时,只需依次打开已访问过的页面,保存网页。*DeepRobot.saveOtherPages()中public void saveOtherPages() /取出Accessed中的每一个元素,访问并获取页面内容for (int i = 1; i Accessed.size(); i+) String st = (String) Accessed.get(i);*打开链接代码略Vector webpage = new Vector();while (input = in.readLine() != null) /将内容保存到webpage中webpage.addElement(input);/将网址st和内容webpage放入webpages的wps中webpages.wps.put(st, webpage);同样将saveToDB(),DeepRobot.saveIndex()的时机也改在run()外单独执行。12. 设置访问超时在访问链接时,时间随着遍历层数的增加而急剧增加,有时时间长得让人无法忍耐,我总想找方法能设置连接超时时间,开始想改变系统设置,但System总说不允许,后来又想设置一个定时器,到一定时间停止链接,于是用Timer来做,但即使到时间也无法做到强制停止线程,Thread.stop()和interrupt()总是无法真正的停止线程。后来终于在网上找到了void .URLConnection.setConnectTimeout(int timeout)方法,有效的限制了连接时间。*DeepRobot中的部分代码, BroadRobot中代码类似try /建立连接,设置超时时间为1秒,超时则抛出异常URL u = new URL(st);httpURLConnector = (HttpURLConnection) u.openConnection();httpURLConnector.setConnectTimeout(1000);httpURLConnector.connect();BufferedReader in = new BufferedReader(new InputStreamReader(httpURLConnector.getInputStream();*读取网页代码略/ 获取异常,打印d timeout(深度优先遍历时连接超时)catch (IOException a) System.out.println(d timeout); /断开连接finally httpURLConnector.disconnect(); 13. 更改BroadRobot的遍历方法当一切都就绪后,并发执行两个机器人,当遍历两层时,两个机器人的结果除顺序不一样外,结果集是一样的,但发现深度优先遍历3层以上时,深度优先的遍历结果总少于广度优先的遍历结果。思考后得出是因为深度优先用的是递归算法(步骤3 above),在建立一个链接后,可能递归再建立其网页中的链接,所也设置了连接超时后,总有高层的链接因超时而断开连接,广度优先遍历算法用的是循环,就不会出现这种现象,所以决定更改BroadRobot算法,用循环代替递归。但广度优先是一层一层遍历,一个时间段内遍历一层,用几个队列就可解决。深度优先遍历在不同的时间可能遍历不同的层,无法判断某个链接是哪一层的,所以在储存网址时用一个两个单元的一维数组来储存,另一个储存层数,再配合栈来实现。* DeepRobot.run()中/创建一个一维的对象数组,容纳两个对象,第一个是整数0,第二个是字符串遍历起始地址Object usite;usite = new Object2;usite0 =new Integer(0);usite1 = SearchFrom;/将对象数组压入栈DeepTodo中DeepTodo.addFirst(usite);/只要栈DeepTodo不为空,就一直执行循环体while (!DeepTodo.isEmpty() /取出栈中的第一个对象,将对象的第一个对象赋予整数n,第二个对象赋予字符串stInteger n = (Integer) (Object) DeepTodo.getFirst()0;String st = (String) (Object) DeepTodo.getFirst()1;/移除栈的第一个对象DeepTodo.removeFirst();/如果DeepDone没有st,则将st加入DeepDone尾和Accessed尾if (!DeepDone.contains(st) DeepDone.addLast(st);Accessed.add(st);* 提取网页中链接地址的代码略,获取URL地址s /如果n等于遍历层数的倒数第二层,并且DeepDone中不含s,将s直接加入DeepDone尾if (n = SearchLayers - 1& !DeepDone.contains(s) DeepDone.addLast(s); /如果n不到遍历层数的倒数第二层else if (n = 0; i-) DeepTodo.addFirst(DeepUndo.get(i);/清空DeepUndo链表DeepUndo.clear();14. 完善图形用户界面基本上程序已经编完,剩下的只是外观上的修缮工作。在图形用户界面中的菜单项上加入快捷键,分隔符。加入“关于任燕的课设”菜单项,弹出对话框,显示作者,版本,版权之类的东东(_)。*Frame.actionPerformed(ActionEvent e)中JFrame frame = new JFrame();JDialog dialog = new JDialog();JOptionPane.showMessageDialog(frame, 名称:任燕的JAVA课设n + 作者:任燕n+ 版本:1.00 2008/9/7n+ Copyright (c) 2008 Ren Yan. All rights reserved.n+ 版权所有,严禁拷贝!n, 关于任燕的JAVA课设,JOptionPane.INFORMATION_MESSAGE);dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);在窗口中加入消息框,显示不同操作的不同消息,方便使用程序。加入界面外观和感觉行为(L&F),改善外观* Fame.createAndShowGUI()中/设置LookAndFeel为运行系统的LookAndFeeltry UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName(); catch (Exception e) 四、 实验结果1. 打开程序2. 并发执行深度优先和广度优先机器人*Frame.actionPerformed(ActionEvent e)中的部分代码/ 并发执行两个机器人RDeep.start();RBroad.start();* DeepRobot.run()中的部分代码/ 获取异常,打印d timeout(深度优先遍历时连接超时)catch (IOException a) System.out.println(d timeout); *BroadRobot.run()中的部分代码/ 获取异常,打印b timeout(广度优先遍历时连接超时)catch (IOException a) System.out.println(b timeout);3. 验证并发性4. 保存首页打开Index.html:5. 将所有链接保存到数据库中打开Robots数据库中的深度优先表:打开Robots数据库中的广度优先表:6. 保存其他访问过7. 打开已保存了的其他访问过的网页重新启动程序后,单击“打开网页”。8. 测试工具条重新启动程序,测试工具条9. 设置遍历层数10. 关于任燕的JAVA课设11. 帮助文档五、 参考资料//docs/books/tutorial/uiswing/index.html/developer/onlineTraining/collections/Collection.html/javase/6/docs/api/java/lang/String.html//袁绍欣,赵祥模,葛玮.Java面向对象程序设计.北京:清华大学出版社,2007年六、 附件:源代码1. Frame类package myRobots;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.io.*;/* * 任燕的JAVA课设-主窗口 * * author 任燕 * version 1.0 */public class Frame implements ActionListener static final private String SET = 设置遍历层数;static final private String GO = 执行;static final private String HELP = 帮助;static final private String ABOUT = 关于任燕的课设;static final private String SAMETIME = 并发执行深度优先和广度优先机器人;static final private String SAVEINDEX = 保存首页;static final private String SAVETODB = 将所有链接保存到数据库中;static final private String SAVEOTHERS = 保存其他访问过的网页;static final private String OPEN = 打开网页;/ 储存其他访问过的网页的地址static final private String OTHERS = D:RobotsOthers.ser;/ 储存工商首页的地址static final private String INDEX = D:RobotsIndex.html;/ 工商首页链接地址static final private String SITE = /cms;/ 初始遍历层数为3层static private int LAYERS = 3;/ 消息框static private JLabel message;/ 显示深度和广度优先遍历结果的容器static private Container Both;/ 显示其他网页的容器static private Container Open;/ 容纳Both和Open的分层面板,不同时刻显示不同的层static private JLayeredPane layeredpane;/ 显示深度优先的文本区private JTextArea output1;/ 放output1的滚动面板private JScrollPane scrollPane1;/ 显示广度优先的文本区private JTextArea output2;/ 放output2的滚动面板private JScrollPane scrollPane2;/ 显示所有已访问过的网址链接的列表框private JList webpageList;/ webpageList的默认列表private DefaultListModel listModel;/ 打开访问过网页的页面private Button openbutton;/ 显示已选网页的页面内容private JTextArea ttoutput;/ 放ttoutput的滚动面板private JScrollPane ttscrollPane;private JPanel contentPane;/ 深度优先机器人static DeepRobot RDeep;/ 广度优先机器人static BroadRobot RBroad;/* * 创建菜单 * 用到了JMenuBar,JMenu,JRadioButtonMenuItem,addActionListener(ActionListener * l),addSeparator(),setAccelerator(KeyStroke keyStroke)等类和方法 * * return 菜单 */public JMenuBar createMenuBar() JMenuBar menuBar;JMenu menu;JMenuItem menuItem;JRadioButtonMenuItem setMenuItem;/ 创建一个菜单条menuBar = new JMenuBar();/ 创建设置遍历层数菜单menu = new JMenu(SET);menuBar.add(menu);/ 按钮组-选择遍历层数ButtonGroup group = new ButtonGroup();/ 在group中加入3个单选按钮,3层为默认,分别设置快捷键,并监听菜单选项setMenuItem = new JRadioButtonMenuItem(3层);setMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_3,ActionEvent.CTRL_MASK);setMenuItem.setSelected(true);group.add(setMenuItem);setMenuItem.addActionListener(this);menu.add(setMenuItem);setMenuItem = new JRadioButtonMenuItem(4层);setMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_4,ActionEvent.CTRL_MASK);group.add(setMenuItem);setMenuItem.addActionListener(this);menu.add(setMenuItem);setMenuItem = new JRadioButtonMenuItem(5层);setMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_5,ActionEvent.CTRL_MASK);group.add(setMenuItem);setMenuItem.addActionListener(this);menu.add(setMenuItem);/ 创建执行菜单menu = new JMenu(GO);menuBar.add(menu);/ 创建一系列菜单选项,并监听菜单选项/ 创建并发执行机器人菜单选项,快捷键Ctrl+QmenuItem = new JMenuItem(SAMETIME);menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,ActionEvent.CTRL_MASK);menuItem.addActionListener(this);menu.add(menuItem);/ 一个分割线menu.addSeparator();/ 创建保存首页菜单选项,快捷键Ctrl+WmenuItem = new JMenuItem(SAVEINDEX);menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W,ActionEvent.CTRL_MASK);menuItem.addActionListener(this);menu.add(menuItem);/ 创建保存链接到数据库菜单选项,快捷键Ctrl+EmenuItem = new JMenuItem(SAVETODB);menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,ActionEvent.CTRL_MASK);menuItem.addActionListener(this);menu.add(menuItem);/ 创建保存其他已访问过的网页菜单选项,快捷键Ctrl+RmenuItem = new JMenuItem(SAVEOTHERS);menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R,ActionEvent.CTRL_MASK);menuItem.addActionListener(this);menu.add(menuItem);menu.addSeparator();/ 创建打开网页菜单选项,快捷键Ctrl+TmenuItem = new JMenuItem(OPEN);menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T,ActionEvent.CTRL_MASK);menuItem.addActionListener(this);menu.add(menuItem);/ 创建帮助菜单menu = new JMenu(HELP);menuBar.add(menu);/ 创建关于菜单选项menuItem = new JMenuItem(ABOUT);menuItem.addActionListener(this);menu.add(menuItem);/ 返回菜单条return menuBar;/* * 创建工具条 * 用到了JToolBar,JButton等类和方法 * * return 工具条 */public JToolBar createToolBar() JToolBar toolbar = new JToolBar();JButton button;/ 创建并发执行深度优先和广度优先机器人;保存首页;将所有链接保存到数据库中;保存其他访问过的网页;打开网页工具按钮,并监听工具按钮选项button = new JButton(SAMETIME);button.addActionListener(this);toolbar.add(button);button = new JButton(SAVEINDEX);button.addActionListener(this);toolbar.add(button);button = new JButton(SAVETODB);button.addActionListener(this);toolbar.add(button);button = new JButton(SAVEOTHERS);button.addActionListener(this);toolbar.add(button);button = new JButton(OPEN);button.addActionListener(this);toolbar.add(button);return toolbar;/* * 创建容纳遍历结果的容器 * 用到了JTextArea,setEditable(boolean b),setLineWrap(boolean * wrap),JScrollPane,setPreferredSize(Dimension * preferredSize),setBorder(Border border)等类和方法 * * return 装深度优先和广度优先遍历结果的面板 */public Container create2ContentPane() contentPane = new JPanel(new BorderLayout();/ 创建深度优先遍历结果的滚动面板output1 = new JTextArea(10, 33);output1.setEditable(false);output1.setLineWrap(true);output1.setWrapStyleWord(true);scrollPane1 = new JScrollPane(output1);scrollPane1.setPreferredSize(new Dimension(442, 440);scrollPane1.setBorder(BorderFactory.createTitledBorder(深度优先机器人遍历结果);contentPane.add(scrollPane1, BorderLayout.LINE_START);/ 设在容器的左边/ 创建深度优先遍历结果的滚动面板output2 = new JTextArea(10, 33);output2.setEditable(false);output2.setLineWrap(true);output2.setWrapStyleWord(true);scrollPane2 = new JScrollPane(output2);scrollPane2.setPreferredSize(new Dimension(442, 440);scrollPane2.setBorder(BorderFactory.createTitledBorder(广度优先机器人遍历结果);contentPane.add(scrollPane2, BorderLayout.LINE_END);/ 设在容器的右边/ 设置容器大小contentPane.setBounds(0, 0, 892, 509);/ 返回容器return contentPane;/* * 创建容纳打开已访问的网页内容的容器 * 用到了JList,DefaultListModel,getSelectedValue(),setText(String * text),FileInputStream,ObjectInputStream,Set等类和方法 * * return 装打开已访问的网页内容的面板 */public Container createTabletextPane() contentPane = new JPanel(new BorderLayout();/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上市企业市值管理办法
- 电玩城库存管理办法
- 上海返乡人员管理办法
- 自然角区域管理办法
- 融资业务贷款管理办法
- 综合部材料管理办法
- 个人活期账户管理办法
- 粮油厂分级管理办法
- 中国设备租赁管理办法
- 上海灯光设置管理办法
- 大学信息与网络安全保密管理办法
- 李中莹 亲子关系全面技巧
- 音乐《上学歌》课件
- PMC部门运作流程对下达的生产计划任务合理性负责
- 防止电力电力建设施工安全事故三十项重点要求考试题
- 绿色校园创建资料
- 污水处理池 (有限空间)作业安全告知牌及警示标志
- 六三制新青岛版四年级科学上册第一单元《动物王国》全部课件(一共5课时)
- OpenVPX标准和架构精选课件
- 历史八年级上册电子课件:第2课 第二次鸦片战争
- 消防安全培训及应急演练主题教育课件PPT模板宣传PPT动态PPT
评论
0/150
提交评论