




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、信息工程学院本科生毕业设计说明书题目: 基于 Android 的天气短信系统的设计与实现姓名:学号:专业:班级:指导教 师 :丁柏林2011110262计算机科学与技术11 计科 2 班房爱东目录1 系统概述 11.1 设计目的 11.2 设计思路 11.3 系统需求分析 11.4 开发环境 21.4.1 Android 开发环境的介绍 21.4.2 Android 的开发平台搭建 21.5 运行环境 31.6 参考文献 32. 总体设计 42.1 系统结构 42.1.1 系统流程图 42.1.2 模块结构图 42.2 数据库的设计 62.3 模块功能设计 62.3.1 获取当前天气功能 62
2、.3.2 选择城市的功能 62.3.3 发送短信的功能 73. 运行设计 83.1 用户界面设计 83.2 运行代码 104. 系统测试 284.1 功能性测试 284.2 稳定性测试 304.3 安全性测试 305 结论 311 系统概述近几年来随着 3G 技术成熟和智能手机的不断普及,移动应用的需求与日俱增, 移动应用开发成为当下最热门的技术之一。 在 Google 和 Android 手机联盟的共同推 动下, Android 在众多移动应用开发平台中脱颖而出。 Android 是一个真正意义上的 开源智能手机操作系统,该系统一经推出立即受到全球移动设备厂商和开发者的热 捧。为顺应潮流,本
3、设计旨在搭载 Android 的移动设备上运行,实现天气状况的实 时动态更新与显示,并将显示的天气可以发短信给指定的联系人。1.1 设计目的天气软件是一种非常实用的信息服务, 随着智能手机的不断普及, 各种智能手机 平台下都有各种各样的天气软件。 Android 作为现在主流的智能手机之一,自然也需 要这方面的软件。天气关系到人们的日常生活,如告知温暖,方便出行等。此外,对 未来天气的预测你还可以指定发短信给家里不会上网的父母, 帮助父母进行农作物的 浇灌、施肥、收割等工作。1.2 设计思路天气短信这个设计不算复杂, 我先在 eclipse 里面把系统的主界面写好, 然后先 是联网解析从 36
4、0 天气预报端口读取来的数据, 数据解析完了在本地创建数据库, 把 联网解析的数据保存在本地, 减少流量的使用。 之后就是选择想要的城市来获取当前 城市未来的天气情况, 并把天气情况编辑成样例短信, 最后选择联系人在指定的时间 发送短信,最后就是短信发送成功之后会提醒的消息推送通知。1.3 系统需求分析本软件是一个基于 Android 的应用程序,启动程序后可以进行城市的选择设置, 可以通过文字显示当前和未来的天气状况,包括温度、湿度、风向和雨雪情况等。这 些天气数据是通过后台服务获取的,这个后台服务可以按照一定时间间隔,从 360 上获取天气预报信息, 并将天气信息保存在数据库中。 可以选定
5、指定的联系人并且设 置指定的时间发送天气短信给对方。从上面的描述中可以基本了解软件的功能需求:(1) 启动 Android 的应用程序;(2) 设置界面:对要显示天气预报的城市进行设置;(3) 显示界面:通过文字显示当前的天气情况,包括日期、时间、城市、最高温度、最低温度、当前温度等。而且可以选定指定的联系人在指定的时间发送天气短信给对方。1.4 开发环境1.4.1 Android 开发环境的介绍Android 平台使用 Java 编程语言来开发应用程序, 而 Android 提供了对 Java 的 核心支持。考虑到 Java 虚拟机的执行效率和占用资源情况, Google 重新设计了 Jav
6、a 的编译器, 命名为 Dalvik 。Dalvik 是经过优化的 Java 编译器, 允许在有限的存中同 时运行多个虚拟机的实例, 并且每一个 Dalvik 应用作为一个独立的 Linux 进程执行, 独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。项目的开发在 Eclipse 环境中进行, 由于进行的是 Android 应用程序的开发, 需 要在 Eclipse 安装 ADT插件,即 Android 开发工具,这样 Eclipse 就可以和 Android SDK建立连接,在 Eclipse 中启动 Android 模拟器、调试程序等工作。由以上分析可知, Android 平台的搭建
7、需要 Android SDK 、 Java SDK、Eclipse 和 ADT四个软件。1.4.2 Android 的开发平台搭建在进行 Android 应用程序的开发前, 要先搭建 Android 平台,然后才能在开发环 境中进行编程。根据官方指导,对 Android 平台的搭建过程介绍如下:首 先 , 在 官 方 网 址 上 下 载 JDK6.0 并 安 装 , 网 址 是.oracle./technetwork/java/javase/downloads/index.html,安装后设置系统环境变量 JAVA_HOM、ECLASS_PAT、HPATH的值;然 后 , 在 官 方 网 址
8、上 下 载 更 新 的 SDK 进 行 安 装 , 官 方 网 址 为 http:/development.android./sdk/index.html ,下载完后解压到指定文件夹, 启动 SDKM anager进行安装,选择需要的 Android 版本,然后更新,这次更新需要的时间 比较慢,所以更新前要做好准备。 安装完成后,将 ADB命令所在的目录 platform-tools 的完整路径添加到系统的环境变量 PATH中,就能够在命令中使用 ADB命令了;接下来要安装的是 ADT插件,即 Android 开发工具。 因为 ADT在线安装容易遇到 问题,增加一些不必要的麻烦所以需要下载后在
9、本地安装。指定网址为 http:/development.android./sdk/index.html ,下载存放在指定的位置以便后面使 用;最 后 , 下 载 Eclipse , 建 议 选 择 Eclipse3.4 以 上 版 本 , 网 址 为 ./downloads/ ,解压到指定位置后运行。选择 Eclipse 菜单中的 HelpInstall New Software 选项卡上的 Available Software ,点击右侧的 Add,然 后在 Name框中填写 Android ,在 Location 框中选择上步下载的 ADT文件,然后点击 OKFin
10、ishInstall All ,这时关闭 Eclipse 再重新启动。重启后选择 Eclipse 菜单 中的 WindowPreferences ,在左侧的 Android 项目中 SDK Location 中填入 Android SDK解压后的目录,然后点击 Apply 。这样,整个平台的搭建工作就完成了。1.5 运行环境运行需要 Android SDK、Java JDK、Eclipse 和 ADT四个软件,以及 Android2.2 的虚拟机或者真机,操作系统为 Windows7的 PC机一台1.6 参考文献1 王向辉,国印,洁 . Android 应用程序开发 M. 北京:清华大学, 2
11、0122 刚 . 疯狂 Android 讲义 M. 北京:电子工业, 20133 明日科技 . Android 从入门到精通 M. 北京:清华大学, 20124 刚. 疯狂 Java 讲义M. 北京:电子工业, 20135 Y.Daniel Liang. Java语言程序设计 (娜) M. 北京:机械工业, 20116 邓凡平 . 深入理解 AndroidM. 北京:机械工业, 20117 马超,仁贵 . Android 应用开发全程实录 M. 北京:人民邮电, 20128 昌 平 , 明 钰 .Android 手 机 的 轻 量 级 访 问 控 制 J. 计 算 机 应 用 研 究 , 20
12、10,7:201-212.9 仕成. 基于 Google Android 平台的应用程序开发与研究 J. 电脑知识与技术, 2009:35-59.10 丰盛 .Android 应用开发揭秘 M. 北京:机械工业, 20102. 总体设计2.1 系统结构2.1.1 系统流程图 本系统的流程是当我们在桌面上打开软件时进入到用户的主界面, 进入主界面后 第一次是会让我们选择城市, 我们点击城市的下拉列表选中自己想要查询的城市, 在 我们的短信中会出现该城市的天气并生成样列短信, 最后我们设置指定的联系人并设 置指定的时间发送短信到指定的联系人, 当短信发送成功后我们会收到来自通知栏的 消息告诉我们短
13、信已经发送成功。图 2-1 系统流程图2.1.2 模块结构图用户界面设置联系人和发送时间发送短信并返回发送成功的通知AppApp 启动启动服务设置相关信息后台服务天气信息startService(new Intent)启动服务360 天气预报服务数据库获取模块SQLite 数据库获取模块图 2-2 模块结构图2.2 数据库的设计由于在本系统中是通过中央气象台的 WebService 提供的 API 访问得到的天气预 报,在查询指定城市的天气时,需要用到它提供的城市码,而城市码相对稳定不变, 所以在构建系统时将其事先通过 Android 的网络访问技术将其缓冲到本地 SQLite 数 据库进行保
14、存起来,方便以后的查询,同时节省了流量开销。综上所述在本地建立 db_weather.db 的数据库,其中的表结构如下:图 2-3 数据库表结构其中只存在两个表 : provices 和 citysCity 中存在 city_num 用天气的查询,同时还存在外键 province_id 与 provices 表形成 1 对 n 的关系。2.3 模块功能设计2.3.1 获取当前天气功能 显示指定城市三天的天气状况,包括日期、城市名称、温度、风力,用户可通过 选择城市来获取城市天气,并且可以把天气编辑成短信。2.3.2 选择城市的功能 通过手动选择可伸展性下拉列表单击选择系统数据库中预存的城市来进
15、行设置, 同时为了方便用户查找, 当单击选中城市时跳转至天气显示界面, 来显示该城市当三 天的天气状况。并且2.3.3 发送短信的功能 为了使用户能够选择指定的联系人, 在界面上加上了选择联系人的输入框, 还有时间选择,是用户能够设置在指定的时间发送短信给指定的人。3. 运行设计3.1 用户界面设计这里需要进一步分析并把天气转为短信容并且我们可以设置根据需求分析可以知道, 应用程序应包含三个主要的功能, 每个功能中应该具体怎样实现。在获取网络上的天气服务时应该做到读取未来三天的天气, 示例。当然我们可以选择当前城市的信息, 设置省市联动的效果, 指定联系人的信息和在什么时间发送短信。根据以上的
16、功能分析得到以下的用户界面图:图 3-1 主界面布局图 3-2 用户主界面图 3-3 选择省份图 3-4 选择城市3.2 运行代码根据天气预报系统功能需求分析,系统启动后,应在主界面上呈现出,默认城 市的天气数据,因此需要创建主界面和解析天气的类,包括获取、解析城市天气数 据,并在用户界面上呈现出来。为此,需要解决的问题是手机终端从 Web 服务器 获取了所有类型的数据之后,将这些数据进一步交给 Android 手机终端 View 组 件,在手机界面上显示给用户。联网获取天气情况并把天气情况变为样例短信。主 要是通过 360 天气预报的端口从网络上解析数据,并把数据保存到本地的数据库 中,在从
17、数据库中调取所需城市的天气,并把天气转为示例代码:/ 重写 callable 接口中的方法 callSuppressLint ( SimpleDateFormat ) Overridepublic String call()throws Exception try / 这里使用的是 360天气预报,比较几个之后,发现这个比较靠谱/url 最后的 101010100 是指北京, 在http:/cdn.weather.hao.360./页面选择想要的城市, url 中即可获取城市编码 101110908/ 联网读取天气数据/ 创建连网使用的客户端连接类 httpclient ,以及本次请求的封装对
18、象 httpgetHttpGet httpGet = new HttpGet( http:/cdn.weather.hao.360./api_weather_info.php?app=hao360&_jsonp=s martloaddata101010100&code= +code);HttpClient httpClient =new DefaultHttpClient();/ 执行请求并获取服务器的响应HttpResponse httpResponse = httpClient.execute(httpGet);/ 获取 http 的响应码,判断本次连接是否成功if (httpRespon
19、se.getStatusLine().getStatusCode() =HttpStatus. SC_O)K / 获取响应数据的字符串容并针对字符串进行拆分String unicodeResult = EntityUtils.toString( httpResponse.getEntity().split( ( )1 .split( ) )0;/ unicode 解码后获取各节点的值/ 获取市 /System.out.println(unescapeUnicode(unicodeResult);timestamp =( new JSONObject(unicodeResult).getLong
20、( time ); /System.out.println(timestamp);/ 通过 stringbuffer 实现字符串的拼接 weatherMsg.append(new JSONObject(unicodeResult).getJSONArray( area ) .getString(2).split( )1).append( ; );JSONArray jsonArray = new JSONObject(unicodeResult) .getJSONArray( weather );for ( int i = 0; i 70;i+)System. out .println( we
21、ather .length();/ 将数据转成集合,然后通过 sublist 方法截取集合中的部分容 后,将截取后的集合 toString 的到字符串weather = Arrays.asList( weathers ).subList(0,Arrays.asList( weathers ).size()-i).toString();/ 针对字符串进行字符的替换weather = weather .replace( , ).replace( , ).replace( , ).replace( , , ; ).replace( # , , );/String date = new java.te
22、xt.SimpleDateFormat(HH:mm).format(new java.util.Date(timestamp * 1000);/weather = weather + ; + date + 发布 ;return weather ; catch (Exception e) e.printStackTrace();return null ;public String unescapeUnicode(String str)StringBuffer sb=new StringBuffer();/ 将字符串根据制定的正则表达式进行匹配 (可简单的理解为将特殊的字符 串根据指定的方式进行拼
23、配后替换)Matcher matcher =Ppile( u(0-9a-fA-F4) ).matcher(str);while (matcher.find() / 如果字符串中包含指定字符/ 则对字符串进行退换操作matcher.appendReplacement(sb,( char )Integer.parseInt(matcher.group(1),16)+ );matcher.appendTail(sb);return sb.toString().replace( , ); / 顺便去掉上面的转义字符根据天去短信系统的需求分析,选择城市并获取天气的类,通过连接本地的SQLite 数据库根
24、据城市的城市码来到本地的数据库中找到并把天气显示在用户的界 面上,具体实现代码如下:public void initSpinner1()dbm = new DBManager(this );dbm.openDatabase();db = dbm.getDatabase(); / 获取数据库对象List list =new ArrayList();try String sql =select * from provinces;/ 查询数据库中的 provinces 表中的数据Cursor cursor = db.rawQuery(sql, null ); cursor.moveToFirst()
25、;/ 如果有多行数据,就循环读取表中每一行的数据while (!cursor.isLast()/ 获取表中列名为 _id 的列中当前行的值 Stringcode=cursor.getString(cursor.getColumnIndex( _id );System.out .println( initSpinner1 +code);/ 获取表中第二列中当前行的数据值byte bytes=cursor.getBlob(1);String name=new String(bytes, utf-8 );/ 初始化列表中每个 item 中要显示的数据封装类对象 MyListItem myListIt
26、em=new MyListItem();myListItem.setName(name); myListItem.setPcode(code);list.add(myListItem);/ 让游标移动到下一行 cursor.moveToNext();/ 如果没有多行数据,那么就读取当前行的数据String code=cursor.getString(cursor.getColumnIndex( _id ); byte bytes=cursor.getBlob(1);String name= new String(bytes, utf-8 );MyListItem myListItem= new
27、 MyListItem(); myListItem.setName(name);myListItem.setPcode(code); list.add(myListItem); catch (Exception e) MyAdapter myAdapter = new MyAdapter( this ,list); spinner1 .setAdapter(myAdapter);String sql =select province_id from citys wherecity_num= +areaCode+ ;/ 查询数据库中指定城市的 province_idCursor cursor =
28、 db.rawQuery(sql, null ); cursor.moveToFirst(); / 将游标移动到表中第一行 spinner1 .setSelection(cursor.getInt(0),true ); / 设置 spinner 默认选项/ 设置 spinner 的选择事件 spinner1 .setOnItemSelectedListener( newSpinnerOnSelectedListener1();/ 关闭数据库 dbm.closeDatabase(); db.close();String pcode = String.valueOf(cursor.getInt(0
29、)+1); initSpinner2(pcode);public void initSpinner2(String pcode) dbm = new DBManager(this ); dbm.openDatabase(); db = dbm.getDatabase();List list =new ArrayList();String dstName= ;int idx=0;int found=0;String sql = select name from citys where city_num= +areaCode+ ;/ 查询指定城市的城市名 Cursor cursor = db.ra
30、wQuery(sql, null ); cursor.moveToFirst();byte bytes=cursor.getBlob(0);try dstName = new String(bytes, utf-8 ); catch (UnsupportedEncodingException e) / TODO Auto-generated catch block e.printStackTrace();pcode = String.valueOf(Integer.valueOf(pcode).intValue() - 1); try +pcode+String sql = select *
31、from citys where province_id= / 查询表中指定省份所有城市的城市信息Cursor cursor = db.rawQuery(sql, null ); cursor.moveToFirst();while (!cursor.isLast()Stringcode=cursor.getString(cursor.getColumnIndex( _id );byte bytes=cursor.getBlob(2);String name=new String(bytes, utf-8 );String city_num = cursor.getString(cursor.
32、getColumnIndex( city_num );if (0=found)if (!dstName.equals(name)idx += 1;elsefound=1;MyListItem myListItem=new MyListItem();myListItem.setName(name);myListItem.setPcode(code); myListItem.setCityNum(city_num); list.add(myListItem);cursor.moveToNext();_id );String code=cursor.getString(cursor.getColum
33、nIndex(byte bytes=cursor.getBlob(2);String name=new String(bytes, utf-8 );String city_num =cursor.getString(cursor.getColumnIndex( city_num );MyListItem myListItem=new MyListItem();myListItem.setName(name);myListItem.setPcode(code);myListItem.setCityNum(city_num);list.add(myListItem); catch (Excepti
34、on e) MyAdapter myAdapter = new MyAdapter( this ,list);spinner2 .setAdapter(myAdapter);spinner2 .setSelection(idx, true );spinner2 .setOnItemSelectedListener( newSpinnerOnSelectedListener2();dbm.closeDatabase();db.close();class SpinnerOnSelectedListener1 implements OnItemSelectedListenerpublic void
35、onItemSelected(AdapterView adapterView, View view, int position,long id) / 获取spinner 选择的item 选项 String pcode =(MyListItem) adapterView.getItemAtPosition(position).getPcode();initSpinner2(pcode);public void onNothingSelected(AdapterView adapterView) / TOD OAuto-generated method stubclass SpinnerOnSel
36、ectedListener2 implements OnItemSelectedListener public void onItemSelected(AdapterView adapterView, View view, int position,long id) String city_num =(MyListItem) adapterView.getItemAtPosition(position).getCityNum();areaCode = city_num;public void onNothingSelected(AdapterView adapterView) / TOD OA
37、uto-generated method stub/ 设置点击菜单键时的显示容Overridepublic boolean onCreateOptionsMenu(Menu menu) / Inflate the menu; this adds items to the action bar if it is present.main, menu);getMenuInflater().inflate(R.menu.return true ;/ 设置菜单选项选中时的事件监听Overridepublic boolean onOptionsItemSelected(MenuItem item) /
38、Handle action bar item clicks here. The action bar will/ automatically handle clicks on the Home/Up button, so long/ as you specify a parent activity in AndroidM id = item.getItemId();if (id = R.id. action_settings ) String info= 作者:丁柏林 nE-MAIL:1183084407qq. ;new AlertDialog.Builder(M
39、ainActivity.this ).setTitle( 关于 ).setMessage(info).setPositiveButton( 确定 , null ).show();return true ;return super .onOptionsItemSelected(item); 获取天气后生成短信,以下代码实现了怎样发送短信的功能: public class SendSms /* 以下代码均为实现发送短信的代码* */SmsManagers msManage r= SmsManager.getDefault();public boolean sendMessage(String ph
40、oneCode, String content,PendingIntent sentIntent) if (content.length() 70) List weatherList = smsManage.rdivideMessage(content); for (String str : weatherList) smsManage.rsendTextMessage(phoneCode, null , str, sentIntent, null ); else smsManage.rsendTextMessage(phoneCode, null , content, sentIntent,
41、 null );return false ; 存储和读取文件的类: public class DataFile private Context context ; final private String FILE_NAM=Eweather.dat ; public DataFile(Context context) this . context = context;/ 存储数据到文件public void saveData(String data) throws Exception /context.getFilesDir();/得到存放文件的系统目录/data/data/files/con
42、text.getCacheDir(); /缓存目录 /data/data/cache/* 获取文件输出流,方便将数据写入指定文件中 */ FileOutputStream outputStream= context .openFileOutput( FILE_NAM,E Context. MODE_PRIVA)T; E/ 写入数据 outputStream.write(data.getBytes();/ 关闭流 outputStream.close();/ 读取数据public String getData() throws Exception/ 获取指定文件的输入流,文件存储位置: /dat
43、a/data/files/FILE_NAMEFileInputStream inputStream= context .openFileInput( FILE_NAM)E; / 得到缓存输出流对象ByteArrayOutputStream outStream= new ByteArrayOutputStream(); byte buffer= new byte 1024;int len=0;while (len=inputStream.read(buffer)!=-1)/ 将读取的容写入缓存输出流中 outStream.write(buffer, 0, len);outStream.close
44、();/ 得到输出流中的数据 byte 数组byte data=outStream.toByteArray();/ 讲数组转成字符串并返回String name= new String(data);return name; 数据库的管理类: public class DBManager private final int BUFFER_SIZ E= 1024;public static final String DB_NAM =E city_.s3db ;public static final String PACKAGE_NA =M E.example.weathertest/ 定义数据库文
45、件存储路径: data/data/ 程序包名 public static final String DB_PAT H= /data+ Environment.getDataDirectory().getAbsolutePath() + /PACKAGE_NA; ME private SQLiteDatabase database ; / 定义数据库对象 private Context context ;private File file =null ;DBManager(Context context) Log.e( cc , DBManager); this . context = cont
46、ext; public void openDatabase() Log.e( cc , openDatabase() +DB_PAT H+ / + DB_NAM);E/ 通过 openDatabase方法打开指定位置的数据库this . database = this .openDatabase( DB_PAT H+ / + DB_NAM);E public SQLiteDatabase getDatabase()Log.e( cc , getDatabase() );/ 获取数据库对象 return this . database ;private SQLiteDatabase openDa
47、tabase(String dbfile) try Log.e( cc , open and return );file = new File(dbfile);if (! file .exists() / 判断文件是否存在Log.e( cc , file );/ 通过res 资源对象获取 res/raw 文件夹下的 city 文件对应的流对象 InputStream is =context .getResources().openRawResource(R.raw. city );if (is!= null ) Log.e( cc , is null );else FileOutputStre
48、am fos = new FileOutputStream(dbfile); if (is!= null )Log.e( cc , fosnull );else byte buffer =new byte BUFFER_SIZE;int count = 0;while (count =is.read(buffer) 0) fos.write(buffer, 0, count);Log.e( cc , while );fos.flush();fos.close();is.close();null );/ 根据指定的 dbflile 路径打开 (或创建数据库文件 ) database = SQLi
49、teDatabase.openOrCreateDatabase(dbfile, return database ; catch (FileNotFoundException e) Log.e( cc , File not found );e.printStackTrace(); catch (IOException e) Log.e( cc , IO exception );e.printStackTrace(); catch (Exception e)Log.e( cc , exception +e.toString();return nullpublic void closeDatabase() Log.e( cc , closeDatabase() );if (this . database != null )this . database .close();设置特定时间发送短信, 当短信发送成功后会在通知栏发送特定的通知让我们知 道短信已经发送成功,具体实现
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 内饰拆除合同范例
- 2025企业网站建设合同
- 债务公司融资合同范例
- 会员店转让合同标准文本
- 2025物品买卖正规合同书
- 2025年三方租赁合同(标准版本)
- 2025【合同范本】跨境服务外包合同范本
- 买卖竹园合同范例
- 餐厅前厅部经理述职报告
- 七猫签约合同范例
- 2025年广东省中考物理模拟试卷一(含答案)
- uni-app移动应用开发课件 1-初识uni-app
- 2025年江苏农林职业技术学院高职单招职业适应性测试近5年常考版参考题库含答案解析
- 【MOOC】《电子线路基础》(东南大学)章节作业期末网课答案
- 儿童口腔接诊流程
- 外墙清洗施工安全培训
- 《文明上网》课件
- 院士工作站合作框架协议书
- 幼儿园传染病疫情报告制度
- 课题申报书:生长教育理念下中小学衔接的科学教学实践研究
- 小儿高热的护理小儿发热健康指导培训课件
评论
0/150
提交评论